@discordeno/rest 19.0.0-next.b2f65c2 → 19.0.0-next.b42de2e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +15 -1
  2. package/dist/cjs/index.cjs +25 -0
  3. package/dist/cjs/invalidBucket.cjs +86 -0
  4. package/dist/cjs/manager.cjs +1498 -0
  5. package/dist/cjs/queue.cjs +164 -0
  6. package/dist/cjs/routes.cjs +562 -0
  7. package/dist/cjs/types.cjs +6 -0
  8. package/dist/cjs/typings/routes.cjs +6 -0
  9. package/dist/esm/index.js +8 -0
  10. package/dist/esm/invalidBucket.js +82 -0
  11. package/dist/esm/manager.js +1456 -0
  12. package/dist/esm/queue.js +154 -0
  13. package/dist/esm/routes.js +552 -0
  14. package/dist/esm/types.js +3 -0
  15. package/dist/esm/typings/routes.js +3 -0
  16. package/dist/types/index.d.ts.map +1 -0
  17. package/dist/{invalidBucket.d.ts → types/invalidBucket.d.ts} +5 -0
  18. package/dist/types/invalidBucket.d.ts.map +1 -0
  19. package/dist/types/manager.d.ts.map +1 -0
  20. package/dist/{queue.d.ts → types/queue.d.ts} +12 -1
  21. package/dist/types/queue.d.ts.map +1 -0
  22. package/dist/types/routes.d.ts.map +1 -0
  23. package/dist/{types.d.ts → types/types.d.ts} +546 -113
  24. package/dist/types/types.d.ts.map +1 -0
  25. package/dist/{typings → types/typings}/routes.d.ts +54 -6
  26. package/dist/types/typings/routes.d.ts.map +1 -0
  27. package/package.json +33 -29
  28. package/dist/index.d.ts.map +0 -1
  29. package/dist/index.js +0 -8
  30. package/dist/index.js.map +0 -1
  31. package/dist/invalidBucket.d.ts.map +0 -1
  32. package/dist/invalidBucket.js +0 -82
  33. package/dist/invalidBucket.js.map +0 -1
  34. package/dist/manager.d.ts.map +0 -1
  35. package/dist/manager.js +0 -1139
  36. package/dist/manager.js.map +0 -1
  37. package/dist/queue.d.ts.map +0 -1
  38. package/dist/queue.js +0 -153
  39. package/dist/queue.js.map +0 -1
  40. package/dist/routes.d.ts.map +0 -1
  41. package/dist/routes.js +0 -487
  42. package/dist/routes.js.map +0 -1
  43. package/dist/types.d.ts.map +0 -1
  44. package/dist/types.js +0 -3
  45. package/dist/types.js.map +0 -1
  46. package/dist/typings/routes.d.ts.map +0 -1
  47. package/dist/typings/routes.js +0 -3
  48. package/dist/typings/routes.js.map +0 -1
  49. /package/dist/{index.d.ts → types/index.d.ts} +0 -0
  50. /package/dist/{manager.d.ts → types/manager.d.ts} +0 -0
  51. /package/dist/{routes.d.ts → types/routes.d.ts} +0 -0
@@ -0,0 +1,1498 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ AUDIT_LOG_REASON_HEADER: function() {
13
+ return AUDIT_LOG_REASON_HEADER;
14
+ },
15
+ DISCORD_API_URL: function() {
16
+ return DISCORD_API_URL;
17
+ },
18
+ DISCORD_API_VERSION: function() {
19
+ return DISCORD_API_VERSION;
20
+ },
21
+ RATE_LIMIT_BUCKET_HEADER: function() {
22
+ return RATE_LIMIT_BUCKET_HEADER;
23
+ },
24
+ RATE_LIMIT_GLOBAL_HEADER: function() {
25
+ return RATE_LIMIT_GLOBAL_HEADER;
26
+ },
27
+ RATE_LIMIT_LIMIT_HEADER: function() {
28
+ return RATE_LIMIT_LIMIT_HEADER;
29
+ },
30
+ RATE_LIMIT_REMAINING_HEADER: function() {
31
+ return RATE_LIMIT_REMAINING_HEADER;
32
+ },
33
+ RATE_LIMIT_RESET_AFTER_HEADER: function() {
34
+ return RATE_LIMIT_RESET_AFTER_HEADER;
35
+ },
36
+ RATE_LIMIT_SCOPE_HEADER: function() {
37
+ return RATE_LIMIT_SCOPE_HEADER;
38
+ },
39
+ createRestManager: function() {
40
+ return createRestManager;
41
+ }
42
+ });
43
+ const _nodebuffer = require("node:buffer");
44
+ const _types = require("@discordeno/types");
45
+ const _utils = require("@discordeno/utils");
46
+ const _invalidBucket = require("./invalidBucket.cjs");
47
+ const _queue = require("./queue.cjs");
48
+ const _routes = require("./routes.cjs");
49
+ // TODO: make dynamic based on package.json file
50
+ const version = '19.0.0-alpha.1';
51
+ const DISCORD_API_VERSION = 10;
52
+ const DISCORD_API_URL = 'https://discord.com/api';
53
+ const AUDIT_LOG_REASON_HEADER = 'x-audit-log-reason';
54
+ const RATE_LIMIT_REMAINING_HEADER = 'x-ratelimit-remaining';
55
+ const RATE_LIMIT_RESET_AFTER_HEADER = 'x-ratelimit-reset-after';
56
+ const RATE_LIMIT_GLOBAL_HEADER = 'x-ratelimit-global';
57
+ const RATE_LIMIT_BUCKET_HEADER = 'x-ratelimit-bucket';
58
+ const RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit';
59
+ const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
60
+ function createRestManager(options) {
61
+ const applicationId = options.applicationId ? BigInt(options.applicationId) : (0, _utils.getBotIdFromToken)(options.token);
62
+ const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
63
+ const rest = {
64
+ applicationId,
65
+ authorization: options.proxy?.authorization,
66
+ authorizationHeader: options.proxy?.authorizationHeader ?? 'authorization',
67
+ baseUrl,
68
+ deleteQueueDelay: 60000,
69
+ globallyRateLimited: false,
70
+ invalidBucket: (0, _invalidBucket.createInvalidRequestBucket)({
71
+ logger: options.logger
72
+ }),
73
+ isProxied: !baseUrl.startsWith(DISCORD_API_URL),
74
+ updateBearerTokenEndpoint: options.proxy?.updateBearerTokenEndpoint,
75
+ maxRetryCount: Infinity,
76
+ processingRateLimitedPaths: false,
77
+ queues: new Map(),
78
+ rateLimitedPaths: new Map(),
79
+ token: options.token,
80
+ version: options.version ?? DISCORD_API_VERSION,
81
+ logger: options.logger ?? _utils.logger,
82
+ routes: (0, _routes.createRoutes)(),
83
+ createBaseHeaders () {
84
+ return {
85
+ 'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
86
+ };
87
+ },
88
+ checkRateLimits (url, identifier) {
89
+ const ratelimited = rest.rateLimitedPaths.get(`${identifier}${url}`);
90
+ const global = rest.rateLimitedPaths.get('global');
91
+ const now = Date.now();
92
+ if (ratelimited && now < ratelimited.resetTimestamp) {
93
+ return ratelimited.resetTimestamp - now;
94
+ }
95
+ if (global && now < global.resetTimestamp) {
96
+ return global.resetTimestamp - now;
97
+ }
98
+ return false;
99
+ },
100
+ async updateTokenQueues (oldToken, newToken) {
101
+ if (rest.isProxied) {
102
+ if (!rest.updateBearerTokenEndpoint) {
103
+ throw new Error("The 'proxy.updateBearerTokenEndpoint' option needs to be set when using a rest proxy and needed to call 'updateTokenQueues'");
104
+ }
105
+ const headers = {
106
+ 'content-type': 'application/json'
107
+ };
108
+ if (rest.authorization !== undefined) {
109
+ headers[rest.authorizationHeader] = rest.authorization;
110
+ }
111
+ await fetch(`${rest.baseUrl}/${rest.updateBearerTokenEndpoint}`, {
112
+ method: 'POST',
113
+ body: JSON.stringify({
114
+ oldToken,
115
+ newToken
116
+ }),
117
+ headers
118
+ });
119
+ return;
120
+ }
121
+ const newIdentifier = `Bearer ${newToken}`;
122
+ // Update all the queues
123
+ for (const [key, queue] of rest.queues.entries()){
124
+ if (!key.startsWith(`Bearer ${oldToken}`)) continue;
125
+ rest.queues.delete(key);
126
+ queue.identifier = newIdentifier;
127
+ const newKey = `${newIdentifier}${queue.url}`;
128
+ const newQueue = rest.queues.get(newKey);
129
+ // Merge the queues
130
+ if (newQueue) {
131
+ newQueue.waiting.unshift(...queue.waiting);
132
+ newQueue.pending.unshift(...queue.pending);
133
+ queue.waiting = [];
134
+ queue.pending = [];
135
+ queue.cleanup();
136
+ } else {
137
+ rest.queues.set(newKey, queue);
138
+ }
139
+ }
140
+ for (const [key, ratelimitPath] of rest.rateLimitedPaths.entries()){
141
+ if (!key.startsWith(`Bearer ${oldToken}`)) continue;
142
+ rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.url}`, ratelimitPath);
143
+ if (ratelimitPath.bucketId) {
144
+ rest.rateLimitedPaths.set(`${newIdentifier}${ratelimitPath.bucketId}`, ratelimitPath);
145
+ }
146
+ }
147
+ },
148
+ changeToDiscordFormat (obj) {
149
+ if (obj === null) return null;
150
+ if (typeof obj === 'object') {
151
+ if (Array.isArray(obj)) {
152
+ return obj.map((item)=>rest.changeToDiscordFormat(item));
153
+ }
154
+ const newObj = {};
155
+ for (const key of Object.keys(obj)){
156
+ const value = obj[key];
157
+ // If the key is already in snake_case we can assume it is already in the discord format.
158
+ if (key.includes('_')) {
159
+ newObj[key] = value;
160
+ continue;
161
+ }
162
+ // Some falsy values should be allowed like null or 0
163
+ if (value !== undefined) {
164
+ switch(key){
165
+ case 'permissions':
166
+ case 'allow':
167
+ case 'deny':
168
+ newObj[key] = typeof value === 'string' ? value : (0, _utils.calculateBits)(value);
169
+ continue;
170
+ case 'defaultMemberPermissions':
171
+ newObj.default_member_permissions = typeof value === 'string' ? value : (0, _utils.calculateBits)(value);
172
+ continue;
173
+ case 'nameLocalizations':
174
+ newObj.name_localizations = value;
175
+ continue;
176
+ case 'descriptionLocalizations':
177
+ newObj.description_localizations = value;
178
+ continue;
179
+ }
180
+ }
181
+ newObj[(0, _utils.camelToSnakeCase)(key)] = rest.changeToDiscordFormat(value);
182
+ }
183
+ return newObj;
184
+ }
185
+ if (typeof obj === 'bigint') return obj.toString();
186
+ return obj;
187
+ },
188
+ createRequestBody (method, options) {
189
+ const headers = this.createBaseHeaders();
190
+ if (options?.unauthorized !== true) headers.authorization = `Bot ${rest.token}`;
191
+ // IF A REASON IS PROVIDED ENCODE IT IN HEADERS
192
+ if (options?.reason !== undefined) {
193
+ headers[AUDIT_LOG_REASON_HEADER] = encodeURIComponent(options?.reason);
194
+ }
195
+ let body;
196
+ // TODO: check if we need to add specific check for GET method
197
+ // Since GET does not allow bodies
198
+ // Have to check for attachments first, since body then has to be send in a different way.
199
+ if (options?.files !== undefined) {
200
+ const form = new FormData();
201
+ for(let i = 0; i < options.files.length; ++i){
202
+ form.append(`file${i}`, options.files[i].blob, options.files[i].name);
203
+ }
204
+ // Have to use changeToDiscordFormat or else JSON.stringify may throw an error for the presence of BigInt(s) in the json
205
+ form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat({
206
+ ...options.body,
207
+ files: undefined
208
+ })));
209
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
210
+ body = form;
211
+ } else if (options?.body && options.headers && options.headers['content-type'] === 'application/x-www-form-urlencoded') {
212
+ // OAuth2 body handling
213
+ const formBody = [];
214
+ const discordBody = rest.changeToDiscordFormat(options.body);
215
+ for(const prop in discordBody){
216
+ formBody.push(`${encodeURIComponent(prop)}=${encodeURIComponent(discordBody[prop])}`);
217
+ }
218
+ body = formBody.join('&');
219
+ } else if (options?.body !== undefined) {
220
+ if (options.body instanceof FormData) {
221
+ body = options.body;
222
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
223
+ } else {
224
+ body = JSON.stringify(rest.changeToDiscordFormat(options.body));
225
+ headers['content-type'] = `application/json`;
226
+ }
227
+ }
228
+ // SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
229
+ if (options?.headers) {
230
+ Object.assign(headers, options.headers);
231
+ }
232
+ return {
233
+ body,
234
+ headers,
235
+ method
236
+ };
237
+ },
238
+ processRateLimitedPaths () {
239
+ const now = Date.now();
240
+ for (const [key, value] of rest.rateLimitedPaths.entries()){
241
+ // rest.debug(
242
+ // `[REST - processRateLimitedPaths] Running for of loop. ${
243
+ // value.resetTimestamp - now
244
+ // }`
245
+ // )
246
+ // If the time has not reached cancel
247
+ if (value.resetTimestamp > now) continue;
248
+ // Rate limit is over, delete the rate limiter
249
+ rest.rateLimitedPaths.delete(key);
250
+ // If it was global, also mark the global value as false
251
+ if (key === 'global') rest.globallyRateLimited = false;
252
+ }
253
+ // ALL PATHS ARE CLEARED CAN CANCEL OUT!
254
+ if (rest.rateLimitedPaths.size === 0) {
255
+ rest.processingRateLimitedPaths = false;
256
+ } else {
257
+ rest.processingRateLimitedPaths = true;
258
+ // RECHECK IN 1 SECOND
259
+ setTimeout(()=>{
260
+ // rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
261
+ rest.processRateLimitedPaths();
262
+ }, 1000);
263
+ }
264
+ },
265
+ /** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers, identifier) {
266
+ let rateLimited = false;
267
+ // GET ALL NECESSARY HEADERS
268
+ const remaining = headers.get(RATE_LIMIT_REMAINING_HEADER);
269
+ const retryAfter = headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
270
+ const reset = Date.now() + Number(retryAfter) * 1000;
271
+ const global = headers.get(RATE_LIMIT_GLOBAL_HEADER);
272
+ // undefined override null needed for typings
273
+ const bucketId = headers.get(RATE_LIMIT_BUCKET_HEADER) ?? undefined;
274
+ const limit = headers.get(RATE_LIMIT_LIMIT_HEADER);
275
+ // If we didn't received the identifier, fallback to the bot token
276
+ identifier ??= `Bot ${rest.token}`;
277
+ rest.queues.get(`${identifier}${url}`)?.handleCompletedRequest({
278
+ remaining: remaining ? Number(remaining) : undefined,
279
+ interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
280
+ max: limit ? Number(limit) : undefined
281
+ });
282
+ // IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
283
+ if (remaining === '0') {
284
+ rateLimited = true;
285
+ // SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
286
+ rest.rateLimitedPaths.set(`${identifier}${url}`, {
287
+ url,
288
+ resetTimestamp: reset,
289
+ bucketId
290
+ });
291
+ // SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
292
+ if (bucketId) {
293
+ rest.rateLimitedPaths.set(`${identifier}${bucketId}`, {
294
+ url,
295
+ resetTimestamp: reset,
296
+ bucketId
297
+ });
298
+ }
299
+ }
300
+ // IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
301
+ if (global) {
302
+ const retryAfter = Number(headers.get('retry-after')) * 1000;
303
+ const globalReset = Date.now() + retryAfter;
304
+ // rest.debug(
305
+ // `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
306
+ // )
307
+ rest.globallyRateLimited = true;
308
+ rateLimited = true;
309
+ setTimeout(()=>{
310
+ rest.globallyRateLimited = false;
311
+ }, retryAfter);
312
+ rest.rateLimitedPaths.set('global', {
313
+ url: 'global',
314
+ resetTimestamp: globalReset,
315
+ bucketId
316
+ });
317
+ if (bucketId) {
318
+ rest.rateLimitedPaths.set(identifier, {
319
+ url: 'global',
320
+ resetTimestamp: globalReset,
321
+ bucketId
322
+ });
323
+ }
324
+ }
325
+ if (rateLimited && !rest.processingRateLimitedPaths) {
326
+ rest.processRateLimitedPaths();
327
+ }
328
+ return rateLimited ? bucketId : undefined;
329
+ },
330
+ async sendRequest (options) {
331
+ const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
332
+ const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
333
+ const loggingHeaders = {
334
+ ...payload.headers
335
+ };
336
+ if (payload.headers.authorization) {
337
+ const authorizationScheme = payload.headers.authorization?.split(' ')[0];
338
+ loggingHeaders.authorization = `${authorizationScheme} tokenhere`;
339
+ }
340
+ rest.logger.debug(`sending request to ${url}`, 'with payload:', {
341
+ ...payload,
342
+ headers: loggingHeaders
343
+ });
344
+ const response = await fetch(url, payload).catch(async (error)=>{
345
+ rest.logger.error(error);
346
+ // Mark request and completed
347
+ rest.invalidBucket.handleCompletedRequest(999, false);
348
+ options.reject({
349
+ ok: false,
350
+ status: 999,
351
+ error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.'
352
+ });
353
+ throw error;
354
+ });
355
+ rest.logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
356
+ // Mark request and completed
357
+ rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
358
+ // Set the bucket id if it was available on the headers
359
+ const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers, payload.headers.authorization);
360
+ if (bucketId) options.bucketId = bucketId;
361
+ if (response.status < 200 || response.status >= 400) {
362
+ rest.logger.debug(`Request to ${url} failed.`);
363
+ if (response.status !== 429) {
364
+ options.reject({
365
+ ok: false,
366
+ status: response.status,
367
+ body: await response.text()
368
+ });
369
+ return;
370
+ }
371
+ rest.logger.debug(`Request to ${url} was ratelimited.`);
372
+ // Too many attempts, get rid of request from queue.
373
+ if (options.retryCount >= rest.maxRetryCount) {
374
+ rest.logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
375
+ // rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
376
+ options.reject({
377
+ ok: false,
378
+ status: response.status,
379
+ error: 'The request was rate limited and it maxed out the retries limit.'
380
+ });
381
+ return;
382
+ }
383
+ options.retryCount += 1;
384
+ const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
385
+ if (resetAfter) await (0, _utils.delay)(Number(resetAfter) * 1000);
386
+ // process the response to prevent mem leak
387
+ await response.arrayBuffer();
388
+ return await options.retryRequest?.(options);
389
+ }
390
+ // Discord sometimes sends no response with no content.
391
+ options.resolve({
392
+ ok: true,
393
+ status: response.status,
394
+ body: response.status === 204 ? undefined : await response.text()
395
+ });
396
+ },
397
+ simplifyUrl (url, method) {
398
+ const parts = url.split('/');
399
+ const secondLastPart = parts[parts.length - 2];
400
+ if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
401
+ return url;
402
+ }
403
+ if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
404
+ parts.splice(-2);
405
+ parts.push('reactions');
406
+ } else {
407
+ parts.splice(-1);
408
+ parts.push('x');
409
+ }
410
+ if (parts[parts.length - 3] === 'reactions') {
411
+ parts.splice(-2);
412
+ }
413
+ if (method === 'DELETE' && secondLastPart === 'messages') {
414
+ return `D${parts.join('/')}`;
415
+ }
416
+ return parts.join('/');
417
+ },
418
+ async processRequest (request) {
419
+ const url = rest.simplifyUrl(request.route, request.method);
420
+ if (request.runThroughQueue === false) {
421
+ await rest.sendRequest(request);
422
+ return;
423
+ }
424
+ // If we the request has a token, use it
425
+ // Else fallback to prefix with the bot token
426
+ const queueIdentifier = request.requestBodyOptions?.headers?.authorization ?? `Bot ${rest.token}`;
427
+ const queue = rest.queues.get(`${queueIdentifier}${url}`);
428
+ if (queue !== undefined) {
429
+ queue.makeRequest(request);
430
+ } else {
431
+ // CREATES A NEW QUEUE
432
+ const bucketQueue = new _queue.Queue(rest, {
433
+ url,
434
+ deleteQueueDelay: rest.deleteQueueDelay,
435
+ identifier: queueIdentifier
436
+ });
437
+ // Save queue
438
+ rest.queues.set(`${queueIdentifier}${url}`, bucketQueue);
439
+ // Add request to queue
440
+ bucketQueue.makeRequest(request);
441
+ }
442
+ },
443
+ async makeRequest (method, route, options) {
444
+ if (rest.isProxied) {
445
+ if (rest.authorization !== undefined) {
446
+ options ??= {};
447
+ options.headers ??= {};
448
+ options.headers[rest.authorizationHeader] = rest.authorization;
449
+ }
450
+ const result = await fetch(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
451
+ if (!result.ok) {
452
+ const err = await result.json().catch(()=>{});
453
+ // Legacy Handling to not break old code or when body is missing
454
+ if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
455
+ throw new Error(JSON.stringify(err));
456
+ }
457
+ return result.status !== 204 ? await result.json() : undefined;
458
+ }
459
+ // This error needs to be created here because of how stack traces get calculated
460
+ const error = new Error();
461
+ error.message = 'Failed to send request to discord.';
462
+ return await new Promise(async (resolve, reject)=>{
463
+ const payload = {
464
+ route,
465
+ method,
466
+ requestBodyOptions: options,
467
+ retryCount: 0,
468
+ retryRequest: async (payload)=>{
469
+ await rest.processRequest(payload);
470
+ },
471
+ resolve: (data)=>{
472
+ resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
473
+ },
474
+ reject: (reason)=>{
475
+ error.cause = reason;
476
+ reject(error);
477
+ },
478
+ runThroughQueue: options?.runThroughQueue
479
+ };
480
+ await rest.processRequest(payload);
481
+ });
482
+ },
483
+ async get (url, options) {
484
+ return (0, _utils.camelize)(await rest.makeRequest('GET', url, options));
485
+ },
486
+ async post (url, options) {
487
+ return (0, _utils.camelize)(await rest.makeRequest('POST', url, options));
488
+ },
489
+ async delete (url, options) {
490
+ (0, _utils.camelize)(await rest.makeRequest('DELETE', url, options));
491
+ },
492
+ async patch (url, options) {
493
+ return (0, _utils.camelize)(await rest.makeRequest('PATCH', url, options));
494
+ },
495
+ async put (url, options) {
496
+ return (0, _utils.camelize)(await rest.makeRequest('PUT', url, options));
497
+ },
498
+ async addReaction (channelId, messageId, reaction) {
499
+ reaction = (0, _utils.processReactionString)(reaction);
500
+ await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
501
+ },
502
+ async addReactions (channelId, messageId, reactions, ordered = false) {
503
+ if (!ordered) {
504
+ await Promise.all(reactions.map(async (reaction)=>{
505
+ await rest.addReaction(channelId, messageId, reaction);
506
+ }));
507
+ return;
508
+ }
509
+ for (const reaction of reactions){
510
+ await rest.addReaction(channelId, messageId, reaction);
511
+ }
512
+ },
513
+ async addRole (guildId, userId, roleId, reason) {
514
+ await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
515
+ reason
516
+ });
517
+ },
518
+ async addThreadMember (channelId, userId) {
519
+ await rest.put(rest.routes.channels.threads.user(channelId, userId));
520
+ },
521
+ async addDmRecipient (channelId, userId, body) {
522
+ await rest.put(rest.routes.channels.dmRecipient(channelId, userId), {
523
+ body
524
+ });
525
+ },
526
+ async createAutomodRule (guildId, body, reason) {
527
+ return await rest.post(rest.routes.guilds.automod.rules(guildId), {
528
+ body,
529
+ reason
530
+ });
531
+ },
532
+ async createChannel (guildId, body, reason) {
533
+ return await rest.post(rest.routes.guilds.channels(guildId), {
534
+ body,
535
+ reason
536
+ });
537
+ },
538
+ async createEmoji (guildId, body, reason) {
539
+ return await rest.post(rest.routes.guilds.emojis(guildId), {
540
+ body,
541
+ reason
542
+ });
543
+ },
544
+ async createApplicationEmoji (body) {
545
+ return await rest.post(rest.routes.applicationEmojis(rest.applicationId), {
546
+ body
547
+ });
548
+ },
549
+ async createGlobalApplicationCommand (body, options) {
550
+ const restOptions = {
551
+ body
552
+ };
553
+ if (options?.bearerToken) {
554
+ restOptions.unauthorized = true;
555
+ restOptions.headers = {
556
+ authorization: `Bearer ${options.bearerToken}`
557
+ };
558
+ }
559
+ return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
560
+ },
561
+ async createGuild (body) {
562
+ return await rest.post(rest.routes.guilds.all(), {
563
+ body
564
+ });
565
+ },
566
+ async createGuildApplicationCommand (body, guildId, options) {
567
+ const restOptions = {
568
+ body
569
+ };
570
+ if (options?.bearerToken) {
571
+ restOptions.unauthorized = true;
572
+ restOptions.headers = {
573
+ authorization: `Bearer ${options.bearerToken}`
574
+ };
575
+ }
576
+ return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
577
+ },
578
+ async createGuildFromTemplate (templateCode, body) {
579
+ if (body.icon) {
580
+ body.icon = await (0, _utils.urlToBase64)(body.icon);
581
+ }
582
+ return await rest.post(rest.routes.guilds.templates.code(templateCode), {
583
+ body
584
+ });
585
+ },
586
+ async createGuildSticker (guildId, options, reason) {
587
+ const form = new FormData();
588
+ form.append('file', options.file.blob, options.file.name);
589
+ form.append('name', options.name);
590
+ form.append('description', options.description);
591
+ form.append('tags', options.tags);
592
+ return await rest.post(rest.routes.guilds.stickers(guildId), {
593
+ body: form,
594
+ reason
595
+ });
596
+ },
597
+ async createGuildTemplate (guildId, body) {
598
+ return await rest.post(rest.routes.guilds.templates.all(guildId), {
599
+ body
600
+ });
601
+ },
602
+ async createForumThread (channelId, body, reason) {
603
+ return await rest.post(rest.routes.channels.forum(channelId), {
604
+ body,
605
+ files: body.files,
606
+ reason
607
+ });
608
+ },
609
+ async createInvite (channelId, body = {}, reason) {
610
+ return await rest.post(rest.routes.channels.invites(channelId), {
611
+ body,
612
+ reason
613
+ });
614
+ },
615
+ async createRole (guildId, body, reason) {
616
+ return await rest.post(rest.routes.guilds.roles.all(guildId), {
617
+ body,
618
+ reason
619
+ });
620
+ },
621
+ async createScheduledEvent (guildId, body, reason) {
622
+ return await rest.post(rest.routes.guilds.events.events(guildId), {
623
+ body,
624
+ reason
625
+ });
626
+ },
627
+ async createStageInstance (body, reason) {
628
+ return await rest.post(rest.routes.channels.stages(), {
629
+ body,
630
+ reason
631
+ });
632
+ },
633
+ async createWebhook (channelId, options, reason) {
634
+ return await rest.post(rest.routes.channels.webhooks(channelId), {
635
+ body: {
636
+ name: options.name,
637
+ avatar: options.avatar ? await (0, _utils.urlToBase64)(options.avatar) : undefined
638
+ },
639
+ reason
640
+ });
641
+ },
642
+ async deleteAutomodRule (guildId, ruleId, reason) {
643
+ await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
644
+ reason
645
+ });
646
+ },
647
+ async deleteChannel (channelId, reason) {
648
+ await rest.delete(rest.routes.channels.channel(channelId), {
649
+ reason
650
+ });
651
+ },
652
+ async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
653
+ await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
654
+ reason
655
+ });
656
+ },
657
+ async deleteEmoji (guildId, id, reason) {
658
+ await rest.delete(rest.routes.guilds.emoji(guildId, id), {
659
+ reason
660
+ });
661
+ },
662
+ async deleteApplicationEmoji (id) {
663
+ await rest.delete(rest.routes.applicationEmoji(rest.applicationId, id));
664
+ },
665
+ async deleteFollowupMessage (token, messageId) {
666
+ await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
667
+ unauthorized: true
668
+ });
669
+ },
670
+ async deleteGlobalApplicationCommand (commandId) {
671
+ await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
672
+ },
673
+ async deleteGuild (guildId) {
674
+ await rest.delete(rest.routes.guilds.guild(guildId));
675
+ },
676
+ async deleteGuildApplicationCommand (commandId, guildId) {
677
+ await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
678
+ },
679
+ async deleteGuildSticker (guildId, stickerId, reason) {
680
+ await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
681
+ reason
682
+ });
683
+ },
684
+ async deleteGuildTemplate (guildId, templateCode) {
685
+ await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
686
+ },
687
+ async deleteIntegration (guildId, integrationId, reason) {
688
+ await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
689
+ reason
690
+ });
691
+ },
692
+ async deleteInvite (inviteCode, reason) {
693
+ await rest.delete(rest.routes.guilds.invite(inviteCode), {
694
+ reason
695
+ });
696
+ },
697
+ async deleteMessage (channelId, messageId, reason) {
698
+ await rest.delete(rest.routes.channels.message(channelId, messageId), {
699
+ reason
700
+ });
701
+ },
702
+ async deleteMessages (channelId, messageIds, reason) {
703
+ await rest.post(rest.routes.channels.bulk(channelId), {
704
+ body: {
705
+ messages: messageIds.slice(0, 100).map((id)=>id.toString())
706
+ },
707
+ reason
708
+ });
709
+ },
710
+ async deleteOriginalInteractionResponse (token) {
711
+ await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
712
+ unauthorized: true
713
+ });
714
+ },
715
+ async deleteOwnReaction (channelId, messageId, reaction) {
716
+ reaction = (0, _utils.processReactionString)(reaction);
717
+ await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
718
+ },
719
+ async deleteReactionsAll (channelId, messageId) {
720
+ await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
721
+ },
722
+ async deleteReactionsEmoji (channelId, messageId, reaction) {
723
+ reaction = (0, _utils.processReactionString)(reaction);
724
+ await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
725
+ },
726
+ async deleteRole (guildId, roleId, reason) {
727
+ await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
728
+ reason
729
+ });
730
+ },
731
+ async deleteScheduledEvent (guildId, eventId) {
732
+ await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
733
+ },
734
+ async deleteStageInstance (channelId, reason) {
735
+ await rest.delete(rest.routes.channels.stage(channelId), {
736
+ reason
737
+ });
738
+ },
739
+ async deleteUserReaction (channelId, messageId, userId, reaction) {
740
+ reaction = (0, _utils.processReactionString)(reaction);
741
+ await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
742
+ },
743
+ async deleteWebhook (webhookId, reason) {
744
+ await rest.delete(rest.routes.webhooks.id(webhookId), {
745
+ reason
746
+ });
747
+ },
748
+ async deleteWebhookMessage (webhookId, token, messageId, options) {
749
+ await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
750
+ },
751
+ async deleteWebhookWithToken (webhookId, token) {
752
+ await rest.delete(rest.routes.webhooks.webhook(webhookId, token), {
753
+ unauthorized: true
754
+ });
755
+ },
756
+ async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
757
+ return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
758
+ body: {
759
+ permissions
760
+ },
761
+ headers: {
762
+ authorization: `Bearer ${bearerToken}`
763
+ }
764
+ });
765
+ },
766
+ async editAutomodRule (guildId, ruleId, body, reason) {
767
+ return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
768
+ body,
769
+ reason
770
+ });
771
+ },
772
+ async editBotProfile (options) {
773
+ const avatar = options?.botAvatarURL ? await (0, _utils.urlToBase64)(options?.botAvatarURL) : options?.botAvatarURL;
774
+ const banner = options?.botBannerURL ? await (0, _utils.urlToBase64)(options?.botBannerURL) : options?.botBannerURL;
775
+ return await rest.patch(rest.routes.currentUser(), {
776
+ body: {
777
+ username: options.username?.trim(),
778
+ avatar,
779
+ banner
780
+ }
781
+ });
782
+ },
783
+ async editChannel (channelId, body, reason) {
784
+ return await rest.patch(rest.routes.channels.channel(channelId), {
785
+ body,
786
+ reason
787
+ });
788
+ },
789
+ async editChannelPermissionOverrides (channelId, body, reason) {
790
+ await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
791
+ body,
792
+ reason
793
+ });
794
+ },
795
+ async editChannelPositions (guildId, body) {
796
+ await rest.patch(rest.routes.guilds.channels(guildId), {
797
+ body
798
+ });
799
+ },
800
+ async editEmoji (guildId, id, body, reason) {
801
+ return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
802
+ body,
803
+ reason
804
+ });
805
+ },
806
+ async editApplicationEmoji (id, body) {
807
+ return await rest.patch(rest.routes.applicationEmoji(rest.applicationId, id), {
808
+ body
809
+ });
810
+ },
811
+ async editFollowupMessage (token, messageId, body) {
812
+ return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
813
+ body,
814
+ files: body.files,
815
+ unauthorized: true
816
+ });
817
+ },
818
+ async editGlobalApplicationCommand (commandId, body) {
819
+ return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
820
+ body
821
+ });
822
+ },
823
+ async editGuild (guildId, body, reason) {
824
+ return await rest.patch(rest.routes.guilds.guild(guildId), {
825
+ body,
826
+ reason
827
+ });
828
+ },
829
+ async editGuildApplicationCommand (commandId, guildId, body) {
830
+ return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
831
+ body
832
+ });
833
+ },
834
+ async editGuildMfaLevel (guildId, mfaLevel, reason) {
835
+ await rest.post(rest.routes.guilds.mfa(guildId), {
836
+ body: {
837
+ level: mfaLevel
838
+ },
839
+ reason
840
+ });
841
+ },
842
+ async editGuildSticker (guildId, stickerId, body, reason) {
843
+ return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
844
+ body,
845
+ reason
846
+ });
847
+ },
848
+ async editGuildTemplate (guildId, templateCode, body) {
849
+ return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
850
+ body
851
+ });
852
+ },
853
+ async editMessage (channelId, messageId, body) {
854
+ return await rest.patch(rest.routes.channels.message(channelId, messageId), {
855
+ body,
856
+ files: body.files
857
+ });
858
+ },
859
+ async editOriginalInteractionResponse (token, body) {
860
+ return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
861
+ body,
862
+ files: body.files
863
+ });
864
+ },
865
+ async editOriginalWebhookMessage (webhookId, token, options) {
866
+ return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
867
+ body: {
868
+ type: _types.InteractionResponseTypes.UpdateMessage,
869
+ data: options
870
+ },
871
+ files: options.files,
872
+ unauthorized: true
873
+ });
874
+ },
875
+ async editOwnVoiceState (guildId, options) {
876
+ await rest.patch(rest.routes.guilds.voice(guildId), {
877
+ body: {
878
+ ...options,
879
+ requestToSpeakTimestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
880
+ }
881
+ });
882
+ },
883
+ async editScheduledEvent (guildId, eventId, body, reason) {
884
+ return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
885
+ body,
886
+ reason
887
+ });
888
+ },
889
+ async editRole (guildId, roleId, body, reason) {
890
+ return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
891
+ body,
892
+ reason
893
+ });
894
+ },
895
+ async editRolePositions (guildId, body, reason) {
896
+ return await rest.patch(rest.routes.guilds.roles.all(guildId), {
897
+ body,
898
+ reason
899
+ });
900
+ },
901
+ async editStageInstance (channelId, topic, reason) {
902
+ return await rest.patch(rest.routes.channels.stage(channelId), {
903
+ body: {
904
+ topic
905
+ },
906
+ reason
907
+ });
908
+ },
909
+ async editUserVoiceState (guildId, options) {
910
+ await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
911
+ body: options
912
+ });
913
+ },
914
+ async editWebhook (webhookId, body, reason) {
915
+ return await rest.patch(rest.routes.webhooks.id(webhookId), {
916
+ body,
917
+ reason
918
+ });
919
+ },
920
+ async editWebhookMessage (webhookId, token, messageId, options) {
921
+ return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
922
+ body: options,
923
+ files: options.files,
924
+ unauthorized: true
925
+ });
926
+ },
927
+ async editWebhookWithToken (webhookId, token, body) {
928
+ return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
929
+ body,
930
+ unauthorized: true
931
+ });
932
+ },
933
+ async editWelcomeScreen (guildId, body, reason) {
934
+ return await rest.patch(rest.routes.guilds.welcome(guildId), {
935
+ body,
936
+ reason
937
+ });
938
+ },
939
+ async editWidgetSettings (guildId, body, reason) {
940
+ return await rest.patch(rest.routes.guilds.widget(guildId), {
941
+ body,
942
+ reason
943
+ });
944
+ },
945
+ async executeWebhook (webhookId, token, options) {
946
+ return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
947
+ body: options,
948
+ unauthorized: true
949
+ });
950
+ },
951
+ async followAnnouncement (sourceChannelId, targetChannelId, reason) {
952
+ return await rest.post(rest.routes.channels.follow(sourceChannelId), {
953
+ body: {
954
+ webhookChannelId: targetChannelId
955
+ },
956
+ reason
957
+ });
958
+ },
959
+ async getActiveThreads (guildId) {
960
+ return await rest.get(rest.routes.channels.threads.active(guildId));
961
+ },
962
+ async getApplicationCommandPermission (guildId, commandId, options) {
963
+ const restOptions = {};
964
+ if (options?.accessToken) {
965
+ restOptions.unauthorized = true;
966
+ restOptions.headers = {
967
+ authorization: `Bearer ${options.accessToken}`
968
+ };
969
+ }
970
+ return await rest.get(rest.routes.interactions.commands.permission(options?.applicationId ?? rest.applicationId, guildId, commandId), restOptions);
971
+ },
972
+ async getApplicationCommandPermissions (guildId, options) {
973
+ const restOptions = {};
974
+ if (options?.accessToken) {
975
+ restOptions.unauthorized = true;
976
+ restOptions.headers = {
977
+ authorization: `Bearer ${options.accessToken}`
978
+ };
979
+ }
980
+ return await rest.get(rest.routes.interactions.commands.permissions(options?.applicationId ?? rest.applicationId, guildId), restOptions);
981
+ },
982
+ async getApplicationInfo () {
983
+ return await rest.get(rest.routes.oauth2.application());
984
+ },
985
+ async editApplicationInfo (body) {
986
+ return await rest.patch(rest.routes.application(), {
987
+ body
988
+ });
989
+ },
990
+ async getCurrentAuthenticationInfo (token) {
991
+ return await rest.get(rest.routes.oauth2.currentAuthorization(), {
992
+ headers: {
993
+ authorization: `Bearer ${token}`
994
+ },
995
+ unauthorized: true
996
+ });
997
+ },
998
+ async exchangeToken (clientId, clientSecret, body) {
999
+ const basicCredentials = _nodebuffer.Buffer.from(`${clientId}:${clientSecret}`);
1000
+ const restOptions = {
1001
+ body,
1002
+ headers: {
1003
+ 'content-type': 'application/x-www-form-urlencoded',
1004
+ authorization: `Basic ${basicCredentials.toString('base64')}`
1005
+ },
1006
+ runThroughQueue: false,
1007
+ unauthorized: true
1008
+ };
1009
+ if (body.grantType === 'client_credentials') {
1010
+ restOptions.body.scope = body.scope.join(' ');
1011
+ }
1012
+ return await rest.post(rest.routes.oauth2.tokenExchange(), restOptions);
1013
+ },
1014
+ async revokeToken (clientId, clientSecret, body) {
1015
+ const basicCredentials = _nodebuffer.Buffer.from(`${clientId}:${clientSecret}`);
1016
+ await rest.post(rest.routes.oauth2.tokenRevoke(), {
1017
+ body,
1018
+ headers: {
1019
+ 'content-type': 'application/x-www-form-urlencoded',
1020
+ authorization: `Basic ${basicCredentials.toString('base64')}`
1021
+ },
1022
+ unauthorized: true
1023
+ });
1024
+ },
1025
+ async getAuditLog (guildId, options) {
1026
+ return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
1027
+ },
1028
+ async getAutomodRule (guildId, ruleId) {
1029
+ return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
1030
+ },
1031
+ async getAutomodRules (guildId) {
1032
+ return await rest.get(rest.routes.guilds.automod.rules(guildId));
1033
+ },
1034
+ async getAvailableVoiceRegions () {
1035
+ return await rest.get(rest.routes.regions());
1036
+ },
1037
+ async getBan (guildId, userId) {
1038
+ return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
1039
+ },
1040
+ async getBans (guildId, options) {
1041
+ return await rest.get(rest.routes.guilds.members.bans(guildId, options));
1042
+ },
1043
+ async getChannel (id) {
1044
+ return await rest.get(rest.routes.channels.channel(id));
1045
+ },
1046
+ async getChannelInvites (channelId) {
1047
+ return await rest.get(rest.routes.channels.invites(channelId));
1048
+ },
1049
+ async getChannels (guildId) {
1050
+ return await rest.get(rest.routes.guilds.channels(guildId));
1051
+ },
1052
+ async getChannelWebhooks (channelId) {
1053
+ return await rest.get(rest.routes.channels.webhooks(channelId));
1054
+ },
1055
+ async getDmChannel (userId) {
1056
+ return await rest.post(rest.routes.channels.dm(), {
1057
+ body: {
1058
+ recipientId: userId
1059
+ }
1060
+ });
1061
+ },
1062
+ async getGroupDmChannel (body) {
1063
+ return await rest.post(rest.routes.channels.dm(), {
1064
+ body
1065
+ });
1066
+ },
1067
+ async getEmoji (guildId, emojiId) {
1068
+ return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
1069
+ },
1070
+ async getApplicationEmoji (emojiId) {
1071
+ return await rest.get(rest.routes.applicationEmoji(rest.applicationId, emojiId));
1072
+ },
1073
+ async getEmojis (guildId) {
1074
+ return await rest.get(rest.routes.guilds.emojis(guildId));
1075
+ },
1076
+ async getApplicationEmojis () {
1077
+ return await rest.get(rest.routes.applicationEmojis(rest.applicationId));
1078
+ },
1079
+ async getFollowupMessage (token, messageId) {
1080
+ return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
1081
+ unauthorized: true
1082
+ });
1083
+ },
1084
+ async getGatewayBot () {
1085
+ return await rest.get(rest.routes.gatewayBot());
1086
+ },
1087
+ async getGlobalApplicationCommand (commandId) {
1088
+ return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
1089
+ },
1090
+ async getGlobalApplicationCommands () {
1091
+ return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
1092
+ },
1093
+ async getGuild (guildId, options = {
1094
+ counts: true
1095
+ }) {
1096
+ return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
1097
+ },
1098
+ async getGuilds (token, options) {
1099
+ const makeRequestOptions = token ? {
1100
+ headers: {
1101
+ authorization: `Bearer ${token}`
1102
+ },
1103
+ unauthorized: true
1104
+ } : undefined;
1105
+ return await rest.get(rest.routes.guilds.userGuilds(options), makeRequestOptions);
1106
+ },
1107
+ async getGuildApplicationCommand (commandId, guildId) {
1108
+ return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
1109
+ },
1110
+ async getGuildApplicationCommands (guildId) {
1111
+ return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
1112
+ },
1113
+ async getGuildPreview (guildId) {
1114
+ return await rest.get(rest.routes.guilds.preview(guildId));
1115
+ },
1116
+ async getGuildTemplate (templateCode) {
1117
+ return await rest.get(rest.routes.guilds.templates.code(templateCode));
1118
+ },
1119
+ async getGuildTemplates (guildId) {
1120
+ return await rest.get(rest.routes.guilds.templates.all(guildId));
1121
+ },
1122
+ async getGuildWebhooks (guildId) {
1123
+ return await rest.get(rest.routes.guilds.webhooks(guildId));
1124
+ },
1125
+ async getIntegrations (guildId) {
1126
+ return await rest.get(rest.routes.guilds.integrations(guildId));
1127
+ },
1128
+ async getInvite (inviteCode, options) {
1129
+ return await rest.get(rest.routes.guilds.invite(inviteCode, options));
1130
+ },
1131
+ async getInvites (guildId) {
1132
+ return await rest.get(rest.routes.guilds.invites(guildId));
1133
+ },
1134
+ async getMessage (channelId, messageId) {
1135
+ return await rest.get(rest.routes.channels.message(channelId, messageId));
1136
+ },
1137
+ async getMessages (channelId, options) {
1138
+ return await rest.get(rest.routes.channels.messages(channelId, options));
1139
+ },
1140
+ async getStickerPack (stickerPackId) {
1141
+ return await rest.get(rest.routes.stickerPack(stickerPackId));
1142
+ },
1143
+ async getStickerPacks () {
1144
+ return await rest.get(rest.routes.stickerPacks());
1145
+ },
1146
+ async getOriginalInteractionResponse (token) {
1147
+ return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
1148
+ unauthorized: true
1149
+ });
1150
+ },
1151
+ async getPinnedMessages (channelId) {
1152
+ return await rest.get(rest.routes.channels.pins(channelId));
1153
+ },
1154
+ async getPrivateArchivedThreads (channelId, options) {
1155
+ return await rest.get(rest.routes.channels.threads.private(channelId, options));
1156
+ },
1157
+ async getPrivateJoinedArchivedThreads (channelId, options) {
1158
+ return await rest.get(rest.routes.channels.threads.joined(channelId, options));
1159
+ },
1160
+ async getPruneCount (guildId, options) {
1161
+ return await rest.get(rest.routes.guilds.prune(guildId, options));
1162
+ },
1163
+ async getPublicArchivedThreads (channelId, options) {
1164
+ return await rest.get(rest.routes.channels.threads.public(channelId, options));
1165
+ },
1166
+ async getRoles (guildId) {
1167
+ return await rest.get(rest.routes.guilds.roles.all(guildId));
1168
+ },
1169
+ async getRole (guildId, roleId) {
1170
+ return await rest.get(rest.routes.guilds.roles.one(guildId, roleId));
1171
+ },
1172
+ async getScheduledEvent (guildId, eventId, options) {
1173
+ return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
1174
+ },
1175
+ async getScheduledEvents (guildId, options) {
1176
+ return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
1177
+ },
1178
+ async getScheduledEventUsers (guildId, eventId, options) {
1179
+ return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
1180
+ },
1181
+ async getSessionInfo () {
1182
+ return await rest.getGatewayBot();
1183
+ },
1184
+ async getStageInstance (channelId) {
1185
+ return await rest.get(rest.routes.channels.stage(channelId));
1186
+ },
1187
+ async getOwnVoiceState (guildId) {
1188
+ return await rest.get(rest.routes.guilds.voice(guildId));
1189
+ },
1190
+ async getUserVoiceState (guildId, userId) {
1191
+ return await rest.get(rest.routes.guilds.voice(guildId, userId));
1192
+ },
1193
+ async getSticker (stickerId) {
1194
+ return await rest.get(rest.routes.sticker(stickerId));
1195
+ },
1196
+ async getGuildSticker (guildId, stickerId) {
1197
+ return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
1198
+ },
1199
+ async getGuildStickers (guildId) {
1200
+ return await rest.get(rest.routes.guilds.stickers(guildId));
1201
+ },
1202
+ async getThreadMember (channelId, userId) {
1203
+ return await rest.get(rest.routes.channels.threads.user(channelId, userId));
1204
+ },
1205
+ async getThreadMembers (channelId) {
1206
+ return await rest.get(rest.routes.channels.threads.members(channelId));
1207
+ },
1208
+ async getReactions (channelId, messageId, reaction, options) {
1209
+ return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
1210
+ },
1211
+ async getUser (id) {
1212
+ return await rest.get(rest.routes.user(id));
1213
+ },
1214
+ async getCurrentUser (token) {
1215
+ return await rest.get(rest.routes.currentUser(), {
1216
+ headers: {
1217
+ authorization: `Bearer ${token}`
1218
+ },
1219
+ unauthorized: true
1220
+ });
1221
+ },
1222
+ async getUserConnections (token) {
1223
+ return await rest.get(rest.routes.oauth2.connections(), {
1224
+ headers: {
1225
+ authorization: `Bearer ${token}`
1226
+ },
1227
+ unauthorized: true
1228
+ });
1229
+ },
1230
+ async getUserApplicationRoleConnection (token, applicationId) {
1231
+ return await rest.get(rest.routes.oauth2.roleConnections(applicationId), {
1232
+ headers: {
1233
+ authorization: `Bearer ${token}`
1234
+ },
1235
+ unauthorized: true
1236
+ });
1237
+ },
1238
+ async getVanityUrl (guildId) {
1239
+ return await rest.get(rest.routes.guilds.vanity(guildId));
1240
+ },
1241
+ async getVoiceRegions (guildId) {
1242
+ return await rest.get(rest.routes.guilds.regions(guildId));
1243
+ },
1244
+ async getWebhook (webhookId) {
1245
+ return await rest.get(rest.routes.webhooks.id(webhookId));
1246
+ },
1247
+ async getWebhookMessage (webhookId, token, messageId, options) {
1248
+ return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options), {
1249
+ unauthorized: true
1250
+ });
1251
+ },
1252
+ async getWebhookWithToken (webhookId, token) {
1253
+ return await rest.get(rest.routes.webhooks.webhook(webhookId, token), {
1254
+ unauthorized: true
1255
+ });
1256
+ },
1257
+ async getWelcomeScreen (guildId) {
1258
+ return await rest.get(rest.routes.guilds.welcome(guildId));
1259
+ },
1260
+ async getWidget (guildId) {
1261
+ return await rest.get(rest.routes.guilds.widgetJson(guildId));
1262
+ },
1263
+ async getWidgetSettings (guildId) {
1264
+ return await rest.get(rest.routes.guilds.widget(guildId));
1265
+ },
1266
+ async joinThread (channelId) {
1267
+ await rest.put(rest.routes.channels.threads.me(channelId));
1268
+ },
1269
+ async leaveGuild (guildId) {
1270
+ await rest.delete(rest.routes.guilds.leave(guildId));
1271
+ },
1272
+ async leaveThread (channelId) {
1273
+ await rest.delete(rest.routes.channels.threads.me(channelId));
1274
+ },
1275
+ async publishMessage (channelId, messageId) {
1276
+ return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
1277
+ },
1278
+ async removeRole (guildId, userId, roleId, reason) {
1279
+ await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
1280
+ reason
1281
+ });
1282
+ },
1283
+ async removeThreadMember (channelId, userId) {
1284
+ await rest.delete(rest.routes.channels.threads.user(channelId, userId));
1285
+ },
1286
+ async removeDmRecipient (channelId, userId) {
1287
+ await rest.delete(rest.routes.channels.dmRecipient(channelId, userId));
1288
+ },
1289
+ async sendFollowupMessage (token, options) {
1290
+ return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
1291
+ body: options,
1292
+ files: options.files,
1293
+ unauthorized: true
1294
+ });
1295
+ },
1296
+ async sendInteractionResponse (interactionId, token, options, params) {
1297
+ return await rest.post(rest.routes.interactions.responses.callback(interactionId, token, params), {
1298
+ body: options,
1299
+ files: options.data?.files,
1300
+ runThroughQueue: false,
1301
+ unauthorized: true
1302
+ });
1303
+ },
1304
+ async sendMessage (channelId, body) {
1305
+ return await rest.post(rest.routes.channels.messages(channelId), {
1306
+ body,
1307
+ files: body.files
1308
+ });
1309
+ },
1310
+ async startThreadWithMessage (channelId, messageId, body, reason) {
1311
+ return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
1312
+ body,
1313
+ reason
1314
+ });
1315
+ },
1316
+ async startThreadWithoutMessage (channelId, body, reason) {
1317
+ return await rest.post(rest.routes.channels.threads.all(channelId), {
1318
+ body,
1319
+ reason
1320
+ });
1321
+ },
1322
+ async getPollAnswerVoters (channelId, messageId, answerId, options) {
1323
+ return await rest.get(rest.routes.channels.polls.votes(channelId, messageId, answerId, options));
1324
+ },
1325
+ async endPoll (channelId, messageId) {
1326
+ return await rest.post(rest.routes.channels.polls.expire(channelId, messageId));
1327
+ },
1328
+ async syncGuildTemplate (guildId) {
1329
+ return await rest.put(rest.routes.guilds.templates.all(guildId));
1330
+ },
1331
+ async banMember (guildId, userId, body, reason) {
1332
+ await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
1333
+ body,
1334
+ reason
1335
+ });
1336
+ },
1337
+ async bulkBanMembers (guildId, options, reason) {
1338
+ return await rest.post(rest.routes.guilds.members.bulkBan(guildId), {
1339
+ body: options,
1340
+ reason
1341
+ });
1342
+ },
1343
+ async editBotMember (guildId, body, reason) {
1344
+ return await rest.patch(rest.routes.guilds.members.bot(guildId), {
1345
+ body,
1346
+ reason
1347
+ });
1348
+ },
1349
+ async editMember (guildId, userId, body, reason) {
1350
+ return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
1351
+ body,
1352
+ reason
1353
+ });
1354
+ },
1355
+ async getMember (guildId, userId) {
1356
+ return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1357
+ },
1358
+ async getCurrentMember (guildId, token) {
1359
+ return await rest.get(rest.routes.guilds.members.currentMember(guildId), {
1360
+ headers: {
1361
+ authorization: `Bearer ${token}`
1362
+ },
1363
+ unauthorized: true
1364
+ });
1365
+ },
1366
+ async getMembers (guildId, options) {
1367
+ return await rest.get(rest.routes.guilds.members.members(guildId, options));
1368
+ },
1369
+ async getApplicationActivityInstance (applicationId, instanceId) {
1370
+ return await rest.get(rest.routes.applicationActivityInstance(applicationId, instanceId));
1371
+ },
1372
+ async kickMember (guildId, userId, reason) {
1373
+ await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
1374
+ reason
1375
+ });
1376
+ },
1377
+ async pinMessage (channelId, messageId, reason) {
1378
+ await rest.put(rest.routes.channels.pin(channelId, messageId), {
1379
+ reason
1380
+ });
1381
+ },
1382
+ async pruneMembers (guildId, body, reason) {
1383
+ return await rest.post(rest.routes.guilds.members.prune(guildId), {
1384
+ body,
1385
+ reason
1386
+ });
1387
+ },
1388
+ async searchMembers (guildId, query, options) {
1389
+ return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
1390
+ },
1391
+ async getGuildOnboarding (guildId) {
1392
+ return await rest.get(rest.routes.guilds.onboarding(guildId));
1393
+ },
1394
+ async editGuildOnboarding (guildId, options, reason) {
1395
+ return await rest.put(rest.routes.guilds.onboarding(guildId), {
1396
+ body: options,
1397
+ reason
1398
+ });
1399
+ },
1400
+ async unbanMember (guildId, userId, reason) {
1401
+ await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
1402
+ reason
1403
+ });
1404
+ },
1405
+ async unpinMessage (channelId, messageId, reason) {
1406
+ await rest.delete(rest.routes.channels.pin(channelId, messageId), {
1407
+ reason
1408
+ });
1409
+ },
1410
+ async triggerTypingIndicator (channelId) {
1411
+ await rest.post(rest.routes.channels.typing(channelId));
1412
+ },
1413
+ async upsertGlobalApplicationCommands (body, options) {
1414
+ const restOptions = {
1415
+ body
1416
+ };
1417
+ if (options?.bearerToken) {
1418
+ restOptions.unauthorized = true;
1419
+ restOptions.headers = {
1420
+ authorization: `Bearer ${options.bearerToken}`
1421
+ };
1422
+ }
1423
+ return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
1424
+ },
1425
+ async upsertGuildApplicationCommands (guildId, body, options) {
1426
+ const restOptions = {
1427
+ body
1428
+ };
1429
+ if (options?.bearerToken) {
1430
+ restOptions.unauthorized = true;
1431
+ restOptions.headers = {
1432
+ authorization: `Bearer ${options.bearerToken}`
1433
+ };
1434
+ }
1435
+ return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
1436
+ },
1437
+ async editUserApplicationRoleConnection (token, applicationId, body) {
1438
+ return await rest.put(rest.routes.oauth2.roleConnections(applicationId), {
1439
+ body,
1440
+ headers: {
1441
+ authorization: `Bearer ${token}`
1442
+ },
1443
+ unauthorized: true
1444
+ });
1445
+ },
1446
+ async addGuildMember (guildId, userId, body) {
1447
+ return await rest.put(rest.routes.guilds.members.member(guildId, userId), {
1448
+ body
1449
+ });
1450
+ },
1451
+ async createTestEntitlement (applicationId, body) {
1452
+ return await rest.post(rest.routes.monetization.entitlements(applicationId), {
1453
+ body
1454
+ });
1455
+ },
1456
+ async listEntitlements (applicationId, options) {
1457
+ return await rest.get(rest.routes.monetization.entitlements(applicationId, options));
1458
+ },
1459
+ async deleteTestEntitlement (applicationId, entitlementId) {
1460
+ await rest.delete(rest.routes.monetization.entitlement(applicationId, entitlementId));
1461
+ },
1462
+ async consumeEntitlement (applicationId, entitlementId) {
1463
+ await rest.post(rest.routes.monetization.consumeEntitlement(applicationId, entitlementId));
1464
+ },
1465
+ async listSkus (applicationId) {
1466
+ return await rest.get(rest.routes.monetization.skus(applicationId));
1467
+ },
1468
+ preferSnakeCase (enabled) {
1469
+ const camelizer = enabled ? (x)=>x : _utils.camelize;
1470
+ rest.get = async (url, options)=>{
1471
+ return camelizer(await rest.makeRequest('GET', url, options));
1472
+ };
1473
+ rest.post = async (url, options)=>{
1474
+ return camelizer(await rest.makeRequest('POST', url, options));
1475
+ };
1476
+ rest.delete = async (url, options)=>{
1477
+ camelizer(await rest.makeRequest('DELETE', url, options));
1478
+ };
1479
+ rest.patch = async (url, options)=>{
1480
+ return camelizer(await rest.makeRequest('PATCH', url, options));
1481
+ };
1482
+ rest.put = async (url, options)=>{
1483
+ return camelizer(await rest.makeRequest('PUT', url, options));
1484
+ };
1485
+ return rest;
1486
+ }
1487
+ };
1488
+ return rest;
1489
+ }
1490
+ var HttpResponseCode;
1491
+ (function(HttpResponseCode) {
1492
+ /** Minimum value of a code in oder to consider that it was successful. */ HttpResponseCode[HttpResponseCode["Success"] = 200] = "Success";
1493
+ /** Request completed successfully, but Discord returned an empty body. */ HttpResponseCode[HttpResponseCode["NoContent"] = 204] = "NoContent";
1494
+ /** Minimum value of a code in order to consider that something went wrong. */ HttpResponseCode[HttpResponseCode["Error"] = 400] = "Error";
1495
+ /** This request got rate limited. */ HttpResponseCode[HttpResponseCode["TooManyRequests"] = 429] = "TooManyRequests";
1496
+ })(HttpResponseCode || (HttpResponseCode = {}));
1497
+
1498
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJ1xuaW1wb3J0IHtcbiAgdHlwZSBCaWdTdHJpbmcsXG4gIHR5cGUgQ2FtZWxpemUsXG4gIHR5cGUgRGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2UsXG4gIHR5cGUgRGlzY29yZEFjdGl2aXR5SW5zdGFuY2UsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uLFxuICB0eXBlIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24sXG4gIHR5cGUgRGlzY29yZEF1ZGl0TG9nLFxuICB0eXBlIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIHR5cGUgRGlzY29yZEJhbixcbiAgdHlwZSBEaXNjb3JkQnVsa0JhbixcbiAgdHlwZSBEaXNjb3JkQ2hhbm5lbCxcbiAgdHlwZSBEaXNjb3JkQ29ubmVjdGlvbixcbiAgdHlwZSBEaXNjb3JkQ3VycmVudEF1dGhvcml6YXRpb24sXG4gIHR5cGUgRGlzY29yZEVtb2ppLFxuICB0eXBlIERpc2NvcmRFbnRpdGxlbWVudCxcbiAgdHlwZSBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICB0eXBlIERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRHdWlsZCxcbiAgdHlwZSBEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgdHlwZSBEaXNjb3JkR3VpbGRPbmJvYXJkaW5nLFxuICB0eXBlIERpc2NvcmRHdWlsZFByZXZpZXcsXG4gIHR5cGUgRGlzY29yZEd1aWxkV2lkZ2V0LFxuICB0eXBlIERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzLFxuICB0eXBlIERpc2NvcmRJbnRlZ3JhdGlvbixcbiAgdHlwZSBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRJbnZpdGUsXG4gIHR5cGUgRGlzY29yZEludml0ZU1ldGFkYXRhLFxuICB0eXBlIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTWVtYmVyLFxuICB0eXBlIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgdHlwZSBEaXNjb3JkTWVzc2FnZSxcbiAgdHlwZSBEaXNjb3JkUHJ1bmVkQ291bnQsXG4gIHR5cGUgRGlzY29yZFJvbGUsXG4gIHR5cGUgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICB0eXBlIERpc2NvcmRTa3UsXG4gIHR5cGUgRGlzY29yZFN0YWdlSW5zdGFuY2UsXG4gIHR5cGUgRGlzY29yZFN0aWNrZXIsXG4gIHR5cGUgRGlzY29yZFN0aWNrZXJQYWNrLFxuICB0eXBlIERpc2NvcmRUZW1wbGF0ZSxcbiAgdHlwZSBEaXNjb3JkVGhyZWFkTWVtYmVyLFxuICB0eXBlIERpc2NvcmRVc2VyLFxuICB0eXBlIERpc2NvcmRWYW5pdHlVcmwsXG4gIHR5cGUgRGlzY29yZFZvaWNlUmVnaW9uLFxuICB0eXBlIERpc2NvcmRWb2ljZVN0YXRlLFxuICB0eXBlIERpc2NvcmRXZWJob29rLFxuICB0eXBlIERpc2NvcmRXZWxjb21lU2NyZWVuLFxuICBJbnRlcmFjdGlvblJlc3BvbnNlVHlwZXMsXG4gIHR5cGUgTWZhTGV2ZWxzLFxuICB0eXBlIE1vZGlmeUd1aWxkVGVtcGxhdGUsXG59IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgY2FsY3VsYXRlQml0cywgY2FtZWxUb1NuYWtlQ2FzZSwgY2FtZWxpemUsIGRlbGF5LCBnZXRCb3RJZEZyb21Ub2tlbiwgbG9nZ2VyLCBwcm9jZXNzUmVhY3Rpb25TdHJpbmcsIHVybFRvQmFzZTY0IH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgeyBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCB9IGZyb20gJy4vaW52YWxpZEJ1Y2tldC5qcydcbmltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnLi9xdWV1ZS5qcydcbmltcG9ydCB7IGNyZWF0ZVJvdXRlcyB9IGZyb20gJy4vcm91dGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsIENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucywgTWFrZVJlcXVlc3RPcHRpb25zLCBSZXN0TWFuYWdlciwgU2VuZFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi90eXBlcy5qcydcblxuLy8gVE9ETzogbWFrZSBkeW5hbWljIGJhc2VkIG9uIHBhY2thZ2UuanNvbiBmaWxlXG5jb25zdCB2ZXJzaW9uID0gJzE5LjAuMC1hbHBoYS4xJ1xuXG5leHBvcnQgY29uc3QgRElTQ09SRF9BUElfVkVSU0lPTiA9IDEwXG5leHBvcnQgY29uc3QgRElTQ09SRF9BUElfVVJMID0gJ2h0dHBzOi8vZGlzY29yZC5jb20vYXBpJ1xuXG5leHBvcnQgY29uc3QgQVVESVRfTE9HX1JFQVNPTl9IRUFERVIgPSAneC1hdWRpdC1sb2ctcmVhc29uJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZW1haW5pbmcnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9SRVNFVF9BRlRFUl9IRUFERVIgPSAneC1yYXRlbGltaXQtcmVzZXQtYWZ0ZXInXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LWdsb2JhbCdcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIgPSAneC1yYXRlbGltaXQtYnVja2V0J1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfTElNSVRfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LWxpbWl0J1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfU0NPUEVfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXNjb3BlJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzdE1hbmFnZXIob3B0aW9uczogQ3JlYXRlUmVzdE1hbmFnZXJPcHRpb25zKTogUmVzdE1hbmFnZXIge1xuICBjb25zdCBhcHBsaWNhdGlvbklkID0gb3B0aW9ucy5hcHBsaWNhdGlvbklkID8gQmlnSW50KG9wdGlvbnMuYXBwbGljYXRpb25JZCkgOiBnZXRCb3RJZEZyb21Ub2tlbihvcHRpb25zLnRva2VuKVxuXG4gIGNvbnN0IGJhc2VVcmwgPSBvcHRpb25zLnByb3h5Py5iYXNlVXJsID8/IERJU0NPUkRfQVBJX1VSTFxuXG4gIGNvbnN0IHJlc3Q6IFJlc3RNYW5hZ2VyID0ge1xuICAgIGFwcGxpY2F0aW9uSWQsXG4gICAgYXV0aG9yaXphdGlvbjogb3B0aW9ucy5wcm94eT8uYXV0aG9yaXphdGlvbixcbiAgICBhdXRob3JpemF0aW9uSGVhZGVyOiBvcHRpb25zLnByb3h5Py5hdXRob3JpemF0aW9uSGVhZGVyID8/ICdhdXRob3JpemF0aW9uJyxcbiAgICBiYXNlVXJsLFxuICAgIGRlbGV0ZVF1ZXVlRGVsYXk6IDYwMDAwLFxuICAgIGdsb2JhbGx5UmF0ZUxpbWl0ZWQ6IGZhbHNlLFxuICAgIGludmFsaWRCdWNrZXQ6IGNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0KHsgbG9nZ2VyOiBvcHRpb25zLmxvZ2dlciB9KSxcbiAgICBpc1Byb3hpZWQ6ICFiYXNlVXJsLnN0YXJ0c1dpdGgoRElTQ09SRF9BUElfVVJMKSxcbiAgICB1cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50OiBvcHRpb25zLnByb3h5Py51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50LFxuICAgIG1heFJldHJ5Q291bnQ6IEluZmluaXR5LFxuICAgIHByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzOiBmYWxzZSxcbiAgICBxdWV1ZXM6IG5ldyBNYXAoKSxcbiAgICByYXRlTGltaXRlZFBhdGhzOiBuZXcgTWFwKCksXG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IERJU0NPUkRfQVBJX1ZFUlNJT04sXG4gICAgbG9nZ2VyOiBvcHRpb25zLmxvZ2dlciA/PyBsb2dnZXIsXG5cbiAgICByb3V0ZXM6IGNyZWF0ZVJvdXRlcygpLFxuXG4gICAgY3JlYXRlQmFzZUhlYWRlcnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAndXNlci1hZ2VudCc6IGBEaXNjb3JkQm90IChodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vLCB2JHt2ZXJzaW9ufSlgLFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGVja1JhdGVMaW1pdHModXJsLCBpZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCByYXRlbGltaXRlZCA9IHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5nZXQoYCR7aWRlbnRpZmllcn0ke3VybH1gKVxuXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKVxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBpZiAocmF0ZWxpbWl0ZWQgJiYgbm93IDwgcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIGlmIChnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWwucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZVRva2VuUXVldWVzKG9sZFRva2VuLCBuZXdUb2tlbikge1xuICAgICAgaWYgKHJlc3QuaXNQcm94aWVkKSB7XG4gICAgICAgIGlmICghcmVzdC51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJUaGUgJ3Byb3h5LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQnIG9wdGlvbiBuZWVkcyB0byBiZSBzZXQgd2hlbiB1c2luZyBhIHJlc3QgcHJveHkgYW5kIG5lZWRlZCB0byBjYWxsICd1cGRhdGVUb2tlblF1ZXVlcydcIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gICAgICAgIGlmIChyZXN0LmF1dGhvcml6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7cmVzdC5iYXNlVXJsfS8ke3Jlc3QudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludH1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb2xkVG9rZW4sXG4gICAgICAgICAgICBuZXdUb2tlbixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdJZGVudGlmaWVyID0gYEJlYXJlciAke25ld1Rva2VufWBcblxuICAgICAgLy8gVXBkYXRlIGFsbCB0aGUgcXVldWVzXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHF1ZXVlXSBvZiByZXN0LnF1ZXVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChgQmVhcmVyICR7b2xkVG9rZW59YCkpIGNvbnRpbnVlXG5cbiAgICAgICAgcmVzdC5xdWV1ZXMuZGVsZXRlKGtleSlcbiAgICAgICAgcXVldWUuaWRlbnRpZmllciA9IG5ld0lkZW50aWZpZXJcblxuICAgICAgICBjb25zdCBuZXdLZXkgPSBgJHtuZXdJZGVudGlmaWVyfSR7cXVldWUudXJsfWBcbiAgICAgICAgY29uc3QgbmV3UXVldWUgPSByZXN0LnF1ZXVlcy5nZXQobmV3S2V5KVxuXG4gICAgICAgIC8vIE1lcmdlIHRoZSBxdWV1ZXNcbiAgICAgICAgaWYgKG5ld1F1ZXVlKSB7XG4gICAgICAgICAgbmV3UXVldWUud2FpdGluZy51bnNoaWZ0KC4uLnF1ZXVlLndhaXRpbmcpXG4gICAgICAgICAgbmV3UXVldWUucGVuZGluZy51bnNoaWZ0KC4uLnF1ZXVlLnBlbmRpbmcpXG5cbiAgICAgICAgICBxdWV1ZS53YWl0aW5nID0gW11cbiAgICAgICAgICBxdWV1ZS5wZW5kaW5nID0gW11cblxuICAgICAgICAgIHF1ZXVlLmNsZWFudXAoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3QucXVldWVzLnNldChuZXdLZXksIHF1ZXVlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgcmF0ZWxpbWl0UGF0aF0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKGBCZWFyZXIgJHtvbGRUb2tlbn1gKSkgY29udGludWVcblxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke25ld0lkZW50aWZpZXJ9JHtyYXRlbGltaXRQYXRoLnVybH1gLCByYXRlbGltaXRQYXRoKVxuXG4gICAgICAgIGlmIChyYXRlbGltaXRQYXRoLmJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtuZXdJZGVudGlmaWVyfSR7cmF0ZWxpbWl0UGF0aC5idWNrZXRJZH1gLCByYXRlbGltaXRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNoYW5nZVRvRGlzY29yZEZvcm1hdChvYmo6IGFueSk6IGFueSB7XG4gICAgICBpZiAob2JqID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgIHJldHVybiBvYmoubWFwKChpdGVtKSA9PiByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChpdGVtKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld09iajogYW55ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuXG4gICAgICAgICAgLy8gSWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHNuYWtlX2Nhc2Ugd2UgY2FuIGFzc3VtZSBpdCBpcyBhbHJlYWR5IGluIHRoZSBkaXNjb3JkIGZvcm1hdC5cbiAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdfJykpIHtcbiAgICAgICAgICAgIG5ld09ialtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU29tZSBmYWxzeSB2YWx1ZXMgc2hvdWxkIGJlIGFsbG93ZWQgbGlrZSBudWxsIG9yIDBcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgY2FzZSAncGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICBjYXNlICdhbGxvdyc6XG4gICAgICAgICAgICAgIGNhc2UgJ2RlbnknOlxuICAgICAgICAgICAgICAgIG5ld09ialtrZXldID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogY2FsY3VsYXRlQml0cyh2YWx1ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICBjYXNlICdkZWZhdWx0TWVtYmVyUGVybWlzc2lvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5kZWZhdWx0X21lbWJlcl9wZXJtaXNzaW9ucyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IGNhbGN1bGF0ZUJpdHModmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgY2FzZSAnbmFtZUxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5uYW1lX2xvY2FsaXphdGlvbnMgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNhc2UgJ2Rlc2NyaXB0aW9uTG9jYWxpemF0aW9ucyc6XG4gICAgICAgICAgICAgICAgbmV3T2JqLmRlc2NyaXB0aW9uX2xvY2FsaXphdGlvbnMgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3T2JqW2NhbWVsVG9TbmFrZUNhc2Uoa2V5KV0gPSByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdPYmpcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdiaWdpbnQnKSByZXR1cm4gb2JqLnRvU3RyaW5nKClcblxuICAgICAgcmV0dXJuIG9ialxuICAgIH0sXG5cbiAgICBjcmVhdGVSZXF1ZXN0Qm9keShtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmNyZWF0ZUJhc2VIZWFkZXJzKClcblxuICAgICAgaWYgKG9wdGlvbnM/LnVuYXV0aG9yaXplZCAhPT0gdHJ1ZSkgaGVhZGVycy5hdXRob3JpemF0aW9uID0gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICAvLyBJRiBBIFJFQVNPTiBJUyBQUk9WSURFRCBFTkNPREUgSVQgSU4gSEVBREVSU1xuICAgICAgaWYgKG9wdGlvbnM/LnJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbQVVESVRfTE9HX1JFQVNPTl9IRUFERVJdID0gZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnM/LnJlYXNvbilcbiAgICAgIH1cblxuICAgICAgbGV0IGJvZHk6IHN0cmluZyB8IEZvcm1EYXRhIHwgdW5kZWZpbmVkXG5cbiAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gYWRkIHNwZWNpZmljIGNoZWNrIGZvciBHRVQgbWV0aG9kXG4gICAgICAvLyBTaW5jZSBHRVQgZG9lcyBub3QgYWxsb3cgYm9kaWVzXG5cbiAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGF0dGFjaG1lbnRzIGZpcnN0LCBzaW5jZSBib2R5IHRoZW4gaGFzIHRvIGJlIHNlbmQgaW4gYSBkaWZmZXJlbnQgd2F5LlxuICAgICAgaWYgKG9wdGlvbnM/LmZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5maWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvcm0uYXBwZW5kKGBmaWxlJHtpfWAsIG9wdGlvbnMuZmlsZXNbaV0uYmxvYiwgb3B0aW9ucy5maWxlc1tpXS5uYW1lKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGF2ZSB0byB1c2UgY2hhbmdlVG9EaXNjb3JkRm9ybWF0IG9yIGVsc2UgSlNPTi5zdHJpbmdpZnkgbWF5IHRocm93IGFuIGVycm9yIGZvciB0aGUgcHJlc2VuY2Ugb2YgQmlnSW50KHMpIGluIHRoZSBqc29uXG4gICAgICAgIGZvcm0uYXBwZW5kKCdwYXlsb2FkX2pzb24nLCBKU09OLnN0cmluZ2lmeShyZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh7IC4uLm9wdGlvbnMuYm9keSwgZmlsZXM6IHVuZGVmaW5lZCB9KSkpXG5cbiAgICAgICAgLy8gTm8gbmVlZCB0byBzZXQgdGhlIGBjb250ZW50LXR5cGVgIGhlYWRlciBzaW5jZSBgZmV0Y2hgIGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB1cyB3aGVuIHdlIHVzZSBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgICAgICBib2R5ID0gZm9ybVxuICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5ib2R5ICYmIG9wdGlvbnMuaGVhZGVycyAmJiBvcHRpb25zLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykge1xuICAgICAgICAvLyBPQXV0aDIgYm9keSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBmb3JtQm9keTogc3RyaW5nW10gPSBbXVxuXG4gICAgICAgIGNvbnN0IGRpc2NvcmRCb2R5ID0gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob3B0aW9ucy5ib2R5KVxuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBkaXNjb3JkQm9keSkge1xuICAgICAgICAgIGZvcm1Cb2R5LnB1c2goYCR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb3ApfT0ke2VuY29kZVVSSUNvbXBvbmVudChkaXNjb3JkQm9keVtwcm9wXSl9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGJvZHkgPSBmb3JtQm9keS5qb2luKCcmJylcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICAgIGJvZHkgPSBvcHRpb25zLmJvZHlcbiAgICAgICAgICAvLyBObyBuZWVkIHRvIHNldCB0aGUgYGNvbnRlbnQtdHlwZWAgaGVhZGVyIHNpbmNlIGBmZXRjaGAgZG9lcyB0aGF0IGF1dG9tYXRpY2FsbHkgZm9yIHVzIHdoZW4gd2UgdXNlIGEgYEZvcm1EYXRhYCBvYmplY3QuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSkpXG4gICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBgYXBwbGljYXRpb24vanNvbmBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTT01FVElNRVMgU1BFQ0lBTCBIRUFERVJTIChFLkcuIENVU1RPTSBBVVRIT1JJWkFUSU9OKSBORUVEIFRPIEJFIFVTRURcbiAgICAgIGlmIChvcHRpb25zPy5oZWFkZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaGVhZGVycywgb3B0aW9ucy5oZWFkZXJzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBtZXRob2QsXG4gICAgICB9XG4gICAgfSxcblxuICAgIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZW50cmllcygpKSB7XG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgZm9yIG9mIGxvb3AuICR7XG4gICAgICAgIC8vICAgdmFsdWUucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgICAgLy8gfWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIC8vIElmIHRoZSB0aW1lIGhhcyBub3QgcmVhY2hlZCBjYW5jZWxcbiAgICAgICAgaWYgKHZhbHVlLnJlc2V0VGltZXN0YW1wID4gbm93KSBjb250aW51ZVxuXG4gICAgICAgIC8vIFJhdGUgbGltaXQgaXMgb3ZlciwgZGVsZXRlIHRoZSByYXRlIGxpbWl0ZXJcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmRlbGV0ZShrZXkpXG4gICAgICAgIC8vIElmIGl0IHdhcyBnbG9iYWwsIGFsc28gbWFyayB0aGUgZ2xvYmFsIHZhbHVlIGFzIGZhbHNlXG4gICAgICAgIGlmIChrZXkgPT09ICdnbG9iYWwnKSByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBBTEwgUEFUSFMgQVJFIENMRUFSRUQgQ0FOIENBTkNFTCBPVVQhXG4gICAgICBpZiAocmVzdC5yYXRlTGltaXRlZFBhdGhzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzID0gdHJ1ZVxuICAgICAgICAvLyBSRUNIRUNLIElOIDEgU0VDT05EXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3QuZGVidWcoJ1tSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgc2V0VGltZW91dC4nKVxuICAgICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgICB9LCAxMDAwKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiogUHJvY2Vzc2VzIHRoZSByYXRlIGxpbWl0IGhlYWRlcnMgYW5kIGRldGVybWluZXMgaWYgaXQgbmVlZHMgdG8gYmUgcmF0ZSBsaW1pdGVkIGFuZCByZXR1cm5zIHRoZSBidWNrZXQgaWQgaWYgYXZhaWxhYmxlICovXG4gICAgcHJvY2Vzc0hlYWRlcnModXJsLCBoZWFkZXJzLCBpZGVudGlmaWVyKSB7XG4gICAgICBsZXQgcmF0ZUxpbWl0ZWQgPSBmYWxzZVxuXG4gICAgICAvLyBHRVQgQUxMIE5FQ0VTU0FSWSBIRUFERVJTXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIpXG4gICAgICBjb25zdCByZXRyeUFmdGVyID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9SRVNFVF9BRlRFUl9IRUFERVIpXG4gICAgICBjb25zdCByZXNldCA9IERhdGUubm93KCkgKyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwXG4gICAgICBjb25zdCBnbG9iYWwgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIpXG4gICAgICAvLyB1bmRlZmluZWQgb3ZlcnJpZGUgbnVsbCBuZWVkZWQgZm9yIHR5cGluZ3NcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSKSA/PyB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGxpbWl0ID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9MSU1JVF9IRUFERVIpXG5cbiAgICAgIC8vIElmIHdlIGRpZG4ndCByZWNlaXZlZCB0aGUgaWRlbnRpZmllciwgZmFsbGJhY2sgdG8gdGhlIGJvdCB0b2tlblxuICAgICAgaWRlbnRpZmllciA/Pz0gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICByZXN0LnF1ZXVlcy5nZXQoYCR7aWRlbnRpZmllcn0ke3VybH1gKT8uaGFuZGxlQ29tcGxldGVkUmVxdWVzdCh7XG4gICAgICAgIHJlbWFpbmluZzogcmVtYWluaW5nID8gTnVtYmVyKHJlbWFpbmluZykgOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVydmFsOiByZXRyeUFmdGVyID8gTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMCA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWF4OiBsaW1pdCA/IE51bWJlcihsaW1pdCkgOiB1bmRlZmluZWQsXG4gICAgICB9KVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgUkFURSBMSU1JVCwgTUFSSyBJVCBBUyBSQVRFIExJTUlURURcbiAgICAgIGlmIChyZW1haW5pbmcgPT09ICcwJykge1xuICAgICAgICByYXRlTGltaXRlZCA9IHRydWVcblxuICAgICAgICAvLyBTQVZFIFRIRSBVUkwgQVMgTElNSVRFRCwgSU1QT1JUQU5UIEZPUiBORVcgUkVRVUVTVFMgQlkgVVNFUiBXSVRIT1VUIEJVQ0tFVFxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCwge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgQlVDS0VUIEFTIExJTUlURUQgU0lOQ0UgRElGRkVSRU5UIFVSTFMgTUFZIFNIQVJFIEEgQlVDS0VUXG4gICAgICAgIGlmIChidWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7aWRlbnRpZmllcn0ke2J1Y2tldElkfWAsIHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIEdMT0JBTCBMSU1JVCwgTUFSSyBJVCBSQVRFIExJTUlURUQgR0xPQkFMTFlcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IE51bWJlcihoZWFkZXJzLmdldCgncmV0cnktYWZ0ZXInKSkgKiAxMDAwXG4gICAgICAgIGNvbnN0IGdsb2JhbFJlc2V0ID0gRGF0ZS5ub3coKSArIHJldHJ5QWZ0ZXJcbiAgICAgICAgLy8gICByZXN0LmRlYnVnKFxuICAgICAgICAvLyBgW1JFU1QgPSBHbG9iYWxseSBSYXRlIExpbWl0ZWRdIFVSTDogJHt1cmx9IHwgR2xvYmFsIFJlc3Q6ICR7Z2xvYmFsUmVzZXR9YFxuICAgICAgICAvLyAgIClcbiAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gdHJ1ZVxuICAgICAgICByYXRlTGltaXRlZCA9IHRydWVcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgICB9LCByZXRyeUFmdGVyKVxuXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoJ2dsb2JhbCcsIHtcbiAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyYXRlTGltaXRlZCAmJiAhcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocykge1xuICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgIH1cbiAgICAgIHJldHVybiByYXRlTGltaXRlZCA/IGJ1Y2tldElkIDogdW5kZWZpbmVkXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7b3B0aW9ucy5yb3V0ZX1gXG4gICAgICBjb25zdCBwYXlsb2FkID0gcmVzdC5jcmVhdGVSZXF1ZXN0Qm9keShvcHRpb25zLm1ldGhvZCwgb3B0aW9ucy5yZXF1ZXN0Qm9keU9wdGlvbnMpXG5cbiAgICAgIGNvbnN0IGxvZ2dpbmdIZWFkZXJzID0geyAuLi5wYXlsb2FkLmhlYWRlcnMgfVxuXG4gICAgICBpZiAocGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXphdGlvblNjaGVtZSA9IHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uPy5zcGxpdCgnICcpWzBdXG4gICAgICAgIGxvZ2dpbmdIZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgJHthdXRob3JpemF0aW9uU2NoZW1lfSB0b2tlbmhlcmVgXG4gICAgICB9XG5cbiAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBzZW5kaW5nIHJlcXVlc3QgdG8gJHt1cmx9YCwgJ3dpdGggcGF5bG9hZDonLCB7IC4uLnBheWxvYWQsIGhlYWRlcnM6IGxvZ2dpbmdIZWFkZXJzIH0pXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgcGF5bG9hZCkuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlc3QubG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICAvLyBNYXJrIHJlcXVlc3QgYW5kIGNvbXBsZXRlZFxuICAgICAgICByZXN0LmludmFsaWRCdWNrZXQuaGFuZGxlQ29tcGxldGVkUmVxdWVzdCg5OTksIGZhbHNlKVxuICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgIHN0YXR1czogOTk5LFxuICAgICAgICAgIGVycm9yOiAnUG9zc2libGUgbmV0d29yayBvciByZXF1ZXN0IHNoYXBlIGlzc3VlIG9jY3VycmVkLiBJZiB0aGlzIGlzIHJhcmUsIGl0cyBhIG5ldHdvcmsgZ2xpdGNoLiBJZiBpdCBvY2N1cnMgYSBsb3Qgc29tZXRoaW5nIGlzIHdyb25nLicsXG4gICAgICAgIH0pXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9KVxuICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgZmV0Y2hlZCBmcm9tICR7dXJsfSB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c30gJiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YClcblxuICAgICAgLy8gTWFyayByZXF1ZXN0IGFuZCBjb21wbGV0ZWRcbiAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuaGVhZGVycy5nZXQoUkFURV9MSU1JVF9TQ09QRV9IRUFERVIpID09PSAnc2hhcmVkJylcblxuICAgICAgLy8gU2V0IHRoZSBidWNrZXQgaWQgaWYgaXQgd2FzIGF2YWlsYWJsZSBvbiB0aGUgaGVhZGVyc1xuICAgICAgY29uc3QgYnVja2V0SWQgPSByZXN0LnByb2Nlc3NIZWFkZXJzKHJlc3Quc2ltcGxpZnlVcmwob3B0aW9ucy5yb3V0ZSwgb3B0aW9ucy5tZXRob2QpLCByZXNwb25zZS5oZWFkZXJzLCBwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbilcblxuICAgICAgaWYgKGJ1Y2tldElkKSBvcHRpb25zLmJ1Y2tldElkID0gYnVja2V0SWRcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IEh0dHBSZXNwb25zZUNvZGUuU3VjY2VzcyB8fCByZXNwb25zZS5zdGF0dXMgPj0gSHR0cFJlc3BvbnNlQ29kZS5FcnJvcikge1xuICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZmFpbGVkLmApXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gSHR0cFJlc3BvbnNlQ29kZS5Ub29NYW55UmVxdWVzdHMpIHtcbiAgICAgICAgICBvcHRpb25zLnJlamVjdCh7IG9rOiBmYWxzZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGJvZHk6IGF3YWl0IHJlc3BvbnNlLnRleHQoKSB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IHdhcyByYXRlbGltaXRlZC5gKVxuICAgICAgICAvLyBUb28gbWFueSBhdHRlbXB0cywgZ2V0IHJpZCBvZiByZXF1ZXN0IGZyb20gcXVldWUuXG4gICAgICAgIGlmIChvcHRpb25zLnJldHJ5Q291bnQgPj0gcmVzdC5tYXhSZXRyeUNvdW50KSB7XG4gICAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IGV4Y2VlZGVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgcmV0cmllcy5gLCAnd2l0aCBwYXlsb2FkOicsIHBheWxvYWQpXG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgIGVycm9yOiAnVGhlIHJlcXVlc3Qgd2FzIHJhdGUgbGltaXRlZCBhbmQgaXQgbWF4ZWQgb3V0IHRoZSByZXRyaWVzIGxpbWl0LicsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5yZXRyeUNvdW50ICs9IDFcblxuICAgICAgICBjb25zdCByZXNldEFmdGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoUkFURV9MSU1JVF9SRVNFVF9BRlRFUl9IRUFERVIpXG4gICAgICAgIGlmIChyZXNldEFmdGVyKSBhd2FpdCBkZWxheShOdW1iZXIocmVzZXRBZnRlcikgKiAxMDAwKVxuICAgICAgICAvLyBwcm9jZXNzIHRoZSByZXNwb25zZSB0byBwcmV2ZW50IG1lbSBsZWFrXG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKClcblxuICAgICAgICByZXR1cm4gYXdhaXQgb3B0aW9ucy5yZXRyeVJlcXVlc3Q/LihvcHRpb25zKVxuICAgICAgfVxuXG4gICAgICAvLyBEaXNjb3JkIHNvbWV0aW1lcyBzZW5kcyBubyByZXNwb25zZSB3aXRoIG5vIGNvbnRlbnQuXG4gICAgICBvcHRpb25zLnJlc29sdmUoeyBvazogdHJ1ZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGJvZHk6IHJlc3BvbnNlLnN0YXR1cyA9PT0gSHR0cFJlc3BvbnNlQ29kZS5Ob0NvbnRlbnQgPyB1bmRlZmluZWQgOiBhd2FpdCByZXNwb25zZS50ZXh0KCkgfSlcbiAgICB9LFxuXG4gICAgc2ltcGxpZnlVcmwodXJsLCBtZXRob2QpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdXJsLnNwbGl0KCcvJylcbiAgICAgIGNvbnN0IHNlY29uZExhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMl1cblxuICAgICAgaWYgKHNlY29uZExhc3RQYXJ0ID09PSAnY2hhbm5lbHMnIHx8IHNlY29uZExhc3RQYXJ0ID09PSAnZ3VpbGRzJykge1xuICAgICAgICByZXR1cm4gdXJsXG4gICAgICB9XG5cbiAgICAgIGlmIChzZWNvbmRMYXN0UGFydCA9PT0gJ3JlYWN0aW9ucycgfHwgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT09ICdAbWUnKSB7XG4gICAgICAgIHBhcnRzLnNwbGljZSgtMilcbiAgICAgICAgcGFydHMucHVzaCgncmVhY3Rpb25zJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnNwbGljZSgtMSlcbiAgICAgICAgcGFydHMucHVzaCgneCcpXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0c1twYXJ0cy5sZW5ndGggLSAzXSA9PT0gJ3JlYWN0aW9ucycpIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKC0yKVxuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kID09PSAnREVMRVRFJyAmJiBzZWNvbmRMYXN0UGFydCA9PT0gJ21lc3NhZ2VzJykge1xuICAgICAgICByZXR1cm4gYEQke3BhcnRzLmpvaW4oJy8nKX1gXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcvJylcbiAgICB9LFxuXG4gICAgYXN5bmMgcHJvY2Vzc1JlcXVlc3QocmVxdWVzdDogU2VuZFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICBjb25zdCB1cmwgPSByZXN0LnNpbXBsaWZ5VXJsKHJlcXVlc3Qucm91dGUsIHJlcXVlc3QubWV0aG9kKVxuXG4gICAgICBpZiAocmVxdWVzdC5ydW5UaHJvdWdoUXVldWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3QocmVxdWVzdClcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgd2UgdGhlIHJlcXVlc3QgaGFzIGEgdG9rZW4sIHVzZSBpdFxuICAgICAgLy8gRWxzZSBmYWxsYmFjayB0byBwcmVmaXggd2l0aCB0aGUgYm90IHRva2VuXG4gICAgICBjb25zdCBxdWV1ZUlkZW50aWZpZXIgPSByZXF1ZXN0LnJlcXVlc3RCb2R5T3B0aW9ucz8uaGVhZGVycz8uYXV0aG9yaXphdGlvbiA/PyBgQm90ICR7cmVzdC50b2tlbn1gXG5cbiAgICAgIGNvbnN0IHF1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KGAke3F1ZXVlSWRlbnRpZmllcn0ke3VybH1gKVxuXG4gICAgICBpZiAocXVldWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBxdWV1ZS5tYWtlUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ1JFQVRFUyBBIE5FVyBRVUVVRVxuICAgICAgICBjb25zdCBidWNrZXRRdWV1ZSA9IG5ldyBRdWV1ZShyZXN0LCB7IHVybCwgZGVsZXRlUXVldWVEZWxheTogcmVzdC5kZWxldGVRdWV1ZURlbGF5LCBpZGVudGlmaWVyOiBxdWV1ZUlkZW50aWZpZXIgfSlcblxuICAgICAgICAvLyBTYXZlIHF1ZXVlXG4gICAgICAgIHJlc3QucXVldWVzLnNldChgJHtxdWV1ZUlkZW50aWZpZXJ9JHt1cmx9YCwgYnVja2V0UXVldWUpXG5cbiAgICAgICAgLy8gQWRkIHJlcXVlc3QgdG8gcXVldWVcbiAgICAgICAgYnVja2V0UXVldWUubWFrZVJlcXVlc3QocmVxdWVzdClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgbWFrZVJlcXVlc3QobWV0aG9kLCByb3V0ZSwgb3B0aW9ucykge1xuICAgICAgaWYgKHJlc3QuaXNQcm94aWVkKSB7XG4gICAgICAgIGlmIChyZXN0LmF1dGhvcml6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9wdGlvbnMgPz89IHt9XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID8/PSB7fVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1tyZXN0LmF1dGhvcml6YXRpb25IZWFkZXJdID0gcmVzdC5hdXRob3JpemF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaChgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0ke3JvdXRlfWAsIHJlc3QuY3JlYXRlUmVxdWVzdEJvZHkobWV0aG9kLCBvcHRpb25zKSlcblxuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIGNvbnN0IGVyciA9IChhd2FpdCByZXN1bHQuanNvbigpLmNhdGNoKCgpID0+IHt9KSkgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICAgIC8vIExlZ2FjeSBIYW5kbGluZyB0byBub3QgYnJlYWsgb2xkIGNvZGUgb3Igd2hlbiBib2R5IGlzIG1pc3NpbmdcbiAgICAgICAgICBpZiAoIWVycj8uYm9keSkgdGhyb3cgbmV3IEVycm9yKGBFcnJvcjogJHtlcnIubWVzc2FnZSA/PyByZXN1bHQuc3RhdHVzVGV4dH1gKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlcnIpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zdGF0dXMgIT09IDIwNCA/IGF3YWl0IHJlc3VsdC5qc29uKCkgOiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgLy8gVGhpcyBlcnJvciBuZWVkcyB0byBiZSBjcmVhdGVkIGhlcmUgYmVjYXVzZSBvZiBob3cgc3RhY2sgdHJhY2VzIGdldCBjYWxjdWxhdGVkXG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpXG4gICAgICBlcnJvci5tZXNzYWdlID0gJ0ZhaWxlZCB0byBzZW5kIHJlcXVlc3QgdG8gZGlzY29yZC4nXG5cbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFNlbmRSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgcmVxdWVzdEJvZHlPcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyAocGF5bG9hZDogU2VuZFJlcXVlc3RPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShkYXRhLnN0YXR1cyAhPT0gMjA0ID8gSlNPTi5wYXJzZShkYXRhLmJvZHkgPz8gJ3t9JykgOiB1bmRlZmluZWQpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZWplY3Q6IChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGVycm9yLmNhdXNlID0gcmVhc29uXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBydW5UaHJvdWdoUXVldWU6IG9wdGlvbnM/LnJ1blRocm91Z2hRdWV1ZSxcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHJlc3QucHJvY2Vzc1JlcXVlc3QocGF5bG9hZClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0dFVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIHBvc3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnREVMRVRFJywgdXJsLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcGF0Y2g8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQQVRDSCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIHB1dDxUID0gdm9pZD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmJvdChjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pKVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSZWFjdGlvbnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9ucywgb3JkZXJlZCA9IGZhbHNlKSB7XG4gICAgICBpZiAoIW9yZGVyZWQpIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcmVhY3Rpb25zLm1hcChhc3luYyAocmVhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3QuYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKVxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlYWN0aW9uIG9mIHJlYWN0aW9ucykge1xuICAgICAgICBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbilcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUm9sZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGREbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCwgYm9keSkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVDaGFubmVsKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVFbW9qaShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVBcHBsaWNhdGlvbkVtb2ppKGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkKGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMuYWxsKCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChib2R5LCBndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkRnJvbVRlbXBsYXRlKHRlbXBsYXRlQ29kZSwgYm9keSkge1xuICAgICAgaWYgKGJvZHkuaWNvbikge1xuICAgICAgICBib2R5Lmljb24gPSBhd2FpdCB1cmxUb0Jhc2U2NChib2R5Lmljb24pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkU3RpY2tlcihndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgICAgZm9ybS5hcHBlbmQoJ2ZpbGUnLCBvcHRpb25zLmZpbGUuYmxvYiwgb3B0aW9ucy5maWxlLm5hbWUpXG4gICAgICBmb3JtLmFwcGVuZCgnbmFtZScsIG9wdGlvbnMubmFtZSlcbiAgICAgIGZvcm0uYXBwZW5kKCdkZXNjcmlwdGlvbicsIG9wdGlvbnMuZGVzY3JpcHRpb24pXG4gICAgICBmb3JtLmFwcGVuZCgndGFncycsIG9wdGlvbnMudGFncylcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpLCB7IGJvZHk6IGZvcm0sIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUZvcnVtVGhyZWFkKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb3J1bShjaGFubmVsSWQpLCB7IGJvZHksIGZpbGVzOiBib2R5LmZpbGVzLCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlSW52aXRlKGNoYW5uZWxJZCwgYm9keSA9IHt9LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEludml0ZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVSb2xlKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLmFsbChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudHMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVN0YWdlSW5zdGFuY2UoYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZXMoKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlV2ViaG9vayhjaGFubmVsSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICAgIGF2YXRhcjogb3B0aW9ucy5hdmF0YXIgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zLmF2YXRhcikgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWwoY2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMub3ZlcndyaXRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVFbW9qaShndWlsZElkLCBpZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBcHBsaWNhdGlvbkVtb2ppKGlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGQoZ3VpbGRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmd1aWxkKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVJbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW52aXRlKGludml0ZUNvZGUsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZXMoY2hhbm5lbElkLCBtZXNzYWdlSWRzLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy5idWxrKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlSWRzLnNsaWNlKDAsIDEwMCkubWFwKChpZCkgPT4gaWQudG9TdHJpbmcoKSksXG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3duUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmJvdChjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNBbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5hbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNFbW9qaShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuZW1vamkoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUm9sZShndWlsZElkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVVc2VyUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHVzZXJJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMudXNlcihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2sod2ViaG9va0lkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zKGd1aWxkSWQsIGNvbW1hbmRJZCwgYmVhcmVyVG9rZW4sIHBlcm1pc3Npb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEd1aWxkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbihyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIHtcbiAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlYWRlcnM6IHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAgfSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RQcm9maWxlKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGF2YXRhciA9IG9wdGlvbnM/LmJvdEF2YXRhclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEF2YXRhclVSTCkgOiBvcHRpb25zPy5ib3RBdmF0YXJVUkxcbiAgICAgIGNvbnN0IGJhbm5lciA9IG9wdGlvbnM/LmJvdEJhbm5lclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEJhbm5lclVSTCkgOiBvcHRpb25zPy5ib3RCYW5uZXJVUkxcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLmN1cnJlbnRVc2VyKCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHVzZXJuYW1lOiBvcHRpb25zLnVzZXJuYW1lPy50cmltKCksXG4gICAgICAgICAgYXZhdGFyLFxuICAgICAgICAgIGJhbm5lcixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIGJvZHkuaWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBvc2l0aW9ucyhndWlsZElkLCBib2R5KSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRFbW9qaShndWlsZElkLCBpZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkVtb2ppKGlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBpZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBmaWxlczogYm9keS5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmd1aWxkKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZE1mYUxldmVsKGd1aWxkSWQ6IEJpZ1N0cmluZywgbWZhTGV2ZWw6IE1mYUxldmVscywgcmVhc29uPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuZ3VpbGRzLm1mYShndWlsZElkKSwgeyBib2R5OiB7IGxldmVsOiBtZmFMZXZlbCB9LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZTogc3RyaW5nLCBib2R5OiBNb2RpZnlHdWlsZFRlbXBsYXRlKTogUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PiB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuZ3VpbGQoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbiwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgZmlsZXM6IGJvZHkuZmlsZXMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mub3JpZ2luYWwod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucyksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHR5cGU6IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcy5VcGRhdGVNZXNzYWdlLFxuICAgICAgICAgIGRhdGE6IG9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3duVm9pY2VTdGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICByZXF1ZXN0VG9TcGVha1RpbWVzdGFtcDogb3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcFxuICAgICAgICAgICAgPyBuZXcgRGF0ZShvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlKGd1aWxkSWQsIHJvbGVJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZVBvc2l0aW9ucyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgdG9waWMsIHJlYXNvbj86IHN0cmluZykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHsgYm9keTogeyB0b3BpYyB9LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQsIG9wdGlvbnMudXNlcklkKSwgeyBib2R5OiBvcHRpb25zIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rKHdlYmhvb2tJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbiwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlbGNvbWVTY3JlZW4oZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2VsY29tZVNjcmVlbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlbGNvbWUoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXaWRnZXRTZXR0aW5ncyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzPihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0KGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBleGVjdXRlV2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGZvbGxvd0Fubm91bmNlbWVudChzb3VyY2VDaGFubmVsSWQsIHRhcmdldENoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRGb2xsb3dlZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvbGxvdyhzb3VyY2VDaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB3ZWJob29rQ2hhbm5lbElkOiB0YXJnZXRDaGFubmVsSWQsXG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFjdGl2ZVRocmVhZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hY3RpdmUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fVxuXG4gICAgICBpZiAob3B0aW9ucz8uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fVxuXG4gICAgICBpZiAob3B0aW9ucz8uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbnMob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25JbmZvKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLmFwcGxpY2F0aW9uKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkluZm8oYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbigpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDdXJyZW50QXV0aGVudGljYXRpb25JbmZvKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEN1cnJlbnRBdXRob3JpemF0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIuY3VycmVudEF1dGhvcml6YXRpb24oKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGV4Y2hhbmdlVG9rZW4oY2xpZW50SWQsIGNsaWVudFNlY3JldCwgYm9keSkge1xuICAgICAgY29uc3QgYmFzaWNDcmVkZW50aWFscyA9IEJ1ZmZlci5mcm9tKGAke2NsaWVudElkfToke2NsaWVudFNlY3JldH1gKVxuXG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHJ1blRocm91Z2hRdWV1ZTogZmFsc2UsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHkuZ3JhbnRUeXBlID09PSAnY2xpZW50X2NyZWRlbnRpYWxzJykge1xuICAgICAgICByZXN0T3B0aW9ucy5ib2R5LnNjb3BlID0gYm9keS5zY29wZS5qb2luKCcgJylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQWNjZXNzVG9rZW5SZXNwb25zZT4ocmVzdC5yb3V0ZXMub2F1dGgyLnRva2VuRXhjaGFuZ2UoKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHJldm9rZVRva2VuKGNsaWVudElkLCBjbGllbnRTZWNyZXQsIGJvZHkpIHtcbiAgICAgIGNvbnN0IGJhc2ljQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShgJHtjbGllbnRJZH06JHtjbGllbnRTZWNyZXR9YClcblxuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLm9hdXRoMi50b2tlblJldm9rZSgpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJhc2ljICR7YmFzaWNDcmVkZW50aWFscy50b1N0cmluZygnYmFzZTY0Jyl9YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXVkaXRMb2coZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdWRpdExvZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1ZGl0bG9ncyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdXRvbW9kUnVsZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF2YWlsYWJsZVZvaWNlUmVnaW9ucygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VSZWdpb25bXT4ocmVzdC5yb3V0ZXMucmVnaW9ucygpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW4oZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEJhbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEJhbnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRCYW5bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFucyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbChpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbEludml0ZXMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDaGFubmVsW10+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbFdlYmhvb2tzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLndlYmhvb2tzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldERtQ2hhbm5lbCh1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtKCksIHtcbiAgICAgICAgYm9keTogeyByZWNpcGllbnRJZDogdXNlcklkIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHcm91cERtQ2hhbm5lbChib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgZW1vamlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uRW1vamkoZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaShyZXN0LmFwcGxpY2F0aW9uSWQsIGVtb2ppSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkVtb2ppcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDx7IGl0ZW1zOiBEaXNjb3JkRW1vamlbXSB9PihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppcyhyZXN0LmFwcGxpY2F0aW9uSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2F0ZXdheUJvdCgpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR2V0R2F0ZXdheUJvdD4ocmVzdC5yb3V0ZXMuZ2F0ZXdheUJvdCgpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkKGd1aWxkSWQsIG9wdGlvbnMgPSB7IGNvdW50czogdHJ1ZSB9KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCwgb3B0aW9ucy5jb3VudHMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZHModG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG1ha2VSZXF1ZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zIHwgdW5kZWZpbmVkID0gdG9rZW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxQYXJ0aWFsPERpc2NvcmRHdWlsZD5bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnVzZXJHdWlsZHMob3B0aW9ucyksIG1ha2VSZXF1ZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRQcmV2aWV3KGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRQcmV2aWV3PihyZXN0LnJvdXRlcy5ndWlsZHMucHJldmlldyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZSh0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuY29kZSh0ZW1wbGF0ZUNvZGUpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlW10+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFdlYmhvb2tzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9va1tdPihyZXN0LnJvdXRlcy5ndWlsZHMud2ViaG9va3MoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludGVncmF0aW9ucyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludGVncmF0aW9uW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnRlZ3JhdGlvbnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhPihyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lc3NhZ2VzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VzKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXJQYWNrKHN0aWNrZXJQYWNrSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2s+KHJlc3Qucm91dGVzLnN0aWNrZXJQYWNrKHN0aWNrZXJQYWNrSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGlja2VyUGFja3MoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJQYWNrW10+KHJlc3Qucm91dGVzLnN0aWNrZXJQYWNrcygpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UGlubmVkTWVzc2FnZXMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2VbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucGlucyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnByaXZhdGUoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5qb2luZWQoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJ1bmVDb3VudChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFBydW5lZENvdW50PihyZXN0LnJvdXRlcy5ndWlsZHMucHJ1bmUoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5wdWJsaWMoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Um9sZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRSb2xlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGUoZ3VpbGRJZCwgcm9sZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2NoZWR1bGVkRXZlbnRbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudHMoZ3VpbGRJZCwgb3B0aW9ucz8ud2l0aFVzZXJDb3VudCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50VXNlcnMoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PEFycmF5PHsgdXNlcjogRGlzY29yZFVzZXI7IG1lbWJlcj86IERpc2NvcmRNZW1iZXIgfT4+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMudXNlcnMoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNlc3Npb25JbmZvKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R2F0ZXdheUJvdCgpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE93blZvaWNlU3RhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVN0YXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVN0YXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlcihzdGlja2VySWQ6IEJpZ1N0cmluZykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5zdGlja2VyKHN0aWNrZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VycyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXJzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZW1iZXJzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJlYWN0aW9ucyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLnVzZXIoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDdXJyZW50VXNlcih0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy5jdXJyZW50VXNlcigpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckNvbm5lY3Rpb25zKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENvbm5lY3Rpb25bXT4ocmVzdC5yb3V0ZXMub2F1dGgyLmNvbm5lY3Rpb25zKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbih0b2tlbiwgYXBwbGljYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIucm9sZUNvbm5lY3Rpb25zKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VmFuaXR5VXJsKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVmFuaXR5VXJsPihyZXN0LnJvdXRlcy5ndWlsZHMudmFuaXR5KGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWb2ljZVJlZ2lvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVJlZ2lvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMucmVnaW9ucyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2ViaG9vayh3ZWJob29rSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3MuaWQod2ViaG9va0lkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSwge1xuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwge1xuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWxjb21lU2NyZWVuKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2VsY29tZVNjcmVlbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlbGNvbWUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdpZGdldChndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkV2lkZ2V0PihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0SnNvbihndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0U2V0dGluZ3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzPihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0KGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBqb2luVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZUd1aWxkKGd1aWxkSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5sZWF2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHB1Ymxpc2hNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5jcm9zc3Bvc3QoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVSb2xlKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZURtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5kbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayhyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMsIHBhcmFtcykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx2b2lkIHwgRGlzY29yZEludGVyYWN0aW9uQ2FsbGJhY2tSZXNwb25zZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5jYWxsYmFjayhpbnRlcmFjdGlvbklkLCB0b2tlbiwgcGFyYW1zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5kYXRhPy5maWxlcyxcbiAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBmYWxzZSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZE1lc3NhZ2UoY2hhbm5lbElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQpLCB7IGJvZHksIGZpbGVzOiBib2R5LmZpbGVzIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZShjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hbGwoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UG9sbEFuc3dlclZvdGVycyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYW5zd2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR2V0QW5zd2VyVm90ZXNSZXNwb25zZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucG9sbHMudm90ZXMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGFuc3dlcklkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5kUG9sbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucG9sbHMuZXhwaXJlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc3luY0d1aWxkVGVtcGxhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQ8dm9pZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGJ1bGtCYW5NZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQnVsa0Jhbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYnVsa0JhbihndWlsZElkKSwgeyBib2R5OiBvcHRpb25zLCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdE1lbWJlcihndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZW1iZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJvdChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE1lbWJlcihndWlsZElkLCB1c2VySWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRNZW1iZXIoZ3VpbGRJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmN1cnJlbnRNZW1iZXIoZ3VpbGRJZCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVycyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlKGFwcGxpY2F0aW9uSWQsIGluc3RhbmNlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQWN0aXZpdHlJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlKGFwcGxpY2F0aW9uSWQsIGluc3RhbmNlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBraWNrTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwaW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHBydW5lTWVtYmVycyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8eyBwcnVuZWQ6IG51bWJlciB8IG51bGwgfT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMucHJ1bmUoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlYXJjaE1lbWJlcnMoZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuc2VhcmNoKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRPbmJvYXJkaW5nKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRPbmJvYXJkaW5nPihyZXN0LnJvdXRlcy5ndWlsZHMub25ib2FyZGluZyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkT25ib2FyZGluZyhndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkR3VpbGRPbmJvYXJkaW5nPihyZXN0LnJvdXRlcy5ndWlsZHMub25ib2FyZGluZyhndWlsZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyB1bmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHVucGluTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5waW4oY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyB0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnR5cGluZyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyB1cHNlcnRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyB1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgYm9keSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uKHRva2VuLCBhcHBsaWNhdGlvbklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5yb2xlQ29ubmVjdGlvbnMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRHdWlsZE1lbWJlcihndWlsZElkLCB1c2VySWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlVGVzdEVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVudGl0bGVtZW50PihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnRzKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0RW50aXRsZW1lbnRzKGFwcGxpY2F0aW9uSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW50aXRsZW1lbnRbXT4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlVGVzdEVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY29uc3VtZUVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uY29uc3VtZUVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0U2t1cyhhcHBsaWNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNrdVtdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc2t1cyhhcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgcHJlZmVyU25ha2VDYXNlKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGNhbWVsaXplciA9IGVuYWJsZWQgPyAoeDogYW55KSA9PiB4IDogY2FtZWxpemVcblxuICAgICAgcmVzdC5nZXQgPSBhc3luYyAodXJsLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5wb3N0ID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LmRlbGV0ZSA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QucGF0Y2ggPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LnB1dCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdFxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gcmVzdFxufVxuXG5lbnVtIEh0dHBSZXNwb25zZUNvZGUge1xuICAvKiogTWluaW11bSB2YWx1ZSBvZiBhIGNvZGUgaW4gb2RlciB0byBjb25zaWRlciB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsLiAqL1xuICBTdWNjZXNzID0gMjAwLFxuICAvKiogUmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgRGlzY29yZCByZXR1cm5lZCBhbiBlbXB0eSBib2R5LiAqL1xuICBOb0NvbnRlbnQgPSAyMDQsXG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvcmRlciB0byBjb25zaWRlciB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nLiAqL1xuICBFcnJvciA9IDQwMCxcbiAgLyoqIFRoaXMgcmVxdWVzdCBnb3QgcmF0ZSBsaW1pdGVkLiAqL1xuICBUb29NYW55UmVxdWVzdHMgPSA0MjksXG59XG4iXSwibmFtZXMiOlsiQVVESVRfTE9HX1JFQVNPTl9IRUFERVIiLCJESVNDT1JEX0FQSV9VUkwiLCJESVNDT1JEX0FQSV9WRVJTSU9OIiwiUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSIiwiUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSIiwiUkFURV9MSU1JVF9MSU1JVF9IRUFERVIiLCJSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIiLCJSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUiIsIlJBVEVfTElNSVRfU0NPUEVfSEVBREVSIiwiY3JlYXRlUmVzdE1hbmFnZXIiLCJ2ZXJzaW9uIiwib3B0aW9ucyIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJnZXRCb3RJZEZyb21Ub2tlbiIsInRva2VuIiwiYmFzZVVybCIsInByb3h5IiwicmVzdCIsImF1dGhvcml6YXRpb24iLCJhdXRob3JpemF0aW9uSGVhZGVyIiwiZGVsZXRlUXVldWVEZWxheSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJpbnZhbGlkQnVja2V0IiwiY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQiLCJsb2dnZXIiLCJpc1Byb3hpZWQiLCJzdGFydHNXaXRoIiwidXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCIsIm1heFJldHJ5Q291bnQiLCJJbmZpbml0eSIsInByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzIiwicXVldWVzIiwiTWFwIiwicmF0ZUxpbWl0ZWRQYXRocyIsInJvdXRlcyIsImNyZWF0ZVJvdXRlcyIsImNyZWF0ZUJhc2VIZWFkZXJzIiwiY2hlY2tSYXRlTGltaXRzIiwidXJsIiwiaWRlbnRpZmllciIsInJhdGVsaW1pdGVkIiwiZ2V0IiwiZ2xvYmFsIiwibm93IiwiRGF0ZSIsInJlc2V0VGltZXN0YW1wIiwidXBkYXRlVG9rZW5RdWV1ZXMiLCJvbGRUb2tlbiIsIm5ld1Rva2VuIiwiRXJyb3IiLCJoZWFkZXJzIiwidW5kZWZpbmVkIiwiZmV0Y2giLCJtZXRob2QiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIm5ld0lkZW50aWZpZXIiLCJrZXkiLCJxdWV1ZSIsImVudHJpZXMiLCJkZWxldGUiLCJuZXdLZXkiLCJuZXdRdWV1ZSIsIndhaXRpbmciLCJ1bnNoaWZ0IiwicGVuZGluZyIsImNsZWFudXAiLCJzZXQiLCJyYXRlbGltaXRQYXRoIiwiYnVja2V0SWQiLCJjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQiLCJvYmoiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJpdGVtIiwibmV3T2JqIiwiT2JqZWN0Iiwia2V5cyIsInZhbHVlIiwiaW5jbHVkZXMiLCJjYWxjdWxhdGVCaXRzIiwiZGVmYXVsdF9tZW1iZXJfcGVybWlzc2lvbnMiLCJuYW1lX2xvY2FsaXphdGlvbnMiLCJkZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zIiwiY2FtZWxUb1NuYWtlQ2FzZSIsInRvU3RyaW5nIiwiY3JlYXRlUmVxdWVzdEJvZHkiLCJ1bmF1dGhvcml6ZWQiLCJyZWFzb24iLCJlbmNvZGVVUklDb21wb25lbnQiLCJmaWxlcyIsImZvcm0iLCJGb3JtRGF0YSIsImkiLCJsZW5ndGgiLCJhcHBlbmQiLCJibG9iIiwibmFtZSIsImZvcm1Cb2R5IiwiZGlzY29yZEJvZHkiLCJwcm9wIiwicHVzaCIsImpvaW4iLCJhc3NpZ24iLCJwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocyIsInNpemUiLCJzZXRUaW1lb3V0IiwicHJvY2Vzc0hlYWRlcnMiLCJyYXRlTGltaXRlZCIsInJlbWFpbmluZyIsInJldHJ5QWZ0ZXIiLCJyZXNldCIsIk51bWJlciIsImxpbWl0IiwiaGFuZGxlQ29tcGxldGVkUmVxdWVzdCIsImludGVydmFsIiwibWF4IiwiZ2xvYmFsUmVzZXQiLCJzZW5kUmVxdWVzdCIsInJvdXRlIiwicGF5bG9hZCIsInJlcXVlc3RCb2R5T3B0aW9ucyIsImxvZ2dpbmdIZWFkZXJzIiwiYXV0aG9yaXphdGlvblNjaGVtZSIsInNwbGl0IiwiZGVidWciLCJyZXNwb25zZSIsImNhdGNoIiwiZXJyb3IiLCJyZWplY3QiLCJvayIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJzaW1wbGlmeVVybCIsInRleHQiLCJyZXRyeUNvdW50IiwicmVzZXRBZnRlciIsImRlbGF5IiwiYXJyYXlCdWZmZXIiLCJyZXRyeVJlcXVlc3QiLCJyZXNvbHZlIiwicGFydHMiLCJzZWNvbmRMYXN0UGFydCIsInNwbGljZSIsInByb2Nlc3NSZXF1ZXN0IiwicmVxdWVzdCIsInJ1blRocm91Z2hRdWV1ZSIsInF1ZXVlSWRlbnRpZmllciIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJRdWV1ZSIsInJlc3VsdCIsImVyciIsImpzb24iLCJtZXNzYWdlIiwiUHJvbWlzZSIsImRhdGEiLCJwYXJzZSIsImNhdXNlIiwiY2FtZWxpemUiLCJwb3N0IiwicGF0Y2giLCJwdXQiLCJhZGRSZWFjdGlvbiIsImNoYW5uZWxJZCIsIm1lc3NhZ2VJZCIsInJlYWN0aW9uIiwicHJvY2Vzc1JlYWN0aW9uU3RyaW5nIiwiY2hhbm5lbHMiLCJyZWFjdGlvbnMiLCJib3QiLCJhZGRSZWFjdGlvbnMiLCJvcmRlcmVkIiwiYWxsIiwiYWRkUm9sZSIsImd1aWxkSWQiLCJ1c2VySWQiLCJyb2xlSWQiLCJndWlsZHMiLCJyb2xlcyIsIm1lbWJlciIsImFkZFRocmVhZE1lbWJlciIsInRocmVhZHMiLCJ1c2VyIiwiYWRkRG1SZWNpcGllbnQiLCJkbVJlY2lwaWVudCIsImNyZWF0ZUF1dG9tb2RSdWxlIiwiYXV0b21vZCIsInJ1bGVzIiwiY3JlYXRlQ2hhbm5lbCIsImNyZWF0ZUVtb2ppIiwiZW1vamlzIiwiY3JlYXRlQXBwbGljYXRpb25FbW9qaSIsImFwcGxpY2F0aW9uRW1vamlzIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwicmVzdE9wdGlvbnMiLCJiZWFyZXJUb2tlbiIsImludGVyYWN0aW9ucyIsImNvbW1hbmRzIiwiY3JlYXRlR3VpbGQiLCJjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImNyZWF0ZUd1aWxkRnJvbVRlbXBsYXRlIiwidGVtcGxhdGVDb2RlIiwiaWNvbiIsInVybFRvQmFzZTY0IiwidGVtcGxhdGVzIiwiY29kZSIsImNyZWF0ZUd1aWxkU3RpY2tlciIsImZpbGUiLCJkZXNjcmlwdGlvbiIsInRhZ3MiLCJzdGlja2VycyIsImNyZWF0ZUd1aWxkVGVtcGxhdGUiLCJjcmVhdGVGb3J1bVRocmVhZCIsImZvcnVtIiwiY3JlYXRlSW52aXRlIiwiaW52aXRlcyIsImNyZWF0ZVJvbGUiLCJjcmVhdGVTY2hlZHVsZWRFdmVudCIsImV2ZW50cyIsImNyZWF0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZXMiLCJjcmVhdGVXZWJob29rIiwid2ViaG9va3MiLCJhdmF0YXIiLCJkZWxldGVBdXRvbW9kUnVsZSIsInJ1bGVJZCIsInJ1bGUiLCJkZWxldGVDaGFubmVsIiwiY2hhbm5lbCIsImRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUiLCJvdmVyd3JpdGVJZCIsIm92ZXJ3cml0ZSIsImRlbGV0ZUVtb2ppIiwiaWQiLCJlbW9qaSIsImRlbGV0ZUFwcGxpY2F0aW9uRW1vamkiLCJhcHBsaWNhdGlvbkVtb2ppIiwiZGVsZXRlRm9sbG93dXBNZXNzYWdlIiwicmVzcG9uc2VzIiwiZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY29tbWFuZElkIiwiY29tbWFuZCIsImRlbGV0ZUd1aWxkIiwiZ3VpbGQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsIm9uZSIsImRlbGV0ZUd1aWxkU3RpY2tlciIsInN0aWNrZXJJZCIsInN0aWNrZXIiLCJkZWxldGVHdWlsZFRlbXBsYXRlIiwiZGVsZXRlSW50ZWdyYXRpb24iLCJpbnRlZ3JhdGlvbklkIiwiaW50ZWdyYXRpb24iLCJkZWxldGVJbnZpdGUiLCJpbnZpdGVDb2RlIiwiaW52aXRlIiwiZGVsZXRlTWVzc2FnZSIsImRlbGV0ZU1lc3NhZ2VzIiwibWVzc2FnZUlkcyIsImJ1bGsiLCJtZXNzYWdlcyIsInNsaWNlIiwiZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwib3JpZ2luYWwiLCJkZWxldGVPd25SZWFjdGlvbiIsImRlbGV0ZVJlYWN0aW9uc0FsbCIsImRlbGV0ZVJlYWN0aW9uc0Vtb2ppIiwiZGVsZXRlUm9sZSIsImRlbGV0ZVNjaGVkdWxlZEV2ZW50IiwiZXZlbnRJZCIsImV2ZW50IiwiZGVsZXRlU3RhZ2VJbnN0YW5jZSIsInN0YWdlIiwiZGVsZXRlVXNlclJlYWN0aW9uIiwiZGVsZXRlV2ViaG9vayIsIndlYmhvb2tJZCIsImRlbGV0ZVdlYmhvb2tNZXNzYWdlIiwiZGVsZXRlV2ViaG9va1dpdGhUb2tlbiIsIndlYmhvb2siLCJlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm1pc3Npb24iLCJlZGl0QXV0b21vZFJ1bGUiLCJlZGl0Qm90UHJvZmlsZSIsImJvdEF2YXRhclVSTCIsImJhbm5lciIsImJvdEJhbm5lclVSTCIsImN1cnJlbnRVc2VyIiwidXNlcm5hbWUiLCJ0cmltIiwiZWRpdENoYW5uZWwiLCJlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMiLCJlZGl0Q2hhbm5lbFBvc2l0aW9ucyIsImVkaXRFbW9qaSIsImVkaXRBcHBsaWNhdGlvbkVtb2ppIiwiZWRpdEZvbGxvd3VwTWVzc2FnZSIsImVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGQiLCJlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGRNZmFMZXZlbCIsIm1mYUxldmVsIiwibWZhIiwibGV2ZWwiLCJlZGl0R3VpbGRTdGlja2VyIiwiZWRpdEd1aWxkVGVtcGxhdGUiLCJlZGl0TWVzc2FnZSIsImVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSIsInR5cGUiLCJJbnRlcmFjdGlvblJlc3BvbnNlVHlwZXMiLCJVcGRhdGVNZXNzYWdlIiwiZWRpdE93blZvaWNlU3RhdGUiLCJ2b2ljZSIsInJlcXVlc3RUb1NwZWFrVGltZXN0YW1wIiwidG9JU09TdHJpbmciLCJlZGl0U2NoZWR1bGVkRXZlbnQiLCJlZGl0Um9sZSIsImVkaXRSb2xlUG9zaXRpb25zIiwiZWRpdFN0YWdlSW5zdGFuY2UiLCJ0b3BpYyIsImVkaXRVc2VyVm9pY2VTdGF0ZSIsImVkaXRXZWJob29rIiwiZWRpdFdlYmhvb2tNZXNzYWdlIiwiZWRpdFdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2VsY29tZVNjcmVlbiIsIndlbGNvbWUiLCJlZGl0V2lkZ2V0U2V0dGluZ3MiLCJ3aWRnZXQiLCJleGVjdXRlV2ViaG9vayIsImZvbGxvd0Fubm91bmNlbWVudCIsInNvdXJjZUNoYW5uZWxJZCIsInRhcmdldENoYW5uZWxJZCIsImZvbGxvdyIsIndlYmhvb2tDaGFubmVsSWQiLCJnZXRBY3RpdmVUaHJlYWRzIiwiYWN0aXZlIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbiIsImFjY2Vzc1Rva2VuIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJnZXRBcHBsaWNhdGlvbkluZm8iLCJvYXV0aDIiLCJhcHBsaWNhdGlvbiIsImVkaXRBcHBsaWNhdGlvbkluZm8iLCJnZXRDdXJyZW50QXV0aGVudGljYXRpb25JbmZvIiwiY3VycmVudEF1dGhvcml6YXRpb24iLCJleGNoYW5nZVRva2VuIiwiY2xpZW50SWQiLCJjbGllbnRTZWNyZXQiLCJiYXNpY0NyZWRlbnRpYWxzIiwiQnVmZmVyIiwiZnJvbSIsImdyYW50VHlwZSIsInNjb3BlIiwidG9rZW5FeGNoYW5nZSIsInJldm9rZVRva2VuIiwidG9rZW5SZXZva2UiLCJnZXRBdWRpdExvZyIsImF1ZGl0bG9ncyIsImdldEF1dG9tb2RSdWxlIiwiZ2V0QXV0b21vZFJ1bGVzIiwiZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zIiwicmVnaW9ucyIsImdldEJhbiIsIm1lbWJlcnMiLCJiYW4iLCJnZXRCYW5zIiwiYmFucyIsImdldENoYW5uZWwiLCJnZXRDaGFubmVsSW52aXRlcyIsImdldENoYW5uZWxzIiwiZ2V0Q2hhbm5lbFdlYmhvb2tzIiwiZ2V0RG1DaGFubmVsIiwiZG0iLCJyZWNpcGllbnRJZCIsImdldEdyb3VwRG1DaGFubmVsIiwiZ2V0RW1vamkiLCJlbW9qaUlkIiwiZ2V0QXBwbGljYXRpb25FbW9qaSIsImdldEVtb2ppcyIsImdldEFwcGxpY2F0aW9uRW1vamlzIiwiZ2V0Rm9sbG93dXBNZXNzYWdlIiwiZ2V0R2F0ZXdheUJvdCIsImdhdGV3YXlCb3QiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGQiLCJjb3VudHMiLCJnZXRHdWlsZHMiLCJtYWtlUmVxdWVzdE9wdGlvbnMiLCJ1c2VyR3VpbGRzIiwiZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHdWlsZFByZXZpZXciLCJwcmV2aWV3IiwiZ2V0R3VpbGRUZW1wbGF0ZSIsImdldEd1aWxkVGVtcGxhdGVzIiwiZ2V0R3VpbGRXZWJob29rcyIsImdldEludGVncmF0aW9ucyIsImludGVncmF0aW9ucyIsImdldEludml0ZSIsImdldEludml0ZXMiLCJnZXRNZXNzYWdlIiwiZ2V0TWVzc2FnZXMiLCJnZXRTdGlja2VyUGFjayIsInN0aWNrZXJQYWNrSWQiLCJzdGlja2VyUGFjayIsImdldFN0aWNrZXJQYWNrcyIsInN0aWNrZXJQYWNrcyIsImdldE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsImdldFBpbm5lZE1lc3NhZ2VzIiwicGlucyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJwcml2YXRlIiwiZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkcyIsImpvaW5lZCIsImdldFBydW5lQ291bnQiLCJwcnVuZSIsImdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyIsInB1YmxpYyIsImdldFJvbGVzIiwiZ2V0Um9sZSIsImdldFNjaGVkdWxlZEV2ZW50Iiwid2l0aFVzZXJDb3VudCIsImdldFNjaGVkdWxlZEV2ZW50cyIsImdldFNjaGVkdWxlZEV2ZW50VXNlcnMiLCJ1c2VycyIsImdldFNlc3Npb25JbmZvIiwiZ2V0U3RhZ2VJbnN0YW5jZSIsImdldE93blZvaWNlU3RhdGUiLCJnZXRVc2VyVm9pY2VTdGF0ZSIsImdldFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXJzIiwiZ2V0VGhyZWFkTWVtYmVyIiwiZ2V0VGhyZWFkTWVtYmVycyIsImdldFJlYWN0aW9ucyIsImdldFVzZXIiLCJnZXRDdXJyZW50VXNlciIsImdldFVzZXJDb25uZWN0aW9ucyIsImNvbm5lY3Rpb25zIiwiZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24iLCJyb2xlQ29ubmVjdGlvbnMiLCJnZXRWYW5pdHlVcmwiLCJ2YW5pdHkiLCJnZXRWb2ljZVJlZ2lvbnMiLCJnZXRXZWJob29rIiwiZ2V0V2ViaG9va01lc3NhZ2UiLCJnZXRXZWJob29rV2l0aFRva2VuIiwiZ2V0V2VsY29tZVNjcmVlbiIsImdldFdpZGdldCIsIndpZGdldEpzb24iLCJnZXRXaWRnZXRTZXR0aW5ncyIsImpvaW5UaHJlYWQiLCJtZSIsImxlYXZlR3VpbGQiLCJsZWF2ZSIsImxlYXZlVGhyZWFkIiwicHVibGlzaE1lc3NhZ2UiLCJjcm9zc3Bvc3QiLCJyZW1vdmVSb2xlIiwicmVtb3ZlVGhyZWFkTWVtYmVyIiwicmVtb3ZlRG1SZWNpcGllbnQiLCJzZW5kRm9sbG93dXBNZXNzYWdlIiwic2VuZEludGVyYWN0aW9uUmVzcG9uc2UiLCJpbnRlcmFjdGlvbklkIiwicGFyYW1zIiwiY2FsbGJhY2siLCJzZW5kTWVzc2FnZSIsInN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlIiwiZ2V0UG9sbEFuc3dlclZvdGVycyIsImFuc3dlcklkIiwicG9sbHMiLCJ2b3RlcyIsImVuZFBvbGwiLCJleHBpcmUiLCJzeW5jR3VpbGRUZW1wbGF0ZSIsImJhbk1lbWJlciIsImJ1bGtCYW5NZW1iZXJzIiwiYnVsa0JhbiIsImVkaXRCb3RNZW1iZXIiLCJlZGl0TWVtYmVyIiwiZ2V0TWVtYmVyIiwiZ2V0Q3VycmVudE1lbWJlciIsImN1cnJlbnRNZW1iZXIiLCJnZXRNZW1iZXJzIiwiZ2V0QXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlIiwiaW5zdGFuY2VJZCIsImFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZSIsImtpY2tNZW1iZXIiLCJwaW5NZXNzYWdlIiwicGluIiwicHJ1bmVNZW1iZXJzIiwic2VhcmNoTWVtYmVycyIsInF1ZXJ5Iiwic2VhcmNoIiwiZ2V0R3VpbGRPbmJvYXJkaW5nIiwib25ib2FyZGluZyIsImVkaXRHdWlsZE9uYm9hcmRpbmciLCJ1bmJhbk1lbWJlciIsInVucGluTWVzc2FnZSIsInRyaWdnZXJUeXBpbmdJbmRpY2F0b3IiLCJ0eXBpbmciLCJ1cHNlcnRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwidXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZWRpdFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uIiwiYWRkR3VpbGRNZW1iZXIiLCJjcmVhdGVUZXN0RW50aXRsZW1lbnQiLCJtb25ldGl6YXRpb24iLCJlbnRpdGxlbWVudHMiLCJsaXN0RW50aXRsZW1lbnRzIiwiZGVsZXRlVGVzdEVudGl0bGVtZW50IiwiZW50aXRsZW1lbnRJZCIsImVudGl0bGVtZW50IiwiY29uc3VtZUVudGl0bGVtZW50IiwibGlzdFNrdXMiLCJza3VzIiwicHJlZmVyU25ha2VDYXNlIiwiZW5hYmxlZCIsImNhbWVsaXplciIsIngiLCJIdHRwUmVzcG9uc2VDb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQW1FYUEsdUJBQXVCO2VBQXZCQTs7SUFGQUMsZUFBZTtlQUFmQTs7SUFEQUMsbUJBQW1CO2VBQW5CQTs7SUFPQUMsd0JBQXdCO2VBQXhCQTs7SUFEQUMsd0JBQXdCO2VBQXhCQTs7SUFFQUMsdUJBQXVCO2VBQXZCQTs7SUFKQUMsMkJBQTJCO2VBQTNCQTs7SUFDQUMsNkJBQTZCO2VBQTdCQTs7SUFJQUMsdUJBQXVCO2VBQXZCQTs7SUFFR0MsaUJBQWlCO2VBQWpCQTs7OzRCQTNFTzt1QkFzRGhCO3VCQUN5SDsrQkFDckY7dUJBQ3JCO3dCQUNPO0FBRzdCLGdEQUFnRDtBQUNoRCxNQUFNQyxVQUFVO0FBRVQsTUFBTVIsc0JBQXNCO0FBQzVCLE1BQU1ELGtCQUFrQjtBQUV4QixNQUFNRCwwQkFBMEI7QUFDaEMsTUFBTU0sOEJBQThCO0FBQ3BDLE1BQU1DLGdDQUFnQztBQUN0QyxNQUFNSCwyQkFBMkI7QUFDakMsTUFBTUQsMkJBQTJCO0FBQ2pDLE1BQU1FLDBCQUEwQjtBQUNoQyxNQUFNRywwQkFBMEI7QUFFaEMsU0FBU0Msa0JBQWtCRSxPQUFpQztJQUNqRSxNQUFNQyxnQkFBZ0JELFFBQVFDLGFBQWEsR0FBR0MsT0FBT0YsUUFBUUMsYUFBYSxJQUFJRSxJQUFBQSx3QkFBaUIsRUFBQ0gsUUFB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