@workflow/world-local 5.0.0-beta.23 → 5.0.0-beta.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/streamer.js CHANGED
@@ -49,14 +49,29 @@ function addChunkFilesByExtension(extMap, entries, sourceExtension, fileExtensio
49
49
  }
50
50
  }
51
51
  /**
52
- * List chunk files for a stream, sorted chronologically (ULID order).
53
- * Returns both the sorted file names and a map of file → extension for
54
- * resolving the full path. Handles tagged and legacy (.json) formats.
52
+ * Resolve the per-stream chunk directory. Chunks are sharded one directory
53
+ * per stream (`streams/chunks/<streamName>/`) so that listing a stream's
54
+ * chunks costs O(chunks in that stream) rather than O(chunks in the whole
55
+ * world). A tail reader polling for new chunks would otherwise `readdir` the
56
+ * entire global chunks directory every 100ms — see vercel/workflow#2797.
55
57
  */
56
- async function listChunkFilesForStream(chunksDir, name, tag) {
57
- // Name is used as a filename prefix below; validate it can't escape chunksDir.
58
+ function chunkDirForStream(chunksBaseDir, name) {
59
+ // Name becomes a path segment below; validate it can't escape chunksBaseDir.
58
60
  assertSafeEntityId('streamName', name);
59
- const entries = await listChunkEntries(chunksDir);
61
+ return path.join(chunksBaseDir, name);
62
+ }
63
+ /**
64
+ * List chunk files for a stream, sorted chronologically (ULID order).
65
+ * Returns the sorted chunk keys (each key is the chunk ULID), a map of
66
+ * key → extension for resolving the full path, and the per-stream directory
67
+ * the files live in. Handles tagged and legacy (.json) formats.
68
+ *
69
+ * Files are stored per-stream (`<chunkDir>/<chunkId><tagSuffix>.bin`), so the
70
+ * key returned here is already the chunk id — no stream-name prefix to strip.
71
+ */
72
+ async function listChunkFilesForStream(chunksBaseDir, name, tag) {
73
+ const dir = chunkDirForStream(chunksBaseDir, name);
74
+ const entries = await listChunkEntries(dir);
60
75
  const extMap = new Map();
61
76
  addChunkFilesByExtension(extMap, entries, '.json');
62
77
  addChunkFilesByExtension(extMap, entries, '.bin', '.bin', tag ? (file) => !file.endsWith(`.${tag}`) : undefined);
@@ -64,10 +79,8 @@ async function listChunkFilesForStream(chunksDir, name, tag) {
64
79
  const taggedExtension = `.${tag}.bin`;
65
80
  addChunkFilesByExtension(extMap, entries, taggedExtension);
66
81
  }
67
- const files = [...extMap.keys()]
68
- .filter((file) => file.startsWith(`${name}-`))
69
- .sort();
70
- return { files, extMap };
82
+ const files = [...extMap.keys()].sort();
83
+ return { files, extMap, dir };
71
84
  }
72
85
  export function createStreamer(basedir, tag) {
73
86
  const tagSuffix = tag ? `.${tag}` : '';
@@ -122,7 +135,7 @@ export function createStreamer(basedir, tag) {
122
135
  chunk: chunkBuffer,
123
136
  eof: false,
124
137
  });
125
- const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}${tagSuffix}.bin`);
138
+ const chunkPath = path.join(chunkDirForStream(path.join(basedir, 'streams', 'chunks'), name), `${chunkId}${tagSuffix}.bin`);
126
139
  await write(chunkPath, serialized);
127
140
  // Emit real-time event with Uint8Array (create copy to prevent ArrayBuffer detachment)
128
141
  const chunkData = Uint8Array.from(chunkBuffer);
@@ -151,7 +164,7 @@ export function createStreamer(basedir, tag) {
151
164
  chunk: chunkBuffer,
152
165
  eof: false,
153
166
  });
154
- const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}${tagSuffix}.bin`);
167
+ const chunkPath = path.join(chunkDirForStream(path.join(basedir, 'streams', 'chunks'), name), `${chunkId}${tagSuffix}.bin`);
155
168
  await write(chunkPath, serialized);
156
169
  // Return data needed for event emission
157
170
  return {
@@ -177,7 +190,7 @@ export function createStreamer(basedir, tag) {
177
190
  const runId = await _runId;
178
191
  // Register this stream for the run (in case write wasn't called)
179
192
  await registerStreamForRun(runId, name);
180
- const chunkPath = path.join(basedir, 'streams', 'chunks', `${name}-${chunkId}${tagSuffix}.bin`);
193
+ const chunkPath = path.join(chunkDirForStream(path.join(basedir, 'streams', 'chunks'), name), `${chunkId}${tagSuffix}.bin`);
181
194
  await write(chunkPath, serializeChunk({ chunk: Buffer.from([]), eof: true }));
182
195
  streamEmitter.emit(`close:${name}`, { streamName: name });
183
196
  },
@@ -188,8 +201,8 @@ export function createStreamer(basedir, tag) {
188
201
  },
189
202
  async getChunks(_runId, name, options) {
190
203
  const limit = options?.limit ?? 100;
191
- const chunksDir = path.join(basedir, 'streams', 'chunks');
192
- const { files: chunkFiles, extMap: fileExtMap } = await listChunkFilesForStream(chunksDir, name, tag);
204
+ const chunksBaseDir = path.join(basedir, 'streams', 'chunks');
205
+ const { files: chunkFiles, extMap: fileExtMap, dir: chunksDir, } = await listChunkFilesForStream(chunksBaseDir, name, tag);
193
206
  // Decode cursor
194
207
  let startIndex = 0;
195
208
  if (options?.cursor) {
@@ -255,8 +268,8 @@ export function createStreamer(basedir, tag) {
255
268
  };
256
269
  },
257
270
  async getInfo(_runId, name) {
258
- const chunksDir = path.join(basedir, 'streams', 'chunks');
259
- const { files: chunkFiles, extMap: fileExtMap } = await listChunkFilesForStream(chunksDir, name, tag);
271
+ const chunksBaseDir = path.join(basedir, 'streams', 'chunks');
272
+ const { files: chunkFiles, extMap: fileExtMap, dir: chunksDir, } = await listChunkFilesForStream(chunksBaseDir, name, tag);
260
273
  // Read only the EOF marker byte because metadata never needs payloads.
261
274
  let streamDone = false;
262
275
  let dataCount = 0;
@@ -271,9 +284,19 @@ export function createStreamer(basedir, tag) {
271
284
  return { tailIndex: dataCount - 1, done: streamDone };
272
285
  },
273
286
  async get(_runId, name, startIndex = 0) {
274
- const chunksDir = path.join(basedir, 'streams', 'chunks');
275
- let removeListeners = () => { };
287
+ const chunksBaseDir = path.join(basedir, 'streams', 'chunks');
288
+ // Tears down everything the reader holds open: both emitter listeners
289
+ // and the filesystem poll interval. Assigned once listeners are wired
290
+ // up in start(); called on cancel() and on terminal (EOF/close) paths.
291
+ // Kept robust (unconditional) so a cancel() while still reading from
292
+ // disk can't leak a listener/poll — a signal-bearing step opens one of
293
+ // these readers per invocation, so any leak accumulates fast.
294
+ let teardown = () => { };
276
295
  let pollInterval = null;
296
+ // Set when the controller is closed/cancelled; guards against
297
+ // enqueue-after-close in the polling callback when teardown fires
298
+ // mid-iteration.
299
+ let streamClosed = false;
277
300
  return new ReadableStream({
278
301
  async start(controller) {
279
302
  // Track chunks delivered via events to prevent duplicates and maintain order.
@@ -283,9 +306,6 @@ export function createStreamer(basedir, tag) {
283
306
  let isReadingFromDisk = true;
284
307
  // Buffer close event if it arrives during disk reading
285
308
  let pendingClose = false;
286
- // Set when the controller is closed; guards against enqueue-after-close
287
- // in the polling callback when closeListener fires mid-iteration.
288
- let streamClosed = false;
289
309
  const chunkListener = (event) => {
290
310
  // Skip empty chunks to maintain consistency with disk reading behavior
291
311
  if (event.chunkData.byteLength === 0) {
@@ -318,12 +338,7 @@ export function createStreamer(basedir, tag) {
318
338
  }
319
339
  // Remove listeners before closing
320
340
  streamClosed = true;
321
- streamEmitter.off(`chunk:${name}`, chunkListener);
322
- streamEmitter.off(`close:${name}`, closeListener);
323
- if (pollInterval) {
324
- clearInterval(pollInterval);
325
- pollInterval = null;
326
- }
341
+ teardown();
327
342
  try {
328
343
  controller.close();
329
344
  }
@@ -331,12 +346,22 @@ export function createStreamer(basedir, tag) {
331
346
  // Ignore if controller is already closed (e.g., from cancel() or EOF)
332
347
  }
333
348
  };
334
- removeListeners = closeListener;
349
+ // Tear down listeners and the poll unconditionally. Unlike
350
+ // closeListener this never defers on isReadingFromDisk, so cancel()
351
+ // reliably releases the reader even mid-disk-read.
352
+ teardown = () => {
353
+ streamEmitter.off(`chunk:${name}`, chunkListener);
354
+ streamEmitter.off(`close:${name}`, closeListener);
355
+ if (pollInterval) {
356
+ clearInterval(pollInterval);
357
+ pollInterval = null;
358
+ }
359
+ };
335
360
  // Set up listeners FIRST to avoid missing events
336
361
  streamEmitter.on(`chunk:${name}`, chunkListener);
337
362
  streamEmitter.on(`close:${name}`, closeListener);
338
363
  // Now load existing chunks from disk.
339
- const { files: chunkFiles, extMap: fileExtMap } = await listChunkFilesForStream(chunksDir, name, tag);
364
+ const { files: chunkFiles, extMap: fileExtMap, dir: chunksDir, } = await listChunkFilesForStream(chunksBaseDir, name, tag);
340
365
  // Resolve negative startIndex relative to the number of data chunks
341
366
  // (excluding the trailing EOF marker chunk, if present).
342
367
  let dataChunkCount = chunkFiles.length;
@@ -356,12 +381,9 @@ export function createStreamer(basedir, tag) {
356
381
  let isComplete = false;
357
382
  for (let i = resolvedStartIndex; i < chunkFiles.length; i++) {
358
383
  const file = chunkFiles[i];
359
- // Extract chunk ID from filename: "streamName-chunkId" or "streamName-chunkId.tag"
360
- const rawChunkId = file.substring(name.length + 1);
361
- // Strip tag suffix (e.g., "chnk_ULID.vitest-0" → "chnk_ULID")
362
- const chunkId = tag
363
- ? rawChunkId.replace(`.${tag}`, '')
364
- : rawChunkId;
384
+ // Files are sharded per stream, so the key is already the chunk id
385
+ // (no stream-name prefix, tag suffix already stripped).
386
+ const chunkId = file;
365
387
  // Skip if already delivered via event
366
388
  if (deliveredChunkIds.has(chunkId)) {
367
389
  continue;
@@ -388,7 +410,8 @@ export function createStreamer(basedir, tag) {
388
410
  controller.enqueue(Uint8Array.from(buffered.chunkData));
389
411
  }
390
412
  if (isComplete) {
391
- removeListeners();
413
+ streamClosed = true;
414
+ teardown();
392
415
  try {
393
416
  controller.close();
394
417
  }
@@ -399,8 +422,8 @@ export function createStreamer(basedir, tag) {
399
422
  }
400
423
  // Process any pending close event that arrived during disk reading
401
424
  if (pendingClose) {
402
- streamEmitter.off(`chunk:${name}`, chunkListener);
403
- streamEmitter.off(`close:${name}`, closeListener);
425
+ streamClosed = true;
426
+ teardown();
404
427
  try {
405
428
  controller.close();
406
429
  }
@@ -411,12 +434,16 @@ export function createStreamer(basedir, tag) {
411
434
  }
412
435
  // Track pre-startIndex chunks so polling doesn't re-deliver them
413
436
  for (let i = 0; i < resolvedStartIndex && i < chunkFiles.length; i++) {
414
- const file = chunkFiles[i];
415
- const rawChunkId = file.substring(name.length + 1);
416
- const chunkId = tag
417
- ? rawChunkId.replace(`.${tag}`, '')
418
- : rawChunkId;
419
- deliveredChunkIds.add(chunkId);
437
+ // Files are sharded per stream: the key is already the chunk id.
438
+ deliveredChunkIds.add(chunkFiles[i]);
439
+ }
440
+ // If the reader was already cancelled/closed while we were reading
441
+ // from disk above (start() yields at every await), don't arm the
442
+ // poll — cancel()'s teardown ran before this point and would leave
443
+ // the freshly-created interval orphaned.
444
+ if (streamClosed) {
445
+ teardown();
446
+ return;
420
447
  }
421
448
  // Start filesystem polling for cross-process streaming support.
422
449
  // The EventEmitter only works in-process; when the writer is in a
@@ -428,12 +455,10 @@ export function createStreamer(basedir, tag) {
428
455
  return;
429
456
  isPolling = true;
430
457
  try {
431
- const { files: currentFiles, extMap: currentExtMap } = await listChunkFilesForStream(chunksDir, name, tag);
458
+ const { files: currentFiles, extMap: currentExtMap } = await listChunkFilesForStream(chunksBaseDir, name, tag);
432
459
  for (const file of currentFiles) {
433
- const rawChunkId = file.substring(name.length + 1);
434
- const chunkId = tag
435
- ? rawChunkId.replace(`.${tag}`, '')
436
- : rawChunkId;
460
+ // Files are sharded per stream: the key is already the chunk id.
461
+ const chunkId = file;
437
462
  if (deliveredChunkIds.has(chunkId))
438
463
  continue;
439
464
  deliveredChunkIds.add(chunkId);
@@ -441,12 +466,7 @@ export function createStreamer(basedir, tag) {
441
466
  const chunk = deserializeChunk(await readBuffer(path.join(chunksDir, `${file}${ext}`)));
442
467
  if (chunk?.eof === true) {
443
468
  streamClosed = true;
444
- if (pollInterval) {
445
- clearInterval(pollInterval);
446
- pollInterval = null;
447
- }
448
- streamEmitter.off(`chunk:${name}`, chunkListener);
449
- streamEmitter.off(`close:${name}`, closeListener);
469
+ teardown();
450
470
  try {
451
471
  controller.close();
452
472
  }
@@ -477,15 +497,12 @@ export function createStreamer(basedir, tag) {
477
497
  }, 100);
478
498
  },
479
499
  cancel() {
480
- removeListeners();
481
- if (pollInterval) {
482
- clearInterval(pollInterval);
483
- pollInterval = null;
484
- }
500
+ streamClosed = true;
501
+ teardown();
485
502
  },
486
503
  });
487
504
  },
488
505
  },
489
506
  };
490
507
  }
491
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RyZWFtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFPN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLFNBQVMsQ0FBQztBQUVqQiwyRUFBMkU7QUFDM0Usa0RBQWtEO0FBQ2xELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTVELDZDQUE2QztBQUM3QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzdCLENBQUMsQ0FBQztBQWNILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVyQixTQUFTLFNBQVMsQ0FBQyxJQUF3QjtJQUN6QyxPQUFPLElBQUksS0FBSyxVQUFVLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBWTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sTUFBTSxD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LENBQUM7b0NBQVMsQ0FBQztnQ0FDVCxTQUFTLEdBQUcsS0FBSyxDQUFDOzRCQUNwQixDQUFDO3dCQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDVixDQUFDO29CQUVELE1BQU07d0JBQ0osZUFBZSxFQUFFLENBQUM7d0JBQ2xCLElBQUksWUFBWSxFQUFFLENBQUM7NEJBQ2pCLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQzs0QkFDNUIsWUFBWSxHQUFHLElBQUksQ0FBQzt3QkFDdEIsQ0FBQztvQkFDSCxDQUFDO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0Q2h1bmtzT3B0aW9ucyxcbiAgU3RyZWFtQ2h1bmtzUmVzcG9uc2UsXG4gIFN0cmVhbWVyLFxuICBTdHJlYW1JbmZvUmVzcG9uc2UsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgcmVhZEJ1ZmZlcixcbiAgcmVhZEZpcnN0Qnl0ZSxcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHRhZ2dlZFBhdGgsXG4gIHdyaXRlLFxuICB3cml0ZUpTT04sXG59IGZyb20gJy4vZnMuanMnO1xuXG4vLyBDcmVhdGUgYSBtb25vdG9uaWMgVUxJRCBmYWN0b3J5IHRoYXQgZW5zdXJlcyBVTElEcyBhcmUgYWx3YXlzIGluY3JlYXNpbmdcbi8vIGV2ZW4gd2hlbiBnZW5lcmF0ZWQgd2l0aGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kXG5jb25zdCBtb25vdG9uaWNVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLy8gU2NoZW1hIGZvciB0aGUgcnVuLXRvLXN0cmVhbXMgbWFwcGluZyBmaWxlXG5jb25zdCBSdW5TdHJlYW1zU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdHJlYW1zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxufSk7XG5cbi8qKlxuICogQSBjaHVuayBjb25zaXN0cyBvZiBhIGJvb2xlYW4gYGVvZmAgaW5kaWNhdGluZyBpZiBpdCdzIHRoZSBsYXN0IGNodW5rLFxuICogYW5kIGEgYGNodW5rYCB3aGljaCBpcyBhIEJ1ZmZlciBvZiBkYXRhLlxuICogVGhlIHNlcmlhbGl6ZWQgZm9ybWF0IGlzOlxuICogLSAxIGJ5dGUgZm9yIGBlb2ZgICgwIG9yIDEpXG4gKiAtIGFuZCB0aGUgcmVzdCBpcyB0aGUgY2h1bmsgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaHVuayB7XG4gIGVvZjogYm9vbGVhbjtcbiAgY2h1bms6IEJ1ZmZlcjtcbn1cblxuY29uc3QgRU9GX01BUktFUiA9IDE7XG5cbmZ1bmN0aW9uIGlzRW9mQnl0ZShieXRlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJ5dGUgPT09IEVPRl9NQVJLRVI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDaHVuayhjaHVuazogQ2h1bmspIHtcbiAgY29uc3QgZW9mQnl0ZSA9IEJ1ZmZlci5mcm9tKFtjaHVuay5lb2YgPyBFT0ZfTUFSS0VSIDogMF0pO1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbZW9mQnl0ZSwgY2h1bmsuY2h1bmtdKTtcbn1cblxuLyoqIENoZWNrIG9ubHkgdGhlIEVPRiBmbGFnIGJ5dGUgd2l0aG91dCBjb3B5aW5nIGNodW5rIHBheWxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFb2ZDaHVuayhzZXJpYWxpemVkOiBCdWZmZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRW9mQnl0ZShzZXJpYWxpemVkWzBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQ2h1bmsoc2VyaWFsaXplZDogQnVmZmVyKSB7XG4gIGNvbnN0IGVvZiA9IGlzRW9mQ2h1bmsoc2VyaWFsaXplZCk7XG4gIC8vIENyZWF0ZSBhIGNvcHkgaW5zdGVhZCBvZiBhIHZpZXcgdG8gcHJldmVudCBBcnJheUJ1ZmZlciBkZXRhY2htZW50XG4gIGNvbnN0IGNodW5rID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZC5zdWJhcnJheSgxKSk7XG4gIHJldHVybiB7IGVvZiwgY2h1bmsgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdENodW5rRW50cmllcyhjaHVua3NEaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZGRpcihjaHVua3NEaXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENodW5rRmlsZXNCeUV4dGVuc2lvbihcbiAgZXh0TWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBlbnRyaWVzOiBzdHJpbmdbXSxcbiAgc291cmNlRXh0ZW5zaW9uOiBzdHJpbmcsXG4gIGZpbGVFeHRlbnNpb24gPSBzb3VyY2VFeHRlbnNpb24sXG4gIGluY2x1ZGU6IChmaWxlOiBzdHJpbmcpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5lbmRzV2l0aChzb3VyY2VFeHRlbnNpb24pKSBjb250aW51ZTtcbiAgICBjb25zdCBmaWxlID0gZW50cnkuc2xpY2UoMCwgLXNvdXJjZUV4dGVuc2lvbi5sZW5ndGgpO1xuICAgIGlmIChpbmNsdWRlKGZpbGUpKSBleHRNYXAuc2V0KGZpbGUsIGZpbGVFeHRlbnNpb24pO1xuICB9XG59XG5cbi8qKlxuICogTGlzdCBjaHVuayBmaWxlcyBmb3IgYSBzdHJlYW0sIHNvcnRlZCBjaHJvbm9sb2dpY2FsbHkgKFVMSUQgb3JkZXIpLlxuICogUmV0dXJucyBib3RoIHRoZSBzb3J0ZWQgZmlsZSBuYW1lcyBhbmQgYSBtYXAgb2YgZmlsZSDihpIgZXh0ZW5zaW9uIGZvclxuICogcmVzb2x2aW5nIHRoZSBmdWxsIHBhdGguIEhhbmRsZXMgdGFnZ2VkIGFuZCBsZWdhY3kgKC5qc29uKSBmb3JtYXRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0Q2h1bmtGaWxlc0ZvclN0cmVhbShcbiAgY2h1bmtzRGlyOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPHsgZmlsZXM6IHN0cmluZ1tdOyBleHRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gfT4ge1xuICAvLyBOYW1lIGlzIHVzZWQgYXMgYSBmaWxlbmFtZSBwcmVmaXggYmVsb3c7IHZhbGlkYXRlIGl0IGNhbid0IGVzY2FwZSBjaHVua3NEaXIuXG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIG5hbWUpO1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgbGlzdENodW5rRW50cmllcyhjaHVua3NEaXIpO1xuICBjb25zdCBleHRNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBhZGRDaHVua0ZpbGVzQnlFeHRlbnNpb24oZXh0TWFwLCBlbnRyaWVzLCAnLmpzb24nKTtcbiAgYWRkQ2h1bmtGaWxlc0J5RXh0ZW5zaW9uKFxuICAgIGV4dE1hcCxcbiAgICBlbnRyaWVzLFxuICAgICcuYmluJyxcbiAgICAnLmJpbicsXG4gICAgdGFnID8gKGZpbGUpID0+ICFmaWxlLmVuZHNXaXRoKGAuJHt0YWd9YCkgOiB1bmRlZmluZWRcbiAgKTtcblxuICBpZiAodGFnKSB7XG4gICAgY29uc3QgdGFnZ2VkRXh0ZW5zaW9uID0gYC4ke3RhZ30uYmluYDtcbiAgICBhZGRDaHVua0ZpbGVzQnlFeHRlbnNpb24oZXh0TWFwLCBlbnRyaWVzLCB0YWdnZWRFeHRlbnNpb24pO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBbLi4uZXh0TWFwLmtleXMoKV1cbiAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnN0YXJ0c1dpdGgoYCR7bmFtZX0tYCkpXG4gICAgLnNvcnQoKTtcblxuICByZXR1cm4geyBmaWxlcywgZXh0TWFwIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdHJlYW1lcihiYXNlZGlyOiBzdHJpbmcsIHRhZz86IHN0cmluZyk6IFN0cmVhbWVyIHtcbiAgY29uc3QgdGFnU3VmZml4ID0gdGFnID8gYC4ke3RhZ31gIDogJyc7XG4gIGNvbnN0IHN0cmVhbUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBba2V5OiBgY2h1bms6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgIH0sXG4gICAgXTtcbiAgICBba2V5OiBgY2xvc2U6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgfSxcbiAgICBdO1xuICB9PigpO1xuXG4gIC8vIFRyYWNrIHdoaWNoIHN0cmVhbXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgYSBydW4gKGluLW1lbW9yeSBjYWNoZSlcbiAgY29uc3QgcmVnaXN0ZXJlZFN0cmVhbXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBIZWxwZXIgdG8gcmVjb3JkIHRoZSBydW5JZCA8PiBzdHJlYW1JZCBhc3NvY2lhdGlvblxuICBhc3luYyBmdW5jdGlvbiByZWdpc3RlclN0cmVhbUZvclJ1bihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHN0cmVhbU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIHN0cmVhbU5hbWUpO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7cnVuSWR9OiR7c3RyZWFtTmFtZX1gO1xuICAgIGlmIChyZWdpc3RlcmVkU3RyZWFtcy5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGlzIHNlc3Npb25cbiAgICB9XG5cbiAgICBjb25zdCBydW5TdHJlYW1zUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0cmVhbXMvcnVucycsIHJ1bklkLCB0YWcpO1xuXG4gICAgLy8gUmVhZCBleGlzdGluZyBzdHJlYW1zIGZvciB0aGlzIHJ1biAodHJ5IHRhZ2dlZCBmaXJzdCwgZmFsbCBiYWNrIHRvIHVudGFnZ2VkKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICBiYXNlZGlyLFxuICAgICAgJ3N0cmVhbXMvcnVucycsXG4gICAgICBydW5JZCxcbiAgICAgIFJ1blN0cmVhbXNTY2hlbWEsXG4gICAgICB0YWdcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbXMgPSBleGlzdGluZz8uc3RyZWFtcyA/PyBbXTtcblxuICAgIC8vIEFkZCBzdHJlYW0gaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgIGlmICghc3RyZWFtcy5pbmNsdWRlcyhzdHJlYW1OYW1lKSkge1xuICAgICAgc3RyZWFtcy5wdXNoKHN0cmVhbU5hbWUpO1xuICAgICAgYXdhaXQgd3JpdGVKU09OKHJ1blN0cmVhbXNQYXRoLCB7IHN0cmVhbXMgfSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJlZFN0cmVhbXMuYWRkKGNhY2hlS2V5KTtcbiAgfVxuXG4gIC8vIEhlbHBlciB0byBjb252ZXJ0IGEgY2h1bmsgdG8gYSBCdWZmZXJcbiAgZnVuY3Rpb24gdG9CdWZmZXIoY2h1bms6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBCdWZmZXIge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20obmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKSk7XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGNodW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RyZWFtczoge1xuICAgICAgYXN5bmMgd3JpdGUoXG4gICAgICAgIF9ydW5JZDogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+LFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5XG4gICAgICApIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgVUxJRCBzeW5jaHJvbm91c2x5IEJFRk9SRSBhbnkgYXdhaXQgdG8gcHJlc2VydmUgY2FsbCBvcmRlci5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgY2h1bmtzIHdyaXR0ZW4gaW4gc2VxdWVuY2UgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlblxuICAgICAgICAvLyB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZSB0aGF0IG11bHRpcGxlIHdyaXRlcyBhcmUgd2FpdGluZyBvbi5cbiAgICAgICAgY29uc3QgY2h1bmtJZCA9IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWA7XG5cbiAgICAgICAgLy8gQXdhaXQgcnVuSWQgaWYgaXQncyBhIHByb21pc2UgdG8gZW5zdXJlIHByb3BlciBmbHVzaGluZ1xuICAgICAgICBjb25zdCBydW5JZCA9IGF3YWl0IF9ydW5JZDtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGlzIHN0cmVhbSBmb3IgdGhlIHJ1blxuICAgICAgICBhd2FpdCByZWdpc3RlclN0cmVhbUZvclJ1bihydW5JZCwgbmFtZSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBjaHVuayB0byBidWZmZXIgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3QgY2h1bmtCdWZmZXIgPSB0b0J1ZmZlcihjaHVuayk7XG5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZUNodW5rKHtcbiAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgZW9mOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgJ3N0cmVhbXMnLFxuICAgICAgICAgICdjaHVua3MnLFxuICAgICAgICAgIGAke25hbWV9LSR7Y2h1bmtJZH0ke3RhZ1N1ZmZpeH0uYmluYFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHdyaXRlKGNodW5rUGF0aCwgc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLy8gRW1pdCByZWFsLXRpbWUgZXZlbnQgd2l0aCBVaW50OEFycmF5IChjcmVhdGUgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnQpXG4gICAgICAgIGNvbnN0IGNodW5rRGF0YSA9IFVpbnQ4QXJyYXkuZnJvbShjaHVua0J1ZmZlcik7XG5cbiAgICAgICAgc3RyZWFtRW1pdHRlci5lbWl0KGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwge1xuICAgICAgICAgIHN0cmVhbU5hbWU6IG5hbWUsXG4gICAgICAgICAgY2h1bmtEYXRhLFxuICAgICAgICAgIGNodW5rSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgd3JpdGVNdWx0aShcbiAgICAgICAgX3J1bklkOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4sXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgY2h1bmtzOiAoc3RyaW5nIHwgVWludDhBcnJheSlbXVxuICAgICAgKSB7XG4gICAgICAgIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYWxsIFVMSURzIHN5bmNocm9ub3VzbHkgQkVGT1JFIGFueSBhd2FpdCB0byBwcmVzZXJ2ZSBjYWxsIG9yZGVyLlxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBjaHVua3MgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlbiB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZS5cbiAgICAgICAgY29uc3QgY2h1bmtJZHMgPSBjaHVua3MubWFwKCgpID0+IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWApO1xuXG4gICAgICAgIC8vIEF3YWl0IHJ1bklkIGlmIGl0J3MgYSBwcm9taXNlXG4gICAgICAgIGNvbnN0IHJ1bklkID0gYXdhaXQgX3J1bklkO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoaXMgc3RyZWFtIGZvciB0aGUgcnVuXG4gICAgICAgIGF3YWl0IHJlZ2lzdGVyU3RyZWFtRm9yUnVuKHJ1bklkLCBuYW1lKTtcblxuICAgICAgICAvLyBQcmVwYXJlIGNodW5rIGRhdGEgZm9yIHBhcmFsbGVsIHdyaXRlc1xuICAgICAgICBjb25zdCBjaHVua0J1ZmZlcnMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gdG9CdWZmZXIoY2h1bmspKTtcblxuICAgICAgICAvLyBXcml0ZSBhbGwgY2h1bmtzIGluIHBhcmFsbGVsIGZvciBlZmZpY2llbmN5LCBidXQgdHJhY2sgaW5kaXZpZHVhbCBjb21wbGV0aW9uXG4gICAgICAgIGNvbnN0IHdyaXRlUHJvbWlzZXMgPSBjaHVua0J1ZmZlcnMubWFwKGFzeW5jIChjaHVua0J1ZmZlciwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblxuICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVDaHVuayh7XG4gICAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgICBlb2Y6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdzdHJlYW1zJyxcbiAgICAgICAgICAgICdjaHVua3MnLFxuICAgICAgICAgICAgYCR7bmFtZX0tJHtjaHVua0lkfSR7dGFnU3VmZml4fS5iaW5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGF3YWl0IHdyaXRlKGNodW5rUGF0aCwgc2VyaWFsaXplZCk7XG5cbiAgICAgICAgICAvLyBSZXR1cm4gZGF0YSBuZWVkZWQgZm9yIGV2ZW50IGVtaXNzaW9uXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNodW5rSWQsXG4gICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXkuZnJvbShjaHVua0J1ZmZlciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW1pdCBldmVudHMgaW4gb3JkZXIsIHdhaXRpbmcgZm9yIGVhY2ggY2h1bmsncyB3cml0ZSB0byBjb21wbGV0ZVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgZXZlbnRzIGFyZSBlbWl0dGVkIGluIG9yZGVyIHdoaWxlIHdyaXRlcyBoYXBwZW4gaW4gcGFyYWxsZWxcbiAgICAgICAgZm9yIChjb25zdCB3cml0ZVByb21pc2Ugb2Ygd3JpdGVQcm9taXNlcykge1xuICAgICAgICAgIGNvbnN0IHsgY2h1bmtJZCwgY2h1bmtEYXRhIH0gPSBhd2FpdCB3cml0ZVByb21pc2U7XG5cbiAgICAgICAgICBzdHJlYW1FbWl0dGVyLmVtaXQoYGNodW5rOiR7bmFtZX1gIGFzIGNvbnN0LCB7XG4gICAgICAgICAgICBzdHJlYW1OYW1lOiBuYW1lLFxuICAgICAgICAgICAgY2h1bmtEYXRhLFxuICAgICAgICAgICAgY2h1bmtJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgY2xvc2UoX3J1bklkOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4sIG5hbWU6IHN0cmluZykge1xuICAgICAgICAvLyBHZW5lcmF0ZSBVTElEIHN5bmNocm9ub3VzbHkgQkVGT1JFIGFueSBhd2FpdCB0byBwcmVzZXJ2ZSBjYWxsIG9yZGVyLlxuICAgICAgICBjb25zdCBjaHVua0lkID0gYGNobmtfJHttb25vdG9uaWNVbGlkKCl9YDtcblxuICAgICAgICAvLyBBd2FpdCBydW5JZCBpZiBpdCdzIGEgcHJvbWlzZSB0byBlbnN1cmUgcHJvcGVyIGZsdXNoaW5nXG4gICAgICAgIGNvbnN0IHJ1bklkID0gYXdhaXQgX3J1bklkO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoaXMgc3RyZWFtIGZvciB0aGUgcnVuIChpbiBjYXNlIHdyaXRlIHdhc24ndCBjYWxsZWQpXG4gICAgICAgIGF3YWl0IHJlZ2lzdGVyU3RyZWFtRm9yUnVuKHJ1bklkLCBuYW1lKTtcbiAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgJ3N0cmVhbXMnLFxuICAgICAgICAgICdjaHVua3MnLFxuICAgICAgICAgIGAke25hbWV9LSR7Y2h1bmtJZH0ke3RhZ1N1ZmZpeH0uYmluYFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHdyaXRlKFxuICAgICAgICAgIGNodW5rUGF0aCxcbiAgICAgICAgICBzZXJpYWxpemVDaHVuayh7IGNodW5rOiBCdWZmZXIuZnJvbShbXSksIGVvZjogdHJ1ZSB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHN0cmVhbUVtaXR0ZXIuZW1pdChgY2xvc2U6JHtuYW1lfWAgYXMgY29uc3QsIHsgc3RyZWFtTmFtZTogbmFtZSB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGxpc3QocnVuSWQ6IHN0cmluZykge1xuICAgICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAnc3RyZWFtcy9ydW5zJyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBSdW5TdHJlYW1zU2NoZW1hLFxuICAgICAgICAgIHRhZ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZGF0YT8uc3RyZWFtcyA/PyBbXTtcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGdldENodW5rcyhcbiAgICAgICAgX3J1bklkOiBzdHJpbmcsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IEdldENodW5rc09wdGlvbnNcbiAgICAgICk6IFByb21pc2U8U3RyZWFtQ2h1bmtzUmVzcG9uc2U+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCA/PyAxMDA7XG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3QgeyBmaWxlczogY2h1bmtGaWxlcywgZXh0TWFwOiBmaWxlRXh0TWFwIH0gPVxuICAgICAgICAgIGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0RpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAvLyBEZWNvZGUgY3Vyc29yXG4gICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmN1cnNvcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgQnVmZmVyLmZyb20ob3B0aW9ucy5jdXJzb3IsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBkZWNvZGVkLmk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWxrIGZyb20gc3RhcnRJbmRleCwgcmVhZGluZyBvbmx5IHRoZSBmaWxlcyB3ZSBuZWVkLlxuICAgICAgICAvLyBGaWxlcyBiZWZvcmUgdGhlIGN1cnNvciBhcmUgc2tpcHBlZCBlbnRpcmVseS5cbiAgICAgICAgbGV0IHN0cmVhbURvbmUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0Q2h1bmtzOiB7IGluZGV4OiBudW1iZXI7IGRhdGE6IFVpbnQ4QXJyYXkgfVtdID0gW107XG4gICAgICAgIGxldCBkYXRhSW5kZXggPSAwOyAvLyBydW5uaW5nIGNvdW50IG9mIGRhdGEgKG5vbi1FT0YpIGZpbGVzIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgY2h1bmtGaWxlcykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGVFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjaHVua3NEaXIsIGAke2ZpbGV9JHtleHR9YCk7XG5cbiAgICAgICAgICAvLyBCZWZvcmUgdGhlIGN1cnNvcjogb25seSBuZWVkIHRvIGNoZWNrIEVPRiAoMSBieXRlKSwgc2tpcCBjb250ZW50XG4gICAgICAgICAgaWYgKGRhdGFJbmRleCA8IHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChpc0VvZkJ5dGUoYXdhaXQgcmVhZEZpcnN0Qnl0ZShmaWxlUGF0aCkpKSB7XG4gICAgICAgICAgICAgIHN0cmVhbURvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFJbmRleCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29sbGVjdGVkIGVub3VnaCBkYXRhIGNodW5rcyDigJQgcGVlayBhdCB0aGUgbmV4dCBmaWxlIGZvciBFT0YvaGFzTW9yZVxuICAgICAgICAgIGlmIChyZXN1bHRDaHVua3MubGVuZ3RoID49IGxpbWl0KSB7XG4gICAgICAgICAgICBpZiAoaXNFb2ZCeXRlKGF3YWl0IHJlYWRGaXJzdEJ5dGUoZmlsZVBhdGgpKSkge1xuICAgICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIE1vcmUgZGF0YSBmaWxlcyBleGlzdCBiZXlvbmQgdGhpcyBwYWdlXG4gICAgICAgICAgICAgIGRhdGFJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSW4gdGhlIHBhZ2Ugd2luZG93OiBkZXNlcmlhbGl6ZSBmdWxseVxuICAgICAgICAgIGNvbnN0IGNodW5rID0gZGVzZXJpYWxpemVDaHVuayhhd2FpdCByZWFkQnVmZmVyKGZpbGVQYXRoKSk7XG4gICAgICAgICAgaWYgKGNodW5rLmVvZikge1xuICAgICAgICAgICAgc3RyZWFtRG9uZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0Q2h1bmtzLnB1c2goe1xuICAgICAgICAgICAgaW5kZXg6IGRhdGFJbmRleCxcbiAgICAgICAgICAgIGRhdGE6IFVpbnQ4QXJyYXkuZnJvbShjaHVuay5jaHVuayksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGF0YUluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYXNNb3JlID0gd2Uga25vdyB0aGVyZSBhcmUgZGF0YSBmaWxlcyBiZXlvbmQgdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGhhc01vcmUgPVxuICAgICAgICAgICFzdHJlYW1Eb25lICYmIGRhdGFJbmRleCA+IHN0YXJ0SW5kZXggKyByZXN1bHRDaHVua3MubGVuZ3RoO1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBzdGFydEluZGV4ICsgcmVzdWx0Q2h1bmtzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmV4dEN1cnNvciA9IGhhc01vcmVcbiAgICAgICAgICA/IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgaTogbmV4dEluZGV4IH0pKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiByZXN1bHRDaHVua3MsXG4gICAgICAgICAgY3Vyc29yOiBuZXh0Q3Vyc29yLFxuICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgZG9uZTogc3RyZWFtRG9uZSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGdldEluZm8oX3J1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3RyZWFtSW5mb1Jlc3BvbnNlPiB7XG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3QgeyBmaWxlczogY2h1bmtGaWxlcywgZXh0TWFwOiBmaWxlRXh0TWFwIH0gPVxuICAgICAgICAgIGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0RpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAvLyBSZWFkIG9ubHkgdGhlIEVPRiBtYXJrZXIgYnl0ZSBiZWNhdXNlIG1ldGFkYXRhIG5ldmVyIG5lZWRzIHBheWxvYWRzLlxuICAgICAgICBsZXQgc3RyZWFtRG9uZSA9IGZhbHNlO1xuICAgICAgICBsZXQgZGF0YUNvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGNodW5rRmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBmaWxlRXh0TWFwLmdldChmaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNFb2ZCeXRlKFxuICAgICAgICAgICAgICBhd2FpdCByZWFkRmlyc3RCeXRlKHBhdGguam9pbihjaHVua3NEaXIsIGAke2ZpbGV9JHtleHR9YCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhQ291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHRhaWxJbmRleDogZGF0YUNvdW50IC0gMSwgZG9uZTogc3RyZWFtRG9uZSB9O1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KF9ydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgbGV0IHJlbW92ZUxpc3RlbmVycyA9ICgpID0+IHt9O1xuICAgICAgICBsZXQgcG9sbEludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICAgICAgICBhc3luYyBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAvLyBUcmFjayBjaHVua3MgZGVsaXZlcmVkIHZpYSBldmVudHMgdG8gcHJldmVudCBkdXBsaWNhdGVzIGFuZCBtYWludGFpbiBvcmRlci5cbiAgICAgICAgICAgIGNvbnN0IGRlbGl2ZXJlZENodW5rSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAvLyBCdWZmZXIgZm9yIGNodW5rcyB0aGF0IGFycml2ZSB2aWEgZXZlbnRzIGR1cmluZyBkaXNrIHJlYWRpbmdcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkRXZlbnRDaHVua3M6IEFycmF5PHtcbiAgICAgICAgICAgICAgY2h1bmtJZDogc3RyaW5nO1xuICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICB9PiA9IFtdO1xuICAgICAgICAgICAgbGV0IGlzUmVhZGluZ0Zyb21EaXNrID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIEJ1ZmZlciBjbG9zZSBldmVudCBpZiBpdCBhcnJpdmVzIGR1cmluZyBkaXNrIHJlYWRpbmdcbiAgICAgICAgICAgIGxldCBwZW5kaW5nQ2xvc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFNldCB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGNsb3NlZDsgZ3VhcmRzIGFnYWluc3QgZW5xdWV1ZS1hZnRlci1jbG9zZVxuICAgICAgICAgICAgLy8gaW4gdGhlIHBvbGxpbmcgY2FsbGJhY2sgd2hlbiBjbG9zZUxpc3RlbmVyIGZpcmVzIG1pZC1pdGVyYXRpb24uXG4gICAgICAgICAgICBsZXQgc3RyZWFtQ2xvc2VkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IGNodW5rTGlzdGVuZXIgPSAoZXZlbnQ6IHtcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBlbXB0eSBjaHVua3MgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCBkaXNrIHJlYWRpbmcgYmVoYXZpb3JcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmNodW5rRGF0YS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaXZlcmVkQ2h1bmtJZHMuYWRkKGV2ZW50LmNodW5rSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBCdWZmZXIgY2h1bmtzIHRoYXQgYXJyaXZlIGR1cmluZyBkaXNrIHJlYWRpbmcgdG8gbWFpbnRhaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudCB3aGVuIGVucXVldWVkIGxhdGVyXG4gICAgICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGNodW5rSWQ6IGV2ZW50LmNodW5rSWQsXG4gICAgICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXkuZnJvbShldmVudC5jaHVua0RhdGEpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkZWxpdmVyZWRDaHVua0lkcy5oYXMoZXZlbnQuY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGR1cGxpY2F0ZXM6IHBvbGxpbmcgbWF5IGhhdmUgYWxyZWFkeSBjbGFpbWVkIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBjaHVuayBiZXR3ZWVuIGl0cyBoYXMoKSBjaGVjayBhbmQgcmVhZEJ1ZmZlcigpIHlpZWxkLlxuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBBZnRlciBkaXNrIHJlYWRpbmcgaXMgY29tcGxldGUsIGRlbGl2ZXIgY2h1bmtzIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnRcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGV2ZW50LmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBjbG9zZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIgY2xvc2UgZXZlbnQgaWYgZGlzayByZWFkaW5nIGlzIHN0aWxsIGluIHByb2dyZXNzXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdDbG9zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgYmVmb3JlIGNsb3NpbmdcbiAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNodW5rOiR7bmFtZX1gIGFzIGNvbnN0LCBjaHVua0xpc3RlbmVyKTtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNsb3NlOiR7bmFtZX1gIGFzIGNvbnN0LCBjbG9zZUxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgaWYgKHBvbGxJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKTtcbiAgICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgY29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZCAoZS5nLiwgZnJvbSBjYW5jZWwoKSBvciBFT0YpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMgPSBjbG9zZUxpc3RlbmVyO1xuXG4gICAgICAgICAgICAvLyBTZXQgdXAgbGlzdGVuZXJzIEZJUlNUIHRvIGF2b2lkIG1pc3NpbmcgZXZlbnRzXG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG5cbiAgICAgICAgICAgIC8vIE5vdyBsb2FkIGV4aXN0aW5nIGNodW5rcyBmcm9tIGRpc2suXG4gICAgICAgICAgICBjb25zdCB7IGZpbGVzOiBjaHVua0ZpbGVzLCBleHRNYXA6IGZpbGVFeHRNYXAgfSA9XG4gICAgICAgICAgICAgIGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0RpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBuZWdhdGl2ZSBzdGFydEluZGV4IHJlbGF0aXZlIHRvIHRoZSBudW1iZXIgb2YgZGF0YSBjaHVua3NcbiAgICAgICAgICAgIC8vIChleGNsdWRpbmcgdGhlIHRyYWlsaW5nIEVPRiBtYXJrZXIgY2h1bmssIGlmIHByZXNlbnQpLlxuICAgICAgICAgICAgbGV0IGRhdGFDaHVua0NvdW50ID0gY2h1bmtGaWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICBzdGFydEluZGV4IDwgMCAmJlxuICAgICAgICAgICAgICBjaHVua0ZpbGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBsYXN0RmlsZSA9IGNodW5rRmlsZXNbY2h1bmtGaWxlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgY29uc3QgbGFzdEV4dCA9IGZpbGVFeHRNYXAuZ2V0KGxhc3RGaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpc0VvZkJ5dGUoXG4gICAgICAgICAgICAgICAgICBhd2FpdCByZWFkRmlyc3RCeXRlKFxuICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtsYXN0RmlsZX0ke2xhc3RFeHR9YClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRhdGFDaHVua0NvdW50LS07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU3RhcnRJbmRleCA9XG4gICAgICAgICAgICAgIHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJyAmJiBzdGFydEluZGV4IDwgMFxuICAgICAgICAgICAgICAgID8gTWF0aC5tYXgoMCwgZGF0YUNodW5rQ291bnQgKyBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgIDogc3RhcnRJbmRleDtcblxuICAgICAgICAgICAgLy8gUHJvY2VzcyBleGlzdGluZyBjaHVua3MsIHNraXBwaW5nIGFueSBhbHJlYWR5IGRlbGl2ZXJlZCB2aWEgZXZlbnRzXG4gICAgICAgICAgICBsZXQgaXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlc29sdmVkU3RhcnRJbmRleDsgaSA8IGNodW5rRmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGNodW5rRmlsZXNbaV07XG4gICAgICAgICAgICAgIC8vIEV4dHJhY3QgY2h1bmsgSUQgZnJvbSBmaWxlbmFtZTogXCJzdHJlYW1OYW1lLWNodW5rSWRcIiBvciBcInN0cmVhbU5hbWUtY2h1bmtJZC50YWdcIlxuICAgICAgICAgICAgICBjb25zdCByYXdDaHVua0lkID0gZmlsZS5zdWJzdHJpbmcobmFtZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgLy8gU3RyaXAgdGFnIHN1ZmZpeCAoZS5nLiwgXCJjaG5rX1VMSUQudml0ZXN0LTBcIiDihpIgXCJjaG5rX1VMSURcIilcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmtJZCA9IHRhZ1xuICAgICAgICAgICAgICAgID8gcmF3Q2h1bmtJZC5yZXBsYWNlKGAuJHt0YWd9YCwgJycpXG4gICAgICAgICAgICAgICAgOiByYXdDaHVua0lkO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBkZWxpdmVyZWQgdmlhIGV2ZW50XG4gICAgICAgICAgICAgIGlmIChkZWxpdmVyZWRDaHVua0lkcy5oYXMoY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGVFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBkZXNlcmlhbGl6ZUNodW5rKFxuICAgICAgICAgICAgICAgIGF3YWl0IHJlYWRCdWZmZXIocGF0aC5qb2luKGNodW5rc0RpciwgYCR7ZmlsZX0ke2V4dH1gKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUcmFjayBhcyBoYW5kbGVkIHNvIHBvbGxpbmcgZG9lc24ndCByZS1kZWxpdmVyXG4gICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChjaHVua0lkKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rLmNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gZGlzayAtIG5vdyBkZWxpdmVyIGJ1ZmZlcmVkIGV2ZW50IGNodW5rcyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICAgICAgICBpc1JlYWRpbmdGcm9tRGlzayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBTb3J0IGJ1ZmZlcmVkIGNodW5rcyBieSBVTElEIChjaHJvbm9sb2dpY2FsIG9yZGVyKVxuICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICBhLmNodW5rSWQubG9jYWxlQ29tcGFyZShiLmNodW5rSWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBidWZmZXJlZCBvZiBidWZmZXJlZEV2ZW50Q2h1bmtzKSB7XG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgZm9yIGRlZmVuc2UgaW4gZGVwdGggKGFscmVhZHkgY29waWVkIGF0IHN0b3JhZ2UsIGJ1dCBiZSBleHRyYSBzYWZlKVxuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGJ1ZmZlcmVkLmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNDb21wbGV0ZSkge1xuICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBjb250cm9sbGVyIGlzIGFscmVhZHkgY2xvc2VkIChlLmcuLCBmcm9tIGNsb3NlTGlzdGVuZXIgZXZlbnQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcm9jZXNzIGFueSBwZW5kaW5nIGNsb3NlIGV2ZW50IHRoYXQgYXJyaXZlZCBkdXJpbmcgZGlzayByZWFkaW5nXG4gICAgICAgICAgICBpZiAocGVuZGluZ0Nsb3NlKSB7XG4gICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgY29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhY2sgcHJlLXN0YXJ0SW5kZXggY2h1bmtzIHNvIHBvbGxpbmcgZG9lc24ndCByZS1kZWxpdmVyIHRoZW1cbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgaSA8IHJlc29sdmVkU3RhcnRJbmRleCAmJiBpIDwgY2h1bmtGaWxlcy5sZW5ndGg7XG4gICAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBjaHVua0ZpbGVzW2ldO1xuICAgICAgICAgICAgICBjb25zdCByYXdDaHVua0lkID0gZmlsZS5zdWJzdHJpbmcobmFtZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmtJZCA9IHRhZ1xuICAgICAgICAgICAgICAgID8gcmF3Q2h1bmtJZC5yZXBsYWNlKGAuJHt0YWd9YCwgJycpXG4gICAgICAgICAgICAgICAgOiByYXdDaHVua0lkO1xuICAgICAgICAgICAgICBkZWxpdmVyZWRDaHVua0lkcy5hZGQoY2h1bmtJZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGZpbGVzeXN0ZW0gcG9sbGluZyBmb3IgY3Jvc3MtcHJvY2VzcyBzdHJlYW1pbmcgc3VwcG9ydC5cbiAgICAgICAgICAgIC8vIFRoZSBFdmVudEVtaXR0ZXIgb25seSB3b3JrcyBpbi1wcm9jZXNzOyB3aGVuIHRoZSB3cml0ZXIgaXMgaW4gYVxuICAgICAgICAgICAgLy8gc2VwYXJhdGUgcHJvY2VzcyAoZS5nLiBlMmUgdGVzdCBydW5uZXIg4oaUIHdvcmtiZW5jaCBhcHApLCBwb2xsaW5nXG4gICAgICAgICAgICAvLyB0aGUgc2hhcmVkIGZpbGVzeXN0ZW0gaXMgdGhlIGZhbGxiYWNrIGRlbGl2ZXJ5IG1lY2hhbmlzbS5cbiAgICAgICAgICAgIGxldCBpc1BvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHBvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGlzUG9sbGluZykgcmV0dXJuO1xuICAgICAgICAgICAgICBpc1BvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsZXM6IGN1cnJlbnRGaWxlcywgZXh0TWFwOiBjdXJyZW50RXh0TWFwIH0gPVxuICAgICAgICAgICAgICAgICAgYXdhaXQgbGlzdENodW5rRmlsZXNGb3JTdHJlYW0oY2h1bmtzRGlyLCBuYW1lLCB0YWcpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGN1cnJlbnRGaWxlcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmF3Q2h1bmtJZCA9IGZpbGUuc3Vic3RyaW5nKG5hbWUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaHVua0lkID0gdGFnXG4gICAgICAgICAgICAgICAgICAgID8gcmF3Q2h1bmtJZC5yZXBsYWNlKGAuJHt0YWd9YCwgJycpXG4gICAgICAgICAgICAgICAgICAgIDogcmF3Q2h1bmtJZDtcblxuICAgICAgICAgICAgICAgICAgaWYgKGRlbGl2ZXJlZENodW5rSWRzLmhhcyhjaHVua0lkKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBkZWxpdmVyZWRDaHVua0lkcy5hZGQoY2h1bmtJZCk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGN1cnJlbnRFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gZGVzZXJpYWxpemVDaHVuayhcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVhZEJ1ZmZlcihwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtmaWxlfSR7ZXh0fWApKVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGxJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUVtaXR0ZXIub2ZmKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgY29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBlbnF1ZXVlLWFmdGVyLWNsb3NlOiBjbG9zZUxpc3RlbmVyIG1heSBoYXZlXG4gICAgICAgICAgICAgICAgICAvLyBmaXJlZCBiZXR3ZWVuIG91ciByZWFkQnVmZmVyKCkgeWllbGQgYW5kIHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtQ2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgIGlmIChjaHVuay5jaHVuay5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSB0cmFuc2llbnQgZmlsZXN5c3RlbSBlcnJvcnMgKEVOT0VOVCwgRUFDQ0VTLCBldGMuKVxuICAgICAgICAgICAgICAgIC8vIFN1cmZhY2UgdW5leHBlY3RlZCBlcnJvcnMgc28gYnVncyBhcmVuJ3QgaGlkZGVuXG4gICAgICAgICAgICAgICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycikpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t3b3JsZC1sb2NhbF0gVW5leHBlY3RlZCBwb2xsaW5nIGVycm9yOicsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlzUG9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIGlmIChwb2xsSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwb2xsSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIl19
508
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RyZWFtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFPN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLFNBQVMsQ0FBQztBQUVqQiwyRUFBMkU7QUFDM0Usa0RBQWtEO0FBQ2xELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRTVELDZDQUE2QztBQUM3QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzdCLENBQUMsQ0FBQztBQWNILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVyQixTQUFTLFNBQVMsQ0FBQyxJQUF3QjtJQUN6QyxPQUFPLElBQUksS0FBSyxVQUFVLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBWTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sTUFBTSxD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QztZQUNMLENBQUM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0Q2h1bmtzT3B0aW9ucyxcbiAgU3RyZWFtQ2h1bmtzUmVzcG9uc2UsXG4gIFN0cmVhbWVyLFxuICBTdHJlYW1JbmZvUmVzcG9uc2UsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgcmVhZEJ1ZmZlcixcbiAgcmVhZEZpcnN0Qnl0ZSxcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHRhZ2dlZFBhdGgsXG4gIHdyaXRlLFxuICB3cml0ZUpTT04sXG59IGZyb20gJy4vZnMuanMnO1xuXG4vLyBDcmVhdGUgYSBtb25vdG9uaWMgVUxJRCBmYWN0b3J5IHRoYXQgZW5zdXJlcyBVTElEcyBhcmUgYWx3YXlzIGluY3JlYXNpbmdcbi8vIGV2ZW4gd2hlbiBnZW5lcmF0ZWQgd2l0aGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kXG5jb25zdCBtb25vdG9uaWNVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLy8gU2NoZW1hIGZvciB0aGUgcnVuLXRvLXN0cmVhbXMgbWFwcGluZyBmaWxlXG5jb25zdCBSdW5TdHJlYW1zU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdHJlYW1zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxufSk7XG5cbi8qKlxuICogQSBjaHVuayBjb25zaXN0cyBvZiBhIGJvb2xlYW4gYGVvZmAgaW5kaWNhdGluZyBpZiBpdCdzIHRoZSBsYXN0IGNodW5rLFxuICogYW5kIGEgYGNodW5rYCB3aGljaCBpcyBhIEJ1ZmZlciBvZiBkYXRhLlxuICogVGhlIHNlcmlhbGl6ZWQgZm9ybWF0IGlzOlxuICogLSAxIGJ5dGUgZm9yIGBlb2ZgICgwIG9yIDEpXG4gKiAtIGFuZCB0aGUgcmVzdCBpcyB0aGUgY2h1bmsgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaHVuayB7XG4gIGVvZjogYm9vbGVhbjtcbiAgY2h1bms6IEJ1ZmZlcjtcbn1cblxuY29uc3QgRU9GX01BUktFUiA9IDE7XG5cbmZ1bmN0aW9uIGlzRW9mQnl0ZShieXRlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJ5dGUgPT09IEVPRl9NQVJLRVI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDaHVuayhjaHVuazogQ2h1bmspIHtcbiAgY29uc3QgZW9mQnl0ZSA9IEJ1ZmZlci5mcm9tKFtjaHVuay5lb2YgPyBFT0ZfTUFSS0VSIDogMF0pO1xuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbZW9mQnl0ZSwgY2h1bmsuY2h1bmtdKTtcbn1cblxuLyoqIENoZWNrIG9ubHkgdGhlIEVPRiBmbGFnIGJ5dGUgd2l0aG91dCBjb3B5aW5nIGNodW5rIHBheWxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFb2ZDaHVuayhzZXJpYWxpemVkOiBCdWZmZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRW9mQnl0ZShzZXJpYWxpemVkWzBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQ2h1bmsoc2VyaWFsaXplZDogQnVmZmVyKSB7XG4gIGNvbnN0IGVvZiA9IGlzRW9mQ2h1bmsoc2VyaWFsaXplZCk7XG4gIC8vIENyZWF0ZSBhIGNvcHkgaW5zdGVhZCBvZiBhIHZpZXcgdG8gcHJldmVudCBBcnJheUJ1ZmZlciBkZXRhY2htZW50XG4gIGNvbnN0IGNodW5rID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZC5zdWJhcnJheSgxKSk7XG4gIHJldHVybiB7IGVvZiwgY2h1bmsgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdENodW5rRW50cmllcyhjaHVua3NEaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZGRpcihjaHVua3NEaXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENodW5rRmlsZXNCeUV4dGVuc2lvbihcbiAgZXh0TWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBlbnRyaWVzOiBzdHJpbmdbXSxcbiAgc291cmNlRXh0ZW5zaW9uOiBzdHJpbmcsXG4gIGZpbGVFeHRlbnNpb24gPSBzb3VyY2VFeHRlbnNpb24sXG4gIGluY2x1ZGU6IChmaWxlOiBzdHJpbmcpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5lbmRzV2l0aChzb3VyY2VFeHRlbnNpb24pKSBjb250aW51ZTtcbiAgICBjb25zdCBmaWxlID0gZW50cnkuc2xpY2UoMCwgLXNvdXJjZUV4dGVuc2lvbi5sZW5ndGgpO1xuICAgIGlmIChpbmNsdWRlKGZpbGUpKSBleHRNYXAuc2V0KGZpbGUsIGZpbGVFeHRlbnNpb24pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcGVyLXN0cmVhbSBjaHVuayBkaXJlY3RvcnkuIENodW5rcyBhcmUgc2hhcmRlZCBvbmUgZGlyZWN0b3J5XG4gKiBwZXIgc3RyZWFtIChgc3RyZWFtcy9jaHVua3MvPHN0cmVhbU5hbWU+L2ApIHNvIHRoYXQgbGlzdGluZyBhIHN0cmVhbSdzXG4gKiBjaHVua3MgY29zdHMgTyhjaHVua3MgaW4gdGhhdCBzdHJlYW0pIHJhdGhlciB0aGFuIE8oY2h1bmtzIGluIHRoZSB3aG9sZVxuICogd29ybGQpLiBBIHRhaWwgcmVhZGVyIHBvbGxpbmcgZm9yIG5ldyBjaHVua3Mgd291bGQgb3RoZXJ3aXNlIGByZWFkZGlyYCB0aGVcbiAqIGVudGlyZSBnbG9iYWwgY2h1bmtzIGRpcmVjdG9yeSBldmVyeSAxMDBtcyDigJQgc2VlIHZlcmNlbC93b3JrZmxvdyMyNzk3LlxuICovXG5mdW5jdGlvbiBjaHVua0RpckZvclN0cmVhbShjaHVua3NCYXNlRGlyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5hbWUgYmVjb21lcyBhIHBhdGggc2VnbWVudCBiZWxvdzsgdmFsaWRhdGUgaXQgY2FuJ3QgZXNjYXBlIGNodW5rc0Jhc2VEaXIuXG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIG5hbWUpO1xuICByZXR1cm4gcGF0aC5qb2luKGNodW5rc0Jhc2VEaXIsIG5hbWUpO1xufVxuXG4vKipcbiAqIExpc3QgY2h1bmsgZmlsZXMgZm9yIGEgc3RyZWFtLCBzb3J0ZWQgY2hyb25vbG9naWNhbGx5IChVTElEIG9yZGVyKS5cbiAqIFJldHVybnMgdGhlIHNvcnRlZCBjaHVuayBrZXlzIChlYWNoIGtleSBpcyB0aGUgY2h1bmsgVUxJRCksIGEgbWFwIG9mXG4gKiBrZXkg4oaSIGV4dGVuc2lvbiBmb3IgcmVzb2x2aW5nIHRoZSBmdWxsIHBhdGgsIGFuZCB0aGUgcGVyLXN0cmVhbSBkaXJlY3RvcnlcbiAqIHRoZSBmaWxlcyBsaXZlIGluLiBIYW5kbGVzIHRhZ2dlZCBhbmQgbGVnYWN5ICguanNvbikgZm9ybWF0cy5cbiAqXG4gKiBGaWxlcyBhcmUgc3RvcmVkIHBlci1zdHJlYW0gKGA8Y2h1bmtEaXI+LzxjaHVua0lkPjx0YWdTdWZmaXg+LmJpbmApLCBzbyB0aGVcbiAqIGtleSByZXR1cm5lZCBoZXJlIGlzIGFscmVhZHkgdGhlIGNodW5rIGlkIOKAlCBubyBzdHJlYW0tbmFtZSBwcmVmaXggdG8gc3RyaXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKFxuICBjaHVua3NCYXNlRGlyOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPHsgZmlsZXM6IHN0cmluZ1tdOyBleHRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz47IGRpcjogc3RyaW5nIH0+IHtcbiAgY29uc3QgZGlyID0gY2h1bmtEaXJGb3JTdHJlYW0oY2h1bmtzQmFzZURpciwgbmFtZSk7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBsaXN0Q2h1bmtFbnRyaWVzKGRpcik7XG4gIGNvbnN0IGV4dE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGFkZENodW5rRmlsZXNCeUV4dGVuc2lvbihleHRNYXAsIGVudHJpZXMsICcuanNvbicpO1xuICBhZGRDaHVua0ZpbGVzQnlFeHRlbnNpb24oXG4gICAgZXh0TWFwLFxuICAgIGVudHJpZXMsXG4gICAgJy5iaW4nLFxuICAgICcuYmluJyxcbiAgICB0YWcgPyAoZmlsZSkgPT4gIWZpbGUuZW5kc1dpdGgoYC4ke3RhZ31gKSA6IHVuZGVmaW5lZFxuICApO1xuXG4gIGlmICh0YWcpIHtcbiAgICBjb25zdCB0YWdnZWRFeHRlbnNpb24gPSBgLiR7dGFnfS5iaW5gO1xuICAgIGFkZENodW5rRmlsZXNCeUV4dGVuc2lvbihleHRNYXAsIGVudHJpZXMsIHRhZ2dlZEV4dGVuc2lvbik7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IFsuLi5leHRNYXAua2V5cygpXS5zb3J0KCk7XG5cbiAgcmV0dXJuIHsgZmlsZXMsIGV4dE1hcCwgZGlyIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdHJlYW1lcihiYXNlZGlyOiBzdHJpbmcsIHRhZz86IHN0cmluZyk6IFN0cmVhbWVyIHtcbiAgY29uc3QgdGFnU3VmZml4ID0gdGFnID8gYC4ke3RhZ31gIDogJyc7XG4gIGNvbnN0IHN0cmVhbUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBba2V5OiBgY2h1bms6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgIH0sXG4gICAgXTtcbiAgICBba2V5OiBgY2xvc2U6JHtzdHJpbmd9YF06IFtcbiAgICAgIHtcbiAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgfSxcbiAgICBdO1xuICB9PigpO1xuXG4gIC8vIFRyYWNrIHdoaWNoIHN0cmVhbXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgYSBydW4gKGluLW1lbW9yeSBjYWNoZSlcbiAgY29uc3QgcmVnaXN0ZXJlZFN0cmVhbXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBIZWxwZXIgdG8gcmVjb3JkIHRoZSBydW5JZCA8PiBzdHJlYW1JZCBhc3NvY2lhdGlvblxuICBhc3luYyBmdW5jdGlvbiByZWdpc3RlclN0cmVhbUZvclJ1bihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHN0cmVhbU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnc3RyZWFtTmFtZScsIHN0cmVhbU5hbWUpO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7cnVuSWR9OiR7c3RyZWFtTmFtZX1gO1xuICAgIGlmIChyZWdpc3RlcmVkU3RyZWFtcy5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGlzIHNlc3Npb25cbiAgICB9XG5cbiAgICBjb25zdCBydW5TdHJlYW1zUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0cmVhbXMvcnVucycsIHJ1bklkLCB0YWcpO1xuXG4gICAgLy8gUmVhZCBleGlzdGluZyBzdHJlYW1zIGZvciB0aGlzIHJ1biAodHJ5IHRhZ2dlZCBmaXJzdCwgZmFsbCBiYWNrIHRvIHVudGFnZ2VkKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICBiYXNlZGlyLFxuICAgICAgJ3N0cmVhbXMvcnVucycsXG4gICAgICBydW5JZCxcbiAgICAgIFJ1blN0cmVhbXNTY2hlbWEsXG4gICAgICB0YWdcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbXMgPSBleGlzdGluZz8uc3RyZWFtcyA/PyBbXTtcblxuICAgIC8vIEFkZCBzdHJlYW0gaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgIGlmICghc3RyZWFtcy5pbmNsdWRlcyhzdHJlYW1OYW1lKSkge1xuICAgICAgc3RyZWFtcy5wdXNoKHN0cmVhbU5hbWUpO1xuICAgICAgYXdhaXQgd3JpdGVKU09OKHJ1blN0cmVhbXNQYXRoLCB7IHN0cmVhbXMgfSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJlZFN0cmVhbXMuYWRkKGNhY2hlS2V5KTtcbiAgfVxuXG4gIC8vIEhlbHBlciB0byBjb252ZXJ0IGEgY2h1bmsgdG8gYSBCdWZmZXJcbiAgZnVuY3Rpb24gdG9CdWZmZXIoY2h1bms6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBCdWZmZXIge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20obmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKSk7XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGNodW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RyZWFtczoge1xuICAgICAgYXN5bmMgd3JpdGUoXG4gICAgICAgIF9ydW5JZDogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+LFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5XG4gICAgICApIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgVUxJRCBzeW5jaHJvbm91c2x5IEJFRk9SRSBhbnkgYXdhaXQgdG8gcHJlc2VydmUgY2FsbCBvcmRlci5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgY2h1bmtzIHdyaXR0ZW4gaW4gc2VxdWVuY2UgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlblxuICAgICAgICAvLyB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZSB0aGF0IG11bHRpcGxlIHdyaXRlcyBhcmUgd2FpdGluZyBvbi5cbiAgICAgICAgY29uc3QgY2h1bmtJZCA9IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWA7XG5cbiAgICAgICAgLy8gQXdhaXQgcnVuSWQgaWYgaXQncyBhIHByb21pc2UgdG8gZW5zdXJlIHByb3BlciBmbHVzaGluZ1xuICAgICAgICBjb25zdCBydW5JZCA9IGF3YWl0IF9ydW5JZDtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGlzIHN0cmVhbSBmb3IgdGhlIHJ1blxuICAgICAgICBhd2FpdCByZWdpc3RlclN0cmVhbUZvclJ1bihydW5JZCwgbmFtZSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBjaHVuayB0byBidWZmZXIgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3QgY2h1bmtCdWZmZXIgPSB0b0J1ZmZlcihjaHVuayk7XG5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZUNodW5rKHtcbiAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgZW9mOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGNodW5rRGlyRm9yU3RyZWFtKHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKSwgbmFtZSksXG4gICAgICAgICAgYCR7Y2h1bmtJZH0ke3RhZ1N1ZmZpeH0uYmluYFxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHdyaXRlKGNodW5rUGF0aCwgc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLy8gRW1pdCByZWFsLXRpbWUgZXZlbnQgd2l0aCBVaW50OEFycmF5IChjcmVhdGUgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnQpXG4gICAgICAgIGNvbnN0IGNodW5rRGF0YSA9IFVpbnQ4QXJyYXkuZnJvbShjaHVua0J1ZmZlcik7XG5cbiAgICAgICAgc3RyZWFtRW1pdHRlci5lbWl0KGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwge1xuICAgICAgICAgIHN0cmVhbU5hbWU6IG5hbWUsXG4gICAgICAgICAgY2h1bmtEYXRhLFxuICAgICAgICAgIGNodW5rSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgd3JpdGVNdWx0aShcbiAgICAgICAgX3J1bklkOiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4sXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgY2h1bmtzOiAoc3RyaW5nIHwgVWludDhBcnJheSlbXVxuICAgICAgKSB7XG4gICAgICAgIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYWxsIFVMSURzIHN5bmNocm9ub3VzbHkgQkVGT1JFIGFueSBhd2FpdCB0byBwcmVzZXJ2ZSBjYWxsIG9yZGVyLlxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBjaHVua3MgbWFpbnRhaW4gdGhlaXIgb3JkZXIgZXZlbiB3aGVuIHJ1bklkIGlzIGEgcHJvbWlzZS5cbiAgICAgICAgY29uc3QgY2h1bmtJZHMgPSBjaHVua3MubWFwKCgpID0+IGBjaG5rXyR7bW9ub3RvbmljVWxpZCgpfWApO1xuXG4gICAgICAgIC8vIEF3YWl0IHJ1bklkIGlmIGl0J3MgYSBwcm9taXNlXG4gICAgICAgIGNvbnN0IHJ1bklkID0gYXdhaXQgX3J1bklkO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoaXMgc3RyZWFtIGZvciB0aGUgcnVuXG4gICAgICAgIGF3YWl0IHJlZ2lzdGVyU3RyZWFtRm9yUnVuKHJ1bklkLCBuYW1lKTtcblxuICAgICAgICAvLyBQcmVwYXJlIGNodW5rIGRhdGEgZm9yIHBhcmFsbGVsIHdyaXRlc1xuICAgICAgICBjb25zdCBjaHVua0J1ZmZlcnMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gdG9CdWZmZXIoY2h1bmspKTtcblxuICAgICAgICAvLyBXcml0ZSBhbGwgY2h1bmtzIGluIHBhcmFsbGVsIGZvciBlZmZpY2llbmN5LCBidXQgdHJhY2sgaW5kaXZpZHVhbCBjb21wbGV0aW9uXG4gICAgICAgIGNvbnN0IHdyaXRlUHJvbWlzZXMgPSBjaHVua0J1ZmZlcnMubWFwKGFzeW5jIChjaHVua0J1ZmZlciwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblxuICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVDaHVuayh7XG4gICAgICAgICAgICBjaHVuazogY2h1bmtCdWZmZXIsXG4gICAgICAgICAgICBlb2Y6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgY2h1bmtQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgY2h1bmtEaXJGb3JTdHJlYW0ocGF0aC5qb2luKGJhc2VkaXIsICdzdHJlYW1zJywgJ2NodW5rcycpLCBuYW1lKSxcbiAgICAgICAgICAgIGAke2NodW5rSWR9JHt0YWdTdWZmaXh9LmJpbmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgYXdhaXQgd3JpdGUoY2h1bmtQYXRoLCBzZXJpYWxpemVkKTtcblxuICAgICAgICAgIC8vIFJldHVybiBkYXRhIG5lZWRlZCBmb3IgZXZlbnQgZW1pc3Npb25cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2h1bmtJZCxcbiAgICAgICAgICAgIGNodW5rRGF0YTogVWludDhBcnJheS5mcm9tKGNodW5rQnVmZmVyKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50cyBpbiBvcmRlciwgd2FpdGluZyBmb3IgZWFjaCBjaHVuaydzIHdyaXRlIHRvIGNvbXBsZXRlXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBldmVudHMgYXJlIGVtaXR0ZWQgaW4gb3JkZXIgd2hpbGUgd3JpdGVzIGhhcHBlbiBpbiBwYXJhbGxlbFxuICAgICAgICBmb3IgKGNvbnN0IHdyaXRlUHJvbWlzZSBvZiB3cml0ZVByb21pc2VzKSB7XG4gICAgICAgICAgY29uc3QgeyBjaHVua0lkLCBjaHVua0RhdGEgfSA9IGF3YWl0IHdyaXRlUHJvbWlzZTtcblxuICAgICAgICAgIHN0cmVhbUVtaXR0ZXIuZW1pdChgY2h1bms6JHtuYW1lfWAgYXMgY29uc3QsIHtcbiAgICAgICAgICAgIHN0cmVhbU5hbWU6IG5hbWUsXG4gICAgICAgICAgICBjaHVua0RhdGEsXG4gICAgICAgICAgICBjaHVua0lkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBhc3luYyBjbG9zZShfcnVuSWQ6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIC8vIEdlbmVyYXRlIFVMSUQgc3luY2hyb25vdXNseSBCRUZPUkUgYW55IGF3YWl0IHRvIHByZXNlcnZlIGNhbGwgb3JkZXIuXG4gICAgICAgIGNvbnN0IGNodW5rSWQgPSBgY2hua18ke21vbm90b25pY1VsaWQoKX1gO1xuXG4gICAgICAgIC8vIEF3YWl0IHJ1bklkIGlmIGl0J3MgYSBwcm9taXNlIHRvIGVuc3VyZSBwcm9wZXIgZmx1c2hpbmdcbiAgICAgICAgY29uc3QgcnVuSWQgPSBhd2FpdCBfcnVuSWQ7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhpcyBzdHJlYW0gZm9yIHRoZSBydW4gKGluIGNhc2Ugd3JpdGUgd2Fzbid0IGNhbGxlZClcbiAgICAgICAgYXdhaXQgcmVnaXN0ZXJTdHJlYW1Gb3JSdW4ocnVuSWQsIG5hbWUpO1xuICAgICAgICBjb25zdCBjaHVua1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgY2h1bmtEaXJGb3JTdHJlYW0ocGF0aC5qb2luKGJhc2VkaXIsICdzdHJlYW1zJywgJ2NodW5rcycpLCBuYW1lKSxcbiAgICAgICAgICBgJHtjaHVua0lkfSR7dGFnU3VmZml4fS5iaW5gXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgd3JpdGUoXG4gICAgICAgICAgY2h1bmtQYXRoLFxuICAgICAgICAgIHNlcmlhbGl6ZUNodW5rKHsgY2h1bms6IEJ1ZmZlci5mcm9tKFtdKSwgZW9mOiB0cnVlIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgc3RyZWFtRW1pdHRlci5lbWl0KGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgeyBzdHJlYW1OYW1lOiBuYW1lIH0pO1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgbGlzdChydW5JZDogc3RyaW5nKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICdzdHJlYW1zL3J1bnMnLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIFJ1blN0cmVhbXNTY2hlbWEsXG4gICAgICAgICAgdGFnXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBkYXRhPy5zdHJlYW1zID8/IFtdO1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0Q2h1bmtzKFxuICAgICAgICBfcnVuSWQ6IHN0cmluZyxcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogR2V0Q2h1bmtzT3B0aW9uc1xuICAgICAgKTogUHJvbWlzZTxTdHJlYW1DaHVua3NSZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0ID8/IDEwMDtcbiAgICAgICAgY29uc3QgY2h1bmtzQmFzZURpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGZpbGVzOiBjaHVua0ZpbGVzLFxuICAgICAgICAgIGV4dE1hcDogZmlsZUV4dE1hcCxcbiAgICAgICAgICBkaXI6IGNodW5rc0RpcixcbiAgICAgICAgfSA9IGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0Jhc2VEaXIsIG5hbWUsIHRhZyk7XG5cbiAgICAgICAgLy8gRGVjb2RlIGN1cnNvclxuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgIGlmIChvcHRpb25zPy5jdXJzb3IpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgIEJ1ZmZlci5mcm9tKG9wdGlvbnMuY3Vyc29yLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04JylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gZGVjb2RlZC5pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FsayBmcm9tIHN0YXJ0SW5kZXgsIHJlYWRpbmcgb25seSB0aGUgZmlsZXMgd2UgbmVlZC5cbiAgICAgICAgLy8gRmlsZXMgYmVmb3JlIHRoZSBjdXJzb3IgYXJlIHNraXBwZWQgZW50aXJlbHkuXG4gICAgICAgIGxldCBzdHJlYW1Eb25lID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdENodW5rczogeyBpbmRleDogbnVtYmVyOyBkYXRhOiBVaW50OEFycmF5IH1bXSA9IFtdO1xuICAgICAgICBsZXQgZGF0YUluZGV4ID0gMDsgLy8gcnVubmluZyBjb3VudCBvZiBkYXRhIChub24tRU9GKSBmaWxlcyBzZWVuXG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGNodW5rRmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBmaWxlRXh0TWFwLmdldChmaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtmaWxlfSR7ZXh0fWApO1xuXG4gICAgICAgICAgLy8gQmVmb3JlIHRoZSBjdXJzb3I6IG9ubHkgbmVlZCB0byBjaGVjayBFT0YgKDEgYnl0ZSksIHNraXAgY29udGVudFxuICAgICAgICAgIGlmIChkYXRhSW5kZXggPCBzdGFydEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoaXNFb2ZCeXRlKGF3YWl0IHJlYWRGaXJzdEJ5dGUoZmlsZVBhdGgpKSkge1xuICAgICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhSW5kZXgrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENvbGxlY3RlZCBlbm91Z2ggZGF0YSBjaHVua3Mg4oCUIHBlZWsgYXQgdGhlIG5leHQgZmlsZSBmb3IgRU9GL2hhc01vcmVcbiAgICAgICAgICBpZiAocmVzdWx0Q2h1bmtzLmxlbmd0aCA+PSBsaW1pdCkge1xuICAgICAgICAgICAgaWYgKGlzRW9mQnl0ZShhd2FpdCByZWFkRmlyc3RCeXRlKGZpbGVQYXRoKSkpIHtcbiAgICAgICAgICAgICAgc3RyZWFtRG9uZSA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBNb3JlIGRhdGEgZmlsZXMgZXhpc3QgYmV5b25kIHRoaXMgcGFnZVxuICAgICAgICAgICAgICBkYXRhSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEluIHRoZSBwYWdlIHdpbmRvdzogZGVzZXJpYWxpemUgZnVsbHlcbiAgICAgICAgICBjb25zdCBjaHVuayA9IGRlc2VyaWFsaXplQ2h1bmsoYXdhaXQgcmVhZEJ1ZmZlcihmaWxlUGF0aCkpO1xuICAgICAgICAgIGlmIChjaHVuay5lb2YpIHtcbiAgICAgICAgICAgIHN0cmVhbURvbmUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdENodW5rcy5wdXNoKHtcbiAgICAgICAgICAgIGluZGV4OiBkYXRhSW5kZXgsXG4gICAgICAgICAgICBkYXRhOiBVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRhdGFJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFzTW9yZSA9IHdlIGtub3cgdGhlcmUgYXJlIGRhdGEgZmlsZXMgYmV5b25kIHRoaXMgcGFnZVxuICAgICAgICBjb25zdCBoYXNNb3JlID1cbiAgICAgICAgICAhc3RyZWFtRG9uZSAmJiBkYXRhSW5kZXggPiBzdGFydEluZGV4ICsgcmVzdWx0Q2h1bmtzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gc3RhcnRJbmRleCArIHJlc3VsdENodW5rcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5leHRDdXJzb3IgPSBoYXNNb3JlXG4gICAgICAgICAgPyBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGk6IG5leHRJbmRleCB9KSkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogcmVzdWx0Q2h1bmtzLFxuICAgICAgICAgIGN1cnNvcjogbmV4dEN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICAgIGRvbmU6IHN0cmVhbURvbmUsXG4gICAgICAgIH07XG4gICAgICB9LFxuXG4gICAgICBhc3luYyBnZXRJbmZvKF9ydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFN0cmVhbUluZm9SZXNwb25zZT4ge1xuICAgICAgICBjb25zdCBjaHVua3NCYXNlRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdzdHJlYW1zJywgJ2NodW5rcycpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZmlsZXM6IGNodW5rRmlsZXMsXG4gICAgICAgICAgZXh0TWFwOiBmaWxlRXh0TWFwLFxuICAgICAgICAgIGRpcjogY2h1bmtzRGlyLFxuICAgICAgICB9ID0gYXdhaXQgbGlzdENodW5rRmlsZXNGb3JTdHJlYW0oY2h1bmtzQmFzZURpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAvLyBSZWFkIG9ubHkgdGhlIEVPRiBtYXJrZXIgYnl0ZSBiZWNhdXNlIG1ldGFkYXRhIG5ldmVyIG5lZWRzIHBheWxvYWRzLlxuICAgICAgICBsZXQgc3RyZWFtRG9uZSA9IGZhbHNlO1xuICAgICAgICBsZXQgZGF0YUNvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGNodW5rRmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBmaWxlRXh0TWFwLmdldChmaWxlKSA/PyAnLmJpbic7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNFb2ZCeXRlKFxuICAgICAgICAgICAgICBhd2FpdCByZWFkRmlyc3RCeXRlKHBhdGguam9pbihjaHVua3NEaXIsIGAke2ZpbGV9JHtleHR9YCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzdHJlYW1Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhQ291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHRhaWxJbmRleDogZGF0YUNvdW50IC0gMSwgZG9uZTogc3RyZWFtRG9uZSB9O1xuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KF9ydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIGNvbnN0IGNodW5rc0Jhc2VEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ3N0cmVhbXMnLCAnY2h1bmtzJyk7XG4gICAgICAgIC8vIFRlYXJzIGRvd24gZXZlcnl0aGluZyB0aGUgcmVhZGVyIGhvbGRzIG9wZW46IGJvdGggZW1pdHRlciBsaXN0ZW5lcnNcbiAgICAgICAgLy8gYW5kIHRoZSBmaWxlc3lzdGVtIHBvbGwgaW50ZXJ2YWwuIEFzc2lnbmVkIG9uY2UgbGlzdGVuZXJzIGFyZSB3aXJlZFxuICAgICAgICAvLyB1cCBpbiBzdGFydCgpOyBjYWxsZWQgb24gY2FuY2VsKCkgYW5kIG9uIHRlcm1pbmFsIChFT0YvY2xvc2UpIHBhdGhzLlxuICAgICAgICAvLyBLZXB0IHJvYnVzdCAodW5jb25kaXRpb25hbCkgc28gYSBjYW5jZWwoKSB3aGlsZSBzdGlsbCByZWFkaW5nIGZyb21cbiAgICAgICAgLy8gZGlzayBjYW4ndCBsZWFrIGEgbGlzdGVuZXIvcG9sbCDigJQgYSBzaWduYWwtYmVhcmluZyBzdGVwIG9wZW5zIG9uZSBvZlxuICAgICAgICAvLyB0aGVzZSByZWFkZXJzIHBlciBpbnZvY2F0aW9uLCBzbyBhbnkgbGVhayBhY2N1bXVsYXRlcyBmYXN0LlxuICAgICAgICBsZXQgdGVhcmRvd24gPSAoKSA9PiB7fTtcbiAgICAgICAgbGV0IHBvbGxJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIC8vIFNldCB3aGVuIHRoZSBjb250cm9sbGVyIGlzIGNsb3NlZC9jYW5jZWxsZWQ7IGd1YXJkcyBhZ2FpbnN0XG4gICAgICAgIC8vIGVucXVldWUtYWZ0ZXItY2xvc2UgaW4gdGhlIHBvbGxpbmcgY2FsbGJhY2sgd2hlbiB0ZWFyZG93biBmaXJlc1xuICAgICAgICAvLyBtaWQtaXRlcmF0aW9uLlxuICAgICAgICBsZXQgc3RyZWFtQ2xvc2VkID0gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgICAgICAgYXN5bmMgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAgICAgLy8gVHJhY2sgY2h1bmtzIGRlbGl2ZXJlZCB2aWEgZXZlbnRzIHRvIHByZXZlbnQgZHVwbGljYXRlcyBhbmQgbWFpbnRhaW4gb3JkZXIuXG4gICAgICAgICAgICBjb25zdCBkZWxpdmVyZWRDaHVua0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgLy8gQnVmZmVyIGZvciBjaHVua3MgdGhhdCBhcnJpdmUgdmlhIGV2ZW50cyBkdXJpbmcgZGlzayByZWFkaW5nXG4gICAgICAgICAgICBjb25zdCBidWZmZXJlZEV2ZW50Q2h1bmtzOiBBcnJheTx7XG4gICAgICAgICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgY2h1bmtEYXRhOiBVaW50OEFycmF5O1xuICAgICAgICAgICAgfT4gPSBbXTtcbiAgICAgICAgICAgIGxldCBpc1JlYWRpbmdGcm9tRGlzayA9IHRydWU7XG4gICAgICAgICAgICAvLyBCdWZmZXIgY2xvc2UgZXZlbnQgaWYgaXQgYXJyaXZlcyBkdXJpbmcgZGlzayByZWFkaW5nXG4gICAgICAgICAgICBsZXQgcGVuZGluZ0Nsb3NlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IGNodW5rTGlzdGVuZXIgPSAoZXZlbnQ6IHtcbiAgICAgICAgICAgICAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICAgIGNodW5rSWQ6IHN0cmluZztcbiAgICAgICAgICAgIH0pID0+IHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBlbXB0eSBjaHVua3MgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCBkaXNrIHJlYWRpbmcgYmVoYXZpb3JcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmNodW5rRGF0YS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaXZlcmVkQ2h1bmtJZHMuYWRkKGV2ZW50LmNodW5rSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBCdWZmZXIgY2h1bmtzIHRoYXQgYXJyaXZlIGR1cmluZyBkaXNrIHJlYWRpbmcgdG8gbWFpbnRhaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudCB3aGVuIGVucXVldWVkIGxhdGVyXG4gICAgICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGNodW5rSWQ6IGV2ZW50LmNodW5rSWQsXG4gICAgICAgICAgICAgICAgICBjaHVua0RhdGE6IFVpbnQ4QXJyYXkuZnJvbShldmVudC5jaHVua0RhdGEpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkZWxpdmVyZWRDaHVua0lkcy5oYXMoZXZlbnQuY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGR1cGxpY2F0ZXM6IHBvbGxpbmcgbWF5IGhhdmUgYWxyZWFkeSBjbGFpbWVkIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBjaHVuayBiZXR3ZWVuIGl0cyBoYXMoKSBjaGVjayBhbmQgcmVhZEJ1ZmZlcigpIHlpZWxkLlxuICAgICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChldmVudC5jaHVua0lkKTtcbiAgICAgICAgICAgICAgICAvLyBBZnRlciBkaXNrIHJlYWRpbmcgaXMgY29tcGxldGUsIGRlbGl2ZXIgY2h1bmtzIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29weSB0byBwcmV2ZW50IEFycmF5QnVmZmVyIGRldGFjaG1lbnRcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGV2ZW50LmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBjbG9zZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIgY2xvc2UgZXZlbnQgaWYgZGlzayByZWFkaW5nIGlzIHN0aWxsIGluIHByb2dyZXNzXG4gICAgICAgICAgICAgIGlmIChpc1JlYWRpbmdGcm9tRGlzaykge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdDbG9zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgYmVmb3JlIGNsb3NpbmdcbiAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGVhcmRvd24oKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBjb250cm9sbGVyIGlzIGFscmVhZHkgY2xvc2VkIChlLmcuLCBmcm9tIGNhbmNlbCgpIG9yIEVPRilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFRlYXIgZG93biBsaXN0ZW5lcnMgYW5kIHRoZSBwb2xsIHVuY29uZGl0aW9uYWxseS4gVW5saWtlXG4gICAgICAgICAgICAvLyBjbG9zZUxpc3RlbmVyIHRoaXMgbmV2ZXIgZGVmZXJzIG9uIGlzUmVhZGluZ0Zyb21EaXNrLCBzbyBjYW5jZWwoKVxuICAgICAgICAgICAgLy8gcmVsaWFibHkgcmVsZWFzZXMgdGhlIHJlYWRlciBldmVuIG1pZC1kaXNrLXJlYWQuXG4gICAgICAgICAgICB0ZWFyZG93biA9ICgpID0+IHtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNodW5rOiR7bmFtZX1gIGFzIGNvbnN0LCBjaHVua0xpc3RlbmVyKTtcbiAgICAgICAgICAgICAgc3RyZWFtRW1pdHRlci5vZmYoYGNsb3NlOiR7bmFtZX1gIGFzIGNvbnN0LCBjbG9zZUxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgaWYgKHBvbGxJbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKTtcbiAgICAgICAgICAgICAgICBwb2xsSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTZXQgdXAgbGlzdGVuZXJzIEZJUlNUIHRvIGF2b2lkIG1pc3NpbmcgZXZlbnRzXG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjaHVuazoke25hbWV9YCBhcyBjb25zdCwgY2h1bmtMaXN0ZW5lcik7XG4gICAgICAgICAgICBzdHJlYW1FbWl0dGVyLm9uKGBjbG9zZToke25hbWV9YCBhcyBjb25zdCwgY2xvc2VMaXN0ZW5lcik7XG5cbiAgICAgICAgICAgIC8vIE5vdyBsb2FkIGV4aXN0aW5nIGNodW5rcyBmcm9tIGRpc2suXG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGZpbGVzOiBjaHVua0ZpbGVzLFxuICAgICAgICAgICAgICBleHRNYXA6IGZpbGVFeHRNYXAsXG4gICAgICAgICAgICAgIGRpcjogY2h1bmtzRGlyLFxuICAgICAgICAgICAgfSA9IGF3YWl0IGxpc3RDaHVua0ZpbGVzRm9yU3RyZWFtKGNodW5rc0Jhc2VEaXIsIG5hbWUsIHRhZyk7XG5cbiAgICAgICAgICAgIC8vIFJlc29sdmUgbmVnYXRpdmUgc3RhcnRJbmRleCByZWxhdGl2ZSB0byB0aGUgbnVtYmVyIG9mIGRhdGEgY2h1bmtzXG4gICAgICAgICAgICAvLyAoZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBFT0YgbWFya2VyIGNodW5rLCBpZiBwcmVzZW50KS5cbiAgICAgICAgICAgIGxldCBkYXRhQ2h1bmtDb3VudCA9IGNodW5rRmlsZXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgc3RhcnRJbmRleCA8IDAgJiZcbiAgICAgICAgICAgICAgY2h1bmtGaWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgbGFzdEZpbGUgPSBjaHVua0ZpbGVzW2NodW5rRmlsZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgIGNvbnN0IGxhc3RFeHQgPSBmaWxlRXh0TWFwLmdldChsYXN0RmlsZSkgPz8gJy5iaW4nO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaXNFb2ZCeXRlKFxuICAgICAgICAgICAgICAgICAgYXdhaXQgcmVhZEZpcnN0Qnl0ZShcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKGNodW5rc0RpciwgYCR7bGFzdEZpbGV9JHtsYXN0RXh0fWApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBkYXRhQ2h1bmtDb3VudC0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFN0YXJ0SW5kZXggPVxuICAgICAgICAgICAgICB0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ251bWJlcicgJiYgc3RhcnRJbmRleCA8IDBcbiAgICAgICAgICAgICAgICA/IE1hdGgubWF4KDAsIGRhdGFDaHVua0NvdW50ICsgc3RhcnRJbmRleClcbiAgICAgICAgICAgICAgICA6IHN0YXJ0SW5kZXg7XG5cbiAgICAgICAgICAgIC8vIFByb2Nlc3MgZXhpc3RpbmcgY2h1bmtzLCBza2lwcGluZyBhbnkgYWxyZWFkeSBkZWxpdmVyZWQgdmlhIGV2ZW50c1xuICAgICAgICAgICAgbGV0IGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSByZXNvbHZlZFN0YXJ0SW5kZXg7IGkgPCBjaHVua0ZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBjaHVua0ZpbGVzW2ldO1xuICAgICAgICAgICAgICAvLyBGaWxlcyBhcmUgc2hhcmRlZCBwZXIgc3RyZWFtLCBzbyB0aGUga2V5IGlzIGFscmVhZHkgdGhlIGNodW5rIGlkXG4gICAgICAgICAgICAgIC8vIChubyBzdHJlYW0tbmFtZSBwcmVmaXgsIHRhZyBzdWZmaXggYWxyZWFkeSBzdHJpcHBlZCkuXG4gICAgICAgICAgICAgIGNvbnN0IGNodW5rSWQgPSBmaWxlO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBkZWxpdmVyZWQgdmlhIGV2ZW50XG4gICAgICAgICAgICAgIGlmIChkZWxpdmVyZWRDaHVua0lkcy5oYXMoY2h1bmtJZCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGVFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBkZXNlcmlhbGl6ZUNodW5rKFxuICAgICAgICAgICAgICAgIGF3YWl0IHJlYWRCdWZmZXIocGF0aC5qb2luKGNodW5rc0RpciwgYCR7ZmlsZX0ke2V4dH1gKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUcmFjayBhcyBoYW5kbGVkIHNvIHBvbGxpbmcgZG9lc24ndCByZS1kZWxpdmVyXG4gICAgICAgICAgICAgIGRlbGl2ZXJlZENodW5rSWRzLmFkZChjaHVua0lkKTtcbiAgICAgICAgICAgICAgaWYgKGNodW5rLmNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IHRvIHByZXZlbnQgQXJyYXlCdWZmZXIgZGV0YWNobWVudFxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShVaW50OEFycmF5LmZyb20oY2h1bmsuY2h1bmspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5pc2hlZCByZWFkaW5nIGZyb20gZGlzayAtIG5vdyBkZWxpdmVyIGJ1ZmZlcmVkIGV2ZW50IGNodW5rcyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICAgICAgICBpc1JlYWRpbmdGcm9tRGlzayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBTb3J0IGJ1ZmZlcmVkIGNodW5rcyBieSBVTElEIChjaHJvbm9sb2dpY2FsIG9yZGVyKVxuICAgICAgICAgICAgYnVmZmVyZWRFdmVudENodW5rcy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICBhLmNodW5rSWQubG9jYWxlQ29tcGFyZShiLmNodW5rSWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBidWZmZXJlZCBvZiBidWZmZXJlZEV2ZW50Q2h1bmtzKSB7XG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgZm9yIGRlZmVuc2UgaW4gZGVwdGggKGFscmVhZHkgY29waWVkIGF0IHN0b3JhZ2UsIGJ1dCBiZSBleHRyYSBzYWZlKVxuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoVWludDhBcnJheS5mcm9tKGJ1ZmZlcmVkLmNodW5rRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNDb21wbGV0ZSkge1xuICAgICAgICAgICAgICBzdHJlYW1DbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB0ZWFyZG93bigpO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGlmIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBjbG9zZWQgKGUuZy4sIGZyb20gY2xvc2VMaXN0ZW5lciBldmVudClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb2Nlc3MgYW55IHBlbmRpbmcgY2xvc2UgZXZlbnQgdGhhdCBhcnJpdmVkIGR1cmluZyBkaXNrIHJlYWRpbmdcbiAgICAgICAgICAgIGlmIChwZW5kaW5nQ2xvc2UpIHtcbiAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGVhcmRvd24oKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBjb250cm9sbGVyIGlzIGFscmVhZHkgY2xvc2VkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmFjayBwcmUtc3RhcnRJbmRleCBjaHVua3Mgc28gcG9sbGluZyBkb2Vzbid0IHJlLWRlbGl2ZXIgdGhlbVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICBpIDwgcmVzb2x2ZWRTdGFydEluZGV4ICYmIGkgPCBjaHVua0ZpbGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gRmlsZXMgYXJlIHNoYXJkZWQgcGVyIHN0cmVhbTogdGhlIGtleSBpcyBhbHJlYWR5IHRoZSBjaHVuayBpZC5cbiAgICAgICAgICAgICAgZGVsaXZlcmVkQ2h1bmtJZHMuYWRkKGNodW5rRmlsZXNbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVhZGVyIHdhcyBhbHJlYWR5IGNhbmNlbGxlZC9jbG9zZWQgd2hpbGUgd2Ugd2VyZSByZWFkaW5nXG4gICAgICAgICAgICAvLyBmcm9tIGRpc2sgYWJvdmUgKHN0YXJ0KCkgeWllbGRzIGF0IGV2ZXJ5IGF3YWl0KSwgZG9uJ3QgYXJtIHRoZVxuICAgICAgICAgICAgLy8gcG9sbCDigJQgY2FuY2VsKCkncyB0ZWFyZG93biByYW4gYmVmb3JlIHRoaXMgcG9pbnQgYW5kIHdvdWxkIGxlYXZlXG4gICAgICAgICAgICAvLyB0aGUgZnJlc2hseS1jcmVhdGVkIGludGVydmFsIG9ycGhhbmVkLlxuICAgICAgICAgICAgaWYgKHN0cmVhbUNsb3NlZCkge1xuICAgICAgICAgICAgICB0ZWFyZG93bigpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGZpbGVzeXN0ZW0gcG9sbGluZyBmb3IgY3Jvc3MtcHJvY2VzcyBzdHJlYW1pbmcgc3VwcG9ydC5cbiAgICAgICAgICAgIC8vIFRoZSBFdmVudEVtaXR0ZXIgb25seSB3b3JrcyBpbi1wcm9jZXNzOyB3aGVuIHRoZSB3cml0ZXIgaXMgaW4gYVxuICAgICAgICAgICAgLy8gc2VwYXJhdGUgcHJvY2VzcyAoZS5nLiBlMmUgdGVzdCBydW5uZXIg4oaUIHdvcmtiZW5jaCBhcHApLCBwb2xsaW5nXG4gICAgICAgICAgICAvLyB0aGUgc2hhcmVkIGZpbGVzeXN0ZW0gaXMgdGhlIGZhbGxiYWNrIGRlbGl2ZXJ5IG1lY2hhbmlzbS5cbiAgICAgICAgICAgIGxldCBpc1BvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHBvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGlzUG9sbGluZykgcmV0dXJuO1xuICAgICAgICAgICAgICBpc1BvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsZXM6IGN1cnJlbnRGaWxlcywgZXh0TWFwOiBjdXJyZW50RXh0TWFwIH0gPVxuICAgICAgICAgICAgICAgICAgYXdhaXQgbGlzdENodW5rRmlsZXNGb3JTdHJlYW0oY2h1bmtzQmFzZURpciwgbmFtZSwgdGFnKTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBjdXJyZW50RmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEZpbGVzIGFyZSBzaGFyZGVkIHBlciBzdHJlYW06IHRoZSBrZXkgaXMgYWxyZWFkeSB0aGUgY2h1bmsgaWQuXG4gICAgICAgICAgICAgICAgICBjb25zdCBjaHVua0lkID0gZmlsZTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGRlbGl2ZXJlZENodW5rSWRzLmhhcyhjaHVua0lkKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBkZWxpdmVyZWRDaHVua0lkcy5hZGQoY2h1bmtJZCk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGN1cnJlbnRFeHRNYXAuZ2V0KGZpbGUpID8/ICcuYmluJztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gZGVzZXJpYWxpemVDaHVuayhcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVhZEJ1ZmZlcihwYXRoLmpvaW4oY2h1bmtzRGlyLCBgJHtmaWxlfSR7ZXh0fWApKVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGNodW5rPy5lb2YgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGVhcmRvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBjb250cm9sbGVyIGlzIGFscmVhZHkgY2xvc2VkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVucXVldWUtYWZ0ZXItY2xvc2U6IGNsb3NlTGlzdGVuZXIgbWF5IGhhdmVcbiAgICAgICAgICAgICAgICAgIC8vIGZpcmVkIGJldHdlZW4gb3VyIHJlYWRCdWZmZXIoKSB5aWVsZCBhbmQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1DbG9zZWQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgaWYgKGNodW5rLmNodW5rLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKFVpbnQ4QXJyYXkuZnJvbShjaHVuay5jaHVuaykpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIHRyYW5zaWVudCBmaWxlc3lzdGVtIGVycm9ycyAoRU5PRU5ULCBFQUNDRVMsIGV0Yy4pXG4gICAgICAgICAgICAgICAgLy8gU3VyZmFjZSB1bmV4cGVjdGVkIGVycm9ycyBzbyBidWdzIGFyZW4ndCBoaWRkZW5cbiAgICAgICAgICAgICAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyKSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3dvcmxkLWxvY2FsXSBVbmV4cGVjdGVkIHBvbGxpbmcgZXJyb3I6JywgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaXNQb2xsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgICAgIHN0cmVhbUNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICB0ZWFyZG93bigpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/world-local",
3
- "version": "5.0.0-beta.23",
3
+ "version": "5.0.0-beta.24",
4
4
  "description": "Local development World implementation for Workflow SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -28,9 +28,9 @@
28
28
  "ulid": "~3.0.1",
29
29
  "undici": "7.28.0",
30
30
  "zod": "~4.3.6",
31
- "@workflow/errors": "5.0.0-beta.9",
32
- "@workflow/utils": "5.0.0-beta.5",
33
- "@workflow/world": "5.0.0-beta.15"
31
+ "@workflow/errors": "5.0.0-beta.10",
32
+ "@workflow/utils": "5.0.0-beta.6",
33
+ "@workflow/world": "5.0.0-beta.16"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@opentelemetry/api": "1.9.0",