@workflow/core 5.0.0-beta.29 → 5.0.0-beta.30

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 (46) hide show
  1. package/dist/global.d.ts +20 -0
  2. package/dist/global.d.ts.map +1 -1
  3. package/dist/global.js +1 -1
  4. package/dist/runtime/constants.d.ts +54 -0
  5. package/dist/runtime/constants.d.ts.map +1 -1
  6. package/dist/runtime/constants.js +62 -1
  7. package/dist/runtime/helpers.d.ts +11 -3
  8. package/dist/runtime/helpers.d.ts.map +1 -1
  9. package/dist/runtime/helpers.js +21 -2
  10. package/dist/runtime/runs.d.ts +25 -1
  11. package/dist/runtime/runs.d.ts.map +1 -1
  12. package/dist/runtime/runs.js +6 -4
  13. package/dist/runtime/start.d.ts +28 -0
  14. package/dist/runtime/start.d.ts.map +1 -1
  15. package/dist/runtime/start.js +13 -3
  16. package/dist/runtime/step-executor.d.ts +13 -0
  17. package/dist/runtime/step-executor.d.ts.map +1 -1
  18. package/dist/runtime/step-executor.js +37 -5
  19. package/dist/runtime/step-latency.d.ts +6 -0
  20. package/dist/runtime/step-latency.d.ts.map +1 -1
  21. package/dist/runtime/step-latency.js +22 -2
  22. package/dist/runtime/step-ownership.d.ts +72 -0
  23. package/dist/runtime/step-ownership.d.ts.map +1 -0
  24. package/dist/runtime/step-ownership.js +114 -0
  25. package/dist/runtime/step-single-flight.d.ts +12 -0
  26. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  27. package/dist/runtime/step-single-flight.js +69 -0
  28. package/dist/runtime.d.ts +1 -1
  29. package/dist/runtime.d.ts.map +1 -1
  30. package/dist/runtime.js +253 -51
  31. package/dist/serialization-format.d.ts +1 -0
  32. package/dist/serialization-format.d.ts.map +1 -1
  33. package/dist/serialization-format.js +17 -52
  34. package/dist/serialization.d.ts.map +1 -1
  35. package/dist/serialization.js +41 -2
  36. package/dist/step.d.ts.map +1 -1
  37. package/dist/step.js +30 -5
  38. package/dist/telemetry/semantic-conventions.d.ts +16 -0
  39. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  40. package/dist/telemetry/semantic-conventions.js +13 -1
  41. package/dist/telemetry.d.ts +8 -0
  42. package/dist/telemetry.d.ts.map +1 -1
  43. package/dist/telemetry.js +25 -1
  44. package/dist/version.d.ts +1 -1
  45. package/dist/version.js +2 -2
  46. package/package.json +4 -4
@@ -26,7 +26,7 @@ import * as workflowModule from './serialization/workflow.js';
26
26
  import { contextStorage } from './step/context-storage.js';
27
27
  import { ABORT_HOOK_TOKEN, ABORT_LISTENER_ATTACHED, ABORT_READER_CANCEL, ABORT_STREAM_NAME, BODY_INIT_SYMBOL, STABLE_ULID, STREAM_FRAMING_SYMBOL, STREAM_NAME_SYMBOL, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, STREAM_SERVER_RUN_ID_SYMBOL, STREAM_TYPE_SYMBOL, WEBHOOK_RESPONSE_WRITABLE, } from './symbols.js';
28
28
  import * as Attr from './telemetry/semantic-conventions.js';
29
- import { getActiveSpan } from './telemetry.js';
29
+ import { getActiveSpan, getSpanKind, recordElapsedSpan } from './telemetry.js';
30
30
  import { getAbortStreamId } from './util.js';
31
31
  import { WorkflowAbortSignal } from './workflow/abort-controller.js';
32
32
  // Re-export types and utilities from the modular serialization modules
@@ -389,18 +389,48 @@ export function getByteUnframingStream() {
389
389
  },
390
390
  });
391
391
  }
392
+ /**
393
+ * Emit the client-observed end-to-end time-to-first-chunk span for a live read:
394
+ * read dispatch (`startEpochMs`) → the first non-empty chunk reaching the
395
+ * reader, including the network hop. Fire-and-forget; no-op without OTEL.
396
+ */
397
+ function recordReadTimeToFirstChunk(startEpochMs, runId, name, startIndex) {
398
+ void (async () => {
399
+ await recordElapsedSpan('workflow.stream.read', startEpochMs, {
400
+ kind: await getSpanKind('CLIENT'),
401
+ attributes: {
402
+ 'workflow.run.id': runId,
403
+ 'workflow.stream.name': name,
404
+ 'workflow.stream.operation': 'read',
405
+ 'workflow.stream.read.ttfc_ms': Date.now() - startEpochMs,
406
+ ...(typeof startIndex === 'number'
407
+ ? { 'workflow.stream.start_index': startIndex }
408
+ : {}),
409
+ },
410
+ });
411
+ })();
412
+ }
392
413
  export class WorkflowServerReadableStream extends ReadableStream {
393
414
  #reader;
394
415
  constructor(runId, name, startIndex) {
395
416
  if (typeof name !== 'string' || name.length === 0) {
396
417
  throw new WorkflowRuntimeError(`"name" is required, got "${name}"`);
397
418
  }
419
+ // Client-observed time-to-first-chunk state. `readStart` is stamped when the
420
+ // reader starts consuming (first pull → the read dispatch); the span is
421
+ // emitted once, when the first non-empty chunk reaches the reader. So its
422
+ // duration is the end-to-end TTFC including the network hop. No-op without
423
+ // an OpenTelemetry SDK registered.
424
+ let readStart;
425
+ let firstChunkReported = false;
398
426
  super({
399
427
  // @ts-expect-error Not sure why TypeScript is complaining about this
400
428
  type: 'bytes',
401
429
  pull: async (controller) => {
402
430
  let reader = this.#reader;
403
431
  if (!reader) {
432
+ if (readStart === undefined)
433
+ readStart = Date.now();
404
434
  const world = await getWorldLazy();
405
435
  const stream = await world.streams.get(runId, name, startIndex);
406
436
  reader = this.#reader = stream.getReader();
@@ -415,6 +445,15 @@ export class WorkflowServerReadableStream extends ReadableStream {
415
445
  controller.close();
416
446
  }
417
447
  else {
448
+ // The server flushes a leading zero-length chunk (v3+) to commit
449
+ // response headers before any data; skip empties so TTFC measures to
450
+ // the first real chunk.
451
+ if (!firstChunkReported &&
452
+ result.value.byteLength > 0 &&
453
+ readStart !== undefined) {
454
+ firstChunkReported = true;
455
+ recordReadTimeToFirstChunk(readStart, runId, name, startIndex);
456
+ }
418
457
  // Forward raw bytes; encryption/decryption is handled at the
419
458
  // framing level by getSerializeStream/getDeserializeStream.
420
459
  controller.enqueue(result.value);
@@ -2371,4 +2410,4 @@ function getStreamAndRequestRevivers(allRevivers) {
2371
2410
  }
2372
2411
  return extra;
2373
2412
  }
2374
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxPQUFPLElBQUksYUFBYSxFQUN4QixPQUFPLElBQUksYUFBYSxFQUV4QixTQUFTLEdBQ1YsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQywyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHlDQUF5QztBQUN6Qyw0REFBNEQ7QUFDNUQsc0VBQXNFO0FBQ3RFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFlBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBRUwsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxPQUFPLEVBRVAsT0FBTyxFQUNQLG9CQUFvQixHQUNyQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIscUJBQXFCLEdBQ3RCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUNMLGtCQUFr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eXB0aW9uRXJyb3IsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnksIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHtcbiAgZGVjcnlwdCBhcyBhZXNHY21EZWNyeXB0LFxuICBlbmNyeXB0IGFzIGFlc0djbUVuY3J5cHQsXG4gIHR5cGUgQ3J5cHRvS2V5LFxuICBpbXBvcnRLZXksXG59IGZyb20gJy4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVGbHVzaGFibGVTdGF0ZSxcbiAgZmx1c2hhYmxlUGlwZSxcbiAgcG9sbFJlYWRhYmxlTG9jayxcbiAgcG9sbFdyaXRhYmxlTG9jayxcbn0gZnJvbSAnLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG4vLyBWMjogdXNlIGdldFdvcmxkTGF6eSBpbiBzdGVwLXNpZGUgY29kZSBwYXRocyBzbyBUdXJib3BhY2sgY2FuIHN0YXRpY2FsbHlcbi8vIHJlc29sdmUgdGhlIHdvcmxkIGJyaWRnZSBmcm9tIHRoZSBzdGVwIGJ1bmRsZSB3aXRob3V0IGRyYWdnaW5nIHRoZSBmdWxsXG4vLyBob3N0IHdvcmxkIG1vZHVsZSBpbnRvIHRoZSBmbG93IHJvdXRlLlxuLy8gU2VlIGBwYWNrYWdlcy9jb3JlL3NyYy9ydW50aW1lL2dldC13b3JsZC1sYXp5LnRzYCBhbmQgdGhlXG4vLyBcIlR1cmJvcGFjayBORlQgVHJhY2luZyBFcnJvcnMgaW4gVjIgQ29tYmluZWQgRmxvdyBSb3V0ZVwiIHNlY3Rpb24gb2Zcbi8vIGBkb2NzL2NvbnRlbnQvZG9jcy9jaGFuZ2Vsb2cvZWFnZXItcHJvY2Vzc2luZy5tZHhgLlxuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCAqIGFzIGNsaWVudE1vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY2xpZW50LmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ29tcHJlc3Npb25TdGF0cyxcbiAgY29tcHJlc3MsXG4gIGRlY29tcHJlc3MsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9jb21wcmVzc2lvbi5qcyc7XG5pbXBvcnQge1xuICBkZWNyeXB0LFxuICB0eXBlIEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZW5jcnlwdCxcbiAgcmVzb2x2ZUVuY3J5cHRpb25LZXksXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcixcbiAgcmV0aHJvd0lmUnVudGltZUVycm9yLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZXJyb3JzLmpzJztcbmltcG9ydCB7XG4gIGRlY29kZUZvcm1hdFByZWZpeCxcbiAgZW5jb2RlV2l0aEZvcm1hdFByZWZpeCxcbiAgaXNFbmNyeXB0ZWQsXG4gIHBlZWtGb3JtYXRQcmVmaXgsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9mb3JtYXQuanMnO1xuaW1wb3J0IHtcbiAgZ2V0Q2xhc3NSZWR1Y2VycyxcbiAgZ2V0Q2xhc3NSZXZpdmVycyxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7XG4gIGdldENvbW1vblJlZHVjZXJzLFxuICBnZXRDb21tb25SZXZpdmVycyBhcyBnZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUsXG4gIHJldml2ZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL2NvbW1vbi5qcyc7XG5pbXBvcnQge1xuICBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyLFxuICBnZXRTdGVwRnVuY3Rpb25SZXZpdmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBzdGVwTW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRm9ybWF0UHJlZml4LFxuICBpc0Zvcm1hdFByZWZpeCxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcbmltcG9ydCAqIGFzIHdvcmtmbG93TW9kdWxlIGZyb20gJy4vc2VyaWFsaXphdGlvbi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQUJPUlRfSE9PS19UT0tFTixcbiAgQUJPUlRfTElTVEVORVJfQVRUQUNIRUQsXG4gIEFCT1JUX1JFQURFUl9DQU5DRUwsXG4gIEFCT1JUX1NUUkVBTV9OQU1FLFxuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MLFxuICBTVFJFQU1fTkFNRV9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gIFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCxcbiAgU1RSRUFNX1RZUEVfU1lNQk9MLFxuICBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFLFxufSBmcm9tICcuL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0ciBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVTcGFuIH0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0QWJvcnRTdHJlYW1JZCB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0Fib3J0U2lnbmFsIH0gZnJvbSAnLi93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLmpzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGFuZCB1dGlsaXRpZXMgZnJvbSB0aGUgbW9kdWxhciBzZXJpYWxpemF0aW9uIG1vZHVsZXNcbi8vIHNvIGV4aXN0aW5nIGNvbnN1bWVycyBvZiBgQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbmAga2VlcCB3b3JraW5nLlxuZXhwb3J0IHtcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgdHlwZSBGb3JtYXRQcmVmaXgsXG4gIGlzRm9ybWF0UHJlZml4LFxuICBlbmNvZGVXaXRoRm9ybWF0UHJlZml4LFxuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIHBlZWtGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBlbmNyeXB0LFxuICBkZWNyeXB0LFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG59O1xuXG4vLyBSZS1leHBvcnQgdGhlIGxlZ2FjeSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4vLyBOZXcgY29kZSBzaG91bGQgdXNlIEZvcm1hdFByZWZpeCBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnLlxuZXhwb3J0IHR5cGUgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUgPVxuICAodHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXQpW2tleW9mIHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0XTtcblxuLyoqXG4gKiBEZWZhdWx0IFVMSUQgZ2VuZXJhdG9yIGZvciBjb250ZXh0cyB3aGVyZSBWTSdzIHNlZWRlZCBgc3RhYmxlVWxpZGAgaXNuJ3QgYXZhaWxhYmxlLlxuICogVXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gc2VyaWFsaXppbmcgc3RyZWFtcyBvdXRzaWRlIHRoZSB3b3JrZmxvdyBWTSBjb250ZXh0XG4gKiAoZS5nLiwgd2hlbiBzdGFydGluZyBhIHdvcmtmbG93IG9yIGhhbmRsaW5nIHN0ZXAgcmV0dXJuIHZhbHVlcykuXG4gKi9cbmNvbnN0IGRlZmF1bHRVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIERldGVjdCBpZiBhIHJlYWRhYmxlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSBzdHJlYW1cbiAqIEByZXR1cm5zIGBcImJ5dGVzXCJgIGlmIHRoZSBzdHJlYW0gaXMgYSBieXRlIHN0cmVhbSwgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJlYW1UeXBlKHN0cmVhbTogUmVhZGFibGVTdHJlYW0pOiAnYnl0ZXMnIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKHsgbW9kZTogJ2J5b2InIH0pO1xuICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgIHJldHVybiAnYnl0ZXMnO1xuICB9IGNhdGNoIHt9XG59XG5cbi8qKlxuICogRnJhbWUgZm9ybWF0IGZvciBzdHJlYW0gY2h1bmtzOlxuICogICBbNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXVtmb3JtYXQtcHJlZml4ZWQgcGF5bG9hZF1cbiAqXG4gKiBFYWNoIGNodW5rIGlzIGluZGVwZW5kZW50bHkgZnJhbWVkIHNvIHRoZSBkZXNlcmlhbGl6ZXIgY2FuIGZpbmRcbiAqIGNodW5rIGJvdW5kYXJpZXMgZXZlbiB3aGVuIG11bHRpcGxlIGNodW5rcyBhcmUgY29uY2F0ZW5hdGVkIG9yXG4gKiBzcGxpdCBhY3Jvc3MgdHJhbnNwb3J0IHJlYWRzLlxuICovXG5jb25zdCBGUkFNRV9IRUFERVJfU0laRSA9IDQ7XG5cbi8qKlxuICogVGhlIG1vZGUtc3BlY2lmaWMgc2VyaWFsaXplcnMgKGAuL3NlcmlhbGl6YXRpb24ve2NsaWVudCxzdGVwLHdvcmtmbG93fS50c2ApXG4gKiBhbHJlYWR5IHRocm93IGEgYFNlcmlhbGl6YXRpb25FcnJvcmAgd2hvc2UgYC5jYXVzZWAgaXMgdGhlIHVuZGVybHlpbmdcbiAqIGRldmFsdWUgLyBzZXJkZSBmYWlsdXJlLiBUaGUgb3V0ZXIgZGVoeWRyYXRlL2h5ZHJhdGUgd3JhcHBlcnMgd2FudCB0b1xuICogcmUtZnJhbWUgdGhhdCBlcnJvciB3aXRoIGEgbW9yZSBzcGVjaWZpYyBjb250ZXh0IGxhYmVsIChlLmcuIFwid29ya2Zsb3dcbiAqIGFyZ3VtZW50c1wiIGluc3RlYWQgb2YgZ2VuZXJpYyBcIndvcmtmbG93IHZhbHVlXCIpLCBzbyB0aGV5IHVud3JhcCB0aGVcbiAqIGlubmVyIFNlcmlhbGl6YXRpb25FcnJvciBhbmQgcmVmb3JtYXQgd2l0aCB0aGUgb3JpZ2luYWwgY2F1c2UuIEVycm9yc1xuICogdGhhdCBhcmVuJ3QgYWxyZWFkeSBTZXJpYWxpemF0aW9uRXJyb3IgZmxvdyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAqXG4gKiBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgaXMgYW4gZXhjZXB0aW9uOiBpdCBtdXN0IGtlZXAgaXRzIGlkZW50aXR5IChhbmRcbiAqIGBjb250ZXh0YCkgc28gdGhlIHJ1bi1mYWlsdXJlIGNsYXNzaWZpZXIgcm91dGVzIGl0IHRvIGBSVU5USU1FX0VSUk9SYCxcbiAqIHNvIHRoaXMgcmV0aHJvd3MgaXQgdW5jaGFuZ2VkIGJlZm9yZSBhbnkgdW53cmFwcGluZy4gTm90ZSB0aGlzIGd1YXJkXG4gKiBtdXN0IHJ1biBiZWZvcmUgdGhlIGdlbmVyaWMgYFdvcmtmbG93UnVudGltZUVycm9yYCB1bndyYXAgYmVsb3csIHNpbmNlXG4gKiBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgZXh0ZW5kcyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIGFuZCBjYXJyaWVzIGFcbiAqIGBjYXVzZWAgKHRoZSB1bmRlcmx5aW5nIERPTUV4Y2VwdGlvbikgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgdW53cmFwcGVkXG4gKiBhbmQgcmVmcmFtZWQgYXMgYSBgU2VyaWFsaXphdGlvbkVycm9yYC5cbiAqL1xuZnVuY3Rpb24gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcihlcnJvcik7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlcmlhbGl6YXRpb25FcnJvciAmJiBlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVycm9yLmNhdXNlO1xuICB9XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93UnVudGltZUVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG4vKipcbiAqIEVtaXQgY29tcHJlc3Npb24gdGVsZW1ldHJ5IG9udG8gdGhlIGFjdGl2ZSBzcGFuIGFmdGVyIGEgKGRlKXNlcmlhbGl6ZS5cbiAqXG4gKiBUaGUgY29tcHJlc3Npb24gbGF5ZXIgcG9wdWxhdGVzIGBzdGF0c2Agb25seSB3aGVuIGl0IGFjdHVhbGx5IHJhbiAoYmluYXJ5XG4gKiBkYXRhIG9uIGEgc3BlYyA+PSA1IHBhdGgpOyBsZWdhY3kgLyB2MUNvbXBhdCBwYXRocyBsZWF2ZSBpdCB1bnJlY29yZGVkLCBzb1xuICogdGhpcyBuby1vcHMgZm9yIHRoZW0gYW5kIGF2b2lkcyB0aGUgYGdldEFjdGl2ZVNwYW5gIGxvb2t1cC4gQXR0cmlidXRlcyBsYW5kXG4gKiBvbiB3aGF0ZXZlciBzcGFuIGlzIGFjdGl2ZSDigJQgdHlwaWNhbGx5IHRoZSBkZWRpY2F0ZWQgYHN0ZXAuZGVoeWRyYXRlYCAvXG4gKiBgc3RlcC5oeWRyYXRlYCBzcGFuLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBydW4vc3RhcnQgc3Bhbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkQ29tcHJlc3Npb24oXG4gIHN0YXRzOiBDb21wcmVzc2lvblN0YXRzLFxuICBvcGVyYXRpb246ICdzZXJpYWxpemUnIHwgJ2Rlc2VyaWFsaXplJ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghc3RhdHMucmVjb3JkZWQpIHJldHVybjtcbiAgLy8gVGVsZW1ldHJ5IG11c3QgbmV2ZXIgYnJlYWsgdGhlIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBkYXRhIHBhdGgg4oCUIGFcbiAgLy8gbWlzc2luZy9mYWlsaW5nIHRyYWNlciBpcyBwdXJlbHkgYW4gb2JzZXJ2YWJpbGl0eSBsb3NzLlxuICB0cnkge1xuICAgIGNvbnN0IHNwYW4gPSBhd2FpdCBnZXRBY3RpdmVTcGFuKCk7XG4gICAgaWYgKCFzcGFuKSByZXR1cm47XG4gICAgY29uc3QgdW5jb21wcmVzc2VkQnl0ZXMgPSBzdGF0cy51bmNvbXByZXNzZWRCeXRlcyA/PyAwO1xuICAgIGNvbnN0IHN0b3JlZEJ5dGVzID0gc3RhdHMuc3RvcmVkQnl0ZXMgPz8gMDtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uT3BlcmF0aW9uKG9wZXJhdGlvbiksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db21wcmVzc2VkKHN0YXRzLmNvbXByZXNzZWQgPz8gZmFsc2UpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uQ29kZWMoc3RhdHMuY29kZWMgPz8gJ25vbmUnKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvblVuY29tcHJlc3NlZEJ5dGVzKHVuY29tcHJlc3NlZEJ5dGVzKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvblN0b3JlZEJ5dGVzKHN0b3JlZEJ5dGVzKSxcbiAgICAgIC4uLihzdGF0cy5jb21wcmVzc2VkICYmIHVuY29tcHJlc3NlZEJ5dGVzID4gMFxuICAgICAgICA/IEF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzaW9uUmF0aW8oXG4gICAgICAgICAgICAxIC0gc3RvcmVkQnl0ZXMgLyB1bmNvbXByZXNzZWRCeXRlc1xuICAgICAgICAgIClcbiAgICAgICAgOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSB0ZWxlbWV0cnkgZmFpbHVyZXNcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICByZWR1Y2VyczogUGFydGlhbDxSZWR1Y2Vycz4sXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBUcmFuc2Zvcm1TdHJlYW08YW55LCBVaW50OEFycmF5PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0LlxuICAvLyBOb3RlOiBpZiByZXNvbHZpbmcgY3J5cHRvS2V5IHJlamVjdHMgKGUuZy4sIG5ldHdvcmsgZXJyb3IgZmV0Y2hpbmdcbiAgLy8gdGhlIGRlcml2ZWQga2V5KSwgdGhlIHJlamVjdGlvbiB3b24ndCBzdXJmYWNlIHVudGlsIHRoZSBmaXJzdCBjaHVua1xuICAvLyBpcyBwcm9jZXNzZWQg4oCUIG5vdCBhdCBzdHJlYW0gY29uc3RydWN0aW9uIHRpbWUuXG4gIGNvbnN0IGtleVN0YXRlID0geyByZXNvbHZlZDogZmFsc2UsIGtleTogdW5kZWZpbmVkIGFzIENyeXB0b0tleSB8IHVuZGVmaW5lZCB9O1xuICBjb25zdCBzdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPGFueSwgVWludDhBcnJheT4oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFrZXlTdGF0ZS5yZXNvbHZlZCkge1xuICAgICAgICAgIGtleVN0YXRlLmtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzdHJpbmdpZnkoY2h1bmssIHJlZHVjZXJzKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKHNlcmlhbGl6ZWQpO1xuICAgICAgICBsZXQgcHJlZml4ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICkgYXMgVWludDhBcnJheTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBmcmFtZSBwYXlsb2FkIGlmIGEga2V5IGlzIHByb3ZpZGVkLlxuICAgICAgICAvLyBUaGUgbGVuZ3RoIGhlYWRlciByZW1haW5zIGluIHRoZSBjbGVhciBzbyB0aGUgZGVzZXJpYWxpemVyIGNhblxuICAgICAgICAvLyBmaW5kIGZyYW1lIGJvdW5kYXJpZXMgcmVnYXJkbGVzcyBvZiB0cmFuc3BvcnQgY2h1bmtpbmcuXG4gICAgICAgIGlmIChrZXlTdGF0ZS5rZXkpIHtcbiAgICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBhZXNHY21FbmNyeXB0KGtleVN0YXRlLmtleSwgcHJlZml4ZWQpO1xuICAgICAgICAgIHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVELFxuICAgICAgICAgICAgZW5jcnlwdGVkXG4gICAgICAgICAgKSBhcyBVaW50OEFycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgbGVuZ3RoLXByZWZpeGVkIGZyYW1lOiBbNC1ieXRlIGxlbmd0aF1bcHJlZml4ZWQgZGF0YV1cbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgVWludDhBcnJheShGUkFNRV9IRUFERVJfU0laRSArIHByZWZpeGVkLmxlbmd0aCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhmcmFtZS5idWZmZXIpLnNldFVpbnQzMigwLCBwcmVmaXhlZC5sZW5ndGgsIGZhbHNlKTtcbiAgICAgICAgZnJhbWUuc2V0KHByZWZpeGVkLCBGUkFNRV9IRUFERVJfU0laRSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShmcmFtZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFbmNyeXB0aW9uIGZhaWx1cmVzIG11c3Qga2VlcCB0aGVpciBSdW50aW1lRGVjcnlwdGlvbkVycm9yXG4gICAgICAgIC8vIGlkZW50aXR5IChSVU5USU1FX0VSUk9SKSByYXRoZXIgdGhhbiBiZSByZWZyYW1lZCBhcyBhXG4gICAgICAgIC8vIFNlcmlhbGl6YXRpb25FcnJvciAoVVNFUl9FUlJPUikuXG4gICAgICAgIGlmIChSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnc3RyZWFtIGNodW5rJyxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZTogZXJyb3IgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICByZXZpdmVyczogUGFydGlhbDxSZXZpdmVycz4sXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgYW55PiB7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHQuXG4gIGNvbnN0IGtleVN0YXRlID0geyByZXNvbHZlZDogZmFsc2UsIGtleTogdW5kZWZpbmVkIGFzIENyeXB0b0tleSB8IHVuZGVmaW5lZCB9O1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBuZXdCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpO1xuICAgIG5ld0J1ZmZlci5zZXQoYnVmZmVyLCAwKTtcbiAgICBuZXdCdWZmZXIuc2V0KGRhdGEsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGcmFtZXMoXG4gICAgY29udHJvbGxlcjogVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI8YW55PlxuICApIHtcbiAgICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHRcbiAgICBpZiAoIWtleVN0YXRlLnJlc29sdmVkKSB7XG4gICAgICBrZXlTdGF0ZS5rZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBleHRyYWN0IGNvbXBsZXRlIGxlbmd0aC1wcmVmaXhlZCBmcmFtZXNcbiAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7IC8vIEluY29tcGxldGUgZnJhbWUsIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmcmFtZURhdGEgPSBidWZmZXIuc2xpY2UoXG4gICAgICAgIEZSQU1FX0hFQURFUl9TSVpFLFxuICAgICAgICBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoXG4gICAgICApO1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGgpO1xuXG4gICAgICBsZXQgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChmcmFtZURhdGEpO1xuXG4gICAgICAvLyBJZiB0aGUgZnJhbWUgcGF5bG9hZCBpcyBlbmNyeXB0ZWQsIGRlY3J5cHQgaXQgZmlyc3QgdG8gcmV2ZWFsXG4gICAgICAvLyB0aGUgaW5uZXIgZm9ybWF0LXByZWZpeGVkIGRhdGEgKGUuZy4sICdkZXZsJyArIHNlcmlhbGl6ZWQgdGV4dCksXG4gICAgICAvLyB0aGVuIGZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGRlc2VyaWFsaXphdGlvbiBwYXRoLlxuICAgICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpIHtcbiAgICAgICAgaWYgKCFrZXlTdGF0ZS5rZXkpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICAgICAgICAgICdFbmNyeXB0ZWQgc3RyZWFtIGRhdGEgZW5jb3VudGVyZWQgYnV0IG5vIGVuY3J5cHRpb24ga2V5IGlzIGF2YWlsYWJsZS4gJyArXG4gICAgICAgICAgICAgICAgJ0VuY3J5cHRpb24gaXMgbm90IGNvbmZpZ3VyZWQgb3Igbm8ga2V5IHdhcyBwcm92aWRlZCBmb3IgdGhpcyBydW4uJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogcGF5bG9hZC5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZm9ybWF0UHJlZml4OiAnZW5jcicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZWNyeXB0ZWQ6IFVpbnQ4QXJyYXk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVjcnlwdGVkID0gYXdhaXQgYWVzR2NtRGVjcnlwdChrZXlTdGF0ZS5rZXksIHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBsb3ctbGV2ZWwgQUVTIGxheWVyIG9ubHkgc2VlcyB0aGUgc3RyaXBwZWQgcGF5bG9hZCwgc28gaXRcbiAgICAgICAgICAvLyBjYW5ub3QgcmVjb3JkIHRoZSBvdXRlciBlbnZlbG9wZSBwcmVmaXguIFdlIHBlZWtlZCBpdCBoZXJlXG4gICAgICAgICAgLy8gKGBlbmNyYCksIHNvIGVucmljaCB0aGUgZGlhZ25vc3RpYyBjb250ZXh0IHdpdGggdGhlIHJlYWwgZm9ybWF0XG4gICAgICAgICAgLy8gcHJlZml4IGJlZm9yZSBwcm9wYWdhdGluZyDigJQgbWlycm9yaW5nIHNlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi50cy5cbiAgICAgICAgICBpZiAoUnVudGltZURlY3J5cHRpb25FcnJvci5pcyhlcnJvcikgJiYgZXJyb3IuY29udGV4dCkge1xuICAgICAgICAgICAgZXJyb3IuY29udGV4dC5mb3JtYXRQcmVmaXggPSBmb3JtYXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgICh7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRlY3J5cHRlZCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGRlY29kZXIuZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFyc2UodGV4dCwgcmV2aXZlcnMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIGFueT4oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgLy8gRmlyc3QsIHRyeSB0byBkZXRlY3QgaWYgdGhpcyBpcyBsZW5ndGgtcHJlZml4ZWQgZnJhbWVkIGRhdGFcbiAgICAgIC8vIGJ5IGNoZWNraW5nIGlmIHRoZSBmaXJzdCA0IGJ5dGVzIGZvcm0gYSBwbGF1c2libGUgbGVuZ3RoLlxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgY2h1bmsubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgIGNodW5rLmJ1ZmZlcixcbiAgICAgICAgICBjaHVuay5ieXRlT2Zmc2V0LFxuICAgICAgICAgIGNodW5rLmJ5dGVMZW5ndGhcbiAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcG9zc2libGVMZW5ndGggPiAwICYmXG4gICAgICAgICAgcG9zc2libGVMZW5ndGggPCAxMDBfMDAwXzAwMCAvLyBzYW5pdHkgY2hlY2s6IDwgMTAwTUJcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTG9va3MgbGlrZSBmcmFtZWQgZGF0YVxuICAgICAgICAgIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcbiAgICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBBbHJlYWR5IGluIGZyYW1lZCBtb2RlIChoYXZlIGJ1ZmZlcmVkIGRhdGEpXG4gICAgICAgIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWdhY3kgZm9ybWF0OiBuZXdsaW5lLWRlbGltaXRlZCBkZXZhbHVlIHRleHQgKG5vIGZyYW1pbmcpXG4gICAgICBjb25zdCB0ZXh0ID0gZGVjb2Rlci5kZWNvZGUoY2h1bmspO1xuICAgICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnNlKGxpbmUsIHJldml2ZXJzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIFByb2Nlc3MgYW55IHJlbWFpbmluZyBmcmFtZWQgZGF0YVxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ5dGUtc3RyZWFtIHdpcmUgZnJhbWluZ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIEJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgIFJlYWRhYmxlU3RyZWFtcyBwYXNzZWQgYWNyb3NzIGJvdW5kYXJpZXMpXG4vLyBhcmUgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB3b3JsZCdzIHN0cmVhbSB0cmFuc3BvcnQgb25lIHVzZXIgY2h1bmsgYXRcbi8vIGEgdGltZS4gV2l0aG91dCBhbiBpbi1iYW5kIGVudmVsb3BlLCB0aGUgcmVhZGVyIHNlZXMgYSBmbGF0IHN0cmVhbSBvZlxuLy8gYnl0ZXMg4oCUIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIHdoZXJlIG9uZSB1c2VyIGNodW5rIGVuZHMgYW5kIHRoZSBuZXh0XG4vLyBiZWdpbnMsIHdoaWNoIG1ha2VzIG1pZC1zdHJlYW0gcmVjb25uZWN0IGltcG9zc2libGUgKHdlIGRvbid0IGtub3cgaG93XG4vLyBtYW55IHNlcnZlci1zaWRlIGNodW5rcyBoYXZlIGJlZW4gY29uc3VtZWQpLlxuLy9cbi8vIFRvIGVuYWJsZSB0cmFuc3BhcmVudCByZWNvbm5lY3QsIHRoaXMgUFIgaW50cm9kdWNlcyBhbiBvcHQtaW4gd2lyZVxuLy8gZW52ZWxvcGUgdGhhdCB3cmFwcyBlYWNoIHVzZXIgY2h1bmsgaW4gYSBsZW5ndGgtcHJlZml4OlxuLy9cbi8vICAgWzQtYnl0ZSBiaWctZW5kaWFuIGxlbmd0aF1bdXNlciBwYXlsb2FkIGJ5dGVzXVxuLy9cbi8vIFRoZSBlbnZlbG9wZSBpcyBpZGVudGljYWwgaW4gc2hhcGUgdG8gYGdldFNlcmlhbGl6ZVN0cmVhbWAncyBmcmFtaW5nLFxuLy8gYnV0IHRoZSBwYXlsb2FkIGhlcmUgaXMgKnJhdyB1c2VyIGJ5dGVzKiDigJQgdGhlcmUgaXMgbm8gaW5uZXJcbi8vIGZvcm1hdC1wcmVmaXgsIG5vIGRldmFsdWUsIG5vIGVuY3J5cHRpb24uIEEgZnJhbWVkIGJ5dGUgc3RyZWFtIHN0YXlzXG4vLyBzZW1hbnRpY2FsbHkgYSBieXRlIHN0cmVhbSBlbmQtdG8tZW5kOyB0aGUgZnJhbWluZyBpcyBwdXJlbHkgdHJhbnNwb3J0LlxuLy9cbi8vIFRoZSBkZWNpc2lvbiB0byB1c2UgZnJhbWluZyBmb3IgYSBnaXZlbiBzdHJlYW0gaXMgcmVjb3JkZWQgaW4gdGhlXG4vLyBzZXJpYWxpemVkIHN0cmVhbSByZWYgKGBmcmFtaW5nOiAnZnJhbWVkLXYxJ2ApLCBzbyBib3RoIHNpZGVzIGFncmVlIG9uXG4vLyB0aGUgd2lyZSBmb3JtYXQgd2l0aG91dCBydW50aW1lIG5lZ290aWF0aW9uLiBQcm9kdWNlcnMgdGhhdCB0YXJnZXQgYVxuLy8gcnVuIHdob3NlIGRlcGxveW1lbnQgZG9lc24ndCBzdXBwb3J0IGZyYW1pbmcgKHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYFxuLy8gaW4gY2FwYWJpbGl0aWVzLnRzKSBlbWl0IHJhdyBieXRlcyBhbmQgYSByZWYgd2l0aG91dCB0aGUgZmllbGQg4oCUIHdoaWNoXG4vLyB0aGUgcmVhZGVyIHRyZWF0cyBhcyBsZWdhY3kgcmF3IGJ5dGVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblxuLyoqXG4gKiBNYXhpbXVtIGFsbG93ZWQgYnl0ZS1zdHJlYW0gZnJhbWUgcGF5bG9hZCBzaXplICgxMDBNQikuIFNoYXJlZCBieSB0aGVcbiAqIGZyYW1lciAocmVqZWN0cyBvdmVyc2l6ZWQgdXNlciBjaHVua3MgYXQgd3JpdGUgdGltZSwgd2hlcmUgdGhlIGVycm9yIGlzXG4gKiBhY3Rpb25hYmxlKSBhbmQgdGhlIHVuZnJhbWVyIChyZWplY3RzIG92ZXJzaXplZCBsZW5ndGggaGVhZGVycyBhdCByZWFkXG4gKiB0aW1lLCB3aGljaCB1c3VhbGx5IGluZGljYXRlIGEgbm9uLWZyYW1lZCB3aXJlIGJlaW5nIHJlYWQgYXMgZnJhbWVkKS5cbiAqIEtlZXBpbmcgYm90aCBzaWRlcyBvbiBvbmUgY29uc3RhbnQgZ3VhcmFudGVlcyBhbnkgY2h1bmsgdGhlIGZyYW1lclxuICogYWNjZXB0cyBjYW4gYWx3YXlzIGJlIGRlY29kZWQgYnkgdGhlIHVuZnJhbWVyLlxuICovXG5jb25zdCBNQVhfRlJBTUVfU0laRSA9IDEwMF8wMDBfMDAwO1xuXG4vKipcbiAqIFdyYXBzIGVhY2ggY2h1bmsgb2YgYSBieXRlIHN0cmVhbSBpbiBhIDQtYnl0ZSBiaWctZW5kaWFuIGxlbmd0aFxuICogcHJlZml4LiBVc2VkIGJ5IHRoZSBwcm9kdWNlciBzaWRlIG9mIGEgZnJhbWVkIGJ5dGUtc3RyZWFtIHBpcGUuXG4gKlxuICogRW1wdHkgY2h1bmtzIChsZW5ndGggMCkgYXJlIGRyb3BwZWQg4oCUIHRoZSByZXN1bHRpbmcgYFsweDAwIDB4MDAgMHgwMCAweDAwXWBcbiAqIGZyYW1lIHdvdWxkIGJlIGFtYmlndW91cyB3aXRoIHRoZSBsZWdhY3kgXCJsb29rcyBmcmFtZWRcIiBkZXRlY3Rpb24gaW5cbiAqIGBnZXREZXNlcmlhbGl6ZVN0cmVhbWAsIGFuZCBpdCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uLlxuICpcbiAqIExvYWQtYmVhcmluZyBpbnZhcmlhbnQ6IGVhY2ggdXNlciBjaHVuayBiZWNvbWVzIGV4YWN0bHkgb25lIGZyYW1lLCBhbmRcbiAqIGVhY2ggZnJhbWUgaXMgZW5xdWV1ZWQgYXMgZXhhY3RseSBvbmUgdHJhbnNwb3J0IGNodW5rICh0aGUgZG93bnN0cmVhbVxuICogd3JpdGFibGUgcGVyZm9ybXMgb25lIHdpcmUgd3JpdGUgcGVyIGNodW5rLCBwcmVzZXJ2aW5nIGJvdW5kYXJpZXMpLiBUaGVcbiAqIHNlcnZlciB0aGVyZWZvcmUgc3RvcmVzIG9uZSBmcmFtZSBwZXIgY2h1bmsgaW5kZXgsIHdoaWNoIGlzIHdoYXQgYWxsb3dzXG4gKiBhIGZ1dHVyZSByZWNvbm5lY3RpbmcgcmVhZGVyIHRvIHJlc3VtZSBhIGZyYW1lZCBieXRlIHN0cmVhbSBhdFxuICogYHN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2Ag4oCUIHRoZSBzYW1lIGFyaXRobWV0aWNcbiAqIGBjcmVhdGVSZWNvbm5lY3RpbmdGcmFtZWRTdHJlYW1gIHJlbGllcyBvbiBmb3Igb2JqZWN0IHN0cmVhbXMuIERvIG5vdFxuICogY29hbGVzY2Ugb3Igc3BsaXQgZnJhbWVzIGhlcmUgd2l0aG91dCByZXZpc2l0aW5nIHRoYXQgcmVzdW1lIGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKTogVHJhbnNmb3JtU3RyZWFtPFxuICBVaW50OEFycmF5LFxuICBVaW50OEFycmF5XG4+IHtcbiAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IE1BWF9GUkFNRV9TSVpFKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGNodW5rIG9mICR7Y2h1bmsubGVuZ3RofSBieXRlcyBleGNlZWRzIHRoZSBtYXhpbXVtIGAgK1xuICAgICAgICAgICAgICBgZnJhbWVkIGNodW5rIHNpemUgKCR7TUFYX0ZSQU1FX1NJWkV9KS4gU3BsaXQgdGhlIGRhdGEgaW50byBgICtcbiAgICAgICAgICAgICAgYHNtYWxsZXIgY2h1bmtzIGJlZm9yZSB3cml0aW5nLmAsXG4gICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgVWludDhBcnJheShGUkFNRV9IRUFERVJfU0laRSArIGNodW5rLmxlbmd0aCk7XG4gICAgICBuZXcgRGF0YVZpZXcoZnJhbWUuYnVmZmVyKS5zZXRVaW50MzIoMCwgY2h1bmsubGVuZ3RoLCBmYWxzZSk7XG4gICAgICBmcmFtZS5zZXQoY2h1bmssIEZSQU1FX0hFQURFUl9TSVpFKTtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShmcmFtZSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogVW53cmFwcyBsZW5ndGgtcHJlZml4ZWQgYnl0ZS1zdHJlYW0gZnJhbWVzIGJhY2sgaW50byB0aGUgb3JpZ2luYWwgdXNlclxuICogY2h1bmtzLiBVc2VkIGJ5IHRoZSBjb25zdW1lciBzaWRlIG9mIGEgZnJhbWVkIGJ5dGUtc3RyZWFtIHBpcGUuXG4gKlxuICogQnVmZmVycyBhY3Jvc3MgcmVhZCBib3VuZGFyaWVzIOKAlCB0aGUgdHJhbnNwb3J0IG1heSBzcGxpdCBhIHNpbmdsZVxuICogZnJhbWUgYWNyb3NzIG11bHRpcGxlIHJlYWRzIChoZWFkZXIgaW4gb25lIGNodW5rLCBwYXlsb2FkIGluIGFub3RoZXIpXG4gKiBvciBjb2FsZXNjZSBtdWx0aXBsZSBmcmFtZXMgaW50byBhIHNpbmdsZSByZWFkLiBUaGUgdHJhbnNmb3JtIGVtaXRzXG4gKiB3aG9sZSB1c2VyIGNodW5rcyByZWdhcmRsZXNzIG9mIHRyYW5zcG9ydCBjaHVua2luZy5cbiAqXG4gKiBFcnJvcnMgdGhlIHN0cmVhbSBpZiB0aGUgbGVuZ3RoIGhlYWRlciBhZHZlcnRpc2VzIGEgZnJhbWUgbGFyZ2VyIHRoYW5cbiAqIGBNQVhfRlJBTUVfU0laRWAgYnl0ZXMsIHNpbmNlIHRoYXQgYWxtb3N0IGNlcnRhaW5seSBpbmRpY2F0ZXMgYVxuICogbWlzZnJhbWVkIHdpcmUgKGUuZy4gYSByYXcgYnl0ZSBzdHJlYW0gYmVpbmcgZmVkIHRocm91Z2ggdGhpcyB0cmFuc2Zvcm1cbiAqIGJ5IG1pc3Rha2UpIGFuZCB3ZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFuIGVub3Jtb3VzIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ5dGVVbmZyYW1pbmdTdHJlYW0oKTogVHJhbnNmb3JtU3RyZWFtPFxuICBVaW50OEFycmF5LFxuICBVaW50OEFycmF5XG4+IHtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGRhdGEubGVuZ3RoKTtcbiAgICBuZXh0LnNldChidWZmZXIsIDApO1xuICAgIG5leHQuc2V0KGRhdGEsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGJ1ZmZlciA9IG5leHQ7XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBVaW50OEFycmF5Pih7XG4gICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID4gMCkgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuXG4gICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcblxuICAgICAgICBpZiAoZnJhbWVMZW5ndGggPiBNQVhfRlJBTUVfU0laRSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBmcmFtZSBsZW5ndGggJHtmcmFtZUxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtICgke01BWF9GUkFNRV9TSVpFfSkuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIHVzdWFsbHkgbWVhbnMgYSBub24tZnJhbWVkIGJ5dGUgc3RyZWFtIGlzIGJlaW5nIHJlYWQgYXMgZnJhbWVkLmAsXG4gICAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbCA9IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGg7XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgdG90YWwpIGJyZWFrO1xuXG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShidWZmZXIuc2xpY2UoRlJBTUVfSEVBREVSX1NJWkUsIHRvdGFsKSk7XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSh0b3RhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQnl0ZS1zdHJlYW0gZW5kZWQgd2l0aCAke2J1ZmZlci5sZW5ndGh9IGJ5dGVzIG9mIGluY29tcGxldGUgZnJhbWUgZGF0YS4gYCArXG4gICAgICAgICAgICAgIGBUaGUgc3RyZWFtIHdhcyB0cnVuY2F0ZWQgbWlkLWZyYW1lLmAsXG4gICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0gZXh0ZW5kcyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gICNyZWFkZXI/OiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT47XG5cbiAgY29uc3RydWN0b3IocnVuSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzdGFydEluZGV4PzogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKGBcIm5hbWVcIiBpcyByZXF1aXJlZCwgZ290IFwiJHtuYW1lfVwiYCk7XG4gICAgfVxuICAgIHN1cGVyKHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgTm90IHN1cmUgd2h5IFR5cGVTY3JpcHQgaXMgY29tcGxhaW5pbmcgYWJvdXQgdGhpc1xuICAgICAgdHlwZTogJ2J5dGVzJyxcblxuICAgICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgbGV0IHJlYWRlciA9IHRoaXMuI3JlYWRlcjtcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHdvcmxkLnN0cmVhbXMuZ2V0KHJ1bklkLCBuYW1lLCBzdGFydEluZGV4KTtcbiAgICAgICAgICByZWFkZXIgPSB0aGlzLiNyZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCByZWFkZXInKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgdGhpcy4jcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHJhdyBieXRlczsgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGlzIGhhbmRsZWQgYXQgdGhlXG4gICAgICAgICAgLy8gZnJhbWluZyBsZXZlbCBieSBnZXRTZXJpYWxpemVTdHJlYW0vZ2V0RGVzZXJpYWxpemVTdHJlYW0uXG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjYW5jZWw6IGFzeW5jIChyZWFzb24pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuI3JlYWRlcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuI3JlYWRlci5jYW5jZWwocmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgdGhpcy4jcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTWF4aW11bSBjb25zZWN1dGl2ZSByZWNvbm5lY3QgYXR0ZW1wdHMgZm9yIGEgc2luZ2xlIGZyYW1lZCBzdHJlYW0gc2Vzc2lvbi5cbiAqIFRoZSBjb3VudGVyIHJlc2V0cyB0byB6ZXJvIHdoZW5ldmVyIGEgcmVjb25uZWN0IG1ha2VzIGZvcndhcmQgcHJvZ3Jlc3MgKGFcbiAqIGZyYW1lIGlzIGRlbGl2ZXJlZCksIHNvIHRoaXMgYm91bmRzICpjb25zZWN1dGl2ZSogZmFpbHVyZXMsIG5vdCB0aGUgbGlmZXRpbWVcbiAqIHRvdGFsIOKAlCBhIGxvbmctbGl2ZWQgc2VydmVybGVzcyBzdHJlYW0gbWF5IGxlZ2l0aW1hdGVseSByZWNvbm5lY3QgZmFyIG1vcmVcbiAqIHRoYW4gdGhpcyBtYW55IHRpbWVzIGFzIGxvbmcgYXMgZWFjaCByZWNvbm5lY3Qga2VlcHMgZGVsaXZlcmluZyBkYXRhLiBXZSBvbmx5XG4gKiBnaXZlIHVwIGFmdGVyIHRoaXMgbWFueSByZWNvbm5lY3RzIGluIGEgcm93IHByb2R1Y2Ugbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMgPSA1MDtcblxuLyoqIEVmZmVjdGl2ZSBjb25zZWN1dGl2ZS1yZWNvbm5lY3QgY2FwLiBPdmVycmlkZTogYFdPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFNgLiAqL1xuY29uc3QgZ2V0RnJhbWVkU3RyZWFtTWF4UmVjb25uZWN0cyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTJyxcbiAgICBGUkFNRURfU1RSRUFNX01BWF9SRUNPTk5FQ1RTLFxuICAgIHtcbiAgICAgIGludGVnZXI6IHRydWUsXG4gICAgICBtaW46IDEsXG4gICAgfVxuICApO1xuXG4vKipcbiAqIEFic29sdXRlIGJhY2tzdG9wIG9uIHRvdGFsIHJlY29ubmVjdHMgZm9yIGEgc2luZ2xlIHNlc3Npb24sIGluZGVwZW5kZW50IG9mXG4gKiBwcm9ncmVzcy4gVGhlIGNvbnNlY3V0aXZlIGNhcCBhYm92ZSByZXNldHMgb24gZm9yd2FyZCBwcm9ncmVzcywgd2hpY2ggaXNcbiAqIGNvcnJlY3QgZm9yIGEgd2VsbC1iZWhhdmVkIGJhY2tlbmQgdGhhdCBob25vcnMgYHN0YXJ0SW5kZXhgLiBCdXQgaWYgYSBXb3JsZCdzXG4gKiBgc3RyZWFtcy5nZXRgIGV2ZXIgaWdub3JlZCBgc3RhcnRJbmRleGAgYW5kIHJlLWRlbGl2ZXJlZCBlYXJsaWVyIGNodW5rcyxcbiAqIFwicHJvZ3Jlc3NcIiB3b3VsZCBiZSByZXBvcnRlZCBldmVyeSByZWNvbm5lY3QgYW5kIHRoZSBjb25zZWN1dGl2ZSBjYXAgd291bGRcbiAqIG5ldmVyIHRyaXAg4oCUIHR1cm5pbmcgYSBib3VuZGVkIGZhaWx1cmUgaW50byBhbiB1bmJvdW5kZWQgcmVjb25uZWN0IGxvb3AuIFRoaXNcbiAqIGhhcmQgY2VpbGluZyBndWFyYW50ZWVzIHRoZSBsb29wIGFsd2F5cyB0ZXJtaW5hdGVzLiBJdCBpcyBzZXQgaGlnaCBlbm91Z2hcbiAqIChob3VycyBvZiBzdHJlYW1pbmcgYXQgcmVhbGlzdGljIHBlci1zZXNzaW9uIHRpbWVvdXRzKSB0byBuZXZlciBpbnRlcmZlcmVcbiAqIHdpdGggbGVnaXRpbWF0ZSBsb25nLWxpdmVkIHN0cmVhbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTID0gMTAwMDtcblxuLyoqIEVmZmVjdGl2ZSB0b3RhbC1yZWNvbm5lY3QgYmFja3N0b3AuIE92ZXJyaWRlOiBgV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUU2AuICovXG5jb25zdCBnZXRGcmFtZWRTdHJlYW1NYXhUb3RhbFJlY29ubmVjdHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUUycsXG4gICAgRlJBTUVEX1NUUkVBTV9NQVhfVE9UQUxfUkVDT05ORUNUUyxcbiAgICB7IGludGVnZXI6IHRydWUsIG1pbjogMSB9XG4gICk7XG5cbi8qKlxuICogV3JhcHMgdGhlIGxlbmd0aC1wcmVmaXgtZnJhbWVkIGJ5dGUgc3RyZWFtIGZyb20gYHdvcmxkLnN0cmVhbXMuZ2V0YCB3aXRoXG4gKiB0cmFuc3BhcmVudCBhdXRvLXJlY29ubmVjdC5cbiAqXG4gKiBFdmVyeSBmdWxseS1kZWNvZGVkIG91dGVyIGZyYW1lIGNvcnJlc3BvbmRzIHRvIGV4YWN0bHkgb25lIHNlcnZlci1zaWRlXG4gKiBjaHVuayAodGhlIHNlcmlhbGl6ZSB0cmFuc2Zvcm0gZW5xdWV1ZXMgb25lIGZyYW1lIHBlciB3b3JrZmxvdyB3cml0ZSwgYW5kXG4gKiB0aGUgd3JpdGFibGUgYnVmZmVycyBvbmUgZnJhbWUgcGVyIGNodW5rIHdoZW4gbXVsdGktd3JpdGluZykuIFRoZSB3cmFwcGVyXG4gKiBjb3VudHMgY29tcGxldGVkIGZyYW1lcyBhbmQsIG9uIHVwc3RyZWFtIGVycm9yLCByZW9wZW5zIHRoZSBjb25uZWN0aW9uXG4gKiB3aXRoIGBzdGFydEluZGV4ID0gcmVzb2x2ZWRTdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNgLiBQYXJ0aWFsLWZyYW1lXG4gKiBieXRlcyBidWZmZXJlZCBiZWZvcmUgdGhlIGN1dCBhcmUgZGlzY2FyZGVkIOKAlCB0aGUgc2VydmVyIHdpbGwgcmVzZW5kIHRoZVxuICogaW4tZmxpZ2h0IGNodW5rIGluIGZ1bGwgZnJvbSB0aGUgbmV3IHN0YXJ0SW5kZXguXG4gKlxuICogQSBjbGVhbiB1cHN0cmVhbSBjbG9zZSAoRU9GIHdpdGggbm8gZXJyb3IpIHNpZ25hbHMgdGhlIHN0cmVhbSBpcyB0cnVseVxuICogZG9uZTsgd2UgY2xvc2UgdGhlIHdyYXBwZXIgYW5kIGRvIG5vdCByZWNvbm5lY3QuXG4gKlxuICogTmVnYXRpdmUgYHN0YXJ0SW5kZXhgIHZhbHVlcyAobGFzdC1OIHNlbWFudGljcykgc2tpcCB0aGUgcmVjb25uZWN0XG4gKiBtYWNoaW5lcnkgYmVjYXVzZSB3ZSBjYW5ub3QgY29tcHV0ZSBhbiBhYnNvbHV0ZSByZXN1bWUgcG9zaXRpb24gd2l0aG91dFxuICogYSB0YWlsLWluZGV4IGxvb2t1cCDigJQgdGhlIHJldHVybmVkIHN0cmVhbSBiZWhhdmVzIGFzIGEgc2luZ2xlLXNob3QgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlY29ubmVjdGluZ0ZyYW1lZFN0cmVhbShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBzdGFydEluZGV4PzogbnVtYmVyXG4pOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IHJlY29ubmVjdFN1cHBvcnRlZCA9IHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBzdGFydEluZGV4ID49IDA7XG4gIGxldCBjdXJyZW50U3RhcnRJbmRleCA9IHN0YXJ0SW5kZXggPz8gMDtcbiAgbGV0IGNvbnN1bWVkRnJhbWVzID0gMDtcbiAgbGV0IHJlY29ubmVjdENvdW50ID0gMDtcbiAgbGV0IHRvdGFsUmVjb25uZWN0Q291bnQgPSAwO1xuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT4gfCB1bmRlZmluZWQ7XG4gIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcblxuICBhc3luYyBmdW5jdGlvbiBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gICAgY29uc3QgZWZmZWN0aXZlU3RhcnRJbmRleCA9IHJlY29ubmVjdFN1cHBvcnRlZFxuICAgICAgPyBjdXJyZW50U3RhcnRJbmRleCArIGNvbnN1bWVkRnJhbWVzXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQocnVuSWQsIG5hbWUsIGVmZmVjdGl2ZVN0YXJ0SW5kZXgpO1xuICAgIHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVhZGVyKSB7XG4gICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBBZHZhbmNlIHRoZSByZXN1bWUgcG9zaXRpb24gcGFzdCB0aGUgZnJhbWVzIGFscmVhZHkgZGVsaXZlcmVkLCB0aGVuXG4gICAgLy8gZHJvcCBhbnkgcGFydGlhbC1mcmFtZSBieXRlcyDigJQgdGhlIHJlb3BlbmVkIGNvbm5lY3Rpb24gcmUtc2VuZHMgZnJvbSBhXG4gICAgLy8gZnJhbWUgYm91bmRhcnkgYXQgdGhlIG5ldyBpbmRleC5cbiAgICBjdXJyZW50U3RhcnRJbmRleCArPSBjb25zdW1lZEZyYW1lcztcbiAgICBjb25zdW1lZEZyYW1lcyA9IDA7XG4gICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5cbiAgICAvLyBSZXRyeSB0aGUgcmVvcGVuIGl0c2VsZiBhZ2FpbnN0IHRoZSByZWNvbm5lY3QgYnVkZ2V0LiBBIHRyYW5zaWVudFxuICAgIC8vIGZhaWx1cmUgb2YgY29ubmVjdCgpIOKAlCB0aGUgc2VydmVyIGJyaWVmbHkgdW5hdmFpbGFibGUgZHVyaW5nIHRoZVxuICAgIC8vIHJlY29ubmVjdCB3aW5kb3cg4oCUIGlzIHRoZSBleGFjdCBibGlwIHRoaXMgd3JhcHBlciBleGlzdHMgdG8gc3Vydml2ZSwgc29cbiAgICAvLyBjb3VudCBpdCBhZ2FpbnN0IHRoZSBidWRnZXQgYW5kIHRyeSBhZ2FpbiByYXRoZXIgdGhhbiB0cmVhdGluZyBpdCBhc1xuICAgIC8vIGZhdGFsLiBPbmx5IGJ1ZGdldCBleGhhdXN0aW9uIChhIHNlcnZlciB0aGF0IHN0YXlzIGRvd24pIHRlcm1pbmF0ZXMgdGhlXG4gICAgLy8gc3RyZWFtLlxuICAgIGNvbnN0IG1heFJlY29ubmVjdHMgPSBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzKCk7XG4gICAgY29uc3QgbWF4VG90YWxSZWNvbm5lY3RzID0gZ2V0RnJhbWVkU3RyZWFtTWF4VG90YWxSZWNvbm5lY3RzKCk7XG4gICAgZm9yICg7Oykge1xuICAgICAgcmVjb25uZWN0Q291bnQrKztcbiAgICAgIHRvdGFsUmVjb25uZWN0Q291bnQrKztcbiAgICAgIGlmIChyZWNvbm5lY3RDb3VudCA+IG1heFJlY29ubmVjdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTdHJlYW0gXCIke25hbWV9XCIgZXhjZWVkZWQgbWF4aW11bSByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgKCR7bWF4UmVjb25uZWN0c30pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRvdGFsUmVjb25uZWN0Q291bnQgPiBtYXhUb3RhbFJlY29ubmVjdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTdHJlYW0gXCIke25hbWV9XCIgZXhjZWVkZWQgbWF4aW11bSB0b3RhbCByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgKCR7bWF4VG90YWxSZWNvbm5lY3RzfSlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb25uZWN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBSZW9wZW4gZmFpbGVkIHRyYW5zaWVudGx5OyBsb29wIHRvIHJldHJ5LCBjb3VudGluZyBhZ2FpbnN0IHRoZVxuICAgICAgICAvLyBidWRnZXQgc28gYSBzZXJ2ZXIgdGhhdCBuZXZlciByZWNvdmVycyBzdGlsbCB0ZXJtaW5hdGVzIHRoZSBzdHJlYW0uXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgIC8vIExvb3AgdW50aWwgd2UgZW1pdCBzb21ldGhpbmcsIGhpdCBFT0YsIG9yIGZhdGFsbHkgZXJyb3IuIFJlYWRzIHRoYXRcbiAgICAgIC8vIG9ubHkgZXh0ZW5kIHRoZSBpbi1mbGlnaHQtZnJhbWUgYnVmZmVyIGRvbid0IGVucXVldWUgYW55dGhpbmcg4oCUIHdlXG4gICAgICAvLyBrZWVwIHJlYWRpbmcgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGVtcHR5LWhhbmRlZC5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY29ubmVjdCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ6IHsgZG9uZTogYm9vbGVhbjsgdmFsdWU/OiBVaW50OEFycmF5IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBjb25uZWN0KCkgZ3VhcmFudGVlcyByZWFkZXJcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkZXIhLnJlYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFyZWNvbm5lY3RTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlY29ubmVjdCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlY29ubmVjdEVycikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihyZWNvbm5lY3RFcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSB8fCAhcmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgLy8gQ2xlYW4gRU9GIOKAlCBzdHJlYW0gaXMgdHJ1bHkgY29tcGxldGUuIERyb3AgYW55IHBhcnRpYWwtZnJhbWVcbiAgICAgICAgICAvLyBieXRlcyAodGhlcmUgc2hvdWxkbid0IGJlIGFueTsgYSB3ZWxsLWZvcm1lZCBzdHJlYW0gZW5kcyBvbiBhXG4gICAgICAgICAgLy8gZnJhbWUgYm91bmRhcnkpLlxuICAgICAgICAgIHJlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwZW5kIHRvIGJ1ZmZlciBhbmQgZW1pdCBhbGwgY29tcGxldGUgZnJhbWVzLlxuICAgICAgICBjb25zdCBpbmNvbWluZyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKGluY29taW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlci5sZW5ndGggKyBpbmNvbWluZy5sZW5ndGgpO1xuICAgICAgICAgIGNvbWJpbmVkLnNldChidWZmZXIsIDApO1xuICAgICAgICAgIGNvbWJpbmVkLnNldChpbmNvbWluZywgYnVmZmVyLmxlbmd0aCk7XG4gICAgICAgICAgYnVmZmVyID0gY29tYmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW1pdHRlZCA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlcixcbiAgICAgICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgICApLmdldFVpbnQzMigwLCBmYWxzZSk7XG4gICAgICAgICAgY29uc3QgdG90YWwgPSBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoO1xuICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgdG90YWwpIGJyZWFrO1xuICAgICAgICAgIC8vIEZvcndhcmQgdGhlIGVudGlyZSBmcmFtZWQgY2h1bmsgKGhlYWRlciArIHBheWxvYWQpIHRvIHRoZVxuICAgICAgICAgIC8vIGRvd25zdHJlYW0gZGVzZXJpYWxpemVyLCB3aGljaCBhbHJlYWR5IGV4cGVjdHMgdGhpcyBsYXlvdXQuXG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ1ZmZlci5zbGljZSgwLCB0b3RhbCkpO1xuICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSh0b3RhbCk7XG4gICAgICAgICAgY29uc3VtZWRGcmFtZXMrKztcbiAgICAgICAgICBlbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbWl0dGVkKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBwcm9ncmVzcyBvbiB0aGUgY3VycmVudCBjb25uZWN0aW9uIOKAlCBjbGVhciB0aGVcbiAgICAgICAgICAvLyBjb25zZWN1dGl2ZS1mYWlsdXJlIGJ1ZGdldCBzbyBhIGxvbmcgc3RyZWFtIHRoYXQgcmVjb25uZWN0c1xuICAgICAgICAgIC8vIG1hbnkgdGltZXMgKGJ1dCBrZWVwcyBkZWxpdmVyaW5nKSBpcyBuZXZlciBmYWxzZWx5IGNhcHBlZC5cbiAgICAgICAgICByZWNvbm5lY3RDb3VudCA9IDA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgcGFydGlhbCBieXRlcyDigJQgcmVhZCBtb3JlLlxuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVhZGVyKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBjbG9zaW5nIFJlYWRhYmxlU3RyZWFtIHJlYWRlcjonLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmF1bHQgZmx1c2ggaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGZvciBidWZmZXJlZCBzdHJlYW0gd3JpdGVzLlxuICogQ2h1bmtzIGFyZSBhY2N1bXVsYXRlZCBhbmQgZmx1c2hlZCB0b2dldGhlciB0byByZWR1Y2UgbmV0d29yayBvdmVyaGVhZC5cbiAqL1xuY29uc3QgU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TID0gMTA7XG5cbi8qKlxuICogRWZmZWN0aXZlIGRlZmF1bHQgc3RyZWFtLWZsdXNoIGludGVydmFsIChhIGB3b3JsZC5zdHJlYW1GbHVzaEludGVydmFsTXNgXG4gKiBzdGlsbCB0YWtlcyBwcmVjZWRlbmNlKS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVNgLlxuICovXG5jb25zdCBnZXRTdHJlYW1GbHVzaEludGVydmFsTXMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TJywgU1RSRUFNX0ZMVVNIX0lOVEVSVkFMX01TLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgfSk7XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtIGV4dGVuZHMgV3JpdGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICAvKipcbiAgICogQHBhcmFtIHJ1blJlYWR5QmFycmllciBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlXG4gICAqIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuIFdoZW4gdGhlIHN0ZXAgYm9keSBydW5zXG4gICAqIG9wdGltaXN0aWNhbGx5IChiZWZvcmUgYHJ1bl9zdGFydGVkYCBpcyBkdXJhYmxlKSwgdGhlIGZpcnN0IGNodW5rIHdyaXRlIHRvXG4gICAqIGEgYnJhbmQtbmV3IHN0cmVhbSB3b3VsZCBvdGhlcndpc2UgcmVhY2ggdGhlIFdvcmxkIGJlZm9yZSB0aGUgcnVuIGV4aXN0c1xuICAgKiBhbmQgYmUgcmVqZWN0ZWQgYXMgcnVuLW5vdC1mb3VuZC4gQXdhaXRpbmcgdGhpcyBvbmNlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICogZmx1c2gvY2xvc2Ugb3JkZXJzIHRoZSB3cml0ZSBhZnRlciB0aGUgcnVuJ3MgY3JlYXRpb24uIGB1bmRlZmluZWRgIG91dHNpZGVcbiAgICogdHVyYm8gYW5kIG9uIHRoZSBhd2FpdCBwYXRoLCB3aGVyZSB0aGUgcnVuIHdhcyBhbHJlYWR5IGR1cmFibGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICBpZiAodHlwZW9mIHJ1bklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgXCJydW5JZFwiIG11c3QgYmUgYSBzdHJpbmcsIGdvdCBcIiR7dHlwZW9mIHJ1bklkfVwiYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKGBcIm5hbWVcIiBpcyByZXF1aXJlZCwgZ290IFwiJHtuYW1lfVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IHdvcmxkUHJvbWlzZSA9IGdldFdvcmxkTGF6eSgpO1xuXG4gICAgLy8gSG9sZCB0aGUgZmlyc3Qgc2VydmVyIHdyaXRlIHVudGlsIHRoZSBydW4gZXhpc3RzICh0dXJibyBvcHRpbWlzdGljXG4gICAgLy8gc3RhcnQpLiBBd2FpdGVkIG9uY2UsIHRoZW4gY2xlYXJlZCBzbyBsYXRlciBmbHVzaGVzIHBheSBub3RoaW5nLiBUaGVcbiAgICAvLyByZWplY3Rpb24gaXMgc3dhbGxvd2VkIGZvciBvcmRlcmluZyBvbmx5OiBpZiBgcnVuX3N0YXJ0ZWRgIHRydWx5IGZhaWxlZFxuICAgIC8vIHRoZSBydW4gZG9lcyBub3QgZXhpc3QsIHNvIHRoZSB3cml0ZSBiZWxvdyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvci5cbiAgICBsZXQgcGVuZGluZ1J1blJlYWR5OiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkID0gcnVuUmVhZHlCYXJyaWVyO1xuICAgIGNvbnN0IGVuc3VyZVJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKHBlbmRpbmdSdW5SZWFkeSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHBlbmRpbmdSdW5SZWFkeTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSDigJQgc2VlIGFib3ZlLlxuICAgICAgICB9XG4gICAgICAgIHBlbmRpbmdSdW5SZWFkeSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQnVmZmVyaW5nIHN0YXRlIGZvciBiYXRjaGVkIHdyaXRlc1xuICAgIC8vIEVuY3J5cHRpb24vZGVjcnlwdGlvbiBpcyBoYW5kbGVkIGF0IHRoZSBmcmFtaW5nIGxldmVsIGJ5XG4gICAgLy8gZ2V0U2VyaWFsaXplU3RyZWFtL2dldERlc2VyaWFsaXplU3RyZWFtLCBub3QgaGVyZS5cbiAgICBsZXQgYnVmZmVyOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICBsZXQgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZmx1c2hQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmbHVzaCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChmbHVzaFRpbWVyKTtcbiAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIC8vIE9yZGVyIHRoZSBmaXJzdCBzZXJ2ZXIgd3JpdGUgYWZ0ZXIgdGhlIHJ1biBleGlzdHMgKHR1cmJvIG9wdGltaXN0aWNcbiAgICAgIC8vIHN0YXJ0KTsgYSBuby1vcCBvbiBldmVyeSBsYXRlciBmbHVzaCBhbmQgb3V0c2lkZSB0dXJiby5cbiAgICAgIGF3YWl0IGVuc3VyZVJ1blJlYWR5KCk7XG5cbiAgICAgIC8vIENvcHkgY2h1bmtzIHRvIGZsdXNoLCBidXQgZG9uJ3QgY2xlYXIgYnVmZmVyIHVudGlsIHdyaXRlIHN1Y2NlZWRzXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGRhdGEgbG9zcyBpZiB0aGUgd3JpdGUgb3BlcmF0aW9uIGZhaWxzXG4gICAgICBjb25zdCBjaHVua3NUb0ZsdXNoID0gYnVmZmVyLnNsaWNlKCk7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgd29ybGRQcm9taXNlO1xuICAgICAgLy8gQ2FjaGUgdGhlIGZsdXNoIGludGVydmFsIGZyb20gdGhlIHdvcmxkIG9uIGZpcnN0IHVzZVxuICAgICAgaWYgKHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPVxuICAgICAgICAgIHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNcyA/PyBnZXRTdHJlYW1GbHVzaEludGVydmFsTXMoKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSB3cml0ZU11bHRpIGlmIGF2YWlsYWJsZSBmb3IgYmF0Y2ggd3JpdGVzXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB3b3JsZC5zdHJlYW1zLndyaXRlTXVsdGkgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgY2h1bmtzVG9GbHVzaC5sZW5ndGggPiAxXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZU11bHRpKHJ1bklkLCBuYW1lLCBjaHVua3NUb0ZsdXNoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBzZXF1ZW50aWFsIHdyaXRlc1xuICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rc1RvRmx1c2gpIHtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlKHJ1bklkLCBuYW1lLCBjaHVuayk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT25seSBjbGVhciBidWZmZXIgYWZ0ZXIgc3VjY2Vzc2Z1bCB3cml0ZSB0byBwcmV2ZW50IGRhdGEgbG9zc1xuICAgICAgYnVmZmVyID0gW107XG4gICAgfTtcblxuICAgIC8qKiBSZXNvbHZlcnMvcmVqZWN0b3JzIHdhaXRpbmcgZm9yIHRoZSBjdXJyZW50IHNjaGVkdWxlZCBmbHVzaCAqL1xuICAgIGxldCBmbHVzaFdhaXRlcnM6IEFycmF5PHtcbiAgICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnI6IHVua25vd24pID0+IHZvaWQ7XG4gICAgfT4gPSBbXTtcblxuICAgIGNvbnN0IHNjaGVkdWxlRmx1c2ggPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZmx1c2hUaW1lcikgcmV0dXJuOyAvLyBBbHJlYWR5IHNjaGVkdWxlZFxuXG4gICAgICBmbHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZsdXNoVGltZXIgPSBudWxsO1xuICAgICAgICBjb25zdCBjdXJyZW50V2FpdGVycyA9IGZsdXNoV2FpdGVycztcbiAgICAgICAgZmx1c2hXYWl0ZXJzID0gW107XG4gICAgICAgIGZsdXNoUHJvbWlzZSA9IGZsdXNoKCkudGhlbihcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHcgb2YgY3VycmVudFdhaXRlcnMpIHcucmVzb2x2ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB3IG9mIGN1cnJlbnRXYWl0ZXJzKSB3LnJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0sIHJlc29sdmVkRmx1c2hJbnRlcnZhbE1zID8/IGdldFN0cmVhbUZsdXNoSW50ZXJ2YWxNcygpKTtcbiAgICB9O1xuXG4gICAgc3VwZXIoe1xuICAgICAgYXN5bmMgd3JpdGUoY2h1bmspIHtcbiAgICAgICAgLy8gV2FpdCBmb3IgYW55IGluLXByb2dyZXNzIGZsdXNoIHRvIGNvbXBsZXRlIGJlZm9yZSBhZGRpbmcgdG8gYnVmZmVyXG4gICAgICAgIGlmIChmbHVzaFByb21pc2UpIHtcbiAgICAgICAgICBhd2FpdCBmbHVzaFByb21pc2U7XG4gICAgICAgICAgZmx1c2hQcm9taXNlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgc2NoZWR1bGVGbHVzaCgpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzY2hlZHVsZWQgZmx1c2ggdG8gY29tcGxldGUgc28gdGhhdCBjYWxsZXJzXG4gICAgICAgIC8vIChsaWtlIGZsdXNoYWJsZVBpcGUpIGtub3cgZGF0YSBoYXMgcmVhY2hlZCB0aGUgc2VydmVyXG4gICAgICAgIC8vIGJlZm9yZSBkZWNyZW1lbnRpbmcgcGVuZGluZ09wcy4gV2l0aG91dCB0aGlzLCBwZW5kaW5nT3BzXG4gICAgICAgIC8vIHJlYWNoZXMgMCB3aGVuIHRoZSBidWZmZXJlZCB3cml0ZSByZXR1cm5zIChpbnN0YW50KSwgYnV0XG4gICAgICAgIC8vIHRoZSAxMG1zIGZsdXNoIHRpbWVyIGhhc24ndCBmaXJlZCB5ZXQuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBmbHVzaFdhaXRlcnMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICAgIC8vIFdhaXQgZm9yIGFueSBpbi1wcm9ncmVzcyBmbHVzaCB0byBjb21wbGV0ZVxuICAgICAgICBpZiAoZmx1c2hQcm9taXNlKSB7XG4gICAgICAgICAgYXdhaXQgZmx1c2hQcm9taXNlO1xuICAgICAgICAgIGZsdXNoUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGbHVzaCBhbnkgcmVtYWluaW5nIGJ1ZmZlcmVkIGNodW5rc1xuICAgICAgICBhd2FpdCBmbHVzaCgpO1xuXG4gICAgICAgIC8vIEEgY2xvc2Ugd2l0aCBhbiBlbXB0eSBidWZmZXIgc2tpcHMgZmx1c2goKSdzIHdyaXRlIChhbmQgaXRzIGJhcnJpZXIpLFxuICAgICAgICAvLyBidXQgY2FuIGl0c2VsZiBiZSB0aGUgZmlyc3Qgd3JpdGUgdG8gYSBicmFuZC1uZXcgc3RyZWFtIOKAlCBnYXRlIGl0IHRvby5cbiAgICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcblxuICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHdvcmxkUHJvbWlzZTtcbiAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgbmFtZSk7XG4gICAgICB9LFxuICAgICAgYWJvcnQocmVhc29uKSB7XG4gICAgICAgIC8vIENsZWFuIHVwIHRpbWVyIHRvIHByZXZlbnQgbGVha3NcbiAgICAgICAgaWYgKGZsdXNoVGltZXIpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoZmx1c2hUaW1lcik7XG4gICAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGlzY2FyZCBidWZmZXJlZCBjaHVua3MgLSB0aGV5IHdvbid0IGJlIHdyaXR0ZW5cbiAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgIC8vIFJlamVjdCBhbnkgcGVuZGluZyBmbHVzaFdhaXRlcnMgc28gdGhlIHdyaXRlKCkgcHJvbWlzZXMgc2V0dGxlXG4gICAgICAgIC8vIGFuZCBkb24ndCBsZWFrLiBXaXRob3V0IHRoaXMsIHdyaXRlKCkgaGFuZ3MgZm9yZXZlciBvbiBhblxuICAgICAgICAvLyB1bnNldHRsZWQgcHJvbWlzZSBiZWNhdXNlIHRoZSBjbGVhcmVkIHRpbWVyIHdpbGwgbmV2ZXIgZmlyZS5cbiAgICAgICAgY29uc3Qgd2FpdGVycyA9IGZsdXNoV2FpdGVycztcbiAgICAgICAgZmx1c2hXYWl0ZXJzID0gW107XG4gICAgICAgIGNvbnN0IGFib3J0RXJyb3IgPSByZWFzb24gPz8gbmV3IEVycm9yKCdTdHJlYW0gYWJvcnRlZCcpO1xuICAgICAgICBmb3IgKGNvbnN0IHcgb2Ygd2FpdGVycykgdy5yZWplY3QoYWJvcnRFcnJvcik7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIHRoZSBtb2R1bGFyIHNlcmlhbGl6YXRpb24gbW9kdWxlcy5cbmV4cG9ydCB0eXBlIHtcbiAgQnl0ZVN0cmVhbUZyYW1pbmcsXG4gIFJlZHVjZXJzLFxuICBSZXZpdmVycyxcbiAgU2VyaWFsaXphYmxlU3BlY2lhbCxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3R5cGVzLmpzJztcblxuLy8gSW1wb3J0IHR5cGVzIGxvY2FsbHkgZm9yIHVzZSB3aXRoaW4gdGhpcyBmaWxlLlxuaW1wb3J0IHR5cGUge1xuICBCeXRlU3RyZWFtRnJhbWluZyxcbiAgUmVkdWNlcnMsXG4gIFJldml2ZXJzLFxuICBTZXJpYWxpemFibGVTcGVjaWFsLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG4vLyAtLS0tIENvbXBvc2VkIHJlZHVjZXJzIC0tLS1cbi8vIENvbXBvc2VzIG1vZHVsYXIgcmVkdWNlcnMgKGNvbW1vbiwgY2xhc3MsIHN0ZXAtZnVuY3Rpb24pIHdpdGhcbi8vIG1vZGUtc3BlY2lmaWMgUmVxdWVzdC9SZXNwb25zZS9TdHJlYW0gcmVkdWNlcnMgYmVsb3cuXG5cbi8qKlxuICogQmFzZSByZWR1Y2VycyBzaGFyZWQgYWNyb3NzIGFsbCBzZXJpYWxpemF0aW9uIGJvdW5kYXJpZXMuXG4gKiBDb21wb3NlczogY2xhc3MgKyBzdGVwLWZ1bmN0aW9uICsgY29tbW9uIHJlZHVjZXJzIGZyb20gdGhlIG1vZHVsYXIgbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsQmFzZVJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIC8vIENsYXNzL0luc3RhbmNlIE1VU1QgY29tZSBiZWZvcmUgRXJyb3Igc28gdGhhdCBjdXN0b20gRXJyb3Igc3ViY2xhc3Nlc1xuICAvLyB3aXRoIFdPUktGTE9XX1NFUklBTElaRSB0YWtlIHByZWNlZGVuY2UgKGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zKS5cbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDbGFzc1JlZHVjZXJzKCksXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcigpLFxuICAgIC4uLmdldENvbW1vblJlZHVjZXJzKGdsb2JhbCksXG4gICAgLy8gUmVxdWVzdCBhbmQgUmVzcG9uc2UgcmVkdWNlcnMgYXJlIG1vZGUtc3BlY2lmaWMgYW5kIGFkZGVkIGJ5XG4gICAgLy8gZ2V0RXh0ZXJuYWxSZWR1Y2VycyAvIGdldFdvcmtmbG93UmVkdWNlcnMgLyBnZXRTdGVwUmVkdWNlcnMgYmVsb3cuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZXF1ZXN0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YTogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVxdWVzdCddID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IHZhbHVlLmhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSB2YWx1ZVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIGRhdGEucmVzcG9uc2VXcml0YWJsZSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICB9XG4gICAgICAvLyBGb3J3YXJkIHRoZSBzaWduYWwgaW4gdHdvIGNhc2VzOlxuICAgICAgLy8gICAxLiBBbHJlYWR5IGFib3J0ZWQg4oCUIHByZXNlcnZlIGFib3J0ZWQ9dHJ1ZS9yZWFzb24gc28gdGhlIGh5ZHJhdGVkXG4gICAgICAvLyAgICAgIHN0ZXAgc2VlcyB0aGUgY2FuY2VsbGF0aW9uIHRoYXQgaGFwcGVuZWQgYmVmb3JlIHNlcmlhbGl6ZS5cbiAgICAgIC8vICAgMi4gQWxyZWFkeSB0YWdnZWQgd2l0aCB3b3JrZmxvdyBpbmZyYXN0cnVjdHVyZSDigJQgaS5lLiBhIHNpZ25hbFxuICAgICAgLy8gICAgICBmcm9tIGEgd29ya2Zsb3ctbWFuYWdlZCBBYm9ydENvbnRyb2xsZXIsIHdoaWNoIGhhcyBzdHJlYW0vaG9va1xuICAgICAgLy8gICAgICBiYWNraW5nIGZvciBjcm9zcy1ib3VuZGFyeSBwcm9wYWdhdGlvbi5cbiAgICAgIC8vIFBsYWluIG5vbi1hYm9ydGVkIG5hdGl2ZSBzaWduYWxzIGFyZSBpbnRlbnRpb25hbGx5IGRyb3BwZWQgKHdvdWxkXG4gICAgICAvLyBtaW50IHN0cmVhbSBpbmZyYSBmb3IgZXZlcnkgUmVxdWVzdCwgaW5jbHVkaW5nIHRoZSBhdXRvLWdlbmVyYXRlZFxuICAgICAgLy8gc2lnbmFsIG9uIGBuZXcgUmVxdWVzdCh1cmwpYCkuXG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlLnNpZ25hbCAmJlxuICAgICAgICAodmFsdWUuc2lnbmFsLmFib3J0ZWQgfHxcbiAgICAgICAgICAodmFsdWUuc2lnbmFsIGFzIEFib3J0SW50ZXJuYWxzKVtBQk9SVF9TVFJFQU1fTkFNRV0pXG4gICAgICApIHtcbiAgICAgICAgZGF0YS5zaWduYWwgPSB2YWx1ZS5zaWduYWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlc3BvbnNlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiB2YWx1ZS5oZWFkZXJzLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICByZWRpcmVjdGVkOiB2YWx1ZS5yZWRpcmVjdGVkLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNoYXJlZCBhYm9ydCByZWR1Y2VyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIEFib3J0U2VyaWFsaXplZERhdGEgPSB7XG4gIHN0cmVhbU5hbWU6IHN0cmluZztcbiAgaG9va1Rva2VuOiBzdHJpbmc7XG4gIGFib3J0ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbjogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3ltYm9sLWtleWVkIGludGVybmFsIGZpZWxkcyB0YWdnZWQgb250byBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWxcbiAqIGluc3RhbmNlcyAoYW5kIGBob2xkZXJgcyBpbiByZWR1Y2VyIGhlbHBlcnMpLiBBbGwgb3B0aW9uYWwg4oCUIGEgcGxhaW5cbiAqIG5hdGl2ZSBpbnN0YW5jZSBoYXMgbm9uZSBvZiB0aGVtIHNldC5cbiAqL1xudHlwZSBBYm9ydEludGVybmFscyA9IHtcbiAgW0FCT1JUX1NUUkVBTV9OQU1FXT86IHN0cmluZztcbiAgW0FCT1JUX0hPT0tfVE9LRU5dPzogc3RyaW5nO1xuICBbQUJPUlRfUkVBREVSX0NBTkNFTF0/OiBBYm9ydENvbnRyb2xsZXI7XG59O1xuXG50eXBlIEFib3J0U2lnbmFsTGlrZSA9IEFib3J0SW50ZXJuYWxzICYge1xuICBhYm9ydGVkOiBib29sZWFuO1xuICByZWFzb24/OiB1bmtub3duO1xuICBhZGRFdmVudExpc3RlbmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIEFib3J0SG9sZGVyID0gQWJvcnRJbnRlcm5hbHMgJiB7IHNpZ25hbD86IEFib3J0SW50ZXJuYWxzIH07XG5cbi8qKlxuICogU2hhcmVkIGxvZ2ljIGZvciBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgcmVkdWNlcnMgaW4gZXh0ZXJuYWwgYW5kIHN0ZXBcbiAqIGNvbnRleHRzLiBBc3NpZ25zIHN0cmVhbS9ob29rIG5hbWVzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQsIG9wdGlvbmFsbHlcbiAqIGF0dGFjaGVzIGFuIGFib3J0IGxpc3RlbmVyIGZvciByZWFsLXRpbWUgcHJvcGFnYXRpb24sIGFuZCByZXR1cm5zIHRoZVxuICogc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gIHNpZ25hbDogQWJvcnRTaWduYWxMaWtlLFxuICBob2xkZXI6IEFib3J0SG9sZGVyLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbVxuKTogQWJvcnRTZXJpYWxpemVkRGF0YSB7XG4gIGxldCBzdHJlYW1OYW1lID0gaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgbGV0IGhvb2tUb2tlbiA9IGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgaWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZChpZCk7XG4gICAgaG9va1Rva2VuID0gYGFicnRfJHtpZH1gO1xuICAgIGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgIGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICBpZiAoaG9sZGVyLnNpZ25hbCkge1xuICAgICAgaG9sZGVyLnNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgICAgaG9sZGVyLnNpZ25hbFtBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICB9XG4gIH1cblxuICAvLyBEZWR1cGVkIHZpYSBBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRCBtYXJrZXIg4oCUIHNlZSBhdHRhY2hBYm9ydExpc3RlbmVyT25jZS5cbiAgYXR0YWNoQWJvcnRMaXN0ZW5lck9uY2UoXG4gICAgc2lnbmFsIGFzIEFib3J0U2lnbmFsLFxuICAgIHN0cmVhbU5hbWUsXG4gICAgcnVuSWQsXG4gICAgY3J5cHRvS2V5LFxuICAgIG9wc1xuICApO1xuXG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW46IGhvb2tUb2tlbiEsXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogU2hhcmVkIGxvZ2ljIGZvciBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgcmVkdWNlcnMgaW4gd29ya2Zsb3cgY29udGV4dC5cbiAqIFJlYWRzIGV4aXN0aW5nIHN0cmVhbS9ob29rIG5hbWVzIGZyb20gc3ltYm9scyAobXVzdCBhbHJlYWR5IGJlIHNldCkuXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUFib3J0QnlTeW1ib2woXG4gIHNpZ25hbDogeyBhYm9ydGVkOiBib29sZWFuOyByZWFzb24/OiB1bmtub3duIH0sXG4gIGhvbGRlcjogQWJvcnRIb2xkZXJcbik6IEFib3J0U2VyaWFsaXplZERhdGEgfCBmYWxzZSB7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPVxuICAgIGhvbGRlcltBQk9SVF9TVFJFQU1fTkFNRV0gPz8gaG9sZGVyLnNpZ25hbD8uW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgY29uc3QgaG9va1Rva2VuID1cbiAgICBob2xkZXJbQUJPUlRfSE9PS19UT0tFTl0gPz8gaG9sZGVyLnNpZ25hbD8uW0FCT1JUX0hPT0tfVE9LRU5dO1xuICBpZiAoIXN0cmVhbU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBzdHJlYW0gbmFtZSBpcyBub3Qgc2V0Jyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW1OYW1lLFxuICAgIGhvb2tUb2tlbjogaG9va1Rva2VuISxcbiAgICBhYm9ydGVkOiBzaWduYWwuYWJvcnRlZCxcbiAgICByZWFzb246IHNpZ25hbC5hYm9ydGVkID8gc2lnbmFsLnJlYXNvbiA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYSBzaW5nbGUgYWJvcnQgbGlzdGVuZXIgdG8gYSBzaWduYWwsIGRlZHVwZWQgYWNyb3NzIGNhbGxzLlxuICpcbiAqIEVhY2ggc2VyaWFsaXphdGlvbiBwYXNzIGdvZXMgdGhyb3VnaCB0aGUgcmVkdWNlciwgYnV0IGEgY29udHJvbGxlciBwYXNzZWRcbiAqIHRvIE4gc3RlcHMgd291bGQgb3RoZXJ3aXNlIGFjY3VtdWxhdGUgTiBsaXN0ZW5lcnMg4oCUIGVhY2ggd3JpdGluZyB0aGUgc2FtZVxuICogc3RyZWFtIHBhY2tldCBhbmQgZG91YmxlLWNsb3NpbmcgdGhlIHN0cmVhbSBvbiBhYm9ydC4gVGhlIG1hcmtlciBzeW1ib2xcbiAqIGVuc3VyZXMgdGhlIHN0cmVhbS13cml0ZSBzaWRlLWVmZmVjdCBydW5zIGF0IG1vc3Qgb25jZSBwZXIgKHNpZ25hbCwgcnVuSWQpLlxuICovXG5mdW5jdGlvbiBhdHRhY2hBYm9ydExpc3RlbmVyT25jZShcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgc3RyZWFtTmFtZTogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W11cbik6IHZvaWQge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgaWYgKChzaWduYWwgYXMgYW55KVtBQk9SVF9MSVNURU5FUl9BVFRBQ0hFRF0pIHJldHVybjtcbiAgKHNpZ25hbCBhcyBhbnkpW0FCT1JUX0xJU1RFTkVSX0FUVEFDSEVEXSA9IHRydWU7XG5cbiAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgJ2Fib3J0JyxcbiAgICAoKSA9PiB7XG4gICAgICBvcHMucHVzaChcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRGVoeWRyYXRlIHZpYSB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIHJlYWRlciB1c2VzIChoeWRyYXRlU3RlcEFyZ3VtZW50cylcbiAgICAgICAgICAgIC8vIHNvIHRoZSByZWFzb24gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkgKERPTUV4Y2VwdGlvbixcbiAgICAgICAgICAgIC8vIEVycm9ycywgY3VzdG9tIGNsYXNzZXMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3MgZW5jcnlwdGlvbiBrZXkuXG4gICAgICAgICAgICAvLyBBIGJhcmUgSlNPTi5zdHJpbmdpZnkgaGVyZSB3b3VsZCB3cml0ZSBhIHBhY2tldCB0aGUgcmVhZGVyIGNhbid0XG4gICAgICAgICAgICAvLyBkZWNvZGUgYW5kIHRoZSBsaXN0ZW5lci1zaWRlIGFib3J0IHdvdWxkIHByb3BhZ2F0ZSB3aXRoIG5vIHJlYXNvbi5cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb246IHNpZ25hbC5yZWFzb24gfSxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBzdHJlYW1OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocGF5bG9hZCBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0sXG4gICAgeyBvbmNlOiB0cnVlIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHRoZSBjbGllbnQgc2lkZSwgcGFzc2luZyBhcmd1bWVudHNcbiAqIHRvIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICogQHBhcmFtIGNyeXB0b0tleVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hlbiBgdHJ1ZWAsIGJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgKVxuICogICBhcmUgd3JhcHBlZCBpbiBsZW5ndGgtcHJlZml4ZWQgZnJhbWVzIG9uIHRoZSB3aXJlIHNvIHRoZSBjb25zdW1lclxuICogICBjYW4gcmVjb25uZWN0IG9uIHRyYW5zaWVudCBlcnJvcnMuIFNob3VsZCBtYXRjaCB0aGUgdGFyZ2V0IHJ1bidzXG4gKiAgIGNhcGFiaWxpdHkg4oCUIHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHNcbiAqICAgdG8gYGZhbHNlYCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSBuZXN0ZWQgYFJlYWRhYmxlU3RyZWFtYCBmb3VuZCB3aGlsZSBzZXJpYWxpemluZ1xuICAvLyBpcyBwaXBlZCB0byBpdHMgb3duIHNlcnZlciBzdHJlYW0gaW5kZXBlbmRlbnRseSBvZiB0aGUgb3V0ZXIgc2luaywgc28gaXRzXG4gIC8vIGZpcnN0IGNodW5rIGNhbiByYWNlIGBydW5fc3RhcnRlZGAuIFRocmVhZCB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgaW50byB0aGF0XG4gIC8vIHNpbmsgc28gdGhlIHdyaXRlIG9yZGVycyBhZnRlciB0aGUgcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gL1xuICAvLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFN0cmVhbSBtdXN0IG5vdCBiZSBsb2NrZWQgd2hlbiBwYXNzaW5nIGFjcm9zcyBleGVjdXRpb24gYm91bmRhcnlcbiAgICAgIGlmICh2YWx1ZS5sb2NrZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnUmVhZGFibGVTdHJlYW0gaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93IGJvdW5kYXJ5LicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ1Bhc3MgdGhlIHN0cmVhbSBiZWZvcmUgY2FsbGluZyAuZ2V0UmVhZGVyKCkgLyAucGlwZVRocm91Z2goKSAvIC5waXBlVG8oKSwgb3IgdGVlIGl0IHdpdGggLnRlZSgpIGFuZCBwYXNzIG9uZSBvZiB0aGUgYnJhbmNoZXMuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuXG4gICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICBydW5JZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgaWYgKGZyYW1lZEJ5dGVTdHJlYW1zKSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKHR5cGUgPT09ICdieXRlcycgJiYgZnJhbWVkQnl0ZVN0cmVhbXMpIHMuZnJhbWluZyA9ICdmcmFtZWQtdjEnO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBGYXN0IHBhdGg6IHdoZW4gdGhlIHdyaXRhYmxlIGlzIGFscmVhZHkgYmFja2VkIGJ5IGEgd29ya2Zsb3dcbiAgICAgIC8vIHNlcnZlciBzdHJlYW0gKGUuZy4gaXQgY2FtZSBmcm9tIGEgc3RlcC1jb250ZXh0IGBnZXRXcml0YWJsZSgpYFxuICAgICAgLy8gb3Igd2FzIGh5ZHJhdGVkIGZyb20gYSB3b3JrZmxvdyBpbnB1dCBieSBgZ2V0U3RlcFJldml2ZXJzYCksXG4gICAgICAvLyBmb3J3YXJkIGl0cyB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCB0byB0aGUgcmVjZWl2aW5nIHJ1bi5cbiAgICAgIC8vIFRoZSByZWNlaXZpbmcgcnVuJ3Mgc3RlcC1zaWRlIHJldml2ZXIgb3BlbnMgYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZXMgdGhhdCBydW4nc1xuICAgICAgLy8gZW5jcnlwdGlvbiBrZXkgZGlyZWN0bHksIHNvIHdyaXRlcyBsYW5kIG9uIHRoZSBvcmlnaW5hbCBzdHJlYW1cbiAgICAgIC8vIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgcmVjZWl2aW5nIHJ1biDigJQgbm8gaW4tcHJvY2Vzc1xuICAgICAgLy8gYnJpZGdlIHRpZWQgdG8gdGhlIGRlaHlkcmF0aW5nIHN0ZXAncyBsaWZldGltZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nTmFtZSA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBleGlzdGluZ1J1bklkID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nTmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nUnVuSWQgPT09ICdzdHJpbmcnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHtcbiAgICAgICAgICBuYW1lOiBleGlzdGluZ05hbWUsXG4gICAgICAgICAgcnVuSWQ6IGV4aXN0aW5nUnVuSWQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRGVwbG95bWVudElkID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgICBdO1xuICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nRGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlc2NyaXB0b3IuZGVwbG95bWVudElkID0gZXhpc3RpbmdEZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICBjb25zdCBuYW1lID0gYHN0cm1fJHtzdHJlYW1JZH1gO1xuICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgbmFtZSk7XG4gICAgICBvcHMucHVzaChyZWFkYWJsZS5waXBlVG8odmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHsgbmFtZSB9O1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVkdWNlcnMgZm9yIHNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQgc2lkZSBhbmQgaW50byBzdGVwIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIC4uLmdldEFsbEJhc2VSZWR1Y2VycyhnbG9iYWwpLFxuXG4gICAgLy8gUmVhZGFibGUvV3JpdGFibGUgc3RyZWFtcyBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gICAgLy8gYXJlIHNpbXBseSBcImhhbmRsZXNcIiB0aGF0IGNhbiBiZSBwYXNzZWQgYXJvdW5kIHRvIG90aGVyIHN0ZXBzLlxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZmFrZSBzdHJlYW0gc3RvcmluZyBCb2R5SW5pdCBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IGJvZHlJbml0ID0gdmFsdWVbQk9EWV9JTklUX1NZTUJPTF07XG4gICAgICBpZiAoYm9keUluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgZmFrZSBzdHJlYW0gLSBzZXJpYWxpemUgdGhlIEJvZHlJbml0IGRpcmVjdGx5XG4gICAgICAgIC8vIGRldmFsdWUgd2lsbCBoYW5kbGUgc2VyaWFsaXppbmcgc3RyaW5ncywgVWludDhBcnJheSwgZXRjLlxuICAgICAgICByZXR1cm4geyBib2R5SW5pdCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1JlYWRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBjb25zdCB0eXBlID0gdmFsdWVbU1RSRUFNX1RZUEVfU1lNQk9MXTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgY29uc3QgZnJhbWluZzogQnl0ZVN0cmVhbUZyYW1pbmcgfCB1bmRlZmluZWQgPVxuICAgICAgICB2YWx1ZVtTVFJFQU1fRlJBTUlOR19TWU1CT0xdO1xuICAgICAgaWYgKGZyYW1pbmcpIHMuZnJhbWluZyA9IGZyYW1pbmc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKCdXcml0YWJsZVN0cmVhbSBgbmFtZWAgaXMgbm90IHNldCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnV3JpdGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgLy8gV2hlbiB0aGUgaGFuZGxlIHdhcyBmb3J3YXJkZWQgZnJvbSBhbm90aGVyIHJ1biAocGFyZW50IOKGkiBjaGlsZFxuICAgICAgLy8gdmlhIGBzdGFydCgpYCksIHByZXNlcnZlIHRoZSBmb3JlaWduIHJ1bklkIHNvIHRoZSBzdGVwLXNpZGVcbiAgICAgIC8vIHJldml2ZXIgb3BlbnMgdGhlIHdyaXRhYmxlIGFnYWluc3QgdGhlIG9yaWdpbmFsIHN0cmVhbS5cbiAgICAgIGNvbnN0IGZvcmVpZ25SdW5JZCA9IHZhbHVlW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25SdW5JZCA9PT0gJ3N0cmluZycpIHMucnVuSWQgPSBmb3JlaWduUnVuSWQ7XG4gICAgICBjb25zdCBmb3JlaWduRGVwbG95bWVudElkID0gdmFsdWVbU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTF07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICAvLyBBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgaW4gd29ya2Zsb3cgY29udGV4dCDigJQganVzdCByZWFkIHN5bWJvbHMgKGhhbmRsZXMpLlxuICAgIC8vIEluIHRoZSB3b3JrZmxvdyBWTSwgZ2xvYmFsLkFib3J0Q29udHJvbGxlciBpcyBhIGNsYXNzIGJ1dCBnbG9iYWwuQWJvcnRTaWduYWxcbiAgICAvLyBpcyBhIHBsYWluIG9iamVjdCAobm90IGEgY2xhc3MpLCBzbyBpbnN0YW5jZW9mIGNoZWNrcyB3b24ndCB3b3JrIGZvciBzaWduYWxzLlxuICAgIC8vIERldGVjdCBpbnN0YW5jZXMgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBBQk9SVF9TVFJFQU1fTkFNRSBzeW1ib2wgaW5zdGVhZC5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUuc2lnbmFsKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBob2xkZXIgPSB2YWx1ZSBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEhvbGRlcjtcbiAgICAgIGNvbnN0IGhhc0Fib3J0U3ltYm9sID1cbiAgICAgICAgaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA/PyBob2xkZXIuc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICAgICAgY29uc3QgaXNOYXRpdmVBYm9ydENvbnRyb2xsZXIgPVxuICAgICAgICBnbG9iYWwuQWJvcnRDb250cm9sbGVyICYmXG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcjtcbiAgICAgIGlmICghaGFzQWJvcnRTeW1ib2wgJiYgIWlzTmF0aXZlQWJvcnRDb250cm9sbGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRCeVN5bWJvbCh2YWx1ZS5zaWduYWwsIGhvbGRlcik7XG4gICAgfSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBzaWduYWwgPSB2YWx1ZSBhcyAoQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscykgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNBYm9ydFN5bWJvbCA9IHNpZ25hbD8uW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgICAgIGNvbnN0IGlzTmF0aXZlQWJvcnRTaWduYWwgPVxuICAgICAgICBnbG9iYWwuQWJvcnRTaWduYWwgJiZcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbDtcbiAgICAgIGlmICghaGFzQWJvcnRTeW1ib2wgJiYgIWlzTmF0aXZlQWJvcnRTaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlLCB2YWx1ZSBhcyBBYm9ydEhvbGRlcik7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCBwYXNzaW5nIHJldHVybiB2YWx1ZSB0byB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBhIHJldHVybmVkIGBSZWFkYWJsZVN0cmVhbWAgaXMgcGlwZWQgdG8gdGhlIHNlcnZlclxuICAvLyBhZnRlciB0aGUgYm9keSBidXQgd2l0aGluIHRoZSBzYW1lIG9wIGZsdXNoLCBzbyBpdHMgZmlyc3QgY2h1bmsgY2FuIHJhY2VcbiAgLy8gYHJ1bl9zdGFydGVkYC4gVGhyZWFkIHRoZSBydW4tcmVhZHkgYmFycmllciBpbnRvIHRoZSBzaW5rIHNvIHRoYXQgd3JpdGVcbiAgLy8gb3JkZXJzIGFmdGVyIHRoZSBydW4gZXhpc3RzLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZWFkYWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gU3RyZWFtIG11c3Qgbm90IGJlIGxvY2tlZCB3aGVuIHBhc3NpbmcgYWNyb3NzIGV4ZWN1dGlvbiBib3VuZGFyeVxuICAgICAgaWYgKHZhbHVlLmxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdSZWFkYWJsZVN0cmVhbSBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBwYXNzZWQgYWNyb3NzIGEgd29ya2Zsb3cgYm91bmRhcnkuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnUGFzcyB0aGUgc3RyZWFtIGJlZm9yZSBjYWxsaW5nIC5nZXRSZWFkZXIoKSAvIC5waXBlVGhyb3VnaCgpIC8gLnBpcGVUbygpLCBvciB0ZWUgaXQgd2l0aCAudGVlKCkgYW5kIHBhc3Mgb25lIG9mIHRoZSBicmFuY2hlcy4nLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmVhbSBhbHJlYWR5IGhhcyB0aGUgbmFtZSBzeW1ib2wgc2V0LCBpbiB3aGljaCBjYXNlXG4gICAgICAvLyBpdCdzIGFscmVhZHkgYmVpbmcgc3VuayB0byB0aGUgc2VydmVyIGFuZCB3ZSBjYW4ganVzdCByZXR1cm4gdGhlXG4gICAgICAvLyBuYW1lIGFuZCB0eXBlLlxuICAgICAgbGV0IG5hbWUgPSB2YWx1ZVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgbGV0IHR5cGUgPSB2YWx1ZVtTVFJFQU1fVFlQRV9TWU1CT0xdO1xuICAgICAgLy8gVGhlIGZyYW1pbmcgc3ltYm9sIGlzIHNldCB3aGVuIGEgd29ya2Zsb3cgVk0gcmV2aXZlcyBhIHN0cmVhbVxuICAgICAgLy8gaGFuZGxlIGZyb20gYSBwcmV2aW91cyBzdGVwIChzZWUgYGdldFdvcmtmbG93UmV2aXZlcnNgKS4gV2hlblxuICAgICAgLy8gcHJlc2VudCB3ZSBtdXN0IHByb3BhZ2F0ZSB0aGUgc2FtZSBmcmFtaW5nIGNob2ljZSBvbiB0aGUgd2F5XG4gICAgICAvLyBiYWNrIG91dCwgc2luY2UgdGhlIGJ5dGVzIGFscmVhZHkgb24gdGhlIHNlcnZlcidzIHN0cmVhbSBhcmUgaW5cbiAgICAgIC8vIHRoYXQgZm9ybWF0IOKAlCBzd2l0Y2hpbmcgZm9ybWF0IG1pZC1zdHJlYW0gd291bGQgY29ycnVwdCB0aGVtLlxuICAgICAgbGV0IGZyYW1pbmc6IEJ5dGVTdHJlYW1GcmFtaW5nIHwgdW5kZWZpbmVkID0gdmFsdWVbU1RSRUFNX0ZSQU1JTkdfU1lNQk9MXTtcblxuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICAgIG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICAgIHR5cGUgPSBnZXRTdHJlYW1UeXBlKHZhbHVlKTtcbiAgICAgICAgZnJhbWluZyA9IHR5cGUgPT09ICdieXRlcycgJiYgZnJhbWVkQnl0ZVN0cmVhbXMgPyAnZnJhbWVkLXYxJyA6IGZyYW1pbmc7XG5cbiAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAgIGlmIChmcmFtaW5nID09PSAnZnJhbWVkLXYxJykge1xuICAgICAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgICAgIHZhbHVlLnBpcGVUaHJvdWdoKGdldEJ5dGVGcmFtaW5nU3RyZWFtKCkpLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wcy5wdXNoKHZhbHVlLnBpcGVUbyh3cml0YWJsZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIC5waXBlVGhyb3VnaChcbiAgICAgICAgICAgICAgICBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgICAgICAgICBnZXRTdGVwUmVkdWNlcnMoXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5LFxuICAgICAgICAgICAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5waXBlVG8od3JpdGFibGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZWFkYWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgIGlmIChmcmFtaW5nKSBzLmZyYW1pbmcgPSBmcmFtaW5nO1xuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLldyaXRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBjb25zdCBmb3JlaWduUnVuSWQgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbUlkID0gKChnbG9iYWwgYXMgYW55KVtTVEFCTEVfVUxJRF0gfHwgZGVmYXVsdFVsaWQpKCk7XG4gICAgICAgIG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgIG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBuYW1lKVxuICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICBnZXRTdGVwUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBjcnlwdG9LZXkpLFxuICAgICAgICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZVRvKHZhbHVlKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25SdW5JZCA9PT0gJ3N0cmluZycpIHMucnVuSWQgPSBmb3JlaWduUnVuSWQ7XG4gICAgICBjb25zdCBmb3JlaWduRGVwbG95bWVudElkID0gKHZhbHVlIGFzIGFueSlbXG4gICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xcbiAgICAgIF07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0Q29udHJvbGxlciB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlciAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0Q29udHJvbGxlcilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZS5zaWduYWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGNyeXB0b0tleVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhZ2xvYmFsLkFib3J0U2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRTaWduYWwgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5BYm9ydFNpZ25hbClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0V2l0aExpc3RlbmVyKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ2FuY2VsIGRhbmdsaW5nIGFib3J0LXN0cmVhbSByZWFkZXJzIG9uIGFueSBBYm9ydENvbnRyb2xsZXIgaW5zdGFuY2VzIGZvdW5kXG4gKiBpbiB0aGUgaHlkcmF0ZWQgc3RlcCBhcmd1bWVudHMuIENhbGxlZCBhZnRlciB0aGUgc3RlcCBmdW5jdGlvbiByZXR1cm5zXG4gKiAoc3VjY2VzcyBvciBmYWlsdXJlKSB0byBwcmV2ZW50IHJlYWRlciBwcm9taXNlcyBmcm9tIGtlZXBpbmcgdGhlIHNlcnZlcmxlc3NcbiAqIGZ1bmN0aW9uIGFsaXZlIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbmNlbEFib3J0UmVhZGVycyguLi52YWx1ZXM6IHVua25vd25bXSk6IHZvaWQge1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFdlYWtTZXQoKTtcbiAgZnVuY3Rpb24gY2FuY2VsSWZQcmVzZW50KHZhbDogQWJvcnRJbnRlcm5hbHMpOiB2b2lkIHtcbiAgICBjb25zdCBjYW5jZWwgPSB2YWxbQUJPUlRfUkVBREVSX0NBTkNFTF07XG4gICAgaWYgKGNhbmNlbCAmJiAhY2FuY2VsLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjYW5jZWwuYWJvcnQoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gd2Fsayh2YWw6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHJldHVybjtcbiAgICBpZiAodmlzaXRlZC5oYXModmFsIGFzIG9iamVjdCkpIHJldHVybjtcbiAgICB2aXNpdGVkLmFkZCh2YWwgYXMgb2JqZWN0KTtcbiAgICBpZiAodmFsIGluc3RhbmNlb2YgQWJvcnRDb250cm9sbGVyKSB7XG4gICAgICBjYW5jZWxJZlByZXNlbnQodmFsIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIGNhbmNlbElmUHJlc2VudCh2YWwuc2lnbmFsIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpIHtcbiAgICAgIGNhbmNlbElmUHJlc2VudCh2YWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWwpIHdhbGsoaXRlbSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2YWwudmFsdWVzKCkpIHdhbGsodik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2YWwpIHdhbGsodik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFJlcXVlc3QvUmVzcG9uc2UgZXhwb3NlIGBzaWduYWxgL2Bib2R5YCBhcyBwcm90b3R5cGUgZ2V0dGVycywgc29cbiAgICAvLyBPYmplY3QudmFsdWVzKCkgd29uJ3QgZmluZCB0aGVtLiBEZXNjZW5kIGV4cGxpY2l0bHkuXG4gICAgaWYgKHR5cGVvZiBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgICB3YWxrKHZhbC5zaWduYWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHYgb2YgT2JqZWN0LnZhbHVlcyh2YWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB3YWxrKHYpO1xuICB9XG4gIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpIHdhbGsodik7XG59XG5cbi8qKlxuICogU2V0cyB1cCBhIHN0cmVhbSByZWFkZXIgb24gdGhlIGNvbnRyb2xsZXIgdGhhdCBsaXN0ZW5zIGZvciBhbiBhYm9ydCBwYWNrZXQuXG4gKiBSZXR1cm5zIHRoZSByZWFkZXJDYW5jZWwgY29udHJvbGxlciBzbyBpdCBjYW4gYmUgc3RvcmVkIG9uIGJvdGggdGhlXG4gKiBjb250cm9sbGVyIGFuZCBzaWduYWwgZm9yIGNsZWFudXAgYnkgY2FuY2VsQWJvcnRSZWFkZXJzLlxuICovXG5mdW5jdGlvbiBzZXR1cEFib3J0U3RyZWFtUmVhZGVyKFxuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHN0cmVhbU5hbWU6IHN0cmluZyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W11cbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGNvbnN0IHJlYWRlckNhbmNlbCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBvcHMucHVzaChcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgc3RyZWFtTmFtZSk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgIHJlYWRlci5yZWFkKCksXG4gICAgICAgICAgbmV3IFByb21pc2U8eyB2YWx1ZTogdW5kZWZpbmVkOyBkb25lOiB0cnVlIH0+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVhZGVyQ2FuY2VsLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXJDYW5jZWwuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICdhYm9ydCcsXG4gICAgICAgICAgICAgICgpID0+IHJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pLFxuICAgICAgICAgICAgICB7IG9uY2U6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQudmFsdWUgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgLy8gQW4gYWJvcnQgcGFja2V0IGFycml2ZWQ6IHByb3BhZ2F0ZSBpdCBhcyBmYXN0IGFzIHBvc3NpYmxlLiBSZWxlYXNlXG4gICAgICAgICAgLy8gdGhlIGxvY2sgKHN5bmNocm9ub3VzKSByYXRoZXIgdGhhbiBjYW5jZWxsaW5nIGhlcmUg4oCUIG9uIGFcbiAgICAgICAgICAvLyBzZXJ2aWNlLWJhY2tlZCBXb3JsZCBgcmVhZGVyLmNhbmNlbCgpYCBjYW4gZG8gYSBuZXR3b3JrIHJvdW5kLXRyaXAsXG4gICAgICAgICAgLy8gYW5kIGF3YWl0aW5nIGl0IGJlZm9yZSBgY29udHJvbGxlci5hYm9ydCgpYCB3b3VsZCBkZWxheSAob3IsIGlmIGl0XG4gICAgICAgICAgLy8gaGFuZ3MsIGRyb3ApIHJlYWwtdGltZSBhYm9ydCBkZWxpdmVyeSB0byB0aGUgaW4tZmxpZ2h0IHN0ZXAuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gUmVhZGVyIG1heSBhbHJlYWR5IGJlIHJlbGVhc2VkOyBpZ25vcmUuXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBIeWRyYXRlIHZpYSB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIHdyaXRlciB1c2VkIHNvIHRoZSByZWFzb25cbiAgICAgICAgICAgIC8vIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5LiBFbmNyeXB0aW9uIGtleSAoaWYgYW55KVxuICAgICAgICAgICAgLy8gY29tZXMgZnJvbSB0aGUgc3RlcCBjb250ZXh0IOKAlCBzZXQgdXAgYnkgdGhlIHN0ZXAgaGFuZGxlciBiZWZvcmVcbiAgICAgICAgICAgIC8vIHRoaXMgcmVhZGVyIHJ1bnMuIEZhbGxiYWNrIHRvIHVuZGVmaW5lZCBmb3IgZXh0ZXJuYWwtY29udGV4dFxuICAgICAgICAgICAgLy8gcmV2aXZlcyAodGhlIGh5ZHJhdGUgcGF0aCBpcyBlbmNyeXB0aW9uLWtleS10b2xlcmFudCkuXG4gICAgICAgICAgICBjb25zdCBjdHhGb3JLZXkgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgY3R4Rm9yS2V5Py5lbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApKSBhcyB7IHJlYXNvbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZGF0YT8ucmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIHN0ZXAgZmluaXNoZWQgKG9yIHRoZSByZWFkZXIgd2FzIGNhbmNlbGxlZCkgd2l0aG91dCBhbiBhYm9ydC5cbiAgICAgICAgICAvLyBDYW5jZWwg4oCUIG5vdCBqdXN0IHJlbGVhc2Ug4oCUIHNvIHRoZSB1bmRlcmx5aW5nIFdvcmxkIHN0cmVhbSBpcyB0b3JuXG4gICAgICAgICAgLy8gZG93bjogYSBwb2xsaW5nIFdvcmxkIChlLmcuIHdvcmxkLWxvY2FsKSBvdGhlcndpc2UgbGVha3MgYSB0YWlsXG4gICAgICAgICAgLy8gcmVhZGVyIChhIDEwMG1zIGZpbGVzeXN0ZW0gcG9sbCBwbHVzIGVtaXR0ZXIgbGlzdGVuZXJzKSBwZXIgc3RlcFxuICAgICAgICAgIC8vIGludm9jYXRpb24gZm9yIHRoZSBsaWZlIG9mIHRoZSBwcm9jZXNzLCBzaW5jZSBhIHNpZ25hbC1iZWFyaW5nIHN0ZXBcbiAgICAgICAgICAvLyBvcGVucyBvbmUgb2YgdGhlc2Ugb24gZXZlcnkgcmV2aXZhbCBhbmQgdXN1YWxseSBuZXZlciBhYm9ydHMuIEZpcmVcbiAgICAgICAgICAvLyBhbmQgZm9yZ2V0OiBhIHNlcnZpY2UtYmFja2VkIFdvcmxkJ3MgY2FuY2VsIG1heSBoaXQgdGhlIG5ldHdvcmssXG4gICAgICAgICAgLy8gYW5kIHRoaXMgcGF0aCBtdXN0IG5vdCBibG9jayB0aGUgc3RlcCdzIG9wcy1zZXR0bGUgd2luZG93LlxuICAgICAgICAgIHZvaWQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN0cmVhbSByZWFkIGZhaWxlZCDigJQgc2lnbmFsIHdvbid0IHByb3BhZ2F0ZSBpbiByZWFsLXRpbWUsXG4gICAgICAgIC8vIGJ1dCBob29rLWJhc2VkIHByb3BhZ2F0aW9uIG9uIG5leHQgcmVwbGF5IHByb3ZpZGVzIGZhbGxiYWNrXG4gICAgICB9XG4gICAgfSkoKVxuICApO1xuXG4gIHJldHVybiByZWFkZXJDYW5jZWw7XG59XG5cbi8qKlxuICogU3RvcmVzIGFib3J0IHNlcmlhbGl6YXRpb24gc3ltYm9scyBhbmQgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyXG4gKiBvbiBib3RoIHRoZSBjb250cm9sbGVyIGFuZCBpdHMgc2lnbmFsLlxuICovXG5mdW5jdGlvbiB0YWdBYm9ydFBhaXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgdmFsdWU6IHsgc3RyZWFtTmFtZTogc3RyaW5nOyBob29rVG9rZW46IHN0cmluZyB9LFxuICByZWFkZXJDYW5jZWw/OiBBYm9ydENvbnRyb2xsZXJcbik6IHZvaWQge1xuICBjb25zdCB0YWdnZWRDb250cm9sbGVyID0gY29udHJvbGxlciBhcyBBYm9ydENvbnRyb2xsZXIgJiBBYm9ydEludGVybmFscztcbiAgY29uc3QgdGFnZ2VkU2lnbmFsID0gY29udHJvbGxlci5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscztcbiAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfU1RSRUFNX05BTUVdID0gdmFsdWUuc3RyZWFtTmFtZTtcbiAgdGFnZ2VkU2lnbmFsW0FCT1JUX0hPT0tfVE9LRU5dID0gdmFsdWUuaG9va1Rva2VuO1xuICBpZiAocmVhZGVyQ2FuY2VsKSB7XG4gICAgdGFnZ2VkQ29udHJvbGxlcltBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgICB0YWdnZWRTaWduYWxbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSByZWFkZXJDYW5jZWw7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wYWdhdGUgYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBmcm9tIG9uZSBzaWduYWwgdG8gYW5vdGhlci4gVXNlZCBieSB0aGVcbiAqIFJlcXVlc3QgcmV2aXZlciBiZWNhdXNlIGBuZXcgUmVxdWVzdCh1cmwsIHsgc2lnbmFsIH0pYCBjb3BpZXMgdGhlIHNpZ25hbFxuICogaW50ZXJuYWxseSDigJQgdGhlIGNvbnN0cnVjdGVkIGByZXF1ZXN0LnNpZ25hbGAgaXMgYSBmcmVzaCBBYm9ydFNpZ25hbCB0aGF0XG4gKiBkb2Vzbid0IGNhcnJ5IHN5bWJvbHMgZnJvbSB0aGUgc291cmNlLlxuICovXG5mdW5jdGlvbiBjb3B5QWJvcnRJbnRlcm5hbHMoc3JjOiBBYm9ydFNpZ25hbCwgZGVzdDogQWJvcnRTaWduYWwpOiB2b2lkIHtcbiAgY29uc3QgcyA9IHNyYyBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCBkID0gZGVzdCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICBpZiAoc1tBQk9SVF9TVFJFQU1fTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfU1RSRUFNX05BTUVdID0gc1tBQk9SVF9TVFJFQU1fTkFNRV07XG4gIH1cbiAgaWYgKHNbQUJPUlRfSE9PS19UT0tFTl0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfSE9PS19UT0tFTl0gPSBzW0FCT1JUX0hPT0tfVE9LRU5dO1xuICB9XG4gIGlmIChzW0FCT1JUX1JFQURFUl9DQU5DRUxdICE9PSB1bmRlZmluZWQpIHtcbiAgICBkW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gc1tBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gQWJvcnRDb250cm9sbGVyIHdpdGggc3RyZWFtLWJhY2tlZCBhYm9ydCBwcm9wYWdhdGlvbi5cbiAqIFVzZWQgYnkgc3RlcCBhbmQgZXh0ZXJuYWwgcmV2aXZlcnMgd2hlcmUgcmVhbCBhYm9ydCBzaWduYWwgYmVoYXZpb3IgaXMgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzZXJpYWxpemVkIGFib3J0IGNvbnRyb2xsZXIvc2lnbmFsIGRhdGFcbiAqIEBwYXJhbSBvcHMgLSBUaGUgb3BzIGFycmF5IGZvciB0cmFja2luZyBhc3luYyB3b3JrXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIChmb3Igc3RyZWFtIHJlYWRzKVxuICogQHJldHVybnMgQSByZWFsIEFib3J0Q29udHJvbGxlciB3aXRoIHBhdGNoZWQgYWJvcnQoKSBtZXRob2RcbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRDb250cm9sbGVyKFxuICB2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWJvcnRDb250cm9sbGVyJ10sXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGFib3J0KCkgdG8gYWxzbyB3cml0ZSBzdHJlYW0gKyByZXN1bWUgaG9vayAoZm9yIHN0ZXAtaW5pdGlhdGVkIGFib3J0KVxuICBjb25zdCBvcmlnaW5hbEFib3J0ID0gY29udHJvbGxlci5hYm9ydC5iaW5kKGNvbnRyb2xsZXIpO1xuICBjb250cm9sbGVyLmFib3J0ID0gKHJlYXNvbj86IHVua25vd24pID0+IHtcbiAgICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIG9yaWdpbmFsQWJvcnQocmVhc29uKTtcblxuICAgIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4Lm9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIGFib3J0IHBheWxvYWQgdGhyb3VnaCB0aGUgc2FtZSBtYWNoaW5lcnkgdGhlIGhvb2tcbiAgICAgICAgICAgIC8vIGV2ZW50IHVzZXMgc28gdGhlIGByZWFzb25gIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5XG4gICAgICAgICAgICAvLyAoRE9NRXhjZXB0aW9uLCBjdXN0b20gZXJyb3JzLCBldGMuKSBhbmQgcmVzcGVjdHMgdGhlIHJ1bidzXG4gICAgICAgICAgICAvLyBlbmNyeXB0aW9uIGtleSDigJQgc3ltbWV0cmljIHdpdGggd2hhdCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAvLyB3cml0ZXMgZm9yIHdvcmtmbG93LWluaXRpYXRlZCBhYm9ydHMuXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfSxcbiAgICAgICAgICAgICAgY3R4LndvcmtmbG93TWV0YWRhdGEud29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICB2YWx1ZS5zdHJlYW1OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocGF5bG9hZCBhcyBVaW50OEFycmF5KTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgc3RyZWFtIHdyaXRlXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuXG4gICAgICBpZiAodmFsdWUuaG9va1Rva2VuKSB7XG4gICAgICAgIC8vIFRoZSBkdXJhYmxlIGhvb2sgcmVzdW1lICh3aGljaCB3cml0ZXMgdGhlIGBob29rX3JlY2VpdmVkYCBldmVudCB0aGF0XG4gICAgICAgIC8vIHJlY29yZHMgdGhpcyBhYm9ydCBpbiB0aGUgd29ya2Zsb3cncyBldmVudCBsb2cpIG11c3QgYmUgY29tbWl0dGVkXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgc3RlcCBjb21wbGV0ZXMuIE90aGVyd2lzZSB0aGUgd29ya2Zsb3cgY29udGludWF0aW9uXG4gICAgICAgIC8vIGVucXVldWVkIGJ5IGBzdGVwX2NvbXBsZXRlZGAgY2FuIGFkdmFuY2UgcGFzdCB0aGUgYWJvcnQg4oCUIGRpc3BhdGNoaW5nXG4gICAgICAgIC8vIGEgbGF0ZXIgc3RlcCB3aXRoIGEgc3RhbGUsIG5vbi1hYm9ydGVkIGBzaWduYWxgIOKAlCBiZWZvcmUgdGhlIGV2ZW50XG4gICAgICAgIC8vIGV4aXN0cy4gUm91dGUgaXQgdG8gYHByZUNvbXBsZXRpb25PcHNgIChhd2FpdGVkIGlubGluZSBiZWZvcmVcbiAgICAgICAgLy8gY29tcGxldGlvbikgcmF0aGVyIHRoYW4gYG9wc2AgKGJlc3QtZWZmb3J0LCBiYWNrZ3JvdW5kKS4gVGhlIHN0cmVhbVxuICAgICAgICAvLyB3cml0ZSBhYm92ZSBzdGF5cyBpbiBgb3BzYDogaXQgbXVzdCBmaXJlIEFTQVAgdG8gcmVhY2ggYW4gaW4tZmxpZ2h0XG4gICAgICAgIC8vIHNpYmxpbmcgc3RlcCBhbmQgaXMgbm90IHRoZSBkdXJhYmxlIHJlY29yZC5cbiAgICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgaGVyZSBzbyB0aGUgcHJvbWlzZSBjYW4gb25seSBldmVyIGVuZm9yY2Ugb3JkZXJpbmdcbiAgICAgICAgLy8gd2hlbiBhd2FpdGVkIChzZWUgdGhlIG5vLXJlamVjdCBjb250cmFjdCBvblxuICAgICAgICAvLyBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzKTsgYSBmYWlsZWQgcmVzdW1lIHJldHJpZXMgb24gbmV4dCByZXBsYXkuXG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bWUgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHJlc3VtZUhvb2s6IHJlc3VtZUhvb2tGbiB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgICAgICAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VtZUhvb2tGbih2YWx1ZS5ob29rVG9rZW4sIHtcbiAgICAgICAgICAgICAgYWJvcnRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBob29rIHJlc3VtZSDigJQgcmV0cnkgb24gbmV4dCByZXBsYXlcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGN0eC5wcmVDb21wbGV0aW9uT3BzLnB1c2goaG9va1Jlc3VtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG4vKipcbiAqIFJldml2ZXMganVzdCBhbiBBYm9ydFNpZ25hbCB3aXRob3V0IHRoZSBwYXRjaGVkIGFib3J0KCkgb3ZlcmhlYWQuXG4gKiBVc2VkIHdoZW4gb25seSBhIHNpZ25hbCAobm90IGEgY29udHJvbGxlcikgd2FzIHNlcmlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIHJldml2ZUFib3J0U2lnbmFsKFxuICB2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWJvcnRTaWduYWwnXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0U2lnbmFsIHtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBpZiAodmFsdWUuYWJvcnRlZCkge1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSk7XG4gICAgY29udHJvbGxlci5hYm9ydCh2YWx1ZS5yZWFzb24pO1xuICB9IGVsc2UgaWYgKHZhbHVlLnN0cmVhbU5hbWUpIHtcbiAgICBjb25zdCByZWFkZXJDYW5jZWwgPSBzZXR1cEFib3J0U3RyZWFtUmVhZGVyKFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHJ1bklkLFxuICAgICAgdmFsdWUuc3RyZWFtTmFtZSxcbiAgICAgIG9wc1xuICAgICk7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlLCByZWFkZXJDYW5jZWwpO1xuICB9IGVsc2Uge1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG59XG5cbi8qKlxuICogQmFzZSByZXZpdmVycyBzaGFyZWQgYWNyb3NzIGFsbCBzZXJpYWxpemF0aW9uIGJvdW5kYXJpZXMuXG4gKiBDb21wb3NlczogY2xhc3MgKyBjb21tb24gcmV2aXZlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICpcbiAqIFRoaXMgaXMgZXhwb3J0ZWQgYmVjYXVzZSBzZXJpYWxpemF0aW9uLWZvcm1hdC50cyBhbmQgb3RoZXIgZmlsZXMgcmVmZXJlbmNlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcykge1xuICByZXR1cm4ge1xuICAgIC4uLmdldENsYXNzUmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAuLi5nZXRDb21tb25SZXZpdmVyc0Zyb21Nb2R1bGUoZ2xvYmFsKSxcbiAgfSBhcyBjb25zdCBzYXRpc2ZpZXMgUGFydGlhbDxSZXZpdmVycz47XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZW5jcnlwdC1vbmx5IGtleSBuZWVkZWQgd2hlbiBhIGNoaWxkIHdyaXRlcyBpbnRvIGFub3RoZXIgcnVuJ3NcbiAqIHN0cmVhbS4gTmV3IGRlc2NyaXB0b3JzIGluY2x1ZGUgdGhlIG93bmVyJ3MgZGVwbG95bWVudCBJRDsgZGVzY3JpcHRvcnNcbiAqIGNyZWF0ZWQgYnkgb2xkZXIgU0RLIHZlcnNpb25zIGZhbGwgYmFjayB0byBsb2FkaW5nIHRoZSBvd25pbmcgcnVuLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGRlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPENyeXB0b0tleSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBpZiAoIXdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4pIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcmF3S2V5ID0gZGVwbG95bWVudElkXG4gICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKHJ1bklkLCB7IGRlcGxveW1lbnRJZCB9KVxuICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bihhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCkpO1xuICByZXR1cm4gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSwgWydlbmNyeXB0J10pIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgZnJvbSB0aGUgY2xpZW50IHNpZGUsXG4gKiByZWNlaXZpbmcgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsKSxcblxuICAgIC8vIFN0ZXBGdW5jdGlvbiBzaG91bGQgbm90IGJlIHJldHVybmVkIGZyb20gd29ya2Zsb3dzIHRvIGNsaWVudHNcbiAgICBTdGVwRnVuY3Rpb246ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICdTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGluIGNsaWVudCBjb250ZXh0LiBTdGVwIGZ1bmN0aW9ucyBzaG91bGQgbm90IGJlIHJldHVybmVkIGZyb20gd29ya2Zsb3dzLicsXG4gICAgICAgIHtcbiAgICAgICAgICBoaW50OiAnQSBzdGVwIGZ1bmN0aW9uIHJlZmVyZW5jZSByZWFjaGVkIHRoZSBjbGllbnQuIFJldHVybiBhIHNlcmlhbGl6YWJsZSB2YWx1ZSAoZS5nLiB0aGUgc3RlcCByZXN1bHQpIGluc3RlYWQgb2YgdGhlIHN0ZXAgaXRzZWxmLicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgJiB7IGR1cGxleD86IHN0cmluZyB9ID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBpbml0LnNpZ25hbCA9IHZhbHVlLnNpZ25hbDtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgZ2xvYmFsLlJlcXVlc3QodmFsdWUudXJsLCBpbml0KTtcbiAgICAgIC8vIFRoZSBSZXF1ZXN0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gaW50ZXJuYWwgc2lnbmFsIGNvcHksIHNvIHRoZVxuICAgICAgLy8gYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBzZXQgYnkgcmV2aXZlQWJvcnRTaWduYWwgZG9uJ3QgcHJvcGFnYXRlLlxuICAgICAgLy8gUmUtdGFnIHRoZSByZXF1ZXN0J3Mgb3duIHNpZ25hbCBzbyBjYW5jZWxBYm9ydFJlYWRlcnMgY2FuIGZpbmQgaXQuXG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBjb3B5QWJvcnRJbnRlcm5hbHModmFsdWUuc2lnbmFsLCByZXF1ZXN0LnNpZ25hbCk7XG4gICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9LFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIE5vdGU6IFJlc3BvbnNlIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBzdGF0dXMsIHN0YXR1c1RleHQsIGFuZCBoZWFkZXJzXG4gICAgICAvLyBUaGUgdHlwZSwgdXJsLCBhbmQgcmVkaXJlY3RlZCBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkgYW5kIHNldCBieSB0aGUgY29uc3RydWN0b3JcbiAgICAgIHJldHVybiBuZXcgZ2xvYmFsLlJlc3BvbnNlKHZhbHVlLmJvZHksIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBnbG9iYWwuSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gSWYgdGhpcyBoYXMgYm9keUluaXQsIGl0IGNhbWUgZnJvbSBhIFJlc3BvbnNlIGNvbnN0cnVjdG9yXG4gICAgICAvLyBDb252ZXJ0IGl0IHRvIGEgUkVBTCBzdHJlYW0gbm93IHRoYXQgd2UncmUgb3V0c2lkZSB0aGUgd29ya2Zsb3dcbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGJvZHlJbml0ID0gdmFsdWUuYm9keUluaXQ7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFJlc3BvbnNlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGNvbnZlcnQgQm9keUluaXQgdG8gUmVhZGFibGVTdHJlYW1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgZ2xvYmFsLlJlc3BvbnNlKGJvZHlJbml0KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyLiBBYnNlbnQgLyAncmF3JyBmcmFtaW5nIG1lYW5zIGxlZ2FjeSByYXcgYnl0ZXMg4oCUXG4gICAgICAgIC8vIHBpcGUgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBObyBhdXRvLXJlY29ubmVjdCBoZXJlIHlldDogcmF3IGJ5dGUgc3RyZWFtcyBoYXZlIG5vIHdpcmVcbiAgICAgICAgLy8gZnJhbWluZyB0byBjb3VudCBjb25zdW1lZCBjaHVua3Mgd2l0aC4gRnJhbWVkLXYxIGJ5dGUgc3RyZWFtc1xuICAgICAgICAvLyBtYWtlIGZyYW1lIGNvdW50aW5nIHBvc3NpYmxlLCBzbyBleHRlbmRpbmcgdGhlIHJlY29ubmVjdGluZ1xuICAgICAgICAvLyByZWFkZXIgdG8gdGhlbSBpcyBhIHNlcGFyYXRlIGZvbGxvdy11cC5cbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHZhbHVlLnN0YXJ0SW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBDcmVhdGUgYW4gaWRlbnRpdHkgKG9yIHVuZnJhbWluZykgdHJhbnNmb3JtIHRvIGdpdmUgdGhlIHVzZXIgYSByZWFkYWJsZVxuICAgICAgICBjb25zdCB7IHJlYWRhYmxlOiB1c2VyUmVhZGFibGUsIHdyaXRhYmxlIH0gPVxuICAgICAgICAgIHZhbHVlLmZyYW1pbmcgPT09ICdmcmFtZWQtdjEnXG4gICAgICAgICAgICA/IGdldEJ5dGVVbmZyYW1pbmdTdHJlYW0oKVxuICAgICAgICAgICAgOiBuZXcgZ2xvYmFsLlRyYW5zZm9ybVN0cmVhbSgpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB3cml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgICBwb2xsUmVhZGFibGVMb2NrKHVzZXJSZWFkYWJsZSwgc3RhdGUpO1xuXG4gICAgICAgIHJldHVybiB1c2VyUmVhZGFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb24tYnl0ZSBzdHJlYW1zIGNhcnJ5IGxlbmd0aC1wcmVmaXhlZCBmcmFtZXMsIHNvIHdlIGNhbiBjb3VudFxuICAgICAgICAvLyBjb21wbGV0ZWQgZnJhbWVzIGFuZCB0cmFuc3BhcmVudGx5IHJlY29ubmVjdCB3aGVuIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3Rpb24gdGltZXMgb3V0IG1pZC1ydW4uXG4gICAgICAgIGNvbnN0IHJlYWRhYmxlID0gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHZhbHVlLm5hbWUsXG4gICAgICAgICAgdmFsdWUuc3RhcnRJbmRleFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXREZXNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5KSxcbiAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgdHJhbnNmb3JtLndyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodHJhbnNmb3JtLnJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5yZWFkYWJsZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFNhbWUgaGFuZGxpbmcgYXMgYGdldFN0ZXBSZXZpdmVycy5Xcml0YWJsZVN0cmVhbWAg4oCUIHNlZSBjb21tZW50c1xuICAgICAgLy8gdGhlcmUgZm9yIHRoZSBjcm9zcy1ydW4gY2FzZSAod3JpdGFibGUgY2FycmllcyBgcnVuSWRgIGZyb21cbiAgICAgIC8vIHBhcmVudCDihpIgY2hpbGQgZm9yd2FyZGluZyB2aWEgYHN0YXJ0KClgKS5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXRLZXk6IEVuY3J5cHRpb25LZXlQYXJhbSA9XG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZFxuICAgICAgICAgID8gY3J5cHRvS2V5XG4gICAgICAgICAgOiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkodGFyZ2V0UnVuSWQsIHZhbHVlLmRlcGxveW1lbnRJZCk7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhnbG9iYWwsIG9wcywgdGFyZ2V0UnVuSWQsIHRhcmdldEtleSksXG4gICAgICAgIHRhcmdldEtleVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcnZlcldyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgIHRhcmdldFJ1bklkLFxuICAgICAgICB2YWx1ZS5uYW1lXG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgZmx1c2hhYmxlIHN0YXRlIGZvciB0aGlzIHN0cmVhbVxuICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgZmx1c2hhYmxlUGlwZShzZXJpYWxpemUucmVhZGFibGUsIHNlcnZlcldyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICBwb2xsV3JpdGFibGVMb2NrKHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUpO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VyaWFsaXplLndyaXRhYmxlO1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRDb250cm9sbGVyKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiByZXZpdmVBYm9ydFNpZ25hbCh2YWx1ZSwgb3BzLCBydW5JZCksXG4gIH07XG59XG5cbi8qKlxuICogUmV2aXZlcnMgZm9yIGRlc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcmVjZWl2aW5nIGFyZ3VtZW50cyBmcm9tIHRoZSBjbGllbnQgc2lkZSwgYW5kIHJldHVybiB2YWx1ZXNcbiAqIGZyb20gdGhlIHN0ZXBzLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1Jldml2ZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAvLyBTdGVwRnVuY3Rpb24gcmV2aXZlciBmb3Igd29ya2Zsb3cgY29udGV4dCAtIHVzZXMgdGhlIG1vZHVsYXIgcmV2aXZlclxuICAgIC8vIHdoaWNoIGNhbGxzIFdPUktGTE9XX1VTRV9TVEVQIGZyb20gZ2xvYmFsIHRvIHJlY29uc3RydWN0IHN0ZXAgcHJveGllc1xuICAgIC4uLmdldFN0ZXBGdW5jdGlvblJldml2ZXIoZ2xvYmFsKSxcbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih2YWx1ZSwgZ2xvYmFsLlJlcXVlc3QucHJvdG90eXBlKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgKHZhbHVlIGFzIGFueSlbV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRV0gPSByZXNwb25zZVdyaXRhYmxlO1xuICAgICAgICBkZWxldGUgdmFsdWUucmVzcG9uc2VXcml0YWJsZTtcbiAgICAgICAgKHZhbHVlIGFzIGFueSkucmVzcG9uZFdpdGggPSAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdgcmVzcG9uZFdpdGgoKWAgbXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBzdGVwIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhpbnQ6ICdNb3ZlIHRoZSBgcmVzcG9uZFdpdGgoLi4uKWAgY2FsbCBpbnNpZGUgYSBgXCJ1c2Ugc3RlcFwiYCBmdW5jdGlvbiDigJQgaXQgY2Fubm90IGJlIGludm9rZWQgZnJvbSBhIHdvcmtmbG93IGNvbnRleHQuJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgLy8gV29ya2Zsb3cgZnVuY3Rpb24gcmV2aXZlciBmb3Igd29ya2Zsb3cgY29udGV4dCDigJQgcmV0dXJucyBhIGZ1bmN0aW9uLWxpa2VcbiAgICAvLyBvYmplY3Qgd2l0aCAud29ya2Zsb3dJZCB0aGF0IG1pbWljcyB3aGF0IHRoZSBTV0MgY29tcGlsZXIgcHJvZHVjZXMsXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhpbnQ6ICdXcmFwIHRoZSB3b3JrZmxvdyB3aXRoIGBzdGFydCh3b3JrZmxvd0ZuLCB7IC4uLiB9KWAgZnJvbSBgd29ya2Zsb3dgIHRvIGJlZ2luIGEgcnVuIGluc3RlYWQgb2YgaW52b2tpbmcgaXQgbGlrZSBhIG5vcm1hbCBmdW5jdGlvbi4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuICAgIFJlc3BvbnNlOiAodmFsdWUpID0+IHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih2YWx1ZSwgZ2xvYmFsLlJlc3BvbnNlLnByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgQm9keUluaXQgdGhhdCBzaG91bGQgYmUgd3JhcHBlZCBpbiBhIGZha2Ugc3RyZWFtXG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICAvLyBSZWNyZWF0ZSB0aGUgZmFrZSBzdHJlYW0gd2l0aCB0aGUgQm9keUluaXRcbiAgICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgICAgICAgIFtCT0RZX0lOSVRfU1lNQk9MXToge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLmJvZHlJbml0LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWd1bGFyIHN0cmVhbSBoYW5kbGluZ1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgICAgICBbU1RSRUFNX05BTUVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgW1NUUkVBTV9UWVBFX1NZTUJPTF06IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUudHlwZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIENhcnJ5IHRoZSB3aXJlLWZyYW1pbmcgZGVjaXNpb24gdGhyb3VnaCB0aGUgd29ya2Zsb3cgVk0gc29cbiAgICAgICAgLy8gdGhhdCB3aGVuIHRoZSBoYW5kbGUgaXMgbGF0ZXIgcGFzc2VkIHRvIGEgc3RlcCAod2hpY2ggcmVhZHNcbiAgICAgICAgLy8gdGhlIGFjdHVhbCBieXRlcyBmcm9tIHRoZSBzZXJ2ZXIpIHdlIGtub3cgd2hldGhlciB0byB1bmZyYW1lLlxuICAgICAgICAvLyBEZWZhdWx0cyB0byB1bmRlZmluZWQgZm9yIHN0cmVhbXMgd2hvc2Ugc2VyaWFsaXplZCByZWYgZGlkbid0XG4gICAgICAgIC8vIGNhcnJ5IHRoZSBmaWVsZCDigJQgdGhvc2UgYXJlIHRyZWF0ZWQgYXMgbGVnYWN5IHJhdyBieXRlcy5cbiAgICAgICAgW1NUUkVBTV9GUkFNSU5HX1NZTUJPTF06IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUuZnJhbWluZyxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvck1hcCA9IHtcbiAgICAgICAgW1NUUkVBTV9OQU1FX1NZTUJPTF06IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgLy8gUHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQsIGlmIHByZXNlbnQsIHNvIHRoYXQgd2hlbiB0aGVcbiAgICAgIC8vIGhhbmRsZSBpcyBsYXRlciBwYXNzZWQgdG8gYSBzdGVwIHRoZSB3b3JrZmxvdyByZWR1Y2VyIGNhblxuICAgICAgLy8gZm9yd2FyZCBpdCB0aHJvdWdoIHRvIHRoZSBzdGVwIHJldml2ZXIuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZXNjcmlwdG9yW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLnJ1bklkLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBkZXNjcmlwdG9yW1NUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0xdID0ge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2xvYmFsLldyaXRhYmxlU3RyZWFtLnByb3RvdHlwZSwgZGVzY3JpcHRvcik7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZXZpdmVkIGluc2lkZSB0aGUgd29ya2Zsb3cgVk0uIFVzZSB0aGVcbiAgICAvLyByZWFsIFdvcmtmbG93QWJvcnRTaWduYWwgY2xhc3Mgc28gYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmbikgYWN0dWFsbHlcbiAgICAvLyBmaXJlcyB3aGVuIHRoZSBzaWduYWwgYWJvcnRzICh0aGUgcHJldmlvdXMgbm8tb3Agc3R1YiBzaWxlbnRseSBkcm9wcGVkXG4gICAgLy8gbGlzdGVuZXIgcmVnaXN0cmF0aW9ucyDigJQgc2lsZW50IGNvcnJlY3RuZXNzIGJ1ZyBmb3IgbmF0dXJhbCBwYXR0ZXJuc1xuICAgIC8vIGxpa2UgYHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGZuKWAgYWZ0ZXIgcmVjZWl2aW5nIGEgZGVzZXJpYWxpemVkXG4gICAgLy8gc2lnbmFsKS4gVGhlIHNpZ25hbCBkb2VzIG5vdCBvd24gYSBob29rIHN1YnNjcmlwdGlvbiBoZXJlIOKAlCBhYm9ydCBzdGF0ZVxuICAgIC8vIGlzIGRlbGl2ZXJlZCB2aWEgdGhlIGV4aXN0aW5nIHJlcGxheSBtYWNoaW5lcnkgb24gdGhlIHNvdXJjZSBzaWRlLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBzaWduYWwgPSBuZXcgV29ya2Zsb3dBYm9ydFNpZ25hbCh2YWx1ZS5zdHJlYW1OYW1lLCB2YWx1ZS5ob29rVG9rZW4pO1xuICAgICAgaWYgKHZhbHVlLmFib3J0ZWQpIHNpZ25hbC5fc2V0QWJvcnRlZCh2YWx1ZS5yZWFzb24pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW0FCT1JUX1NUUkVBTV9OQU1FXTogdmFsdWUuc3RyZWFtTmFtZSxcbiAgICAgICAgW0FCT1JUX0hPT0tfVE9LRU5dOiB2YWx1ZS5ob29rVG9rZW4sXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICAgYWJvcnQ6ICgpID0+IHt9LFxuICAgICAgfTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHZhbHVlLnN0cmVhbU5hbWUsIHZhbHVlLmhvb2tUb2tlbik7XG4gICAgICBpZiAodmFsdWUuYWJvcnRlZCkgc2lnbmFsLl9zZXRBYm9ydGVkKHZhbHVlLnJlYXNvbik7XG4gICAgICByZXR1cm4gc2lnbmFsO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmV2aXZlcnMgZm9yIGRlc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCByZWNlaXZpbmcgYXJndW1lbnRzIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBnZXRTdGVwUmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdLFxuICBydW5JZDogc3RyaW5nLFxuICBjcnlwdG9LZXk6IEVuY3J5cHRpb25LZXlQYXJhbSxcbiAgZGVwbG95bWVudElkPzogc3RyaW5nXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoZ2xvYmFsKSxcblxuICAgIC8vIFN0ZXBGdW5jdGlvbiByZXZpdmVyIGZvciBzdGVwIGNvbnRleHQgLSByZXR1cm5zIHJhdyBzdGVwIGZ1bmN0aW9uXG4gICAgLy8gd2l0aCBjbG9zdXJlIHZhcmlhYmxlIHN1cHBvcnQgdmlhIEFzeW5jTG9jYWxTdG9yYWdlLlxuICAgIC8vXG4gICAgLy8gSGFuZGxlcyBmb3VyIGluZGVwZW5kZW50IGZsYWdzIGZyb20gdGhlIHNlcmlhbGl6ZWQgcGF5bG9hZDpcbiAgICAvLyAgIC0gYGNsb3N1cmVWYXJzYDogaW52b2tlIHRoZSBib2R5IGluc2lkZSBhbiBBc3luY0xvY2FsU3RvcmFnZSBmcmFtZVxuICAgIC8vICAgICBzbyB0aGUgU1dDLWVtaXR0ZWQgYFdPUktGTE9XX1NURVBfQ09OVEVYVF9TVE9SQUdFYCBJSUZFIGluIHRoZVxuICAgIC8vICAgICBob2lzdGVkIGJvZHkgY2FuIHB1bGwgdGhlIGNsb3N1cmUgdmFyaWFibGVzIGJhY2sgb3V0LlxuICAgIC8vICAgLSBgYm91bmRUaGlzYDogICBhIGB0aGlzYCB2YWx1ZSBjYXB0dXJlZCBieVxuICAgIC8vICAgICBgdXNlU3RlcCguLi4pLmJpbmQodGhpcylgIGluIHRoZSB3b3JrZmxvdyBidW5kbGUgKGxleGljYWwtYHRoaXNgXG4gICAgLy8gICAgIGFycm93IHN0ZXBzKS4gVGhlIHdyYXBwZXIgaW52b2tlcyB0aGUgYm9keSB2aWFcbiAgICAvLyAgICAgYHN0ZXBGbi5hcHBseShib3VuZFRoaXMsIGFyZ3MpYCBzbyB0aGUgYm9keSBzZWVzIHRoZSBzYW1lXG4gICAgLy8gICAgIGB0aGlzYCBpdCB3b3VsZCBoYXZlIGhhZCBpbiB0aGUgd29ya2Zsb3cgYnVuZGxlLiBQcm9wZXJ0eVxuICAgIC8vICAgICBwcmVzZW5jZSDigJQgbm90IHRydXRoaW5lc3Mg4oCUIGlzIHNpZ25pZmljYW50IGJlY2F1c2VcbiAgICAvLyAgICAgYGJpbmQobnVsbClgIGFuZCBgYmluZCh1bmRlZmluZWQpYCBhcmUgYm90aCBsZWdhbCBhbmQgc2hvdWxkXG4gICAgLy8gICAgIHJvdW5kLXRyaXAgZmFpdGhmdWxseS5cbiAgICAvLyAgIC0gYGJvdW5kQXJnc2A6ICAgcHJlZmlsbGVkIGFyZ3MgZnJvbVxuICAgIC8vICAgICBgdXNlU3RlcCguLi4pLmJpbmQodGhpc0FyZywgeCwgeSlgLiBQcmVwZW5kZWQgdG8gdGhlIGNhbGwgYXJnc1xuICAgIC8vICAgICBzbyBwYXJ0aWFsIGFwcGxpY2F0aW9uIHN1cnZpdmVzIHNlcmlhbGl6YXRpb24uXG4gICAgU3RlcEZ1bmN0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHN0ZXBJZCA9IHZhbHVlLnN0ZXBJZDtcbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzID0gdmFsdWUuY2xvc3VyZVZhcnM7XG4gICAgICBjb25zdCBoYXNCb3VuZFRoaXMgPSAnYm91bmRUaGlzJyBpbiB2YWx1ZTtcbiAgICAgIGNvbnN0IGJvdW5kVGhpcyA9IGhhc0JvdW5kVGhpcyA/IHZhbHVlLmJvdW5kVGhpcyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGJvdW5kQXJncyA9IEFycmF5LmlzQXJyYXkodmFsdWUuYm91bmRBcmdzKSA/IHZhbHVlLmJvdW5kQXJncyA6IFtdO1xuXG4gICAgICBjb25zdCBzdGVwRm4gPSBnZXRTdGVwRnVuY3Rpb24oc3RlcElkKTtcbiAgICAgIGlmICghc3RlcEZuKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYFN0ZXAgZnVuY3Rpb24gXCIke3N0ZXBJZH1cIiBub3QgZm91bmQuIE1ha2Ugc3VyZSB0aGUgc3RlcCBmdW5jdGlvbiBpcyByZWdpc3RlcmVkLmAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogJ01ha2Ugc3VyZSB0aGUgc3RlcCBmaWxlIGlzIGluY2x1ZGVkIGluIHlvdXIgYnVpbGQgKGkuZS4gaXQgaXMgbGlzdGVkIGluIHRoZSB3b3JrZmxvdyBtYW5pZmVzdCksIGFuZCB0aGF0IHRoZSBTV0MgcGx1Z2luIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBmaWxlLicsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGYXN0IHBhdGg6IG5vdGhpbmcgdG8gd3JhcC5cbiAgICAgIGlmICghY2xvc3VyZVZhcnMgJiYgIWhhc0JvdW5kVGhpcyAmJiBib3VuZEFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdGVwRm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdyYXBwZWRTdGVwRm4gPSBmdW5jdGlvbiAodGhpczogdW5rbm93biwgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgY29uc3QgY2FsbFRoaXMgPSBoYXNCb3VuZFRoaXMgPyBib3VuZFRoaXMgOiB0aGlzO1xuICAgICAgICBjb25zdCBjYWxsQXJncyA9IGJvdW5kQXJncy5sZW5ndGggPiAwID8gWy4uLmJvdW5kQXJncywgLi4uYXJnc10gOiBhcmdzO1xuICAgICAgICBpZiAoY2xvc3VyZVZhcnMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgICAgICAgaWYgKCFjdXJyZW50Q29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAnQ2Fubm90IGNhbGwgc3RlcCBmdW5jdGlvbiB3aXRoIGNsb3N1cmUgdmFyaWFibGVzIG91dHNpZGUgc3RlcCBjb250ZXh0J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbmV3Q29udGV4dCA9IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRDb250ZXh0LFxuICAgICAgICAgICAgY2xvc3VyZVZhcnMsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gY29udGV4dFN0b3JhZ2UucnVuKG5ld0NvbnRleHQsICgpID0+XG4gICAgICAgICAgICBzdGVwRm4uYXBwbHkoY2FsbFRoaXMsIGNhbGxBcmdzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0ZXBGbi5hcHBseShjYWxsVGhpcywgY2FsbEFyZ3MpO1xuICAgICAgfSBhcyBhbnk7XG5cbiAgICAgIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIG9yaWdpbmFsIHN0ZXAgZnVuY3Rpb25cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkU3RlcEZuLCAnbmFtZScsIHtcbiAgICAgICAgdmFsdWU6IHN0ZXBGbi5uYW1lLFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcHBlZFN0ZXBGbiwgJ3N0ZXBJZCcsIHtcbiAgICAgICAgdmFsdWU6IHN0ZXBJZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHN0ZXBGbi5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd3JhcHBlZFN0ZXBGbi5tYXhSZXRyaWVzID0gc3RlcEZuLm1heFJldHJpZXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3cmFwcGVkU3RlcEZuO1xuICAgIH0sXG5cbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgJiB7IGR1cGxleD86IHN0cmluZyB9ID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBpbml0LnNpZ25hbCA9IHZhbHVlLnNpZ25hbDtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgZ2xvYmFsLlJlcXVlc3QodmFsdWUudXJsLCBpbml0KTtcbiAgICAgIC8vIFRoZSBSZXF1ZXN0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gaW50ZXJuYWwgc2lnbmFsIGNvcHksIHNvIHRoZVxuICAgICAgLy8gYWJvcnQtaW50ZXJuYWwgc3ltYm9scyBzZXQgYnkgcmV2aXZlQWJvcnRTaWduYWwgZG9uJ3QgcHJvcGFnYXRlLlxuICAgICAgLy8gUmUtdGFnIHRoZSByZXF1ZXN0J3Mgb3duIHNpZ25hbCBzbyBjYW5jZWxBYm9ydFJlYWRlcnMgY2FuIGZpbmQgaXQuXG4gICAgICBpZiAodmFsdWUuc2lnbmFsKSBjb3B5QWJvcnRJbnRlcm5hbHModmFsdWUuc2lnbmFsLCByZXF1ZXN0LnNpZ25hbCk7XG4gICAgICBpZiAocmVzcG9uc2VXcml0YWJsZSkge1xuICAgICAgICByZXF1ZXN0LnJlc3BvbmRXaXRoID0gYXN5bmMgKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdyaXRlciA9IHJlc3BvbnNlV3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHJlc3BvbnNlKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gTm90ZTogUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIHN0YXR1cywgc3RhdHVzVGV4dCwgYW5kIGhlYWRlcnNcbiAgICAgIC8vIFRoZSB0eXBlLCB1cmwsIGFuZCByZWRpcmVjdGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBhbmQgc2V0IGJ5IHRoZSBjb25zdHJ1Y3RvclxuICAgICAgcmV0dXJuIG5ldyBnbG9iYWwuUmVzcG9uc2UodmFsdWUuYm9keSwge1xuICAgICAgICBzdGF0dXM6IHZhbHVlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogdmFsdWUuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBJZiB0aGlzIGhhcyBib2R5SW5pdCwgaXQgY2FtZSBmcm9tIGEgUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIC8vIENvbnZlcnQgaXQgdG8gYSBSRUFMIHN0cmVhbSBub3cgdGhhdCB3ZSdyZSBpbiB0aGUgc3RlcCBlbnZpcm9ubWVudFxuICAgICAgaWYgKCdib2R5SW5pdCcgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZS5ib2R5SW5pdDtcbiAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgUmVzcG9uc2UgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgY29udmVydCBCb2R5SW5pdCB0byBSZWFkYWJsZVN0cmVhbVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5ldyBnbG9iYWwuUmVzcG9uc2UoYm9keUluaXQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVhZGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbShydW5JZCwgdmFsdWUubmFtZSk7XG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICAvLyBGb3IgYnl0ZSBzdHJlYW1zLCB1c2UgZmx1c2hhYmxlIHBpcGUgd2l0aCBsb2NrIHBvbGxpbmcuXG4gICAgICAgIC8vIElmIHRoZSBwcm9kdWNlciB3cm90ZSBmcmFtZWQgYnl0ZXMgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSxcbiAgICAgICAgLy8gdW53cmFwIHRoZSBsZW5ndGgtcHJlZml4IGVudmVsb3BlIGJlZm9yZSBoYW5kaW5nIGNodW5rcyB0b1xuICAgICAgICAvLyB0aGUgdXNlciBzdGVwLiBBYnNlbnQgLyAncmF3JyBmcmFtaW5nIG1lYW5zIGxlZ2FjeSByYXcgYnl0ZXMg4oCUXG4gICAgICAgIC8vIHBpcGUgdGhyb3VnaCB1bmNoYW5nZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBpZGVudGl0eSAob3IgdW5mcmFtaW5nKSB0cmFuc2Zvcm0gdG8gZ2l2ZSB0aGUgdXNlciBhIHJlYWRhYmxlXG4gICAgICAgIGNvbnN0IHsgcmVhZGFibGU6IHVzZXJSZWFkYWJsZSwgd3JpdGFibGUgfSA9XG4gICAgICAgICAgdmFsdWUuZnJhbWluZyA9PT0gJ2ZyYW1lZC12MSdcbiAgICAgICAgICAgID8gZ2V0Qnl0ZVVuZnJhbWluZ1N0cmVhbSgpXG4gICAgICAgICAgICA6IG5ldyBnbG9iYWwuVHJhbnNmb3JtU3RyZWFtKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIGZsdXNoYWJsZVBpcGUocmVhZGFibGUsIHdyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodXNlclJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJSZWFkYWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGNyeXB0b0tleSwgZGVwbG95bWVudElkKSxcbiAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpO1xuICAgICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgdHJhbnNmb3JtLndyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodHJhbnNmb3JtLnJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5yZWFkYWJsZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFdyaXRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFNhbWUtcnVuIGNhc2U6IHRoZSB3cml0YWJsZSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHJ1bi4gVXNlIHRoZVxuICAgICAgLy8gbG9jYWwgY3J5cHRvS2V5IGFuZCB3cml0ZSB0byB0aGUgbG9jYWwgcnVuSWQncyBzZXJ2ZXIgc3RyZWFtLlxuICAgICAgLy9cbiAgICAgIC8vIENyb3NzLXJ1biBjYXNlIChwYXJlbnQg4oaSIGNoaWxkIHZpYSBgc3RhcnQoKWApOiB0aGUgZGVzY3JpcHRvclxuICAgICAgLy8gY2FycmllcyB0aGUgb3JpZ2luYWwgYHJ1bklkYCBhbmQgYG5hbWVgLiBPcGVuIGEgc2VydmVyIHdyaXRhYmxlXG4gICAgICAvLyBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgKHJ1bklkLCBuYW1lKWAgYW5kIHJlc29sdmUgVEhBVCBydW4ncyBrZXlcbiAgICAgIC8vIGZvciBlbmNyeXB0aW9uLiBUaGUgcmVzb2x1dGlvbiBpcyBhc3luYyBidXQgZG9lc24ndCBuZWVkIHRvXG4gICAgICAvLyBibG9jayByZXZpdmVyIHJldHVybiDigJQgYGdldFNlcmlhbGl6ZVN0cmVhbWAgYWNjZXB0cyB0aGVcbiAgICAgIC8vIGBQcm9taXNlPENyeXB0b0tleSB8IHVuZGVmaW5lZD5gIGRpcmVjdGx5IGFuZCBhd2FpdHMgaXQgbGF6aWx5XG4gICAgICAvLyBvbiB0aGUgZmlyc3QgY2h1bmsgd3JpdHRlbi4gVGhlIGtleSBpcyBpbXBvcnRlZCBlbmNyeXB0LW9ubHlcbiAgICAgIC8vIHNvIHRoZSByZWNlaXZpbmcgcnVuIGNhbiBuZXZlciBkZWNyeXB0IGFueXRoaW5nIGVsc2Ugb24gdGhlXG4gICAgICAvLyBvd25pbmcgcnVuJ3Mgc3RyZWFtIOKAlCBpdCBjYW4gb25seSBjb250cmlidXRlIG5ldyB3cml0ZXMuXG4gICAgICBjb25zdCB0YXJnZXRSdW5JZCA9IHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZycgPyB2YWx1ZS5ydW5JZCA6IHJ1bklkO1xuICAgICAgY29uc3QgdGFyZ2V0RGVwbG95bWVudElkID1cbiAgICAgICAgdHlwZW9mIHZhbHVlLmRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlLmRlcGxveW1lbnRJZFxuICAgICAgICAgIDogdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgICA/IGRlcGxveW1lbnRJZFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0YXJnZXRLZXk6IEVuY3J5cHRpb25LZXlQYXJhbSA9XG4gICAgICAgIHRhcmdldFJ1bklkID09PSBydW5JZFxuICAgICAgICAgID8gY3J5cHRvS2V5XG4gICAgICAgICAgOiBnZXRGb3J3YXJkZWRXcml0YWJsZUVuY3J5cHRpb25LZXkodGFyZ2V0UnVuSWQsIHRhcmdldERlcGxveW1lbnRJZCk7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgZ2V0U3RlcFJlZHVjZXJzKGdsb2JhbCwgb3BzLCB0YXJnZXRSdW5JZCwgdGFyZ2V0S2V5KSxcbiAgICAgICAgdGFyZ2V0S2V5XG4gICAgICApO1xuICAgICAgY29uc3Qgc2VydmVyV3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgIHZhbHVlLm5hbWVcbiAgICAgICk7XG5cbiAgICAgIC8vIENyZWF0ZSBmbHVzaGFibGUgc3RhdGUgZm9yIHRoaXMgc3RyZWFtXG4gICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICBmbHVzaGFibGVQaXBlKHNlcmlhbGl6ZS5yZWFkYWJsZSwgc2VydmVyV3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgIHBvbGxXcml0YWJsZUxvY2soc2VyaWFsaXplLndyaXRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgIC8vIFJlY29yZCB0aGUgdW5kZXJseWluZyBgKHJ1bklkLCBuYW1lKWAgc28gZG93bnN0cmVhbSByZWR1Y2VycyBjYW5cbiAgICAgIC8vIHJlY29nbml6ZSB0aGF0IHRoaXMgd3JpdGFibGUgaXMgYWxyZWFkeSBiYWNrZWQgYnkgYSB3b3JrZmxvd1xuICAgICAgLy8gc2VydmVyIHN0cmVhbS4gV2hlbiBmb3J3YXJkZWQgYWNyb3NzIGBzdGFydCgpYCBhZ2FpbiDigJQgZS5nLlxuICAgICAgLy8gdGhlIGNoaWxkIHBhc3NlcyB0aGlzIHdyaXRhYmxlIG9uIHRvIGEgZ3JhbmRjaGlsZCDigJQgdGhlXG4gICAgICAvLyBleHRlcm5hbCByZWR1Y2VyIG5lZWRzIGJvdGggdG8gZW1pdCB0aGUgb3JpZ2luYWwgYHJ1bklkYCBpblxuICAgICAgLy8gdGhlIGRlc2NyaXB0b3IuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fTkFNRV9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgICAgIHZhbHVlOiB0YXJnZXRSdW5JZCxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAodGFyZ2V0RGVwbG95bWVudElkKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogdGFyZ2V0RGVwbG95bWVudElkLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZS53cml0YWJsZTtcbiAgICB9LFxuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHJldml2ZUFib3J0Q29udHJvbGxlcih2YWx1ZSwgb3BzLCBydW5JZCksXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRTaWduYWwodmFsdWUsIG9wcywgcnVuSWQpLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbmNyeXB0aW9uIEhlbHBlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRoZXNlIGRlbGVnYXRlIHRvIHRoZSBtb2R1bGFyIGBlbmNyeXB0YC9gZGVjcnlwdGAgZnJvbSBgLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanNgXG4vLyBidXQgYXJlIGtlcHQgYXMgbmFtZWQgZXhwb3J0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb25zdW1lcnMuXG5cbi8qKlxuICogRW5jcnlwdCBkYXRhIGlmIHRoZSB3b3JsZCBzdXBwb3J0cyBlbmNyeXB0aW9uLlxuICogUmV0dXJucyBvcmlnaW5hbCBkYXRhIGlmIGVuY3J5cHRpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGVuY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF5YmVFbmNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5LFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHJldHVybiAoYXdhaXQgZW5jcnlwdChkYXRhLCBrZXkpKSBhcyBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIERlY3J5cHQgZGF0YSBpZiBpdCBoYXMgdGhlICdlbmNyJyBwcmVmaXguXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBkZWNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2AgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1heWJlRGVjcnlwdChcbiAgZGF0YTogVWludDhBcnJheSB8IHVua25vd24sXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIHJldHVybiBkZWNyeXB0KGRhdGEsIGtleSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERlaHlkcmF0ZSAvIEh5ZHJhdGUgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUaGVzZSBkZWxlZ2F0ZSB0byB0aGUgbW9kdWxhciBtb2RlIG1vZHVsZXMgKHdvcmtmbG93LCBzdGVwLCBjbGllbnQpIHBhc3Npbmdcbi8vIG1vZGUtc3BlY2lmaWMgc3RyZWFtIGFuZCBSZXF1ZXN0L1Jlc3BvbnNlIHJlZHVjZXJzL3Jldml2ZXJzIGFzIGV4dHJhIG9wdGlvbnMuXG4vLyBUaGUgdjFDb21wYXQgcGF0aCBpcyBoYW5kbGVkIGlubGluZSBiZWZvcmUgZGVsZWdhdGluZyB0byB0aGUgbW9kdWxlcy5cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgYHN0YXJ0KClgIGZ1bmN0aW9uIHRvIHNlcmlhbGl6ZSB0aGUgd29ya2Zsb3cgYXJndW1lbnRzXG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBhbmQgdGhlbiBoeWRyYXRlZCBmcm9tXG4gKiB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElEIChyZXF1aXJlZCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0KVxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdjFDb21wYXQgLSBFbmFibGUgbGVnYWN5IHYxIGNvbXBhdGliaWxpdHkgbW9kZVxuICogQHBhcmFtIGZyYW1lZEJ5dGVTdHJlYW1zIC0gV2hldGhlciB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlIHdpcmUtZnJhbWVkXG4gKiAgIGJ5dGUgc3RyZWFtcy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIGNhcGFiaWxpdHkg4oCUIHNlZVxuICogICBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCBpbiBgY2FwYWJpbGl0aWVzLnRzYC4gRGVmYXVsdHMgdG8gYGZhbHNlYCBmb3JcbiAqICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW5zLlxuICogQHJldHVybnMgVGhlIGRlaHlkcmF0ZWQgdmFsdWUgYXMgYmluYXJ5IGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgdjFDb21wYXQgPSBmYWxzZSxcbiAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZSxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGZyYW1lZEJ5dGVTdHJlYW1zKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBmcmFtZWRCeXRlU3RyZWFtcylcbiAgICAgICksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IGFyZ3VtZW50cycsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50IHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93XG4gKiBhcmd1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgaW5mbGF0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IG1heWJlRGVjcnlwdCh2YWx1ZSwga2V5KSxcbiAgICBjb21wcmVzc2lvblN0YXRzXG4gICk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4gd29ya2Zsb3dNb2R1bGUuZGVzZXJpYWxpemUoaW5mbGF0ZWQsIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKGdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIERlaHlkcmF0ZSB3b3JrZmxvdyByZXR1cm4gdmFsdWUgZm9yIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgJ3dvcmtmbG93IHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIHRvIGh5ZHJhdGUgdGhlIHdvcmtmbG93IHJldHVybiB2YWx1ZVxuICogb2YgYSBjb21wbGV0ZWQgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIG9wczogUHJvbWlzZTx2b2lkPltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50TW9kdWxlLmRlc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICAgICAgICBnZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KVxuICAgICAgKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgICBjb21wcmVzc2lvblN0YXRzLFxuICB9KTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiBhIHN0ZXAgaXMgYmVpbmcgY3JlYXRlZC5cbiAqIERlaHlkcmF0ZXMgdmFsdWVzIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5zZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgICAgZ2xvYmFsLFxuICAgICAgZXh0cmFSZWR1Y2VyczogZ2V0U3RyZWFtQW5kUmVxdWVzdFJlZHVjZXJzKGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSksXG4gICAgICBjb21wcmVzc2lvbixcbiAgICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gICAgfSk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGFyZ3VtZW50cycsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBoYW5kbGVyIHRvIGh5ZHJhdGUgdGhlIGFyZ3VtZW50cyBvZiBhIHN0ZXBcbiAqIGZyb20gdGhlIGRhdGFiYXNlIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RlcCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9LFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RlcE1vZHVsZS5kZXNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5LCBkZXBsb3ltZW50SWQpXG4gICAgICApLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gIH0pO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgc3RlcCBoYW5kbGVyIHdoZW4gYSBzdGVwIGhhcyBjb21wbGV0ZWQuXG4gKiBEZWh5ZHJhdGVzIHZhbHVlcyBmcm9tIHdpdGhpbiB0aGUgc3RlcCBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB2MUNvbXBhdCAtIEVuYWJsZSBsZWdhY3kgdjEgY29tcGF0aWJpbGl0eSBtb2RlXG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWRcbiAqICAgYnl0ZSBzdHJlYW1zLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0eSDigJQgc2VlXG4gKiAgIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvclxuICogICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBvcmRlciB0aGUgZmlyc3QgY2h1bmsgb2YgYSByZXR1cm5lZCBzdHJlYW0gYWZ0ZXJcbiAgLy8gdGhlIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWRlZCBpbnRvIHRoZSBzdGVwIHJlZHVjZXJzJyBzdHJlYW1cbiAgLy8gc2luay4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAodjFDb21wYXQpIHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoXG4gICAgICB2YWx1ZSxcbiAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBrZXksXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnc3RlcCByZXR1cm4gdmFsdWUnLFxuICAgICAgY2F1c2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBzdGVwIGhhbmRsZXIgd2hlbiBhIHN0ZXAgdGhyb3dzLiBEZWh5ZHJhdGVzIHRoZSB0aHJvd25cbiAqIHZhbHVlIGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuXG4gKiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgc3RlcF9mYWlsZWRgIG9yIGBzdGVwX3JldHJ5aW5nYCBldmVudC5cbiAqXG4gKiBBbnkgSmF2YVNjcmlwdCB2YWx1ZSBjYW4gYmUgdGhyb3duIChzdHJpbmdzLCBudW1iZXJzLCBvYmplY3RzLCBFcnJvcnMsXG4gKiBFcnJvciBzdWJjbGFzc2VzKSwgc28gdGhlIHNhbWUgc2VyaWFsaXphdGlvbiBwaXBlbGluZSB1c2VkIGZvciBzdGVwXG4gKiBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgaXMgYXBwbGllZCBoZXJlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB0aHJvd24gdmFsdWUgdG8gc2VyaWFsaXplIChjYW4gYmUgYW55IHR5cGUpXG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGVuY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHBhcmFtIG9wcyAtIFByb21pc2UgYXJyYXkgZm9yIHN0cmVhbSBvcGVyYXRpb25zXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFN0ZXBSZWR1Y2VycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSkpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmcg4oCUIGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGNvbXByZXNzKFxuICAgICAgc2VyaWFsaXplZCxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgIGNvbXByZXNzZWQgYXMgVWludDhBcnJheSxcbiAgICAgIGtleVxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdzdGVwIGVycm9yJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgb2YgYVxuICogYHN0ZXBfZmFpbGVkYCBvciBgc3RlcF9yZXRyeWluZ2AgZXZlbnQuIEh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbVxuICogdGhlIGRhdGFiYXNlIHNvIHRoZSB3b3JrZmxvdyBjYW4gc2VlIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHJldHVybnMgVGhlIGh5ZHJhdGVkIHRocm93biB2YWx1ZSwgcmVhZHkgdG8gcmVqZWN0IHRoZSBzdGVwIHByb21pc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwRXJyb3IoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IG1heWJlRGVjcnlwdCh2YWx1ZSwga2V5KSxcbiAgICBjb21wcmVzc2lvblN0YXRzXG4gICk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuXG4gIGlmICghKGRlY3J5cHRlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgLy8gVHJlYXRlZCBhcyBhIGRldmFsdWUgXCJmbGF0dGVuZWRcIiBhcnJheS4gSW4gcHJvZHVjdGlvbiB0aGlzIGJyYW5jaCBpc1xuICAgIC8vIGV4ZXJjaXNlZCBieSBsZWdhY3kgY29kZSBwYXRocyB0aGF0IGJ5cGFzc2VkIGBkZWh5ZHJhdGVTdGVwRXJyb3JgOyB0aGVcbiAgICAvLyBTREsgdmVyc2lvbiBpcyBwaW5uZWQgcGVyIHdvcmtmbG93IHJ1biB2aWEgc2tldyBwcm90ZWN0aW9uLCBzbyBhXG4gICAgLy8gY3VycmVudC12ZXJzaW9uIHByb2R1Y2VyIGFsd2F5cyBlbWl0cyBhIFVpbnQ4QXJyYXkgaGVyZS4gSWYgYVxuICAgIC8vIG1pc3NoYXBlbiB2YWx1ZSByZWFjaGVzIHVzLCBgdW5mbGF0dGVuYCB0aHJvd3Mg4oCUIHRoYXQncyBpbnRlbnRpb25hbDpcbiAgICAvLyB0aGUgaGlnaGVyLWxldmVsIGh5ZHJhdGlvbiBoZWxwZXJzIChgaHlkcmF0ZVN0ZXBJT2AsXG4gICAgLy8gYGh5ZHJhdGVSZXNvdXJjZUlPYCkgYWxyZWFkeSB3cmFwIHVzIGluIGEgdHJ5L2NhdGNoIHRoYXQgbGVhdmVzIHRoZVxuICAgIC8vIGZpZWxkIHVuLWh5ZHJhdGVkIGZvciBvMTF5IGRpc3BsYXksIGFuZCBzdXJmYWNpbmcgdGhlIHRocm93IHRvIGxvZ3NcbiAgICAvLyBpcyBtb3JlIGRlYnVnZ2FibGUgdGhhbiBzaWxlbnRseSBtYXNraW5nIHRoZSB1bnN1cHBvcnRlZCBzaGFwZS5cbiAgICByZXR1cm4gdW5mbGF0dGVuKGRlY3J5cHRlZCBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKTtcblxuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwge1xuICAgICAgLi4uZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gdGhlIHdvcmtmbG93IGl0c2VsZiB0aHJvd3MuXG4gKiBEZWh5ZHJhdGVzIHRoZSB0aHJvd24gdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UgaW4gYSBgcnVuX2ZhaWxlZGAgZXZlbnQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRocm93biB2YWx1ZSB0byBzZXJpYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3Igc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgdmFsdWU6IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgY29tcHJlc3Npb24gPSBmYWxzZVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmcg4oCUIGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGNvbXByZXNzKFxuICAgICAgc2VyaWFsaXplZCxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgIGNvbXByZXNzZWQgYXMgVWludDhBcnJheSxcbiAgICAgIGtleVxuICAgICkpIGFzIFVpbnQ4QXJyYXk7XG4gICAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ3NlcmlhbGl6ZScpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgY2F1c2UgPSB1bndyYXBTZXJpYWxpemF0aW9uQ2F1c2UoZXJyb3IpO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKCdydW4gZXJyb3InLCBjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIChvciBvYnNlcnZhYmlsaXR5IHRvb2xzKSB0byBoeWRyYXRlIHRoZSBydW5cbiAqIGVycm9yIHZhbHVlIG9mIGEgZmFpbGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBCaW5hcnkgc2VyaWFsaXplZCBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZGVjcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIEByZXR1cm5zIFRoZSBoeWRyYXRlZCB0aHJvd24gdmFsdWUsIHJlYWR5IHRvIGJlIGNvbnN1bWVkIGJ5IHRoZSBjbGllbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVSdW5FcnJvcihcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBtYXliZURlY3J5cHQodmFsdWUsIGtleSksXG4gICAgY29tcHJlc3Npb25TdGF0c1xuICApO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcblxuICBpZiAoIShkZWNyeXB0ZWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIC8vIFNlZSB0aGUgbWF0Y2hpbmcgbm90ZSBpbiBgaHlkcmF0ZVN0ZXBFcnJvcmA6IHRoaXMgYnJhbmNoIGlzIGZvclxuICAgIC8vIGRldmFsdWUgZmxhdHRlbmVkIGFycmF5cyBmcm9tIGxlZ2FjeSBjYWxsZXJzOyBjdXJyZW50IFNESyB2ZXJzaW9uc1xuICAgIC8vIGFsd2F5cyBlbWl0IGEgVWludDhBcnJheSwgYW5kIGEgbWlzc2hhcGVuIHZhbHVlIGhlcmUgaW50ZW50aW9uYWxseVxuICAgIC8vIHRocm93cyB2aWEgYHVuZmxhdHRlbmAgc28gdGhlIHN1cnJvdW5kaW5nIHRyeS9jYXRjaCBpbiBvMTF5IGhlbHBlcnNcbiAgICAvLyBzdXJmYWNlcyB0aGUgaXNzdWUgcmF0aGVyIHRoYW4gbWFza2luZyBpdC5cbiAgICByZXR1cm4gdW5mbGF0dGVuKGRlY3J5cHRlZCBhcyBhbnlbXSwge1xuICAgICAgLi4uZ2V0RXh0ZXJuYWxSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCB7XG4gICAgICAuLi5nZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIHJlcGxheWluZyB0aGUgZXZlbnQgbG9nIG9mIGEgYHN0ZXBfY29tcGxldGVkYCBldmVudC5cbiAqIEh5ZHJhdGVzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdGVwIGZyb20gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBkZXNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIGV4dHJhUmV2aXZlcnMgLSBBZGRpdGlvbmFsIHJldml2ZXJzIGZvciBjdXN0b20gdHlwZXNcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2dcbiAqIG9mIGEgYHN0ZXBfY29tcGxldGVkYCBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gIHZhbHVlOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPGFueT4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IGluZmxhdGVkID0gYXdhaXQgZGVjb21wcmVzcyhcbiAgICBhd2FpdCBtYXliZURlY3J5cHQodmFsdWUsIGtleSksXG4gICAgY29tcHJlc3Npb25TdGF0c1xuICApO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHdvcmtmbG93TW9kdWxlLmRlc2VyaWFsaXplKGluZmxhdGVkLCB7XG4gICAgZ2xvYmFsLFxuICAgIGV4dHJhUmV2aXZlcnM6IHtcbiAgICAgIC4uLmdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhnZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCkpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICB9KTtcbn1cblxuLy8gLS0tLSBIZWxwZXJzIHRvIGV4dHJhY3Qgc3RyZWFtL1JlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMgYW5kIHJldml2ZXJzIC0tLS1cbi8vIFRoZSBtb2RlLXNwZWNpZmljIGdldCpSZWR1Y2Vycy9nZXQqUmV2aXZlcnMgZnVuY3Rpb25zIHJldHVybiBvYmplY3RzIHRoYXRcbi8vIGluY2x1ZGUgYm90aCBcImNvbW1vblwiIGVudHJpZXMgKERhdGUsIEVycm9yLCBNYXAsIGV0Yy4pIGFuZCBtb2RlLXNwZWNpZmljXG4vLyBlbnRyaWVzIChSZWFkYWJsZVN0cmVhbSwgV3JpdGFibGVTdHJlYW0sIFJlcXVlc3QsIFJlc3BvbnNlLCBTdGVwRnVuY3Rpb24pLlxuLy8gVGhlIGNvbW1vbiBlbnRyaWVzIGFyZSBhbHJlYWR5IGNvbXBvc2VkIGJ5IHRoZSBjb2RlYy4gV2Ugb25seSBuZWVkIHRvXG4vLyBwYXNzIHRocm91Z2ggdGhlIG1vZGUtc3BlY2lmaWMgZW50cmllcyBhcyBleHRyYVJlZHVjZXJzL2V4dHJhUmV2aXZlcnMuXG5cbmNvbnN0IFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTID0gW1xuICAnUmVhZGFibGVTdHJlYW0nLFxuICAnV3JpdGFibGVTdHJlYW0nLFxuICAnUmVxdWVzdCcsXG4gICdSZXNwb25zZScsXG4gICdTdGVwRnVuY3Rpb24nLFxuICAvLyBXaXJlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCB0aHJvdWdoIHRoZSBjbGllbnQgc2VyaWFsaXphdGlvbiBwYXRoIHNvXG4gIC8vIHNpZ25hbHMgcmVhY2hhYmxlIHZpYSBSZXF1ZXN0LnNpZ25hbCAob3IgYXMgZGlyZWN0IGFyZ3VtZW50cykgZ2V0IHRoZWlyXG4gIC8vIGRlZGljYXRlZCByZWR1Y2VyLiBXaXRob3V0IHRoaXMsIGRldmFsdWUgZmFsbHMgYmFjayB0byBpdHMgYXJiaXRyYXJ5LVBPSk9cbiAgLy8gcGF0aCBhbmQgZmFpbHMgZm9yIGFueSBzaWduYWwgdGhlIFJlcXVlc3QgcmVkdWNlciBmb3J3YXJkcy5cbiAgJ0Fib3J0Q29udHJvbGxlcicsXG4gICdBYm9ydFNpZ25hbCcsXG5dIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gIGFsbFJlZHVjZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiB7XG4gIGNvbnN0IGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBTVFJFQU1fQU5EX1JFUVVFU1RfS0VZUykge1xuICAgIGlmIChrZXkgaW4gYWxsUmVkdWNlcnMpIHtcbiAgICAgIGV4dHJhW2tleV0gPSBhbGxSZWR1Y2Vyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUFuZFJlcXVlc3RSZXZpdmVycyhcbiAgYWxsUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTKSB7XG4gICAgaWYgKGtleSBpbiBhbGxSZXZpdmVycykge1xuICAgICAgZXh0cmFba2V5XSA9IGFsbFJldml2ZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cbiJdfQ==
2413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxPQUFPLElBQUksYUFBYSxFQUN4QixPQUFPLElBQUksYUFBYSxFQUV4QixTQUFTLEdBQ1YsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQywyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHlDQUF5QztBQUN6Qyw0REFBNEQ7QUFDNUQsc0VBQXNFO0FBQ3RFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFlBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBRUwsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxPQUFPLEVBRVAsT0FBTyxFQUNQLG9CQUFvQixHQUNyQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIscUJBQXFCLEdBQ3RCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUNMLGtCQUFr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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IGVudk51bWJlciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBwYXJzZSwgc3RyaW5naWZ5LCB1bmZsYXR0ZW4gfSBmcm9tICdkZXZhbHVlJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7XG4gIGRlY3J5cHQgYXMgYWVzR2NtRGVjcnlwdCxcbiAgZW5jcnlwdCBhcyBhZXNHY21FbmNyeXB0LFxuICB0eXBlIENyeXB0b0tleSxcbiAgaW1wb3J0S2V5LFxufSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmx1c2hhYmxlU3RhdGUsXG4gIGZsdXNoYWJsZVBpcGUsXG4gIHBvbGxSZWFkYWJsZUxvY2ssXG4gIHBvbGxXcml0YWJsZUxvY2ssXG59IGZyb20gJy4vZmx1c2hhYmxlLXN0cmVhbS5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuL3ByaXZhdGUuanMnO1xuLy8gVjI6IHVzZSBnZXRXb3JsZExhenkgaW4gc3RlcC1zaWRlIGNvZGUgcGF0aHMgc28gVHVyYm9wYWNrIGNhbiBzdGF0aWNhbGx5XG4vLyByZXNvbHZlIHRoZSB3b3JsZCBicmlkZ2UgZnJvbSB0aGUgc3RlcCBidW5kbGUgd2l0aG91dCBkcmFnZ2luZyB0aGUgZnVsbFxuLy8gaG9zdCB3b3JsZCBtb2R1bGUgaW50byB0aGUgZmxvdyByb3V0ZS5cbi8vIFNlZSBgcGFja2FnZXMvY29yZS9zcmMvcnVudGltZS9nZXQtd29ybGQtbGF6eS50c2AgYW5kIHRoZVxuLy8gXCJUdXJib3BhY2sgTkZUIFRyYWNpbmcgRXJyb3JzIGluIFYyIENvbWJpbmVkIEZsb3cgUm91dGVcIiBzZWN0aW9uIG9mXG4vLyBgZG9jcy9jb250ZW50L2RvY3MvY2hhbmdlbG9nL2VhZ2VyLXByb2Nlc3NpbmcubWR4YC5cbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vcnVudGltZS9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQgKiBhcyBjbGllbnRNb2R1bGUgZnJvbSAnLi9zZXJpYWxpemF0aW9uL2NsaWVudC5qcyc7XG5pbXBvcnQge1xuICB0eXBlIENvbXByZXNzaW9uU3RhdHMsXG4gIGNvbXByZXNzLFxuICBkZWNvbXByZXNzLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY29tcHJlc3Npb24uanMnO1xuaW1wb3J0IHtcbiAgZGVjcnlwdCxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGVuY3J5cHQsXG4gIHJlc29sdmVFbmNyeXB0aW9uS2V5LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IsXG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBwZWVrRm9ybWF0UHJlZml4LFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZm9ybWF0LmpzJztcbmltcG9ydCB7XG4gIGdldENsYXNzUmVkdWNlcnMsXG4gIGdldENsYXNzUmV2aXZlcnMsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9yZWR1Y2Vycy9jbGFzcy5qcyc7XG5pbXBvcnQge1xuICBnZXRDb21tb25SZWR1Y2VycyxcbiAgZ2V0Q29tbW9uUmV2aXZlcnMgYXMgZ2V0Q29tbW9uUmV2aXZlcnNGcm9tTW9kdWxlLFxuICByZXZpdmUsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9yZWR1Y2Vycy9jb21tb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcixcbiAgZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcixcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL3N0ZXAtZnVuY3Rpb24uanMnO1xuaW1wb3J0ICogYXMgc3RlcE1vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vc3RlcC5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEZvcm1hdFByZWZpeCxcbiAgaXNGb3JtYXRQcmVmaXgsXG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgKiBhcyB3b3JrZmxvd01vZHVsZSBmcm9tICcuL3NlcmlhbGl6YXRpb24vd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCB7XG4gIEFCT1JUX0hPT0tfVE9LRU4sXG4gIEFCT1JUX0xJU1RFTkVSX0FUVEFDSEVELFxuICBBQk9SVF9SRUFERVJfQ0FOQ0VMLFxuICBBQk9SVF9TVFJFQU1fTkFNRSxcbiAgQk9EWV9JTklUX1NZTUJPTCxcbiAgU1RBQkxFX1VMSUQsXG4gIFNUUkVBTV9GUkFNSU5HX1NZTUJPTCxcbiAgU1RSRUFNX05BTUVfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsXG4gIFNUUkVBTV9UWVBFX1NZTUJPTCxcbiAgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSxcbn0gZnJvbSAnLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHIgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlU3BhbiwgZ2V0U3BhbktpbmQsIHJlY29yZEVsYXBzZWRTcGFuIH0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0QWJvcnRTdHJlYW1JZCB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0Fib3J0U2lnbmFsIH0gZnJvbSAnLi93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLmpzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGFuZCB1dGlsaXRpZXMgZnJvbSB0aGUgbW9kdWxhciBzZXJpYWxpemF0aW9uIG1vZHVsZXNcbi8vIHNvIGV4aXN0aW5nIGNvbnN1bWVycyBvZiBgQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbmAga2VlcCB3b3JraW5nLlxuZXhwb3J0IHtcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgdHlwZSBGb3JtYXRQcmVmaXgsXG4gIGlzRm9ybWF0UHJlZml4LFxuICBlbmNvZGVXaXRoRm9ybWF0UHJlZml4LFxuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIHBlZWtGb3JtYXRQcmVmaXgsXG4gIGlzRW5jcnlwdGVkLFxuICBlbmNyeXB0LFxuICBkZWNyeXB0LFxuICBjb21wcmVzcyxcbiAgZGVjb21wcmVzcyxcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG59O1xuXG4vLyBSZS1leHBvcnQgdGhlIGxlZ2FjeSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4vLyBOZXcgY29kZSBzaG91bGQgdXNlIEZvcm1hdFByZWZpeCBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnLlxuZXhwb3J0IHR5cGUgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUgPVxuICAodHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXQpW2tleW9mIHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0XTtcblxuLyoqXG4gKiBEZWZhdWx0IFVMSUQgZ2VuZXJhdG9yIGZvciBjb250ZXh0cyB3aGVyZSBWTSdzIHNlZWRlZCBgc3RhYmxlVWxpZGAgaXNuJ3QgYXZhaWxhYmxlLlxuICogVXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gc2VyaWFsaXppbmcgc3RyZWFtcyBvdXRzaWRlIHRoZSB3b3JrZmxvdyBWTSBjb250ZXh0XG4gKiAoZS5nLiwgd2hlbiBzdGFydGluZyBhIHdvcmtmbG93IG9yIGhhbmRsaW5nIHN0ZXAgcmV0dXJuIHZhbHVlcykuXG4gKi9cbmNvbnN0IGRlZmF1bHRVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIERldGVjdCBpZiBhIHJlYWRhYmxlIHN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSBzdHJlYW1cbiAqIEByZXR1cm5zIGBcImJ5dGVzXCJgIGlmIHRoZSBzdHJlYW0gaXMgYSBieXRlIHN0cmVhbSwgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJlYW1UeXBlKHN0cmVhbTogUmVhZGFibGVTdHJlYW0pOiAnYnl0ZXMnIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKHsgbW9kZTogJ2J5b2InIH0pO1xuICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgIHJldHVybiAnYnl0ZXMnO1xuICB9IGNhdGNoIHt9XG59XG5cbi8qKlxuICogRnJhbWUgZm9ybWF0IGZvciBzdHJlYW0gY2h1bmtzOlxuICogICBbNC1ieXRlIGJpZy1lbmRpYW4gbGVuZ3RoXVtmb3JtYXQtcHJlZml4ZWQgcGF5bG9hZF1cbiAqXG4gKiBFYWNoIGNodW5rIGlzIGluZGVwZW5kZW50bHkgZnJhbWVkIHNvIHRoZSBkZXNlcmlhbGl6ZXIgY2FuIGZpbmRcbiAqIGNodW5rIGJvdW5kYXJpZXMgZXZlbiB3aGVuIG11bHRpcGxlIGNodW5rcyBhcmUgY29uY2F0ZW5hdGVkIG9yXG4gKiBzcGxpdCBhY3Jvc3MgdHJhbnNwb3J0IHJlYWRzLlxuICovXG5jb25zdCBGUkFNRV9IRUFERVJfU0laRSA9IDQ7XG5cbi8qKlxuICogVGhlIG1vZGUtc3BlY2lmaWMgc2VyaWFsaXplcnMgKGAuL3NlcmlhbGl6YXRpb24ve2NsaWVudCxzdGVwLHdvcmtmbG93fS50c2ApXG4gKiBhbHJlYWR5IHRocm93IGEgYFNlcmlhbGl6YXRpb25FcnJvcmAgd2hvc2UgYC5jYXVzZWAgaXMgdGhlIHVuZGVybHlpbmdcbiAqIGRldmFsdWUgLyBzZXJkZSBmYWlsdXJlLiBUaGUgb3V0ZXIgZGVoeWRyYXRlL2h5ZHJhdGUgd3JhcHBlcnMgd2FudCB0b1xuICogcmUtZnJhbWUgdGhhdCBlcnJvciB3aXRoIGEgbW9yZSBzcGVjaWZpYyBjb250ZXh0IGxhYmVsIChlLmcuIFwid29ya2Zsb3dcbiAqIGFyZ3VtZW50c1wiIGluc3RlYWQgb2YgZ2VuZXJpYyBcIndvcmtmbG93IHZhbHVlXCIpLCBzbyB0aGV5IHVud3JhcCB0aGVcbiAqIGlubmVyIFNlcmlhbGl6YXRpb25FcnJvciBhbmQgcmVmb3JtYXQgd2l0aCB0aGUgb3JpZ2luYWwgY2F1c2UuIEVycm9yc1xuICogdGhhdCBhcmVuJ3QgYWxyZWFkeSBTZXJpYWxpemF0aW9uRXJyb3IgZmxvdyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAqXG4gKiBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgaXMgYW4gZXhjZXB0aW9uOiBpdCBtdXN0IGtlZXAgaXRzIGlkZW50aXR5IChhbmRcbiAqIGBjb250ZXh0YCkgc28gdGhlIHJ1bi1mYWlsdXJlIGNsYXNzaWZpZXIgcm91dGVzIGl0IHRvIGBSVU5USU1FX0VSUk9SYCxcbiAqIHNvIHRoaXMgcmV0aHJvd3MgaXQgdW5jaGFuZ2VkIGJlZm9yZSBhbnkgdW53cmFwcGluZy4gTm90ZSB0aGlzIGd1YXJkXG4gKiBtdXN0IHJ1biBiZWZvcmUgdGhlIGdlbmVyaWMgYFdvcmtmbG93UnVudGltZUVycm9yYCB1bndyYXAgYmVsb3csIHNpbmNlXG4gKiBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgZXh0ZW5kcyBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIGFuZCBjYXJyaWVzIGFcbiAqIGBjYXVzZWAgKHRoZSB1bmRlcmx5aW5nIERPTUV4Y2VwdGlvbikgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgdW53cmFwcGVkXG4gKiBhbmQgcmVmcmFtZWQgYXMgYSBgU2VyaWFsaXphdGlvbkVycm9yYC5cbiAqL1xuZnVuY3Rpb24gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldGhyb3dJZlJ1bnRpbWVFcnJvcihlcnJvcik7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlcmlhbGl6YXRpb25FcnJvciAmJiBlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVycm9yLmNhdXNlO1xuICB9XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtmbG93UnVudGltZUVycm9yICYmIGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2U7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG4vKipcbiAqIEVtaXQgY29tcHJlc3Npb24gdGVsZW1ldHJ5IG9udG8gdGhlIGFjdGl2ZSBzcGFuIGFmdGVyIGEgKGRlKXNlcmlhbGl6ZS5cbiAqXG4gKiBUaGUgY29tcHJlc3Npb24gbGF5ZXIgcG9wdWxhdGVzIGBzdGF0c2Agb25seSB3aGVuIGl0IGFjdHVhbGx5IHJhbiAoYmluYXJ5XG4gKiBkYXRhIG9uIGEgc3BlYyA+PSA1IHBhdGgpOyBsZWdhY3kgLyB2MUNvbXBhdCBwYXRocyBsZWF2ZSBpdCB1bnJlY29yZGVkLCBzb1xuICogdGhpcyBuby1vcHMgZm9yIHRoZW0gYW5kIGF2b2lkcyB0aGUgYGdldEFjdGl2ZVNwYW5gIGxvb2t1cC4gQXR0cmlidXRlcyBsYW5kXG4gKiBvbiB3aGF0ZXZlciBzcGFuIGlzIGFjdGl2ZSDigJQgdHlwaWNhbGx5IHRoZSBkZWRpY2F0ZWQgYHN0ZXAuZGVoeWRyYXRlYCAvXG4gKiBgc3RlcC5oeWRyYXRlYCBzcGFuLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBydW4vc3RhcnQgc3Bhbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkQ29tcHJlc3Npb24oXG4gIHN0YXRzOiBDb21wcmVzc2lvblN0YXRzLFxuICBvcGVyYXRpb246ICdzZXJpYWxpemUnIHwgJ2Rlc2VyaWFsaXplJ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghc3RhdHMucmVjb3JkZWQpIHJldHVybjtcbiAgLy8gVGVsZW1ldHJ5IG11c3QgbmV2ZXIgYnJlYWsgdGhlIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBkYXRhIHBhdGgg4oCUIGFcbiAgLy8gbWlzc2luZy9mYWlsaW5nIHRyYWNlciBpcyBwdXJlbHkgYW4gb2JzZXJ2YWJpbGl0eSBsb3NzLlxuICB0cnkge1xuICAgIGNvbnN0IHNwYW4gPSBhd2FpdCBnZXRBY3RpdmVTcGFuKCk7XG4gICAgaWYgKCFzcGFuKSByZXR1cm47XG4gICAgY29uc3QgdW5jb21wcmVzc2VkQnl0ZXMgPSBzdGF0cy51bmNvbXByZXNzZWRCeXRlcyA/PyAwO1xuICAgIGNvbnN0IHN0b3JlZEJ5dGVzID0gc3RhdHMuc3RvcmVkQnl0ZXMgPz8gMDtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uT3BlcmF0aW9uKG9wZXJhdGlvbiksXG4gICAgICAuLi5BdHRyLlNlcmlhbGl6YXRpb25Db21wcmVzc2VkKHN0YXRzLmNvbXByZXNzZWQgPz8gZmFsc2UpLFxuICAgICAgLi4uQXR0ci5TZXJpYWxpemF0aW9uQ29kZWMoc3RhdHMuY29kZWMgPz8gJ25vbmUnKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvblVuY29tcHJlc3NlZEJ5dGVzKHVuY29tcHJlc3NlZEJ5dGVzKSxcbiAgICAgIC4uLkF0dHIuU2VyaWFsaXphdGlvblN0b3JlZEJ5dGVzKHN0b3JlZEJ5dGVzKSxcbiAgICAgIC4uLihzdGF0cy5jb21wcmVzc2VkICYmIHVuY29tcHJlc3NlZEJ5dGVzID4gMFxuICAgICAgICA/IEF0dHIuU2VyaWFsaXphdGlvbkNvbXByZXNzaW9uUmF0aW8oXG4gICAgICAgICAgICAxIC0gc3RvcmVkQnl0ZXMgLyB1bmNvbXByZXNzZWRCeXRlc1xuICAgICAgICAgIClcbiAgICAgICAgOiB7fSksXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSB0ZWxlbWV0cnkgZmFpbHVyZXNcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICByZWR1Y2VyczogUGFydGlhbDxSZWR1Y2Vycz4sXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBUcmFuc2Zvcm1TdHJlYW08YW55LCBVaW50OEFycmF5PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgLy8gUmVzb2x2ZSB0aGUga2V5IGlucHV0IG9uY2Ugb24gZmlyc3QgdXNlIGFuZCBjYWNoZSB0aGUgcmVzdWx0LlxuICAvLyBOb3RlOiBpZiByZXNvbHZpbmcgY3J5cHRvS2V5IHJlamVjdHMgKGUuZy4sIG5ldHdvcmsgZXJyb3IgZmV0Y2hpbmdcbiAgLy8gdGhlIGRlcml2ZWQga2V5KSwgdGhlIHJlamVjdGlvbiB3b24ndCBzdXJmYWNlIHVudGlsIHRoZSBmaXJzdCBjaHVua1xuICAvLyBpcyBwcm9jZXNzZWQg4oCUIG5vdCBhdCBzdHJlYW0gY29uc3RydWN0aW9uIHRpbWUuXG4gIGNvbnN0IGtleVN0YXRlID0geyByZXNvbHZlZDogZmFsc2UsIGtleTogdW5kZWZpbmVkIGFzIENyeXB0b0tleSB8IHVuZGVmaW5lZCB9O1xuICBjb25zdCBzdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPGFueSwgVWludDhBcnJheT4oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFrZXlTdGF0ZS5yZXNvbHZlZCkge1xuICAgICAgICAgIGtleVN0YXRlLmtleSA9IGF3YWl0IHJlc29sdmVFbmNyeXB0aW9uS2V5KGNyeXB0b0tleSk7XG4gICAgICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzdHJpbmdpZnkoY2h1bmssIHJlZHVjZXJzKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKHNlcmlhbGl6ZWQpO1xuICAgICAgICBsZXQgcHJlZml4ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICkgYXMgVWludDhBcnJheTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBmcmFtZSBwYXlsb2FkIGlmIGEga2V5IGlzIHByb3ZpZGVkLlxuICAgICAgICAvLyBUaGUgbGVuZ3RoIGhlYWRlciByZW1haW5zIGluIHRoZSBjbGVhciBzbyB0aGUgZGVzZXJpYWxpemVyIGNhblxuICAgICAgICAvLyBmaW5kIGZyYW1lIGJvdW5kYXJpZXMgcmVnYXJkbGVzcyBvZiB0cmFuc3BvcnQgY2h1bmtpbmcuXG4gICAgICAgIGlmIChrZXlTdGF0ZS5rZXkpIHtcbiAgICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBhZXNHY21FbmNyeXB0KGtleVN0YXRlLmtleSwgcHJlZml4ZWQpO1xuICAgICAgICAgIHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVELFxuICAgICAgICAgICAgZW5jcnlwdGVkXG4gICAgICAgICAgKSBhcyBVaW50OEFycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgbGVuZ3RoLXByZWZpeGVkIGZyYW1lOiBbNC1ieXRlIGxlbmd0aF1bcHJlZml4ZWQgZGF0YV1cbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgVWludDhBcnJheShGUkFNRV9IRUFERVJfU0laRSArIHByZWZpeGVkLmxlbmd0aCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhmcmFtZS5idWZmZXIpLnNldFVpbnQzMigwLCBwcmVmaXhlZC5sZW5ndGgsIGZhbHNlKTtcbiAgICAgICAgZnJhbWUuc2V0KHByZWZpeGVkLCBGUkFNRV9IRUFERVJfU0laRSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShmcmFtZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFbmNyeXB0aW9uIGZhaWx1cmVzIG11c3Qga2VlcCB0aGVpciBSdW50aW1lRGVjcnlwdGlvbkVycm9yXG4gICAgICAgIC8vIGlkZW50aXR5IChSVU5USU1FX0VSUk9SKSByYXRoZXIgdGhhbiBiZSByZWZyYW1lZCBhcyBhXG4gICAgICAgIC8vIFNlcmlhbGl6YXRpb25FcnJvciAoVVNFUl9FUlJPUikuXG4gICAgICAgIGlmIChSdW50aW1lRGVjcnlwdGlvbkVycm9yLmlzKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAnc3RyZWFtIGNodW5rJyxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZTogZXJyb3IgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICByZXZpdmVyczogUGFydGlhbDxSZXZpdmVycz4sXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgYW55PiB7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHQuXG4gIGNvbnN0IGtleVN0YXRlID0geyByZXNvbHZlZDogZmFsc2UsIGtleTogdW5kZWZpbmVkIGFzIENyeXB0b0tleSB8IHVuZGVmaW5lZCB9O1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBuZXdCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpO1xuICAgIG5ld0J1ZmZlci5zZXQoYnVmZmVyLCAwKTtcbiAgICBuZXdCdWZmZXIuc2V0KGRhdGEsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGcmFtZXMoXG4gICAgY29udHJvbGxlcjogVHJhbnNmb3JtU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI8YW55PlxuICApIHtcbiAgICAvLyBSZXNvbHZlIHRoZSBrZXkgaW5wdXQgb25jZSBvbiBmaXJzdCB1c2UgYW5kIGNhY2hlIHRoZSByZXN1bHRcbiAgICBpZiAoIWtleVN0YXRlLnJlc29sdmVkKSB7XG4gICAgICBrZXlTdGF0ZS5rZXkgPSBhd2FpdCByZXNvbHZlRW5jcnlwdGlvbktleShjcnlwdG9LZXkpO1xuICAgICAga2V5U3RhdGUucmVzb2x2ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBleHRyYWN0IGNvbXBsZXRlIGxlbmd0aC1wcmVmaXhlZCBmcmFtZXNcbiAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgIGJ1ZmZlci5idWZmZXIsXG4gICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7IC8vIEluY29tcGxldGUgZnJhbWUsIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmcmFtZURhdGEgPSBidWZmZXIuc2xpY2UoXG4gICAgICAgIEZSQU1FX0hFQURFUl9TSVpFLFxuICAgICAgICBGUkFNRV9IRUFERVJfU0laRSArIGZyYW1lTGVuZ3RoXG4gICAgICApO1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGgpO1xuXG4gICAgICBsZXQgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChmcmFtZURhdGEpO1xuXG4gICAgICAvLyBJZiB0aGUgZnJhbWUgcGF5bG9hZCBpcyBlbmNyeXB0ZWQsIGRlY3J5cHQgaXQgZmlyc3QgdG8gcmV2ZWFsXG4gICAgICAvLyB0aGUgaW5uZXIgZm9ybWF0LXByZWZpeGVkIGRhdGEgKGUuZy4sICdkZXZsJyArIHNlcmlhbGl6ZWQgdGV4dCksXG4gICAgICAvLyB0aGVuIGZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGRlc2VyaWFsaXphdGlvbiBwYXRoLlxuICAgICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpIHtcbiAgICAgICAgaWYgKCFrZXlTdGF0ZS5rZXkpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVycm9yKFxuICAgICAgICAgICAgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICAgICAgICAgICdFbmNyeXB0ZWQgc3RyZWFtIGRhdGEgZW5jb3VudGVyZWQgYnV0IG5vIGVuY3J5cHRpb24ga2V5IGlzIGF2YWlsYWJsZS4gJyArXG4gICAgICAgICAgICAgICAgJ0VuY3J5cHRpb24gaXMgbm90IGNvbmZpZ3VyZWQgb3Igbm8ga2V5IHdhcyBwcm92aWRlZCBmb3IgdGhpcyBydW4uJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogcGF5bG9hZC5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgZm9ybWF0UHJlZml4OiAnZW5jcicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZWNyeXB0ZWQ6IFVpbnQ4QXJyYXk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVjcnlwdGVkID0gYXdhaXQgYWVzR2NtRGVjcnlwdChrZXlTdGF0ZS5rZXksIHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBsb3ctbGV2ZWwgQUVTIGxheWVyIG9ubHkgc2VlcyB0aGUgc3RyaXBwZWQgcGF5bG9hZCwgc28gaXRcbiAgICAgICAgICAvLyBjYW5ub3QgcmVjb3JkIHRoZSBvdXRlciBlbnZlbG9wZSBwcmVmaXguIFdlIHBlZWtlZCBpdCBoZXJlXG4gICAgICAgICAgLy8gKGBlbmNyYCksIHNvIGVucmljaCB0aGUgZGlhZ25vc3RpYyBjb250ZXh0IHdpdGggdGhlIHJlYWwgZm9ybWF0XG4gICAgICAgICAgLy8gcHJlZml4IGJlZm9yZSBwcm9wYWdhdGluZyDigJQgbWlycm9yaW5nIHNlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi50cy5cbiAgICAgICAgICBpZiAoUnVudGltZURlY3J5cHRpb25FcnJvci5pcyhlcnJvcikgJiYgZXJyb3IuY29udGV4dCkge1xuICAgICAgICAgICAgZXJyb3IuY29udGV4dC5mb3JtYXRQcmVmaXggPSBmb3JtYXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgICh7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRlY3J5cHRlZCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGRlY29kZXIuZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUocGFyc2UodGV4dCwgcmV2aXZlcnMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPFVpbnQ4QXJyYXksIGFueT4oe1xuICAgIGFzeW5jIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgLy8gRmlyc3QsIHRyeSB0byBkZXRlY3QgaWYgdGhpcyBpcyBsZW5ndGgtcHJlZml4ZWQgZnJhbWVkIGRhdGFcbiAgICAgIC8vIGJ5IGNoZWNraW5nIGlmIHRoZSBmaXJzdCA0IGJ5dGVzIGZvcm0gYSBwbGF1c2libGUgbGVuZ3RoLlxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgY2h1bmsubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlTGVuZ3RoID0gbmV3IERhdGFWaWV3KFxuICAgICAgICAgIGNodW5rLmJ1ZmZlcixcbiAgICAgICAgICBjaHVuay5ieXRlT2Zmc2V0LFxuICAgICAgICAgIGNodW5rLmJ5dGVMZW5ndGhcbiAgICAgICAgKS5nZXRVaW50MzIoMCwgZmFsc2UpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcG9zc2libGVMZW5ndGggPiAwICYmXG4gICAgICAgICAgcG9zc2libGVMZW5ndGggPCAxMDBfMDAwXzAwMCAvLyBzYW5pdHkgY2hlY2s6IDwgMTAwTUJcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gTG9va3MgbGlrZSBmcmFtZWQgZGF0YVxuICAgICAgICAgIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcbiAgICAgICAgICBhd2FpdCBwcm9jZXNzRnJhbWVzKGNvbnRyb2xsZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBBbHJlYWR5IGluIGZyYW1lZCBtb2RlIChoYXZlIGJ1ZmZlcmVkIGRhdGEpXG4gICAgICAgIGFwcGVuZFRvQnVmZmVyKGNodW5rKTtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc0ZyYW1lcyhjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWdhY3kgZm9ybWF0OiBuZXdsaW5lLWRlbGltaXRlZCBkZXZhbHVlIHRleHQgKG5vIGZyYW1pbmcpXG4gICAgICBjb25zdCB0ZXh0ID0gZGVjb2Rlci5kZWNvZGUoY2h1bmspO1xuICAgICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHBhcnNlKGxpbmUsIHJldml2ZXJzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIFByb2Nlc3MgYW55IHJlbWFpbmluZyBmcmFtZWQgZGF0YVxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHByb2Nlc3NGcmFtZXMoY29udHJvbGxlcik7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ5dGUtc3RyZWFtIHdpcmUgZnJhbWluZ1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vIEJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgIFJlYWRhYmxlU3RyZWFtcyBwYXNzZWQgYWNyb3NzIGJvdW5kYXJpZXMpXG4vLyBhcmUgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB3b3JsZCdzIHN0cmVhbSB0cmFuc3BvcnQgb25lIHVzZXIgY2h1bmsgYXRcbi8vIGEgdGltZS4gV2l0aG91dCBhbiBpbi1iYW5kIGVudmVsb3BlLCB0aGUgcmVhZGVyIHNlZXMgYSBmbGF0IHN0cmVhbSBvZlxuLy8gYnl0ZXMg4oCUIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIHdoZXJlIG9uZSB1c2VyIGNodW5rIGVuZHMgYW5kIHRoZSBuZXh0XG4vLyBiZWdpbnMsIHdoaWNoIG1ha2VzIG1pZC1zdHJlYW0gcmVjb25uZWN0IGltcG9zc2libGUgKHdlIGRvbid0IGtub3cgaG93XG4vLyBtYW55IHNlcnZlci1zaWRlIGNodW5rcyBoYXZlIGJlZW4gY29uc3VtZWQpLlxuLy9cbi8vIFRvIGVuYWJsZSB0cmFuc3BhcmVudCByZWNvbm5lY3QsIHRoaXMgUFIgaW50cm9kdWNlcyBhbiBvcHQtaW4gd2lyZVxuLy8gZW52ZWxvcGUgdGhhdCB3cmFwcyBlYWNoIHVzZXIgY2h1bmsgaW4gYSBsZW5ndGgtcHJlZml4OlxuLy9cbi8vICAgWzQtYnl0ZSBiaWctZW5kaWFuIGxlbmd0aF1bdXNlciBwYXlsb2FkIGJ5dGVzXVxuLy9cbi8vIFRoZSBlbnZlbG9wZSBpcyBpZGVudGljYWwgaW4gc2hhcGUgdG8gYGdldFNlcmlhbGl6ZVN0cmVhbWAncyBmcmFtaW5nLFxuLy8gYnV0IHRoZSBwYXlsb2FkIGhlcmUgaXMgKnJhdyB1c2VyIGJ5dGVzKiDigJQgdGhlcmUgaXMgbm8gaW5uZXJcbi8vIGZvcm1hdC1wcmVmaXgsIG5vIGRldmFsdWUsIG5vIGVuY3J5cHRpb24uIEEgZnJhbWVkIGJ5dGUgc3RyZWFtIHN0YXlzXG4vLyBzZW1hbnRpY2FsbHkgYSBieXRlIHN0cmVhbSBlbmQtdG8tZW5kOyB0aGUgZnJhbWluZyBpcyBwdXJlbHkgdHJhbnNwb3J0LlxuLy9cbi8vIFRoZSBkZWNpc2lvbiB0byB1c2UgZnJhbWluZyBmb3IgYSBnaXZlbiBzdHJlYW0gaXMgcmVjb3JkZWQgaW4gdGhlXG4vLyBzZXJpYWxpemVkIHN0cmVhbSByZWYgKGBmcmFtaW5nOiAnZnJhbWVkLXYxJ2ApLCBzbyBib3RoIHNpZGVzIGFncmVlIG9uXG4vLyB0aGUgd2lyZSBmb3JtYXQgd2l0aG91dCBydW50aW1lIG5lZ290aWF0aW9uLiBQcm9kdWNlcnMgdGhhdCB0YXJnZXQgYVxuLy8gcnVuIHdob3NlIGRlcGxveW1lbnQgZG9lc24ndCBzdXBwb3J0IGZyYW1pbmcgKHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYFxuLy8gaW4gY2FwYWJpbGl0aWVzLnRzKSBlbWl0IHJhdyBieXRlcyBhbmQgYSByZWYgd2l0aG91dCB0aGUgZmllbGQg4oCUIHdoaWNoXG4vLyB0aGUgcmVhZGVyIHRyZWF0cyBhcyBsZWdhY3kgcmF3IGJ5dGVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblxuLyoqXG4gKiBNYXhpbXVtIGFsbG93ZWQgYnl0ZS1zdHJlYW0gZnJhbWUgcGF5bG9hZCBzaXplICgxMDBNQikuIFNoYXJlZCBieSB0aGVcbiAqIGZyYW1lciAocmVqZWN0cyBvdmVyc2l6ZWQgdXNlciBjaHVua3MgYXQgd3JpdGUgdGltZSwgd2hlcmUgdGhlIGVycm9yIGlzXG4gKiBhY3Rpb25hYmxlKSBhbmQgdGhlIHVuZnJhbWVyIChyZWplY3RzIG92ZXJzaXplZCBsZW5ndGggaGVhZGVycyBhdCByZWFkXG4gKiB0aW1lLCB3aGljaCB1c3VhbGx5IGluZGljYXRlIGEgbm9uLWZyYW1lZCB3aXJlIGJlaW5nIHJlYWQgYXMgZnJhbWVkKS5cbiAqIEtlZXBpbmcgYm90aCBzaWRlcyBvbiBvbmUgY29uc3RhbnQgZ3VhcmFudGVlcyBhbnkgY2h1bmsgdGhlIGZyYW1lclxuICogYWNjZXB0cyBjYW4gYWx3YXlzIGJlIGRlY29kZWQgYnkgdGhlIHVuZnJhbWVyLlxuICovXG5jb25zdCBNQVhfRlJBTUVfU0laRSA9IDEwMF8wMDBfMDAwO1xuXG4vKipcbiAqIFdyYXBzIGVhY2ggY2h1bmsgb2YgYSBieXRlIHN0cmVhbSBpbiBhIDQtYnl0ZSBiaWctZW5kaWFuIGxlbmd0aFxuICogcHJlZml4LiBVc2VkIGJ5IHRoZSBwcm9kdWNlciBzaWRlIG9mIGEgZnJhbWVkIGJ5dGUtc3RyZWFtIHBpcGUuXG4gKlxuICogRW1wdHkgY2h1bmtzIChsZW5ndGggMCkgYXJlIGRyb3BwZWQg4oCUIHRoZSByZXN1bHRpbmcgYFsweDAwIDB4MDAgMHgwMCAweDAwXWBcbiAqIGZyYW1lIHdvdWxkIGJlIGFtYmlndW91cyB3aXRoIHRoZSBsZWdhY3kgXCJsb29rcyBmcmFtZWRcIiBkZXRlY3Rpb24gaW5cbiAqIGBnZXREZXNlcmlhbGl6ZVN0cmVhbWAsIGFuZCBpdCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uLlxuICpcbiAqIExvYWQtYmVhcmluZyBpbnZhcmlhbnQ6IGVhY2ggdXNlciBjaHVuayBiZWNvbWVzIGV4YWN0bHkgb25lIGZyYW1lLCBhbmRcbiAqIGVhY2ggZnJhbWUgaXMgZW5xdWV1ZWQgYXMgZXhhY3RseSBvbmUgdHJhbnNwb3J0IGNodW5rICh0aGUgZG93bnN0cmVhbVxuICogd3JpdGFibGUgcGVyZm9ybXMgb25lIHdpcmUgd3JpdGUgcGVyIGNodW5rLCBwcmVzZXJ2aW5nIGJvdW5kYXJpZXMpLiBUaGVcbiAqIHNlcnZlciB0aGVyZWZvcmUgc3RvcmVzIG9uZSBmcmFtZSBwZXIgY2h1bmsgaW5kZXgsIHdoaWNoIGlzIHdoYXQgYWxsb3dzXG4gKiBhIGZ1dHVyZSByZWNvbm5lY3RpbmcgcmVhZGVyIHRvIHJlc3VtZSBhIGZyYW1lZCBieXRlIHN0cmVhbSBhdFxuICogYHN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2Ag4oCUIHRoZSBzYW1lIGFyaXRobWV0aWNcbiAqIGBjcmVhdGVSZWNvbm5lY3RpbmdGcmFtZWRTdHJlYW1gIHJlbGllcyBvbiBmb3Igb2JqZWN0IHN0cmVhbXMuIERvIG5vdFxuICogY29hbGVzY2Ugb3Igc3BsaXQgZnJhbWVzIGhlcmUgd2l0aG91dCByZXZpc2l0aW5nIHRoYXQgcmVzdW1lIGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKTogVHJhbnNmb3JtU3RyZWFtPFxuICBVaW50OEFycmF5LFxuICBVaW50OEFycmF5XG4+IHtcbiAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IE1BWF9GUkFNRV9TSVpFKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYEJ5dGUtc3RyZWFtIGNodW5rIG9mICR7Y2h1bmsubGVuZ3RofSBieXRlcyBleGNlZWRzIHRoZSBtYXhpbXVtIGAgK1xuICAgICAgICAgICAgICBgZnJhbWVkIGNodW5rIHNpemUgKCR7TUFYX0ZSQU1FX1NJWkV9KS4gU3BsaXQgdGhlIGRhdGEgaW50byBgICtcbiAgICAgICAgICAgICAgYHNtYWxsZXIgY2h1bmtzIGJlZm9yZSB3cml0aW5nLmAsXG4gICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgVWludDhBcnJheShGUkFNRV9IRUFERVJfU0laRSArIGNodW5rLmxlbmd0aCk7XG4gICAgICBuZXcgRGF0YVZpZXcoZnJhbWUuYnVmZmVyKS5zZXRVaW50MzIoMCwgY2h1bmsubGVuZ3RoLCBmYWxzZSk7XG4gICAgICBmcmFtZS5zZXQoY2h1bmssIEZSQU1FX0hFQURFUl9TSVpFKTtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShmcmFtZSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogVW53cmFwcyBsZW5ndGgtcHJlZml4ZWQgYnl0ZS1zdHJlYW0gZnJhbWVzIGJhY2sgaW50byB0aGUgb3JpZ2luYWwgdXNlclxuICogY2h1bmtzLiBVc2VkIGJ5IHRoZSBjb25zdW1lciBzaWRlIG9mIGEgZnJhbWVkIGJ5dGUtc3RyZWFtIHBpcGUuXG4gKlxuICogQnVmZmVycyBhY3Jvc3MgcmVhZCBib3VuZGFyaWVzIOKAlCB0aGUgdHJhbnNwb3J0IG1heSBzcGxpdCBhIHNpbmdsZVxuICogZnJhbWUgYWNyb3NzIG11bHRpcGxlIHJlYWRzIChoZWFkZXIgaW4gb25lIGNodW5rLCBwYXlsb2FkIGluIGFub3RoZXIpXG4gKiBvciBjb2FsZXNjZSBtdWx0aXBsZSBmcmFtZXMgaW50byBhIHNpbmdsZSByZWFkLiBUaGUgdHJhbnNmb3JtIGVtaXRzXG4gKiB3aG9sZSB1c2VyIGNodW5rcyByZWdhcmRsZXNzIG9mIHRyYW5zcG9ydCBjaHVua2luZy5cbiAqXG4gKiBFcnJvcnMgdGhlIHN0cmVhbSBpZiB0aGUgbGVuZ3RoIGhlYWRlciBhZHZlcnRpc2VzIGEgZnJhbWUgbGFyZ2VyIHRoYW5cbiAqIGBNQVhfRlJBTUVfU0laRWAgYnl0ZXMsIHNpbmNlIHRoYXQgYWxtb3N0IGNlcnRhaW5seSBpbmRpY2F0ZXMgYVxuICogbWlzZnJhbWVkIHdpcmUgKGUuZy4gYSByYXcgYnl0ZSBzdHJlYW0gYmVpbmcgZmVkIHRocm91Z2ggdGhpcyB0cmFuc2Zvcm1cbiAqIGJ5IG1pc3Rha2UpIGFuZCB3ZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFuIGVub3Jtb3VzIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ5dGVVbmZyYW1pbmdTdHJlYW0oKTogVHJhbnNmb3JtU3RyZWFtPFxuICBVaW50OEFycmF5LFxuICBVaW50OEFycmF5XG4+IHtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gIGZ1bmN0aW9uIGFwcGVuZFRvQnVmZmVyKGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGRhdGEubGVuZ3RoKTtcbiAgICBuZXh0LnNldChidWZmZXIsIDApO1xuICAgIG5leHQuc2V0KGRhdGEsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGJ1ZmZlciA9IG5leHQ7XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbTxVaW50OEFycmF5LCBVaW50OEFycmF5Pih7XG4gICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICBpZiAoY2h1bmsubGVuZ3RoID4gMCkgYXBwZW5kVG9CdWZmZXIoY2h1bmspO1xuXG4gICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+PSBGUkFNRV9IRUFERVJfU0laRSkge1xuICAgICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG5ldyBEYXRhVmlldyhcbiAgICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICAgIGJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcblxuICAgICAgICBpZiAoZnJhbWVMZW5ndGggPiBNQVhfRlJBTUVfU0laRSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuZXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgIGBCeXRlLXN0cmVhbSBmcmFtZSBsZW5ndGggJHtmcmFtZUxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtICgke01BWF9GUkFNRV9TSVpFfSkuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIHVzdWFsbHkgbWVhbnMgYSBub24tZnJhbWVkIGJ5dGUgc3RyZWFtIGlzIGJlaW5nIHJlYWQgYXMgZnJhbWVkLmAsXG4gICAgICAgICAgICAgIHsgc2x1ZzogJ3NlcmlhbGl6YXRpb24tZmFpbGVkJyB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbCA9IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGg7XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgdG90YWwpIGJyZWFrO1xuXG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShidWZmZXIuc2xpY2UoRlJBTUVfSEVBREVSX1NJWkUsIHRvdGFsKSk7XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSh0b3RhbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQnl0ZS1zdHJlYW0gZW5kZWQgd2l0aCAke2J1ZmZlci5sZW5ndGh9IGJ5dGVzIG9mIGluY29tcGxldGUgZnJhbWUgZGF0YS4gYCArXG4gICAgICAgICAgICAgIGBUaGUgc3RyZWFtIHdhcyB0cnVuY2F0ZWQgbWlkLWZyYW1lLmAsXG4gICAgICAgICAgICB7IHNsdWc6ICdzZXJpYWxpemF0aW9uLWZhaWxlZCcgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBjbGllbnQtb2JzZXJ2ZWQgZW5kLXRvLWVuZCB0aW1lLXRvLWZpcnN0LWNodW5rIHNwYW4gZm9yIGEgbGl2ZSByZWFkOlxuICogcmVhZCBkaXNwYXRjaCAoYHN0YXJ0RXBvY2hNc2ApIOKGkiB0aGUgZmlyc3Qgbm9uLWVtcHR5IGNodW5rIHJlYWNoaW5nIHRoZVxuICogcmVhZGVyLCBpbmNsdWRpbmcgdGhlIG5ldHdvcmsgaG9wLiBGaXJlLWFuZC1mb3JnZXQ7IG5vLW9wIHdpdGhvdXQgT1RFTC5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsoXG4gIHN0YXJ0RXBvY2hNczogbnVtYmVyLFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN0YXJ0SW5kZXg/OiBudW1iZXJcbik6IHZvaWQge1xuICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVjb3JkRWxhcHNlZFNwYW4oJ3dvcmtmbG93LnN0cmVhbS5yZWFkJywgc3RhcnRFcG9jaE1zLCB7XG4gICAgICBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnQ0xJRU5UJyksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICd3b3JrZmxvdy5ydW4uaWQnOiBydW5JZCxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5uYW1lJzogbmFtZSxcbiAgICAgICAgJ3dvcmtmbG93LnN0cmVhbS5vcGVyYXRpb24nOiAncmVhZCcsXG4gICAgICAgICd3b3JrZmxvdy5zdHJlYW0ucmVhZC50dGZjX21zJzogRGF0ZS5ub3coKSAtIHN0YXJ0RXBvY2hNcyxcbiAgICAgICAgLi4uKHR5cGVvZiBzdGFydEluZGV4ID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8geyAnd29ya2Zsb3cuc3RyZWFtLnN0YXJ0X2luZGV4Jzogc3RhcnRJbmRleCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KSgpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTZXJ2ZXJSZWFkYWJsZVN0cmVhbSBleHRlbmRzIFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgI3JlYWRlcj86IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PjtcblxuICBjb25zdHJ1Y3RvcihydW5JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0YXJ0SW5kZXg/OiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgLy8gQ2xpZW50LW9ic2VydmVkIHRpbWUtdG8tZmlyc3QtY2h1bmsgc3RhdGUuIGByZWFkU3RhcnRgIGlzIHN0YW1wZWQgd2hlbiB0aGVcbiAgICAvLyByZWFkZXIgc3RhcnRzIGNvbnN1bWluZyAoZmlyc3QgcHVsbCDihpIgdGhlIHJlYWQgZGlzcGF0Y2gpOyB0aGUgc3BhbiBpc1xuICAgIC8vIGVtaXR0ZWQgb25jZSwgd2hlbiB0aGUgZmlyc3Qgbm9uLWVtcHR5IGNodW5rIHJlYWNoZXMgdGhlIHJlYWRlci4gU28gaXRzXG4gICAgLy8gZHVyYXRpb24gaXMgdGhlIGVuZC10by1lbmQgVFRGQyBpbmNsdWRpbmcgdGhlIG5ldHdvcmsgaG9wLiBOby1vcCB3aXRob3V0XG4gICAgLy8gYW4gT3BlblRlbGVtZXRyeSBTREsgcmVnaXN0ZXJlZC5cbiAgICBsZXQgcmVhZFN0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZpcnN0Q2h1bmtSZXBvcnRlZCA9IGZhbHNlO1xuICAgIHN1cGVyKHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgTm90IHN1cmUgd2h5IFR5cGVTY3JpcHQgaXMgY29tcGxhaW5pbmcgYWJvdXQgdGhpc1xuICAgICAgdHlwZTogJ2J5dGVzJyxcblxuICAgICAgcHVsbDogYXN5bmMgKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgbGV0IHJlYWRlciA9IHRoaXMuI3JlYWRlcjtcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICBpZiAocmVhZFN0YXJ0ID09PSB1bmRlZmluZWQpIHJlYWRTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgc3RhcnRJbmRleCk7XG4gICAgICAgICAgcmVhZGVyID0gdGhpcy4jcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgcmVhZGVyJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuI3JlYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIHNlcnZlciBmbHVzaGVzIGEgbGVhZGluZyB6ZXJvLWxlbmd0aCBjaHVuayAodjMrKSB0byBjb21taXRcbiAgICAgICAgICAvLyByZXNwb25zZSBoZWFkZXJzIGJlZm9yZSBhbnkgZGF0YTsgc2tpcCBlbXB0aWVzIHNvIFRURkMgbWVhc3VyZXMgdG9cbiAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVhbCBjaHVuay5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhZmlyc3RDaHVua1JlcG9ydGVkICYmXG4gICAgICAgICAgICByZXN1bHQudmFsdWUuYnl0ZUxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHJlYWRTdGFydCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaXJzdENodW5rUmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVjb3JkUmVhZFRpbWVUb0ZpcnN0Q2h1bmsocmVhZFN0YXJ0LCBydW5JZCwgbmFtZSwgc3RhcnRJbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZvcndhcmQgcmF3IGJ5dGVzOyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gaXMgaGFuZGxlZCBhdCB0aGVcbiAgICAgICAgICAvLyBmcmFtaW5nIGxldmVsIGJ5IGdldFNlcmlhbGl6ZVN0cmVhbS9nZXREZXNlcmlhbGl6ZVN0cmVhbS5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbmNlbDogYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVhZGVyKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy4jcmVhZGVyLmNhbmNlbChyZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB0aGlzLiNyZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYXhpbXVtIGNvbnNlY3V0aXZlIHJlY29ubmVjdCBhdHRlbXB0cyBmb3IgYSBzaW5nbGUgZnJhbWVkIHN0cmVhbSBzZXNzaW9uLlxuICogVGhlIGNvdW50ZXIgcmVzZXRzIHRvIHplcm8gd2hlbmV2ZXIgYSByZWNvbm5lY3QgbWFrZXMgZm9yd2FyZCBwcm9ncmVzcyAoYVxuICogZnJhbWUgaXMgZGVsaXZlcmVkKSwgc28gdGhpcyBib3VuZHMgKmNvbnNlY3V0aXZlKiBmYWlsdXJlcywgbm90IHRoZSBsaWZldGltZVxuICogdG90YWwg4oCUIGEgbG9uZy1saXZlZCBzZXJ2ZXJsZXNzIHN0cmVhbSBtYXkgbGVnaXRpbWF0ZWx5IHJlY29ubmVjdCBmYXIgbW9yZVxuICogdGhhbiB0aGlzIG1hbnkgdGltZXMgYXMgbG9uZyBhcyBlYWNoIHJlY29ubmVjdCBrZWVwcyBkZWxpdmVyaW5nIGRhdGEuIFdlIG9ubHlcbiAqIGdpdmUgdXAgYWZ0ZXIgdGhpcyBtYW55IHJlY29ubmVjdHMgaW4gYSByb3cgcHJvZHVjZSBub3RoaW5nLlxuICovXG5leHBvcnQgY29uc3QgRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUUyA9IDUwO1xuXG4vKiogRWZmZWN0aXZlIGNvbnNlY3V0aXZlLXJlY29ubmVjdCBjYXAuIE92ZXJyaWRlOiBgV09SS0ZMT1dfRlJBTUVEX1NUUkVBTV9NQVhfUkVDT05ORUNUU2AuICovXG5jb25zdCBnZXRGcmFtZWRTdHJlYW1NYXhSZWNvbm5lY3RzID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoXG4gICAgJ1dPUktGTE9XX0ZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMnLFxuICAgIEZSQU1FRF9TVFJFQU1fTUFYX1JFQ09OTkVDVFMsXG4gICAge1xuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIG1pbjogMSxcbiAgICB9XG4gICk7XG5cbi8qKlxuICogQWJzb2x1dGUgYmFja3N0b3Agb24gdG90YWwgcmVjb25uZWN0cyBmb3IgYSBzaW5nbGUgc2Vzc2lvbiwgaW5kZXBlbmRlbnQgb2ZcbiAqIHByb2dyZXNzLiBUaGUgY29uc2VjdXRpdmUgY2FwIGFib3ZlIHJlc2V0cyBvbiBmb3J3YXJkIHByb2dyZXNzLCB3aGljaCBpc1xuICogY29ycmVjdCBmb3IgYSB3ZWxsLWJlaGF2ZWQgYmFja2VuZCB0aGF0IGhvbm9ycyBgc3RhcnRJbmRleGAuIEJ1dCBpZiBhIFdvcmxkJ3NcbiAqIGBzdHJlYW1zLmdldGAgZXZlciBpZ25vcmVkIGBzdGFydEluZGV4YCBhbmQgcmUtZGVsaXZlcmVkIGVhcmxpZXIgY2h1bmtzLFxuICogXCJwcm9ncmVzc1wiIHdvdWxkIGJlIHJlcG9ydGVkIGV2ZXJ5IHJlY29ubmVjdCBhbmQgdGhlIGNvbnNlY3V0aXZlIGNhcCB3b3VsZFxuICogbmV2ZXIgdHJpcCDigJQgdHVybmluZyBhIGJvdW5kZWQgZmFpbHVyZSBpbnRvIGFuIHVuYm91bmRlZCByZWNvbm5lY3QgbG9vcC4gVGhpc1xuICogaGFyZCBjZWlsaW5nIGd1YXJhbnRlZXMgdGhlIGxvb3AgYWx3YXlzIHRlcm1pbmF0ZXMuIEl0IGlzIHNldCBoaWdoIGVub3VnaFxuICogKGhvdXJzIG9mIHN0cmVhbWluZyBhdCByZWFsaXN0aWMgcGVyLXNlc3Npb24gdGltZW91dHMpIHRvIG5ldmVyIGludGVyZmVyZVxuICogd2l0aCBsZWdpdGltYXRlIGxvbmctbGl2ZWQgc3RyZWFtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEZSQU1FRF9TVFJFQU1fTUFYX1RPVEFMX1JFQ09OTkVDVFMgPSAxMDAwO1xuXG4vKiogRWZmZWN0aXZlIHRvdGFsLXJlY29ubmVjdCBiYWNrc3RvcC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTYC4gKi9cbmNvbnN0IGdldEZyYW1lZFN0cmVhbU1heFRvdGFsUmVjb25uZWN0cyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19GUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTJyxcbiAgICBGUkFNRURfU1RSRUFNX01BWF9UT1RBTF9SRUNPTk5FQ1RTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcblxuLyoqXG4gKiBXcmFwcyB0aGUgbGVuZ3RoLXByZWZpeC1mcmFtZWQgYnl0ZSBzdHJlYW0gZnJvbSBgd29ybGQuc3RyZWFtcy5nZXRgIHdpdGhcbiAqIHRyYW5zcGFyZW50IGF1dG8tcmVjb25uZWN0LlxuICpcbiAqIEV2ZXJ5IGZ1bGx5LWRlY29kZWQgb3V0ZXIgZnJhbWUgY29ycmVzcG9uZHMgdG8gZXhhY3RseSBvbmUgc2VydmVyLXNpZGVcbiAqIGNodW5rICh0aGUgc2VyaWFsaXplIHRyYW5zZm9ybSBlbnF1ZXVlcyBvbmUgZnJhbWUgcGVyIHdvcmtmbG93IHdyaXRlLCBhbmRcbiAqIHRoZSB3cml0YWJsZSBidWZmZXJzIG9uZSBmcmFtZSBwZXIgY2h1bmsgd2hlbiBtdWx0aS13cml0aW5nKS4gVGhlIHdyYXBwZXJcbiAqIGNvdW50cyBjb21wbGV0ZWQgZnJhbWVzIGFuZCwgb24gdXBzdHJlYW0gZXJyb3IsIHJlb3BlbnMgdGhlIGNvbm5lY3Rpb25cbiAqIHdpdGggYHN0YXJ0SW5kZXggPSByZXNvbHZlZFN0YXJ0SW5kZXggKyBjb25zdW1lZEZyYW1lc2AuIFBhcnRpYWwtZnJhbWVcbiAqIGJ5dGVzIGJ1ZmZlcmVkIGJlZm9yZSB0aGUgY3V0IGFyZSBkaXNjYXJkZWQg4oCUIHRoZSBzZXJ2ZXIgd2lsbCByZXNlbmQgdGhlXG4gKiBpbi1mbGlnaHQgY2h1bmsgaW4gZnVsbCBmcm9tIHRoZSBuZXcgc3RhcnRJbmRleC5cbiAqXG4gKiBBIGNsZWFuIHVwc3RyZWFtIGNsb3NlIChFT0Ygd2l0aCBubyBlcnJvcikgc2lnbmFscyB0aGUgc3RyZWFtIGlzIHRydWx5XG4gKiBkb25lOyB3ZSBjbG9zZSB0aGUgd3JhcHBlciBhbmQgZG8gbm90IHJlY29ubmVjdC5cbiAqXG4gKiBOZWdhdGl2ZSBgc3RhcnRJbmRleGAgdmFsdWVzIChsYXN0LU4gc2VtYW50aWNzKSBza2lwIHRoZSByZWNvbm5lY3RcbiAqIG1hY2hpbmVyeSBiZWNhdXNlIHdlIGNhbm5vdCBjb21wdXRlIGFuIGFic29sdXRlIHJlc3VtZSBwb3NpdGlvbiB3aXRob3V0XG4gKiBhIHRhaWwtaW5kZXggbG9va3VwIOKAlCB0aGUgcmV0dXJuZWQgc3RyZWFtIGJlaGF2ZXMgYXMgYSBzaW5nbGUtc2hvdCByZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVjb25uZWN0aW5nRnJhbWVkU3RyZWFtKFxuICBydW5JZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHN0YXJ0SW5kZXg/OiBudW1iZXJcbik6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcmVjb25uZWN0U3VwcG9ydGVkID0gc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0SW5kZXggPj0gMDtcbiAgbGV0IGN1cnJlbnRTdGFydEluZGV4ID0gc3RhcnRJbmRleCA/PyAwO1xuICBsZXQgY29uc3VtZWRGcmFtZXMgPSAwO1xuICBsZXQgcmVjb25uZWN0Q291bnQgPSAwO1xuICBsZXQgdG90YWxSZWNvbm5lY3RDb3VudCA9IDA7XG4gIGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PiB8IHVuZGVmaW5lZDtcbiAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVTdGFydEluZGV4ID0gcmVjb25uZWN0U3VwcG9ydGVkXG4gICAgICA/IGN1cnJlbnRTdGFydEluZGV4ICsgY29uc3VtZWRGcmFtZXNcbiAgICAgIDogc3RhcnRJbmRleDtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChydW5JZCwgbmFtZSwgZWZmZWN0aXZlU3RhcnRJbmRleCk7XG4gICAgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyZWFkZXIpIHtcbiAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEFkdmFuY2UgdGhlIHJlc3VtZSBwb3NpdGlvbiBwYXN0IHRoZSBmcmFtZXMgYWxyZWFkeSBkZWxpdmVyZWQsIHRoZW5cbiAgICAvLyBkcm9wIGFueSBwYXJ0aWFsLWZyYW1lIGJ5dGVzIOKAlCB0aGUgcmVvcGVuZWQgY29ubmVjdGlvbiByZS1zZW5kcyBmcm9tIGFcbiAgICAvLyBmcmFtZSBib3VuZGFyeSBhdCB0aGUgbmV3IGluZGV4LlxuICAgIGN1cnJlbnRTdGFydEluZGV4ICs9IGNvbnN1bWVkRnJhbWVzO1xuICAgIGNvbnN1bWVkRnJhbWVzID0gMDtcbiAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcblxuICAgIC8vIFJldHJ5IHRoZSByZW9wZW4gaXRzZWxmIGFnYWluc3QgdGhlIHJlY29ubmVjdCBidWRnZXQuIEEgdHJhbnNpZW50XG4gICAgLy8gZmFpbHVyZSBvZiBjb25uZWN0KCkg4oCUIHRoZSBzZXJ2ZXIgYnJpZWZseSB1bmF2YWlsYWJsZSBkdXJpbmcgdGhlXG4gICAgLy8gcmVjb25uZWN0IHdpbmRvdyDigJQgaXMgdGhlIGV4YWN0IGJsaXAgdGhpcyB3cmFwcGVyIGV4aXN0cyB0byBzdXJ2aXZlLCBzb1xuICAgIC8vIGNvdW50IGl0IGFnYWluc3QgdGhlIGJ1ZGdldCBhbmQgdHJ5IGFnYWluIHJhdGhlciB0aGFuIHRyZWF0aW5nIGl0IGFzXG4gICAgLy8gZmF0YWwuIE9ubHkgYnVkZ2V0IGV4aGF1c3Rpb24gKGEgc2VydmVyIHRoYXQgc3RheXMgZG93bikgdGVybWluYXRlcyB0aGVcbiAgICAvLyBzdHJlYW0uXG4gICAgY29uc3QgbWF4UmVjb25uZWN0cyA9IGdldEZyYW1lZFN0cmVhbU1heFJlY29ubmVjdHMoKTtcbiAgICBjb25zdCBtYXhUb3RhbFJlY29ubmVjdHMgPSBnZXRGcmFtZWRTdHJlYW1NYXhUb3RhbFJlY29ubmVjdHMoKTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICByZWNvbm5lY3RDb3VudCsrO1xuICAgICAgdG90YWxSZWNvbm5lY3RDb3VudCsrO1xuICAgICAgaWYgKHJlY29ubmVjdENvdW50ID4gbWF4UmVjb25uZWN0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN0cmVhbSBcIiR7bmFtZX1cIiBleGNlZWRlZCBtYXhpbXVtIHJlY29ubmVjdGlvbiBhdHRlbXB0cyAoJHttYXhSZWNvbm5lY3RzfSlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodG90YWxSZWNvbm5lY3RDb3VudCA+IG1heFRvdGFsUmVjb25uZWN0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN0cmVhbSBcIiR7bmFtZX1cIiBleGNlZWRlZCBtYXhpbXVtIHRvdGFsIHJlY29ubmVjdGlvbiBhdHRlbXB0cyAoJHttYXhUb3RhbFJlY29ubmVjdHN9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3QoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFJlb3BlbiBmYWlsZWQgdHJhbnNpZW50bHk7IGxvb3AgdG8gcmV0cnksIGNvdW50aW5nIGFnYWluc3QgdGhlXG4gICAgICAgIC8vIGJ1ZGdldCBzbyBhIHNlcnZlciB0aGF0IG5ldmVyIHJlY292ZXJzIHN0aWxsIHRlcm1pbmF0ZXMgdGhlIHN0cmVhbS5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+KHtcbiAgICBwdWxsOiBhc3luYyAoY29udHJvbGxlcikgPT4ge1xuICAgICAgLy8gTG9vcCB1bnRpbCB3ZSBlbWl0IHNvbWV0aGluZywgaGl0IEVPRiwgb3IgZmF0YWxseSBlcnJvci4gUmVhZHMgdGhhdFxuICAgICAgLy8gb25seSBleHRlbmQgdGhlIGluLWZsaWdodC1mcmFtZSBidWZmZXIgZG9uJ3QgZW5xdWV1ZSBhbnl0aGluZyDigJQgd2VcbiAgICAgIC8vIGtlZXAgcmVhZGluZyByYXRoZXIgdGhhbiByZXR1cm5pbmcgZW1wdHktaGFuZGVkLlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdDogeyBkb25lOiBib29sZWFuOyB2YWx1ZT86IFVpbnQ4QXJyYXkgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS9ub05vbk51bGxBc3NlcnRpb246IGNvbm5lY3QoKSBndWFyYW50ZWVzIHJlYWRlclxuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlYWRlciEucmVhZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIXJlY29ubmVjdFN1cHBvcnRlZCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgcmVjb25uZWN0KCk7XG4gICAgICAgICAgfSBjYXRjaCAocmVjb25uZWN0RXJyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKHJlY29ubmVjdEVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5kb25lIHx8ICFyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAvLyBDbGVhbiBFT0Yg4oCUIHN0cmVhbSBpcyB0cnVseSBjb21wbGV0ZS4gRHJvcCBhbnkgcGFydGlhbC1mcmFtZVxuICAgICAgICAgIC8vIGJ5dGVzICh0aGVyZSBzaG91bGRuJ3QgYmUgYW55OyBhIHdlbGwtZm9ybWVkIHN0cmVhbSBlbmRzIG9uIGFcbiAgICAgICAgICAvLyBmcmFtZSBib3VuZGFyeSkuXG4gICAgICAgICAgcmVhZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgdG8gYnVmZmVyIGFuZCBlbWl0IGFsbCBjb21wbGV0ZSBmcmFtZXMuXG4gICAgICAgIGNvbnN0IGluY29taW5nID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAoaW5jb21pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmxlbmd0aCArIGluY29taW5nLmxlbmd0aCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGJ1ZmZlciwgMCk7XG4gICAgICAgICAgY29tYmluZWQuc2V0KGluY29taW5nLCBidWZmZXIubGVuZ3RoKTtcbiAgICAgICAgICBidWZmZXIgPSBjb21iaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID49IEZSQU1FX0hFQURFUl9TSVpFKSB7XG4gICAgICAgICAgY29uc3QgZnJhbWVMZW5ndGggPSBuZXcgRGF0YVZpZXcoXG4gICAgICAgICAgICBidWZmZXIuYnVmZmVyLFxuICAgICAgICAgICAgYnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgICkuZ2V0VWludDMyKDAsIGZhbHNlKTtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IEZSQU1FX0hFQURFUl9TSVpFICsgZnJhbWVMZW5ndGg7XG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCB0b3RhbCkgYnJlYWs7XG4gICAgICAgICAgLy8gRm9yd2FyZCB0aGUgZW50aXJlIGZyYW1lZCBjaHVuayAoaGVhZGVyICsgcGF5bG9hZCkgdG8gdGhlXG4gICAgICAgICAgLy8gZG93bnN0cmVhbSBkZXNlcmlhbGl6ZXIsIHdoaWNoIGFscmVhZHkgZXhwZWN0cyB0aGlzIGxheW91dC5cbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnVmZmVyLnNsaWNlKDAsIHRvdGFsKSk7XG4gICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKHRvdGFsKTtcbiAgICAgICAgICBjb25zdW1lZEZyYW1lcysrO1xuICAgICAgICAgIGVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVtaXR0ZWQpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHByb2dyZXNzIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24g4oCUIGNsZWFyIHRoZVxuICAgICAgICAgIC8vIGNvbnNlY3V0aXZlLWZhaWx1cmUgYnVkZ2V0IHNvIGEgbG9uZyBzdHJlYW0gdGhhdCByZWNvbm5lY3RzXG4gICAgICAgICAgLy8gbWFueSB0aW1lcyAoYnV0IGtlZXBzIGRlbGl2ZXJpbmcpIGlzIG5ldmVyIGZhbHNlbHkgY2FwcGVkLlxuICAgICAgICAgIHJlY29ubmVjdENvdW50ID0gMDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBwYXJ0aWFsIGJ5dGVzIOKAlCByZWFkIG1vcmUuXG4gICAgICB9XG4gICAgfSxcbiAgICBjYW5jZWw6IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZWFkZXIpIHtcbiAgICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGNsb3NpbmcgUmVhZGFibGVTdHJlYW0gcmVhZGVyOicsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBmbHVzaCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgZm9yIGJ1ZmZlcmVkIHN0cmVhbSB3cml0ZXMuXG4gKiBDaHVua3MgYXJlIGFjY3VtdWxhdGVkIGFuZCBmbHVzaGVkIHRvZ2V0aGVyIHRvIHJlZHVjZSBuZXR3b3JrIG92ZXJoZWFkLlxuICovXG5jb25zdCBTVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMgPSAxMDtcblxuLyoqXG4gKiBFZmZlY3RpdmUgZGVmYXVsdCBzdHJlYW0tZmx1c2ggaW50ZXJ2YWwgKGEgYHdvcmxkLnN0cmVhbUZsdXNoSW50ZXJ2YWxNc2BcbiAqIHN0aWxsIHRha2VzIHByZWNlZGVuY2UpLiBPdmVycmlkZTogYFdPUktGTE9XX1NUUkVBTV9GTFVTSF9JTlRFUlZBTF9NU2AuXG4gKi9cbmNvbnN0IGdldFN0cmVhbUZsdXNoSW50ZXJ2YWxNcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMnLCBTVFJFQU1fRkxVU0hfSU5URVJWQUxfTVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICB9KTtcblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0gZXh0ZW5kcyBXcml0YWJsZVN0cmVhbTxVaW50OEFycmF5PiB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcnVuUmVhZHlCYXJyaWVyIFR1cmJvIG1vZGUgb25seTogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGVcbiAgICogYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZC4gV2hlbiB0aGUgc3RlcCBib2R5IHJ1bnNcbiAgICogb3B0aW1pc3RpY2FsbHkgKGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGlzIGR1cmFibGUpLCB0aGUgZmlyc3QgY2h1bmsgd3JpdGUgdG9cbiAgICogYSBicmFuZC1uZXcgc3RyZWFtIHdvdWxkIG90aGVyd2lzZSByZWFjaCB0aGUgV29ybGQgYmVmb3JlIHRoZSBydW4gZXhpc3RzXG4gICAqIGFuZCBiZSByZWplY3RlZCBhcyBydW4tbm90LWZvdW5kLiBBd2FpdGluZyB0aGlzIG9uY2UgYmVmb3JlIHRoZSBmaXJzdFxuICAgKiBmbHVzaC9jbG9zZSBvcmRlcnMgdGhlIHdyaXRlIGFmdGVyIHRoZSBydW4ncyBjcmVhdGlvbi4gYHVuZGVmaW5lZGAgb3V0c2lkZVxuICAgKiB0dXJibyBhbmQgb24gdGhlIGF3YWl0IHBhdGgsIHdoZXJlIHRoZSBydW4gd2FzIGFscmVhZHkgZHVyYWJsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJ1bklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPikge1xuICAgIGlmICh0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBcInJ1bklkXCIgbXVzdCBiZSBhIHN0cmluZywgZ290IFwiJHt0eXBlb2YgcnVuSWR9XCJgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoYFwibmFtZVwiIGlzIHJlcXVpcmVkLCBnb3QgXCIke25hbWV9XCJgKTtcbiAgICB9XG4gICAgY29uc3Qgd29ybGRQcm9taXNlID0gZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAvLyBIb2xkIHRoZSBmaXJzdCBzZXJ2ZXIgd3JpdGUgdW50aWwgdGhlIHJ1biBleGlzdHMgKHR1cmJvIG9wdGltaXN0aWNcbiAgICAvLyBzdGFydCkuIEF3YWl0ZWQgb25jZSwgdGhlbiBjbGVhcmVkIHNvIGxhdGVyIGZsdXNoZXMgcGF5IG5vdGhpbmcuIFRoZVxuICAgIC8vIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yIG9yZGVyaW5nIG9ubHk6IGlmIGBydW5fc3RhcnRlZGAgdHJ1bHkgZmFpbGVkXG4gICAgLy8gdGhlIHJ1biBkb2VzIG5vdCBleGlzdCwgc28gdGhlIHdyaXRlIGJlbG93IHN1cmZhY2VzIHRoZSByZWFsIGVycm9yLlxuICAgIGxldCBwZW5kaW5nUnVuUmVhZHk6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQgPSBydW5SZWFkeUJhcnJpZXI7XG4gICAgY29uc3QgZW5zdXJlUnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAocGVuZGluZ1J1blJlYWR5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcGVuZGluZ1J1blJlYWR5O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5IOKAlCBzZWUgYWJvdmUuXG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ1J1blJlYWR5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBCdWZmZXJpbmcgc3RhdGUgZm9yIGJhdGNoZWQgd3JpdGVzXG4gICAgLy8gRW5jcnlwdGlvbi9kZWNyeXB0aW9uIGlzIGhhbmRsZWQgYXQgdGhlIGZyYW1pbmcgbGV2ZWwgYnlcbiAgICAvLyBnZXRTZXJpYWxpemVTdHJlYW0vZ2V0RGVzZXJpYWxpemVTdHJlYW0sIG5vdCBoZXJlLlxuICAgIGxldCBidWZmZXI6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgIGxldCBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBmbHVzaFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgcmVzb2x2ZWRGbHVzaEludGVydmFsTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGZsdXNoID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgaWYgKGZsdXNoVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoVGltZXIpO1xuICAgICAgICBmbHVzaFRpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gT3JkZXIgdGhlIGZpcnN0IHNlcnZlciB3cml0ZSBhZnRlciB0aGUgcnVuIGV4aXN0cyAodHVyYm8gb3B0aW1pc3RpY1xuICAgICAgLy8gc3RhcnQpOyBhIG5vLW9wIG9uIGV2ZXJ5IGxhdGVyIGZsdXNoIGFuZCBvdXRzaWRlIHR1cmJvLlxuICAgICAgYXdhaXQgZW5zdXJlUnVuUmVhZHkoKTtcblxuICAgICAgLy8gQ29weSBjaHVua3MgdG8gZmx1c2gsIGJ1dCBkb24ndCBjbGVhciBidWZmZXIgdW50aWwgd3JpdGUgc3VjY2VlZHNcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgZGF0YSBsb3NzIGlmIHRoZSB3cml0ZSBvcGVyYXRpb24gZmFpbHNcbiAgICAgIGNvbnN0IGNodW5rc1RvRmx1c2ggPSBidWZmZXIuc2xpY2UoKTtcblxuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB3b3JsZFByb21pc2U7XG4gICAgICAvLyBDYWNoZSB0aGUgZmx1c2ggaW50ZXJ2YWwgZnJvbSB0aGUgd29ybGQgb24gZmlyc3QgdXNlXG4gICAgICBpZiAocmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXNvbHZlZEZsdXNoSW50ZXJ2YWxNcyA9XG4gICAgICAgICAgd29ybGQuc3RyZWFtRmx1c2hJbnRlcnZhbE1zID8/IGdldFN0cmVhbUZsdXNoSW50ZXJ2YWxNcygpO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHdyaXRlTXVsdGkgaWYgYXZhaWxhYmxlIGZvciBiYXRjaCB3cml0ZXNcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHdvcmxkLnN0cmVhbXMud3JpdGVNdWx0aSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICBjaHVua3NUb0ZsdXNoLmxlbmd0aCA+IDFcbiAgICAgICkge1xuICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLndyaXRlTXVsdGkocnVuSWQsIG5hbWUsIGNodW5rc1RvRmx1c2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHNlcXVlbnRpYWwgd3JpdGVzXG4gICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzVG9GbHVzaCkge1xuICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUocnVuSWQsIG5hbWUsIGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IGNsZWFyIGJ1ZmZlciBhZnRlciBzdWNjZXNzZnVsIHdyaXRlIHRvIHByZXZlbnQgZGF0YSBsb3NzXG4gICAgICBidWZmZXIgPSBbXTtcbiAgICB9O1xuXG4gICAgLyoqIFJlc29sdmVycy9yZWplY3RvcnMgd2FpdGluZyBmb3IgdGhlIGN1cnJlbnQgc2NoZWR1bGVkIGZsdXNoICovXG4gICAgbGV0IGZsdXNoV2FpdGVyczogQXJyYXk8e1xuICAgICAgcmVzb2x2ZTogKCkgPT4gdm9pZDtcbiAgICAgIHJlamVjdDogKGVycjogdW5rbm93bikgPT4gdm9pZDtcbiAgICB9PiA9IFtdO1xuXG4gICAgY29uc3Qgc2NoZWR1bGVGbHVzaCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChmbHVzaFRpbWVyKSByZXR1cm47IC8vIEFscmVhZHkgc2NoZWR1bGVkXG5cbiAgICAgIGZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmx1c2hUaW1lciA9IG51bGw7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRXYWl0ZXJzID0gZmx1c2hXYWl0ZXJzO1xuICAgICAgICBmbHVzaFdhaXRlcnMgPSBbXTtcbiAgICAgICAgZmx1c2hQcm9taXNlID0gZmx1c2goKS50aGVuKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdyBvZiBjdXJyZW50V2FpdGVycykgdy5yZXNvbHZlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHcgb2YgY3VycmVudFdhaXRlcnMpIHcucmVqZWN0KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSwgcmVzb2x2ZWRGbHVzaEludGVydmFsTXMgPz8gZ2V0U3RyZWFtRmx1c2hJbnRlcnZhbE1zKCkpO1xuICAgIH07XG5cbiAgICBzdXBlcih7XG4gICAgICBhc3luYyB3cml0ZShjaHVuaykge1xuICAgICAgICAvLyBXYWl0IGZvciBhbnkgaW4tcHJvZ3Jlc3MgZmx1c2ggdG8gY29tcGxldGUgYmVmb3JlIGFkZGluZyB0byBidWZmZXJcbiAgICAgICAgaWYgKGZsdXNoUHJvbWlzZSkge1xuICAgICAgICAgIGF3YWl0IGZsdXNoUHJvbWlzZTtcbiAgICAgICAgICBmbHVzaFByb21pc2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgICBzY2hlZHVsZUZsdXNoKCk7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNjaGVkdWxlZCBmbHVzaCB0byBjb21wbGV0ZSBzbyB0aGF0IGNhbGxlcnNcbiAgICAgICAgLy8gKGxpa2UgZmx1c2hhYmxlUGlwZSkga25vdyBkYXRhIGhhcyByZWFjaGVkIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gYmVmb3JlIGRlY3JlbWVudGluZyBwZW5kaW5nT3BzLiBXaXRob3V0IHRoaXMsIHBlbmRpbmdPcHNcbiAgICAgICAgLy8gcmVhY2hlcyAwIHdoZW4gdGhlIGJ1ZmZlcmVkIHdyaXRlIHJldHVybnMgKGluc3RhbnQpLCBidXRcbiAgICAgICAgLy8gdGhlIDEwbXMgZmx1c2ggdGltZXIgaGFzbid0IGZpcmVkIHlldC5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGZsdXNoV2FpdGVycy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgLy8gV2FpdCBmb3IgYW55IGluLXByb2dyZXNzIGZsdXNoIHRvIGNvbXBsZXRlXG4gICAgICAgIGlmIChmbHVzaFByb21pc2UpIHtcbiAgICAgICAgICBhd2FpdCBmbHVzaFByb21pc2U7XG4gICAgICAgICAgZmx1c2hQcm9taXNlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZsdXNoIGFueSByZW1haW5pbmcgYnVmZmVyZWQgY2h1bmtzXG4gICAgICAgIGF3YWl0IGZsdXNoKCk7XG5cbiAgICAgICAgLy8gQSBjbG9zZSB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBza2lwcyBmbHVzaCgpJ3Mgd3JpdGUgKGFuZCBpdHMgYmFycmllciksXG4gICAgICAgIC8vIGJ1dCBjYW4gaXRzZWxmIGJlIHRoZSBmaXJzdCB3cml0ZSB0byBhIGJyYW5kLW5ldyBzdHJlYW0g4oCUIGdhdGUgaXQgdG9vLlxuICAgICAgICBhd2FpdCBlbnN1cmVSdW5SZWFkeSgpO1xuXG4gICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgd29ybGRQcm9taXNlO1xuICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKHJ1bklkLCBuYW1lKTtcbiAgICAgIH0sXG4gICAgICBhYm9ydChyZWFzb24pIHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgdGltZXIgdG8gcHJldmVudCBsZWFrc1xuICAgICAgICBpZiAoZmx1c2hUaW1lcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChmbHVzaFRpbWVyKTtcbiAgICAgICAgICBmbHVzaFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBEaXNjYXJkIGJ1ZmZlcmVkIGNodW5rcyAtIHRoZXkgd29uJ3QgYmUgd3JpdHRlblxuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgLy8gUmVqZWN0IGFueSBwZW5kaW5nIGZsdXNoV2FpdGVycyBzbyB0aGUgd3JpdGUoKSBwcm9taXNlcyBzZXR0bGVcbiAgICAgICAgLy8gYW5kIGRvbid0IGxlYWsuIFdpdGhvdXQgdGhpcywgd3JpdGUoKSBoYW5ncyBmb3JldmVyIG9uIGFuXG4gICAgICAgIC8vIHVuc2V0dGxlZCBwcm9taXNlIGJlY2F1c2UgdGhlIGNsZWFyZWQgdGltZXIgd2lsbCBuZXZlciBmaXJlLlxuICAgICAgICBjb25zdCB3YWl0ZXJzID0gZmx1c2hXYWl0ZXJzO1xuICAgICAgICBmbHVzaFdhaXRlcnMgPSBbXTtcbiAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IHJlYXNvbiA/PyBuZXcgRXJyb3IoJ1N0cmVhbSBhYm9ydGVkJyk7XG4gICAgICAgIGZvciAoY29uc3QgdyBvZiB3YWl0ZXJzKSB3LnJlamVjdChhYm9ydEVycm9yKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZyb20gdGhlIG1vZHVsYXIgc2VyaWFsaXphdGlvbiBtb2R1bGVzLlxuZXhwb3J0IHR5cGUge1xuICBCeXRlU3RyZWFtRnJhbWluZyxcbiAgUmVkdWNlcnMsXG4gIFJldml2ZXJzLFxuICBTZXJpYWxpemFibGVTcGVjaWFsLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24vdHlwZXMuanMnO1xuXG4vLyBJbXBvcnQgdHlwZXMgbG9jYWxseSBmb3IgdXNlIHdpdGhpbiB0aGlzIGZpbGUuXG5pbXBvcnQgdHlwZSB7XG4gIEJ5dGVTdHJlYW1GcmFtaW5nLFxuICBSZWR1Y2VycyxcbiAgUmV2aXZlcnMsXG4gIFNlcmlhbGl6YWJsZVNwZWNpYWwsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQ29tcG9zZWQgcmVkdWNlcnMgLS0tLVxuLy8gQ29tcG9zZXMgbW9kdWxhciByZWR1Y2VycyAoY29tbW9uLCBjbGFzcywgc3RlcC1mdW5jdGlvbikgd2l0aFxuLy8gbW9kZS1zcGVjaWZpYyBSZXF1ZXN0L1Jlc3BvbnNlL1N0cmVhbSByZWR1Y2VycyBiZWxvdy5cblxuLyoqXG4gKiBCYXNlIHJlZHVjZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIHN0ZXAtZnVuY3Rpb24gKyBjb21tb24gcmVkdWNlcnMgZnJvbSB0aGUgbW9kdWxhciBtb2R1bGVzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxCYXNlUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgLy8gQ2xhc3MvSW5zdGFuY2UgTVVTVCBjb21lIGJlZm9yZSBFcnJvciBzbyB0aGF0IGN1c3RvbSBFcnJvciBzdWJjbGFzc2VzXG4gIC8vIHdpdGggV09SS0ZMT1dfU0VSSUFMSVpFIHRha2UgcHJlY2VkZW5jZSAoZGV2YWx1ZSB1c2VzIGZpcnN0LW1hdGNoLXdpbnMpLlxuICByZXR1cm4ge1xuICAgIC4uLmdldENsYXNzUmVkdWNlcnMoKSxcbiAgICAuLi5nZXRTdGVwRnVuY3Rpb25SZWR1Y2VyKCksXG4gICAgLi4uZ2V0Q29tbW9uUmVkdWNlcnMoZ2xvYmFsKSxcbiAgICAvLyBSZXF1ZXN0IGFuZCBSZXNwb25zZSByZWR1Y2VycyBhcmUgbW9kZS1zcGVjaWZpYyBhbmQgYWRkZWQgYnlcbiAgICAvLyBnZXRFeHRlcm5hbFJlZHVjZXJzIC8gZ2V0V29ya2Zsb3dSZWR1Y2VycyAvIGdldFN0ZXBSZWR1Y2VycyBiZWxvdy5cbiAgICBSZXF1ZXN0OiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlcXVlc3QpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBkYXRhOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZXF1ZXN0J10gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICB1cmw6IHZhbHVlLnVybCxcbiAgICAgICAgaGVhZGVyczogdmFsdWUuaGVhZGVycyxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgZHVwbGV4OiB2YWx1ZS5kdXBsZXgsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlW1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEVdO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgZGF0YS5yZXNwb25zZVdyaXRhYmxlID0gcmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIH1cbiAgICAgIC8vIEZvcndhcmQgdGhlIHNpZ25hbCBpbiB0d28gY2FzZXM6XG4gICAgICAvLyAgIDEuIEFscmVhZHkgYWJvcnRlZCDigJQgcHJlc2VydmUgYWJvcnRlZD10cnVlL3JlYXNvbiBzbyB0aGUgaHlkcmF0ZWRcbiAgICAgIC8vICAgICAgc3RlcCBzZWVzIHRoZSBjYW5jZWxsYXRpb24gdGhhdCBoYXBwZW5lZCBiZWZvcmUgc2VyaWFsaXplLlxuICAgICAgLy8gICAyLiBBbHJlYWR5IHRhZ2dlZCB3aXRoIHdvcmtmbG93IGluZnJhc3RydWN0dXJlIOKAlCBpLmUuIGEgc2lnbmFsXG4gICAgICAvLyAgICAgIGZyb20gYSB3b3JrZmxvdy1tYW5hZ2VkIEFib3J0Q29udHJvbGxlciwgd2hpY2ggaGFzIHN0cmVhbS9ob29rXG4gICAgICAvLyAgICAgIGJhY2tpbmcgZm9yIGNyb3NzLWJvdW5kYXJ5IHByb3BhZ2F0aW9uLlxuICAgICAgLy8gUGxhaW4gbm9uLWFib3J0ZWQgbmF0aXZlIHNpZ25hbHMgYXJlIGludGVudGlvbmFsbHkgZHJvcHBlZCAod291bGRcbiAgICAgIC8vIG1pbnQgc3RyZWFtIGluZnJhIGZvciBldmVyeSBSZXF1ZXN0LCBpbmNsdWRpbmcgdGhlIGF1dG8tZ2VuZXJhdGVkXG4gICAgICAvLyBzaWduYWwgb24gYG5ldyBSZXF1ZXN0KHVybClgKS5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUuc2lnbmFsICYmXG4gICAgICAgICh2YWx1ZS5zaWduYWwuYWJvcnRlZCB8fFxuICAgICAgICAgICh2YWx1ZS5zaWduYWwgYXMgQWJvcnRJbnRlcm5hbHMpW0FCT1JUX1NUUkVBTV9OQU1FXSlcbiAgICAgICkge1xuICAgICAgICBkYXRhLnNpZ25hbCA9IHZhbHVlLnNpZ25hbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVzcG9uc2UpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICB1cmw6IHZhbHVlLnVybCxcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHZhbHVlLmhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIHJlZGlyZWN0ZWQ6IHZhbHVlLnJlZGlyZWN0ZWQsXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2hhcmVkIGFib3J0IHJlZHVjZXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgQWJvcnRTZXJpYWxpemVkRGF0YSA9IHtcbiAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICBob29rVG9rZW46IHN0cmluZztcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uOiB1bmtub3duO1xufTtcblxuLyoqXG4gKiBTeW1ib2wta2V5ZWQgaW50ZXJuYWwgZmllbGRzIHRhZ2dlZCBvbnRvIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbFxuICogaW5zdGFuY2VzIChhbmQgYGhvbGRlcmBzIGluIHJlZHVjZXIgaGVscGVycykuIEFsbCBvcHRpb25hbCDigJQgYSBwbGFpblxuICogbmF0aXZlIGluc3RhbmNlIGhhcyBub25lIG9mIHRoZW0gc2V0LlxuICovXG50eXBlIEFib3J0SW50ZXJuYWxzID0ge1xuICBbQUJPUlRfU1RSRUFNX05BTUVdPzogc3RyaW5nO1xuICBbQUJPUlRfSE9PS19UT0tFTl0/OiBzdHJpbmc7XG4gIFtBQk9SVF9SRUFERVJfQ0FOQ0VMXT86IEFib3J0Q29udHJvbGxlcjtcbn07XG5cbnR5cGUgQWJvcnRTaWduYWxMaWtlID0gQWJvcnRJbnRlcm5hbHMgJiB7XG4gIGFib3J0ZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHVua25vd247XG4gIGFkZEV2ZW50TGlzdGVuZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgQWJvcnRIb2xkZXIgPSBBYm9ydEludGVybmFscyAmIHsgc2lnbmFsPzogQWJvcnRJbnRlcm5hbHMgfTtcblxuLyoqXG4gKiBTaGFyZWQgbG9naWMgZm9yIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZWR1Y2VycyBpbiBleHRlcm5hbCBhbmQgc3RlcFxuICogY29udGV4dHMuIEFzc2lnbnMgc3RyZWFtL2hvb2sgbmFtZXMgaWYgbm90IGFscmVhZHkgcHJlc2VudCwgb3B0aW9uYWxseVxuICogYXR0YWNoZXMgYW4gYWJvcnQgbGlzdGVuZXIgZm9yIHJlYWwtdGltZSBwcm9wYWdhdGlvbiwgYW5kIHJldHVybnMgdGhlXG4gKiBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uLlxuICovXG5mdW5jdGlvbiByZWR1Y2VBYm9ydFdpdGhMaXN0ZW5lcihcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbExpa2UsXG4gIGhvbGRlcjogQWJvcnRIb2xkZXIsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBBYm9ydFNlcmlhbGl6ZWREYXRhIHtcbiAgbGV0IHN0cmVhbU5hbWUgPSBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdO1xuICBsZXQgaG9va1Rva2VuID0gaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dO1xuICBpZiAoIXN0cmVhbU5hbWUpIHtcbiAgICBjb25zdCBpZCA9ICgoZ2xvYmFsIGFzIGFueSlbU1RBQkxFX1VMSURdIHx8IGRlZmF1bHRVbGlkKSgpO1xuICAgIHN0cmVhbU5hbWUgPSBnZXRBYm9ydFN0cmVhbUlkKGlkKTtcbiAgICBob29rVG9rZW4gPSBgYWJydF8ke2lkfWA7XG4gICAgaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICAgIGlmIChob2xkZXIuc2lnbmFsKSB7XG4gICAgICBob2xkZXIuc2lnbmFsW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gICAgICBob2xkZXIuc2lnbmFsW0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZHVwZWQgdmlhIEFCT1JUX0xJU1RFTkVSX0FUVEFDSEVEIG1hcmtlciDigJQgc2VlIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlLlxuICBhdHRhY2hBYm9ydExpc3RlbmVyT25jZShcbiAgICBzaWduYWwgYXMgQWJvcnRTaWduYWwsXG4gICAgc3RyZWFtTmFtZSxcbiAgICBydW5JZCxcbiAgICBjcnlwdG9LZXksXG4gICAgb3BzXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW1OYW1lLFxuICAgIGhvb2tUb2tlbjogaG9va1Rva2VuISxcbiAgICBhYm9ydGVkOiBzaWduYWwuYWJvcnRlZCxcbiAgICByZWFzb246IHNpZ25hbC5hYm9ydGVkID8gc2lnbmFsLnJlYXNvbiA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGFyZWQgbG9naWMgZm9yIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCByZWR1Y2VycyBpbiB3b3JrZmxvdyBjb250ZXh0LlxuICogUmVhZHMgZXhpc3Rpbmcgc3RyZWFtL2hvb2sgbmFtZXMgZnJvbSBzeW1ib2xzIChtdXN0IGFscmVhZHkgYmUgc2V0KS5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlQWJvcnRCeVN5bWJvbChcbiAgc2lnbmFsOiB7IGFib3J0ZWQ6IGJvb2xlYW47IHJlYXNvbj86IHVua25vd24gfSxcbiAgaG9sZGVyOiBBYm9ydEhvbGRlclxuKTogQWJvcnRTZXJpYWxpemVkRGF0YSB8IGZhbHNlIHtcbiAgY29uc3Qgc3RyZWFtTmFtZSA9XG4gICAgaG9sZGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA/PyBob2xkZXIuc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICBjb25zdCBob29rVG9rZW4gPVxuICAgIGhvbGRlcltBQk9SVF9IT09LX1RPS0VOXSA/PyBob2xkZXIuc2lnbmFsPy5bQUJPUlRfSE9PS19UT0tFTl07XG4gIGlmICghc3RyZWFtTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHN0cmVhbSBuYW1lIGlzIG5vdCBzZXQnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0cmVhbU5hbWUsXG4gICAgaG9va1Rva2VuOiBob29rVG9rZW4hLFxuICAgIGFib3J0ZWQ6IHNpZ25hbC5hYm9ydGVkLFxuICAgIHJlYXNvbjogc2lnbmFsLmFib3J0ZWQgPyBzaWduYWwucmVhc29uIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhIHNpbmdsZSBhYm9ydCBsaXN0ZW5lciB0byBhIHNpZ25hbCwgZGVkdXBlZCBhY3Jvc3MgY2FsbHMuXG4gKlxuICogRWFjaCBzZXJpYWxpemF0aW9uIHBhc3MgZ29lcyB0aHJvdWdoIHRoZSByZWR1Y2VyLCBidXQgYSBjb250cm9sbGVyIHBhc3NlZFxuICogdG8gTiBzdGVwcyB3b3VsZCBvdGhlcndpc2UgYWNjdW11bGF0ZSBOIGxpc3RlbmVycyDigJQgZWFjaCB3cml0aW5nIHRoZSBzYW1lXG4gKiBzdHJlYW0gcGFja2V0IGFuZCBkb3VibGUtY2xvc2luZyB0aGUgc3RyZWFtIG9uIGFib3J0LiBUaGUgbWFya2VyIHN5bWJvbFxuICogZW5zdXJlcyB0aGUgc3RyZWFtLXdyaXRlIHNpZGUtZWZmZWN0IHJ1bnMgYXQgbW9zdCBvbmNlIHBlciAoc2lnbmFsLCBydW5JZCkuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEFib3J0TGlzdGVuZXJPbmNlKFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICBzdHJlYW1OYW1lOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXVxuKTogdm9pZCB7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICBpZiAoKHNpZ25hbCBhcyBhbnkpW0FCT1JUX0xJU1RFTkVSX0FUVEFDSEVEXSkgcmV0dXJuO1xuICAoc2lnbmFsIGFzIGFueSlbQUJPUlRfTElTVEVORVJfQVRUQUNIRURdID0gdHJ1ZTtcblxuICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAnYWJvcnQnLFxuICAgICgpID0+IHtcbiAgICAgIG9wcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBEZWh5ZHJhdGUgdmlhIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgcmVhZGVyIHVzZXMgKGh5ZHJhdGVTdGVwQXJndW1lbnRzKVxuICAgICAgICAgICAgLy8gc28gdGhlIHJlYXNvbiByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eSAoRE9NRXhjZXB0aW9uLFxuICAgICAgICAgICAgLy8gRXJyb3JzLCBjdXN0b20gY2xhc3NlcywgZXRjLikgYW5kIHJlc3BlY3RzIHRoZSBydW4ncyBlbmNyeXB0aW9uIGtleS5cbiAgICAgICAgICAgIC8vIEEgYmFyZSBKU09OLnN0cmluZ2lmeSBoZXJlIHdvdWxkIHdyaXRlIGEgcGFja2V0IHRoZSByZWFkZXIgY2FuJ3RcbiAgICAgICAgICAgIC8vIGRlY29kZSBhbmQgdGhlIGxpc3RlbmVyLXNpZGUgYWJvcnQgd291bGQgcHJvcGFnYXRlIHdpdGggbm8gcmVhc29uLlxuICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcmVzb2x2ZUVuY3J5cHRpb25LZXkoY3J5cHRvS2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbjogc2lnbmFsLnJlYXNvbiB9LFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG4gICAgfSxcbiAgICB7IG9uY2U6IHRydWUgfVxuICApO1xufVxuXG4vKipcbiAqIFJlZHVjZXJzIGZvciBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gdGhlIGNsaWVudCBzaWRlLCBwYXNzaW5nIGFyZ3VtZW50c1xuICogdG8gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKiBAcGFyYW0gY3J5cHRvS2V5XG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGVuIGB0cnVlYCwgYnl0ZSBzdHJlYW1zIChgdHlwZTogJ2J5dGVzJ2ApXG4gKiAgIGFyZSB3cmFwcGVkIGluIGxlbmd0aC1wcmVmaXhlZCBmcmFtZXMgb24gdGhlIHdpcmUgc28gdGhlIGNvbnN1bWVyXG4gKiAgIGNhbiByZWNvbm5lY3Qgb24gdHJhbnNpZW50IGVycm9ycy4gU2hvdWxkIG1hdGNoIHRoZSB0YXJnZXQgcnVuJ3NcbiAqICAgY2FwYWJpbGl0eSDigJQgc2VlIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0c1xuICogICB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxSZWR1Y2VycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICAvLyBUdXJibyBvcHRpbWlzdGljIHN0YXJ0OiBhIG5lc3RlZCBgUmVhZGFibGVTdHJlYW1gIGZvdW5kIHdoaWxlIHNlcmlhbGl6aW5nXG4gIC8vIGlzIHBpcGVkIHRvIGl0cyBvd24gc2VydmVyIHN0cmVhbSBpbmRlcGVuZGVudGx5IG9mIHRoZSBvdXRlciBzaW5rLCBzbyBpdHNcbiAgLy8gZmlyc3QgY2h1bmsgY2FuIHJhY2UgYHJ1bl9zdGFydGVkYC4gVGhyZWFkIHRoZSBydW4tcmVhZHkgYmFycmllciBpbnRvIHRoYXRcbiAgLy8gc2luayBzbyB0aGUgd3JpdGUgb3JkZXJzIGFmdGVyIHRoZSBydW4gZXhpc3RzLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvXG4gIC8vIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZWFkYWJsZVN0cmVhbSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gU3RyZWFtIG11c3Qgbm90IGJlIGxvY2tlZCB3aGVuIHBhc3NpbmcgYWNyb3NzIGV4ZWN1dGlvbiBib3VuZGFyeVxuICAgICAgaWYgKHZhbHVlLmxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICdSZWFkYWJsZVN0cmVhbSBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBwYXNzZWQgYWNyb3NzIGEgd29ya2Zsb3cgYm91bmRhcnkuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnUGFzcyB0aGUgc3RyZWFtIGJlZm9yZSBjYWxsaW5nIC5nZXRSZWFkZXIoKSAvIC5waXBlVGhyb3VnaCgpIC8gLnBpcGVUbygpLCBvciB0ZWUgaXQgd2l0aCAudGVlKCkgYW5kIHBhc3Mgb25lIG9mIHRoZSBicmFuY2hlcy4nLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICBjb25zdCB0eXBlID0gZ2V0U3RyZWFtVHlwZSh2YWx1ZSk7XG5cbiAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICk7XG4gICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJykge1xuICAgICAgICBpZiAoZnJhbWVkQnl0ZVN0cmVhbXMpIHtcbiAgICAgICAgICBvcHMucHVzaCh2YWx1ZS5waXBlVGhyb3VnaChnZXRCeXRlRnJhbWluZ1N0cmVhbSgpKS5waXBlVG8od3JpdGFibGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHMucHVzaCh2YWx1ZS5waXBlVG8od3JpdGFibGUpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIC5waXBlVGhyb3VnaChcbiAgICAgICAgICAgICAgZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoXG4gICAgICAgICAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgIGNyeXB0b0tleSxcbiAgICAgICAgICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgczogU2VyaWFsaXphYmxlU3BlY2lhbFsnUmVhZGFibGVTdHJlYW0nXSA9IHsgbmFtZSB9O1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBpZiAodHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcykgcy5mcmFtaW5nID0gJ2ZyYW1lZC12MSc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogd2hlbiB0aGUgd3JpdGFibGUgaXMgYWxyZWFkeSBiYWNrZWQgYnkgYSB3b3JrZmxvd1xuICAgICAgLy8gc2VydmVyIHN0cmVhbSAoZS5nLiBpdCBjYW1lIGZyb20gYSBzdGVwLWNvbnRleHQgYGdldFdyaXRhYmxlKClgXG4gICAgICAvLyBvciB3YXMgaHlkcmF0ZWQgZnJvbSBhIHdvcmtmbG93IGlucHV0IGJ5IGBnZXRTdGVwUmV2aXZlcnNgKSxcbiAgICAgIC8vIGZvcndhcmQgaXRzIHVuZGVybHlpbmcgYChydW5JZCwgbmFtZSlgIHRvIHRoZSByZWNlaXZpbmcgcnVuLlxuICAgICAgLy8gVGhlIHJlY2VpdmluZyBydW4ncyBzdGVwLXNpZGUgcmV2aXZlciBvcGVucyBhIHNlcnZlciB3cml0YWJsZVxuICAgICAgLy8gYWdhaW5zdCB0aGUgb3JpZ2luYWwgYChydW5JZCwgbmFtZSlgIGFuZCByZXNvbHZlcyB0aGF0IHJ1bidzXG4gICAgICAvLyBlbmNyeXB0aW9uIGtleSBkaXJlY3RseSwgc28gd3JpdGVzIGxhbmQgb24gdGhlIG9yaWdpbmFsIHN0cmVhbVxuICAgICAgLy8gZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSByZWNlaXZpbmcgcnVuIOKAlCBubyBpbi1wcm9jZXNzXG4gICAgICAvLyBicmlkZ2UgdGllZCB0byB0aGUgZGVoeWRyYXRpbmcgc3RlcCdzIGxpZmV0aW1lLlxuICAgICAgY29uc3QgZXhpc3RpbmdOYW1lID0gKHZhbHVlIGFzIGFueSlbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUnVuSWQgPSAodmFsdWUgYXMgYW55KVtTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdOYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdSdW5JZCA9PT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0ge1xuICAgICAgICAgIG5hbWU6IGV4aXN0aW5nTmFtZSxcbiAgICAgICAgICBydW5JZDogZXhpc3RpbmdSdW5JZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdEZXBsb3ltZW50SWQgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdEZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZGVzY3JpcHRvci5kZXBsb3ltZW50SWQgPSBleGlzdGluZ0RlcGxveW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBgc3RybV8ke3N0cmVhbUlkfWA7XG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBuYW1lKTtcbiAgICAgIG9wcy5wdXNoKHJlYWRhYmxlLnBpcGVUbyh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4geyBuYW1lIH07XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRDb250cm9sbGVyIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLnNpZ25hbCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRTaWduYWwgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWR1Y2VycyBmb3Igc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uXG4gKiBlbnZpcm9ubWVudCwgcGFzc2luZyByZXR1cm4gdmFsdWUgdG8gdGhlIGNsaWVudCBzaWRlIGFuZCBpbnRvIHN0ZXAgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1JlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0QWxsQmFzZVJlZHVjZXJzKGdsb2JhbCksXG5cbiAgICAvLyBSZWFkYWJsZS9Xcml0YWJsZSBzdHJlYW1zIGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICAvLyBhcmUgc2ltcGx5IFwiaGFuZGxlc1wiIHRoYXQgY2FuIGJlIHBhc3NlZCBhcm91bmQgdG8gb3RoZXIgc3RlcHMuXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuUmVhZGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBmYWtlIHN0cmVhbSBzdG9yaW5nIEJvZHlJbml0IGZyb20gUmVxdWVzdC9SZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZVtCT0RZX0lOSVRfU1lNQk9MXTtcbiAgICAgIGlmIChib2R5SW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBmYWtlIHN0cmVhbSAtIHNlcmlhbGl6ZSB0aGUgQm9keUluaXQgZGlyZWN0bHlcbiAgICAgICAgLy8gZGV2YWx1ZSB3aWxsIGhhbmRsZSBzZXJpYWxpemluZyBzdHJpbmdzLCBVaW50OEFycmF5LCBldGMuXG4gICAgICAgIHJldHVybiB7IGJvZHlJbml0IH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZVtTVFJFQU1fTkFNRV9TWU1CT0xdO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignUmVhZGFibGVTdHJlYW0gYG5hbWVgIGlzIG5vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZVtTVFJFQU1fVFlQRV9TWU1CT0xdO1xuICAgICAgaWYgKHR5cGUpIHMudHlwZSA9IHR5cGU7XG4gICAgICBjb25zdCBmcmFtaW5nOiBCeXRlU3RyZWFtRnJhbWluZyB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHZhbHVlW1NUUkVBTV9GUkFNSU5HX1NZTUJPTF07XG4gICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlU3RyZWFtIGBuYW1lYCBpcyBub3Qgc2V0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzOiBTZXJpYWxpemFibGVTcGVjaWFsWydXcml0YWJsZVN0cmVhbSddID0geyBuYW1lIH07XG4gICAgICAvLyBXaGVuIHRoZSBoYW5kbGUgd2FzIGZvcndhcmRlZCBmcm9tIGFub3RoZXIgcnVuIChwYXJlbnQg4oaSIGNoaWxkXG4gICAgICAvLyB2aWEgYHN0YXJ0KClgKSwgcHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQgc28gdGhlIHN0ZXAtc2lkZVxuICAgICAgLy8gcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgY29uc3QgZm9yZWlnblJ1bklkID0gdmFsdWVbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPSB2YWx1ZVtTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnbkRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5kZXBsb3ltZW50SWQgPSBmb3JlaWduRGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIC8vIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBpbiB3b3JrZmxvdyBjb250ZXh0IOKAlCBqdXN0IHJlYWQgc3ltYm9scyAoaGFuZGxlcykuXG4gICAgLy8gSW4gdGhlIHdvcmtmbG93IFZNLCBnbG9iYWwuQWJvcnRDb250cm9sbGVyIGlzIGEgY2xhc3MgYnV0IGdsb2JhbC5BYm9ydFNpZ25hbFxuICAgIC8vIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyksIHNvIGluc3RhbmNlb2YgY2hlY2tzIHdvbid0IHdvcmsgZm9yIHNpZ25hbHMuXG4gICAgLy8gRGV0ZWN0IGluc3RhbmNlcyBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIEFCT1JUX1NUUkVBTV9OQU1FIHN5bWJvbCBpbnN0ZWFkLlxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlIHx8ICF2YWx1ZS5zaWduYWwpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGhvbGRlciA9IHZhbHVlIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SG9sZGVyO1xuICAgICAgY29uc3QgaGFzQWJvcnRTeW1ib2wgPVxuICAgICAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9TVFJFQU1fTkFNRV07XG4gICAgICBjb25zdCBpc05hdGl2ZUFib3J0Q29udHJvbGxlciA9XG4gICAgICAgIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgJiZcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyO1xuICAgICAgaWYgKCFoYXNBYm9ydFN5bWJvbCAmJiAhaXNOYXRpdmVBYm9ydENvbnRyb2xsZXIpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlLnNpZ25hbCwgaG9sZGVyKTtcbiAgICB9LFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IHZhbHVlIGFzIChBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKSB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc0Fib3J0U3ltYm9sID0gc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICAgICAgY29uc3QgaXNOYXRpdmVBYm9ydFNpZ25hbCA9XG4gICAgICAgIGdsb2JhbC5BYm9ydFNpZ25hbCAmJlxuICAgICAgICB0eXBlb2YgZ2xvYmFsLkFib3J0U2lnbmFsID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsO1xuICAgICAgaWYgKCFoYXNBYm9ydFN5bWJvbCAmJiAhaXNOYXRpdmVBYm9ydFNpZ25hbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHJlZHVjZUFib3J0QnlTeW1ib2wodmFsdWUsIHZhbHVlIGFzIEFib3J0SG9sZGVyKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlZHVjZXJzIGZvciBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHBhc3NpbmcgcmV0dXJuIHZhbHVlIHRvIHRoZSB3b3JrZmxvdyBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSBnbG9iYWxcbiAqIEBwYXJhbSBvcHNcbiAqIEBwYXJhbSBydW5JZFxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0U3RlcFJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgcmV0dXJuZWQgYFJlYWRhYmxlU3RyZWFtYCBpcyBwaXBlZCB0byB0aGUgc2VydmVyXG4gIC8vIGFmdGVyIHRoZSBib2R5IGJ1dCB3aXRoaW4gdGhlIHNhbWUgb3AgZmx1c2gsIHNvIGl0cyBmaXJzdCBjaHVuayBjYW4gcmFjZVxuICAvLyBgcnVuX3N0YXJ0ZWRgLiBUaHJlYWQgdGhlIHJ1bi1yZWFkeSBiYXJyaWVyIGludG8gdGhlIHNpbmsgc28gdGhhdCB3cml0ZVxuICAvLyBvcmRlcnMgYWZ0ZXIgdGhlIHJ1biBleGlzdHMuIFVuZGVmaW5lZCBvdXRzaWRlIHR1cmJvIC8gb24gdGhlIGF3YWl0IHBhdGguXG4gIHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj5cbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRBbGxCYXNlUmVkdWNlcnMoZ2xvYmFsKSxcblxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlYWRhYmxlU3RyZWFtKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBTdHJlYW0gbXVzdCBub3QgYmUgbG9ja2VkIHdoZW4gcGFzc2luZyBhY3Jvc3MgZXhlY3V0aW9uIGJvdW5kYXJ5XG4gICAgICBpZiAodmFsdWUubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgJ1JlYWRhYmxlU3RyZWFtIGlzIGxvY2tlZCBhbmQgY2Fubm90IGJlIHBhc3NlZCBhY3Jvc3MgYSB3b3JrZmxvdyBib3VuZGFyeS4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhpbnQ6ICdQYXNzIHRoZSBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgLmdldFJlYWRlcigpIC8gLnBpcGVUaHJvdWdoKCkgLyAucGlwZVRvKCksIG9yIHRlZSBpdCB3aXRoIC50ZWUoKSBhbmQgcGFzcyBvbmUgb2YgdGhlIGJyYW5jaGVzLicsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3RyZWFtIGFscmVhZHkgaGFzIHRoZSBuYW1lIHN5bWJvbCBzZXQsIGluIHdoaWNoIGNhc2VcbiAgICAgIC8vIGl0J3MgYWxyZWFkeSBiZWluZyBzdW5rIHRvIHRoZSBzZXJ2ZXIgYW5kIHdlIGNhbiBqdXN0IHJldHVybiB0aGVcbiAgICAgIC8vIG5hbWUgYW5kIHR5cGUuXG4gICAgICBsZXQgbmFtZSA9IHZhbHVlW1NUUkVBTV9OQU1FX1NZTUJPTF07XG4gICAgICBsZXQgdHlwZSA9IHZhbHVlW1NUUkVBTV9UWVBFX1NZTUJPTF07XG4gICAgICAvLyBUaGUgZnJhbWluZyBzeW1ib2wgaXMgc2V0IHdoZW4gYSB3b3JrZmxvdyBWTSByZXZpdmVzIGEgc3RyZWFtXG4gICAgICAvLyBoYW5kbGUgZnJvbSBhIHByZXZpb3VzIHN0ZXAgKHNlZSBgZ2V0V29ya2Zsb3dSZXZpdmVyc2ApLiBXaGVuXG4gICAgICAvLyBwcmVzZW50IHdlIG11c3QgcHJvcGFnYXRlIHRoZSBzYW1lIGZyYW1pbmcgY2hvaWNlIG9uIHRoZSB3YXlcbiAgICAgIC8vIGJhY2sgb3V0LCBzaW5jZSB0aGUgYnl0ZXMgYWxyZWFkeSBvbiB0aGUgc2VydmVyJ3Mgc3RyZWFtIGFyZSBpblxuICAgICAgLy8gdGhhdCBmb3JtYXQg4oCUIHN3aXRjaGluZyBmb3JtYXQgbWlkLXN0cmVhbSB3b3VsZCBjb3JydXB0IHRoZW0uXG4gICAgICBsZXQgZnJhbWluZzogQnl0ZVN0cmVhbUZyYW1pbmcgfCB1bmRlZmluZWQgPSB2YWx1ZVtTVFJFQU1fRlJBTUlOR19TWU1CT0xdO1xuXG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgdHlwZSA9IGdldFN0cmVhbVR5cGUodmFsdWUpO1xuICAgICAgICBmcmFtaW5nID0gdHlwZSA9PT0gJ2J5dGVzJyAmJiBmcmFtZWRCeXRlU3RyZWFtcyA/ICdmcmFtZWQtdjEnIDogZnJhbWluZztcblxuICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgaWYgKGZyYW1pbmcgPT09ICdmcmFtZWQtdjEnKSB7XG4gICAgICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICAgICAgdmFsdWUucGlwZVRocm91Z2goZ2V0Qnl0ZUZyYW1pbmdTdHJlYW0oKSkucGlwZVRvKHdyaXRhYmxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3BzLnB1c2godmFsdWUucGlwZVRvKHdyaXRhYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgLnBpcGVUaHJvdWdoKFxuICAgICAgICAgICAgICAgIGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICAgICAgICAgICAgICAgIGdldFN0ZXBSZWR1Y2VycyhcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjcnlwdG9LZXksXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjcnlwdG9LZXlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnBpcGVUbyh3cml0YWJsZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JlYWRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlKSBzLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKGZyYW1pbmcpIHMuZnJhbWluZyA9IGZyYW1pbmc7XG4gICAgICByZXR1cm4gcztcbiAgICB9LFxuXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuV3JpdGFibGVTdHJlYW0pKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGxldCBuYW1lID0gdmFsdWVbU1RSRUFNX05BTUVfU1lNQk9MXTtcbiAgICAgIGNvbnN0IGZvcmVpZ25SdW5JZCA9ICh2YWx1ZSBhcyBhbnkpW1NUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTF07XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtSWQgPSAoKGdsb2JhbCBhcyBhbnkpW1NUQUJMRV9VTElEXSB8fCBkZWZhdWx0VWxpZCkoKTtcbiAgICAgICAgbmFtZSA9IGBzdHJtXyR7c3RyZWFtSWR9YDtcbiAgICAgICAgb3BzLnB1c2goXG4gICAgICAgICAgbmV3IFdvcmtmbG93U2VydmVyUmVhZGFibGVTdHJlYW0ocnVuSWQsIG5hbWUpXG4gICAgICAgICAgICAucGlwZVRocm91Z2goXG4gICAgICAgICAgICAgIGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgICAgICAgIGdldFN0ZXBSZXZpdmVycyhnbG9iYWwsIG9wcywgcnVuSWQsIGNyeXB0b0tleSksXG4gICAgICAgICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlVG8odmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHM6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1dyaXRhYmxlU3RyZWFtJ10gPSB7IG5hbWUgfTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPSAodmFsdWUgYXMgYW55KVtcbiAgICAgICAgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTFxuICAgICAgXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnbkRlcGxveW1lbnRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcy5kZXBsb3ltZW50SWQgPSBmb3JlaWduRGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRDb250cm9sbGVyIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQWJvcnRDb250cm9sbGVyKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLnNpZ25hbCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgb3BzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgY3J5cHRvS2V5XG4gICAgICApO1xuICAgIH0sXG5cbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFnbG9iYWwuQWJvcnRTaWduYWwgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbC5BYm9ydFNpZ25hbCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFib3J0U2lnbmFsKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcmVkdWNlQWJvcnRXaXRoTGlzdGVuZXIoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBvcHMsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBjcnlwdG9LZXlcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYW5jZWwgZGFuZ2xpbmcgYWJvcnQtc3RyZWFtIHJlYWRlcnMgb24gYW55IEFib3J0Q29udHJvbGxlciBpbnN0YW5jZXMgZm91bmRcbiAqIGluIHRoZSBoeWRyYXRlZCBzdGVwIGFyZ3VtZW50cy4gQ2FsbGVkIGFmdGVyIHRoZSBzdGVwIGZ1bmN0aW9uIHJldHVybnNcbiAqIChzdWNjZXNzIG9yIGZhaWx1cmUpIHRvIHByZXZlbnQgcmVhZGVyIHByb21pc2VzIGZyb20ga2VlcGluZyB0aGUgc2VydmVybGVzc1xuICogZnVuY3Rpb24gYWxpdmUgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsQWJvcnRSZWFkZXJzKC4uLnZhbHVlczogdW5rbm93bltdKTogdm9pZCB7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgV2Vha1NldCgpO1xuICBmdW5jdGlvbiBjYW5jZWxJZlByZXNlbnQodmFsOiBBYm9ydEludGVybmFscyk6IHZvaWQge1xuICAgIGNvbnN0IGNhbmNlbCA9IHZhbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXTtcbiAgICBpZiAoY2FuY2VsICYmICFjYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNhbmNlbC5hYm9ydCgpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB3YWxrKHZhbDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGlmICh2aXNpdGVkLmhhcyh2YWwgYXMgb2JqZWN0KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWQuYWRkKHZhbCBhcyBvYmplY3QpO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGNhbmNlbElmUHJlc2VudCh2YWwgYXMgQWJvcnRDb250cm9sbGVyICYgQWJvcnRJbnRlcm5hbHMpO1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbC5zaWduYWwgYXMgQWJvcnRTaWduYWwgJiBBYm9ydEludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgICAgY2FuY2VsSWZQcmVzZW50KHZhbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbCkgd2FsayhpdGVtKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbC52YWx1ZXMoKSkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZhbCkgd2Fsayh2KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVxdWVzdC9SZXNwb25zZSBleHBvc2UgYHNpZ25hbGAvYGJvZHlgIGFzIHByb3RvdHlwZSBnZXR0ZXJzLCBzb1xuICAgIC8vIE9iamVjdC52YWx1ZXMoKSB3b24ndCBmaW5kIHRoZW0uIERlc2NlbmQgZXhwbGljaXRseS5cbiAgICBpZiAodHlwZW9mIFJlcXVlc3QgIT09ICd1bmRlZmluZWQnICYmIHZhbCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHdhbGsodmFsLnNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3QudmFsdWVzKHZhbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHdhbGsodik7XG4gIH1cbiAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykgd2Fsayh2KTtcbn1cblxuLyoqXG4gKiBTZXRzIHVwIGEgc3RyZWFtIHJlYWRlciBvbiB0aGUgY29udHJvbGxlciB0aGF0IGxpc3RlbnMgZm9yIGFuIGFib3J0IHBhY2tldC5cbiAqIFJldHVybnMgdGhlIHJlYWRlckNhbmNlbCBjb250cm9sbGVyIHNvIGl0IGNhbiBiZSBzdG9yZWQgb24gYm90aCB0aGVcbiAqIGNvbnRyb2xsZXIgYW5kIHNpZ25hbCBmb3IgY2xlYW51cCBieSBjYW5jZWxBYm9ydFJlYWRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgcnVuSWQ6IHN0cmluZyxcbiAgc3RyZWFtTmFtZTogc3RyaW5nLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXVxuKTogQWJvcnRDb250cm9sbGVyIHtcbiAgY29uc3QgcmVhZGVyQ2FuY2VsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIG9wcy5wdXNoKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgcmVhZGVyLnJlYWQoKSxcbiAgICAgICAgICBuZXcgUHJvbWlzZTx7IHZhbHVlOiB1bmRlZmluZWQ7IGRvbmU6IHRydWUgfT4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWFkZXJDYW5jZWwuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlckNhbmNlbC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSksXG4gICAgICAgICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAvLyBBbiBhYm9ydCBwYWNrZXQgYXJyaXZlZDogcHJvcGFnYXRlIGl0IGFzIGZhc3QgYXMgcG9zc2libGUuIFJlbGVhc2VcbiAgICAgICAgICAvLyB0aGUgbG9jayAoc3luY2hyb25vdXMpIHJhdGhlciB0aGFuIGNhbmNlbGxpbmcgaGVyZSDigJQgb24gYVxuICAgICAgICAgIC8vIHNlcnZpY2UtYmFja2VkIFdvcmxkIGByZWFkZXIuY2FuY2VsKClgIGNhbiBkbyBhIG5ldHdvcmsgcm91bmQtdHJpcCxcbiAgICAgICAgICAvLyBhbmQgYXdhaXRpbmcgaXQgYmVmb3JlIGBjb250cm9sbGVyLmFib3J0KClgIHdvdWxkIGRlbGF5IChvciwgaWYgaXRcbiAgICAgICAgICAvLyBoYW5ncywgZHJvcCkgcmVhbC10aW1lIGFib3J0IGRlbGl2ZXJ5IHRvIHRoZSBpbi1mbGlnaHQgc3RlcC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBSZWFkZXIgbWF5IGFscmVhZHkgYmUgcmVsZWFzZWQ7IGlnbm9yZS5cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEh5ZHJhdGUgdmlhIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgd3JpdGVyIHVzZWQgc28gdGhlIHJlYXNvblxuICAgICAgICAgICAgLy8gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkuIEVuY3J5cHRpb24ga2V5IChpZiBhbnkpXG4gICAgICAgICAgICAvLyBjb21lcyBmcm9tIHRoZSBzdGVwIGNvbnRleHQg4oCUIHNldCB1cCBieSB0aGUgc3RlcCBoYW5kbGVyIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhpcyByZWFkZXIgcnVucy4gRmFsbGJhY2sgdG8gdW5kZWZpbmVkIGZvciBleHRlcm5hbC1jb250ZXh0XG4gICAgICAgICAgICAvLyByZXZpdmVzICh0aGUgaHlkcmF0ZSBwYXRoIGlzIGVuY3J5cHRpb24ta2V5LXRvbGVyYW50KS5cbiAgICAgICAgICAgIGNvbnN0IGN0eEZvcktleSA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICBjdHhGb3JLZXk/LmVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydChkYXRhPy5yZWFzb24pO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgc3RlcCBmaW5pc2hlZCAob3IgdGhlIHJlYWRlciB3YXMgY2FuY2VsbGVkKSB3aXRob3V0IGFuIGFib3J0LlxuICAgICAgICAgIC8vIENhbmNlbCDigJQgbm90IGp1c3QgcmVsZWFzZSDigJQgc28gdGhlIHVuZGVybHlpbmcgV29ybGQgc3RyZWFtIGlzIHRvcm5cbiAgICAgICAgICAvLyBkb3duOiBhIHBvbGxpbmcgV29ybGQgKGUuZy4gd29ybGQtbG9jYWwpIG90aGVyd2lzZSBsZWFrcyBhIHRhaWxcbiAgICAgICAgICAvLyByZWFkZXIgKGEgMTAwbXMgZmlsZXN5c3RlbSBwb2xsIHBsdXMgZW1pdHRlciBsaXN0ZW5lcnMpIHBlciBzdGVwXG4gICAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3MsIHNpbmNlIGEgc2lnbmFsLWJlYXJpbmcgc3RlcFxuICAgICAgICAgIC8vIG9wZW5zIG9uZSBvZiB0aGVzZSBvbiBldmVyeSByZXZpdmFsIGFuZCB1c3VhbGx5IG5ldmVyIGFib3J0cy4gRmlyZVxuICAgICAgICAgIC8vIGFuZCBmb3JnZXQ6IGEgc2VydmljZS1iYWNrZWQgV29ybGQncyBjYW5jZWwgbWF5IGhpdCB0aGUgbmV0d29yayxcbiAgICAgICAgICAvLyBhbmQgdGhpcyBwYXRoIG11c3Qgbm90IGJsb2NrIHRoZSBzdGVwJ3Mgb3BzLXNldHRsZSB3aW5kb3cuXG4gICAgICAgICAgdm9pZCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3RyZWFtIHJlYWQgZmFpbGVkIOKAlCBzaWduYWwgd29uJ3QgcHJvcGFnYXRlIGluIHJlYWwtdGltZSxcbiAgICAgICAgLy8gYnV0IGhvb2stYmFzZWQgcHJvcGFnYXRpb24gb24gbmV4dCByZXBsYXkgcHJvdmlkZXMgZmFsbGJhY2tcbiAgICAgIH1cbiAgICB9KSgpXG4gICk7XG5cbiAgcmV0dXJuIHJlYWRlckNhbmNlbDtcbn1cblxuLyoqXG4gKiBTdG9yZXMgYWJvcnQgc2VyaWFsaXphdGlvbiBzeW1ib2xzIGFuZCB0aGUgcmVhZGVyQ2FuY2VsIGNvbnRyb2xsZXJcbiAqIG9uIGJvdGggdGhlIGNvbnRyb2xsZXIgYW5kIGl0cyBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIHRhZ0Fib3J0UGFpcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICB2YWx1ZTogeyBzdHJlYW1OYW1lOiBzdHJpbmc7IGhvb2tUb2tlbjogc3RyaW5nIH0sXG4gIHJlYWRlckNhbmNlbD86IEFib3J0Q29udHJvbGxlclxuKTogdm9pZCB7XG4gIGNvbnN0IHRhZ2dlZENvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIEFib3J0Q29udHJvbGxlciAmIEFib3J0SW50ZXJuYWxzO1xuICBjb25zdCB0YWdnZWRTaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCAmIEFib3J0SW50ZXJuYWxzO1xuICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHZhbHVlLnN0cmVhbU5hbWU7XG4gIHRhZ2dlZENvbnRyb2xsZXJbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIHRhZ2dlZFNpZ25hbFtBQk9SVF9TVFJFQU1fTkFNRV0gPSB2YWx1ZS5zdHJlYW1OYW1lO1xuICB0YWdnZWRTaWduYWxbQUJPUlRfSE9PS19UT0tFTl0gPSB2YWx1ZS5ob29rVG9rZW47XG4gIGlmIChyZWFkZXJDYW5jZWwpIHtcbiAgICB0YWdnZWRDb250cm9sbGVyW0FCT1JUX1JFQURFUl9DQU5DRUxdID0gcmVhZGVyQ2FuY2VsO1xuICAgIHRhZ2dlZFNpZ25hbFtBQk9SVF9SRUFERVJfQ0FOQ0VMXSA9IHJlYWRlckNhbmNlbDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BhZ2F0ZSBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIGZyb20gb25lIHNpZ25hbCB0byBhbm90aGVyLiBVc2VkIGJ5IHRoZVxuICogUmVxdWVzdCByZXZpdmVyIGJlY2F1c2UgYG5ldyBSZXF1ZXN0KHVybCwgeyBzaWduYWwgfSlgIGNvcGllcyB0aGUgc2lnbmFsXG4gKiBpbnRlcm5hbGx5IOKAlCB0aGUgY29uc3RydWN0ZWQgYHJlcXVlc3Quc2lnbmFsYCBpcyBhIGZyZXNoIEFib3J0U2lnbmFsIHRoYXRcbiAqIGRvZXNuJ3QgY2Fycnkgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBYm9ydEludGVybmFscyhzcmM6IEFib3J0U2lnbmFsLCBkZXN0OiBBYm9ydFNpZ25hbCk6IHZvaWQge1xuICBjb25zdCBzID0gc3JjIGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGNvbnN0IGQgPSBkZXN0IGFzIEFib3J0U2lnbmFsICYgQWJvcnRJbnRlcm5hbHM7XG4gIGlmIChzW0FCT1JUX1NUUkVBTV9OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9TVFJFQU1fTkFNRV0gPSBzW0FCT1JUX1NUUkVBTV9OQU1FXTtcbiAgfVxuICBpZiAoc1tBQk9SVF9IT09LX1RPS0VOXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZFtBQk9SVF9IT09LX1RPS0VOXSA9IHNbQUJPUlRfSE9PS19UT0tFTl07XG4gIH1cbiAgaWYgKHNbQUJPUlRfUkVBREVSX0NBTkNFTF0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRbQUJPUlRfUkVBREVSX0NBTkNFTF0gPSBzW0FCT1JUX1JFQURFUl9DQU5DRUxdO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBYm9ydENvbnRyb2xsZXIgd2l0aCBzdHJlYW0tYmFja2VkIGFib3J0IHByb3BhZ2F0aW9uLlxuICogVXNlZCBieSBzdGVwIGFuZCBleHRlcm5hbCByZXZpdmVycyB3aGVyZSByZWFsIGFib3J0IHNpZ25hbCBiZWhhdmlvciBpcyBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcmlhbGl6ZWQgYWJvcnQgY29udHJvbGxlci9zaWduYWwgZGF0YVxuICogQHBhcmFtIG9wcyAtIFRoZSBvcHMgYXJyYXkgZm9yIHRyYWNraW5nIGFzeW5jIHdvcmtcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKGZvciBzdHJlYW0gcmVhZHMpXG4gKiBAcmV0dXJucyBBIHJlYWwgQWJvcnRDb250cm9sbGVyIHdpdGggcGF0Y2hlZCBhYm9ydCgpIG1ldGhvZFxuICovXG5mdW5jdGlvbiByZXZpdmVBYm9ydENvbnRyb2xsZXIoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydENvbnRyb2xsZXInXSxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmdcbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICAgIGNvbnRyb2xsZXIuYWJvcnQodmFsdWUucmVhc29uKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5zdHJlYW1OYW1lKSB7XG4gICAgY29uc3QgcmVhZGVyQ2FuY2VsID0gc2V0dXBBYm9ydFN0cmVhbVJlYWRlcihcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBydW5JZCxcbiAgICAgIHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBvcHNcbiAgICApO1xuICAgIHRhZ0Fib3J0UGFpcihjb250cm9sbGVyLCB2YWx1ZSwgcmVhZGVyQ2FuY2VsKTtcbiAgfSBlbHNlIHtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUpO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgYWJvcnQoKSB0byBhbHNvIHdyaXRlIHN0cmVhbSArIHJlc3VtZSBob29rIChmb3Igc3RlcC1pbml0aWF0ZWQgYWJvcnQpXG4gIGNvbnN0IG9yaWdpbmFsQWJvcnQgPSBjb250cm9sbGVyLmFib3J0LmJpbmQoY29udHJvbGxlcik7XG4gIGNvbnRyb2xsZXIuYWJvcnQgPSAocmVhc29uPzogdW5rbm93bikgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgb3JpZ2luYWxBYm9ydChyZWFzb24pO1xuXG4gICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHgub3BzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgYWJvcnQgcGF5bG9hZCB0aHJvdWdoIHRoZSBzYW1lIG1hY2hpbmVyeSB0aGUgaG9va1xuICAgICAgICAgICAgLy8gZXZlbnQgdXNlcyBzbyB0aGUgYHJlYXNvbmAgcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHlcbiAgICAgICAgICAgIC8vIChET01FeGNlcHRpb24sIGN1c3RvbSBlcnJvcnMsIGV0Yy4pIGFuZCByZXNwZWN0cyB0aGUgcnVuJ3NcbiAgICAgICAgICAgIC8vIGVuY3J5cHRpb24ga2V5IOKAlCBzeW1tZXRyaWMgd2l0aCB3aGF0IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgIC8vIHdyaXRlcyBmb3Igd29ya2Zsb3ctaW5pdGlhdGVkIGFib3J0cy5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgICAgICAgICB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9LFxuICAgICAgICAgICAgICBjdHgud29ya2Zsb3dNZXRhZGF0YS53b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgICAgICAgICAgIGN0eC53b3JrZmxvd01ldGFkYXRhLndvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHZhbHVlLnN0cmVhbU5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlci53cml0ZShwYXlsb2FkIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBzdHJlYW0gd3JpdGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgICk7XG5cbiAgICAgIGlmICh2YWx1ZS5ob29rVG9rZW4pIHtcbiAgICAgICAgLy8gVGhlIGR1cmFibGUgaG9vayByZXN1bWUgKHdoaWNoIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IHRoYXRcbiAgICAgICAgLy8gcmVjb3JkcyB0aGlzIGFib3J0IGluIHRoZSB3b3JrZmxvdydzIGV2ZW50IGxvZykgbXVzdCBiZSBjb21taXR0ZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBzdGVwIGNvbXBsZXRlcy4gT3RoZXJ3aXNlIHRoZSB3b3JrZmxvdyBjb250aW51YXRpb25cbiAgICAgICAgLy8gZW5xdWV1ZWQgYnkgYHN0ZXBfY29tcGxldGVkYCBjYW4gYWR2YW5jZSBwYXN0IHRoZSBhYm9ydCDigJQgZGlzcGF0Y2hpbmdcbiAgICAgICAgLy8gYSBsYXRlciBzdGVwIHdpdGggYSBzdGFsZSwgbm9uLWFib3J0ZWQgYHNpZ25hbGAg4oCUIGJlZm9yZSB0aGUgZXZlbnRcbiAgICAgICAgLy8gZXhpc3RzLiBSb3V0ZSBpdCB0byBgcHJlQ29tcGxldGlvbk9wc2AgKGF3YWl0ZWQgaW5saW5lIGJlZm9yZVxuICAgICAgICAvLyBjb21wbGV0aW9uKSByYXRoZXIgdGhhbiBgb3BzYCAoYmVzdC1lZmZvcnQsIGJhY2tncm91bmQpLiBUaGUgc3RyZWFtXG4gICAgICAgIC8vIHdyaXRlIGFib3ZlIHN0YXlzIGluIGBvcHNgOiBpdCBtdXN0IGZpcmUgQVNBUCB0byByZWFjaCBhbiBpbi1mbGlnaHRcbiAgICAgICAgLy8gc2libGluZyBzdGVwIGFuZCBpcyBub3QgdGhlIGR1cmFibGUgcmVjb3JkLlxuICAgICAgICAvLyBTd2FsbG93IGVycm9ycyBoZXJlIHNvIHRoZSBwcm9taXNlIGNhbiBvbmx5IGV2ZXIgZW5mb3JjZSBvcmRlcmluZ1xuICAgICAgICAvLyB3aGVuIGF3YWl0ZWQgKHNlZSB0aGUgbm8tcmVqZWN0IGNvbnRyYWN0IG9uXG4gICAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpOyBhIGZhaWxlZCByZXN1bWUgcmV0cmllcyBvbiBuZXh0IHJlcGxheS5cbiAgICAgICAgY29uc3QgaG9va1Jlc3VtZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVzdW1lSG9vazogcmVzdW1lSG9va0ZuIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgICAgICcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgcmVzdW1lSG9va0ZuKHZhbHVlLmhvb2tUb2tlbiwge1xuICAgICAgICAgICAgICBhYm9ydGVkOiB0cnVlLFxuICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGhvb2sgcmVzdW1lIOKAlCByZXRyeSBvbiBuZXh0IHJlcGxheVxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgY3R4LnByZUNvbXBsZXRpb25PcHMucHVzaChob29rUmVzdW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogUmV2aXZlcyBqdXN0IGFuIEFib3J0U2lnbmFsIHdpdGhvdXQgdGhlIHBhdGNoZWQgYWJvcnQoKSBvdmVyaGVhZC5cbiAqIFVzZWQgd2hlbiBvbmx5IGEgc2lnbmFsIChub3QgYSBjb250cm9sbGVyKSB3YXMgc2VyaWFsaXplZC5cbiAqL1xuZnVuY3Rpb24gcmV2aXZlQWJvcnRTaWduYWwoXG4gIHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsWydBYm9ydFNpZ25hbCddLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogQWJvcnRTaWduYWwge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh2YWx1ZS5hYm9ydGVkKSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgICBjb250cm9sbGVyLmFib3J0KHZhbHVlLnJlYXNvbik7XG4gIH0gZWxzZSBpZiAodmFsdWUuc3RyZWFtTmFtZSkge1xuICAgIGNvbnN0IHJlYWRlckNhbmNlbCA9IHNldHVwQWJvcnRTdHJlYW1SZWFkZXIoXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgcnVuSWQsXG4gICAgICB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgb3BzXG4gICAgKTtcbiAgICB0YWdBYm9ydFBhaXIoY29udHJvbGxlciwgdmFsdWUsIHJlYWRlckNhbmNlbCk7XG4gIH0gZWxzZSB7XG4gICAgdGFnQWJvcnRQYWlyKGNvbnRyb2xsZXIsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbn1cblxuLyoqXG4gKiBCYXNlIHJldml2ZXJzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gYm91bmRhcmllcy5cbiAqIENvbXBvc2VzOiBjbGFzcyArIGNvbW1vbiByZXZpdmVycyBmcm9tIHRoZSBtb2R1bGFyIG1vZHVsZXMuXG4gKlxuICogVGhpcyBpcyBleHBvcnRlZCBiZWNhdXNlIHNlcmlhbGl6YXRpb24tZm9ybWF0LnRzIGFuZCBvdGhlciBmaWxlcyByZWZlcmVuY2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzKSB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0Q2xhc3NSZXZpdmVycyhnbG9iYWwpLFxuICAgIC4uLmdldENvbW1vblJldml2ZXJzRnJvbU1vZHVsZShnbG9iYWwpLFxuICB9IGFzIGNvbnN0IHNhdGlzZmllcyBQYXJ0aWFsPFJldml2ZXJzPjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlbmNyeXB0LW9ubHkga2V5IG5lZWRlZCB3aGVuIGEgY2hpbGQgd3JpdGVzIGludG8gYW5vdGhlciBydW4nc1xuICogc3RyZWFtLiBOZXcgZGVzY3JpcHRvcnMgaW5jbHVkZSB0aGUgb3duZXIncyBkZXBsb3ltZW50IElEOyBkZXNjcmlwdG9yc1xuICogY3JlYXRlZCBieSBvbGRlciBTREsgdmVyc2lvbnMgZmFsbCBiYWNrIHRvIGxvYWRpbmcgdGhlIG93bmluZyBydW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleShcbiAgcnVuSWQ6IHN0cmluZyxcbiAgZGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGlmICghd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCByYXdLZXkgPSBkZXBsb3ltZW50SWRcbiAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4ocnVuSWQsIHsgZGVwbG95bWVudElkIH0pXG4gICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkKSk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5LCBbJ2VuY3J5cHQnXSkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV2aXZlcnMgZm9yIGRlc2VyaWFsaXphdGlvbiBib3VuZGFyeSBmcm9tIHRoZSBjbGllbnQgc2lkZSxcbiAqIHJlY2VpdmluZyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHBhcmFtIG9wc1xuICogQHBhcmFtIHJ1bklkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbFJldml2ZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY3J5cHRvS2V5OiBFbmNyeXB0aW9uS2V5UGFyYW1cbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgZnJvbSB3b3JrZmxvd3MgdG8gY2xpZW50c1xuICAgIFN0ZXBGdW5jdGlvbjogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgJ1N0ZXAgZnVuY3Rpb25zIGNhbm5vdCBiZSBkZXNlcmlhbGl6ZWQgaW4gY2xpZW50IGNvbnRleHQuIFN0ZXAgZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgZnJvbSB3b3JrZmxvd3MuJyxcbiAgICAgICAge1xuICAgICAgICAgIGhpbnQ6ICdBIHN0ZXAgZnVuY3Rpb24gcmVmZXJlbmNlIHJlYWNoZWQgdGhlIGNsaWVudC4gUmV0dXJuIGEgc2VyaWFsaXphYmxlIHZhbHVlIChlLmcuIHRoZSBzdGVwIHJlc3VsdCkgaW5zdGVhZCBvZiB0aGUgc3RlcCBpdHNlbGYuJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhpbnQ6ICdXcmFwIHRoZSB3b3JrZmxvdyB3aXRoIGBzdGFydCh3b3JrZmxvd0ZuLCB7IC4uLiB9KWAgZnJvbSBgd29ya2Zsb3dgIHRvIGJlZ2luIGEgcnVuIGluc3RlYWQgb2YgaW52b2tpbmcgaXQgbGlrZSBhIG5vcm1hbCBmdW5jdGlvbi4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuXG4gICAgUmVxdWVzdDogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gTm90ZTogUmVzcG9uc2UgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIHN0YXR1cywgc3RhdHVzVGV4dCwgYW5kIGhlYWRlcnNcbiAgICAgIC8vIFRoZSB0eXBlLCB1cmwsIGFuZCByZWRpcmVjdGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBhbmQgc2V0IGJ5IHRoZSBjb25zdHJ1Y3RvclxuICAgICAgcmV0dXJuIG5ldyBnbG9iYWwuUmVzcG9uc2UodmFsdWUuYm9keSwge1xuICAgICAgICBzdGF0dXM6IHZhbHVlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogdmFsdWUuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBJZiB0aGlzIGhhcyBib2R5SW5pdCwgaXQgY2FtZSBmcm9tIGEgUmVzcG9uc2UgY29uc3RydWN0b3JcbiAgICAgIC8vIENvbnZlcnQgaXQgdG8gYSBSRUFMIHN0cmVhbSBub3cgdGhhdCB3ZSdyZSBvdXRzaWRlIHRoZSB3b3JrZmxvd1xuICAgICAgaWYgKCdib2R5SW5pdCcgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZS5ib2R5SW5pdDtcbiAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgUmVzcG9uc2UgY29uc3RydWN0b3IgdG8gcHJvcGVybHkgY29udmVydCBCb2R5SW5pdCB0byBSZWFkYWJsZVN0cmVhbVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5ldyBnbG9iYWwuUmVzcG9uc2UoYm9keUluaXQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgLy8gRm9yIGJ5dGUgc3RyZWFtcywgdXNlIGZsdXNoYWJsZSBwaXBlIHdpdGggbG9jayBwb2xsaW5nLlxuICAgICAgICAvLyBJZiB0aGUgcHJvZHVjZXIgd3JvdGUgZnJhbWVkIGJ5dGVzIChmcmFtaW5nID09PSAnZnJhbWVkLXYxJyksXG4gICAgICAgIC8vIHVud3JhcCB0aGUgbGVuZ3RoLXByZWZpeCBlbnZlbG9wZSBiZWZvcmUgaGFuZGluZyBjaHVua3MgdG9cbiAgICAgICAgLy8gdGhlIHVzZXIuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlcyDigJRcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vIGF1dG8tcmVjb25uZWN0IGhlcmUgeWV0OiByYXcgYnl0ZSBzdHJlYW1zIGhhdmUgbm8gd2lyZVxuICAgICAgICAvLyBmcmFtaW5nIHRvIGNvdW50IGNvbnN1bWVkIGNodW5rcyB3aXRoLiBGcmFtZWQtdjEgYnl0ZSBzdHJlYW1zXG4gICAgICAgIC8vIG1ha2UgZnJhbWUgY291bnRpbmcgcG9zc2libGUsIHNvIGV4dGVuZGluZyB0aGUgcmVjb25uZWN0aW5nXG4gICAgICAgIC8vIHJlYWRlciB0byB0aGVtIGlzIGEgc2VwYXJhdGUgZm9sbG93LXVwLlxuICAgICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHZhbHVlLm5hbWUsXG4gICAgICAgICAgdmFsdWUuc3RhcnRJbmRleFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBpZGVudGl0eSAob3IgdW5mcmFtaW5nKSB0cmFuc2Zvcm0gdG8gZ2l2ZSB0aGUgdXNlciBhIHJlYWRhYmxlXG4gICAgICAgIGNvbnN0IHsgcmVhZGFibGU6IHVzZXJSZWFkYWJsZSwgd3JpdGFibGUgfSA9XG4gICAgICAgICAgdmFsdWUuZnJhbWluZyA9PT0gJ2ZyYW1lZC12MSdcbiAgICAgICAgICAgID8gZ2V0Qnl0ZVVuZnJhbWluZ1N0cmVhbSgpXG4gICAgICAgICAgICA6IG5ldyBnbG9iYWwuVHJhbnNmb3JtU3RyZWFtKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIGZsdXNoYWJsZVBpcGUocmVhZGFibGUsIHdyaXRhYmxlLCBzdGF0ZSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IHBvbGxpbmcgdG8gZGV0ZWN0IHdoZW4gdXNlciByZWxlYXNlcyBsb2NrXG4gICAgICAgIHBvbGxSZWFkYWJsZUxvY2sodXNlclJlYWRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJSZWFkYWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vbi1ieXRlIHN0cmVhbXMgY2FycnkgbGVuZ3RoLXByZWZpeGVkIGZyYW1lcywgc28gd2UgY2FuIGNvdW50XG4gICAgICAgIC8vIGNvbXBsZXRlZCBmcmFtZXMgYW5kIHRyYW5zcGFyZW50bHkgcmVjb25uZWN0IHdoZW4gdGhlIHNlcnZlclxuICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGlvbiB0aW1lcyBvdXQgbWlkLXJ1bi5cbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBjcmVhdGVSZWNvbm5lY3RpbmdGcmFtZWRTdHJlYW0oXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdmFsdWUubmFtZSxcbiAgICAgICAgICB2YWx1ZS5zdGFydEluZGV4XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldERlc2VyaWFsaXplU3RyZWFtKFxuICAgICAgICAgIGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBjcnlwdG9LZXkpLFxuICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZSBoYW5kbGluZyBhcyBgZ2V0U3RlcFJldml2ZXJzLldyaXRhYmxlU3RyZWFtYCDigJQgc2VlIGNvbW1lbnRzXG4gICAgICAvLyB0aGVyZSBmb3IgdGhlIGNyb3NzLXJ1biBjYXNlICh3cml0YWJsZSBjYXJyaWVzIGBydW5JZGAgZnJvbVxuICAgICAgLy8gcGFyZW50IOKGkiBjaGlsZCBmb3J3YXJkaW5nIHZpYSBgc3RhcnQoKWApLlxuICAgICAgY29uc3QgdGFyZ2V0UnVuSWQgPSB0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnID8gdmFsdWUucnVuSWQgOiBydW5JZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleSh0YXJnZXRSdW5JZCwgdmFsdWUuZGVwbG95bWVudElkKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKGdsb2JhbCwgb3BzLCB0YXJnZXRSdW5JZCwgdGFyZ2V0S2V5KSxcbiAgICAgICAgdGFyZ2V0S2V5XG4gICAgICApO1xuICAgICAgY29uc3Qgc2VydmVyV3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShcbiAgICAgICAgdGFyZ2V0UnVuSWQsXG4gICAgICAgIHZhbHVlLm5hbWVcbiAgICAgICk7XG5cbiAgICAgIC8vIENyZWF0ZSBmbHVzaGFibGUgc3RhdGUgZm9yIHRoaXMgc3RyZWFtXG4gICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICBvcHMucHVzaChzdGF0ZS5wcm9taXNlKTtcblxuICAgICAgLy8gU3RhcnQgdGhlIGZsdXNoYWJsZSBwaXBlIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICBmbHVzaGFibGVQaXBlKHNlcmlhbGl6ZS5yZWFkYWJsZSwgc2VydmVyV3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBhcmUgaGFuZGxlZCB2aWEgc3RhdGUucmVqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgIHBvbGxXcml0YWJsZUxvY2soc2VyaWFsaXplLndyaXRhYmxlLCBzdGF0ZSk7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9OQU1FX1NZTUJPTCwge1xuICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHRhcmdldFJ1bklkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgc2VyaWFsaXplLndyaXRhYmxlLFxuICAgICAgICAgIFNUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRF9TWU1CT0wsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXJpYWxpemUud3JpdGFibGU7XG4gICAgfSxcblxuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiByZXZpdmVBYm9ydENvbnRyb2xsZXIodmFsdWUsIG9wcywgcnVuSWQpLFxuICAgIEFib3J0U2lnbmFsOiAodmFsdWUpID0+IHJldml2ZUFib3J0U2lnbmFsKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBleGVjdXRpb25cbiAqIGVudmlyb25tZW50LCByZWNlaXZpbmcgYXJndW1lbnRzIGZyb20gdGhlIGNsaWVudCBzaWRlLCBhbmQgcmV0dXJuIHZhbHVlc1xuICogZnJvbSB0aGUgc3RlcHMuXG4gKlxuICogQHBhcmFtIGdsb2JhbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93UmV2aXZlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgIC8vIFN0ZXBGdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0IC0gdXNlcyB0aGUgbW9kdWxhciByZXZpdmVyXG4gICAgLy8gd2hpY2ggY2FsbHMgV09SS0ZMT1dfVVNFX1NURVAgZnJvbSBnbG9iYWwgdG8gcmVjb25zdHJ1Y3Qgc3RlcCBwcm94aWVzXG4gICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcihnbG9iYWwpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVxdWVzdC5wcm90b3R5cGUpO1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBpZiAocmVzcG9uc2VXcml0YWJsZSkge1xuICAgICAgICAodmFsdWUgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHJlc3BvbnNlV3JpdGFibGU7XG4gICAgICAgIGRlbGV0ZSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgICAodmFsdWUgYXMgYW55KS5yZXNwb25kV2l0aCA9ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ2ByZXNwb25kV2l0aCgpYCBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHN0ZXAgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ01vdmUgdGhlIGByZXNwb25kV2l0aCguLi4pYCBjYWxsIGluc2lkZSBhIGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uIOKAlCBpdCBjYW5ub3QgYmUgaW52b2tlZCBmcm9tIGEgd29ya2Zsb3cgY29udGV4dC4nLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICAvLyBXb3JrZmxvdyBmdW5jdGlvbiByZXZpdmVyIGZvciB3b3JrZmxvdyBjb250ZXh0IOKAlCByZXR1cm5zIGEgZnVuY3Rpb24tbGlrZVxuICAgIC8vIG9iamVjdCB3aXRoIC53b3JrZmxvd0lkIHRoYXQgbWltaWNzIHdoYXQgdGhlIFNXQyBjb21waWxlciBwcm9kdWNlcyxcbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+XG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGludDogJ1dyYXAgdGhlIHdvcmtmbG93IHdpdGggYHN0YXJ0KHdvcmtmbG93Rm4sIHsgLi4uIH0pYCBmcm9tIGB3b3JrZmxvd2AgdG8gYmVnaW4gYSBydW4gaW5zdGVhZCBvZiBpbnZva2luZyBpdCBsaWtlIGEgbm9ybWFsIGZ1bmN0aW9uLicsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiB2YWx1ZS53b3JrZmxvd0lkIH1cbiAgICAgICksXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHZhbHVlLCBnbG9iYWwuUmVzcG9uc2UucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBCb2R5SW5pdCB0aGF0IHNob3VsZCBiZSB3cmFwcGVkIGluIGEgZmFrZSBzdHJlYW1cbiAgICAgIGlmICgnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIFJlY3JlYXRlIHRoZSBmYWtlIHN0cmVhbSB3aXRoIHRoZSBCb2R5SW5pdFxuICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUuYm9keUluaXQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZ3VsYXIgc3RyZWFtIGhhbmRsaW5nXG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgIFtTVFJFQU1fTkFNRV9TWU1CT0xdOiB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBbU1RSRUFNX1RZUEVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQ2FycnkgdGhlIHdpcmUtZnJhbWluZyBkZWNpc2lvbiB0aHJvdWdoIHRoZSB3b3JrZmxvdyBWTSBzb1xuICAgICAgICAvLyB0aGF0IHdoZW4gdGhlIGhhbmRsZSBpcyBsYXRlciBwYXNzZWQgdG8gYSBzdGVwICh3aGljaCByZWFkc1xuICAgICAgICAvLyB0aGUgYWN0dWFsIGJ5dGVzIGZyb20gdGhlIHNlcnZlcikgd2Uga25vdyB3aGV0aGVyIHRvIHVuZnJhbWUuXG4gICAgICAgIC8vIERlZmF1bHRzIHRvIHVuZGVmaW5lZCBmb3Igc3RyZWFtcyB3aG9zZSBzZXJpYWxpemVkIHJlZiBkaWRuJ3RcbiAgICAgICAgLy8gY2FycnkgdGhlIGZpZWxkIOKAlCB0aG9zZSBhcmUgdHJlYXRlZCBhcyBsZWdhY3kgcmF3IGJ5dGVzLlxuICAgICAgICBbU1RSRUFNX0ZSQU1JTkdfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5mcmFtaW5nLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yTWFwID0ge1xuICAgICAgICBbU1RSRUFNX05BTUVfU1lNQk9MXToge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZCwgaWYgcHJlc2VudCwgc28gdGhhdCB3aGVuIHRoZVxuICAgICAgLy8gaGFuZGxlIGlzIGxhdGVyIHBhc3NlZCB0byBhIHN0ZXAgdGhlIHdvcmtmbG93IHJlZHVjZXIgY2FuXG4gICAgICAvLyBmb3J3YXJkIGl0IHRocm91Z2ggdG8gdGhlIHN0ZXAgcmV2aXZlci5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUucnVuSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MXSA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUucnVuSWQsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTF0gPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnbG9iYWwuV3JpdGFibGVTdHJlYW0ucHJvdG90eXBlLCBkZXNjcmlwdG9yKTtcbiAgICB9LFxuXG4gICAgLy8gQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHJldml2ZWQgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTS4gVXNlIHRoZVxuICAgIC8vIHJlYWwgV29ya2Zsb3dBYm9ydFNpZ25hbCBjbGFzcyBzbyBhZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGZuKSBhY3R1YWxseVxuICAgIC8vIGZpcmVzIHdoZW4gdGhlIHNpZ25hbCBhYm9ydHMgKHRoZSBwcmV2aW91cyBuby1vcCBzdHViIHNpbGVudGx5IGRyb3BwZWRcbiAgICAvLyBsaXN0ZW5lciByZWdpc3RyYXRpb25zIOKAlCBzaWxlbnQgY29ycmVjdG5lc3MgYnVnIGZvciBuYXR1cmFsIHBhdHRlcm5zXG4gICAgLy8gbGlrZSBgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pYCBhZnRlciByZWNlaXZpbmcgYSBkZXNlcmlhbGl6ZWRcbiAgICAvLyBzaWduYWwpLiBUaGUgc2lnbmFsIGRvZXMgbm90IG93biBhIGhvb2sgc3Vic2NyaXB0aW9uIGhlcmUg4oCUIGFib3J0IHN0YXRlXG4gICAgLy8gaXMgZGVsaXZlcmVkIHZpYSB0aGUgZXhpc3RpbmcgcmVwbGF5IG1hY2hpbmVyeSBvbiB0aGUgc291cmNlIHNpZGUuXG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHZhbHVlLnN0cmVhbU5hbWUsIHZhbHVlLmhvb2tUb2tlbik7XG4gICAgICBpZiAodmFsdWUuYWJvcnRlZCkgc2lnbmFsLl9zZXRBYm9ydGVkKHZhbHVlLnJlYXNvbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbQUJPUlRfU1RSRUFNX05BTUVdOiB2YWx1ZS5zdHJlYW1OYW1lLFxuICAgICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICB9O1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwodmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgICAgIGlmICh2YWx1ZS5hYm9ydGVkKSBzaWduYWwuX3NldEFib3J0ZWQodmFsdWUucmVhc29uKTtcbiAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uIGJvdW5kYXJ5IGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvblxuICogZW52aXJvbm1lbnQsIHJlY2VpdmluZyBhcmd1bWVudHMgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsXG4gKiBAcGFyYW0gb3BzXG4gKiBAcGFyYW0gcnVuSWRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldFN0ZXBSZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNyeXB0b0tleTogRW5jcnlwdGlvbktleVBhcmFtLFxuICBkZXBsb3ltZW50SWQ/OiBzdHJpbmdcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuXG4gICAgLy8gU3RlcEZ1bmN0aW9uIHJldml2ZXIgZm9yIHN0ZXAgY29udGV4dCAtIHJldHVybnMgcmF3IHN0ZXAgZnVuY3Rpb25cbiAgICAvLyB3aXRoIGNsb3N1cmUgdmFyaWFibGUgc3VwcG9ydCB2aWEgQXN5bmNMb2NhbFN0b3JhZ2UuXG4gICAgLy9cbiAgICAvLyBIYW5kbGVzIGZvdXIgaW5kZXBlbmRlbnQgZmxhZ3MgZnJvbSB0aGUgc2VyaWFsaXplZCBwYXlsb2FkOlxuICAgIC8vICAgLSBgY2xvc3VyZVZhcnNgOiBpbnZva2UgdGhlIGJvZHkgaW5zaWRlIGFuIEFzeW5jTG9jYWxTdG9yYWdlIGZyYW1lXG4gICAgLy8gICAgIHNvIHRoZSBTV0MtZW1pdHRlZCBgV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0VgIElJRkUgaW4gdGhlXG4gICAgLy8gICAgIGhvaXN0ZWQgYm9keSBjYW4gcHVsbCB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgYmFjayBvdXQuXG4gICAgLy8gICAtIGBib3VuZFRoaXNgOiAgIGEgYHRoaXNgIHZhbHVlIGNhcHR1cmVkIGJ5XG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgaW4gdGhlIHdvcmtmbG93IGJ1bmRsZSAobGV4aWNhbC1gdGhpc2BcbiAgICAvLyAgICAgYXJyb3cgc3RlcHMpLiBUaGUgd3JhcHBlciBpbnZva2VzIHRoZSBib2R5IHZpYVxuICAgIC8vICAgICBgc3RlcEZuLmFwcGx5KGJvdW5kVGhpcywgYXJncylgIHNvIHRoZSBib2R5IHNlZXMgdGhlIHNhbWVcbiAgICAvLyAgICAgYHRoaXNgIGl0IHdvdWxkIGhhdmUgaGFkIGluIHRoZSB3b3JrZmxvdyBidW5kbGUuIFByb3BlcnR5XG4gICAgLy8gICAgIHByZXNlbmNlIOKAlCBub3QgdHJ1dGhpbmVzcyDigJQgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZVxuICAgIC8vICAgICBgYmluZChudWxsKWAgYW5kIGBiaW5kKHVuZGVmaW5lZClgIGFyZSBib3RoIGxlZ2FsIGFuZCBzaG91bGRcbiAgICAvLyAgICAgcm91bmQtdHJpcCBmYWl0aGZ1bGx5LlxuICAgIC8vICAgLSBgYm91bmRBcmdzYDogICBwcmVmaWxsZWQgYXJncyBmcm9tXG4gICAgLy8gICAgIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzQXJnLCB4LCB5KWAuIFByZXBlbmRlZCB0byB0aGUgY2FsbCBhcmdzXG4gICAgLy8gICAgIHNvIHBhcnRpYWwgYXBwbGljYXRpb24gc3Vydml2ZXMgc2VyaWFsaXphdGlvbi5cbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgc3RlcElkID0gdmFsdWUuc3RlcElkO1xuICAgICAgY29uc3QgY2xvc3VyZVZhcnMgPSB2YWx1ZS5jbG9zdXJlVmFycztcbiAgICAgIGNvbnN0IGhhc0JvdW5kVGhpcyA9ICdib3VuZFRoaXMnIGluIHZhbHVlO1xuICAgICAgY29uc3QgYm91bmRUaGlzID0gaGFzQm91bmRUaGlzID8gdmFsdWUuYm91bmRUaGlzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYm91bmRBcmdzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5ib3VuZEFyZ3MpID8gdmFsdWUuYm91bmRBcmdzIDogW107XG5cbiAgICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwSWQpO1xuICAgICAgaWYgKCFzdGVwRm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICBgU3RlcCBmdW5jdGlvbiBcIiR7c3RlcElkfVwiIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHRoZSBzdGVwIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiAnTWFrZSBzdXJlIHRoZSBzdGVwIGZpbGUgaXMgaW5jbHVkZWQgaW4geW91ciBidWlsZCAoaS5lLiBpdCBpcyBsaXN0ZWQgaW4gdGhlIHdvcmtmbG93IG1hbmlmZXN0KSwgYW5kIHRoYXQgdGhlIFNXQyBwbHVnaW4gaXMgY29uZmlndXJlZCBmb3IgdGhlIGZpbGUuJyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogbm90aGluZyB0byB3cmFwLlxuICAgICAgaWYgKCFjbG9zdXJlVmFycyAmJiAhaGFzQm91bmRUaGlzICYmIGJvdW5kQXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3JhcHBlZFN0ZXBGbiA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBjYWxsVGhpcyA9IGhhc0JvdW5kVGhpcyA/IGJvdW5kVGhpcyA6IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxBcmdzID0gYm91bmRBcmdzLmxlbmd0aCA+IDAgPyBbLi4uYm91bmRBcmdzLCAuLi5hcmdzXSA6IGFyZ3M7XG4gICAgICAgIGlmIChjbG9zdXJlVmFycykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICAgICAgICBpZiAoIWN1cnJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICdDYW5ub3QgY2FsbCBzdGVwIGZ1bmN0aW9uIHdpdGggY2xvc3VyZSB2YXJpYWJsZXMgb3V0c2lkZSBzdGVwIGNvbnRleHQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudENvbnRleHQsXG4gICAgICAgICAgICBjbG9zdXJlVmFycyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBjb250ZXh0U3RvcmFnZS5ydW4obmV3Q29udGV4dCwgKCkgPT5cbiAgICAgICAgICAgIHN0ZXBGbi5hcHBseShjYWxsVGhpcywgY2FsbEFyZ3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RlcEZuLmFwcGx5KGNhbGxUaGlzLCBjYWxsQXJncyk7XG4gICAgICB9IGFzIGFueTtcblxuICAgICAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gb3JpZ2luYWwgc3RlcCBmdW5jdGlvblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWRTdGVwRm4sICduYW1lJywge1xuICAgICAgICB2YWx1ZTogc3RlcEZuLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkU3RlcEZuLCAnc3RlcElkJywge1xuICAgICAgICB2YWx1ZTogc3RlcElkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAoc3RlcEZuLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3cmFwcGVkU3RlcEZuLm1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdyYXBwZWRTdGVwRm47XG4gICAgfSxcblxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgJ1dvcmtmbG93IGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBVc2Ugc3RhcnQoKSB0byBpbnZva2UgdGhlbS4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoaW50OiAnV3JhcCB0aGUgd29ya2Zsb3cgd2l0aCBgc3RhcnQod29ya2Zsb3dGbiwgeyAuLi4gfSlgIGZyb20gYHdvcmtmbG93YCB0byBiZWdpbiBhIHJ1biBpbnN0ZWFkIG9mIGludm9raW5nIGl0IGxpa2UgYSBub3JtYWwgZnVuY3Rpb24uJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcblxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VXcml0YWJsZSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCAmIHsgZHVwbGV4Pzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG1ldGhvZDogdmFsdWUubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGluaXQuc2lnbmFsID0gdmFsdWUuc2lnbmFsO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBnbG9iYWwuUmVxdWVzdCh2YWx1ZS51cmwsIGluaXQpO1xuICAgICAgLy8gVGhlIFJlcXVlc3QgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnRlcm5hbCBzaWduYWwgY29weSwgc28gdGhlXG4gICAgICAvLyBhYm9ydC1pbnRlcm5hbCBzeW1ib2xzIHNldCBieSByZXZpdmVBYm9ydFNpZ25hbCBkb24ndCBwcm9wYWdhdGUuXG4gICAgICAvLyBSZS10YWcgdGhlIHJlcXVlc3QncyBvd24gc2lnbmFsIHNvIGNhbmNlbEFib3J0UmVhZGVycyBjYW4gZmluZCBpdC5cbiAgICAgIGlmICh2YWx1ZS5zaWduYWwpIGNvcHlBYm9ydEludGVybmFscyh2YWx1ZS5zaWduYWwsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGlmIChyZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGggPSBhc3luYyAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd3JpdGVyID0gcmVzcG9uc2VXcml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVzcG9uc2UpO1xuICAgICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBOb3RlOiBSZXNwb25zZSBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgc3RhdHVzLCBzdGF0dXNUZXh0LCBhbmQgaGVhZGVyc1xuICAgICAgLy8gVGhlIHR5cGUsIHVybCwgYW5kIHJlZGlyZWN0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGFuZCBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yXG4gICAgICByZXR1cm4gbmV3IGdsb2JhbC5SZXNwb25zZSh2YWx1ZS5ib2R5LCB7XG4gICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB2YWx1ZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUuaGVhZGVycyksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIElmIHRoaXMgaGFzIGJvZHlJbml0LCBpdCBjYW1lIGZyb20gYSBSZXNwb25zZSBjb25zdHJ1Y3RvclxuICAgICAgLy8gQ29udmVydCBpdCB0byBhIFJFQUwgc3RyZWFtIG5vdyB0aGF0IHdlJ3JlIGluIHRoZSBzdGVwIGVudmlyb25tZW50XG4gICAgICBpZiAoJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBib2R5SW5pdCA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBjb252ZXJ0IEJvZHlJbml0IHRvIFJlYWRhYmxlU3RyZWFtXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IGdsb2JhbC5SZXNwb25zZShib2R5SW5pdCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ib2R5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFkYWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlclJlYWRhYmxlU3RyZWFtKHJ1bklkLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgIC8vIEZvciBieXRlIHN0cmVhbXMsIHVzZSBmbHVzaGFibGUgcGlwZSB3aXRoIGxvY2sgcG9sbGluZy5cbiAgICAgICAgLy8gSWYgdGhlIHByb2R1Y2VyIHdyb3RlIGZyYW1lZCBieXRlcyAoZnJhbWluZyA9PT0gJ2ZyYW1lZC12MScpLFxuICAgICAgICAvLyB1bndyYXAgdGhlIGxlbmd0aC1wcmVmaXggZW52ZWxvcGUgYmVmb3JlIGhhbmRpbmcgY2h1bmtzIHRvXG4gICAgICAgIC8vIHRoZSB1c2VyIHN0ZXAuIEFic2VudCAvICdyYXcnIGZyYW1pbmcgbWVhbnMgbGVnYWN5IHJhdyBieXRlcyDigJRcbiAgICAgICAgLy8gcGlwZSB0aHJvdWdoIHVuY2hhbmdlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgICAgb3BzLnB1c2goc3RhdGUucHJvbWlzZSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlkZW50aXR5IChvciB1bmZyYW1pbmcpIHRyYW5zZm9ybSB0byBnaXZlIHRoZSB1c2VyIGEgcmVhZGFibGVcbiAgICAgICAgY29uc3QgeyByZWFkYWJsZTogdXNlclJlYWRhYmxlLCB3cml0YWJsZSB9ID1cbiAgICAgICAgICB2YWx1ZS5mcmFtaW5nID09PSAnZnJhbWVkLXYxJ1xuICAgICAgICAgICAgPyBnZXRCeXRlVW5mcmFtaW5nU3RyZWFtKClcbiAgICAgICAgICAgIDogbmV3IGdsb2JhbC5UcmFuc2Zvcm1TdHJlYW0oKTtcblxuICAgICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgICAgZmx1c2hhYmxlUGlwZShyZWFkYWJsZSwgd3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh1c2VyUmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdXNlclJlYWRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0oXG4gICAgICAgICAgZ2V0U3RlcFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwgY3J5cHRvS2V5LCBkZXBsb3ltZW50SWQpLFxuICAgICAgICAgIGNyeXB0b0tleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk7XG4gICAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAgIC8vIFN0YXJ0IHRoZSBmbHVzaGFibGUgcGlwZSBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICBmbHVzaGFibGVQaXBlKHJlYWRhYmxlLCB0cmFuc2Zvcm0ud3JpdGFibGUsIHN0YXRlKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgcG9sbGluZyB0byBkZXRlY3Qgd2hlbiB1c2VyIHJlbGVhc2VzIGxvY2tcbiAgICAgICAgcG9sbFJlYWRhYmxlTG9jayh0cmFuc2Zvcm0ucmVhZGFibGUsIHN0YXRlKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLnJlYWRhYmxlO1xuICAgICAgfVxuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gU2FtZS1ydW4gY2FzZTogdGhlIHdyaXRhYmxlIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcnVuLiBVc2UgdGhlXG4gICAgICAvLyBsb2NhbCBjcnlwdG9LZXkgYW5kIHdyaXRlIHRvIHRoZSBsb2NhbCBydW5JZCdzIHNlcnZlciBzdHJlYW0uXG4gICAgICAvL1xuICAgICAgLy8gQ3Jvc3MtcnVuIGNhc2UgKHBhcmVudCDihpIgY2hpbGQgdmlhIGBzdGFydCgpYCk6IHRoZSBkZXNjcmlwdG9yXG4gICAgICAvLyBjYXJyaWVzIHRoZSBvcmlnaW5hbCBgcnVuSWRgIGFuZCBgbmFtZWAuIE9wZW4gYSBzZXJ2ZXIgd3JpdGFibGVcbiAgICAgIC8vIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBhbmQgcmVzb2x2ZSBUSEFUIHJ1bidzIGtleVxuICAgICAgLy8gZm9yIGVuY3J5cHRpb24uIFRoZSByZXNvbHV0aW9uIGlzIGFzeW5jIGJ1dCBkb2Vzbid0IG5lZWQgdG9cbiAgICAgIC8vIGJsb2NrIHJldml2ZXIgcmV0dXJuIOKAlCBgZ2V0U2VyaWFsaXplU3RyZWFtYCBhY2NlcHRzIHRoZVxuICAgICAgLy8gYFByb21pc2U8Q3J5cHRvS2V5IHwgdW5kZWZpbmVkPmAgZGlyZWN0bHkgYW5kIGF3YWl0cyBpdCBsYXppbHlcbiAgICAgIC8vIG9uIHRoZSBmaXJzdCBjaHVuayB3cml0dGVuLiBUaGUga2V5IGlzIGltcG9ydGVkIGVuY3J5cHQtb25seVxuICAgICAgLy8gc28gdGhlIHJlY2VpdmluZyBydW4gY2FuIG5ldmVyIGRlY3J5cHQgYW55dGhpbmcgZWxzZSBvbiB0aGVcbiAgICAgIC8vIG93bmluZyBydW4ncyBzdHJlYW0g4oCUIGl0IGNhbiBvbmx5IGNvbnRyaWJ1dGUgbmV3IHdyaXRlcy5cbiAgICAgIGNvbnN0IHRhcmdldFJ1bklkID0gdHlwZW9mIHZhbHVlLnJ1bklkID09PSAnc3RyaW5nJyA/IHZhbHVlLnJ1bklkIDogcnVuSWQ7XG4gICAgICBjb25zdCB0YXJnZXREZXBsb3ltZW50SWQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUuZGVwbG95bWVudElkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUuZGVwbG95bWVudElkXG4gICAgICAgICAgOiB0YXJnZXRSdW5JZCA9PT0gcnVuSWRcbiAgICAgICAgICAgID8gZGVwbG95bWVudElkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRhcmdldEtleTogRW5jcnlwdGlvbktleVBhcmFtID1cbiAgICAgICAgdGFyZ2V0UnVuSWQgPT09IHJ1bklkXG4gICAgICAgICAgPyBjcnlwdG9LZXlcbiAgICAgICAgICA6IGdldEZvcndhcmRlZFdyaXRhYmxlRW5jcnlwdGlvbktleSh0YXJnZXRSdW5JZCwgdGFyZ2V0RGVwbG95bWVudElkKTtcblxuICAgICAgY29uc3Qgc2VyaWFsaXplID0gZ2V0U2VyaWFsaXplU3RyZWFtKFxuICAgICAgICBnZXRTdGVwUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHRhcmdldFJ1bklkLCB0YXJnZXRLZXkpLFxuICAgICAgICB0YXJnZXRLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBzZXJ2ZXJXcml0YWJsZSA9IG5ldyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtKFxuICAgICAgICB0YXJnZXRSdW5JZCxcbiAgICAgICAgdmFsdWUubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGZsdXNoYWJsZSBzdGF0ZSBmb3IgdGhpcyBzdHJlYW1cbiAgICAgIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgICAgIG9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gICAgICAvLyBTdGFydCB0aGUgZmx1c2hhYmxlIHBpcGUgaW4gdGhlIGJhY2tncm91bmRcbiAgICAgIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gRXJyb3JzIGFyZSBoYW5kbGVkIHZpYSBzdGF0ZS5yZWplY3RcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGFydCBwb2xsaW5nIHRvIGRldGVjdCB3aGVuIHVzZXIgcmVsZWFzZXMgbG9ja1xuICAgICAgcG9sbFdyaXRhYmxlTG9jayhzZXJpYWxpemUud3JpdGFibGUsIHN0YXRlKTtcblxuICAgICAgLy8gUmVjb3JkIHRoZSB1bmRlcmx5aW5nIGAocnVuSWQsIG5hbWUpYCBzbyBkb3duc3RyZWFtIHJlZHVjZXJzIGNhblxuICAgICAgLy8gcmVjb2duaXplIHRoYXQgdGhpcyB3cml0YWJsZSBpcyBhbHJlYWR5IGJhY2tlZCBieSBhIHdvcmtmbG93XG4gICAgICAvLyBzZXJ2ZXIgc3RyZWFtLiBXaGVuIGZvcndhcmRlZCBhY3Jvc3MgYHN0YXJ0KClgIGFnYWluIOKAlCBlLmcuXG4gICAgICAvLyB0aGUgY2hpbGQgcGFzc2VzIHRoaXMgd3JpdGFibGUgb24gdG8gYSBncmFuZGNoaWxkIOKAlCB0aGVcbiAgICAgIC8vIGV4dGVybmFsIHJlZHVjZXIgbmVlZHMgYm90aCB0byBlbWl0IHRoZSBvcmlnaW5hbCBgcnVuSWRgIGluXG4gICAgICAvLyB0aGUgZGVzY3JpcHRvci5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZXJpYWxpemUud3JpdGFibGUsIFNUUkVBTV9OQU1FX1NZTUJPTCwge1xuICAgICAgICB2YWx1ZTogdmFsdWUubmFtZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VyaWFsaXplLndyaXRhYmxlLCBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsIHtcbiAgICAgICAgdmFsdWU6IHRhcmdldFJ1bklkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmICh0YXJnZXREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgIHNlcmlhbGl6ZS53cml0YWJsZSxcbiAgICAgICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiB0YXJnZXREZXBsb3ltZW50SWQsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VyaWFsaXplLndyaXRhYmxlO1xuICAgIH0sXG5cbiAgICBBYm9ydENvbnRyb2xsZXI6ICh2YWx1ZSkgPT4gcmV2aXZlQWJvcnRDb250cm9sbGVyKHZhbHVlLCBvcHMsIHJ1bklkKSxcbiAgICBBYm9ydFNpZ25hbDogKHZhbHVlKSA9PiByZXZpdmVBYm9ydFNpZ25hbCh2YWx1ZSwgb3BzLCBydW5JZCksXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVuY3J5cHRpb24gSGVscGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGhlc2UgZGVsZWdhdGUgdG8gdGhlIG1vZHVsYXIgYGVuY3J5cHRgL2BkZWNyeXB0YCBmcm9tIGAuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qc2Bcbi8vIGJ1dCBhcmUga2VwdCBhcyBuYW1lZCBleHBvcnRzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvbnN1bWVycy5cblxuLyoqXG4gKiBFbmNyeXB0IGRhdGEgaWYgdGhlIHdvcmxkIHN1cHBvcnRzIGVuY3J5cHRpb24uXG4gKiBSZXR1cm5zIG9yaWdpbmFsIGRhdGEgaWYgZW5jcnlwdGlvbiBpcyBub3QgYXZhaWxhYmxlLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBgZW5jcnlwdGAgZnJvbSBgLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanNgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXliZUVuY3J5cHQoXG4gIGRhdGE6IFVpbnQ4QXJyYXksXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIChhd2FpdCBlbmNyeXB0KGRhdGEsIGtleSkpIGFzIFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBkYXRhIGlmIGl0IGhhcyB0aGUgJ2VuY3InIHByZWZpeC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGRlY3J5cHRgIGZyb20gYC4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF5YmVEZWNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWRcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgcmV0dXJuIGRlY3J5cHQoZGF0YSwga2V5KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVoeWRyYXRlIC8gSHlkcmF0ZSBGdW5jdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRoZXNlIGRlbGVnYXRlIHRvIHRoZSBtb2R1bGFyIG1vZGUgbW9kdWxlcyAod29ya2Zsb3csIHN0ZXAsIGNsaWVudCkgcGFzc2luZ1xuLy8gbW9kZS1zcGVjaWZpYyBzdHJlYW0gYW5kIFJlcXVlc3QvUmVzcG9uc2UgcmVkdWNlcnMvcmV2aXZlcnMgYXMgZXh0cmEgb3B0aW9ucy5cbi8vIFRoZSB2MUNvbXBhdCBwYXRoIGlzIGhhbmRsZWQgaW5saW5lIGJlZm9yZSBkZWxlZ2F0aW5nIHRvIHRoZSBtb2R1bGVzLlxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBgc3RhcnQoKWAgZnVuY3Rpb24gdG8gc2VyaWFsaXplIHRoZSB3b3JrZmxvdyBhcmd1bWVudHNcbiAqIGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlIGFuZCB0aGVuIGh5ZHJhdGVkIGZyb21cbiAqIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXJpYWxpemVcbiAqIEBwYXJhbSBydW5JZCAtIFRoZSB3b3JrZmxvdyBydW4gSUQgKHJlcXVpcmVkIGZvciBlbmNyeXB0aW9uIGNvbnRleHQpXG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB2MUNvbXBhdCAtIEVuYWJsZSBsZWdhY3kgdjEgY29tcGF0aWJpbGl0eSBtb2RlXG4gKiBAcGFyYW0gZnJhbWVkQnl0ZVN0cmVhbXMgLSBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWRcbiAqICAgYnl0ZSBzdHJlYW1zLiBTaG91bGQgbWF0Y2ggdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0eSDigJQgc2VlXG4gKiAgIGBnZXRSdW5DYXBhYmlsaXRpZXNgIGluIGBjYXBhYmlsaXRpZXMudHNgLiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvclxuICogICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gKiBAcmV0dXJucyBUaGUgZGVoeWRyYXRlZCB2YWx1ZSBhcyBiaW5hcnkgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICB2MUNvbXBhdCA9IGZhbHNlLFxuICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgZ2V0RXh0ZXJuYWxSZWR1Y2VycyhnbG9iYWwsIG9wcywgcnVuSWQsIGtleSwgZnJhbWVkQnl0ZVN0cmVhbXMpXG4gICAgKTtcbiAgICByZXR1cm4gcmV2aXZlKHN0cik7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50TW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoXG4gICAgICAgIGdldEV4dGVybmFsUmVkdWNlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGZyYW1lZEJ5dGVTdHJlYW1zKVxuICAgICAgKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnd29ya2Zsb3cgYXJndW1lbnRzJyxcbiAgICAgIGNhdXNlXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB3b3JrZmxvdyBleGVjdXRpb24gZW52aXJvbm1lbnQgdG8gaHlkcmF0ZSB0aGUgd29ya2Zsb3dcbiAqIGFyZ3VtZW50cyBmcm9tIHRoZSBkYXRhYmFzZSBhdCB0aGUgc3RhcnQgb2Ygd29ya2Zsb3cgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIF9ydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBpbmZsYXRlZCA9IGF3YWl0IGRlY29tcHJlc3MoXG4gICAgYXdhaXQgbWF5YmVEZWNyeXB0KHZhbHVlLCBrZXkpLFxuICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgKTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG4gIHJldHVybiB3b3JrZmxvd01vZHVsZS5kZXNlcmlhbGl6ZShpbmZsYXRlZCwge1xuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzOiB7XG4gICAgICAuLi5nZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoZ2V0V29ya2Zsb3dSZXZpdmVycyhnbG9iYWwpKSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVoeWRyYXRlIHdvcmtmbG93IHJldHVybiB2YWx1ZSBmb3Igc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2Vcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAnd29ya2Zsb3cgcmV0dXJuIHZhbHVlJyxcbiAgICAgIGNhdXNlXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUgdG8gaHlkcmF0ZSB0aGUgd29ya2Zsb3cgcmV0dXJuIHZhbHVlXG4gKiBvZiBhIGNvbXBsZXRlZCB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBydW5JZDogc3RyaW5nLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZCxcbiAgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpcyxcbiAgZXh0cmFSZXZpdmVyczogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fVxuKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnRNb2R1bGUuZGVzZXJpYWxpemUodmFsdWUsIGtleSwge1xuICAgIGdsb2JhbCxcbiAgICBleHRyYVJldml2ZXJzOiB7XG4gICAgICAuLi5nZXRTdHJlYW1BbmRSZXF1ZXN0UmV2aXZlcnMoXG4gICAgICAgIGdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpXG4gICAgICApLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9LFxuICAgIGNvbXByZXNzaW9uU3RhdHMsXG4gIH0pO1xuICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnZGVzZXJpYWxpemUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgd29ya2Zsb3cgaGFuZGxlciB3aGVuIGEgc3RlcCBpcyBiZWluZyBjcmVhdGVkLlxuICogRGVoeWRyYXRlcyB2YWx1ZXMgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2Vcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKHYxQ29tcGF0KSB7XG4gICAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KHZhbHVlLCBnZXRXb3JrZmxvd1JlZHVjZXJzKGdsb2JhbCkpO1xuICAgIHJldHVybiByZXZpdmUoc3RyKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLnNlcmlhbGl6ZSh2YWx1ZSwga2V5LCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBleHRyYVJlZHVjZXJzOiBnZXRTdHJlYW1BbmRSZXF1ZXN0UmVkdWNlcnMoZ2V0V29ya2Zsb3dSZWR1Y2VycyhnbG9iYWwpKSxcbiAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgY29tcHJlc3Npb25TdGF0cyxcbiAgICB9KTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ3N0ZXAgYXJndW1lbnRzJywgY2F1c2UpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBzdGVwIGhhbmRsZXIgdG8gaHlkcmF0ZSB0aGUgYXJndW1lbnRzIG9mIGEgc3RlcFxuICogZnJvbSB0aGUgZGF0YWJhc2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdGVwIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge30sXG4gIGRlcGxveW1lbnRJZD86IHN0cmluZ1xuKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdGVwTW9kdWxlLmRlc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICAgICAgICBnZXRTdGVwUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXksIGRlcGxveW1lbnRJZClcbiAgICAgICksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gICAgY29tcHJlc3Npb25TdGF0cyxcbiAgfSk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSBzdGVwIGhhbmRsZXIgd2hlbiBhIHN0ZXAgaGFzIGNvbXBsZXRlZC5cbiAqIERlaHlkcmF0ZXMgdmFsdWVzIGZyb20gd2l0aGluIHRoZSBzdGVwIGV4ZWN1dGlvbiBlbnZpcm9ubWVudFxuICogaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBzYXZlZCB0byB0aGUgZGF0YWJhc2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNlcmlhbGl6ZVxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBlbmNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZW5jcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIHNlcmlhbGl6YXRpb24gY29udGV4dFxuICogQHBhcmFtIHYxQ29tcGF0IC0gRW5hYmxlIGxlZ2FjeSB2MSBjb21wYXRpYmlsaXR5IG1vZGVcbiAqIEBwYXJhbSBmcmFtZWRCeXRlU3RyZWFtcyAtIFdoZXRoZXIgdGhlIHRhcmdldCBydW4gY2FuIGRlY29kZSB3aXJlLWZyYW1lZFxuICogICBieXRlIHN0cmVhbXMuIFNob3VsZCBtYXRjaCB0aGUgdGFyZ2V0IGRlcGxveW1lbnQncyBjYXBhYmlsaXR5IOKAlCBzZWVcbiAqICAgYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gYGNhcGFiaWxpdGllcy50c2AuIERlZmF1bHRzIHRvIGBmYWxzZWAgZm9yXG4gKiAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcnVucy5cbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIHYxQ29tcGF0ID0gZmFsc2UsXG4gIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2UsXG4gIGNvbXByZXNzaW9uID0gZmFsc2UsXG4gIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IG9yZGVyIHRoZSBmaXJzdCBjaHVuayBvZiBhIHJldHVybmVkIHN0cmVhbSBhZnRlclxuICAvLyB0aGUgYmFja2dyb3VuZGVkIGBydW5fc3RhcnRlZGAuIFRocmVhZGVkIGludG8gdGhlIHN0ZXAgcmVkdWNlcnMnIHN0cmVhbVxuICAvLyBzaW5rLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJibyAvIG9uIHRoZSBhd2FpdCBwYXRoLlxuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGlmICh2MUNvbXBhdCkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIG9wcyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGtleSxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHJldml2ZShzdHIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0ZXBNb2R1bGUuc2VyaWFsaXplKHZhbHVlLCBrZXksIHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGV4dHJhUmVkdWNlcnM6IGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhcbiAgICAgICAgZ2V0U3RlcFJlZHVjZXJzKFxuICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICBvcHMsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICApXG4gICAgICApLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzLFxuICAgIH0pO1xuICAgIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdzZXJpYWxpemUnKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNhdXNlID0gdW53cmFwU2VyaWFsaXphdGlvbkNhdXNlKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICdzdGVwIHJldHVybiB2YWx1ZScsXG4gICAgICBjYXVzZVxuICAgICk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHN0ZXAgaGFuZGxlciB3aGVuIGEgc3RlcCB0aHJvd3MuIERlaHlkcmF0ZXMgdGhlIHRocm93blxuICogdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHN0ZXAgZXhlY3V0aW9uIGVudmlyb25tZW50IGludG8gYSBmb3JtYXQgdGhhdCBjYW5cbiAqIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGBzdGVwX2ZhaWxlZGAgb3IgYHN0ZXBfcmV0cnlpbmdgIGV2ZW50LlxuICpcbiAqIEFueSBKYXZhU2NyaXB0IHZhbHVlIGNhbiBiZSB0aHJvd24gKHN0cmluZ3MsIG51bWJlcnMsIG9iamVjdHMsIEVycm9ycyxcbiAqIEVycm9yIHN1YmNsYXNzZXMpLCBzbyB0aGUgc2FtZSBzZXJpYWxpemF0aW9uIHBpcGVsaW5lIHVzZWQgZm9yIHN0ZXBcbiAqIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcyBpcyBhcHBsaWVkIGhlcmUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRocm93biB2YWx1ZSB0byBzZXJpYWxpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGVuY3J5cHRpb24pXG4gKiBAcGFyYW0gb3BzIC0gUHJvbWlzZSBhcnJheSBmb3Igc3RyZWFtIG9wZXJhdGlvbnNcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgdmFsdWU6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8YW55PltdID0gW10sXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGNvbXByZXNzaW9uID0gZmFsc2Vcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgZ2V0U3RlcFJlZHVjZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZFxuICAgICkgYXMgVWludDhBcnJheTtcbiAgICAvLyBDb21wcmVzcyBiZWZvcmUgZW5jcnlwdGluZyDigJQgZW5jcnlwdGVkIGJ5dGVzIGRvbid0IGNvbXByZXNzLlxuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBzZXJpYWxpemVkLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzXG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSAoYXdhaXQgbWF5YmVFbmNyeXB0KFxuICAgICAgY29tcHJlc3NlZCBhcyBVaW50OEFycmF5LFxuICAgICAga2V5XG4gICAgKSkgYXMgVWludDhBcnJheTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ3N0ZXAgZXJyb3InLCBjYXVzZSk7XG4gICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihtZXNzYWdlLCB7IGhpbnQsIGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZyBvZiBhXG4gKiBgc3RlcF9mYWlsZWRgIG9yIGBzdGVwX3JldHJ5aW5nYCBldmVudC4gSHlkcmF0ZXMgdGhlIHRocm93biB2YWx1ZSBmcm9tXG4gKiB0aGUgZGF0YWJhc2Ugc28gdGhlIHdvcmtmbG93IGNhbiBzZWUgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBCaW5hcnkgc2VyaWFsaXplZCBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqIEBwYXJhbSBydW5JZCAtIFJ1biBJRCBmb3IgZGVjcnlwdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcGFyYW0gZ2xvYmFsIC0gR2xvYmFsIG9iamVjdCBmb3IgZGVzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBleHRyYVJldml2ZXJzIC0gQWRkaXRpb25hbCByZXZpdmVycyBmb3IgY3VzdG9tIHR5cGVzXG4gKiBAcmV0dXJucyBUaGUgaHlkcmF0ZWQgdGhyb3duIHZhbHVlLCByZWFkeSB0byByZWplY3QgdGhlIHN0ZXAgcHJvbWlzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBFcnJvcihcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBjb21wcmVzc2lvblN0YXRzOiBDb21wcmVzc2lvblN0YXRzID0ge307XG4gIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY29tcHJlc3MoXG4gICAgYXdhaXQgbWF5YmVEZWNyeXB0KHZhbHVlLCBrZXkpLFxuICAgIGNvbXByZXNzaW9uU3RhdHNcbiAgKTtcbiAgYXdhaXQgcmVjb3JkQ29tcHJlc3Npb24oY29tcHJlc3Npb25TdGF0cywgJ2Rlc2VyaWFsaXplJyk7XG5cbiAgaWYgKCEoZGVjcnlwdGVkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAvLyBUcmVhdGVkIGFzIGEgZGV2YWx1ZSBcImZsYXR0ZW5lZFwiIGFycmF5LiBJbiBwcm9kdWN0aW9uIHRoaXMgYnJhbmNoIGlzXG4gICAgLy8gZXhlcmNpc2VkIGJ5IGxlZ2FjeSBjb2RlIHBhdGhzIHRoYXQgYnlwYXNzZWQgYGRlaHlkcmF0ZVN0ZXBFcnJvcmA7IHRoZVxuICAgIC8vIFNESyB2ZXJzaW9uIGlzIHBpbm5lZCBwZXIgd29ya2Zsb3cgcnVuIHZpYSBza2V3IHByb3RlY3Rpb24sIHNvIGFcbiAgICAvLyBjdXJyZW50LXZlcnNpb24gcHJvZHVjZXIgYWx3YXlzIGVtaXRzIGEgVWludDhBcnJheSBoZXJlLiBJZiBhXG4gICAgLy8gbWlzc2hhcGVuIHZhbHVlIHJlYWNoZXMgdXMsIGB1bmZsYXR0ZW5gIHRocm93cyDigJQgdGhhdCdzIGludGVudGlvbmFsOlxuICAgIC8vIHRoZSBoaWdoZXItbGV2ZWwgaHlkcmF0aW9uIGhlbHBlcnMgKGBoeWRyYXRlU3RlcElPYCxcbiAgICAvLyBgaHlkcmF0ZVJlc291cmNlSU9gKSBhbHJlYWR5IHdyYXAgdXMgaW4gYSB0cnkvY2F0Y2ggdGhhdCBsZWF2ZXMgdGhlXG4gICAgLy8gZmllbGQgdW4taHlkcmF0ZWQgZm9yIG8xMXkgZGlzcGxheSwgYW5kIHN1cmZhY2luZyB0aGUgdGhyb3cgdG8gbG9nc1xuICAgIC8vIGlzIG1vcmUgZGVidWdnYWJsZSB0aGFuIHNpbGVudGx5IG1hc2tpbmcgdGhlIHVuc3VwcG9ydGVkIHNoYXBlLlxuICAgIHJldHVybiB1bmZsYXR0ZW4oZGVjcnlwdGVkIGFzIGFueVtdLCB7XG4gICAgICAuLi5nZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCB7XG4gICAgICAuLi5nZXRXb3JrZmxvd1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG59XG5cbi8qKlxuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiB0aGUgd29ya2Zsb3cgaXRzZWxmIHRocm93cy5cbiAqIERlaHlkcmF0ZXMgdGhlIHRocm93biB2YWx1ZSBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gKiBpbnRvIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHNhdmVkIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGBydW5fZmFpbGVkYCBldmVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdGhyb3duIHZhbHVlIHRvIHNlcmlhbGl6ZSAoY2FuIGJlIGFueSB0eXBlKVxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBlbmNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZW5jcnlwdGlvbilcbiAqIEBwYXJhbSBnbG9iYWwgLSBHbG9iYWwgb2JqZWN0IGZvciBzZXJpYWxpemF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBkZWh5ZHJhdGVkIHZhbHVlIGFzIGJpbmFyeSBkYXRhIChVaW50OEFycmF5KSB3aXRoIGZvcm1hdCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlaHlkcmF0ZVJ1bkVycm9yKFxuICB2YWx1ZTogdW5rbm93bixcbiAgX3J1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBjb21wcmVzc2lvbiA9IGZhbHNlXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHIgPSBzdHJpbmdpZnkodmFsdWUsIGdldFdvcmtmbG93UmVkdWNlcnMoZ2xvYmFsKSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzdHIpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZFxuICAgICkgYXMgVWludDhBcnJheTtcbiAgICAvLyBDb21wcmVzcyBiZWZvcmUgZW5jcnlwdGluZyDigJQgZW5jcnlwdGVkIGJ5dGVzIGRvbid0IGNvbXByZXNzLlxuICAgIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBzZXJpYWxpemVkLFxuICAgICAgY29tcHJlc3Npb24sXG4gICAgICBjb21wcmVzc2lvblN0YXRzXG4gICAgKTtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSAoYXdhaXQgbWF5YmVFbmNyeXB0KFxuICAgICAgY29tcHJlc3NlZCBhcyBVaW50OEFycmF5LFxuICAgICAga2V5XG4gICAgKSkgYXMgVWludDhBcnJheTtcbiAgICBhd2FpdCByZWNvcmRDb21wcmVzc2lvbihjb21wcmVzc2lvblN0YXRzLCAnc2VyaWFsaXplJyk7XG4gICAgcmV0dXJuIGVuY3J5cHRlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYXVzZSA9IHVud3JhcFNlcmlhbGl6YXRpb25DYXVzZShlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ3J1biBlcnJvcicsIGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUgKG9yIG9ic2VydmFiaWxpdHkgdG9vbHMpIHRvIGh5ZHJhdGUgdGhlIHJ1blxuICogZXJyb3IgdmFsdWUgb2YgYSBmYWlsZWQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEJpbmFyeSBzZXJpYWxpemVkIGRhdGEgKFVpbnQ4QXJyYXkpIHdpdGggZm9ybWF0IHByZWZpeFxuICogQHBhcmFtIHJ1bklkIC0gUnVuIElEIGZvciBkZWNyeXB0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSBrZXkgLSBFbmNyeXB0aW9uIGtleSAodW5kZWZpbmVkIHRvIHNraXAgZGVjcnlwdGlvbilcbiAqIEBwYXJhbSBvcHMgLSBQcm9taXNlIGFycmF5IGZvciBzdHJlYW0gb3BlcmF0aW9uc1xuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQHJldHVybnMgVGhlIGh5ZHJhdGVkIHRocm93biB2YWx1ZSwgcmVhZHkgdG8gYmUgY29uc3VtZWQgYnkgdGhlIGNsaWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVJ1bkVycm9yKFxuICB2YWx1ZTogVWludDhBcnJheSB8IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGtleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkLFxuICBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJldml2ZXJzOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PiA9IHt9XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY29tcHJlc3Npb25TdGF0czogQ29tcHJlc3Npb25TdGF0cyA9IHt9O1xuICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IG1heWJlRGVjcnlwdCh2YWx1ZSwga2V5KSxcbiAgICBjb21wcmVzc2lvblN0YXRzXG4gICk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuXG4gIGlmICghKGRlY3J5cHRlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgLy8gU2VlIHRoZSBtYXRjaGluZyBub3RlIGluIGBoeWRyYXRlU3RlcEVycm9yYDogdGhpcyBicmFuY2ggaXMgZm9yXG4gICAgLy8gZGV2YWx1ZSBmbGF0dGVuZWQgYXJyYXlzIGZyb20gbGVnYWN5IGNhbGxlcnM7IGN1cnJlbnQgU0RLIHZlcnNpb25zXG4gICAgLy8gYWx3YXlzIGVtaXQgYSBVaW50OEFycmF5LCBhbmQgYSBtaXNzaGFwZW4gdmFsdWUgaGVyZSBpbnRlbnRpb25hbGx5XG4gICAgLy8gdGhyb3dzIHZpYSBgdW5mbGF0dGVuYCBzbyB0aGUgc3Vycm91bmRpbmcgdHJ5L2NhdGNoIGluIG8xMXkgaGVscGVyc1xuICAgIC8vIHN1cmZhY2VzIHRoZSBpc3N1ZSByYXRoZXIgdGhhbiBtYXNraW5nIGl0LlxuICAgIHJldHVybiB1bmZsYXR0ZW4oZGVjcnlwdGVkIGFzIGFueVtdLCB7XG4gICAgICAuLi5nZXRFeHRlcm5hbFJldml2ZXJzKGdsb2JhbCwgb3BzLCBydW5JZCwga2V5KSxcbiAgICAgIC4uLmV4dHJhUmV2aXZlcnMsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRlY3J5cHRlZCk7XG5cbiAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQpO1xuICAgIHJldHVybiBwYXJzZShzdHIsIHtcbiAgICAgIC4uLmdldEV4dGVybmFsUmV2aXZlcnMoZ2xvYmFsLCBvcHMsIHJ1bklkLCBrZXkpLFxuICAgICAgLi4uZXh0cmFSZXZpdmVycyxcbiAgICB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xufVxuXG4vKipcbiAqIENhbGxlZCBmcm9tIHRoZSB3b3JrZmxvdyBoYW5kbGVyIHdoZW4gcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgb2YgYSBgc3RlcF9jb21wbGV0ZWRgIGV2ZW50LlxuICogSHlkcmF0ZXMgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHN0ZXAgZnJvbSB0aGUgZGF0YWJhc2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQmluYXJ5IHNlcmlhbGl6ZWQgZGF0YSAoVWludDhBcnJheSkgd2l0aCBmb3JtYXQgcHJlZml4XG4gKiBAcGFyYW0gcnVuSWQgLSBSdW4gSUQgZm9yIGRlY3J5cHRpb24gY29udGV4dFxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHBhcmFtIGdsb2JhbCAtIEdsb2JhbCBvYmplY3QgZm9yIGRlc2VyaWFsaXphdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gZXh0cmFSZXZpdmVycyAtIEFkZGl0aW9uYWwgcmV2aXZlcnMgZm9yIGN1c3RvbSB0eXBlc1xuICogQ2FsbGVkIGZyb20gdGhlIHdvcmtmbG93IGhhbmRsZXIgd2hlbiByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZ1xuICogb2YgYSBgc3RlcF9jb21wbGV0ZWRgIGV2ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgdmFsdWU6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBfcnVuSWQ6IHN0cmluZyxcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge31cbik6IFByb21pc2U8YW55PiB7XG4gIGNvbnN0IGNvbXByZXNzaW9uU3RhdHM6IENvbXByZXNzaW9uU3RhdHMgPSB7fTtcbiAgY29uc3QgaW5mbGF0ZWQgPSBhd2FpdCBkZWNvbXByZXNzKFxuICAgIGF3YWl0IG1heWJlRGVjcnlwdCh2YWx1ZSwga2V5KSxcbiAgICBjb21wcmVzc2lvblN0YXRzXG4gICk7XG4gIGF3YWl0IHJlY29yZENvbXByZXNzaW9uKGNvbXByZXNzaW9uU3RhdHMsICdkZXNlcmlhbGl6ZScpO1xuICByZXR1cm4gd29ya2Zsb3dNb2R1bGUuZGVzZXJpYWxpemUoaW5mbGF0ZWQsIHtcbiAgICBnbG9iYWwsXG4gICAgZXh0cmFSZXZpdmVyczoge1xuICAgICAgLi4uZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKGdldFdvcmtmbG93UmV2aXZlcnMoZ2xvYmFsKSksXG4gICAgICAuLi5leHRyYVJldml2ZXJzLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vLyAtLS0tIEhlbHBlcnMgdG8gZXh0cmFjdCBzdHJlYW0vUmVxdWVzdC9SZXNwb25zZSByZWR1Y2VycyBhbmQgcmV2aXZlcnMgLS0tLVxuLy8gVGhlIG1vZGUtc3BlY2lmaWMgZ2V0KlJlZHVjZXJzL2dldCpSZXZpdmVycyBmdW5jdGlvbnMgcmV0dXJuIG9iamVjdHMgdGhhdFxuLy8gaW5jbHVkZSBib3RoIFwiY29tbW9uXCIgZW50cmllcyAoRGF0ZSwgRXJyb3IsIE1hcCwgZXRjLikgYW5kIG1vZGUtc3BlY2lmaWNcbi8vIGVudHJpZXMgKFJlYWRhYmxlU3RyZWFtLCBXcml0YWJsZVN0cmVhbSwgUmVxdWVzdCwgUmVzcG9uc2UsIFN0ZXBGdW5jdGlvbikuXG4vLyBUaGUgY29tbW9uIGVudHJpZXMgYXJlIGFscmVhZHkgY29tcG9zZWQgYnkgdGhlIGNvZGVjLiBXZSBvbmx5IG5lZWQgdG9cbi8vIHBhc3MgdGhyb3VnaCB0aGUgbW9kZS1zcGVjaWZpYyBlbnRyaWVzIGFzIGV4dHJhUmVkdWNlcnMvZXh0cmFSZXZpdmVycy5cblxuY29uc3QgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMgPSBbXG4gICdSZWFkYWJsZVN0cmVhbScsXG4gICdXcml0YWJsZVN0cmVhbScsXG4gICdSZXF1ZXN0JyxcbiAgJ1Jlc3BvbnNlJyxcbiAgJ1N0ZXBGdW5jdGlvbicsXG4gIC8vIFdpcmUgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHRocm91Z2ggdGhlIGNsaWVudCBzZXJpYWxpemF0aW9uIHBhdGggc29cbiAgLy8gc2lnbmFscyByZWFjaGFibGUgdmlhIFJlcXVlc3Quc2lnbmFsIChvciBhcyBkaXJlY3QgYXJndW1lbnRzKSBnZXQgdGhlaXJcbiAgLy8gZGVkaWNhdGVkIHJlZHVjZXIuIFdpdGhvdXQgdGhpcywgZGV2YWx1ZSBmYWxscyBiYWNrIHRvIGl0cyBhcmJpdHJhcnktUE9KT1xuICAvLyBwYXRoIGFuZCBmYWlscyBmb3IgYW55IHNpZ25hbCB0aGUgUmVxdWVzdCByZWR1Y2VyIGZvcndhcmRzLlxuICAnQWJvcnRDb250cm9sbGVyJyxcbiAgJ0Fib3J0U2lnbmFsJyxcbl0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUFuZFJlcXVlc3RSZWR1Y2VycyhcbiAgYWxsUmVkdWNlcnM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUkVBTV9BTkRfUkVRVUVTVF9LRVlTKSB7XG4gICAgaWYgKGtleSBpbiBhbGxSZWR1Y2Vycykge1xuICAgICAgZXh0cmFba2V5XSA9IGFsbFJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RyZWFtQW5kUmVxdWVzdFJldml2ZXJzKFxuICBhbGxSZXZpdmVyczogUmVjb3JkPHN0cmluZywgYW55PlxuKTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4ge1xuICBjb25zdCBleHRyYTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgU1RSRUFNX0FORF9SRVFVRVNUX0tFWVMpIHtcbiAgICBpZiAoa2V5IGluIGFsbFJldml2ZXJzKSB7XG4gICAgICBleHRyYVtrZXldID0gYWxsUmV2aXZlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dHJhO1xufVxuIl19