@discordeno/rest 19.0.0-next.85ea2d9 → 19.0.0-next.87f62d2

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