@dollhousemcp/mcp-server 2.0.12-rc.9 → 2.0.13

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 (69) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +4 -4
  3. package/README.md.backup +5 -5
  4. package/README.npm.md +4 -4
  5. package/dist/di/Container.d.ts +14 -0
  6. package/dist/di/Container.d.ts.map +1 -1
  7. package/dist/di/Container.js +43 -26
  8. package/dist/elements/agents/AgentManager.d.ts +11 -4
  9. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  10. package/dist/elements/agents/AgentManager.js +38 -11
  11. package/dist/elements/base/BaseElementManager.d.ts +10 -0
  12. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  13. package/dist/elements/base/BaseElementManager.js +26 -1
  14. package/dist/elements/ensembles/EnsembleManager.d.ts +1 -0
  15. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
  16. package/dist/elements/ensembles/EnsembleManager.js +13 -2
  17. package/dist/elements/templates/Template.d.ts +33 -1
  18. package/dist/elements/templates/Template.d.ts.map +1 -1
  19. package/dist/elements/templates/Template.js +74 -15
  20. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  21. package/dist/elements/templates/TemplateManager.js +8 -1
  22. package/dist/generated/version.d.ts +2 -2
  23. package/dist/generated/version.d.ts.map +1 -1
  24. package/dist/generated/version.js +3 -3
  25. package/dist/handlers/element-crud/createElement.js +2 -2
  26. package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
  27. package/dist/handlers/mcp-aql/SchemaDispatcher.js +8 -1
  28. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts +3 -0
  29. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
  30. package/dist/handlers/strategies/EnsembleActivationStrategy.js +48 -9
  31. package/dist/index.js +19 -13
  32. package/dist/portfolio/DefaultElementProvider.d.ts +8 -0
  33. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  34. package/dist/portfolio/DefaultElementProvider.js +43 -1
  35. package/dist/security/contentValidator.d.ts +15 -0
  36. package/dist/security/contentValidator.d.ts.map +1 -1
  37. package/dist/security/contentValidator.js +40 -2
  38. package/dist/utils/TemplateRenderer.d.ts +9 -0
  39. package/dist/utils/TemplateRenderer.d.ts.map +1 -1
  40. package/dist/utils/TemplateRenderer.js +21 -1
  41. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  42. package/dist/web/console/IngestRoutes.js +193 -59
  43. package/dist/web/console/SessionNames.d.ts +18 -5
  44. package/dist/web/console/SessionNames.d.ts.map +1 -1
  45. package/dist/web/console/SessionNames.js +63 -8
  46. package/dist/web/console/StaleProcessRecovery.d.ts.map +1 -1
  47. package/dist/web/console/StaleProcessRecovery.js +5 -4
  48. package/dist/web/console/UnifiedConsole.js +3 -3
  49. package/dist/web/console/consoleToken.js +3 -3
  50. package/dist/web/portDiscovery.d.ts +1 -1
  51. package/dist/web/portDiscovery.d.ts.map +1 -1
  52. package/dist/web/portDiscovery.js +2 -2
  53. package/dist/web/public/app.js +65 -11
  54. package/dist/web/public/index.html +2 -0
  55. package/dist/web/public/logs.js +24 -2
  56. package/dist/web/public/metrics.js +22 -4
  57. package/dist/web/public/sessions.js +55 -8
  58. package/dist/web/public/setup.js +11 -2
  59. package/dist/web/public/styles.css +12 -0
  60. package/dist/web/routes/permissionRoutes.js +2 -2
  61. package/dist/web/routes/setupRoutes.d.ts +67 -1
  62. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  63. package/dist/web/routes/setupRoutes.js +298 -6
  64. package/dist/web/routes.d.ts.map +1 -1
  65. package/dist/web/routes.js +4 -2
  66. package/dist/web/server.d.ts.map +1 -1
  67. package/dist/web/server.js +14 -5
  68. package/package.json +5 -3
  69. package/server.json +2 -2
@@ -29,6 +29,10 @@ const RATE_LIMIT_WINDOW_MS = 60_000;
29
29
  const REAPER_INTERVAL_MS = 5_000;
30
30
  /** How long since last heartbeat before a session is considered dead (ms) */
31
31
  const SESSION_STALE_MS = 15_000;
32
+ /** Timeout for legacy port federation/proxy requests (ms) */
33
+ const LEGACY_FETCH_TIMEOUT_MS = 2_000;
34
+ /** How long before ended sessions are purged from the Map (ms) */
35
+ const ENDED_PURGE_MS = 5 * 60_000; // 5 minutes
32
36
  /** Normalize a string via UnicodeValidator (DMCP-SEC-004) */
33
37
  function normalizeInput(s) {
34
38
  return UnicodeValidator.normalize(s).normalizedContent;
@@ -44,6 +48,90 @@ export function createIngestRoutes(broadcasts) {
44
48
  const sessions = new Map();
45
49
  const namePool = new SessionNamePool();
46
50
  const rateLimiter = new SlidingWindowRateLimiter(RATE_LIMIT_MAX, RATE_LIMIT_WINDOW_MS);
51
+ // Sessions the user explicitly killed — never come back (#1870).
52
+ // Cleared only on server restart, which is appropriate since that's a new context.
53
+ const killedSessions = new Set();
54
+ // Sessions waiting for a PID so we can SIGTERM them (#1870).
55
+ // When the user dismisses a pid=0 orphan, we add it here. The next heartbeat
56
+ // (every 10s) carries the PID — we SIGTERM immediately and move to killedSessions.
57
+ const pendingKills = new Set();
58
+ /** Execute a deferred kill if we now have a PID. */
59
+ function tryExecutePendingKill(sessionId, pid) {
60
+ const killPid = pid || sessions.get(sessionId)?.pid;
61
+ if (!killPid)
62
+ return;
63
+ try {
64
+ process.kill(killPid, 'SIGTERM');
65
+ }
66
+ catch { /* already dead */ }
67
+ const existing = sessions.get(sessionId);
68
+ if (existing)
69
+ existing.status = 'ended';
70
+ logger.info('[IngestRoutes] Deferred kill executed — PID arrived', {
71
+ displayName: existing?.displayName, sessionId, pid: killPid,
72
+ });
73
+ }
74
+ /** Promote a pending kill to permanent. */
75
+ function finalizePendingKill(sessionId, pid) {
76
+ tryExecutePendingKill(sessionId, pid);
77
+ pendingKills.delete(sessionId);
78
+ killedSessions.add(sessionId);
79
+ }
80
+ /** Create a new session entry for an orphan. Returns null on failure. */
81
+ function autoRegister(sessionId, pid, authenticated = false) {
82
+ try {
83
+ const displayName = namePool.assign(sessionId);
84
+ const color = namePool.getColor(sessionId) ?? '#3b82f6';
85
+ const now = new Date().toISOString();
86
+ const info = {
87
+ sessionId, displayName, color,
88
+ pid: pid || 0,
89
+ startedAt: now, lastHeartbeat: now,
90
+ status: 'active', isLeader: false, authenticated, kind: 'mcp',
91
+ };
92
+ sessions.set(sessionId, info);
93
+ logger.info('[IngestRoutes] Auto-registered orphaned session', {
94
+ displayName, sessionId, source: pid ? 'heartbeat' : 'ingestion',
95
+ });
96
+ broadcasts.sessionBroadcast?.(info);
97
+ return info;
98
+ }
99
+ catch (err) {
100
+ logger.debug('[IngestRoutes] Failed to auto-register orphaned session', {
101
+ sessionId, error: err.message,
102
+ });
103
+ return null;
104
+ }
105
+ }
106
+ /**
107
+ * Auto-register or update an orphaned session from ingestion data.
108
+ * Returns the session (existing or newly created), or null if killed/pending.
109
+ */
110
+ function ensureSession(sessionId, pid, authenticated = false) {
111
+ if (killedSessions.has(sessionId))
112
+ return null;
113
+ if (pendingKills.has(sessionId)) {
114
+ finalizePendingKill(sessionId, pid);
115
+ return null;
116
+ }
117
+ const existing = sessions.get(sessionId);
118
+ if (!existing)
119
+ return autoRegister(sessionId, pid, authenticated);
120
+ if (existing.status === 'ended') {
121
+ existing.status = 'active';
122
+ logger.info('[IngestRoutes] Revived ended session still sending data', {
123
+ displayName: existing.displayName, sessionId,
124
+ });
125
+ }
126
+ existing.lastHeartbeat = new Date().toISOString();
127
+ if (pid && !existing.pid) {
128
+ existing.pid = pid;
129
+ logger.info('[IngestRoutes] Recovered PID for orphaned session', {
130
+ displayName: existing.displayName, sessionId, pid,
131
+ });
132
+ }
133
+ return existing;
134
+ }
47
135
  // JSON body parsing with size limit
48
136
  router.use(express.json({ limit: MAX_PAYLOAD_SIZE }));
49
137
  /**
@@ -76,11 +164,8 @@ export function createIngestRoutes(broadcasts) {
76
164
  broadcasts.logBroadcast(stamped);
77
165
  count++;
78
166
  }
79
- // Update session heartbeat
80
- const session = sessions.get(payload.sessionId);
81
- if (session) {
82
- session.lastHeartbeat = new Date().toISOString();
83
- }
167
+ // Update heartbeat, revive ended sessions, or auto-register orphans (#1870)
168
+ const session = ensureSession(payload.sessionId);
84
169
  if (skipped > 0) {
85
170
  logger.debug(`[IngestRoutes] Log ingest from ${session?.displayName ?? payload.sessionId}: accepted=${count}, skipped=${skipped}`);
86
171
  }
@@ -105,7 +190,8 @@ export function createIngestRoutes(broadcasts) {
105
190
  if (broadcasts.metricsOnSnapshot) {
106
191
  broadcasts.metricsOnSnapshot(payload.snapshot);
107
192
  }
108
- const session = sessions.get(payload.sessionId);
193
+ // Update heartbeat, revive ended sessions, or auto-register orphans (#1870)
194
+ const session = ensureSession(payload.sessionId);
109
195
  logger.debug(`[IngestRoutes] Metrics ingested from ${session?.displayName ?? payload.sessionId}`);
110
196
  res.status(200).json({ accepted: true });
111
197
  });
@@ -124,29 +210,26 @@ export function createIngestRoutes(broadcasts) {
124
210
  const now = new Date().toISOString();
125
211
  switch (payload.event) {
126
212
  case 'started': {
213
+ // Killed sessions stay dead; pending kills get finalized (#1870)
214
+ if (killedSessions.has(payload.sessionId))
215
+ break;
216
+ if (pendingKills.has(payload.sessionId)) {
217
+ finalizePendingKill(payload.sessionId, payload.pid);
218
+ break;
219
+ }
127
220
  const displayName = namePool.assign(payload.sessionId);
128
221
  const color = namePool.getColor(payload.sessionId) ?? '#3b82f6';
129
- // Follower sessions that reach the ingest endpoint are authenticated
130
- // if the auth middleware passed them through (token was valid).
131
222
  const isAuthenticated = Boolean(res.locals?.tokenEntry);
132
- const info = {
133
- sessionId: payload.sessionId,
134
- displayName,
135
- color,
136
- pid: payload.pid,
137
- startedAt: payload.startedAt || now,
138
- lastHeartbeat: now,
139
- status: 'active',
140
- isLeader: false,
141
- authenticated: isAuthenticated,
142
- kind: 'mcp',
143
- };
144
- sessions.set(payload.sessionId, info);
223
+ sessions.set(payload.sessionId, {
224
+ sessionId: payload.sessionId, displayName, color,
225
+ pid: payload.pid, startedAt: payload.startedAt || now, lastHeartbeat: now,
226
+ status: 'active', isLeader: false, authenticated: isAuthenticated, kind: 'mcp',
227
+ });
145
228
  logger.info('[IngestRoutes] Session registered', {
146
229
  displayName, sessionId: payload.sessionId, pid: payload.pid, color,
147
230
  activeSessions: Array.from(sessions.values()).filter(s => s.status === 'active').length,
148
231
  });
149
- broadcasts.sessionBroadcast?.(info);
232
+ broadcasts.sessionBroadcast?.(sessions.get(payload.sessionId));
150
233
  break;
151
234
  }
152
235
  case 'stopped': {
@@ -164,10 +247,8 @@ export function createIngestRoutes(broadcasts) {
164
247
  break;
165
248
  }
166
249
  case 'heartbeat': {
167
- const existing = sessions.get(payload.sessionId);
168
- if (existing) {
169
- existing.lastHeartbeat = now;
170
- }
250
+ // Auto-register or update — heartbeat includes PID for recovery (#1870)
251
+ ensureSession(payload.sessionId, payload.pid);
171
252
  break;
172
253
  }
173
254
  }
@@ -177,7 +258,9 @@ export function createIngestRoutes(broadcasts) {
177
258
  * GET /api/sessions — List all tracked sessions.
178
259
  */
179
260
  router.get('/api/sessions', async (_req, res) => {
180
- const localSessions = Array.from(sessions.values());
261
+ // Server-side active filter — the frontend also filters, but ended sessions
262
+ // should never leave the API to prevent stale UI (#1870).
263
+ const localSessions = Array.from(sessions.values()).filter(s => s.status === 'active');
181
264
  const currentPort = env.DOLLHOUSE_WEB_CONSOLE_PORT ?? 41715;
182
265
  // Federate with the legacy port (3939) to show all sessions on the
183
266
  // machine, including unauthenticated ones from pre-auth installs.
@@ -185,7 +268,7 @@ export function createIngestRoutes(broadcasts) {
185
268
  if (currentPort !== 3939) {
186
269
  try {
187
270
  const controller = new AbortController();
188
- const timeout = setTimeout(() => controller.abort(), 2000);
271
+ const timeout = setTimeout(() => controller.abort(), LEGACY_FETCH_TIMEOUT_MS);
189
272
  const legacyRes = await fetch('http://127.0.0.1:3939/api/sessions', {
190
273
  signal: controller.signal,
191
274
  });
@@ -213,58 +296,109 @@ export function createIngestRoutes(broadcasts) {
213
296
  /**
214
297
  * POST /api/sessions/:sessionId/kill — Terminate a session's server process.
215
298
  */
216
- router.post('/api/sessions/:sessionId/kill', (req, res) => {
299
+ router.post('/api/sessions/:sessionId/kill', async (req, res) => {
217
300
  const sessionId = req.params['sessionId'];
218
301
  const session = sessions.get(sessionId);
219
302
  if (!session) {
303
+ // Session not in local Map — try proxying kill to legacy port (#1870)
304
+ const currentPort = env.DOLLHOUSE_WEB_CONSOLE_PORT ?? 41715;
305
+ if (currentPort !== 3939) {
306
+ try {
307
+ const controller = new AbortController();
308
+ const timeout = setTimeout(() => controller.abort(), LEGACY_FETCH_TIMEOUT_MS);
309
+ const proxyRes = await fetch(`http://127.0.0.1:3939/api/sessions/${encodeURIComponent(sessionId)}/kill`, {
310
+ method: 'POST',
311
+ signal: controller.signal,
312
+ });
313
+ clearTimeout(timeout);
314
+ if (proxyRes.ok) {
315
+ const data = await proxyRes.json();
316
+ res.json(data);
317
+ return;
318
+ }
319
+ }
320
+ catch {
321
+ // Legacy instance not running — fall through to 404
322
+ }
323
+ }
220
324
  logger.warn('[IngestRoutes] Kill requested for unknown session', { sessionId });
221
325
  res.status(404).json({ error: 'Session not found', sessionId });
222
326
  return;
223
327
  }
224
328
  if (!session.pid) {
225
- res.status(400).json({ error: 'No PID for session', sessionId, displayName: session.displayName });
329
+ // Auto-registered orphan with unknown PID queue for deferred kill (#1870).
330
+ // The next heartbeat (every ~10s) carries the PID. ensureSession() will
331
+ // SIGTERM the process as soon as the PID arrives. Session is gone for good.
332
+ session.status = 'ended';
333
+ namePool.release(sessionId);
334
+ pendingKills.add(sessionId);
335
+ logger.info('[IngestRoutes] Queued deferred kill — waiting for PID via heartbeat', {
336
+ displayName: session.displayName, sessionId,
337
+ });
338
+ res.json({ ok: true, dismissed: session.displayName, reason: 'pending-kill' });
226
339
  return;
227
340
  }
341
+ // SIGTERM the process. Even if it fails (ESRCH = already dead, EPERM = not ours),
342
+ // mark the session as permanently killed so it never reappears (#1870).
343
+ let killed = false;
228
344
  try {
229
345
  process.kill(session.pid, 'SIGTERM');
230
- session.status = 'ended';
231
- namePool.release(sessionId);
232
- logger.info('[IngestRoutes] Session killed', {
233
- displayName: session.displayName, sessionId, pid: session.pid,
234
- activeSessions: Array.from(sessions.values()).filter(s => s.status === 'active').length - 1,
235
- });
236
- res.json({ ok: true, killed: session.displayName, pid: session.pid });
346
+ killed = true;
237
347
  }
238
348
  catch (err) {
239
- const message = err.message;
240
- logger.error('[IngestRoutes] Failed to kill session', {
241
- displayName: session.displayName, sessionId, pid: session.pid, error: message,
242
- });
243
- res.status(500).json({ error: 'Failed to kill session', sessionId, displayName: session.displayName, pid: session.pid, detail: message });
349
+ const code = err.code;
350
+ if (code === 'ESRCH') {
351
+ killed = true; // process already dead — treat as successful kill
352
+ }
353
+ else {
354
+ logger.error('[IngestRoutes] Failed to kill session', {
355
+ displayName: session.displayName, sessionId, pid: session.pid, error: err.message,
356
+ });
357
+ res.status(500).json({ error: 'Failed to kill session', sessionId, displayName: session.displayName, pid: session.pid, detail: err.message });
358
+ return;
359
+ }
244
360
  }
361
+ session.status = 'ended';
362
+ namePool.release(sessionId);
363
+ killedSessions.add(sessionId);
364
+ logger.info('[IngestRoutes] Session killed', {
365
+ displayName: session.displayName, sessionId, pid: session.pid,
366
+ activeSessions: Array.from(sessions.values()).filter(s => s.status === 'active').length - 1,
367
+ });
368
+ res.json({ ok: true, killed: session.displayName, pid: session.pid });
245
369
  });
246
- // Reaper: periodically check for stale sessions whose heartbeat has expired
247
- const reaperInterval = setInterval(() => {
248
- const now = Date.now();
370
+ /** Mark stale active sessions as ended. */
371
+ function reapStaleSessions(now) {
249
372
  for (const [id, session] of sessions) {
250
373
  if (session.status !== 'active')
251
374
  continue;
252
- if (session.isLeader)
253
- continue; // leader manages itself
254
- if (session.kind === 'console')
255
- continue; // console session has no heartbeat (#1805)
375
+ if (session.isLeader || session.kind === 'console')
376
+ continue;
256
377
  const age = now - new Date(session.lastHeartbeat).getTime();
257
- if (age > SESSION_STALE_MS) {
258
- session.status = 'ended';
259
- namePool.release(id);
260
- logger.info('[IngestRoutes] Reaped stale session', {
261
- displayName: session.displayName, sessionId: id, pid: session.pid,
262
- lastHeartbeatAgo: `${Math.round(age / 1000)}s`,
263
- activeSessions: Array.from(sessions.values()).filter(s => s.status === 'active').length - 1,
264
- });
265
- broadcasts.sessionBroadcast?.(session);
378
+ if (age <= SESSION_STALE_MS)
379
+ continue;
380
+ session.status = 'ended';
381
+ namePool.release(id);
382
+ logger.info('[IngestRoutes] Reaped stale session', {
383
+ displayName: session.displayName, sessionId: id, pid: session.pid,
384
+ lastHeartbeatAgo: `${Math.round(age / 1000)}s`,
385
+ activeSessions: Array.from(sessions.values()).filter(s => s.status === 'active').length - 1,
386
+ });
387
+ broadcasts.sessionBroadcast?.(session);
388
+ }
389
+ }
390
+ /** Delete ended sessions to bound memory (#1870). */
391
+ function purgeStaleEntries(now) {
392
+ for (const [id, session] of sessions) {
393
+ if (session.status === 'ended' && now - new Date(session.lastHeartbeat).getTime() > ENDED_PURGE_MS) {
394
+ sessions.delete(id);
266
395
  }
267
396
  }
397
+ }
398
+ const reaperInterval = setInterval(() => {
399
+ const now = Date.now();
400
+ reapStaleSessions(now);
401
+ purgeStaleEntries(now);
268
402
  }, REAPER_INTERVAL_MS);
269
403
  reaperInterval.unref();
270
404
  function getSessions() {
@@ -313,4 +447,4 @@ export function createIngestRoutes(broadcasts) {
313
447
  }
314
448
  return { router, getSessions, registerLeaderSession, registerConsoleSession };
315
449
  }
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5nZXN0Um91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYi9jb25zb2xlL0luZ2VzdFJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUkxQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxQyxrREFBa0Q7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0IscURBQXFEO0FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztBQUM1QixNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUVwQyxpREFBaUQ7QUFDakQsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFFakMsNkVBQTZFO0FBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO0FBNkVoQyw2REFBNkQ7QUFDN0QsU0FBUyxjQUFjLENBQUMsQ0FBUztJQUMvQixPQUFPLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUN6RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsVUFBNEI7SUFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFB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LEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsc0JBQXNCO1FBQzdCLE1BQU0sU0FBUyxHQUFHLFdBQVcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztRQUNsQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRTtZQUN0QixTQUFTLEVBQUUsU0FBUztZQUNwQixXQUFXO1lBQ1gsS0FBSyxFQUFFLFNBQVMsRUFBRSw2Q0FBNkM7WUFDL0QsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2hCLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxhQUFhLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDdkMsTUFBTSxFQUFFLFFBQVE7WUFDaEIsUUFBUSxFQUFFLEtBQUs7WUFDZixhQUFhLEVBQUUsSUFBSTtZQUNuQixJQUFJLEVBQUUsU0FBUztTQUNoQixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkcsQ0FBQztJQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLENBQUM7QUFDaEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXZlbnQgaW5nZXN0aW9uIHJvdXRlcyBmb3IgdGhlIHVuaWZpZWQgd2ViIGNvbnNvbGUuXG4gKlxuICogVGhlIGNvbnNvbGUgbGVhZGVyIG1vdW50cyB0aGVzZSByb3V0ZXMgc28gZm9sbG93ZXIgTUNQIHNlcnZlcnMgY2FuXG4gKiBmb3J3YXJkIHRoZWlyIGxvZ3MsIG1ldHJpY3MsIGFuZCBzZXNzaW9uIGxpZmVjeWNsZSBldmVudHMuIEFsbCBpbmdlc3RlZFxuICogZW50cmllcyBhcmUgc3RhbXBlZCB3aXRoIGBfc2Vzc2lvbklkYCBpbiB0aGVpciBkYXRhIGZpZWxkIGFuZCB0aGVuXG4gKiBicm9hZGNhc3QgdG8gU1NFIGNsaWVudHMgdmlhIHRoZSBleGlzdGluZyBsb2cvbWV0cmljcyBicm9hZGNhc3QgaG9va3MuXG4gKlxuICogUm91dGVzOlxuICogLSBQT1NUIC9hcGkvaW5nZXN0L2xvZ3MgICAgIOKAlCBCYXRjaGVkIGxvZyBlbnRyaWVzIGZyb20gYSBmb2xsb3dlclxuICogLSBQT1NUIC9hcGkvaW5nZXN0L21ldHJpY3MgIOKAlCBNZXRyaWMgc25hcHNob3RzIGZyb20gYSBmb2xsb3dlclxuICogLSBQT1NUIC9hcGkvaW5nZXN0L3Nlc3Npb24gIOKAlCBTZXNzaW9uIGxpZmVjeWNsZSBldmVudHMgKHN0YXJ0ZWQvc3RvcHBlZC9oZWFydGJlYXQpXG4gKiAtIEdFVCAgL2FwaS9zZXNzaW9ucyAgICAgICAg4oCUIEFjdGl2ZSBzZXNzaW9uIGxpc3QgZm9yIHRoZSBVSVxuICpcbiAqIEBzaW5jZSB2Mi4xLjAg4oCUIElzc3VlICMxNzAwXG4gKi9cblxuaW1wb3J0IGV4cHJlc3MsIHsgUm91dGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgdHlwZSB7IFVuaWZpZWRMb2dFbnRyeSB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNTbmFwc2hvdCB9IGZyb20gJy4uLy4uL21ldHJpY3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2Vzc2lvbk5hbWVQb29sIH0gZnJvbSAnLi9TZXNzaW9uTmFtZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuXG4vKiogTWF4aW11bSBwYXlsb2FkIHNpemUgZm9yIGluZ2VzdGlvbiByZXF1ZXN0cyAqL1xuY29uc3QgTUFYX1BBWUxPQURfU0laRSA9ICcxbWInO1xuXG4vKiogUmF0ZSBsaW1pdDogbWF4IHJlcXVlc3RzIHBlciB3aW5kb3cgcGVyIHNvdXJjZSAqL1xuY29uc3QgUkFURV9MSU1JVF9NQVggPSAxMDAwO1xuY29uc3QgUkFURV9MSU1JVF9XSU5ET1dfTVMgPSA2MF8wMDA7XG5cbi8qKiBIb3cgb2Z0ZW4gdG8gY2hlY2sgZm9yIHN0YWxlIHNlc3Npb25zIChtcykgKi9cbmNvbnN0IFJFQVBFUl9JTlRFUlZBTF9NUyA9IDVfMDAwO1xuXG4vKiogSG93IGxvbmcgc2luY2UgbGFzdCBoZWFydGJlYXQgYmVmb3JlIGEgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGRlYWQgKG1zKSAqL1xuY29uc3QgU0VTU0lPTl9TVEFMRV9NUyA9IDE1XzAwMDtcblxuLyoqXG4gKiBUcmFja2VkIHNlc3Npb24gaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkluZm8ge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgc2Vzc2lvbiAoVVVJRCBvciBgY29uc29sZS08cGlkPmApLiAqL1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgLyoqIEZyaWVuZGx5IHB1cHBldCBuYW1lIChlLmcuLCBcIktlcm1pdFwiLCBcIlB1bmNoXCIpIG9yIFwiV2ViIENvbnNvbGVcIi4gKi9cbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgLyoqIENhbm9uaWNhbCBoZXggY29sb3IgZm9yIHRoaXMgcHVwcGV0IGNoYXJhY3Rlci4gKi9cbiAgY29sb3I6IHN0cmluZztcbiAgLyoqIE9TIHByb2Nlc3MgSUQgb2YgdGhlIE1DUCBzZXJ2ZXIgb3Igd2ViIGNvbnNvbGUgcHJvY2Vzcy4gKi9cbiAgcGlkOiBudW1iZXI7XG4gIC8qKiBJU08gdGltZXN0YW1wIHdoZW4gdGhlIHNlc3Npb24gc3RhcnRlZC4gKi9cbiAgc3RhcnRlZEF0OiBzdHJpbmc7XG4gIC8qKiBJU08gdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBoZWFydGJlYXQgKGZvbGxvd2Vycykgb3IgcmVnaXN0cmF0aW9uIChsZWFkZXIvY29uc29sZSkuICovXG4gIGxhc3RIZWFydGJlYXQ6IHN0cmluZztcbiAgLyoqIExpZmVjeWNsZSBzdGF0dXMg4oCUICdhY3RpdmUnIHVudGlsIGVuZGVkIG9yIHJlYXBlZCBmb3Igc3RhbGVuZXNzLiAqL1xuICBzdGF0dXM6ICdhY3RpdmUnIHwgJ2VuZGVkJztcbiAgLyoqIFRydWUgaWYgdGhpcyBzZXNzaW9uIHdvbiBsZWFkZXIgZWxlY3Rpb24gYW5kIG93bnMgdGhlIHRva2VuIGZpbGUuICovXG4gIGlzTGVhZGVyOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGlzIHNlc3Npb24gY29ubmVjdGVkIHdpdGggYSB2YWxpZCBCZWFyZXIgdG9rZW4gKCMxODA1KS4gKi9cbiAgYXV0aGVudGljYXRlZDogYm9vbGVhbjtcbiAgLyoqIFNlc3Npb24ga2luZCDigJQgJ21jcCcgZm9yIE1DUCBzdGRpbyBzZXNzaW9ucywgJ2NvbnNvbGUnIGZvciB0aGUgd2ViIGNvbnNvbGUgaXRzZWxmICgjMTgwNSkuICovXG4gIGtpbmQ6ICdtY3AnIHwgJ2NvbnNvbGUnO1xufVxuXG4vKipcbiAqIFBheWxvYWQgZm9yIFBPU1QgL2FwaS9pbmdlc3QvbG9nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdExvZ1BheWxvYWQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgZW50cmllczogVW5pZmllZExvZ0VudHJ5W107XG59XG5cbi8qKlxuICogUGF5bG9hZCBmb3IgUE9TVCAvYXBpL2luZ2VzdC9tZXRyaWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0TWV0cmljc1BheWxvYWQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90O1xufVxuXG4vKipcbiAqIFBheWxvYWQgZm9yIFBPU1QgL2FwaS9pbmdlc3Qvc2Vzc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25FdmVudFBheWxvYWQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgZXZlbnQ6ICdzdGFydGVkJyB8ICdzdG9wcGVkJyB8ICdoZWFydGJlYXQnO1xuICBwaWQ6IG51bWJlcjtcbiAgc3RhcnRlZEF0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2FsbGJhY2tzIHByb3ZpZGVkIGJ5IHRoZSB1bmlmaWVkIGNvbnNvbGUgb3JjaGVzdHJhdG9yIGZvciBicm9hZGNhc3RpbmdcbiAqIGluZ2VzdGVkIGV2ZW50cyB0aHJvdWdoIHRoZSBleGlzdGluZyBTU0UgaW5mcmFzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0QnJvYWRjYXN0cyB7XG4gIGxvZ0Jyb2FkY2FzdDogKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHZvaWQ7XG4gIG1ldHJpY3NPblNuYXBzaG90PzogKHNuYXBzaG90OiBNZXRyaWNTbmFwc2hvdCkgPT4gdm9pZDtcbiAgc2Vzc2lvbkJyb2FkY2FzdD86IChldmVudDogU2Vzc2lvbkluZm8pID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGNyZWF0aW5nIGluZ2VzdCByb3V0ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0Um91dGVzUmVzdWx0IHtcbiAgcm91dGVyOiBSb3V0ZXI7XG4gIC8qKiBHZXQgYWxsIHRyYWNrZWQgc2Vzc2lvbnMgKi9cbiAgZ2V0U2Vzc2lvbnM6ICgpID0+IFNlc3Npb25JbmZvW107XG4gIC8qKiBSZWdpc3RlciB0aGUgbGVhZGVyIGFzIGEgc2Vzc2lvbiAqL1xuICByZWdpc3RlckxlYWRlclNlc3Npb246IChzZXNzaW9uSWQ6IHN0cmluZywgcGlkOiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKiBSZWdpc3RlciB0aGUgd2ViIGNvbnNvbGUgYXMgYSBzZXNzaW9uIHNvIHRoZSBpbmRpY2F0b3IgaXMgbmV2ZXIgZW1wdHkgKCMxODA1KSAqL1xuICByZWdpc3RlckNvbnNvbGVTZXNzaW9uOiAoKSA9PiB2b2lkO1xufVxuXG4vKiogTm9ybWFsaXplIGEgc3RyaW5nIHZpYSBVbmljb2RlVmFsaWRhdG9yIChETUNQLVNFQy0wMDQpICovXG5mdW5jdGlvbiBub3JtYWxpemVJbnB1dChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUocykubm9ybWFsaXplZENvbnRlbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBpbmdlc3Rpb24gcm91dGVzIGFuZCBzZXNzaW9uIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBicm9hZGNhc3RzIC0gQ2FsbGJhY2tzIHRvIGZvcndhcmQgaW5nZXN0ZWQgZXZlbnRzIHRvIFNTRSBjbGllbnRzXG4gKiBAcmV0dXJucyBSb3V0ZXIgYW5kIHNlc3Npb24gbWFuYWdlbWVudCBmdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluZ2VzdFJvdXRlcyhicm9hZGNhc3RzOiBJbmdlc3RCcm9hZGNhc3RzKTogSW5nZXN0Um91dGVzUmVzdWx0IHtcbiAgY29uc3Qgcm91dGVyID0gUm91dGVyKCk7XG4gIGNvbnN0IHNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIFNlc3Npb25JbmZvPigpO1xuICBjb25zdCBuYW1lUG9vbCA9IG5ldyBTZXNzaW9uTmFtZVBvb2woKTtcbiAgY29uc3QgcmF0ZUxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKFJBVEVfTElNSVRfTUFYLCBSQVRFX0xJTUlUX1dJTkRPV19NUyk7XG5cbiAgLy8gSlNPTiBib2R5IHBhcnNpbmcgd2l0aCBzaXplIGxpbWl0XG4gIHJvdXRlci51c2UoZXhwcmVzcy5qc29uKHsgbGltaXQ6IE1BWF9QQVlMT0FEX1NJWkUgfSkpO1xuXG4gIC8qKlxuICAgKiBQT1NUIC9hcGkvaW5nZXN0L2xvZ3Mg4oCUIFJlY2VpdmUgYmF0Y2hlZCBsb2cgZW50cmllcyBmcm9tIGEgZm9sbG93ZXIuXG4gICAqL1xuICByb3V0ZXIucG9zdCgnL2FwaS9pbmdlc3QvbG9ncycsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXJhdGVMaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MjkpLmpzb24oeyBlcnJvcjogJ1JhdGUgbGltaXQgZXhjZWVkZWQnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQgPSByZXEuYm9keSBhcyBJbmdlc3RMb2dQYXlsb2FkO1xuICAgIGlmICghcGF5bG9hZD8uc2Vzc2lvbklkIHx8ICFBcnJheS5pc0FycmF5KHBheWxvYWQuZW50cmllcykpIHtcbiAgICAgIGNvbnN0IHJlY2VpdmVkID0gcGF5bG9hZCA/IE9iamVjdC5rZXlzKHBheWxvYWQpIDogW107XG4gICAgICBsb2dnZXIud2FybignW0luZ2VzdFJvdXRlc10gSW52YWxpZCBsb2cgcGF5bG9hZCcsIHsgcmVjZWl2ZWQsIGhhc1Nlc3Npb25JZDogISFwYXlsb2FkPy5zZXNzaW9uSWQsIGhhc0VudHJpZXM6IEFycmF5LmlzQXJyYXkocGF5bG9hZD8uZW50cmllcykgfSk7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnSW52YWxpZCBwYXlsb2FkJywgcmVxdWlyZWQ6IFsnc2Vzc2lvbklkJywgJ2VudHJpZXMnXSwgcmVjZWl2ZWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBheWxvYWQuc2Vzc2lvbklkID0gbm9ybWFsaXplSW5wdXQocGF5bG9hZC5zZXNzaW9uSWQpO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgc2tpcHBlZCA9IDA7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwYXlsb2FkLmVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5Lm1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7IHNraXBwZWQrKzsgY29udGludWU7IH1cbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgLi4uZW50cnksXG4gICAgICAgIGRhdGE6IHsgLi4uZW50cnkuZGF0YSwgX3Nlc3Npb25JZDogcGF5bG9hZC5zZXNzaW9uSWQgfSxcbiAgICAgIH07XG4gICAgICBicm9hZGNhc3RzLmxvZ0Jyb2FkY2FzdChzdGFtcGVkKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHNlc3Npb24gaGVhcnRiZWF0XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25zLmdldChwYXlsb2FkLnNlc3Npb25JZCk7XG4gICAgaWYgKHNlc3Npb24pIHtcbiAgICAgIHNlc3Npb24ubGFzdEhlYXJ0YmVhdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoc2tpcHBlZCA+IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0luZ2VzdFJvdXRlc10gTG9nIGluZ2VzdCBmcm9tICR7c2Vzc2lvbj8uZGlzcGxheU5hbWUgPz8gcGF5bG9hZC5zZXNzaW9uSWR9OiBhY2NlcHRlZD0ke2NvdW50fSwgc2tpcHBlZD0ke3NraXBwZWR9YCk7XG4gICAgfVxuXG4gICAgcmVzLnN0YXR1cygyMDApLmpzb24oeyBhY2NlcHRlZDogY291bnQsIHNraXBwZWQgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBQT1NUIC9hcGkvaW5nZXN0L21ldHJpY3Mg4oCUIFJlY2VpdmUgbWV0cmljIHNuYXBzaG90cyBmcm9tIGEgZm9sbG93ZXIuXG4gICAqL1xuICByb3V0ZXIucG9zdCgnL2FwaS9pbmdlc3QvbWV0cmljcycsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXJhdGVMaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MjkpLmpzb24oeyBlcnJvcjogJ1JhdGUgbGltaXQgZXhjZWVkZWQnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQgPSByZXEuYm9keSBhcyBJbmdlc3RNZXRyaWNzUGF5bG9hZDtcbiAgICBpZiAoIXBheWxvYWQ/LnNlc3Npb25JZCB8fCAhcGF5bG9hZC5zbmFwc2hvdCkge1xuICAgICAgY29uc3QgcmVjZWl2ZWQgPSBwYXlsb2FkID8gT2JqZWN0LmtleXMocGF5bG9hZCkgOiBbXTtcbiAgICAgIGxvZ2dlci53YXJuKCdbSW5nZXN0Um91dGVzXSBJbnZhbGlkIG1ldHJpY3MgcGF5bG9hZCcsIHsgcmVjZWl2ZWQgfSk7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnSW52YWxpZCBwYXlsb2FkJywgcmVxdWlyZWQ6IFsnc2Vzc2lvbklkJywgJ3NuYXBzaG90J10sIHJlY2VpdmVkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYXlsb2FkLnNlc3Npb25JZCA9IG5vcm1hbGl6ZUlucHV0KHBheWxvYWQuc2Vzc2lvbklkKTtcblxuICAgIGlmIChicm9hZGNhc3RzLm1ldHJpY3NPblNuYXBzaG90KSB7XG4gICAgICBicm9hZGNhc3RzLm1ldHJpY3NPblNuYXBzaG90KHBheWxvYWQuc25hcHNob3QpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb24gPSBzZXNzaW9ucy5nZXQocGF5bG9hZC5zZXNzaW9uSWQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgW0luZ2VzdFJvdXRlc10gTWV0cmljcyBpbmdlc3RlZCBmcm9tICR7c2Vzc2lvbj8uZGlzcGxheU5hbWUgPz8gcGF5bG9hZC5zZXNzaW9uSWR9YCk7XG4gICAgcmVzLnN0YXR1cygyMDApLmpzb24oeyBhY2NlcHRlZDogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9pbmdlc3Qvc2Vzc2lvbiDigJQgU2Vzc2lvbiBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKi9cbiAgcm91dGVyLnBvc3QoJy9hcGkvaW5nZXN0L3Nlc3Npb24nLCAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHJlcS5ib2R5IGFzIFNlc3Npb25FdmVudFBheWxvYWQ7XG4gICAgaWYgKCFwYXlsb2FkPy5zZXNzaW9uSWQgfHwgIXBheWxvYWQuZXZlbnQpIHtcbiAgICAgIGNvbnN0IHJlY2VpdmVkID0gcGF5bG9hZCA/IE9iamVjdC5rZXlzKHBheWxvYWQpIDogW107XG4gICAgICBsb2dnZXIud2FybignW0luZ2VzdFJvdXRlc10gSW52YWxpZCBzZXNzaW9uIGV2ZW50IHBheWxvYWQnLCB7IHJlY2VpdmVkIH0pO1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ0ludmFsaWQgcGF5bG9hZCcsIHJlcXVpcmVkOiBbJ3Nlc3Npb25JZCcsICdldmVudCddLCByZWNlaXZlZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGF5bG9hZC5zZXNzaW9uSWQgPSBub3JtYWxpemVJbnB1dChwYXlsb2FkLnNlc3Npb25JZCk7XG5cbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBzd2l0Y2ggKHBheWxvYWQuZXZlbnQpIHtcbiAgICAgIGNhc2UgJ3N0YXJ0ZWQnOiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbmFtZVBvb2wuYXNzaWduKHBheWxvYWQuc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBuYW1lUG9vbC5nZXRDb2xvcihwYXlsb2FkLnNlc3Npb25JZCkgPz8gJyMzYjgyZjYnO1xuICAgICAgICAvLyBGb2xsb3dlciBzZXNzaW9ucyB0aGF0IHJlYWNoIHRoZSBpbmdlc3QgZW5kcG9pbnQgYXJlIGF1dGhlbnRpY2F0ZWRcbiAgICAgICAgLy8gaWYgdGhlIGF1dGggbWlkZGxld2FyZSBwYXNzZWQgdGhlbSB0aHJvdWdoICh0b2tlbiB3YXMgdmFsaWQpLlxuICAgICAgICBjb25zdCBpc0F1dGhlbnRpY2F0ZWQgPSBCb29sZWFuKChyZXMgYXMgYW55KS5sb2NhbHM/LnRva2VuRW50cnkpO1xuICAgICAgICBjb25zdCBpbmZvOiBTZXNzaW9uSW5mbyA9IHtcbiAgICAgICAgICBzZXNzaW9uSWQ6IHBheWxvYWQuc2Vzc2lvbklkLFxuICAgICAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgICAgIGNvbG9yLFxuICAgICAgICAgIHBpZDogcGF5bG9hZC5waWQsXG4gICAgICAgICAgc3RhcnRlZEF0OiBwYXlsb2FkLnN0YXJ0ZWRBdCB8fCBub3csXG4gICAgICAgICAgbGFzdEhlYXJ0YmVhdDogbm93LFxuICAgICAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgICAgICAgaXNMZWFkZXI6IGZhbHNlLFxuICAgICAgICAgIGF1dGhlbnRpY2F0ZWQ6IGlzQXV0aGVudGljYXRlZCxcbiAgICAgICAgICBraW5kOiAnbWNwJyxcbiAgICAgICAgfTtcbiAgICAgICAgc2Vzc2lvbnMuc2V0KHBheWxvYWQuc2Vzc2lvbklkLCBpbmZvKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIFNlc3Npb24gcmVnaXN0ZXJlZCcsIHtcbiAgICAgICAgICBkaXNwbGF5TmFtZSwgc2Vzc2lvbklkOiBwYXlsb2FkLnNlc3Npb25JZCwgcGlkOiBwYXlsb2FkLnBpZCwgY29sb3IsXG4gICAgICAgICAgYWN0aXZlU2Vzc2lvbnM6IEFycmF5LmZyb20oc2Vzc2lvbnMudmFsdWVzKCkpLmZpbHRlcihzID0+IHMuc3RhdHVzID09PSAnYWN0aXZlJykubGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJvYWRjYXN0cy5zZXNzaW9uQnJvYWRjYXN0Py4oaW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RvcHBlZCc6IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBzZXNzaW9ucy5nZXQocGF5bG9hZC5zZXNzaW9uSWQpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICBleGlzdGluZy5zdGF0dXMgPSAnZW5kZWQnO1xuICAgICAgICAgIGV4aXN0aW5nLmxhc3RIZWFydGJlYXQgPSBub3c7XG4gICAgICAgICAgbmFtZVBvb2wucmVsZWFzZShwYXlsb2FkLnNlc3Npb25JZCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIFNlc3Npb24gc3RvcHBlZCcsIHtcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBleGlzdGluZy5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkOiBwYXlsb2FkLnNlc3Npb25JZCwgcGlkOiBleGlzdGluZy5waWQsXG4gICAgICAgICAgICBhY3RpdmVTZXNzaW9uczogQXJyYXkuZnJvbShzZXNzaW9ucy52YWx1ZXMoKSkuZmlsdGVyKHMgPT4gcy5zdGF0dXMgPT09ICdhY3RpdmUnKS5sZW5ndGggLSAxLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyb2FkY2FzdHMuc2Vzc2lvbkJyb2FkY2FzdD8uKGV4aXN0aW5nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYXJ0YmVhdCc6IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBzZXNzaW9ucy5nZXQocGF5bG9hZC5zZXNzaW9uSWQpO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICBleGlzdGluZy5sYXN0SGVhcnRiZWF0ID0gbm93O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgb2s6IHRydWUgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBHRVQgL2FwaS9zZXNzaW9ucyDigJQgTGlzdCBhbGwgdHJhY2tlZCBzZXNzaW9ucy5cbiAgICovXG4gIHJvdXRlci5nZXQoJy9hcGkvc2Vzc2lvbnMnLCBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIGNvbnN0IGxvY2FsU2Vzc2lvbnMgPSBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKTtcbiAgICBjb25zdCBjdXJyZW50UG9ydCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVCA/PyA0MTcxNTtcblxuICAgIC8vIEZlZGVyYXRlIHdpdGggdGhlIGxlZ2FjeSBwb3J0ICgzOTM5KSB0byBzaG93IGFsbCBzZXNzaW9ucyBvbiB0aGVcbiAgICAvLyBtYWNoaW5lLCBpbmNsdWRpbmcgdW5hdXRoZW50aWNhdGVkIG9uZXMgZnJvbSBwcmUtYXV0aCBpbnN0YWxscy5cbiAgICAvLyBTZXJ2ZXItdG8tc2VydmVyIGF2b2lkcyBDT1JTIHJlc3RyaWN0aW9ucyAoIzE4MDUpLlxuICAgIGlmIChjdXJyZW50UG9ydCAhPT0gMzkzOSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCAyMDAwKTtcbiAgICAgICAgY29uc3QgbGVnYWN5UmVzID0gYXdhaXQgZmV0Y2goJ2h0dHA6Ly8xMjcuMC4wLjE6MzkzOS9hcGkvc2Vzc2lvbnMnLCB7XG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKGxlZ2FjeVJlcy5vaykge1xuICAgICAgICAgIGNvbnN0IGxlZ2FjeURhdGEgPSBhd2FpdCBsZWdhY3lSZXMuanNvbigpIGFzIHsgc2Vzc2lvbnM6IFNlc3Npb25JbmZvW10gfTtcbiAgICAgICAgICBjb25zdCBsb2NhbElkcyA9IG5ldyBTZXQobG9jYWxTZXNzaW9ucy5tYXAocyA9PiBzLnNlc3Npb25JZCkpO1xuICAgICAgICAgIGZvciAoY29uc3QgbHMgb2YgKGxlZ2FjeURhdGEuc2Vzc2lvbnMgfHwgW10pKSB7XG4gICAgICAgICAgICBpZiAoIWxvY2FsSWRzLmhhcyhscy5zZXNzaW9uSWQpICYmIGxzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHtcbiAgICAgICAgICAgICAgbG9jYWxTZXNzaW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAuLi5scyxcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBraW5kOiBscy5raW5kIHx8ICdtY3AnLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBMZWdhY3kgaW5zdGFuY2Ugbm90IHJ1bm5pbmcgb3IgdW5yZWFjaGFibGUg4oCUIHRoYXQncyBmaW5lXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzLmpzb24oeyBzZXNzaW9uczogbG9jYWxTZXNzaW9ucyB9KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9zZXNzaW9ucy86c2Vzc2lvbklkL2tpbGwg4oCUIFRlcm1pbmF0ZSBhIHNlc3Npb24ncyBzZXJ2ZXIgcHJvY2Vzcy5cbiAgICovXG4gIHJvdXRlci5wb3N0KCcvYXBpL3Nlc3Npb25zLzpzZXNzaW9uSWQva2lsbCcsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSByZXEucGFyYW1zWydzZXNzaW9uSWQnXSBhcyBzdHJpbmc7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuXG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICBsb2dnZXIud2FybignW0luZ2VzdFJvdXRlc10gS2lsbCByZXF1ZXN0ZWQgZm9yIHVua25vd24gc2Vzc2lvbicsIHsgc2Vzc2lvbklkIH0pO1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogJ1Nlc3Npb24gbm90IGZvdW5kJywgc2Vzc2lvbklkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc2Vzc2lvbi5waWQpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdObyBQSUQgZm9yIHNlc3Npb24nLCBzZXNzaW9uSWQsIGRpc3BsYXlOYW1lOiBzZXNzaW9uLmRpc3BsYXlOYW1lIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwoc2Vzc2lvbi5waWQsICdTSUdURVJNJyk7XG4gICAgICBzZXNzaW9uLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgICBuYW1lUG9vbC5yZWxlYXNlKHNlc3Npb25JZCk7XG4gICAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gU2Vzc2lvbiBraWxsZWQnLCB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiBzZXNzaW9uLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHBpZDogc2Vzc2lvbi5waWQsXG4gICAgICAgIGFjdGl2ZVNlc3Npb25zOiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpLmxlbmd0aCAtIDEsXG4gICAgICB9KTtcbiAgICAgIHJlcy5qc29uKHsgb2s6IHRydWUsIGtpbGxlZDogc2Vzc2lvbi5kaXNwbGF5TmFtZSwgcGlkOiBzZXNzaW9uLnBpZCB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAoZXJyIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgICAgbG9nZ2VyLmVycm9yKCdbSW5nZXN0Um91dGVzXSBGYWlsZWQgdG8ga2lsbCBzZXNzaW9uJywge1xuICAgICAgICBkaXNwbGF5TmFtZTogc2Vzc2lvbi5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkLCBwaWQ6IHNlc3Npb24ucGlkLCBlcnJvcjogbWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBraWxsIHNlc3Npb24nLCBzZXNzaW9uSWQsIGRpc3BsYXlOYW1lOiBzZXNzaW9uLmRpc3BsYXlOYW1lLCBwaWQ6IHNlc3Npb24ucGlkLCBkZXRhaWw6IG1lc3NhZ2UgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWFwZXI6IHBlcmlvZGljYWxseSBjaGVjayBmb3Igc3RhbGUgc2Vzc2lvbnMgd2hvc2UgaGVhcnRiZWF0IGhhcyBleHBpcmVkXG4gIGNvbnN0IHJlYXBlckludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgZm9yIChjb25zdCBbaWQsIHNlc3Npb25dIG9mIHNlc3Npb25zKSB7XG4gICAgICBpZiAoc2Vzc2lvbi5zdGF0dXMgIT09ICdhY3RpdmUnKSBjb250aW51ZTtcbiAgICAgIGlmIChzZXNzaW9uLmlzTGVhZGVyKSBjb250aW51ZTsgLy8gbGVhZGVyIG1hbmFnZXMgaXRzZWxmXG4gICAgICBpZiAoc2Vzc2lvbi5raW5kID09PSAnY29uc29sZScpIGNvbnRpbnVlOyAvLyBjb25zb2xlIHNlc3Npb24gaGFzIG5vIGhlYXJ0YmVhdCAoIzE4MDUpXG4gICAgICBjb25zdCBhZ2UgPSBub3cgLSBuZXcgRGF0ZShzZXNzaW9uLmxhc3RIZWFydGJlYXQpLmdldFRpbWUoKTtcbiAgICAgIGlmIChhZ2UgPiBTRVNTSU9OX1NUQUxFX01TKSB7XG4gICAgICAgIHNlc3Npb24uc3RhdHVzID0gJ2VuZGVkJztcbiAgICAgICAgbmFtZVBvb2wucmVsZWFzZShpZCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBSZWFwZWQgc3RhbGUgc2Vzc2lvbicsIHtcbiAgICAgICAgICBkaXNwbGF5TmFtZTogc2Vzc2lvbi5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkOiBpZCwgcGlkOiBzZXNzaW9uLnBpZCxcbiAgICAgICAgICBsYXN0SGVhcnRiZWF0QWdvOiBgJHtNYXRoLnJvdW5kKGFnZSAvIDEwMDApfXNgLFxuICAgICAgICAgIGFjdGl2ZVNlc3Npb25zOiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpLmxlbmd0aCAtIDEsXG4gICAgICAgIH0pO1xuICAgICAgICBicm9hZGNhc3RzLnNlc3Npb25Ccm9hZGNhc3Q/LihzZXNzaW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFJFQVBFUl9JTlRFUlZBTF9NUyk7XG4gIHJlYXBlckludGVydmFsLnVucmVmKCk7XG5cbiAgZnVuY3Rpb24gZ2V0U2Vzc2lvbnMoKTogU2Vzc2lvbkluZm9bXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2Vzc2lvbnMudmFsdWVzKCkpLmZpbHRlcihzID0+IHMuc3RhdHVzID09PSAnYWN0aXZlJyk7XG4gIH1cblxuICBmdW5jdGlvbiByZWdpc3RlckxlYWRlclNlc3Npb24oc2Vzc2lvbklkOiBzdHJpbmcsIHBpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBuYW1lUG9vbC5hc3NpZ24oc2Vzc2lvbklkLCB0cnVlKTtcbiAgICBjb25zdCBjb2xvciA9IG5hbWVQb29sLmdldENvbG9yKHNlc3Npb25JZCkgPz8gJyMzYjgyZjYnO1xuICAgIHNlc3Npb25zLnNldChzZXNzaW9uSWQsIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgY29sb3IsXG4gICAgICBwaWQsXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGxhc3RIZWFydGJlYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgICBpc0xlYWRlcjogdHJ1ZSxcbiAgICAgIGF1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICBraW5kOiAnbWNwJyxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gTGVhZGVyIHNlc3Npb24gcmVnaXN0ZXJlZCcsIHsgZGlzcGxheU5hbWUsIHNlc3Npb25JZCwgcGlkLCBjb2xvciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgd2ViIGNvbnNvbGUgaXRzZWxmIGFzIGEgc2Vzc2lvbiAoIzE4MDUpLiBFbnN1cmVzIHRoZVxuICAgKiBzZXNzaW9uIGluZGljYXRvciBhbHdheXMgc2hvd3MgYXQgbGVhc3Qgb25lIGVudHJ5IOKAlCB0aGUgY29uc29sZSB0aGVcbiAgICogdXNlciBpcyBjdXJyZW50bHkgbG9va2luZyBhdC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyQ29uc29sZVNlc3Npb24oKTogdm9pZCB7XG4gICAgY29uc3QgY29uc29sZUlkID0gYGNvbnNvbGUtJHtwcm9jZXNzLnBpZH1gO1xuICAgIGlmIChzZXNzaW9ucy5oYXMoY29uc29sZUlkKSkgcmV0dXJuO1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gJ1dlYiBDb25zb2xlJztcbiAgICBzZXNzaW9ucy5zZXQoY29uc29sZUlkLCB7XG4gICAgICBzZXNzaW9uSWQ6IGNvbnNvbGVJZCxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgY29sb3I6ICcjNjM2NmYxJywgLy8gaW5kaWdvIOKAlCBkaXN0aW5jdCBmcm9tIHB1cHBldCBncmVlbnMvYmx1ZXNcbiAgICAgIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGxhc3RIZWFydGJlYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgICBpc0xlYWRlcjogZmFsc2UsXG4gICAgICBhdXRoZW50aWNhdGVkOiB0cnVlLFxuICAgICAga2luZDogJ2NvbnNvbGUnLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBDb25zb2xlIHNlc3Npb24gcmVnaXN0ZXJlZCcsIHsgc2Vzc2lvbklkOiBjb25zb2xlSWQsIHBpZDogcHJvY2Vzcy5waWQgfSk7XG4gIH1cblxuICByZXR1cm4geyByb3V0ZXIsIGdldFNlc3Npb25zLCByZWdpc3RlckxlYWRlclNlc3Npb24sIHJlZ2lzdGVyQ29uc29sZVNlc3Npb24gfTtcbn1cbiJdfQ==
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5nZXN0Um91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYi9jb25zb2xlL0luZ2VzdFJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUkxQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxQyxrREFBa0Q7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0IscURBQXFEO0FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztBQUM1QixNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUVwQyxpREFBaUQ7QUFDakQsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFFakMsNkVBQTZFO0FBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO0FBRWhDLDZEQUE2RDtBQUM3RCxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQztBQUV0QyxrRUFBa0U7QUFDbEUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLFlBQVk7QUE2RS9DLDZEQUE2RDtBQUM3RCxTQUFTLGNBQWMsQ0FBQyxDQUFTO0lBQy9CLE9BQU8sZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0FBQ3pELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FB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QUFFLE9BQU87UUFDcEMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDO1FBQ2xDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO1lBQ3RCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFdBQVc7WUFDWCxLQUFLLEVBQUUsU0FBUyxFQUFFLDZDQUE2QztZQUMvRCxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ25DLGFBQWEsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUN2QyxNQUFNLEVBQUUsUUFBUTtZQUNoQixRQUFRLEVBQUUsS0FBSztZQUNmLGFBQWEsRUFBRSxJQUFJO1lBQ25CLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztBQUNoRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFdmVudCBpbmdlc3Rpb24gcm91dGVzIGZvciB0aGUgdW5pZmllZCB3ZWIgY29uc29sZS5cbiAqXG4gKiBUaGUgY29uc29sZSBsZWFkZXIgbW91bnRzIHRoZXNlIHJvdXRlcyBzbyBmb2xsb3dlciBNQ1Agc2VydmVycyBjYW5cbiAqIGZvcndhcmQgdGhlaXIgbG9ncywgbWV0cmljcywgYW5kIHNlc3Npb24gbGlmZWN5Y2xlIGV2ZW50cy4gQWxsIGluZ2VzdGVkXG4gKiBlbnRyaWVzIGFyZSBzdGFtcGVkIHdpdGggYF9zZXNzaW9uSWRgIGluIHRoZWlyIGRhdGEgZmllbGQgYW5kIHRoZW5cbiAqIGJyb2FkY2FzdCB0byBTU0UgY2xpZW50cyB2aWEgdGhlIGV4aXN0aW5nIGxvZy9tZXRyaWNzIGJyb2FkY2FzdCBob29rcy5cbiAqXG4gKiBSb3V0ZXM6XG4gKiAtIFBPU1QgL2FwaS9pbmdlc3QvbG9ncyAgICAg4oCUIEJhdGNoZWQgbG9nIGVudHJpZXMgZnJvbSBhIGZvbGxvd2VyXG4gKiAtIFBPU1QgL2FwaS9pbmdlc3QvbWV0cmljcyAg4oCUIE1ldHJpYyBzbmFwc2hvdHMgZnJvbSBhIGZvbGxvd2VyXG4gKiAtIFBPU1QgL2FwaS9pbmdlc3Qvc2Vzc2lvbiAg4oCUIFNlc3Npb24gbGlmZWN5Y2xlIGV2ZW50cyAoc3RhcnRlZC9zdG9wcGVkL2hlYXJ0YmVhdClcbiAqIC0gR0VUICAvYXBpL3Nlc3Npb25zICAgICAgICDigJQgQWN0aXZlIHNlc3Npb24gbGlzdCBmb3IgdGhlIFVJXG4gKlxuICogQHNpbmNlIHYyLjEuMCDigJQgSXNzdWUgIzE3MDBcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcywgeyBSb3V0ZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgVW5pZmllZExvZ0VudHJ5IH0gZnJvbSAnLi4vLi4vbG9nZ2luZy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY1NuYXBzaG90IH0gZnJvbSAnLi4vLi4vbWV0cmljcy90eXBlcy5qcyc7XG5pbXBvcnQgeyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9TbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZXNzaW9uTmFtZVBvb2wgfSBmcm9tICcuL1Nlc3Npb25OYW1lcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vudi5qcyc7XG5cbi8qKiBNYXhpbXVtIHBheWxvYWQgc2l6ZSBmb3IgaW5nZXN0aW9uIHJlcXVlc3RzICovXG5jb25zdCBNQVhfUEFZTE9BRF9TSVpFID0gJzFtYic7XG5cbi8qKiBSYXRlIGxpbWl0OiBtYXggcmVxdWVzdHMgcGVyIHdpbmRvdyBwZXIgc291cmNlICovXG5jb25zdCBSQVRFX0xJTUlUX01BWCA9IDEwMDA7XG5jb25zdCBSQVRFX0xJTUlUX1dJTkRPV19NUyA9IDYwXzAwMDtcblxuLyoqIEhvdyBvZnRlbiB0byBjaGVjayBmb3Igc3RhbGUgc2Vzc2lvbnMgKG1zKSAqL1xuY29uc3QgUkVBUEVSX0lOVEVSVkFMX01TID0gNV8wMDA7XG5cbi8qKiBIb3cgbG9uZyBzaW5jZSBsYXN0IGhlYXJ0YmVhdCBiZWZvcmUgYSBzZXNzaW9uIGlzIGNvbnNpZGVyZWQgZGVhZCAobXMpICovXG5jb25zdCBTRVNTSU9OX1NUQUxFX01TID0gMTVfMDAwO1xuXG4vKiogVGltZW91dCBmb3IgbGVnYWN5IHBvcnQgZmVkZXJhdGlvbi9wcm94eSByZXF1ZXN0cyAobXMpICovXG5jb25zdCBMRUdBQ1lfRkVUQ0hfVElNRU9VVF9NUyA9IDJfMDAwO1xuXG4vKiogSG93IGxvbmcgYmVmb3JlIGVuZGVkIHNlc3Npb25zIGFyZSBwdXJnZWQgZnJvbSB0aGUgTWFwIChtcykgKi9cbmNvbnN0IEVOREVEX1BVUkdFX01TID0gNSAqIDYwXzAwMDsgLy8gNSBtaW51dGVzXG5cbi8qKlxuICogVHJhY2tlZCBzZXNzaW9uIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25JbmZvIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHNlc3Npb24gKFVVSUQgb3IgYGNvbnNvbGUtPHBpZD5gKS4gKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBGcmllbmRseSBwdXBwZXQgbmFtZSAoZS5nLiwgXCJLZXJtaXRcIiwgXCJQdW5jaFwiKSBvciBcIldlYiBDb25zb2xlXCIuICovXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIC8qKiBDYW5vbmljYWwgaGV4IGNvbG9yIGZvciB0aGlzIHB1cHBldCBjaGFyYWN0ZXIuICovXG4gIGNvbG9yOiBzdHJpbmc7XG4gIC8qKiBPUyBwcm9jZXNzIElEIG9mIHRoZSBNQ1Agc2VydmVyIG9yIHdlYiBjb25zb2xlIHByb2Nlc3MuICovXG4gIHBpZDogbnVtYmVyO1xuICAvKiogSVNPIHRpbWVzdGFtcCB3aGVuIHRoZSBzZXNzaW9uIHN0YXJ0ZWQuICovXG4gIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICAvKiogSVNPIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgaGVhcnRiZWF0IChmb2xsb3dlcnMpIG9yIHJlZ2lzdHJhdGlvbiAobGVhZGVyL2NvbnNvbGUpLiAqL1xuICBsYXN0SGVhcnRiZWF0OiBzdHJpbmc7XG4gIC8qKiBMaWZlY3ljbGUgc3RhdHVzIOKAlCAnYWN0aXZlJyB1bnRpbCBlbmRlZCBvciByZWFwZWQgZm9yIHN0YWxlbmVzcy4gKi9cbiAgc3RhdHVzOiAnYWN0aXZlJyB8ICdlbmRlZCc7XG4gIC8qKiBUcnVlIGlmIHRoaXMgc2Vzc2lvbiB3b24gbGVhZGVyIGVsZWN0aW9uIGFuZCBvd25zIHRoZSB0b2tlbiBmaWxlLiAqL1xuICBpc0xlYWRlcjogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBzZXNzaW9uIGNvbm5lY3RlZCB3aXRoIGEgdmFsaWQgQmVhcmVyIHRva2VuICgjMTgwNSkuICovXG4gIGF1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XG4gIC8qKiBTZXNzaW9uIGtpbmQg4oCUICdtY3AnIGZvciBNQ1Agc3RkaW8gc2Vzc2lvbnMsICdjb25zb2xlJyBmb3IgdGhlIHdlYiBjb25zb2xlIGl0c2VsZiAoIzE4MDUpLiAqL1xuICBraW5kOiAnbWNwJyB8ICdjb25zb2xlJztcbn1cblxuLyoqXG4gKiBQYXlsb2FkIGZvciBQT1NUIC9hcGkvaW5nZXN0L2xvZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RMb2dQYXlsb2FkIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGVudHJpZXM6IFVuaWZpZWRMb2dFbnRyeVtdO1xufVxuXG4vKipcbiAqIFBheWxvYWQgZm9yIFBPU1QgL2FwaS9pbmdlc3QvbWV0cmljc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdE1ldHJpY3NQYXlsb2FkIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHNuYXBzaG90OiBNZXRyaWNTbmFwc2hvdDtcbn1cblxuLyoqXG4gKiBQYXlsb2FkIGZvciBQT1NUIC9hcGkvaW5nZXN0L3Nlc3Npb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uRXZlbnRQYXlsb2FkIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGV2ZW50OiAnc3RhcnRlZCcgfCAnc3RvcHBlZCcgfCAnaGVhcnRiZWF0JztcbiAgcGlkOiBudW1iZXI7XG4gIHN0YXJ0ZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENhbGxiYWNrcyBwcm92aWRlZCBieSB0aGUgdW5pZmllZCBjb25zb2xlIG9yY2hlc3RyYXRvciBmb3IgYnJvYWRjYXN0aW5nXG4gKiBpbmdlc3RlZCBldmVudHMgdGhyb3VnaCB0aGUgZXhpc3RpbmcgU1NFIGluZnJhc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdEJyb2FkY2FzdHMge1xuICBsb2dCcm9hZGNhc3Q6IChlbnRyeTogVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkO1xuICBtZXRyaWNzT25TbmFwc2hvdD86IChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpID0+IHZvaWQ7XG4gIHNlc3Npb25Ccm9hZGNhc3Q/OiAoZXZlbnQ6IFNlc3Npb25JbmZvKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBjcmVhdGluZyBpbmdlc3Qgcm91dGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdFJvdXRlc1Jlc3VsdCB7XG4gIHJvdXRlcjogUm91dGVyO1xuICAvKiogR2V0IGFsbCB0cmFja2VkIHNlc3Npb25zICovXG4gIGdldFNlc3Npb25zOiAoKSA9PiBTZXNzaW9uSW5mb1tdO1xuICAvKiogUmVnaXN0ZXIgdGhlIGxlYWRlciBhcyBhIHNlc3Npb24gKi9cbiAgcmVnaXN0ZXJMZWFkZXJTZXNzaW9uOiAoc2Vzc2lvbklkOiBzdHJpbmcsIHBpZDogbnVtYmVyKSA9PiB2b2lkO1xuICAvKiogUmVnaXN0ZXIgdGhlIHdlYiBjb25zb2xlIGFzIGEgc2Vzc2lvbiBzbyB0aGUgaW5kaWNhdG9yIGlzIG5ldmVyIGVtcHR5ICgjMTgwNSkgKi9cbiAgcmVnaXN0ZXJDb25zb2xlU2Vzc2lvbjogKCkgPT4gdm9pZDtcbn1cblxuLyoqIE5vcm1hbGl6ZSBhIHN0cmluZyB2aWEgVW5pY29kZVZhbGlkYXRvciAoRE1DUC1TRUMtMDA0KSAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSW5wdXQoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHMpLm5vcm1hbGl6ZWRDb250ZW50O1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgaW5nZXN0aW9uIHJvdXRlcyBhbmQgc2Vzc2lvbiByZWdpc3RyeS5cbiAqXG4gKiBAcGFyYW0gYnJvYWRjYXN0cyAtIENhbGxiYWNrcyB0byBmb3J3YXJkIGluZ2VzdGVkIGV2ZW50cyB0byBTU0UgY2xpZW50c1xuICogQHJldHVybnMgUm91dGVyIGFuZCBzZXNzaW9uIG1hbmFnZW1lbnQgZnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmdlc3RSb3V0ZXMoYnJvYWRjYXN0czogSW5nZXN0QnJvYWRjYXN0cyk6IEluZ2VzdFJvdXRlc1Jlc3VsdCB7XG4gIGNvbnN0IHJvdXRlciA9IFJvdXRlcigpO1xuICBjb25zdCBzZXNzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBTZXNzaW9uSW5mbz4oKTtcbiAgY29uc3QgbmFtZVBvb2wgPSBuZXcgU2Vzc2lvbk5hbWVQb29sKCk7XG4gIGNvbnN0IHJhdGVMaW1pdGVyID0gbmV3IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlcihSQVRFX0xJTUlUX01BWCwgUkFURV9MSU1JVF9XSU5ET1dfTVMpO1xuXG4gIC8vIFNlc3Npb25zIHRoZSB1c2VyIGV4cGxpY2l0bHkga2lsbGVkIOKAlCBuZXZlciBjb21lIGJhY2sgKCMxODcwKS5cbiAgLy8gQ2xlYXJlZCBvbmx5IG9uIHNlcnZlciByZXN0YXJ0LCB3aGljaCBpcyBhcHByb3ByaWF0ZSBzaW5jZSB0aGF0J3MgYSBuZXcgY29udGV4dC5cbiAgY29uc3Qga2lsbGVkU2Vzc2lvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBTZXNzaW9ucyB3YWl0aW5nIGZvciBhIFBJRCBzbyB3ZSBjYW4gU0lHVEVSTSB0aGVtICgjMTg3MCkuXG4gIC8vIFdoZW4gdGhlIHVzZXIgZGlzbWlzc2VzIGEgcGlkPTAgb3JwaGFuLCB3ZSBhZGQgaXQgaGVyZS4gVGhlIG5leHQgaGVhcnRiZWF0XG4gIC8vIChldmVyeSAxMHMpIGNhcnJpZXMgdGhlIFBJRCDigJQgd2UgU0lHVEVSTSBpbW1lZGlhdGVseSBhbmQgbW92ZSB0byBraWxsZWRTZXNzaW9ucy5cbiAgY29uc3QgcGVuZGluZ0tpbGxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqIEV4ZWN1dGUgYSBkZWZlcnJlZCBraWxsIGlmIHdlIG5vdyBoYXZlIGEgUElELiAqL1xuICBmdW5jdGlvbiB0cnlFeGVjdXRlUGVuZGluZ0tpbGwoc2Vzc2lvbklkOiBzdHJpbmcsIHBpZD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGtpbGxQaWQgPSBwaWQgfHwgc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk/LnBpZDtcbiAgICBpZiAoIWtpbGxQaWQpIHJldHVybjtcbiAgICB0cnkgeyBwcm9jZXNzLmtpbGwoa2lsbFBpZCwgJ1NJR1RFUk0nKTsgfSBjYXRjaCB7IC8qIGFscmVhZHkgZGVhZCAqLyB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIERlZmVycmVkIGtpbGwgZXhlY3V0ZWQg4oCUIFBJRCBhcnJpdmVkJywge1xuICAgICAgZGlzcGxheU5hbWU6IGV4aXN0aW5nPy5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkLCBwaWQ6IGtpbGxQaWQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUHJvbW90ZSBhIHBlbmRpbmcga2lsbCB0byBwZXJtYW5lbnQuICovXG4gIGZ1bmN0aW9uIGZpbmFsaXplUGVuZGluZ0tpbGwoc2Vzc2lvbklkOiBzdHJpbmcsIHBpZD86IG51bWJlcik6IHZvaWQge1xuICAgIHRyeUV4ZWN1dGVQZW5kaW5nS2lsbChzZXNzaW9uSWQsIHBpZCk7XG4gICAgcGVuZGluZ0tpbGxzLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgIGtpbGxlZFNlc3Npb25zLmFkZChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBzZXNzaW9uIGVudHJ5IGZvciBhbiBvcnBoYW4uIFJldHVybnMgbnVsbCBvbiBmYWlsdXJlLiAqL1xuICBmdW5jdGlvbiBhdXRvUmVnaXN0ZXIoc2Vzc2lvbklkOiBzdHJpbmcsIHBpZD86IG51bWJlciwgYXV0aGVudGljYXRlZCA9IGZhbHNlKTogU2Vzc2lvbkluZm8gfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBuYW1lUG9vbC5hc3NpZ24oc2Vzc2lvbklkKTtcbiAgICAgIGNvbnN0IGNvbG9yID0gbmFtZVBvb2wuZ2V0Q29sb3Ioc2Vzc2lvbklkKSA/PyAnIzNiODJmNic7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCBpbmZvOiBTZXNzaW9uSW5mbyA9IHtcbiAgICAgICAgc2Vzc2lvbklkLCBkaXNwbGF5TmFtZSwgY29sb3IsXG4gICAgICAgIHBpZDogcGlkIHx8IDAsXG4gICAgICAgIHN0YXJ0ZWRBdDogbm93LCBsYXN0SGVhcnRiZWF0OiBub3csXG4gICAgICAgIHN0YXR1czogJ2FjdGl2ZScsIGlzTGVhZGVyOiBmYWxzZSwgYXV0aGVudGljYXRlZCwga2luZDogJ21jcCcsXG4gICAgICB9O1xuICAgICAgc2Vzc2lvbnMuc2V0KHNlc3Npb25JZCwgaW5mbyk7XG4gICAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gQXV0by1yZWdpc3RlcmVkIG9ycGhhbmVkIHNlc3Npb24nLCB7XG4gICAgICAgIGRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHNvdXJjZTogcGlkID8gJ2hlYXJ0YmVhdCcgOiAnaW5nZXN0aW9uJyxcbiAgICAgIH0pO1xuICAgICAgYnJvYWRjYXN0cy5zZXNzaW9uQnJvYWRjYXN0Py4oaW5mbyk7XG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0luZ2VzdFJvdXRlc10gRmFpbGVkIHRvIGF1dG8tcmVnaXN0ZXIgb3JwaGFuZWQgc2Vzc2lvbicsIHtcbiAgICAgICAgc2Vzc2lvbklkLCBlcnJvcjogKGVyciBhcyBFcnJvcikubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dG8tcmVnaXN0ZXIgb3IgdXBkYXRlIGFuIG9ycGhhbmVkIHNlc3Npb24gZnJvbSBpbmdlc3Rpb24gZGF0YS5cbiAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiAoZXhpc3Rpbmcgb3IgbmV3bHkgY3JlYXRlZCksIG9yIG51bGwgaWYga2lsbGVkL3BlbmRpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBlbnN1cmVTZXNzaW9uKHNlc3Npb25JZDogc3RyaW5nLCBwaWQ/OiBudW1iZXIsIGF1dGhlbnRpY2F0ZWQgPSBmYWxzZSk6IFNlc3Npb25JbmZvIHwgbnVsbCB7XG4gICAgaWYgKGtpbGxlZFNlc3Npb25zLmhhcyhzZXNzaW9uSWQpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAocGVuZGluZ0tpbGxzLmhhcyhzZXNzaW9uSWQpKSB7XG4gICAgICBmaW5hbGl6ZVBlbmRpbmdLaWxsKHNlc3Npb25JZCwgcGlkKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nID0gc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFleGlzdGluZykgcmV0dXJuIGF1dG9SZWdpc3RlcihzZXNzaW9uSWQsIHBpZCwgYXV0aGVudGljYXRlZCk7XG5cbiAgICBpZiAoZXhpc3Rpbmcuc3RhdHVzID09PSAnZW5kZWQnKSB7XG4gICAgICBleGlzdGluZy5zdGF0dXMgPSAnYWN0aXZlJztcbiAgICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBSZXZpdmVkIGVuZGVkIHNlc3Npb24gc3RpbGwgc2VuZGluZyBkYXRhJywge1xuICAgICAgICBkaXNwbGF5TmFtZTogZXhpc3RpbmcuZGlzcGxheU5hbWUsIHNlc3Npb25JZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBleGlzdGluZy5sYXN0SGVhcnRiZWF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGlmIChwaWQgJiYgIWV4aXN0aW5nLnBpZCkge1xuICAgICAgZXhpc3RpbmcucGlkID0gcGlkO1xuICAgICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIFJlY292ZXJlZCBQSUQgZm9yIG9ycGhhbmVkIHNlc3Npb24nLCB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiBleGlzdGluZy5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkLCBwaWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgLy8gSlNPTiBib2R5IHBhcnNpbmcgd2l0aCBzaXplIGxpbWl0XG4gIHJvdXRlci51c2UoZXhwcmVzcy5qc29uKHsgbGltaXQ6IE1BWF9QQVlMT0FEX1NJWkUgfSkpO1xuXG4gIC8qKlxuICAgKiBQT1NUIC9hcGkvaW5nZXN0L2xvZ3Mg4oCUIFJlY2VpdmUgYmF0Y2hlZCBsb2cgZW50cmllcyBmcm9tIGEgZm9sbG93ZXIuXG4gICAqL1xuICByb3V0ZXIucG9zdCgnL2FwaS9pbmdlc3QvbG9ncycsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXJhdGVMaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MjkpLmpzb24oeyBlcnJvcjogJ1JhdGUgbGltaXQgZXhjZWVkZWQnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQgPSByZXEuYm9keSBhcyBJbmdlc3RMb2dQYXlsb2FkO1xuICAgIGlmICghcGF5bG9hZD8uc2Vzc2lvbklkIHx8ICFBcnJheS5pc0FycmF5KHBheWxvYWQuZW50cmllcykpIHtcbiAgICAgIGNvbnN0IHJlY2VpdmVkID0gcGF5bG9hZCA/IE9iamVjdC5rZXlzKHBheWxvYWQpIDogW107XG4gICAgICBsb2dnZXIud2FybignW0luZ2VzdFJvdXRlc10gSW52YWxpZCBsb2cgcGF5bG9hZCcsIHsgcmVjZWl2ZWQsIGhhc1Nlc3Npb25JZDogISFwYXlsb2FkPy5zZXNzaW9uSWQsIGhhc0VudHJpZXM6IEFycmF5LmlzQXJyYXkocGF5bG9hZD8uZW50cmllcykgfSk7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnSW52YWxpZCBwYXlsb2FkJywgcmVxdWlyZWQ6IFsnc2Vzc2lvbklkJywgJ2VudHJpZXMnXSwgcmVjZWl2ZWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBheWxvYWQuc2Vzc2lvbklkID0gbm9ybWFsaXplSW5wdXQocGF5bG9hZC5zZXNzaW9uSWQpO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgc2tpcHBlZCA9IDA7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwYXlsb2FkLmVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5Lm1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7IHNraXBwZWQrKzsgY29udGludWU7IH1cbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgLi4uZW50cnksXG4gICAgICAgIGRhdGE6IHsgLi4uZW50cnkuZGF0YSwgX3Nlc3Npb25JZDogcGF5bG9hZC5zZXNzaW9uSWQgfSxcbiAgICAgIH07XG4gICAgICBicm9hZGNhc3RzLmxvZ0Jyb2FkY2FzdChzdGFtcGVkKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGhlYXJ0YmVhdCwgcmV2aXZlIGVuZGVkIHNlc3Npb25zLCBvciBhdXRvLXJlZ2lzdGVyIG9ycGhhbnMgKCMxODcwKVxuICAgIGNvbnN0IHNlc3Npb24gPSBlbnN1cmVTZXNzaW9uKHBheWxvYWQuc2Vzc2lvbklkKTtcblxuICAgIGlmIChza2lwcGVkID4gMCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbSW5nZXN0Um91dGVzXSBMb2cgaW5nZXN0IGZyb20gJHtzZXNzaW9uPy5kaXNwbGF5TmFtZSA/PyBwYXlsb2FkLnNlc3Npb25JZH06IGFjY2VwdGVkPSR7Y291bnR9LCBza2lwcGVkPSR7c2tpcHBlZH1gKTtcbiAgICB9XG5cbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7IGFjY2VwdGVkOiBjb3VudCwgc2tpcHBlZCB9KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9pbmdlc3QvbWV0cmljcyDigJQgUmVjZWl2ZSBtZXRyaWMgc25hcHNob3RzIGZyb20gYSBmb2xsb3dlci5cbiAgICovXG4gIHJvdXRlci5wb3N0KCcvYXBpL2luZ2VzdC9tZXRyaWNzJywgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmF0ZUxpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnUmF0ZSBsaW1pdCBleGNlZWRlZCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHJlcS5ib2R5IGFzIEluZ2VzdE1ldHJpY3NQYXlsb2FkO1xuICAgIGlmICghcGF5bG9hZD8uc2Vzc2lvbklkIHx8ICFwYXlsb2FkLnNuYXBzaG90KSB7XG4gICAgICBjb25zdCByZWNlaXZlZCA9IHBheWxvYWQgPyBPYmplY3Qua2V5cyhwYXlsb2FkKSA6IFtdO1xuICAgICAgbG9nZ2VyLndhcm4oJ1tJbmdlc3RSb3V0ZXNdIEludmFsaWQgbWV0cmljcyBwYXlsb2FkJywgeyByZWNlaXZlZCB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdJbnZhbGlkIHBheWxvYWQnLCByZXF1aXJlZDogWydzZXNzaW9uSWQnLCAnc25hcHNob3QnXSwgcmVjZWl2ZWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBheWxvYWQuc2Vzc2lvbklkID0gbm9ybWFsaXplSW5wdXQocGF5bG9hZC5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKGJyb2FkY2FzdHMubWV0cmljc09uU25hcHNob3QpIHtcbiAgICAgIGJyb2FkY2FzdHMubWV0cmljc09uU25hcHNob3QocGF5bG9hZC5zbmFwc2hvdCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGhlYXJ0YmVhdCwgcmV2aXZlIGVuZGVkIHNlc3Npb25zLCBvciBhdXRvLXJlZ2lzdGVyIG9ycGhhbnMgKCMxODcwKVxuICAgIGNvbnN0IHNlc3Npb24gPSBlbnN1cmVTZXNzaW9uKHBheWxvYWQuc2Vzc2lvbklkKTtcbiAgICBsb2dnZXIuZGVidWcoYFtJbmdlc3RSb3V0ZXNdIE1ldHJpY3MgaW5nZXN0ZWQgZnJvbSAke3Nlc3Npb24/LmRpc3BsYXlOYW1lID8/IHBheWxvYWQuc2Vzc2lvbklkfWApO1xuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgYWNjZXB0ZWQ6IHRydWUgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBQT1NUIC9hcGkvaW5nZXN0L3Nlc3Npb24g4oCUIFNlc3Npb24gbGlmZWN5Y2xlIGV2ZW50cy5cbiAgICovXG4gIHJvdXRlci5wb3N0KCcvYXBpL2luZ2VzdC9zZXNzaW9uJywgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSByZXEuYm9keSBhcyBTZXNzaW9uRXZlbnRQYXlsb2FkO1xuICAgIGlmICghcGF5bG9hZD8uc2Vzc2lvbklkIHx8ICFwYXlsb2FkLmV2ZW50KSB7XG4gICAgICBjb25zdCByZWNlaXZlZCA9IHBheWxvYWQgPyBPYmplY3Qua2V5cyhwYXlsb2FkKSA6IFtdO1xuICAgICAgbG9nZ2VyLndhcm4oJ1tJbmdlc3RSb3V0ZXNdIEludmFsaWQgc2Vzc2lvbiBldmVudCBwYXlsb2FkJywgeyByZWNlaXZlZCB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdJbnZhbGlkIHBheWxvYWQnLCByZXF1aXJlZDogWydzZXNzaW9uSWQnLCAnZXZlbnQnXSwgcmVjZWl2ZWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBheWxvYWQuc2Vzc2lvbklkID0gbm9ybWFsaXplSW5wdXQocGF5bG9hZC5zZXNzaW9uSWQpO1xuXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgc3dpdGNoIChwYXlsb2FkLmV2ZW50KSB7XG4gICAgICBjYXNlICdzdGFydGVkJzoge1xuICAgICAgICAvLyBLaWxsZWQgc2Vzc2lvbnMgc3RheSBkZWFkOyBwZW5kaW5nIGtpbGxzIGdldCBmaW5hbGl6ZWQgKCMxODcwKVxuICAgICAgICBpZiAoa2lsbGVkU2Vzc2lvbnMuaGFzKHBheWxvYWQuc2Vzc2lvbklkKSkgYnJlYWs7XG4gICAgICAgIGlmIChwZW5kaW5nS2lsbHMuaGFzKHBheWxvYWQuc2Vzc2lvbklkKSkgeyBmaW5hbGl6ZVBlbmRpbmdLaWxsKHBheWxvYWQuc2Vzc2lvbklkLCBwYXlsb2FkLnBpZCk7IGJyZWFrOyB9XG5cbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBuYW1lUG9vbC5hc3NpZ24ocGF5bG9hZC5zZXNzaW9uSWQpO1xuICAgICAgICBjb25zdCBjb2xvciA9IG5hbWVQb29sLmdldENvbG9yKHBheWxvYWQuc2Vzc2lvbklkKSA/PyAnIzNiODJmNic7XG4gICAgICAgIGNvbnN0IGlzQXV0aGVudGljYXRlZCA9IEJvb2xlYW4oKHJlcyBhcyBhbnkpLmxvY2Fscz8udG9rZW5FbnRyeSk7XG4gICAgICAgIHNlc3Npb25zLnNldChwYXlsb2FkLnNlc3Npb25JZCwge1xuICAgICAgICAgIHNlc3Npb25JZDogcGF5bG9hZC5zZXNzaW9uSWQsIGRpc3BsYXlOYW1lLCBjb2xvcixcbiAgICAgICAgICBwaWQ6IHBheWxvYWQucGlkLCBzdGFydGVkQXQ6IHBheWxvYWQuc3RhcnRlZEF0IHx8IG5vdywgbGFzdEhlYXJ0YmVhdDogbm93LFxuICAgICAgICAgIHN0YXR1czogJ2FjdGl2ZScsIGlzTGVhZGVyOiBmYWxzZSwgYXV0aGVudGljYXRlZDogaXNBdXRoZW50aWNhdGVkLCBraW5kOiAnbWNwJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBTZXNzaW9uIHJlZ2lzdGVyZWQnLCB7XG4gICAgICAgICAgZGlzcGxheU5hbWUsIHNlc3Npb25JZDogcGF5bG9hZC5zZXNzaW9uSWQsIHBpZDogcGF5bG9hZC5waWQsIGNvbG9yLFxuICAgICAgICAgIGFjdGl2ZVNlc3Npb25zOiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpLmxlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyb2FkY2FzdHMuc2Vzc2lvbkJyb2FkY2FzdD8uKHNlc3Npb25zLmdldChwYXlsb2FkLnNlc3Npb25JZCkhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdG9wcGVkJzoge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHNlc3Npb25zLmdldChwYXlsb2FkLnNlc3Npb25JZCk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgIGV4aXN0aW5nLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgICAgICAgZXhpc3RpbmcubGFzdEhlYXJ0YmVhdCA9IG5vdztcbiAgICAgICAgICBuYW1lUG9vbC5yZWxlYXNlKHBheWxvYWQuc2Vzc2lvbklkKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gU2Vzc2lvbiBzdG9wcGVkJywge1xuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGV4aXN0aW5nLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQ6IHBheWxvYWQuc2Vzc2lvbklkLCBwaWQ6IGV4aXN0aW5nLnBpZCxcbiAgICAgICAgICAgIGFjdGl2ZVNlc3Npb25zOiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpLmxlbmd0aCAtIDEsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJvYWRjYXN0cy5zZXNzaW9uQnJvYWRjYXN0Py4oZXhpc3RpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhcnRiZWF0Jzoge1xuICAgICAgICAvLyBBdXRvLXJlZ2lzdGVyIG9yIHVwZGF0ZSDigJQgaGVhcnRiZWF0IGluY2x1ZGVzIFBJRCBmb3IgcmVjb3ZlcnkgKCMxODcwKVxuICAgICAgICBlbnN1cmVTZXNzaW9uKHBheWxvYWQuc2Vzc2lvbklkLCBwYXlsb2FkLnBpZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgb2s6IHRydWUgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBHRVQgL2FwaS9zZXNzaW9ucyDigJQgTGlzdCBhbGwgdHJhY2tlZCBzZXNzaW9ucy5cbiAgICovXG4gIHJvdXRlci5nZXQoJy9hcGkvc2Vzc2lvbnMnLCBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIC8vIFNlcnZlci1zaWRlIGFjdGl2ZSBmaWx0ZXIg4oCUIHRoZSBmcm9udGVuZCBhbHNvIGZpbHRlcnMsIGJ1dCBlbmRlZCBzZXNzaW9uc1xuICAgIC8vIHNob3VsZCBuZXZlciBsZWF2ZSB0aGUgQVBJIHRvIHByZXZlbnQgc3RhbGUgVUkgKCMxODcwKS5cbiAgICBjb25zdCBsb2NhbFNlc3Npb25zID0gQXJyYXkuZnJvbShzZXNzaW9ucy52YWx1ZXMoKSkuZmlsdGVyKHMgPT4gcy5zdGF0dXMgPT09ICdhY3RpdmUnKTtcbiAgICBjb25zdCBjdXJyZW50UG9ydCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVCA/PyA0MTcxNTtcblxuICAgIC8vIEZlZGVyYXRlIHdpdGggdGhlIGxlZ2FjeSBwb3J0ICgzOTM5KSB0byBzaG93IGFsbCBzZXNzaW9ucyBvbiB0aGVcbiAgICAvLyBtYWNoaW5lLCBpbmNsdWRpbmcgdW5hdXRoZW50aWNhdGVkIG9uZXMgZnJvbSBwcmUtYXV0aCBpbnN0YWxscy5cbiAgICAvLyBTZXJ2ZXItdG8tc2VydmVyIGF2b2lkcyBDT1JTIHJlc3RyaWN0aW9ucyAoIzE4MDUpLlxuICAgIGlmIChjdXJyZW50UG9ydCAhPT0gMzkzOSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCBMRUdBQ1lfRkVUQ0hfVElNRU9VVF9NUyk7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVJlcyA9IGF3YWl0IGZldGNoKCdodHRwOi8vMTI3LjAuMC4xOjM5MzkvYXBpL3Nlc3Npb25zJywge1xuICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmIChsZWdhY3lSZXMub2spIHtcbiAgICAgICAgICBjb25zdCBsZWdhY3lEYXRhID0gYXdhaXQgbGVnYWN5UmVzLmpzb24oKSBhcyB7IHNlc3Npb25zOiBTZXNzaW9uSW5mb1tdIH07XG4gICAgICAgICAgY29uc3QgbG9jYWxJZHMgPSBuZXcgU2V0KGxvY2FsU2Vzc2lvbnMubWFwKHMgPT4gcy5zZXNzaW9uSWQpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGxzIG9mIChsZWdhY3lEYXRhLnNlc3Npb25zIHx8IFtdKSkge1xuICAgICAgICAgICAgaWYgKCFsb2NhbElkcy5oYXMobHMuc2Vzc2lvbklkKSAmJiBscy5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XG4gICAgICAgICAgICAgIGxvY2FsU2Vzc2lvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgLi4ubHMsXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAga2luZDogbHMua2luZCB8fCAnbWNwJyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTGVnYWN5IGluc3RhbmNlIG5vdCBydW5uaW5nIG9yIHVucmVhY2hhYmxlIOKAlCB0aGF0J3MgZmluZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJlcy5qc29uKHsgc2Vzc2lvbnM6IGxvY2FsU2Vzc2lvbnMgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBQT1NUIC9hcGkvc2Vzc2lvbnMvOnNlc3Npb25JZC9raWxsIOKAlCBUZXJtaW5hdGUgYSBzZXNzaW9uJ3Mgc2VydmVyIHByb2Nlc3MuXG4gICAqL1xuICByb3V0ZXIucG9zdCgnL2FwaS9zZXNzaW9ucy86c2Vzc2lvbklkL2tpbGwnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gcmVxLnBhcmFtc1snc2Vzc2lvbklkJ10gYXMgc3RyaW5nO1xuICAgIGNvbnN0IHNlc3Npb24gPSBzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcblxuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgLy8gU2Vzc2lvbiBub3QgaW4gbG9jYWwgTWFwIOKAlCB0cnkgcHJveHlpbmcga2lsbCB0byBsZWdhY3kgcG9ydCAoIzE4NzApXG4gICAgICBjb25zdCBjdXJyZW50UG9ydCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVCA/PyA0MTcxNTtcbiAgICAgIGlmIChjdXJyZW50UG9ydCAhPT0gMzkzOSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCBMRUdBQ1lfRkVUQ0hfVElNRU9VVF9NUyk7XG4gICAgICAgICAgY29uc3QgcHJveHlSZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovLzEyNy4wLjAuMTozOTM5L2FwaS9zZXNzaW9ucy8ke2VuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpfS9raWxsYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpZiAocHJveHlSZXMub2spIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwcm94eVJlcy5qc29uKCk7XG4gICAgICAgICAgICByZXMuanNvbihkYXRhKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIExlZ2FjeSBpbnN0YW5jZSBub3QgcnVubmluZyDigJQgZmFsbCB0aHJvdWdoIHRvIDQwNFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2dnZXIud2FybignW0luZ2VzdFJvdXRlc10gS2lsbCByZXF1ZXN0ZWQgZm9yIHVua25vd24gc2Vzc2lvbicsIHsgc2Vzc2lvbklkIH0pO1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogJ1Nlc3Npb24gbm90IGZvdW5kJywgc2Vzc2lvbklkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc2Vzc2lvbi5waWQpIHtcbiAgICAgIC8vIEF1dG8tcmVnaXN0ZXJlZCBvcnBoYW4gd2l0aCB1bmtub3duIFBJRCDigJQgcXVldWUgZm9yIGRlZmVycmVkIGtpbGwgKCMxODcwKS5cbiAgICAgIC8vIFRoZSBuZXh0IGhlYXJ0YmVhdCAoZXZlcnkgfjEwcykgY2FycmllcyB0aGUgUElELiBlbnN1cmVTZXNzaW9uKCkgd2lsbFxuICAgICAgLy8gU0lHVEVSTSB0aGUgcHJvY2VzcyBhcyBzb29uIGFzIHRoZSBQSUQgYXJyaXZlcy4gU2Vzc2lvbiBpcyBnb25lIGZvciBnb29kLlxuICAgICAgc2Vzc2lvbi5zdGF0dXMgPSAnZW5kZWQnO1xuICAgICAgbmFtZVBvb2wucmVsZWFzZShzZXNzaW9uSWQpO1xuICAgICAgcGVuZGluZ0tpbGxzLmFkZChzZXNzaW9uSWQpO1xuICAgICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIFF1ZXVlZCBkZWZlcnJlZCBraWxsIOKAlCB3YWl0aW5nIGZvciBQSUQgdmlhIGhlYXJ0YmVhdCcsIHtcbiAgICAgICAgZGlzcGxheU5hbWU6IHNlc3Npb24uZGlzcGxheU5hbWUsIHNlc3Npb25JZCxcbiAgICAgIH0pO1xuICAgICAgcmVzLmpzb24oeyBvazogdHJ1ZSwgZGlzbWlzc2VkOiBzZXNzaW9uLmRpc3BsYXlOYW1lLCByZWFzb246ICdwZW5kaW5nLWtpbGwnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNJR1RFUk0gdGhlIHByb2Nlc3MuIEV2ZW4gaWYgaXQgZmFpbHMgKEVTUkNIID0gYWxyZWFkeSBkZWFkLCBFUEVSTSA9IG5vdCBvdXJzKSxcbiAgICAvLyBtYXJrIHRoZSBzZXNzaW9uIGFzIHBlcm1hbmVudGx5IGtpbGxlZCBzbyBpdCBuZXZlciByZWFwcGVhcnMgKCMxODcwKS5cbiAgICBsZXQga2lsbGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChzZXNzaW9uLnBpZCwgJ1NJR1RFUk0nKTtcbiAgICAgIGtpbGxlZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBjb2RlID0gKGVyciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGU7XG4gICAgICBpZiAoY29kZSA9PT0gJ0VTUkNIJykge1xuICAgICAgICBraWxsZWQgPSB0cnVlOyAvLyBwcm9jZXNzIGFscmVhZHkgZGVhZCDigJQgdHJlYXQgYXMgc3VjY2Vzc2Z1bCBraWxsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1tJbmdlc3RSb3V0ZXNdIEZhaWxlZCB0byBraWxsIHNlc3Npb24nLCB7XG4gICAgICAgICAgZGlzcGxheU5hbWU6IHNlc3Npb24uZGlzcGxheU5hbWUsIHNlc3Npb25JZCwgcGlkOiBzZXNzaW9uLnBpZCwgZXJyb3I6IChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiAnRmFpbGVkIHRvIGtpbGwgc2Vzc2lvbicsIHNlc3Npb25JZCwgZGlzcGxheU5hbWU6IHNlc3Npb24uZGlzcGxheU5hbWUsIHBpZDogc2Vzc2lvbi5waWQsIGRldGFpbDogKGVyciBhcyBFcnJvcikubWVzc2FnZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXNzaW9uLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgbmFtZVBvb2wucmVsZWFzZShzZXNzaW9uSWQpO1xuICAgIGtpbGxlZFNlc3Npb25zLmFkZChzZXNzaW9uSWQpO1xuICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBTZXNzaW9uIGtpbGxlZCcsIHtcbiAgICAgIGRpc3BsYXlOYW1lOiBzZXNzaW9uLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHBpZDogc2Vzc2lvbi5waWQsXG4gICAgICBhY3RpdmVTZXNzaW9uczogQXJyYXkuZnJvbShzZXNzaW9ucy52YWx1ZXMoKSkuZmlsdGVyKHMgPT4gcy5zdGF0dXMgPT09ICdhY3RpdmUnKS5sZW5ndGggLSAxLFxuICAgIH0pO1xuICAgIHJlcy5qc29uKHsgb2s6IHRydWUsIGtpbGxlZDogc2Vzc2lvbi5kaXNwbGF5TmFtZSwgcGlkOiBzZXNzaW9uLnBpZCB9KTtcbiAgfSk7XG5cbiAgLyoqIE1hcmsgc3RhbGUgYWN0aXZlIHNlc3Npb25zIGFzIGVuZGVkLiAqL1xuICBmdW5jdGlvbiByZWFwU3RhbGVTZXNzaW9ucyhub3c6IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2lkLCBzZXNzaW9uXSBvZiBzZXNzaW9ucykge1xuICAgICAgaWYgKHNlc3Npb24uc3RhdHVzICE9PSAnYWN0aXZlJykgY29udGludWU7XG4gICAgICBpZiAoc2Vzc2lvbi5pc0xlYWRlciB8fCBzZXNzaW9uLmtpbmQgPT09ICdjb25zb2xlJykgY29udGludWU7XG4gICAgICBjb25zdCBhZ2UgPSBub3cgLSBuZXcgRGF0ZShzZXNzaW9uLmxhc3RIZWFydGJlYXQpLmdldFRpbWUoKTtcbiAgICAgIGlmIChhZ2UgPD0gU0VTU0lPTl9TVEFMRV9NUykgY29udGludWU7XG4gICAgICBzZXNzaW9uLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgICBuYW1lUG9vbC5yZWxlYXNlKGlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBSZWFwZWQgc3RhbGUgc2Vzc2lvbicsIHtcbiAgICAgICAgZGlzcGxheU5hbWU6IHNlc3Npb24uZGlzcGxheU5hbWUsIHNlc3Npb25JZDogaWQsIHBpZDogc2Vzc2lvbi5waWQsXG4gICAgICAgIGxhc3RIZWFydGJlYXRBZ286IGAke01hdGgucm91bmQoYWdlIC8gMTAwMCl9c2AsXG4gICAgICAgIGFjdGl2ZVNlc3Npb25zOiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpLmxlbmd0aCAtIDEsXG4gICAgICB9KTtcbiAgICAgIGJyb2FkY2FzdHMuc2Vzc2lvbkJyb2FkY2FzdD8uKHNlc3Npb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEZWxldGUgZW5kZWQgc2Vzc2lvbnMgdG8gYm91bmQgbWVtb3J5ICgjMTg3MCkuICovXG4gIGZ1bmN0aW9uIHB1cmdlU3RhbGVFbnRyaWVzKG5vdzogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbaWQsIHNlc3Npb25dIG9mIHNlc3Npb25zKSB7XG4gICAgICBpZiAoc2Vzc2lvbi5zdGF0dXMgPT09ICdlbmRlZCcgJiYgbm93IC0gbmV3IERhdGUoc2Vzc2lvbi5sYXN0SGVhcnRiZWF0KS5nZXRUaW1lKCkgPiBFTkRFRF9QVVJHRV9NUykge1xuICAgICAgICBzZXNzaW9ucy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlYXBlckludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgcmVhcFN0YWxlU2Vzc2lvbnMobm93KTtcbiAgICBwdXJnZVN0YWxlRW50cmllcyhub3cpO1xuICB9LCBSRUFQRVJfSU5URVJWQUxfTVMpO1xuICByZWFwZXJJbnRlcnZhbC51bnJlZigpO1xuXG4gIGZ1bmN0aW9uIGdldFNlc3Npb25zKCk6IFNlc3Npb25JbmZvW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVnaXN0ZXJMZWFkZXJTZXNzaW9uKHNlc3Npb25JZDogc3RyaW5nLCBwaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbmFtZVBvb2wuYXNzaWduKHNlc3Npb25JZCwgdHJ1ZSk7XG4gICAgY29uc3QgY29sb3IgPSBuYW1lUG9vbC5nZXRDb2xvcihzZXNzaW9uSWQpID8/ICcjM2I4MmY2JztcbiAgICBzZXNzaW9ucy5zZXQoc2Vzc2lvbklkLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIGNvbG9yLFxuICAgICAgcGlkLFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0SGVhcnRiZWF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgaXNMZWFkZXI6IHRydWUsXG4gICAgICBhdXRoZW50aWNhdGVkOiB0cnVlLFxuICAgICAga2luZDogJ21jcCcsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIExlYWRlciBzZXNzaW9uIHJlZ2lzdGVyZWQnLCB7IGRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHBpZCwgY29sb3IgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIHdlYiBjb25zb2xlIGl0c2VsZiBhcyBhIHNlc3Npb24gKCMxODA1KS4gRW5zdXJlcyB0aGVcbiAgICogc2Vzc2lvbiBpbmRpY2F0b3IgYWx3YXlzIHNob3dzIGF0IGxlYXN0IG9uZSBlbnRyeSDigJQgdGhlIGNvbnNvbGUgdGhlXG4gICAqIHVzZXIgaXMgY3VycmVudGx5IGxvb2tpbmcgYXQuXG4gICAqL1xuICBmdW5jdGlvbiByZWdpc3RlckNvbnNvbGVTZXNzaW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnNvbGVJZCA9IGBjb25zb2xlLSR7cHJvY2Vzcy5waWR9YDtcbiAgICBpZiAoc2Vzc2lvbnMuaGFzKGNvbnNvbGVJZCkpIHJldHVybjtcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9ICdXZWIgQ29uc29sZSc7XG4gICAgc2Vzc2lvbnMuc2V0KGNvbnNvbGVJZCwge1xuICAgICAgc2Vzc2lvbklkOiBjb25zb2xlSWQsXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIGNvbG9yOiAnIzYzNjZmMScsIC8vIGluZGlnbyDigJQgZGlzdGluY3QgZnJvbSBwdXBwZXQgZ3JlZW5zL2JsdWVzXG4gICAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0SGVhcnRiZWF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgaXNMZWFkZXI6IGZhbHNlLFxuICAgICAgYXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgIGtpbmQ6ICdjb25zb2xlJyxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gQ29uc29sZSBzZXNzaW9uIHJlZ2lzdGVyZWQnLCB7IHNlc3Npb25JZDogY29uc29sZUlkLCBwaWQ6IHByb2Nlc3MucGlkIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcm91dGVyLCBnZXRTZXNzaW9ucywgcmVnaXN0ZXJMZWFkZXJTZXNzaW9uLCByZWdpc3RlckNvbnNvbGVTZXNzaW9uIH07XG59XG4iXX0=
@@ -9,12 +9,25 @@
9
9
  * @since v2.1.0 — Issue #1700
10
10
  */
11
11
  /**
12
- * Pick a random puppet name from the pool, independent of the session
13
- * name assignment. Used by the console token module (#1780) to generate
14
- * a friendly default name for newly created tokens. Does not reserve the
15
- * name — multiple callers can receive the same value.
12
+ * Famous puppets, marionettes, and puppet characters from around the world.
13
+ * Order doesn't matter the pool is shuffled on startup.
16
14
  */
17
- export declare function pickRandomPuppetName(): string;
15
+ export declare const ALL_PUPPET_NAMES: readonly string[];
16
+ /**
17
+ * Iconic attire and accessories drawn from famous dolls, puppets, and
18
+ * theatrical characters throughout history. Used to name console tokens
19
+ * so they never collide with the session puppet-name pool (#1871).
20
+ *
21
+ * Names evoke costume pieces — a token is something you wear or carry,
22
+ * not a person.
23
+ */
24
+ export declare const ALL_TOKEN_NAMES: readonly string[];
25
+ /**
26
+ * Pick a random token name from the attire pool.
27
+ * Used by the console token module to name newly created tokens (#1871).
28
+ * Drawn from a separate pool to avoid collision with session puppet names.
29
+ */
30
+ export declare function pickRandomTokenName(): string;
18
31
  /**
19
32
  * Manages friendly session name assignment from the puppet name pool.
20
33
  */
@@ -1 +1 @@
1
- {"version":3,"file":"SessionNames.d.ts","sourceRoot":"","sources":["../../../src/web/console/SessionNames.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA6GH;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AA8ED;;GAEG;AACH,qBAAa,eAAe;IAC1B,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;;;OAKG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAuCnD;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAehC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK/C;;OAEG;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAI7B,OAAO,CAAC,cAAc;CAIvB"}
1
+ {"version":3,"file":"SessionNames.d.ts","sourceRoot":"","sources":["../../../src/web/console/SessionNames.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAmF7C,CAAC;AAiBF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAqD5C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AA8ED;;GAEG;AACH,qBAAa,eAAe;IAC1B,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;;;OAKG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAuCnD;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAehC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK/C;;OAEG;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAI7B,OAAO,CAAC,cAAc;CAIvB"}