@pipeline-builder/pipeline-data 4.1.18 → 4.1.20

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.
@@ -27,7 +27,13 @@
27
27
  * version spec. Yanked versions never resolve for a listing; a paused
28
28
  * version is skipped unless the install already resolved to it or the
29
29
  * reference pins it exactly; advisory-blocked versions are skipped.
30
+ * - Scan flags: a version the nightly rescan FLAGGED (fixable Criticals
31
+ * over `PLUGIN_VULN_MAX_CRITICAL`) resolves with a `VULN_FLAGGED` warning —
32
+ * or, with `PLUGIN_BLOCK_ON_NEW_CRITICAL` on, is skipped like an
33
+ * advisory-blocked one, and an exact pin to it is refused
34
+ * `PLUGIN_VERSION_VULN_BLOCKED`.
30
35
  */
36
+ import { asScanFlag, blockOnNewCritical, vulnBlockedMessage, vulnFlaggedWarning, } from '@pipeline-builder/api-core';
31
37
  import { and, eq, inArray } from 'drizzle-orm';
32
38
  import { compareSemver, isVersionRange, parseSemver, parseVersionSpec, satisfiesVersionSpec, } from './semver-range.js';
33
39
  import { OFFICIAL_PUBLISHER_HANDLE, PUBLISHER_TIERS, schema, } from '../database/drizzle-schema.js';
@@ -259,6 +265,17 @@ export function blockingAdvisories(advisories, version, policy) {
259
265
  return [];
260
266
  return advisories.filter((a) => a.state === 'published' && severities.includes(a.severity) && advisoryRangeCovers(a.affectedRange, version));
261
267
  }
268
+ /** The refusal an exact pin to a flagged version gets while blocking (409). */
269
+ function vulnRefusal(ref, v) {
270
+ const flag = asScanFlag(v.scanFlag) ?? { critical: 0, high: 0, maxCritical: 0, findings: [] };
271
+ const fixed = [...new Set(flag.findings.flatMap((f) => f.fixedIn))];
272
+ return {
273
+ code: 'PLUGIN_VERSION_VULN_BLOCKED',
274
+ reason: 'vuln_flagged',
275
+ message: vulnBlockedMessage(ref, v.version, flag),
276
+ details: { version: v.version, critical: flag.critical, high: flag.high, findings: flag.findings, ...(fixed.length ? { fixedVersions: fixed } : {}) },
277
+ };
278
+ }
262
279
  const isStable = (v) => (parseSemver(v)?.prerelease.length ?? 1) === 0;
263
280
  /**
264
281
  * The implicit Official install's range: every version of the LOWEST live
@@ -310,6 +327,7 @@ export function modeAdmits(mode, version, versions) {
310
327
  */
311
328
  export function selectListingVersion(input) {
312
329
  const { ref, versions, mode, requested, advisories, policy } = input;
330
+ const blockFlagged = input.blockFlagged ?? blockOnNewCritical();
313
331
  const exact = requested !== undefined && !isVersionRange(requested) ? requested.trim() : null;
314
332
  if (exact !== null) {
315
333
  const v = versions.find((x) => x.version === exact);
@@ -338,6 +356,8 @@ export function selectListingVersion(input) {
338
356
  const blocking = blockingAdvisories(advisories, exact, policy);
339
357
  if (blocking.length)
340
358
  return { refusal: advisoryRefusal(ref, exact, blocking) };
359
+ if (blockFlagged && v.scanFlaggedAt)
360
+ return { refusal: vulnRefusal(ref, v) };
341
361
  return { version: v };
342
362
  }
343
363
  const resolvedBefore = mode.kind === 'explicit' ? mode.install.resolvedVersion : null;
@@ -348,7 +368,8 @@ export function selectListingVersion(input) {
348
368
  : requested !== undefined || modeAdmits(mode, v.version, versions))
349
369
  && (requested === undefined || satisfiesVersionSpec(v.version, requested))
350
370
  && (!v.pausedAt || v.version === resolvedBefore));
351
- const allowed = admitted.filter((v) => blockingAdvisories(advisories, v.version, policy).length === 0);
371
+ const allowed = admitted.filter((v) => blockingAdvisories(advisories, v.version, policy).length === 0
372
+ && !(blockFlagged && v.scanFlaggedAt));
352
373
  // Ranges only admit prereleases they name (npm semantics), so the highest
353
374
  // admitted version is the answer.
354
375
  const best = highest(allowed.map((v) => v.version));
@@ -356,7 +377,10 @@ export function selectListingVersion(input) {
356
377
  return { version: allowed.find((v) => v.version === best) };
357
378
  if (admitted.length > 0) {
358
379
  const newest = highest(admitted.map((v) => v.version));
359
- return { refusal: advisoryRefusal(ref, newest, blockingAdvisories(advisories, newest, policy)) };
380
+ const blocking = blockingAdvisories(advisories, newest, policy);
381
+ if (blocking.length === 0)
382
+ return { refusal: vulnRefusal(ref, admitted.find((v) => v.version === newest)) };
383
+ return { refusal: advisoryRefusal(ref, newest, blocking) };
360
384
  }
361
385
  if (mode.kind === 'explicit' && requested !== undefined
362
386
  && versions.some((v) => !v.yankedAt && satisfiesVersionSpec(v.version, requested))) {
@@ -523,6 +547,9 @@ export function listedVersionWarnings(input) {
523
547
  + `${a.fixedVersion ? ` Fixed in ${a.fixedVersion}.` : ''}`,
524
548
  });
525
549
  }
550
+ const flag = version.scanFlaggedAt ? asScanFlag(version.scanFlag) : null;
551
+ if (flag)
552
+ warnings.push(vulnFlaggedWarning(ref, version.version, flag));
526
553
  if (secretsWithheld) {
527
554
  warnings.push({ code: 'PLUGIN_SECRETS_WITHHELD', message: `${ref} is a ${publisher.tier} plugin; your organization's policy gives it no secrets, so its declared secrets are not injected.` });
528
555
  }
@@ -582,7 +609,11 @@ export function listedPluginRecord(res) {
582
609
  breaking: version.breaking,
583
610
  vulnCritical: version.vulnCritical,
584
611
  vulnHigh: version.vulnHigh,
612
+ vulnCriticalFixable: version.vulnCriticalFixable,
613
+ vulnHighFixable: version.vulnHighFixable,
585
614
  scannedAt: version.scannedAt,
615
+ scanFlaggedAt: version.scanFlaggedAt,
616
+ scanFlag: version.scanFlag,
586
617
  lifecycle: version.deprecatedAt ? 'deprecated' : 'production',
587
618
  deprecatedAt: version.deprecatedAt,
588
619
  deprecationMessage: version.deprecationMessage,
@@ -646,4 +677,4 @@ export async function resolvableListings(source, scope, filter = {}) {
646
677
  return (await orgListingStates(source, scope, filter))
647
678
  .filter((s) => s.resolved !== null);
648
679
  }
649
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3BsdWdpbi1yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsYUFBYSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEdBQ25GLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixlQUFlLEVBQ2YsTUFBTSxHQWFQLE1BQU0sK0JBQStCLENBQUM7QUFnQnZDLDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBZ0MsTUFBTSxDQUFDLE1BQU0sQ0FBb0I7SUFDdEcsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztJQUN0QyxvQkFBb0IsRUFBRSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUM7SUFDakQsbUJBQW1CLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO0lBQzdDLGVBQWUsRUFBRSxVQUFVO0lBQzNCLGdCQUFnQixFQUFFLFVBQVU7SUFDNUIsZUFBZSxFQUFFLEVBQUU7Q0FDcEIsQ0FBQyxDQUFDO0FBRUgscURBQXFEO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUV4QyxNQUFNLFdBQVcsR0FBK0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRTlFLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBOEIsRUFBbUIsRUFBRSxDQUNwRSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJ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LGNBQWMsQ0FBQyxDQUFDLEVBQzVDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDbEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUN6RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUcscUJBQXFCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0ksZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUks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T0FBTyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNuRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQTZELEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ25HLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSZXNvbHZpbmcgYSBwbHVnaW4gcmVmZXJlbmNlIHRvIGFuIGVjb3N5c3RlbSBMSVNUSU5HIHZlcnNpb24gdGhyb3VnaCB0aGVcbiAqIG9yZydzIGluc3RhbGwgKGRvY3MvcGx1Z2luLWluc3RhbGxpbmcubWQpLlxuICpcbiAqIE9uZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYnkgZXZlcnkgcGxhY2UgdGhhdCBhbnN3ZXJzIFwid2hpY2ggbGlzdGVkIHZlcnNpb25cbiAqIGRvZXMgdGhpcyBvcmcncyByZWZlcmVuY2UgcnVuP1wiOiB0aGUgcGx1Z2luIHNlcnZpY2UncyBgL3BsdWdpbnMvbG9va3VwYCAod2hhdFxuICogc3ludGggcGlucyksIHRoZSBwaXBlbGluZSBzZXJ2aWNlJ3MgY29udHJhY3QgY2hlY2sgYXQgcGlwZWxpbmUgY3JlYXRlLCB0aGUgQUlcbiAqIGdlbmVyYXRvcidzIHBsdWdpbiBsaXN0IGFuZCB0aGUgcGxhY2Vob2xkZXIgZ3VhcmQuIFRoZSBkZWNpc2lvbnMgYXJlIFBVUkVcbiAqIGZ1bmN0aW9ucyBvdmVyIGxvYWRlZCByb3dzOyB0aGUgcm93cyBjb21lIHRocm91Z2ggYSB7QGxpbmsgTGlzdGluZ0RhdGFTb3VyY2V9XG4gKiBzbyBlYWNoIHNlcnZpY2UgY2FuIGxvYWQgdGhlbSBpdHMgb3duIHdheSAoe0BsaW5rIGRyaXp6bGVMaXN0aW5nU291cmNlfSBpcyB0aGVcbiAqIHBsYWluIGRyaXp6bGUgb25lKS5cbiAqXG4gKiBUaGUgbW9kZWw6XG4gKiAgLSBBbiBvcmcgcmVzb2x2ZXMgYSBsaXN0aW5nIG9ubHkgdGhyb3VnaCBhbiBJTlNUQUxMOiBhbiBleHBsaWNpdFxuICogICAgYHBsdWdpbl9pbnN0YWxsc2Agcm93IChpdHMgb3duLCBvciDigJQgZm9yIGEgdGVhbSDigJQgaXRzIHJvb3Qgb3JnJ3MpLCBvclxuICogICAgZm9yIHRoZSBPZmZpY2lhbCBwdWJsaXNoZXIgdGhlIElNUExJQ0lUIGluc3RhbGwgZXZlcnkgb3JnIGhhcyB1bmxlc3MgaXRzXG4gKiAgICBjb25zdW1wdGlvbiBwb2xpY3kgc2F5cyBgb2ZmaWNpYWxJbnN0YWxsczogZXhwbGljaXRgLiBBbiBleHBsaWNpdFxuICogICAgaW5zdGFsbCBvdmVycmlkZXMgdGhlIGltcGxpY2l0IG9uZS5cbiAqICAtIFRoZSBvcmcncyBDT05TVU1QVElPTiBQT0xJQ1kgaXMgYXBwbGllZCBhdCBldmVyeSByZXNvbHV0aW9uOiBhbGxvd2VkXG4gKiAgICB0aWVycywgYmxvY2tlZCBsaXN0aW5ncywgYWR2aXNvcnkgYmxvY2tpbmc7IHNlY3JldHMgYXJlIHdpdGhoZWxkIGZyb20gdGllcnNcbiAqICAgIHRoZSBwb2xpY3kgZG9lc24ndCB0cnVzdCB3aXRoIHRoZW0uIEEgdGVhbSdzIHBvbGljeSBpcyBtZXJnZWQgd2l0aCBpdHMgcm9vdFxuICogICAgb3JnJ3MgYW5kIGNhbiBvbmx5IGJlIHN0cmljdGVyLlxuICogIC0gVmVyc2lvbiBjaG9pY2U6IHRoZSBpbnN0YWxsJ3MgcmFuZ2UgKHBpbm5lZCAvIGB+YCAvIGBeYCAvIG5vbi1icmVha2luZ1xuICogICAgbGF0ZXN0OyBpbXBsaWNpdCA9IHRoZSBsb3dlc3QgbGl2ZSBtYWpvciksIG5hcnJvd2VkIGJ5IHRoZSByZWZlcmVuY2UncyBvd25cbiAqICAgIHZlcnNpb24gc3BlYy4gWWFua2VkIHZlcnNpb25zIG5ldmVyIHJlc29sdmUgZm9yIGEgbGlzdGluZzsgYSBwYXVzZWRcbiAqICAgIHZlcnNpb24gaXMgc2tpcHBlZCB1bmxlc3MgdGhlIGluc3RhbGwgYWxyZWFkeSByZXNvbHZlZCB0byBpdCBvciB0aGVcbiAqICAgIHJlZmVyZW5jZSBwaW5zIGl0IGV4YWN0bHk7IGFkdmlzb3J5LWJsb2NrZWQgdmVyc2lvbnMgYXJlIHNraXBwZWQuXG4gKi9cblxuaW1wb3J0IHsgYW5kLCBlcSwgaW5BcnJheSB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQ3J1ZFR4IH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHtcbiAgY29tcGFyZVNlbXZlciwgaXNWZXJzaW9uUmFuZ2UsIHBhcnNlU2VtdmVyLCBwYXJzZVZlcnNpb25TcGVjLCBzYXRpc2ZpZXNWZXJzaW9uU3BlYyxcbn0gZnJvbSAnLi9zZW12ZXItcmFuZ2UuanMnO1xuaW1wb3J0IHtcbiAgT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSxcbiAgUFVCTElTSEVSX1RJRVJTLFxuICBzY2hlbWEsXG4gIHR5cGUgQWR2aXNvcnlTZXZlcml0eSxcbiAgdHlwZSBCbG9ja2VkTGlzdGluZ1JlZixcbiAgdHlwZSBCbG9ja09uQWR2aXNvcnksXG4gIHR5cGUgSW5zdGFsbFZlcnNpb25Qb2xpY3ksXG4gIHR5cGUgT2ZmaWNpYWxJbnN0YWxscyxcbiAgdHlwZSBQbHVnaW5BZHZpc29yeSxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsLFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHR5cGUgUGx1Z2luTGlzdGluZyxcbiAgdHlwZSBQbHVnaW5MaXN0aW5nVmVyc2lvbixcbiAgdHlwZSBQdWJsaXNoZXIsXG4gIHR5cGUgUHVibGlzaGVyVGllcixcbn0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uc3VtcHRpb24gcG9saWN5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQW4gb3JnJ3MgY29uc3VtcHRpb24gcG9saWN5LCBhcyB0aGUgcmVzb2x2ZXIgYXBwbGllcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc3VtcHRpb25Qb2xpY3kge1xuICBhbGxvd2VkVGllcnM6IFB1Ymxpc2hlclRpZXJbXTtcbiAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IFB1Ymxpc2hlclRpZXJbXTtcbiAgc2VjcmV0c0FsbG93ZWRUaWVyczogUHVibGlzaGVyVGllcltdO1xuICBibG9ja09uQWR2aXNvcnk6IEJsb2NrT25BZHZpc29yeTtcbiAgb2ZmaWNpYWxJbnN0YWxsczogT2ZmaWNpYWxJbnN0YWxscztcbiAgYmxvY2tlZExpc3RpbmdzOiBCbG9ja2VkTGlzdGluZ1JlZltdO1xufVxuXG4vKiogVGhlIGRlZmF1bHRzIChhbmQgdGhlIGNvbHVtbiBkZWZhdWx0cyBvZiBgcGx1Z2luX2luc3RhbGxfcG9saWNpZXNgKS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTlNVTVBUSU9OX1BPTElDWTogUmVhZG9ubHk8Q29uc3VtcHRpb25Qb2xpY3k+ID0gT2JqZWN0LmZyZWV6ZTxDb25zdW1wdGlvblBvbGljeT4oe1xuICBhbGxvd2VkVGllcnM6IFsnb2ZmaWNpYWwnLCAndmVyaWZpZWQnXSxcbiAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IFsnY29tbXVuaXR5JywgJ3VudmVyaWZpZWQnXSxcbiAgc2VjcmV0c0FsbG93ZWRUaWVyczogWydvZmZpY2lhbCcsICd2ZXJpZmllZCddLFxuICBibG9ja09uQWR2aXNvcnk6ICdjcml0aWNhbCcsXG4gIG9mZmljaWFsSW5zdGFsbHM6ICdpbXBsaWNpdCcsXG4gIGJsb2NrZWRMaXN0aW5nczogW10sXG59KTtcblxuLyoqIEF0IG1vc3QgdGhpcyBtYW55IGJsb2NrZWQgbGlzdGluZ3MgcGVyIHBvbGljeS4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQkxPQ0tFRF9MSVNUSU5HUyA9IDUwMDtcblxuY29uc3QgQkxPQ0tfT1JERVI6IHJlYWRvbmx5IEJsb2NrT25BZHZpc29yeVtdID0gWyduZXZlcicsICdjcml0aWNhbCcsICdoaWdoJ107XG5cbmNvbnN0IHNvcnRUaWVycyA9ICh0aWVyczogSXRlcmFibGU8UHVibGlzaGVyVGllcj4pOiBQdWJsaXNoZXJUaWVyW10gPT5cbiAgUFVCTElTSEVSX1RJRVJTLmZpbHRlcigodCkgPT4gbmV3IFNldCh0aWVycykuaGFzKHQpKTtcblxuY29uc3QgbGlzdGluZ0tleSA9IChyOiBCbG9ja2VkTGlzdGluZ1JlZik6IHN0cmluZyA9PiBgJHtyLnB1Ymxpc2hlcn0vJHtyLm5hbWV9YDtcblxuZnVuY3Rpb24gdW5pcXVlTGlzdGluZ3MocmVmczogcmVhZG9ubHkgQmxvY2tlZExpc3RpbmdSZWZbXSk6IEJsb2NrZWRMaXN0aW5nUmVmW10ge1xuICBjb25zdCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIEJsb2NrZWRMaXN0aW5nUmVmPigpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVmcykgc2Vlbi5zZXQobGlzdGluZ0tleShyKSwgeyBwdWJsaXNoZXI6IHIucHVibGlzaGVyLCBuYW1lOiByLm5hbWUgfSk7XG4gIHJldHVybiBbLi4uc2Vlbi52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT4gbGlzdGluZ0tleShhKS5sb2NhbGVDb21wYXJlKGxpc3RpbmdLZXkoYikpKTtcbn1cblxuLyoqIEEgc3RvcmVkIHBvbGljeSByb3cgKG9yIG5vbmUpIGFzIGEge0BsaW5rIENvbnN1bXB0aW9uUG9saWN5fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xpY3lPZihyb3c6IFBhcnRpYWw8UGx1Z2luSW5zdGFsbFBvbGljeT4gfCBudWxsIHwgdW5kZWZpbmVkKTogQ29uc3VtcHRpb25Qb2xpY3kge1xuICBjb25zdCBkID0gREVGQVVMVF9DT05TVU1QVElPTl9QT0xJQ1k7XG4gIHJldHVybiB7XG4gICAgYWxsb3dlZFRpZXJzOiBzb3J0VGllcnMocm93Py5hbGxvd2VkVGllcnMgPz8gZC5hbGxvd2VkVGllcnMpLFxuICAgIHJlcXVpcmVBcHByb3ZhbFRpZXJzOiBzb3J0VGllcnMocm93Py5yZXF1aXJlQXBwcm92YWxUaWVycyA/PyBkLnJlcXVpcmVBcHByb3ZhbFRpZXJzKSxcbiAgICBzZWNyZXRzQWxsb3dlZFRpZXJzOiBzb3J0VGllcnMocm93Py5zZWNyZXRzQWxsb3dlZFRpZXJzID8/IGQuc2VjcmV0c0FsbG93ZWRUaWVycyksXG4gICAgYmxvY2tPbkFkdmlzb3J5OiByb3c/LmJsb2NrT25BZHZpc29yeSA/PyBkLmJsb2NrT25BZHZpc29yeSxcbiAgICBvZmZpY2lhbEluc3RhbGxzOiByb3c/Lm9mZmljaWFsSW5zdGFsbHMgPz8gZC5vZmZpY2lhbEluc3RhbGxzLFxuICAgIGJsb2NrZWRMaXN0aW5nczogdW5pcXVlTGlzdGluZ3Mocm93Py5ibG9ja2VkTGlzdGluZ3MgPz8gZC5ibG9ja2VkTGlzdGluZ3MpLFxuICB9O1xufVxuXG4vKipcbiAqIEEgdGVhbSdzIHBvbGljeSB1bmRlciBpdHMgcm9vdCBvcmcnczogZWFjaCBmaWVsZCB0YWtlcyB0aGUgU1RSSUNURVIgb2ZcbiAqIHRoZSB0d28sIHNvIGEgdGVhbSBjYW4gbmFycm93IHdoYXQgaXRzIHJvb3QgYWxsb3dzIGJ1dCBuZXZlciB3aWRlbiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ29uc3VtcHRpb25Qb2xpY2llcyhyb290OiBDb25zdW1wdGlvblBvbGljeSwgdGVhbTogQ29uc3VtcHRpb25Qb2xpY3kpOiBDb25zdW1wdGlvblBvbGljeSB7XG4gIGNvbnN0IGludGVyc2VjdCA9IChhOiBQdWJsaXNoZXJUaWVyW10sIGI6IFB1Ymxpc2hlclRpZXJbXSkgPT4gc29ydFRpZXJzKGEuZmlsdGVyKCh0KSA9PiBiLmluY2x1ZGVzKHQpKSk7XG4gIGNvbnN0IHVuaW9uID0gKGE6IFB1Ymxpc2hlclRpZXJbXSwgYjogUHVibGlzaGVyVGllcltdKSA9PiBzb3J0VGllcnMoWy4uLmEsIC4uLmJdKTtcbiAgY29uc3Qgc3RyaWN0ZXJCbG9jayA9IEJMT0NLX09SREVSLmluZGV4T2Yocm9vdC5ibG9ja09uQWR2aXNvcnkpID49IEJMT0NLX09SREVSLmluZGV4T2YodGVhbS5ibG9ja09uQWR2aXNvcnkpXG4gICAgPyByb290LmJsb2NrT25BZHZpc29yeSA6IHRlYW0uYmxvY2tPbkFkdmlzb3J5O1xuICByZXR1cm4ge1xuICAgIGFsbG93ZWRUaWVyczogaW50ZXJzZWN0KHJvb3QuYWxsb3dlZFRpZXJzLCB0ZWFtLmFsbG93ZWRUaWVycyksXG4gICAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IHVuaW9uKHJvb3QucmVxdWlyZUFwcHJvdmFsVGllcnMsIHRlYW0ucmVxdWlyZUFwcHJvdmFsVGllcnMpLFxuICAgIHNlY3JldHNBbGxvd2VkVGllcnM6IGludGVyc2VjdChyb290LnNlY3JldHNBbGxvd2VkVGllcnMsIHRlYW0uc2VjcmV0c0FsbG93ZWRUaWVycyksXG4gICAgYmxvY2tPbkFkdmlzb3J5OiBzdHJpY3RlckJsb2NrLFxuICAgIG9mZmljaWFsSW5zdGFsbHM6IHJvb3Qub2ZmaWNpYWxJbnN0YWxscyA9PT0gJ2V4cGxpY2l0JyB8fCB0ZWFtLm9mZmljaWFsSW5zdGFsbHMgPT09ICdleHBsaWNpdCcgPyAnZXhwbGljaXQnIDogJ2ltcGxpY2l0JyxcbiAgICBibG9ja2VkTGlzdGluZ3M6IHVuaXF1ZUxpc3RpbmdzKFsuLi5yb290LmJsb2NrZWRMaXN0aW5ncywgLi4udGVhbS5ibG9ja2VkTGlzdGluZ3NdKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcG9saWN5IGFuIG9yZydzIHJlc29sdXRpb24gcnVucyB1bmRlci4gQSByb290IG9yZzogaXRzIG93biByb3cgKG9yIHRoZVxuICogZGVmYXVsdHMpLiBBIHRlYW0gKGByb290T3JnSWRgIHNldCk6IGl0cyByb290J3MgcG9saWN5LCBtZXJnZWQgd2l0aCB0aGVcbiAqIHRlYW0ncyBvd24gcm93IHdoZW4gaXQgaGFzIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdGl2ZUNvbnN1bXB0aW9uUG9saWN5KFxuICByb3dzOiBSZWFkb25seUFycmF5PFBhcnRpYWw8UGx1Z2luSW5zdGFsbFBvbGljeT4gJiB7IG9yZ0lkPzogc3RyaW5nIH0+LFxuICBvcmdJZDogc3RyaW5nLFxuICByb290T3JnSWQ/OiBzdHJpbmcsXG4pOiBDb25zdW1wdGlvblBvbGljeSB7XG4gIGNvbnN0IG93biA9IHJvd3MuZmluZCgocikgPT4gci5vcmdJZCA9PT0gb3JnSWQpID8/IG51bGw7XG4gIGlmICghcm9vdE9yZ0lkIHx8IHJvb3RPcmdJZCA9PT0gb3JnSWQpIHJldHVybiBwb2xpY3lPZihvd24pO1xuICBjb25zdCByb290ID0gcG9saWN5T2Yocm93cy5maW5kKChyKSA9PiByLm9yZ0lkID09PSByb290T3JnSWQpID8/IG51bGwpO1xuICByZXR1cm4gb3duID8gbWVyZ2VDb25zdW1wdGlvblBvbGljaWVzKHJvb3QsIHBvbGljeU9mKG93bikpIDogcm9vdDtcbn1cblxuY29uc3QgSEFORExFX1JFID0gL15bYS16MC05XSsoPzotW2EtejAtOV0rKSokLztcbmNvbnN0IE5BTUVfUkUgPSAvXlthLXowLTldW2EtejAtOS5fLV0qJC87XG5cbmZ1bmN0aW9uIHRpZXJMaXN0KHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBQdWJsaXNoZXJUaWVyW10gfCBzdHJpbmcge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodikpIHJldHVybiBgJHtmaWVsZH0gbXVzdCBiZSBhbiBhcnJheSBvZiB0aWVyc2A7XG4gIGNvbnN0IGJhZCA9IHYuZmlsdGVyKCh0KSA9PiAhKFBVQkxJU0hFUl9USUVSUyBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHQpKTtcbiAgaWYgKGJhZC5sZW5ndGgpIHJldHVybiBgJHtmaWVsZH0gaGFzIHVua25vd24gdGllcnM6ICR7YmFkLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuIHNvcnRUaWVycyh2IGFzIFB1Ymxpc2hlclRpZXJbXSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSAocGFydGlhbCkgcG9saWN5IHVwZGF0ZSBvdmVyIGBiYXNlYC4gUmV0dXJucyB0aGUgZnVsbCBuZXcgcG9saWN5LFxuICogb3IgYW4gZXJyb3IgbWVzc2FnZS4gYGJsb2NrZWRMaXN0aW5nc2AgZW50cmllcyBhcmUgYHsgcHVibGlzaGVyLCBuYW1lIH1gIG9yXG4gKiBgXCJwdWJsaXNoZXIvbmFtZVwiYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UG9saWN5VXBkYXRlKGJhc2U6IENvbnN1bXB0aW9uUG9saWN5LCBpbnB1dDogdW5rbm93bik6IENvbnN1bXB0aW9uUG9saWN5IHwgc3RyaW5nIHtcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoaW5wdXQpKSByZXR1cm4gJ2JvZHkgbXVzdCBiZSBhbiBvYmplY3QnO1xuICBjb25zdCBiID0gaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG5leHQ6IENvbnN1bXB0aW9uUG9saWN5ID0geyAuLi5iYXNlIH07XG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydhbGxvd2VkVGllcnMnLCAncmVxdWlyZUFwcHJvdmFsVGllcnMnLCAnc2VjcmV0c0FsbG93ZWRUaWVycyddIGFzIGNvbnN0KSB7XG4gICAgaWYgKGJbZmllbGRdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHRpZXJzID0gdGllckxpc3QoYltmaWVsZF0sIGZpZWxkKTtcbiAgICBpZiAodHlwZW9mIHRpZXJzID09PSAnc3RyaW5nJykgcmV0dXJuIHRpZXJzO1xuICAgIG5leHRbZmllbGRdID0gdGllcnM7XG4gIH1cbiAgaWYgKGIuYmxvY2tPbkFkdmlzb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIUJMT0NLX09SREVSLmluY2x1ZGVzKGIuYmxvY2tPbkFkdmlzb3J5IGFzIEJsb2NrT25BZHZpc29yeSkpIHJldHVybiAnYmxvY2tPbkFkdmlzb3J5IG11c3QgYmUgY3JpdGljYWwsIGhpZ2ggb3IgbmV2ZXInO1xuICAgIG5leHQuYmxvY2tPbkFkdmlzb3J5ID0gYi5ibG9ja09uQWR2aXNvcnkgYXMgQmxvY2tPbkFkdmlzb3J5O1xuICB9XG4gIGlmIChiLm9mZmljaWFsSW5zdGFsbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChiLm9mZmljaWFsSW5zdGFsbHMgIT09ICdpbXBsaWNpdCcgJiYgYi5vZmZpY2lhbEluc3RhbGxzICE9PSAnZXhwbGljaXQnKSByZXR1cm4gJ29mZmljaWFsSW5zdGFsbHMgbXVzdCBiZSBpbXBsaWNpdCBvciBleHBsaWNpdCc7XG4gICAgbmV4dC5vZmZpY2lhbEluc3RhbGxzID0gYi5vZmZpY2lhbEluc3RhbGxzO1xuICB9XG4gIGlmIChiLmJsb2NrZWRMaXN0aW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGIuYmxvY2tlZExpc3RpbmdzKSkgcmV0dXJuICdibG9ja2VkTGlzdGluZ3MgbXVzdCBiZSBhbiBhcnJheSc7XG4gICAgaWYgKGIuYmxvY2tlZExpc3RpbmdzLmxlbmd0aCA+IE1BWF9CTE9DS0VEX0xJU1RJTkdTKSByZXR1cm4gYGF0IG1vc3QgJHtNQVhfQkxPQ0tFRF9MSVNUSU5HU30gYmxvY2tlZCBsaXN0aW5nc2A7XG4gICAgY29uc3QgcmVmczogQmxvY2tlZExpc3RpbmdSZWZbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmF3IG9mIGIuYmxvY2tlZExpc3RpbmdzKSB7XG4gICAgICBjb25zdCByZWYgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJ1xuICAgICAgICA/ICgoKSA9PiB7IGNvbnN0IFtwdWJsaXNoZXIsIG5hbWUsIGV4dHJhXSA9IHJhdy5zcGxpdCgnLycpOyByZXR1cm4gZXh0cmEgPT09IHVuZGVmaW5lZCA/IHsgcHVibGlzaGVyLCBuYW1lIH0gOiBudWxsOyB9KSgpXG4gICAgICAgIDogcmF3ICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnID8geyBwdWJsaXNoZXI6IChyYXcgYXMgQmxvY2tlZExpc3RpbmdSZWYpLnB1Ymxpc2hlciwgbmFtZTogKHJhdyBhcyBCbG9ja2VkTGlzdGluZ1JlZikubmFtZSB9IDogbnVsbDtcbiAgICAgIGlmICghcmVmIHx8IHR5cGVvZiByZWYucHVibGlzaGVyICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVmLm5hbWUgIT09ICdzdHJpbmcnXG4gICAgICAgIHx8ICFIQU5ETEVfUkUudGVzdChyZWYucHVibGlzaGVyKSB8fCAhTkFNRV9SRS50ZXN0KHJlZi5uYW1lKSkge1xuICAgICAgICByZXR1cm4gJ2VhY2ggYmxvY2tlZCBsaXN0aW5nIG11c3QgYmUgeyBwdWJsaXNoZXIsIG5hbWUgfSAob3IgXCJwdWJsaXNoZXIvbmFtZVwiKSc7XG4gICAgICB9XG4gICAgICByZWZzLnB1c2goeyBwdWJsaXNoZXI6IHJlZi5wdWJsaXNoZXIsIG5hbWU6IHJlZi5uYW1lIH0pO1xuICAgIH1cbiAgICBuZXh0LmJsb2NrZWRMaXN0aW5ncyA9IHVuaXF1ZUxpc3RpbmdzKHJlZnMpO1xuICB9XG4gIHJldHVybiBuZXh0O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVmdXNhbHMgYW5kIHdhcm5pbmdzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogV2h5IGEgcmVmZXJlbmNlIGNhbid0IHJlc29sdmU7IGBjb2RlYCBpcyBhbiBhcGktY29yZSBgRXJyb3JDb2RlYCBuYW1lLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIGNvZGU6ICdOT1RfRk9VTkQnIHwgJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJyB8ICdQTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1knIHwgJ1BMVUdJTl9VTkFWQUlMQUJMRSc7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIEEgbm9uLWZhdGFsIG5vdGUgYSByZXNvbHV0aW9uIGNhcnJpZXMgKHN5bnRoIHByaW50cyBpdCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdXRpb25XYXJuaW5nIHtcbiAgY29kZTogJ1BMVUdJTl9BRFZJU09SWScgfCAnUExVR0lOX0RFUFJFQ0FURUQnIHwgJ1BMVUdJTl9TRUNSRVRTX1dJVEhIRUxEJyB8ICdMSVNUSU5HX1VOTUFJTlRBSU5FRCc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIFdoeSB0aGUgb3JnJ3MgcG9saWN5IChvciB0aGUgbGlzdGluZydzIHN0YXRlKSBrZWVwcyBhIGxpc3Rpbmcgb3V0LCBvciBudWxsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0aW5nQmxvY2sge1xuICByZWFzb246ICd0aWVyJyB8ICdibG9ja2VkX2xpc3RpbmcnIHwgJ3N1c3BlbmRlZCc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIFdoZXRoZXIgYHBvbGljeWAgKG9yIHRoZSBsaXN0aW5nJ3Mgb3duIHN0YXRlKSByZWZ1c2VzIHRoZSBsaXN0aW5nIG91dHJpZ2h0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RpbmdCbG9jayhcbiAgcG9saWN5OiBDb25zdW1wdGlvblBvbGljeSxcbiAgcHVibGlzaGVyOiBQaWNrPFB1Ymxpc2hlciwgJ2hhbmRsZScgfCAndGllcicgfCAnc3VzcGVuZGVkQXQnPixcbiAgbGlzdGluZzogUGljazxQbHVnaW5MaXN0aW5nLCAnbmFtZScgfCAnc3RhdGUnPixcbik6IExpc3RpbmdCbG9jayB8IG51bGwge1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBpZiAocHVibGlzaGVyLnN1c3BlbmRlZEF0IHx8IGxpc3Rpbmcuc3RhdGUgPT09ICdzdXNwZW5kZWQnIHx8IGxpc3Rpbmcuc3RhdGUgPT09ICd0cmFuc2ZlcnJlZCcpIHtcbiAgICByZXR1cm4geyByZWFzb246ICdzdXNwZW5kZWQnLCBtZXNzYWdlOiBgJHtyZWZ9IGlzICR7bGlzdGluZy5zdGF0ZSA9PT0gJ3RyYW5zZmVycmVkJyA/ICd0cmFuc2ZlcnJlZCcgOiAnc3VzcGVuZGVkJ30gYW5kIG5vIGxvbmdlciByZXNvbHZlcy5gIH07XG4gIH1cbiAgaWYgKHBvbGljeS5ibG9ja2VkTGlzdGluZ3Muc29tZSgoYikgPT4gYi5wdWJsaXNoZXIgPT09IHB1Ymxpc2hlci5oYW5kbGUgJiYgYi5uYW1lID09PSBsaXN0aW5nLm5hbWUpKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAnYmxvY2tlZF9saXN0aW5nJywgbWVzc2FnZTogYFlvdXIgb3JnYW5pemF0aW9uJ3MgcGx1Z2luIHBvbGljeSBibG9ja3MgJHtyZWZ9LmAgfTtcbiAgfVxuICBpZiAoIXBvbGljeS5hbGxvd2VkVGllcnMuaW5jbHVkZXMocHVibGlzaGVyLnRpZXIpKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAndGllcicsIG1lc3NhZ2U6IGBZb3VyIG9yZ2FuaXphdGlvbidzIHBsdWdpbiBwb2xpY3kgZG9lc24ndCBhbGxvdyAke3B1Ymxpc2hlci50aWVyfSBwbHVnaW5zICgke3JlZn0pLmAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIFRoZSByZWZ1c2FsIGEge0BsaW5rIExpc3RpbmdCbG9ja30gYmVjb21lcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibG9ja1JlZnVzYWwoYmxvY2s6IExpc3RpbmdCbG9jayk6IFJlc29sdXRpb25SZWZ1c2FsIHtcbiAgcmV0dXJuIGJsb2NrLnJlYXNvbiA9PT0gJ3N1c3BlbmRlZCdcbiAgICA/IHsgY29kZTogJ1BMVUdJTl9VTkFWQUlMQUJMRScsIHJlYXNvbjogJ3N1c3BlbmRlZCcsIG1lc3NhZ2U6IGJsb2NrLm1lc3NhZ2UgfVxuICAgIDogeyBjb2RlOiAnUExVR0lOX0JMT0NLRURfQllfUE9MSUNZJywgcmVhc29uOiBibG9jay5yZWFzb24sIG1lc3NhZ2U6IGJsb2NrLm1lc3NhZ2UgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFkdmlzb3JpZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBTZXZlcml0aWVzIGVhY2ggYGJsb2NrT25BZHZpc29yeWAgc2V0dGluZyBibG9ja3MuICovXG5leHBvcnQgY29uc3QgQURWSVNPUllfQkxPQ0tfU0VWRVJJVElFUzogUmVhZG9ubHk8UmVjb3JkPEJsb2NrT25BZHZpc29yeSwgcmVhZG9ubHkgQWR2aXNvcnlTZXZlcml0eVtdPj4gPSB7XG4gIGNyaXRpY2FsOiBbJ2NyaXRpY2FsJ10sXG4gIGhpZ2g6IFsnY3JpdGljYWwnLCAnaGlnaCddLFxuICBuZXZlcjogW10sXG59O1xuXG5jb25zdCBDT01QQVJBVE9SID0gL14oPj18PD18Pnw8fD0pP1xccyp2PyhcXGQrXFwuXFxkK1xcLlxcZCsoPzotWzAtOUEtWmEtei4tXSspPyg/OlxcK1swLTlBLVphLXouLV0rKT8pJC87XG5cbi8qKiBPbmUgY29tcGFyYXRvciBzZXQgKGA+PTEuMC4wIDwxLjIuM2AsIGBeMS4yYCwgYDEueGAsIGAxLjAuMCAtIDEuMi4wYCkgYWdhaW5zdCBgdmVyc2lvbmAuICovXG5mdW5jdGlvbiBjb21wYXJhdG9yU2V0Q292ZXJzKHNldDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgaHlwaGVuID0gL14oXFxTKylcXHMrLVxccysoXFxTKykkLy5leGVjKHNldCk7XG4gIGlmIChoeXBoZW4pIHJldHVybiBjb21wYXJlU2VtdmVyKHZlcnNpb24sIGh5cGhlblsxXSEpID49IDAgJiYgY29tcGFyZVNlbXZlcih2ZXJzaW9uLCBoeXBoZW5bMl0hKSA8PSAwO1xuICBjb25zdCBwYXJ0cyA9IHNldC5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSAmJiBwYXJzZVZlcnNpb25TcGVjKHBhcnRzWzBdISkpIHJldHVybiBzYXRpc2ZpZXNWZXJzaW9uU3BlYyh2ZXJzaW9uLCBwYXJ0c1swXSEpO1xuICByZXR1cm4gcGFydHMuZXZlcnkoKHApID0+IHtcbiAgICBjb25zdCBtID0gQ09NUEFSQVRPUi5leGVjKHApO1xuICAgIGlmICghbSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGMgPSBjb21wYXJlU2VtdmVyKHZlcnNpb24sIG1bMl0hKTtcbiAgICBzd2l0Y2ggKG1bMV0gPz8gJz0nKSB7XG4gICAgICBjYXNlICc+PSc6IHJldHVybiBjID49IDA7XG4gICAgICBjYXNlICc8PSc6IHJldHVybiBjIDw9IDA7XG4gICAgICBjYXNlICc+JzogcmV0dXJuIGMgPiAwO1xuICAgICAgY2FzZSAnPCc6IHJldHVybiBjIDwgMDtcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBjID09PSAwO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBhZHZpc29yeSdzIGBhZmZlY3RlZFJhbmdlYCBjb3ZlcnMgYHZlcnNpb25gOiBgfHxgLXNlcGFyYXRlZFxuICogY29tcGFyYXRvciBzZXRzLCBlYWNoIGVpdGhlciB0aGUgbG9va3VwIHNwZWMgZm9ybXMgKGBeYCwgYH5gLCBwYXJ0aWFsLFxuICogZXhhY3QpIG9yIHNwYWNlLXNlcGFyYXRlZCBjb21wYXJhdG9ycyAoYD49MS4wLjAgPDEuMi4zYCkgb3IgYSBoeXBoZW4gcmFuZ2UuXG4gKiBgKmAgY292ZXJzIGV2ZXJ5dGhpbmc7IGFuIHVucGFyc2VhYmxlIHJhbmdlIGNvdmVycyBub3RoaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWR2aXNvcnlSYW5nZUNvdmVycyhyYW5nZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFwYXJzZVNlbXZlcih2ZXJzaW9uKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmFuZ2Uuc3BsaXQoJ3x8JykubWFwKChzKSA9PiBzLnRyaW0oKSkuc29tZSgoc2V0KSA9PiBzZXQgPT09ICcqJyB8fCAoc2V0ICE9PSAnJyAmJiBjb21wYXJhdG9yU2V0Q292ZXJzKHNldCwgdmVyc2lvbikpKTtcbn1cblxuLyoqXG4gKiBXaHkgYHJhbmdlYCBpc24ndCBhIHVzYWJsZSBhZHZpc29yeSByYW5nZSAodGhlIGZvcm1zIHtAbGluayBhZHZpc29yeVJhbmdlQ292ZXJzfVxuICogdW5kZXJzdGFuZHMpLCBvciBudWxsIHdoZW4gaXQgaXMuIEFuIGFkdmlzb3J5IHdob3NlIHJhbmdlIHBhcnNlcyBhcyBub3RoaW5nXG4gKiB3b3VsZCBzaWxlbnRseSBjb3ZlciBub3RoaW5nLCBzbyBkcmFmdHMgYXJlIHJlZnVzZWQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkdmlzb3J5UmFuZ2VQcm9ibGVtKHJhbmdlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdHJpbW1lZCA9IHJhbmdlLnRyaW0oKTtcbiAgaWYgKHRyaW1tZWQgPT09ICcnKSByZXR1cm4gJ3RoZSBhZmZlY3RlZCByYW5nZSBpcyBlbXB0eSc7XG4gIGlmICh0cmltbWVkLmxlbmd0aCA+IDI1NSkgcmV0dXJuICd0aGUgYWZmZWN0ZWQgcmFuZ2UgaXMgbG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMnO1xuICBmb3IgKGNvbnN0IHNldCBvZiB0cmltbWVkLnNwbGl0KCd8fCcpLm1hcCgoeCkgPT4geC50cmltKCkpKSB7XG4gICAgaWYgKHNldCA9PT0gJyonKSBjb250aW51ZTtcbiAgICBpZiAoc2V0ID09PSAnJykgcmV0dXJuICd0aGUgYWZmZWN0ZWQgcmFuZ2UgaGFzIGFuIGVtcHR5IFwifHxcIiBhbHRlcm5hdGl2ZSc7XG4gICAgY29uc3QgaHlwaGVuID0gL14oXFxTKylcXHMrLVxccysoXFxTKykkLy5leGVjKHNldCk7XG4gICAgaWYgKGh5cGhlbikge1xuICAgICAgaWYgKCFwYXJzZVNlbXZlcihoeXBoZW5bMV0hKSB8fCAhcGFyc2VTZW12ZXIoaHlwaGVuWzJdISkpIHJldHVybiBgXCIke3NldH1cIiBpcyBub3QgYSB2YWxpZCBoeXBoZW4gcmFuZ2VgO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gc2V0LnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEgJiYgcGFydHNbMF0gIT09ICdsYXRlc3QnICYmIHBhcnNlVmVyc2lvblNwZWMocGFydHNbMF0hKSkgY29udGludWU7XG4gICAgY29uc3QgYmFkID0gcGFydHMuZmluZCgoeCkgPT4gIUNPTVBBUkFUT1IudGVzdCh4KSk7XG4gICAgaWYgKGJhZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYFwiJHtiYWR9XCIgaXMgbm90IGEgdmVyc2lvbiwgYSBeL34gcmFuZ2Ugb3IgYSBjb21wYXJhdG9yICg+PSwgPD0sID4sIDwsID0pYDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIFRoZSBQVUJMSVNIRUQgYWR2aXNvcmllcyB3aG9zZSByYW5nZSBjb3ZlcnMgYHZlcnNpb25gIChhbnkgc2V2ZXJpdHkpLCBtb3N0IHNldmVyZSBmaXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZpc29yaWVzQ292ZXJpbmc8QSBleHRlbmRzIFBpY2s8UGx1Z2luQWR2aXNvcnksICdzZXZlcml0eScgfCAnc3RhdGUnIHwgJ2FmZmVjdGVkUmFuZ2UnPj4oXG4gIGFkdmlzb3JpZXM6IHJlYWRvbmx5IEFbXSxcbiAgdmVyc2lvbjogc3RyaW5nLFxuKTogQVtdIHtcbiAgY29uc3QgcmFuazogUmVjb3JkPEFkdmlzb3J5U2V2ZXJpdHksIG51bWJlcj4gPSB7IGNyaXRpY2FsOiAwLCBoaWdoOiAxLCBtZWRpdW06IDIsIGxvdzogMyB9O1xuICByZXR1cm4gYWR2aXNvcmllc1xuICAgIC5maWx0ZXIoKGEpID0+IGEuc3RhdGUgPT09ICdwdWJsaXNoZWQnICYmIGFkdmlzb3J5UmFuZ2VDb3ZlcnMoYS5hZmZlY3RlZFJhbmdlLCB2ZXJzaW9uKSlcbiAgICAuc29ydCgoYSwgYikgPT4gcmFua1thLnNldmVyaXR5XSAtIHJhbmtbYi5zZXZlcml0eV0pO1xufVxuXG4vKiogVGhlIFBVQkxJU0hFRCBhZHZpc29yaWVzIHRoZSBwb2xpY3kgYmxvY2tzIGB2ZXJzaW9uYCBmb3IuICovXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tpbmdBZHZpc29yaWVzKFxuICBhZHZpc29yaWVzOiByZWFkb25seSBQaWNrPFBsdWdpbkFkdmlzb3J5LCAnaWQnIHwgJ3NldmVyaXR5JyB8ICdzdGF0ZScgfCAnYWZmZWN0ZWRSYW5nZScgfCAnZml4ZWRWZXJzaW9uJyB8ICdzdW1tYXJ5Jz5bXSxcbiAgdmVyc2lvbjogc3RyaW5nLFxuICBwb2xpY3k6IFBpY2s8Q29uc3VtcHRpb25Qb2xpY3ksICdibG9ja09uQWR2aXNvcnknPixcbik6IEFycmF5PFBpY2s8UGx1Z2luQWR2aXNvcnksICdpZCcgfCAnc2V2ZXJpdHknIHwgJ3N0YXRlJyB8ICdhZmZlY3RlZFJhbmdlJyB8ICdmaXhlZFZlcnNpb24nIHwgJ3N1bW1hcnknPj4ge1xuICBjb25zdCBzZXZlcml0aWVzID0gQURWSVNPUllfQkxPQ0tfU0VWRVJJVElFU1twb2xpY3kuYmxvY2tPbkFkdmlzb3J5XTtcbiAgaWYgKHNldmVyaXRpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIHJldHVybiBhZHZpc29yaWVzLmZpbHRlcigoYSkgPT4gYS5zdGF0ZSA9PT0gJ3B1Ymxpc2hlZCcgJiYgc2V2ZXJpdGllcy5pbmNsdWRlcyhhLnNldmVyaXR5KSAmJiBhZHZpc29yeVJhbmdlQ292ZXJzKGEuYWZmZWN0ZWRSYW5nZSwgdmVyc2lvbikpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW5zdGFsbHMgYW5kIHZlcnNpb24gY2hvaWNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogSG93IHRoZSBvcmcgcmVhY2hlcyBhIGxpc3Rpbmc6IGFuIGV4cGxpY2l0IGluc3RhbGwgcm93LCBvciB0aGUgaW1wbGljaXQgT2ZmaWNpYWwgb25lLiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbE1vZGUgPVxuICB8IHsga2luZDogJ2V4cGxpY2l0JzsgaW5zdGFsbDogUGx1Z2luSW5zdGFsbDsgaW5oZXJpdGVkOiBib29sZWFuIH1cbiAgfCB7IGtpbmQ6ICdpbXBsaWNpdCcgfTtcblxudHlwZSBWZXJzaW9uUm93ID0gUGljazxQbHVnaW5MaXN0aW5nVmVyc2lvbiwgJ3ZlcnNpb24nIHwgJ3lhbmtlZEF0JyB8ICdwYXVzZWRBdCcgfCAnYnJlYWtpbmcnPjtcblxuY29uc3QgaXNTdGFibGUgPSAodjogc3RyaW5nKTogYm9vbGVhbiA9PiAocGFyc2VTZW12ZXIodik/LnByZXJlbGVhc2UubGVuZ3RoID8/IDEpID09PSAwO1xuXG4vKipcbiAqIFRoZSBpbXBsaWNpdCBPZmZpY2lhbCBpbnN0YWxsJ3MgcmFuZ2U6IGV2ZXJ5IHZlcnNpb24gb2YgdGhlIExPV0VTVCBsaXZlXG4gKiBtYWpvciAoYDxtYWpvcj4ueGApIOKAlCBwYXRjaCBhbmQgbWlub3IgdmVyc2lvbnMgZmxvdywgYSBuZXcgbWFqb3IgbmV2ZXIgZG9lc1xuICogKHRoZSBvcmcgbW92ZXMgdG8gaXQgd2l0aCBhbiBleHBsaWNpdCBpbnN0YWxsKS4gTnVsbCB3aGVuIG5vdGhpbmcgaXMgbGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltcGxpY2l0SW5zdGFsbFJhbmdlKHZlcnNpb25zOiByZWFkb25seSBWZXJzaW9uUm93W10pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgbWFqb3JzID0gdmVyc2lvbnNcbiAgICAuZmlsdGVyKCh2KSA9PiAhdi55YW5rZWRBdCAmJiBpc1N0YWJsZSh2LnZlcnNpb24pKVxuICAgIC5tYXAoKHYpID0+IHBhcnNlU2VtdmVyKHYudmVyc2lvbikhLm1ham9yKTtcbiAgaWYgKG1ham9ycy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICByZXR1cm4gYCR7TWF0aC5taW4oLi4ubWFqb3JzKX0ueGA7XG59XG5cbi8qKiBXaGV0aGVyIGFuIGluc3RhbGwncyB2ZXJzaW9uIHBvbGljeSBhZG1pdHMgYHZlcnNpb25gICh0aGUgYmFzZWxpbmUgaXMgYHBpbm5lZFZlcnNpb25gKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsQWRtaXRzKFxuICBpbnN0YWxsOiBQaWNrPFBsdWdpbkluc3RhbGwsICd2ZXJzaW9uUG9saWN5JyB8ICdwaW5uZWRWZXJzaW9uJz4sXG4gIHZlcnNpb246IHN0cmluZyxcbiAgdmVyc2lvbnM6IHJlYWRvbmx5IFZlcnNpb25Sb3dbXSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlID0gaW5zdGFsbC5waW5uZWRWZXJzaW9uO1xuICBzd2l0Y2ggKGluc3RhbGwudmVyc2lvblBvbGljeSBhcyBJbnN0YWxsVmVyc2lvblBvbGljeSkge1xuICAgIGNhc2UgJ3Bpbm5lZCc6XG4gICAgICByZXR1cm4gdmVyc2lvbiA9PT0gYmFzZTtcbiAgICBjYXNlICdwYXRjaCc6XG4gICAgICByZXR1cm4gYmFzZSAhPT0gbnVsbCAmJiBzYXRpc2ZpZXNWZXJzaW9uU3BlYyh2ZXJzaW9uLCBgfiR7YmFzZX1gKTtcbiAgICBjYXNlICdtaW5vcic6XG4gICAgICByZXR1cm4gYmFzZSAhPT0gbnVsbCAmJiBzYXRpc2ZpZXNWZXJzaW9uU3BlYyh2ZXJzaW9uLCBgXiR7YmFzZX1gKTtcbiAgICBjYXNlICdsYXRlc3QnOiB7XG4gICAgICBpZiAoIWlzU3RhYmxlKHZlcnNpb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoYmFzZSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY29tcGFyZVNlbXZlcih2ZXJzaW9uLCBiYXNlKSA8IDApIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIE5ldmVyIGNyb3NzIGEgdmVyc2lvbiB0aGUgcHVibGlzaGVyIG1hcmtlZCBicmVha2luZy5cbiAgICAgIHJldHVybiAhdmVyc2lvbnMuc29tZSgodikgPT4gdi5icmVha2luZyAmJiBjb21wYXJlU2VtdmVyKHYudmVyc2lvbiwgYmFzZSkgPiAwICYmIGNvbXBhcmVTZW12ZXIodi52ZXJzaW9uLCB2ZXJzaW9uKSA8PSAwKTtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogV2hldGhlciBgbW9kZWAgYWRtaXRzIGB2ZXJzaW9uYCAodGhlIGltcGxpY2l0IHJhbmdlIGZvciBhbiBpbXBsaWNpdCBpbnN0YWxsKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlQWRtaXRzKG1vZGU6IEluc3RhbGxNb2RlLCB2ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb25zOiByZWFkb25seSBWZXJzaW9uUm93W10pOiBib29sZWFuIHtcbiAgaWYgKG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JykgcmV0dXJuIGluc3RhbGxBZG1pdHMobW9kZS5pbnN0YWxsLCB2ZXJzaW9uLCB2ZXJzaW9ucyk7XG4gIGNvbnN0IHJhbmdlID0gaW1wbGljaXRJbnN0YWxsUmFuZ2UodmVyc2lvbnMpO1xuICByZXR1cm4gcmFuZ2UgIT09IG51bGwgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModmVyc2lvbiwgcmFuZ2UpO1xufVxuXG4vKiogSW5wdXQgdG8ge0BsaW5rIHNlbGVjdExpc3RpbmdWZXJzaW9ufS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbkNob2ljZUlucHV0PFYgZXh0ZW5kcyBQbHVnaW5MaXN0aW5nVmVyc2lvbiA9IFBsdWdpbkxpc3RpbmdWZXJzaW9uPiB7XG4gIHJlZjogc3RyaW5nO1xuICB2ZXJzaW9uczogcmVhZG9ubHkgVltdO1xuICBtb2RlOiBJbnN0YWxsTW9kZTtcbiAgLyoqIFRoZSByZWZlcmVuY2UncyBvd24gdmVyc2lvbiBzcGVjIChgZmlsdGVyLnZlcnNpb25gKS4gKi9cbiAgcmVxdWVzdGVkPzogc3RyaW5nO1xuICBhZHZpc29yaWVzOiByZWFkb25seSBQbHVnaW5BZHZpc29yeVtdO1xuICBwb2xpY3k6IENvbnN1bXB0aW9uUG9saWN5O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGxpc3RlZCB2ZXJzaW9uIGEgcmVmZXJlbmNlIHJlc29sdmVzIHRvIChzZWUgdGhlIG1vZHVsZSBkb2MpLCBvclxuICogdGhlIHJlZnVzYWwgdGhhdCBleHBsYWlucyB3aHkgbm9uZSBjYW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RMaXN0aW5nVmVyc2lvbjxWIGV4dGVuZHMgUGx1Z2luTGlzdGluZ1ZlcnNpb24+KGlucHV0OiBWZXJzaW9uQ2hvaWNlSW5wdXQ8Vj4pOiB7IHZlcnNpb246IFYgfSB8IHsgcmVmdXNhbDogUmVzb2x1dGlvblJlZnVzYWwgfSB7XG4gIGNvbnN0IHsgcmVmLCB2ZXJzaW9ucywgbW9kZSwgcmVxdWVzdGVkLCBhZHZpc29yaWVzLCBwb2xpY3kgfSA9IGlucHV0O1xuICBjb25zdCBleGFjdCA9IHJlcXVlc3RlZCAhPT0gdW5kZWZpbmVkICYmICFpc1ZlcnNpb25SYW5nZShyZXF1ZXN0ZWQpID8gcmVxdWVzdGVkLnRyaW0oKSA6IG51bGw7XG5cbiAgaWYgKGV4YWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgdiA9IHZlcnNpb25zLmZpbmQoKHgpID0+IHgudmVyc2lvbiA9PT0gZXhhY3QpO1xuICAgIGlmICghdikgcmV0dXJuIHsgcmVmdXNhbDogeyBjb2RlOiAnTk9UX0ZPVU5EJywgcmVhc29uOiAndmVyc2lvbl9ub3RfZm91bmQnLCBtZXNzYWdlOiBgJHtyZWZ9IGhhcyBubyBwdWJsaXNoZWQgdmVyc2lvbiAke2V4YWN0fS5gIH0gfTtcbiAgICBpZiAodi55YW5rZWRBdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVmdXNhbDoge1xuICAgICAgICAgIGNvZGU6ICdQTFVHSU5fVU5BVkFJTEFCTEUnLFxuICAgICAgICAgIHJlYXNvbjogJ3lhbmtlZCcsXG4gICAgICAgICAgbWVzc2FnZTogYCR7cmVmfUAke2V4YWN0fSBpcyB5YW5rZWQke3YueWFua1JlYXNvbiA/IGA6ICR7di55YW5rUmVhc29ufWAgOiAnJ30uIE1vdmUgdG8gYSBzdXBwb3J0ZWQgdmVyc2lvbi5gLFxuICAgICAgICAgIGRldGFpbHM6IHsgdmVyc2lvbjogZXhhY3QgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcgJiYgIWluc3RhbGxBZG1pdHMobW9kZS5pbnN0YWxsLCBleGFjdCwgdmVyc2lvbnMpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWZ1c2FsOiB7XG4gICAgICAgICAgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJyxcbiAgICAgICAgICByZWFzb246ICd2ZXJzaW9uX291dHNpZGVfaW5zdGFsbCcsXG4gICAgICAgICAgbWVzc2FnZTogYCR7cmVmfUAke2V4YWN0fSBpcyBvdXRzaWRlIHlvdXIgaW5zdGFsbCAoJHttb2RlLmluc3RhbGwudmVyc2lvblBvbGljeX0gZnJvbSAke21vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9ufSkuIFVwZ3JhZGUgdGhlIGluc3RhbGwgZmlyc3QuYCxcbiAgICAgICAgICBkZXRhaWxzOiB7IHZlcnNpb246IGV4YWN0LCB2ZXJzaW9uUG9saWN5OiBtb2RlLmluc3RhbGwudmVyc2lvblBvbGljeSwgcGlubmVkVmVyc2lvbjogbW9kZS5pbnN0YWxsLnBpbm5lZFZlcnNpb24gfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGJsb2NraW5nID0gYmxvY2tpbmdBZHZpc29yaWVzKGFkdmlzb3JpZXMsIGV4YWN0LCBwb2xpY3kpO1xuICAgIGlmIChibG9ja2luZy5sZW5ndGgpIHJldHVybiB7IHJlZnVzYWw6IGFkdmlzb3J5UmVmdXNhbChyZWYsIGV4YWN0LCBibG9ja2luZykgfTtcbiAgICByZXR1cm4geyB2ZXJzaW9uOiB2IH07XG4gIH1cblxuICBjb25zdCByZXNvbHZlZEJlZm9yZSA9IG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyA/IG1vZGUuaW5zdGFsbC5yZXNvbHZlZFZlcnNpb24gOiBudWxsO1xuICAvLyBUaGUgcmFuZ2UgdGhlIElOU1RBTEwgYWxsb3dzLiBGb3IgdGhlIGltcGxpY2l0IGluc3RhbGwgYW4gZXhwbGljaXQgc3BlYyBvblxuICAvLyB0aGUgcmVmZXJlbmNlIHJlcGxhY2VzIHRoZSBpbXBsaWNpdCByYW5nZSAoaXQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSkuXG4gIGNvbnN0IGFkbWl0dGVkID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiAhdi55YW5rZWRBdFxuICAgICYmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcgPyBpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgdi52ZXJzaW9uLCB2ZXJzaW9ucylcbiAgICAgIDogcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgfHwgbW9kZUFkbWl0cyhtb2RlLCB2LnZlcnNpb24sIHZlcnNpb25zKSlcbiAgICAmJiAocmVxdWVzdGVkID09PSB1bmRlZmluZWQgfHwgc2F0aXNmaWVzVmVyc2lvblNwZWModi52ZXJzaW9uLCByZXF1ZXN0ZWQpKVxuICAgICYmICghdi5wYXVzZWRBdCB8fCB2LnZlcnNpb24gPT09IHJlc29sdmVkQmVmb3JlKSk7XG4gIGNvbnN0IGFsbG93ZWQgPSBhZG1pdHRlZC5maWx0ZXIoKHYpID0+IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCB2LnZlcnNpb24sIHBvbGljeSkubGVuZ3RoID09PSAwKTtcbiAgLy8gUmFuZ2VzIG9ubHkgYWRtaXQgcHJlcmVsZWFzZXMgdGhleSBuYW1lIChucG0gc2VtYW50aWNzKSwgc28gdGhlIGhpZ2hlc3RcbiAgLy8gYWRtaXR0ZWQgdmVyc2lvbiBpcyB0aGUgYW5zd2VyLlxuICBjb25zdCBiZXN0ID0gaGlnaGVzdChhbGxvd2VkLm1hcCgodikgPT4gdi52ZXJzaW9uKSk7XG4gIGlmIChiZXN0KSByZXR1cm4geyB2ZXJzaW9uOiBhbGxvd2VkLmZpbmQoKHYpID0+IHYudmVyc2lvbiA9PT0gYmVzdCkhIH07XG5cbiAgaWYgKGFkbWl0dGVkLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBuZXdlc3QgPSBoaWdoZXN0KGFkbWl0dGVkLm1hcCgodikgPT4gdi52ZXJzaW9uKSkhO1xuICAgIHJldHVybiB7IHJlZnVzYWw6IGFkdmlzb3J5UmVmdXNhbChyZWYsIG5ld2VzdCwgYmxvY2tpbmdBZHZpc29yaWVzKGFkdmlzb3JpZXMsIG5ld2VzdCwgcG9saWN5KSkgfTtcbiAgfVxuICBpZiAobW9kZS5raW5kID09PSAnZXhwbGljaXQnICYmIHJlcXVlc3RlZCAhPT0gdW5kZWZpbmVkXG4gICAgJiYgdmVyc2lvbnMuc29tZSgodikgPT4gIXYueWFua2VkQXQgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModi52ZXJzaW9uLCByZXF1ZXN0ZWQpKSkge1xuICAgIHJldHVybiB7XG4gICAgICByZWZ1c2FsOiB7XG4gICAgICAgIGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsXG4gICAgICAgIHJlYXNvbjogJ3ZlcnNpb25fb3V0c2lkZV9pbnN0YWxsJyxcbiAgICAgICAgbWVzc2FnZTogYE5vIHZlcnNpb24gb2YgJHtyZWZ9IG1hdGNoaW5nICR7cmVxdWVzdGVkfSBpcyBpbnNpZGUgeW91ciBpbnN0YWxsICgke21vZGUuaW5zdGFsbC52ZXJzaW9uUG9saWN5fSBmcm9tICR7bW9kZS5pbnN0YWxsLnBpbm5lZFZlcnNpb259KS4gVXBncmFkZSB0aGUgaW5zdGFsbCBmaXJzdC5gLFxuICAgICAgICBkZXRhaWxzOiB7IHJlcXVlc3RlZCwgdmVyc2lvblBvbGljeTogbW9kZS5pbnN0YWxsLnZlcnNpb25Qb2xpY3ksIHBpbm5lZFZlcnNpb246IG1vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9uIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZWZ1c2FsOiB7XG4gICAgICBjb2RlOiAnTk9UX0ZPVU5EJyxcbiAgICAgIHJlYXNvbjogJ25vX21hdGNoaW5nX3ZlcnNpb24nLFxuICAgICAgbWVzc2FnZTogYE5vIHJlc29sdmFibGUgdmVyc2lvbiBvZiAke3JlZn0ke3JlcXVlc3RlZCA/IGAgbWF0Y2hlcyAke3JlcXVlc3RlZH1gIDogJyd9LmAsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIFRoZSBoaWdoZXN0IG9mIGB2ZXJzaW9uc2AgYnkgc2VtdmVyIChwcmVyZWxlYXNlcyBpbmNsdWRlZCkuICovXG5mdW5jdGlvbiBoaWdoZXN0KHZlcnNpb25zOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmVyc2lvbnMucmVkdWNlPHN0cmluZyB8IG51bGw+KChiZXN0LCB2KSA9PiAoYmVzdCA9PT0gbnVsbCB8fCBjb21wYXJlU2VtdmVyKHYsIGJlc3QpID4gMCA/IHYgOiBiZXN0KSwgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIGFkdmlzb3J5UmVmdXNhbChyZWY6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBibG9ja2luZzogUmVhZG9ubHlBcnJheTxQaWNrPFBsdWdpbkFkdmlzb3J5LCAnaWQnIHwgJ3NldmVyaXR5JyB8ICdmaXhlZFZlcnNpb24nIHwgJ3N1bW1hcnknPj4pOiBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIGNvbnN0IGZpeGVkID0gYmxvY2tpbmcubWFwKChhKSA9PiBhLmZpeGVkVmVyc2lvbikuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gISF2KTtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiAnUExVR0lOX0JMT0NLRURfQllfUE9MSUNZJyxcbiAgICByZWFzb246ICdhZHZpc29yeScsXG4gICAgbWVzc2FnZTogYCR7cmVmfUAke3ZlcnNpb259IGlzIGJsb2NrZWQgYnkgeW91ciBvcmdhbml6YXRpb24ncyBhZHZpc29yeSBwb2xpY3k6ICR7YmxvY2tpbmcubWFwKChhKSA9PiBgJHthLnNldmVyaXR5fSDigJQgJHthLnN1bW1hcnl9YCkuam9pbignOyAnKX0uYFxuICAgICAgKyAoZml4ZWQubGVuZ3RoID8gYCBGaXhlZCBpbiAke2ZpeGVkLmpvaW4oJywgJyl9LmAgOiAnJyksXG4gICAgZGV0YWlsczogeyB2ZXJzaW9uLCBhZHZpc29yaWVzOiBibG9ja2luZy5tYXAoKGEpID0+IGEuaWQpLCAuLi4oZml4ZWQubGVuZ3RoID8geyBmaXhlZFZlcnNpb25zOiBmaXhlZCB9IDoge30pIH0sXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGUgb3JnJ3MgaW5zdGFsbCBzdGF0ZSBmb3Igb25lIGxpc3Rpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBUaGUgb3JnIChhbmQsIGZvciBhIHRlYW0sIGl0cyByb290IG9yZykgYSByZXNvbHV0aW9uIHJ1bnMgZm9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHV0aW9uU2NvcGUge1xuICBvcmdJZDogc3RyaW5nO1xuICAvKiogVGhlIHJvb3Qgb3JnIHdoZW4gdGhlIGNhbGxlciBpcyBhIHRlYW0uICovXG4gIHJvb3RPcmdJZD86IHN0cmluZztcbn1cblxuLyoqIFRoZSBvcmcgaWRzIHdob3NlIGluc3RhbGxzIGFuZCBwb2xpY2llcyBhcHBseSwgb3duIGZpcnN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjb3BlT3JnSWRzKHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG93biA9IHNjb3BlLm9yZ0lkLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJvb3QgPSBzY29wZS5yb290T3JnSWQ/LnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiByb290ICYmIHJvb3QgIT09IG93biA/IFtvd24sIHJvb3RdIDogW293bl07XG59XG5cbi8qKlxuICogSG93IHRoZSBvcmcgcmVhY2hlcyBgbGlzdGluZ2Ag4oCUIG9yIHRoZSByZWZ1c2FsLiBBbiBBQ1RJVkUgb3duLW9yZyByb3cgd2lucyxcbiAqIHRoZW4gdGhlIHJvb3Qgb3JnJ3MgKGEgdGVhbSBpbmhlcml0cyBpdCk7IGZhaWxpbmcgYm90aCwgdGhlIGltcGxpY2l0XG4gKiBPZmZpY2lhbCBpbnN0YWxsICh1bmxlc3MgdGhlIHBvbGljeSBpcyBgZXhwbGljaXRgKTsgb3RoZXJ3aXNlIHRoZSBvcmcncyBvd25cbiAqIHBlbmRpbmcgLyBkZW5pZWQgcm93IGV4cGxhaW5zIHRoZSByZWZ1c2FsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbE1vZGVGb3IoXG4gIHB1Ymxpc2hlcjogUGljazxQdWJsaXNoZXIsICdoYW5kbGUnPixcbiAgbGlzdGluZzogUGljazxQbHVnaW5MaXN0aW5nLCAnaWQnIHwgJ25hbWUnPixcbiAgaW5zdGFsbHM6IHJlYWRvbmx5IFBsdWdpbkluc3RhbGxbXSxcbiAgcG9saWN5OiBDb25zdW1wdGlvblBvbGljeSxcbiAgc2NvcGU6IFJlc29sdXRpb25TY29wZSxcbik6IEluc3RhbGxNb2RlIHwgUmVzb2x1dGlvblJlZnVzYWwge1xuICBjb25zdCBbb3duLCByb290XSA9IHNjb3BlT3JnSWRzKHNjb3BlKTtcbiAgY29uc3QgZm9yTGlzdGluZyA9IGluc3RhbGxzLmZpbHRlcigoaSkgPT4gaS5saXN0aW5nSWQgPT09IGxpc3RpbmcuaWQpO1xuICBjb25zdCBvd25Sb3cgPSBmb3JMaXN0aW5nLmZpbmQoKGkpID0+IGkub3JnSWQudG9Mb3dlckNhc2UoKSA9PT0gb3duKTtcbiAgY29uc3Qgcm9vdFJvdyA9IHJvb3QgPyBmb3JMaXN0aW5nLmZpbmQoKGkpID0+IGkub3JnSWQudG9Mb3dlckNhc2UoKSA9PT0gcm9vdCkgOiB1bmRlZmluZWQ7XG4gIGlmIChvd25Sb3c/LnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHJldHVybiB7IGtpbmQ6ICdleHBsaWNpdCcsIGluc3RhbGw6IG93blJvdywgaW5oZXJpdGVkOiBmYWxzZSB9O1xuICBpZiAocm9vdFJvdz8uc3RhdHVzID09PSAnYWN0aXZlJykgcmV0dXJuIHsga2luZDogJ2V4cGxpY2l0JywgaW5zdGFsbDogcm9vdFJvdywgaW5oZXJpdGVkOiB0cnVlIH07XG4gIGNvbnN0IHJlZiA9IGAke3B1Ymxpc2hlci5oYW5kbGV9LyR7bGlzdGluZy5uYW1lfWA7XG4gIGlmIChwdWJsaXNoZXIuaGFuZGxlID09PSBPRkZJQ0lBTF9QVUJMSVNIRVJfSEFORExFKSB7XG4gICAgaWYgKHBvbGljeS5vZmZpY2lhbEluc3RhbGxzID09PSAnaW1wbGljaXQnKSByZXR1cm4geyBraW5kOiAnaW1wbGljaXQnIH07XG4gICAgaWYgKCFvd25Sb3cpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsXG4gICAgICAgIHJlYXNvbjogJ29mZmljaWFsX2V4cGxpY2l0JyxcbiAgICAgICAgbWVzc2FnZTogYFlvdXIgb3JnYW5pemF0aW9uIGluc3RhbGxzIE9mZmljaWFsIHBsdWdpbnMgZXhwbGljaXRseTsgaW5zdGFsbCAke3JlZn0gZmlyc3QuYCxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmIChvd25Sb3c/LnN0YXR1cyA9PT0gJ3BlbmRpbmdfYXBwcm92YWwnKSB7XG4gICAgcmV0dXJuIHsgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJywgcmVhc29uOiAncGVuZGluZ19hcHByb3ZhbCcsIG1lc3NhZ2U6IGBUaGUgaW5zdGFsbCBvZiAke3JlZn0gaXMgd2FpdGluZyBmb3IgYXBwcm92YWwuYCB9O1xuICB9XG4gIGlmIChvd25Sb3c/LnN0YXR1cyA9PT0gJ2RlbmllZCcpIHtcbiAgICByZXR1cm4geyBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLCByZWFzb246ICdkZW5pZWQnLCBtZXNzYWdlOiBgVGhlIGluc3RhbGwgb2YgJHtyZWZ9IHdhcyBkZW5pZWQuYCB9O1xuICB9XG4gIHJldHVybiB7IGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsIHJlYXNvbjogJ25vdF9pbnN0YWxsZWQnLCBtZXNzYWdlOiBgJHtyZWZ9IGlzIG5vdCBpbnN0YWxsZWQgaW4geW91ciBvcmdhbml6YXRpb24uYCB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGF0YSBzb3VyY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBUaGUgcm93cyB0aGUgcmVzb2x2ZXIgcmVhZHMuIEltcGxlbWVudGF0aW9ucyBtdXN0IHJ1biB3aXRoIGEgc2NvcGUgdGhhdCBjYW5cbiAqICByZWFkIHRoZSBlY29zeXN0ZW0gdGFibGVzIGFuZCB0aGUgb3JnJ3MgKGFuZCByb290IG9yZydzKSBpbnN0YWxsIHJvd3MuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RpbmdEYXRhU291cmNlIHtcbiAgcHVibGlzaGVyQnlIYW5kbGUoaGFuZGxlOiBzdHJpbmcpOiBQcm9taXNlPFB1Ymxpc2hlciB8IG51bGw+O1xuICBwdWJsaXNoZXJzQnlJZHMoaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UHVibGlzaGVyW10+O1xuICBsaXN0aW5nQnlOYW1lKHB1Ymxpc2hlcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luTGlzdGluZyB8IG51bGw+O1xuICAvKiogTGlzdGVkIC8gdW5tYWludGFpbmVkIGxpc3RpbmdzIChvcHRpb25hbGx5IG9ubHkgdGhlc2UgaWRzIG9yIG5hbWVzKS4gKi9cbiAgbGl2ZUxpc3RpbmdzKGZpbHRlcj86IHsgaWRzPzogc3RyaW5nW107IG5hbWVzPzogc3RyaW5nW10gfSk6IFByb21pc2U8UGx1Z2luTGlzdGluZ1tdPjtcbiAgdmVyc2lvbnNGb3JMaXN0aW5ncyhsaXN0aW5nSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luTGlzdGluZ1ZlcnNpb25bXT47XG4gIC8qKiBQVUJMSVNIRUQgYWR2aXNvcmllcy4gKi9cbiAgYWR2aXNvcmllc0Zvckxpc3RpbmdzKGxpc3RpbmdJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQbHVnaW5BZHZpc29yeVtdPjtcbiAgaW5zdGFsbHNGb3JPcmdzKG9yZ0lkczogc3RyaW5nW10pOiBQcm9taXNlPFBsdWdpbkluc3RhbGxbXT47XG4gIHBvbGljaWVzRm9yT3JncyhvcmdJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQbHVnaW5JbnN0YWxsUG9saWN5W10+O1xufVxuXG4vKipcbiAqIEEge0BsaW5rIExpc3RpbmdEYXRhU291cmNlfSBvdmVyIGEgZHJpenpsZSB0cmFuc2FjdGlvbi4gVGhlIGNhbGxlciBvd25zIHRoZVxuICogdHJhbnNhY3Rpb24ncyBzY29wZTogaXQgbXVzdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGVjb3N5c3RlbSB0YWJsZXMgKGFwcC1yb2xlXG4gKiBSTFMpIGFuZCB0aGUgaW5zdGFsbCByb3dzIG9mIHRoZSBvcmcgQU5EIGl0cyByb290IG9yZyAoYSB0ZWFtJ3MgcmVhZHMgb2YgaXRzXG4gKiByb290J3Mgcm93cyBuZWVkIGFuIGVsZXZhdGVkIHNjb3BlLCBsaWtlIHBhcmVudC1vcmcgcGx1Z2luIHJlYWRzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVMaXN0aW5nU291cmNlKHR4OiBDcnVkVHgpOiBMaXN0aW5nRGF0YVNvdXJjZSB7XG4gIGNvbnN0IGRiID0gdHg7XG4gIGNvbnN0IFAgPSBzY2hlbWEucHVibGlzaGVyO1xuICBjb25zdCBMID0gc2NoZW1hLnBsdWdpbkxpc3Rpbmc7XG4gIGNvbnN0IFYgPSBzY2hlbWEucGx1Z2luTGlzdGluZ1ZlcnNpb247XG4gIGNvbnN0IEEgPSBzY2hlbWEucGx1Z2luQWR2aXNvcnk7XG4gIGNvbnN0IEkgPSBzY2hlbWEucGx1Z2luSW5zdGFsbDtcbiAgY29uc3QgSVAgPSBzY2hlbWEucGx1Z2luSW5zdGFsbFBvbGljeTtcbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoZXJCeUhhbmRsZTogYXN5bmMgKGhhbmRsZSkgPT4gKChhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKFApLndoZXJlKGVxKFAuaGFuZGxlLCBoYW5kbGUpKSkgYXMgUHVibGlzaGVyW10pWzBdID8/IG51bGwsXG4gICAgcHVibGlzaGVyc0J5SWRzOiBhc3luYyAoaWRzKSA9PiAoaWRzLmxlbmd0aCA/IGRiLnNlbGVjdCgpLmZyb20oUCkud2hlcmUoaW5BcnJheShQLmlkLCBpZHMpKSA6IFtdKSxcbiAgICBsaXN0aW5nQnlOYW1lOiBhc3luYyAocHVibGlzaGVySWQsIG5hbWUpID0+XG4gICAgICAoKGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oTCkud2hlcmUoYW5kKGVxKEwucHVibGlzaGVySWQsIHB1Ymxpc2hlcklkKSwgZXEoTC5uYW1lLCBuYW1lKSkpKSBhcyBQbHVnaW5MaXN0aW5nW10pWzBdID8/IG51bGwsXG4gICAgbGl2ZUxpc3RpbmdzOiBhc3luYyAoZmlsdGVyID0ge30pID0+IHtcbiAgICAgIGlmIChmaWx0ZXIuaWRzICYmIGZpbHRlci5pZHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICBpZiAoZmlsdGVyLm5hbWVzICYmIGZpbHRlci5uYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICAgIHJldHVybiBkYi5zZWxlY3QoKS5mcm9tKEwpLndoZXJlKGFuZChcbiAgICAgICAgaW5BcnJheShMLnN0YXRlLCBbJ2xpc3RlZCcsICd1bm1haW50YWluZWQnXSksXG4gICAgICAgIC4uLihmaWx0ZXIuaWRzID8gW2luQXJyYXkoTC5pZCwgZmlsdGVyLmlkcyldIDogW10pLFxuICAgICAgICAuLi4oZmlsdGVyLm5hbWVzID8gW2luQXJyYXkoTC5uYW1lLCBmaWx0ZXIubmFtZXMpXSA6IFtdKSxcbiAgICAgICkpO1xuICAgIH0sXG4gICAgdmVyc2lvbnNGb3JMaXN0aW5nczogYXN5bmMgKGlkcykgPT4gKGlkcy5sZW5ndGggPyBkYi5zZWxlY3QoKS5mcm9tKFYpLndoZXJlKGluQXJyYXkoVi5saXN0aW5nSWQsIGlkcykpIDogW10pLFxuICAgIGFkdmlzb3JpZXNGb3JMaXN0aW5nczogYXN5bmMgKGlkcykgPT4gKGlkcy5sZW5ndGggPyBkYi5zZWxlY3QoKS5mcm9tKEEpLndoZXJlKGFuZChpbkFycmF5KEEubGlzdGluZ0lkLCBpZHMpLCBlcShBLnN0YXRlLCAncHVibGlzaGVkJykpKSA6IFtdKSxcbiAgICBpbnN0YWxsc0Zvck9yZ3M6IGFzeW5jIChvcmdJZHMpID0+IChvcmdJZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShJKS53aGVyZShpbkFycmF5KEkub3JnSWQsIG9yZ0lkcykpIDogW10pLFxuICAgIHBvbGljaWVzRm9yT3JnczogYXN5bmMgKG9yZ0lkcykgPT4gKG9yZ0lkcy5sZW5ndGggPyBkYi5zZWxlY3QoKS5mcm9tKElQKS53aGVyZShpbkFycmF5KElQLm9yZ0lkLCBvcmdJZHMpKSA6IFtdKSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc29sdXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBBIHBsdWdpbiByZWZlcmVuY2UgYXMgdGhlIHJlc29sdmVyIHJlYWRzIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0aW5nUmVmZXJlbmNlIHtcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGU7IGFic2VudCA9IHRoZSBPZmZpY2lhbCBsaXN0aW5nICh0aGUgdW5xdWFsaWZpZWQgZmFsbGJhY2spLiAqL1xuICBwdWJsaXNoZXI/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSByZWZlcmVuY2UncyBgZmlsdGVyLnZlcnNpb25gLiAqL1xuICB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKiogQSByZWZlcmVuY2UgdGhhdCByZXNvbHZlZCB0byBhIGxpc3RlZCB2ZXJzaW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0aW5nUmVzb2x2ZWQge1xuICBvazogdHJ1ZTtcbiAgcHVibGlzaGVyOiBQdWJsaXNoZXI7XG4gIGxpc3Rpbmc6IFBsdWdpbkxpc3Rpbmc7XG4gIHZlcnNpb246IFBsdWdpbkxpc3RpbmdWZXJzaW9uO1xuICBtb2RlOiBJbnN0YWxsTW9kZTtcbiAgcG9saWN5OiBDb25zdW1wdGlvblBvbGljeTtcbiAgLyoqIFRoZSBzcGVjIGRlY2xhcmVzIHNlY3JldHMgdGhlIHBvbGljeSB3aXRoaG9sZHMgZnJvbSB0aGlzIHRpZXIuICovXG4gIHNlY3JldHNXaXRoaGVsZDogYm9vbGVhbjtcbiAgd2FybmluZ3M6IFJlc29sdXRpb25XYXJuaW5nW107XG59XG5cbi8qKiBBIHJlZmVyZW5jZSB0aGF0IG5hbWVkIGEgbGlzdGluZyBidXQgY2FuJ3QgcmVzb2x2ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1JlZnVzZWQge1xuICBvazogZmFsc2U7XG4gIHJlZnVzYWw6IFJlc29sdXRpb25SZWZ1c2FsO1xuICBwdWJsaXNoZXI/OiBQdWJsaXNoZXI7XG4gIGxpc3Rpbmc/OiBQbHVnaW5MaXN0aW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYHJlZmAgdG8gYSBsaXN0ZWQgdmVyc2lvbiBmb3IgYHNjb3BlYCwgb3IgcmVmdXNlLiBOdWxsIHdoZW4gdGhlXG4gKiBsaXN0aW5nIGRvZXNuJ3QgZXhpc3QgYXQgYWxsIChhbiB1bnF1YWxpZmllZCByZWZlcmVuY2UgdGhlbiBzaW1wbHkgaGFzIG5vXG4gKiBPZmZpY2lhbCBmYWxsYmFjaykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlTGlzdGluZ1JlZmVyZW5jZShcbiAgc291cmNlOiBMaXN0aW5nRGF0YVNvdXJjZSxcbiAgcmVmOiBMaXN0aW5nUmVmZXJlbmNlLFxuICBzY29wZTogUmVzb2x1dGlvblNjb3BlLFxuKTogUHJvbWlzZTxMaXN0aW5nUmVzb2x2ZWQgfCBMaXN0aW5nUmVmdXNlZCB8IG51bGw+IHtcbiAgY29uc3QgaGFuZGxlID0gcmVmLnB1Ymxpc2hlciA/PyBPRkZJQ0lBTF9QVUJMSVNIRVJfSEFORExFO1xuICBjb25zdCBwdWJsaXNoZXIgPSBhd2FpdCBzb3VyY2UucHVibGlzaGVyQnlIYW5kbGUoaGFuZGxlKTtcbiAgaWYgKCFwdWJsaXNoZXIpIHJldHVybiBudWxsO1xuICBjb25zdCBsaXN0aW5nID0gYXdhaXQgc291cmNlLmxpc3RpbmdCeU5hbWUocHVibGlzaGVyLmlkLCByZWYubmFtZSk7XG4gIGlmICghbGlzdGluZykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3Qgb3JnSWRzID0gc2NvcGVPcmdJZHMoc2NvcGUpO1xuICBjb25zdCBbcG9saWNpZXMsIGluc3RhbGxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzb3VyY2UucG9saWNpZXNGb3JPcmdzKG9yZ0lkcyksIHNvdXJjZS5pbnN0YWxsc0Zvck9yZ3Mob3JnSWRzKV0pO1xuICBjb25zdCBwb2xpY3kgPSBlZmZlY3RpdmVDb25zdW1wdGlvblBvbGljeShwb2xpY2llcywgb3JnSWRzWzBdISwgb3JnSWRzWzFdKTtcbiAgY29uc3QgYmxvY2sgPSBsaXN0aW5nQmxvY2socG9saWN5LCBwdWJsaXNoZXIsIGxpc3RpbmcpO1xuICBpZiAoYmxvY2spIHJldHVybiB7IG9rOiBmYWxzZSwgcmVmdXNhbDogYmxvY2tSZWZ1c2FsKGJsb2NrKSwgcHVibGlzaGVyLCBsaXN0aW5nIH07XG5cbiAgY29uc3QgbW9kZSA9IGluc3RhbGxNb2RlRm9yKHB1Ymxpc2hlciwgbGlzdGluZywgaW5zdGFsbHMsIHBvbGljeSwgc2NvcGUpO1xuICBpZiAoJ2NvZGUnIGluIG1vZGUpIHJldHVybiB7IG9rOiBmYWxzZSwgcmVmdXNhbDogbW9kZSwgcHVibGlzaGVyLCBsaXN0aW5nIH07XG5cbiAgY29uc3QgW3ZlcnNpb25zLCBhZHZpc29yaWVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzb3VyY2UudmVyc2lvbnNGb3JMaXN0aW5ncyhbbGlzdGluZy5pZF0pLFxuICAgIHNvdXJjZS5hZHZpc29yaWVzRm9yTGlzdGluZ3MoW2xpc3RpbmcuaWRdKSxcbiAgXSk7XG4gIGNvbnN0IHJlZl8gPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBjb25zdCBjaG9pY2UgPSBzZWxlY3RMaXN0aW5nVmVyc2lvbih7IHJlZjogcmVmXywgdmVyc2lvbnMsIG1vZGUsIHJlcXVlc3RlZDogcmVmLnZlcnNpb24sIGFkdmlzb3JpZXMsIHBvbGljeSB9KTtcbiAgaWYgKCdyZWZ1c2FsJyBpbiBjaG9pY2UpIHJldHVybiB7IG9rOiBmYWxzZSwgcmVmdXNhbDogY2hvaWNlLnJlZnVzYWwsIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IHZlcnNpb24gPSBjaG9pY2UudmVyc2lvbjtcbiAgY29uc3QgeyB3YXJuaW5ncywgc2VjcmV0c1dpdGhoZWxkIH0gPSBsaXN0ZWRWZXJzaW9uV2FybmluZ3MoeyBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIGFkdmlzb3JpZXMsIHBvbGljeSB9KTtcbiAgcmV0dXJuIHsgb2s6IHRydWUsIHB1Ymxpc2hlciwgbGlzdGluZywgdmVyc2lvbiwgbW9kZSwgcG9saWN5LCBzZWNyZXRzV2l0aGhlbGQsIHdhcm5pbmdzIH07XG59XG5cbi8qKlxuICogVGhlIG5vbi1mYXRhbCBub3RlcyBhIHJlc29sdmVkIGxpc3RlZCB2ZXJzaW9uIGNhcnJpZXMgKGxvb2t1cCBhbnN3ZXJzLFxuICogc3ludGggcHJpbnRzIHRoZW0sIHRoZSBpbnN0YWxscyB2aWV3IHNob3dzIHRoZW0pOiBhbiB1bm1haW50YWluZWQgbGlzdGluZywgYVxuICogZGVwcmVjYXRlZCB2ZXJzaW9uLCBhIFBVQkxJU0hFRCBhZHZpc29yeSBjb3ZlcmluZyB0aGUgdmVyc2lvbiB0aGF0IHRoZSBvcmcnc1xuICogYGJsb2NrT25BZHZpc29yeWAgZG9lc24ndCBibG9jayAoYSBibG9ja2luZyBvbmUgcmVmdXNlcyByZXNvbHV0aW9uIGluc3RlYWQpLFxuICogYW5kIHdpdGhoZWxkIHNlY3JldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZWRWZXJzaW9uV2FybmluZ3MoaW5wdXQ6IHtcbiAgcHVibGlzaGVyOiBQaWNrPFB1Ymxpc2hlciwgJ2hhbmRsZScgfCAndGllcic+O1xuICBsaXN0aW5nOiBQaWNrPFBsdWdpbkxpc3RpbmcsICduYW1lJyB8ICdzdGF0ZSc+O1xuICB2ZXJzaW9uOiBQaWNrPFBsdWdpbkxpc3RpbmdWZXJzaW9uLCAndmVyc2lvbicgfCAnZGVwcmVjYXRlZEF0JyB8ICdkZXByZWNhdGlvbk1lc3NhZ2UnIHwgJ3NwZWNTbmFwc2hvdCc+O1xuICBhZHZpc29yaWVzOiByZWFkb25seSBQaWNrPFBsdWdpbkFkdmlzb3J5LCAnc2V2ZXJpdHknIHwgJ3N0YXRlJyB8ICdhZmZlY3RlZFJhbmdlJyB8ICdmaXhlZFZlcnNpb24nIHwgJ3N1bW1hcnknPltdO1xuICBwb2xpY3k6IFBpY2s8Q29uc3VtcHRpb25Qb2xpY3ksICdzZWNyZXRzQWxsb3dlZFRpZXJzJz47XG59KTogeyB3YXJuaW5nczogUmVzb2x1dGlvbldhcm5pbmdbXTsgc2VjcmV0c1dpdGhoZWxkOiBib29sZWFuIH0ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgbGlzdGluZywgdmVyc2lvbiwgYWR2aXNvcmllcywgcG9saWN5IH0gPSBpbnB1dDtcbiAgY29uc3QgcmVmID0gYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YDtcbiAgY29uc3QgZGVjbGFyZXNTZWNyZXRzID0gKHZlcnNpb24uc3BlY1NuYXBzaG90Py5zZWNyZXRzID8/IFtdKS5sZW5ndGggPiAwO1xuICBjb25zdCBzZWNyZXRzV2l0aGhlbGQgPSBkZWNsYXJlc1NlY3JldHMgJiYgIXBvbGljeS5zZWNyZXRzQWxsb3dlZFRpZXJzLmluY2x1ZGVzKHB1Ymxpc2hlci50aWVyKTtcbiAgY29uc3Qgd2FybmluZ3M6IFJlc29sdXRpb25XYXJuaW5nW10gPSBbXTtcbiAgaWYgKGxpc3Rpbmcuc3RhdGUgPT09ICd1bm1haW50YWluZWQnKSB7XG4gICAgd2FybmluZ3MucHVzaCh7IGNvZGU6ICdMSVNUSU5HX1VOTUFJTlRBSU5FRCcsIG1lc3NhZ2U6IGAke3JlZn0gaXMgdW5tYWludGFpbmVkOiBpdCByZWNlaXZlcyBubyB1cGRhdGVzLiBQbGFuIGEgcmVwbGFjZW1lbnQuYCB9KTtcbiAgfVxuICBpZiAodmVyc2lvbi5kZXByZWNhdGVkQXQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZTogJ1BMVUdJTl9ERVBSRUNBVEVEJywgbWVzc2FnZTogYCR7cmVmfUAke3ZlcnNpb24udmVyc2lvbn0gaXMgZGVwcmVjYXRlZCR7dmVyc2lvbi5kZXByZWNhdGlvbk1lc3NhZ2UgPyBgOiAke3ZlcnNpb24uZGVwcmVjYXRpb25NZXNzYWdlfWAgOiAnJ30uYCB9KTtcbiAgfVxuICBmb3IgKGNvbnN0IGEgb2YgYWR2aXNvcmllc0NvdmVyaW5nKGFkdmlzb3JpZXMsIHZlcnNpb24udmVyc2lvbikpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgIGNvZGU6ICdQTFVHSU5fQURWSVNPUlknLFxuICAgICAgbWVzc2FnZTogYCR7cmVmfUAke3ZlcnNpb24udmVyc2lvbn0gaXMgYWZmZWN0ZWQgYnkgYSAke2Euc2V2ZXJpdHl9IHNlY3VyaXR5IGFkdmlzb3J5OiAke2Euc3VtbWFyeX1gXG4gICAgICAgICsgYCR7YS5maXhlZFZlcnNpb24gPyBgIEZpeGVkIGluICR7YS5maXhlZFZlcnNpb259LmAgOiAnJ31gLFxuICAgIH0pO1xuICB9XG4gIGlmIChzZWNyZXRzV2l0aGhlbGQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZTogJ1BMVUdJTl9TRUNSRVRTX1dJVEhIRUxEJywgbWVzc2FnZTogYCR7cmVmfSBpcyBhICR7cHVibGlzaGVyLnRpZXJ9IHBsdWdpbjsgeW91ciBvcmdhbml6YXRpb24ncyBwb2xpY3kgZ2l2ZXMgaXQgbm8gc2VjcmV0cywgc28gaXRzIGRlY2xhcmVkIHNlY3JldHMgYXJlIG5vdCBpbmplY3RlZC5gIH0pO1xuICB9XG4gIHJldHVybiB7IHdhcm5pbmdzLCBzZWNyZXRzV2l0aGhlbGQgfTtcbn1cblxuLyoqXG4gKiBUaGUgcGx1Z2luIHJlY29yZCBhIHJlc29sdmVkIGxpc3RpbmcgdmVyc2lvbiBydW5zIGFzIOKAlCB0aGUgc2hhcGUgc3ludGggYW5kXG4gKiB0aGUgY29udHJhY3QgY2hlY2sgcmVhZCAoYSBgcGx1Z2luc2Agcm93J3MgcnVuIGZpZWxkcyksIGJ1aWx0IGZyb20gdGhlXG4gKiB2ZXJzaW9uJ3MgZnJvemVuIHNwZWMgc25hcHNob3QuIGBpZGAgaXMgdGhlIExJU1RJTkcgVkVSU0lPTidzIGlkICh0aGUgc3RlcFxuICogbWFuaWZlc3QgcmVzb2x2ZXMgaXQgYmFjayksIGBpbWFnZVJlcG9zaXRvcnlgIGl0cyBgcHVibGljLypgIGNvcHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZWRQbHVnaW5SZWNvcmQocmVzOiBMaXN0aW5nUmVzb2x2ZWQpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBtb2RlIH0gPSByZXM7XG4gIGNvbnN0IHMgPSAodmVyc2lvbi5zcGVjU25hcHNob3QgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBhcnIgPSA8VD4odjogdW5rbm93bik6IFRbXSA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgYXMgVFtdIDogW10pO1xuICBjb25zdCBvYmogPSAodjogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+ICh2ICYmIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2KSA/IHYgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gOiB7fSk7XG4gIHJldHVybiB7XG4gICAgaWQ6IHZlcnNpb24uaWQsXG4gICAgc291cmNlOiAnbGlzdGluZycsXG4gICAgcHVibGlzaGVyOiBwdWJsaXNoZXIuaGFuZGxlLFxuICAgIHB1Ymxpc2hlclRpZXI6IHB1Ymxpc2hlci50aWVyLFxuICAgIGxpc3RpbmdJZDogbGlzdGluZy5pZCxcbiAgICBpbnN0YWxsOiBtb2RlLmtpbmQsXG4gICAgbmFtZTogbGlzdGluZy5uYW1lLFxuICAgIHZlcnNpb246IHZlcnNpb24udmVyc2lvbixcbiAgICBpbWFnZVJlcG9zaXRvcnk6IHZlcnNpb24uaW1hZ2VSZXBvc2l0b3J5LFxuICAgIGltYWdlRGlnZXN0OiB2ZXJzaW9uLmltYWdlRGlnZXN0LFxuICAgIGJ1aWxkVHlwZTogdHlwZW9mIHMuYnVpbGRUeXBlID09PSAnc3RyaW5nJyA/IHMuYnVpbGRUeXBlIDogKHZlcnNpb24uaW1hZ2VEaWdlc3QgPyAnYnVpbGRfaW1hZ2UnIDogJ21ldGFkYXRhX29ubHknKSxcbiAgICBwbHVnaW5UeXBlOiBzLnBsdWdpblR5cGUgPz8gJ0NvZGVCdWlsZFN0ZXAnLFxuICAgIGNvbXB1dGVUeXBlOiBzLmNvbXB1dGVUeXBlID8/ICdTTUFMTCcsXG4gICAgZGVzY3JpcHRpb246IHMuZGVzY3JpcHRpb24gPz8gbGlzdGluZy5kZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgIHN1bW1hcnk6IHMuc3VtbWFyeSA/PyBsaXN0aW5nLnN1bW1hcnkgPz8gbnVsbCxcbiAgICBkaXNwbGF5TmFtZTogcy5kaXNwbGF5TmFtZSA/PyBudWxsLFxuICAgIGtleXdvcmRzOiBhcnI8c3RyaW5nPihzLmtleXdvcmRzKSxcbiAgICBjYXRlZ29yeTogcy5jYXRlZ29yeSA/PyBsaXN0aW5nLmNhdGVnb3J5LFxuICAgIG1ldGFkYXRhOiBvYmoocy5tZXRhZGF0YSksXG4gICAgZW52OiBvYmoocy5lbnYpLFxuICAgIGJ1aWxkQXJnczoge30sXG4gICAgaW5zdGFsbENvbW1hbmRzOiBhcnI8c3RyaW5nPihzLmluc3RhbGxDb21tYW5kcyksXG4gICAgY29tbWFuZHM6IGFycjxzdHJpbmc+KHMuY29tbWFuZHMpLFxuICAgIHRpbWVvdXQ6IHMudGltZW91dCA/PyBudWxsLFxuICAgIGZhaWx1cmVCZWhhdmlvcjogcy5mYWlsdXJlQmVoYXZpb3IgPz8gJ2ZhaWwnLFxuICAgIHByaW1hcnlPdXRwdXREaXJlY3Rvcnk6IHMucHJpbWFyeU91dHB1dERpcmVjdG9yeSA/PyBudWxsLFxuICAgIHNlY3JldHM6IHJlcy5zZWNyZXRzV2l0aGhlbGQgPyBbXSA6IGFycihzLnNlY3JldHMpLFxuICAgIHJlcXVpcmVkTWV0YWRhdGE6IGFycjxzdHJpbmc+KHMucmVxdWlyZWRNZXRhZGF0YSksXG4gICAgcmVxdWlyZWRWYXJzOiBhcnI8c3RyaW5nPihzLnJlcXVpcmVkVmFycyksXG4gICAgbWV0YWRhdGFUeXBlczogb2JqKHMubWV0YWRhdGFUeXBlcyksXG4gICAgdmFyc1R5cGVzOiBvYmoocy52YXJzVHlwZXMpLFxuICAgIG5ldHdvcmtFZ3Jlc3M6IGFycjxzdHJpbmc+KHMubmV0d29ya0VncmVzcyksXG4gICAgcnVuQXNSb290OiBzLnJ1bkFzUm9vdCA/PyBudWxsLFxuICAgIGxpY2Vuc2U6IHMubGljZW5zZSA/PyBsaXN0aW5nLmxpY2Vuc2UgPz8gbnVsbCxcbiAgICBob21lcGFnZVVybDogcy5ob21lcGFnZVVybCA/PyBsaXN0aW5nLmhvbWVwYWdlVXJsID8/IG51bGwsXG4gICAgc291cmNlVXJsOiBzLnNvdXJjZVVybCA/PyBsaXN0aW5nLnNvdXJjZVVybCA/PyBudWxsLFxuICAgIGRvY3VtZW50YXRpb25Vcmw6IHMuZG9jdW1lbnRhdGlvblVybCA/PyBudWxsLFxuICAgIGljb246IHMuaWNvbiA/PyBsaXN0aW5nLmljb24gPz8gbnVsbCxcbiAgICBjaGFuZ2Vsb2c6IHZlcnNpb24uY2hhbmdlbG9nLFxuICAgIGJyZWFraW5nOiB2ZXJzaW9uLmJyZWFraW5nLFxuICAgIHZ1bG5Dcml0aWNhbDogdmVyc2lvbi52dWxuQ3JpdGljYWwsXG4gICAgdnVsbkhpZ2g6IHZlcnNpb24udnVsbkhpZ2gsXG4gICAgc2Nhbm5lZEF0OiB2ZXJzaW9uLnNjYW5uZWRBdCxcbiAgICBsaWZlY3ljbGU6IHZlcnNpb24uZGVwcmVjYXRlZEF0ID8gJ2RlcHJlY2F0ZWQnIDogJ3Byb2R1Y3Rpb24nLFxuICAgIGRlcHJlY2F0ZWRBdDogdmVyc2lvbi5kZXByZWNhdGVkQXQsXG4gICAgZGVwcmVjYXRpb25NZXNzYWdlOiB2ZXJzaW9uLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICB5YW5rZWRBdDogbnVsbCxcbiAgICB5YW5rUmVhc29uOiBudWxsLFxuICAgIHZpc2liaWxpdHk6ICdwdWJsaWMnLFxuICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZXJ5dGhpbmcgYW4gb3JnIGNhbiByZXNvbHZlIChjYXRhbG9nLCBBSSBzZWxlY3Rpb24sIHBsYWNlaG9sZGVyIGd1YXJkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE9uZSBsaXN0aW5nIHdpdGggdGhlIG9yZydzIHN0YW5kaW5nIG9uIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdMaXN0aW5nU3RhdGUge1xuICBwdWJsaXNoZXI6IFB1Ymxpc2hlcjtcbiAgbGlzdGluZzogUGx1Z2luTGlzdGluZztcbiAgdmVyc2lvbnM6IFBsdWdpbkxpc3RpbmdWZXJzaW9uW107XG4gIC8qKiBIb3cgdGhlIG9yZyByZWFjaGVzIGl0LCBvciB3aHkgaXQgY2FuJ3QgKG5vdCBpbnN0YWxsZWQsIHBlbmRpbmcsIOKApikuICovXG4gIG1vZGU6IEluc3RhbGxNb2RlIHwgUmVzb2x1dGlvblJlZnVzYWw7XG4gIC8qKiBBIHBvbGljeSAvIHN0YXRlIGJsb2NrICh0aWVyLCBibG9ja2VkIGxpc3RpbmcsIHN1c3BlbmRlZCksIG9yIG51bGwuICovXG4gIGJsb2NrOiBMaXN0aW5nQmxvY2sgfCBudWxsO1xuICAvKiogV2hhdCBhbiBVTlZFUlNJT05FRCByZWZlcmVuY2UgcmVzb2x2ZXMgdG8gcmlnaHQgbm93LCBvciBudWxsLiAqL1xuICByZXNvbHZlZDogUGx1Z2luTGlzdGluZ1ZlcnNpb24gfCBudWxsO1xuICAvKiogV2h5IG5vdGhpbmcgcmVzb2x2ZXMsIHdoZW4gdGhlIG9yZyBkb2VzIHJlYWNoIHRoZSBsaXN0aW5nIChlLmcuIGFuIGFkdmlzb3J5IGJsb2NrKS4gKi9cbiAgcmVmdXNhbDogUmVzb2x1dGlvblJlZnVzYWwgfCBudWxsO1xuICAvKiogVGhlIGxpc3RpbmcncyBQVUJMSVNIRUQgYWR2aXNvcmllcy4gKi9cbiAgYWR2aXNvcmllczogUGx1Z2luQWR2aXNvcnlbXTtcbiAgLyoqIFRoZSBvcmcncyBvd24gaW5zdGFsbCByb3cgZm9yIGl0IChleHBsaWNpdCwgcG9zc2libHkgcGVuZGluZy9kZW5pZWQpLiAqL1xuICBvd25JbnN0YWxsOiBQbHVnaW5JbnN0YWxsIHwgbnVsbDtcbiAgLyoqIFRoZSBvcmcncyBlZmZlY3RpdmUgY29uc3VtcHRpb24gcG9saWN5ICh0aGUgc2FtZSBmb3IgZXZlcnkgbGlzdGluZykuICovXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG59XG5cbi8qKiBUaGUgb3JnJ3MgcG9saWN5ICsgaW5zdGFsbCByb3dzIChvd24gYW5kIHJvb3QpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdJbnN0YWxsQ29udGV4dCB7XG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG4gIGluc3RhbGxzOiBQbHVnaW5JbnN0YWxsW107XG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGU7XG59XG5cbi8qKiBMb2FkIHRoZSBvcmcncyBwb2xpY3kgYW5kIGluc3RhbGwgcm93cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkT3JnSW5zdGFsbENvbnRleHQoc291cmNlOiBMaXN0aW5nRGF0YVNvdXJjZSwgc2NvcGU6IFJlc29sdXRpb25TY29wZSk6IFByb21pc2U8T3JnSW5zdGFsbENvbnRleHQ+IHtcbiAgY29uc3Qgb3JnSWRzID0gc2NvcGVPcmdJZHMoc2NvcGUpO1xuICBjb25zdCBbcG9saWNpZXMsIGluc3RhbGxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzb3VyY2UucG9saWNpZXNGb3JPcmdzKG9yZ0lkcyksIHNvdXJjZS5pbnN0YWxsc0Zvck9yZ3Mob3JnSWRzKV0pO1xuICByZXR1cm4geyBwb2xpY3k6IGVmZmVjdGl2ZUNvbnN1bXB0aW9uUG9saWN5KHBvbGljaWVzLCBvcmdJZHNbMF0hLCBvcmdJZHNbMV0pLCBpbnN0YWxscywgc2NvcGUgfTtcbn1cblxuLyoqXG4gKiBUaGUgb3JnJ3Mgc3RhbmRpbmcgb24gZXZlcnkgbGl2ZSBsaXN0aW5nIChvciBvbmx5IGBmaWx0ZXJgJ3MpLiBVc2VkIGJ5IHRoZVxuICogaW4tYXBwIGNhdGFsb2c7IHtAbGluayByZXNvbHZhYmxlTGlzdGluZ3N9IG5hcnJvd3MgaXQgdG8gd2hhdCByZXNvbHZlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9yZ0xpc3RpbmdTdGF0ZXMoXG4gIHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUsXG4gIGZpbHRlcjogeyBpZHM/OiBzdHJpbmdbXTsgbmFtZXM/OiBzdHJpbmdbXSB9ID0ge30sXG4gIGN0eD86IE9yZ0luc3RhbGxDb250ZXh0LFxuKTogUHJvbWlzZTxPcmdMaXN0aW5nU3RhdGVbXT4ge1xuICBjb25zdCBjb250ZXh0ID0gY3R4ID8/IGF3YWl0IGxvYWRPcmdJbnN0YWxsQ29udGV4dChzb3VyY2UsIHNjb3BlKTtcbiAgY29uc3QgbGl2ZSA9IGF3YWl0IHNvdXJjZS5saXZlTGlzdGluZ3MoZmlsdGVyKTtcbiAgaWYgKGxpdmUubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGNvbnN0IGlkcyA9IGxpdmUubWFwKChsKSA9PiBsLmlkKTtcbiAgY29uc3QgW3B1YnMsIHZlcnNpb25zLCBhZHZpc29yaWVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzb3VyY2UucHVibGlzaGVyc0J5SWRzKFsuLi5uZXcgU2V0KGxpdmUubWFwKChsKSA9PiBsLnB1Ymxpc2hlcklkKSldKSxcbiAgICBzb3VyY2UudmVyc2lvbnNGb3JMaXN0aW5ncyhpZHMpLFxuICAgIHNvdXJjZS5hZHZpc29yaWVzRm9yTGlzdGluZ3MoaWRzKSxcbiAgXSk7XG4gIGNvbnN0IGJ5UHVibGlzaGVyID0gbmV3IE1hcChwdWJzLm1hcCgocCkgPT4gW3AuaWQsIHBdKSk7XG4gIGNvbnN0IG93biA9IHNjb3BlT3JnSWRzKHNjb3BlKVswXSE7XG4gIGNvbnN0IG91dDogT3JnTGlzdGluZ1N0YXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaXN0aW5nIG9mIGxpdmUpIHtcbiAgICBjb25zdCBwdWJsaXNoZXIgPSBieVB1Ymxpc2hlci5nZXQobGlzdGluZy5wdWJsaXNoZXJJZCk7XG4gICAgaWYgKCFwdWJsaXNoZXIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZzID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiB2Lmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCk7XG4gICAgY29uc3QgYmxvY2sgPSBsaXN0aW5nQmxvY2soY29udGV4dC5wb2xpY3ksIHB1Ymxpc2hlciwgbGlzdGluZyk7XG4gICAgY29uc3QgbW9kZSA9IGluc3RhbGxNb2RlRm9yKHB1Ymxpc2hlciwgbGlzdGluZywgY29udGV4dC5pbnN0YWxscywgY29udGV4dC5wb2xpY3ksIHNjb3BlKTtcbiAgICBjb25zdCBsaXN0aW5nQWR2aXNvcmllcyA9IGFkdmlzb3JpZXMuZmlsdGVyKChhKSA9PiBhLmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCk7XG4gICAgbGV0IHJlc29sdmVkOiBQbHVnaW5MaXN0aW5nVmVyc2lvbiB8IG51bGwgPSBudWxsO1xuICAgIGxldCByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbCB8IG51bGwgPSBudWxsO1xuICAgIGlmICghYmxvY2sgJiYgISgnY29kZScgaW4gbW9kZSkpIHtcbiAgICAgIGNvbnN0IGNob2ljZSA9IHNlbGVjdExpc3RpbmdWZXJzaW9uKHtcbiAgICAgICAgcmVmOiBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gLCB2ZXJzaW9uczogdnMsIG1vZGUsIGFkdmlzb3JpZXM6IGxpc3RpbmdBZHZpc29yaWVzLCBwb2xpY3k6IGNvbnRleHQucG9saWN5LFxuICAgICAgfSk7XG4gICAgICBpZiAoJ3ZlcnNpb24nIGluIGNob2ljZSkgcmVzb2x2ZWQgPSBjaG9pY2UudmVyc2lvbjtcbiAgICAgIGVsc2UgcmVmdXNhbCA9IGNob2ljZS5yZWZ1c2FsO1xuICAgIH1cbiAgICBjb25zdCBvd25JbnN0YWxsID0gY29udGV4dC5pbnN0YWxscy5maW5kKChpKSA9PiBpLmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCAmJiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IG93bikgPz8gbnVsbDtcbiAgICBvdXQucHVzaCh7IHB1Ymxpc2hlciwgbGlzdGluZywgdmVyc2lvbnM6IHZzLCBtb2RlLCBibG9jaywgcmVzb2x2ZWQsIHJlZnVzYWwsIGFkdmlzb3JpZXM6IGxpc3RpbmdBZHZpc29yaWVzLCBvd25JbnN0YWxsLCBwb2xpY3k6IGNvbnRleHQucG9saWN5IH0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgbGlzdGluZ3MgYW4gb3JnJ3MgcmVmZXJlbmNlcyByZXNvbHZlIHRvIG5vdyAoaW5zdGFsbGVkIG9yIGltcGxpY2l0LCBub3QgYmxvY2tlZCkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2YWJsZUxpc3RpbmdzKFxuICBzb3VyY2U6IExpc3RpbmdEYXRhU291cmNlLFxuICBzY29wZTogUmVzb2x1dGlvblNjb3BlLFxuICBmaWx0ZXI6IHsgbmFtZXM/OiBzdHJpbmdbXSB9ID0ge30sXG4pOiBQcm9taXNlPEFycmF5PE9yZ0xpc3RpbmdTdGF0ZSAmIHsgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIH0+PiB7XG4gIHJldHVybiAoYXdhaXQgb3JnTGlzdGluZ1N0YXRlcyhzb3VyY2UsIHNjb3BlLCBmaWx0ZXIpKVxuICAgIC5maWx0ZXIoKHMpOiBzIGlzIE9yZ0xpc3RpbmdTdGF0ZSAmIHsgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIH0gPT4gcy5yZXNvbHZlZCAhPT0gbnVsbCk7XG59XG4iXX0=
680
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3BsdWdpbi1yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUNMLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsR0FDdkUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFL0MsT0FBTyxFQUNMLGFBQWEsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixHQUNuRixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsZUFBZSxFQUNmLE1BQU0sR0FhUCxNQUFNLCtCQUErQixDQUFDO0FBZ0J2QywyRUFBMkU7QUFDM0UsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWdDLE1BQU0sQ0FBQyxNQUFNLENBQW9CO0lBQ3RHLFlBQVksRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFDdEMsb0JBQW9CLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDO0lBQ2pELG1CQUFtQixFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztJQUM3QyxlQUFlLEVBQUUsVUFBVTtJQUMzQixnQkFBZ0IsRUFBRSxVQUFVO0lBQzVCLGVBQWUsRUFBRSxFQUFFO0NBQ3BCLENBQUMsQ0FBQztBQUVILHFEQUFxRDtBQUNyRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFFeEMsTUFBTSxXQUFXLEdBQStCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUU5RSxNQUFNLFNB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RTtZQUNsQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNyRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN6RCxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDbEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFDNUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNsRCxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3pELENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFD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RSxPQUFPLENBQUMsTUFBTTthQUN0SCxDQUFDLENBQUM7WUFDSCxJQUFJLFNBQVMsSUFBSSxNQUFNO2dCQUFFLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztnQkFDOUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDaEMsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDckgsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEosQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELDRGQUE0RjtBQUM1RixNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxNQUF5QixFQUN6QixLQUFzQixFQUN0QixNQUFNLEdBQXlCLEVBQUU7SUFFakMsT0FBTyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNuRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQTZELEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ25HLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSZXNvbHZpbmcgYSBwbHVnaW4gcmVmZXJlbmNlIHRvIGFuIGVjb3N5c3RlbSBMSVNUSU5HIHZlcnNpb24gdGhyb3VnaCB0aGVcbiAqIG9yZydzIGluc3RhbGwgKGRvY3MvcGx1Z2luLWluc3RhbGxpbmcubWQpLlxuICpcbiAqIE9uZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYnkgZXZlcnkgcGxhY2UgdGhhdCBhbnN3ZXJzIFwid2hpY2ggbGlzdGVkIHZlcnNpb25cbiAqIGRvZXMgdGhpcyBvcmcncyByZWZlcmVuY2UgcnVuP1wiOiB0aGUgcGx1Z2luIHNlcnZpY2UncyBgL3BsdWdpbnMvbG9va3VwYCAod2hhdFxuICogc3ludGggcGlucyksIHRoZSBwaXBlbGluZSBzZXJ2aWNlJ3MgY29udHJhY3QgY2hlY2sgYXQgcGlwZWxpbmUgY3JlYXRlLCB0aGUgQUlcbiAqIGdlbmVyYXRvcidzIHBsdWdpbiBsaXN0IGFuZCB0aGUgcGxhY2Vob2xkZXIgZ3VhcmQuIFRoZSBkZWNpc2lvbnMgYXJlIFBVUkVcbiAqIGZ1bmN0aW9ucyBvdmVyIGxvYWRlZCByb3dzOyB0aGUgcm93cyBjb21lIHRocm91Z2ggYSB7QGxpbmsgTGlzdGluZ0RhdGFTb3VyY2V9XG4gKiBzbyBlYWNoIHNlcnZpY2UgY2FuIGxvYWQgdGhlbSBpdHMgb3duIHdheSAoe0BsaW5rIGRyaXp6bGVMaXN0aW5nU291cmNlfSBpcyB0aGVcbiAqIHBsYWluIGRyaXp6bGUgb25lKS5cbiAqXG4gKiBUaGUgbW9kZWw6XG4gKiAgLSBBbiBvcmcgcmVzb2x2ZXMgYSBsaXN0aW5nIG9ubHkgdGhyb3VnaCBhbiBJTlNUQUxMOiBhbiBleHBsaWNpdFxuICogICAgYHBsdWdpbl9pbnN0YWxsc2Agcm93IChpdHMgb3duLCBvciDigJQgZm9yIGEgdGVhbSDigJQgaXRzIHJvb3Qgb3JnJ3MpLCBvclxuICogICAgZm9yIHRoZSBPZmZpY2lhbCBwdWJsaXNoZXIgdGhlIElNUExJQ0lUIGluc3RhbGwgZXZlcnkgb3JnIGhhcyB1bmxlc3MgaXRzXG4gKiAgICBjb25zdW1wdGlvbiBwb2xpY3kgc2F5cyBgb2ZmaWNpYWxJbnN0YWxsczogZXhwbGljaXRgLiBBbiBleHBsaWNpdFxuICogICAgaW5zdGFsbCBvdmVycmlkZXMgdGhlIGltcGxpY2l0IG9uZS5cbiAqICAtIFRoZSBvcmcncyBDT05TVU1QVElPTiBQT0xJQ1kgaXMgYXBwbGllZCBhdCBldmVyeSByZXNvbHV0aW9uOiBhbGxvd2VkXG4gKiAgICB0aWVycywgYmxvY2tlZCBsaXN0aW5ncywgYWR2aXNvcnkgYmxvY2tpbmc7IHNlY3JldHMgYXJlIHdpdGhoZWxkIGZyb20gdGllcnNcbiAqICAgIHRoZSBwb2xpY3kgZG9lc24ndCB0cnVzdCB3aXRoIHRoZW0uIEEgdGVhbSdzIHBvbGljeSBpcyBtZXJnZWQgd2l0aCBpdHMgcm9vdFxuICogICAgb3JnJ3MgYW5kIGNhbiBvbmx5IGJlIHN0cmljdGVyLlxuICogIC0gVmVyc2lvbiBjaG9pY2U6IHRoZSBpbnN0YWxsJ3MgcmFuZ2UgKHBpbm5lZCAvIGB+YCAvIGBeYCAvIG5vbi1icmVha2luZ1xuICogICAgbGF0ZXN0OyBpbXBsaWNpdCA9IHRoZSBsb3dlc3QgbGl2ZSBtYWpvciksIG5hcnJvd2VkIGJ5IHRoZSByZWZlcmVuY2UncyBvd25cbiAqICAgIHZlcnNpb24gc3BlYy4gWWFua2VkIHZlcnNpb25zIG5ldmVyIHJlc29sdmUgZm9yIGEgbGlzdGluZzsgYSBwYXVzZWRcbiAqICAgIHZlcnNpb24gaXMgc2tpcHBlZCB1bmxlc3MgdGhlIGluc3RhbGwgYWxyZWFkeSByZXNvbHZlZCB0byBpdCBvciB0aGVcbiAqICAgIHJlZmVyZW5jZSBwaW5zIGl0IGV4YWN0bHk7IGFkdmlzb3J5LWJsb2NrZWQgdmVyc2lvbnMgYXJlIHNraXBwZWQuXG4gKiAgLSBTY2FuIGZsYWdzOiBhIHZlcnNpb24gdGhlIG5pZ2h0bHkgcmVzY2FuIEZMQUdHRUQgKGZpeGFibGUgQ3JpdGljYWxzXG4gKiAgICBvdmVyIGBQTFVHSU5fVlVMTl9NQVhfQ1JJVElDQUxgKSByZXNvbHZlcyB3aXRoIGEgYFZVTE5fRkxBR0dFRGAgd2FybmluZyDigJRcbiAqICAgIG9yLCB3aXRoIGBQTFVHSU5fQkxPQ0tfT05fTkVXX0NSSVRJQ0FMYCBvbiwgaXMgc2tpcHBlZCBsaWtlIGFuXG4gKiAgICBhZHZpc29yeS1ibG9ja2VkIG9uZSwgYW5kIGFuIGV4YWN0IHBpbiB0byBpdCBpcyByZWZ1c2VkXG4gKiAgICBgUExVR0lOX1ZFUlNJT05fVlVMTl9CTE9DS0VEYC5cbiAqL1xuXG5pbXBvcnQge1xuICBhc1NjYW5GbGFnLCBibG9ja09uTmV3Q3JpdGljYWwsIHZ1bG5CbG9ja2VkTWVzc2FnZSwgdnVsbkZsYWdnZWRXYXJuaW5nLCB0eXBlIFZ1bG5GbGFnZ2VkV2FybmluZyxcbn0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgYW5kLCBlcSwgaW5BcnJheSB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQ3J1ZFR4IH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHtcbiAgY29tcGFyZVNlbXZlciwgaXNWZXJzaW9uUmFuZ2UsIHBhcnNlU2VtdmVyLCBwYXJzZVZlcnNpb25TcGVjLCBzYXRpc2ZpZXNWZXJzaW9uU3BlYyxcbn0gZnJvbSAnLi9zZW12ZXItcmFuZ2UuanMnO1xuaW1wb3J0IHtcbiAgT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSxcbiAgUFVCTElTSEVSX1RJRVJTLFxuICBzY2hlbWEsXG4gIHR5cGUgQWR2aXNvcnlTZXZlcml0eSxcbiAgdHlwZSBCbG9ja2VkTGlzdGluZ1JlZixcbiAgdHlwZSBCbG9ja09uQWR2aXNvcnksXG4gIHR5cGUgSW5zdGFsbFZlcnNpb25Qb2xpY3ksXG4gIHR5cGUgT2ZmaWNpYWxJbnN0YWxscyxcbiAgdHlwZSBQbHVnaW5BZHZpc29yeSxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsLFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHR5cGUgUGx1Z2luTGlzdGluZyxcbiAgdHlwZSBQbHVnaW5MaXN0aW5nVmVyc2lvbixcbiAgdHlwZSBQdWJsaXNoZXIsXG4gIHR5cGUgUHVibGlzaGVyVGllcixcbn0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uc3VtcHRpb24gcG9saWN5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQW4gb3JnJ3MgY29uc3VtcHRpb24gcG9saWN5LCBhcyB0aGUgcmVzb2x2ZXIgYXBwbGllcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc3VtcHRpb25Qb2xpY3kge1xuICBhbGxvd2VkVGllcnM6IFB1Ymxpc2hlclRpZXJbXTtcbiAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IFB1Ymxpc2hlclRpZXJbXTtcbiAgc2VjcmV0c0FsbG93ZWRUaWVyczogUHVibGlzaGVyVGllcltdO1xuICBibG9ja09uQWR2aXNvcnk6IEJsb2NrT25BZHZpc29yeTtcbiAgb2ZmaWNpYWxJbnN0YWxsczogT2ZmaWNpYWxJbnN0YWxscztcbiAgYmxvY2tlZExpc3RpbmdzOiBCbG9ja2VkTGlzdGluZ1JlZltdO1xufVxuXG4vKiogVGhlIGRlZmF1bHRzIChhbmQgdGhlIGNvbHVtbiBkZWZhdWx0cyBvZiBgcGx1Z2luX2luc3RhbGxfcG9saWNpZXNgKS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTlNVTVBUSU9OX1BPTElDWTogUmVhZG9ubHk8Q29uc3VtcHRpb25Qb2xpY3k+ID0gT2JqZWN0LmZyZWV6ZTxDb25zdW1wdGlvblBvbGljeT4oe1xuICBhbGxvd2VkVGllcnM6IFsnb2ZmaWNpYWwnLCAndmVyaWZpZWQnXSxcbiAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IFsnY29tbXVuaXR5JywgJ3VudmVyaWZpZWQnXSxcbiAgc2VjcmV0c0FsbG93ZWRUaWVyczogWydvZmZpY2lhbCcsICd2ZXJpZmllZCddLFxuICBibG9ja09uQWR2aXNvcnk6ICdjcml0aWNhbCcsXG4gIG9mZmljaWFsSW5zdGFsbHM6ICdpbXBsaWNpdCcsXG4gIGJsb2NrZWRMaXN0aW5nczogW10sXG59KTtcblxuLyoqIEF0IG1vc3QgdGhpcyBtYW55IGJsb2NrZWQgbGlzdGluZ3MgcGVyIHBvbGljeS4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQkxPQ0tFRF9MSVNUSU5HUyA9IDUwMDtcblxuY29uc3QgQkxPQ0tfT1JERVI6IHJlYWRvbmx5IEJsb2NrT25BZHZpc29yeVtdID0gWyduZXZlcicsICdjcml0aWNhbCcsICdoaWdoJ107XG5cbmNvbnN0IHNvcnRUaWVycyA9ICh0aWVyczogSXRlcmFibGU8UHVibGlzaGVyVGllcj4pOiBQdWJsaXNoZXJUaWVyW10gPT5cbiAgUFVCTElTSEVSX1RJRVJTLmZpbHRlcigodCkgPT4gbmV3IFNldCh0aWVycykuaGFzKHQpKTtcblxuY29uc3QgbGlzdGluZ0tleSA9IChyOiBCbG9ja2VkTGlzdGluZ1JlZik6IHN0cmluZyA9PiBgJHtyLnB1Ymxpc2hlcn0vJHtyLm5hbWV9YDtcblxuZnVuY3Rpb24gdW5pcXVlTGlzdGluZ3MocmVmczogcmVhZG9ubHkgQmxvY2tlZExpc3RpbmdSZWZbXSk6IEJsb2NrZWRMaXN0aW5nUmVmW10ge1xuICBjb25zdCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIEJsb2NrZWRMaXN0aW5nUmVmPigpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVmcykgc2Vlbi5zZXQobGlzdGluZ0tleShyKSwgeyBwdWJsaXNoZXI6IHIucHVibGlzaGVyLCBuYW1lOiByLm5hbWUgfSk7XG4gIHJldHVybiBbLi4uc2Vlbi52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT4gbGlzdGluZ0tleShhKS5sb2NhbGVDb21wYXJlKGxpc3RpbmdLZXkoYikpKTtcbn1cblxuLyoqIEEgc3RvcmVkIHBvbGljeSByb3cgKG9yIG5vbmUpIGFzIGEge0BsaW5rIENvbnN1bXB0aW9uUG9saWN5fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xpY3lPZihyb3c6IFBhcnRpYWw8UGx1Z2luSW5zdGFsbFBvbGljeT4gfCBudWxsIHwgdW5kZWZpbmVkKTogQ29uc3VtcHRpb25Qb2xpY3kge1xuICBjb25zdCBkID0gREVGQVVMVF9DT05TVU1QVElPTl9QT0xJQ1k7XG4gIHJldHVybiB7XG4gICAgYWxsb3dlZFRpZXJzOiBzb3J0VGllcnMocm93Py5hbGxvd2VkVGllcnMgPz8gZC5hbGxvd2VkVGllcnMpLFxuICAgIHJlcXVpcmVBcHByb3ZhbFRpZXJzOiBzb3J0VGllcnMocm93Py5yZXF1aXJlQXBwcm92YWxUaWVycyA/PyBkLnJlcXVpcmVBcHByb3ZhbFRpZXJzKSxcbiAgICBzZWNyZXRzQWxsb3dlZFRpZXJzOiBzb3J0VGllcnMocm93Py5zZWNyZXRzQWxsb3dlZFRpZXJzID8/IGQuc2VjcmV0c0FsbG93ZWRUaWVycyksXG4gICAgYmxvY2tPbkFkdmlzb3J5OiByb3c/LmJsb2NrT25BZHZpc29yeSA/PyBkLmJsb2NrT25BZHZpc29yeSxcbiAgICBvZmZpY2lhbEluc3RhbGxzOiByb3c/Lm9mZmljaWFsSW5zdGFsbHMgPz8gZC5vZmZpY2lhbEluc3RhbGxzLFxuICAgIGJsb2NrZWRMaXN0aW5nczogdW5pcXVlTGlzdGluZ3Mocm93Py5ibG9ja2VkTGlzdGluZ3MgPz8gZC5ibG9ja2VkTGlzdGluZ3MpLFxuICB9O1xufVxuXG4vKipcbiAqIEEgdGVhbSdzIHBvbGljeSB1bmRlciBpdHMgcm9vdCBvcmcnczogZWFjaCBmaWVsZCB0YWtlcyB0aGUgU1RSSUNURVIgb2ZcbiAqIHRoZSB0d28sIHNvIGEgdGVhbSBjYW4gbmFycm93IHdoYXQgaXRzIHJvb3QgYWxsb3dzIGJ1dCBuZXZlciB3aWRlbiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ29uc3VtcHRpb25Qb2xpY2llcyhyb290OiBDb25zdW1wdGlvblBvbGljeSwgdGVhbTogQ29uc3VtcHRpb25Qb2xpY3kpOiBDb25zdW1wdGlvblBvbGljeSB7XG4gIGNvbnN0IGludGVyc2VjdCA9IChhOiBQdWJsaXNoZXJUaWVyW10sIGI6IFB1Ymxpc2hlclRpZXJbXSkgPT4gc29ydFRpZXJzKGEuZmlsdGVyKCh0KSA9PiBiLmluY2x1ZGVzKHQpKSk7XG4gIGNvbnN0IHVuaW9uID0gKGE6IFB1Ymxpc2hlclRpZXJbXSwgYjogUHVibGlzaGVyVGllcltdKSA9PiBzb3J0VGllcnMoWy4uLmEsIC4uLmJdKTtcbiAgY29uc3Qgc3RyaWN0ZXJCbG9jayA9IEJMT0NLX09SREVSLmluZGV4T2Yocm9vdC5ibG9ja09uQWR2aXNvcnkpID49IEJMT0NLX09SREVSLmluZGV4T2YodGVhbS5ibG9ja09uQWR2aXNvcnkpXG4gICAgPyByb290LmJsb2NrT25BZHZpc29yeSA6IHRlYW0uYmxvY2tPbkFkdmlzb3J5O1xuICByZXR1cm4ge1xuICAgIGFsbG93ZWRUaWVyczogaW50ZXJzZWN0KHJvb3QuYWxsb3dlZFRpZXJzLCB0ZWFtLmFsbG93ZWRUaWVycyksXG4gICAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IHVuaW9uKHJvb3QucmVxdWlyZUFwcHJvdmFsVGllcnMsIHRlYW0ucmVxdWlyZUFwcHJvdmFsVGllcnMpLFxuICAgIHNlY3JldHNBbGxvd2VkVGllcnM6IGludGVyc2VjdChyb290LnNlY3JldHNBbGxvd2VkVGllcnMsIHRlYW0uc2VjcmV0c0FsbG93ZWRUaWVycyksXG4gICAgYmxvY2tPbkFkdmlzb3J5OiBzdHJpY3RlckJsb2NrLFxuICAgIG9mZmljaWFsSW5zdGFsbHM6IHJvb3Qub2ZmaWNpYWxJbnN0YWxscyA9PT0gJ2V4cGxpY2l0JyB8fCB0ZWFtLm9mZmljaWFsSW5zdGFsbHMgPT09ICdleHBsaWNpdCcgPyAnZXhwbGljaXQnIDogJ2ltcGxpY2l0JyxcbiAgICBibG9ja2VkTGlzdGluZ3M6IHVuaXF1ZUxpc3RpbmdzKFsuLi5yb290LmJsb2NrZWRMaXN0aW5ncywgLi4udGVhbS5ibG9ja2VkTGlzdGluZ3NdKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcG9saWN5IGFuIG9yZydzIHJlc29sdXRpb24gcnVucyB1bmRlci4gQSByb290IG9yZzogaXRzIG93biByb3cgKG9yIHRoZVxuICogZGVmYXVsdHMpLiBBIHRlYW0gKGByb290T3JnSWRgIHNldCk6IGl0cyByb290J3MgcG9saWN5LCBtZXJnZWQgd2l0aCB0aGVcbiAqIHRlYW0ncyBvd24gcm93IHdoZW4gaXQgaGFzIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdGl2ZUNvbnN1bXB0aW9uUG9saWN5KFxuICByb3dzOiBSZWFkb25seUFycmF5PFBhcnRpYWw8UGx1Z2luSW5zdGFsbFBvbGljeT4gJiB7IG9yZ0lkPzogc3RyaW5nIH0+LFxuICBvcmdJZDogc3RyaW5nLFxuICByb290T3JnSWQ/OiBzdHJpbmcsXG4pOiBDb25zdW1wdGlvblBvbGljeSB7XG4gIGNvbnN0IG93biA9IHJvd3MuZmluZCgocikgPT4gci5vcmdJZCA9PT0gb3JnSWQpID8/IG51bGw7XG4gIGlmICghcm9vdE9yZ0lkIHx8IHJvb3RPcmdJZCA9PT0gb3JnSWQpIHJldHVybiBwb2xpY3lPZihvd24pO1xuICBjb25zdCByb290ID0gcG9saWN5T2Yocm93cy5maW5kKChyKSA9PiByLm9yZ0lkID09PSByb290T3JnSWQpID8/IG51bGwpO1xuICByZXR1cm4gb3duID8gbWVyZ2VDb25zdW1wdGlvblBvbGljaWVzKHJvb3QsIHBvbGljeU9mKG93bikpIDogcm9vdDtcbn1cblxuY29uc3QgSEFORExFX1JFID0gL15bYS16MC05XSsoPzotW2EtejAtOV0rKSokLztcbmNvbnN0IE5BTUVfUkUgPSAvXlthLXowLTldW2EtejAtOS5fLV0qJC87XG5cbmZ1bmN0aW9uIHRpZXJMaXN0KHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBQdWJsaXNoZXJUaWVyW10gfCBzdHJpbmcge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodikpIHJldHVybiBgJHtmaWVsZH0gbXVzdCBiZSBhbiBhcnJheSBvZiB0aWVyc2A7XG4gIGNvbnN0IGJhZCA9IHYuZmlsdGVyKCh0KSA9PiAhKFBVQkxJU0hFUl9USUVSUyBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHQpKTtcbiAgaWYgKGJhZC5sZW5ndGgpIHJldHVybiBgJHtmaWVsZH0gaGFzIHVua25vd24gdGllcnM6ICR7YmFkLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuIHNvcnRUaWVycyh2IGFzIFB1Ymxpc2hlclRpZXJbXSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSAocGFydGlhbCkgcG9saWN5IHVwZGF0ZSBvdmVyIGBiYXNlYC4gUmV0dXJucyB0aGUgZnVsbCBuZXcgcG9saWN5LFxuICogb3IgYW4gZXJyb3IgbWVzc2FnZS4gYGJsb2NrZWRMaXN0aW5nc2AgZW50cmllcyBhcmUgYHsgcHVibGlzaGVyLCBuYW1lIH1gIG9yXG4gKiBgXCJwdWJsaXNoZXIvbmFtZVwiYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UG9saWN5VXBkYXRlKGJhc2U6IENvbnN1bXB0aW9uUG9saWN5LCBpbnB1dDogdW5rbm93bik6IENvbnN1bXB0aW9uUG9saWN5IHwgc3RyaW5nIHtcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoaW5wdXQpKSByZXR1cm4gJ2JvZHkgbXVzdCBiZSBhbiBvYmplY3QnO1xuICBjb25zdCBiID0gaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG5leHQ6IENvbnN1bXB0aW9uUG9saWN5ID0geyAuLi5iYXNlIH07XG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydhbGxvd2VkVGllcnMnLCAncmVxdWlyZUFwcHJvdmFsVGllcnMnLCAnc2VjcmV0c0FsbG93ZWRUaWVycyddIGFzIGNvbnN0KSB7XG4gICAgaWYgKGJbZmllbGRdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHRpZXJzID0gdGllckxpc3QoYltmaWVsZF0sIGZpZWxkKTtcbiAgICBpZiAodHlwZW9mIHRpZXJzID09PSAnc3RyaW5nJykgcmV0dXJuIHRpZXJzO1xuICAgIG5leHRbZmllbGRdID0gdGllcnM7XG4gIH1cbiAgaWYgKGIuYmxvY2tPbkFkdmlzb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIUJMT0NLX09SREVSLmluY2x1ZGVzKGIuYmxvY2tPbkFkdmlzb3J5IGFzIEJsb2NrT25BZHZpc29yeSkpIHJldHVybiAnYmxvY2tPbkFkdmlzb3J5IG11c3QgYmUgY3JpdGljYWwsIGhpZ2ggb3IgbmV2ZXInO1xuICAgIG5leHQuYmxvY2tPbkFkdmlzb3J5ID0gYi5ibG9ja09uQWR2aXNvcnkgYXMgQmxvY2tPbkFkdmlzb3J5O1xuICB9XG4gIGlmIChiLm9mZmljaWFsSW5zdGFsbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChiLm9mZmljaWFsSW5zdGFsbHMgIT09ICdpbXBsaWNpdCcgJiYgYi5vZmZpY2lhbEluc3RhbGxzICE9PSAnZXhwbGljaXQnKSByZXR1cm4gJ29mZmljaWFsSW5zdGFsbHMgbXVzdCBiZSBpbXBsaWNpdCBvciBleHBsaWNpdCc7XG4gICAgbmV4dC5vZmZpY2lhbEluc3RhbGxzID0gYi5vZmZpY2lhbEluc3RhbGxzO1xuICB9XG4gIGlmIChiLmJsb2NrZWRMaXN0aW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGIuYmxvY2tlZExpc3RpbmdzKSkgcmV0dXJuICdibG9ja2VkTGlzdGluZ3MgbXVzdCBiZSBhbiBhcnJheSc7XG4gICAgaWYgKGIuYmxvY2tlZExpc3RpbmdzLmxlbmd0aCA+IE1BWF9CTE9DS0VEX0xJU1RJTkdTKSByZXR1cm4gYGF0IG1vc3QgJHtNQVhfQkxPQ0tFRF9MSVNUSU5HU30gYmxvY2tlZCBsaXN0aW5nc2A7XG4gICAgY29uc3QgcmVmczogQmxvY2tlZExpc3RpbmdSZWZbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmF3IG9mIGIuYmxvY2tlZExpc3RpbmdzKSB7XG4gICAgICBjb25zdCByZWYgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJ1xuICAgICAgICA/ICgoKSA9PiB7IGNvbnN0IFtwdWJsaXNoZXIsIG5hbWUsIGV4dHJhXSA9IHJhdy5zcGxpdCgnLycpOyByZXR1cm4gZXh0cmEgPT09IHVuZGVmaW5lZCA/IHsgcHVibGlzaGVyLCBuYW1lIH0gOiBudWxsOyB9KSgpXG4gICAgICAgIDogcmF3ICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnID8geyBwdWJsaXNoZXI6IChyYXcgYXMgQmxvY2tlZExpc3RpbmdSZWYpLnB1Ymxpc2hlciwgbmFtZTogKHJhdyBhcyBCbG9ja2VkTGlzdGluZ1JlZikubmFtZSB9IDogbnVsbDtcbiAgICAgIGlmICghcmVmIHx8IHR5cGVvZiByZWYucHVibGlzaGVyICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVmLm5hbWUgIT09ICdzdHJpbmcnXG4gICAgICAgIHx8ICFIQU5ETEVfUkUudGVzdChyZWYucHVibGlzaGVyKSB8fCAhTkFNRV9SRS50ZXN0KHJlZi5uYW1lKSkge1xuICAgICAgICByZXR1cm4gJ2VhY2ggYmxvY2tlZCBsaXN0aW5nIG11c3QgYmUgeyBwdWJsaXNoZXIsIG5hbWUgfSAob3IgXCJwdWJsaXNoZXIvbmFtZVwiKSc7XG4gICAgICB9XG4gICAgICByZWZzLnB1c2goeyBwdWJsaXNoZXI6IHJlZi5wdWJsaXNoZXIsIG5hbWU6IHJlZi5uYW1lIH0pO1xuICAgIH1cbiAgICBuZXh0LmJsb2NrZWRMaXN0aW5ncyA9IHVuaXF1ZUxpc3RpbmdzKHJlZnMpO1xuICB9XG4gIHJldHVybiBuZXh0O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVmdXNhbHMgYW5kIHdhcm5pbmdzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogV2h5IGEgcmVmZXJlbmNlIGNhbid0IHJlc29sdmU7IGBjb2RlYCBpcyBhbiBhcGktY29yZSBgRXJyb3JDb2RlYCBuYW1lLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIGNvZGU6ICdOT1RfRk9VTkQnIHwgJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJyB8ICdQTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1knIHwgJ1BMVUdJTl9VTkFWQUlMQUJMRScgfCAnUExVR0lOX1ZFUlNJT05fVlVMTl9CTE9DS0VEJztcbiAgcmVhc29uOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQSBub24tZmF0YWwgbm90ZSBhIHJlc29sdXRpb24gY2FycmllcyAoc3ludGggcHJpbnRzIGl0cyBgbWVzc2FnZWApLiAqL1xuZXhwb3J0IHR5cGUgUmVzb2x1dGlvbldhcm5pbmcgPVxuICB8IHsgY29kZTogJ1BMVUdJTl9BRFZJU09SWScgfCAnUExVR0lOX0RFUFJFQ0FURUQnIHwgJ1BMVUdJTl9TRUNSRVRTX1dJVEhIRUxEJyB8ICdMSVNUSU5HX1VOTUFJTlRBSU5FRCc7IG1lc3NhZ2U6IHN0cmluZyB9XG4gIHwgVnVsbkZsYWdnZWRXYXJuaW5nO1xuXG4vKiogV2h5IHRoZSBvcmcncyBwb2xpY3kgKG9yIHRoZSBsaXN0aW5nJ3Mgc3RhdGUpIGtlZXBzIGEgbGlzdGluZyBvdXQsIG9yIG51bGwuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RpbmdCbG9jayB7XG4gIHJlYXNvbjogJ3RpZXInIHwgJ2Jsb2NrZWRfbGlzdGluZycgfCAnc3VzcGVuZGVkJztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKiogV2hldGhlciBgcG9saWN5YCAob3IgdGhlIGxpc3RpbmcncyBvd24gc3RhdGUpIHJlZnVzZXMgdGhlIGxpc3Rpbmcgb3V0cmlnaHQuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGluZ0Jsb2NrKFxuICBwb2xpY3k6IENvbnN1bXB0aW9uUG9saWN5LFxuICBwdWJsaXNoZXI6IFBpY2s8UHVibGlzaGVyLCAnaGFuZGxlJyB8ICd0aWVyJyB8ICdzdXNwZW5kZWRBdCc+LFxuICBsaXN0aW5nOiBQaWNrPFBsdWdpbkxpc3RpbmcsICduYW1lJyB8ICdzdGF0ZSc+LFxuKTogTGlzdGluZ0Jsb2NrIHwgbnVsbCB7XG4gIGNvbnN0IHJlZiA9IGAke3B1Ymxpc2hlci5oYW5kbGV9LyR7bGlzdGluZy5uYW1lfWA7XG4gIGlmIChwdWJsaXNoZXIuc3VzcGVuZGVkQXQgfHwgbGlzdGluZy5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcgfHwgbGlzdGluZy5zdGF0ZSA9PT0gJ3RyYW5zZmVycmVkJykge1xuICAgIHJldHVybiB7IHJlYXNvbjogJ3N1c3BlbmRlZCcsIG1lc3NhZ2U6IGAke3JlZn0gaXMgJHtsaXN0aW5nLnN0YXRlID09PSAndHJhbnNmZXJyZWQnID8gJ3RyYW5zZmVycmVkJyA6ICdzdXNwZW5kZWQnfSBhbmQgbm8gbG9uZ2VyIHJlc29sdmVzLmAgfTtcbiAgfVxuICBpZiAocG9saWN5LmJsb2NrZWRMaXN0aW5ncy5zb21lKChiKSA9PiBiLnB1Ymxpc2hlciA9PT0gcHVibGlzaGVyLmhhbmRsZSAmJiBiLm5hbWUgPT09IGxpc3RpbmcubmFtZSkpIHtcbiAgICByZXR1cm4geyByZWFzb246ICdibG9ja2VkX2xpc3RpbmcnLCBtZXNzYWdlOiBgWW91ciBvcmdhbml6YXRpb24ncyBwbHVnaW4gcG9saWN5IGJsb2NrcyAke3JlZn0uYCB9O1xuICB9XG4gIGlmICghcG9saWN5LmFsbG93ZWRUaWVycy5pbmNsdWRlcyhwdWJsaXNoZXIudGllcikpIHtcbiAgICByZXR1cm4geyByZWFzb246ICd0aWVyJywgbWVzc2FnZTogYFlvdXIgb3JnYW5pemF0aW9uJ3MgcGx1Z2luIHBvbGljeSBkb2Vzbid0IGFsbG93ICR7cHVibGlzaGVyLnRpZXJ9IHBsdWdpbnMgKCR7cmVmfSkuYCB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVGhlIHJlZnVzYWwgYSB7QGxpbmsgTGlzdGluZ0Jsb2NrfSBiZWNvbWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUmVmdXNhbChibG9jazogTGlzdGluZ0Jsb2NrKTogUmVzb2x1dGlvblJlZnVzYWwge1xuICByZXR1cm4gYmxvY2sucmVhc29uID09PSAnc3VzcGVuZGVkJ1xuICAgID8geyBjb2RlOiAnUExVR0lOX1VOQVZBSUxBQkxFJywgcmVhc29uOiAnc3VzcGVuZGVkJywgbWVzc2FnZTogYmxvY2subWVzc2FnZSB9XG4gICAgOiB7IGNvZGU6ICdQTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1knLCByZWFzb246IGJsb2NrLnJlYXNvbiwgbWVzc2FnZTogYmxvY2subWVzc2FnZSB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWR2aXNvcmllc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFNldmVyaXRpZXMgZWFjaCBgYmxvY2tPbkFkdmlzb3J5YCBzZXR0aW5nIGJsb2Nrcy4gKi9cbmV4cG9ydCBjb25zdCBBRFZJU09SWV9CTE9DS19TRVZFUklUSUVTOiBSZWFkb25seTxSZWNvcmQ8QmxvY2tPbkFkdmlzb3J5LCByZWFkb25seSBBZHZpc29yeVNldmVyaXR5W10+PiA9IHtcbiAgY3JpdGljYWw6IFsnY3JpdGljYWwnXSxcbiAgaGlnaDogWydjcml0aWNhbCcsICdoaWdoJ10sXG4gIG5ldmVyOiBbXSxcbn07XG5cbmNvbnN0IENPTVBBUkFUT1IgPSAvXig+PXw8PXw+fDx8PSk/XFxzKnY/KFxcZCtcXC5cXGQrXFwuXFxkKyg/Oi1bMC05QS1aYS16Li1dKyk/KD86XFwrWzAtOUEtWmEtei4tXSspPykkLztcblxuLyoqIE9uZSBjb21wYXJhdG9yIHNldCAoYD49MS4wLjAgPDEuMi4zYCwgYF4xLjJgLCBgMS54YCwgYDEuMC4wIC0gMS4yLjBgKSBhZ2FpbnN0IGB2ZXJzaW9uYC4gKi9cbmZ1bmN0aW9uIGNvbXBhcmF0b3JTZXRDb3ZlcnMoc2V0OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBoeXBoZW4gPSAvXihcXFMrKVxccystXFxzKyhcXFMrKSQvLmV4ZWMoc2V0KTtcbiAgaWYgKGh5cGhlbikgcmV0dXJuIGNvbXBhcmVTZW12ZXIodmVyc2lvbiwgaHlwaGVuWzFdISkgPj0gMCAmJiBjb21wYXJlU2VtdmVyKHZlcnNpb24sIGh5cGhlblsyXSEpIDw9IDA7XG4gIGNvbnN0IHBhcnRzID0gc2V0LnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocGFydHMubGVuZ3RoID09PSAxICYmIHBhcnNlVmVyc2lvblNwZWMocGFydHNbMF0hKSkgcmV0dXJuIHNhdGlzZmllc1ZlcnNpb25TcGVjKHZlcnNpb24sIHBhcnRzWzBdISk7XG4gIHJldHVybiBwYXJ0cy5ldmVyeSgocCkgPT4ge1xuICAgIGNvbnN0IG0gPSBDT01QQVJBVE9SLmV4ZWMocCk7XG4gICAgaWYgKCFtKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYyA9IGNvbXBhcmVTZW12ZXIodmVyc2lvbiwgbVsyXSEpO1xuICAgIHN3aXRjaCAobVsxXSA/PyAnPScpIHtcbiAgICAgIGNhc2UgJz49JzogcmV0dXJuIGMgPj0gMDtcbiAgICAgIGNhc2UgJzw9JzogcmV0dXJuIGMgPD0gMDtcbiAgICAgIGNhc2UgJz4nOiByZXR1cm4gYyA+IDA7XG4gICAgICBjYXNlICc8JzogcmV0dXJuIGMgPCAwO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIGMgPT09IDA7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGFkdmlzb3J5J3MgYGFmZmVjdGVkUmFuZ2VgIGNvdmVycyBgdmVyc2lvbmA6IGB8fGAtc2VwYXJhdGVkXG4gKiBjb21wYXJhdG9yIHNldHMsIGVhY2ggZWl0aGVyIHRoZSBsb29rdXAgc3BlYyBmb3JtcyAoYF5gLCBgfmAsIHBhcnRpYWwsXG4gKiBleGFjdCkgb3Igc3BhY2Utc2VwYXJhdGVkIGNvbXBhcmF0b3JzIChgPj0xLjAuMCA8MS4yLjNgKSBvciBhIGh5cGhlbiByYW5nZS5cbiAqIGAqYCBjb3ZlcnMgZXZlcnl0aGluZzsgYW4gdW5wYXJzZWFibGUgcmFuZ2UgY292ZXJzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZpc29yeVJhbmdlQ292ZXJzKHJhbmdlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXBhcnNlU2VtdmVyKHZlcnNpb24pKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiByYW5nZS5zcGxpdCgnfHwnKS5tYXAoKHMpID0+IHMudHJpbSgpKS5zb21lKChzZXQpID0+IHNldCA9PT0gJyonIHx8IChzZXQgIT09ICcnICYmIGNvbXBhcmF0b3JTZXRDb3ZlcnMoc2V0LCB2ZXJzaW9uKSkpO1xufVxuXG4vKipcbiAqIFdoeSBgcmFuZ2VgIGlzbid0IGEgdXNhYmxlIGFkdmlzb3J5IHJhbmdlICh0aGUgZm9ybXMge0BsaW5rIGFkdmlzb3J5UmFuZ2VDb3ZlcnN9XG4gKiB1bmRlcnN0YW5kcyksIG9yIG51bGwgd2hlbiBpdCBpcy4gQW4gYWR2aXNvcnkgd2hvc2UgcmFuZ2UgcGFyc2VzIGFzIG5vdGhpbmdcbiAqIHdvdWxkIHNpbGVudGx5IGNvdmVyIG5vdGhpbmcsIHNvIGRyYWZ0cyBhcmUgcmVmdXNlZCBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWR2aXNvcnlSYW5nZVByb2JsZW0ocmFuZ2U6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB0cmltbWVkID0gcmFuZ2UudHJpbSgpO1xuICBpZiAodHJpbW1lZCA9PT0gJycpIHJldHVybiAndGhlIGFmZmVjdGVkIHJhbmdlIGlzIGVtcHR5JztcbiAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMjU1KSByZXR1cm4gJ3RoZSBhZmZlY3RlZCByYW5nZSBpcyBsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyc7XG4gIGZvciAoY29uc3Qgc2V0IG9mIHRyaW1tZWQuc3BsaXQoJ3x8JykubWFwKCh4KSA9PiB4LnRyaW0oKSkpIHtcbiAgICBpZiAoc2V0ID09PSAnKicpIGNvbnRpbnVlO1xuICAgIGlmIChzZXQgPT09ICcnKSByZXR1cm4gJ3RoZSBhZmZlY3RlZCByYW5nZSBoYXMgYW4gZW1wdHkgXCJ8fFwiIGFsdGVybmF0aXZlJztcbiAgICBjb25zdCBoeXBoZW4gPSAvXihcXFMrKVxccystXFxzKyhcXFMrKSQvLmV4ZWMoc2V0KTtcbiAgICBpZiAoaHlwaGVuKSB7XG4gICAgICBpZiAoIXBhcnNlU2VtdmVyKGh5cGhlblsxXSEpIHx8ICFwYXJzZVNlbXZlcihoeXBoZW5bMl0hKSkgcmV0dXJuIGBcIiR7c2V0fVwiIGlzIG5vdCBhIHZhbGlkIGh5cGhlbiByYW5nZWA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSBzZXQuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSAmJiBwYXJ0c1swXSAhPT0gJ2xhdGVzdCcgJiYgcGFyc2VWZXJzaW9uU3BlYyhwYXJ0c1swXSEpKSBjb250aW51ZTtcbiAgICBjb25zdCBiYWQgPSBwYXJ0cy5maW5kKCh4KSA9PiAhQ09NUEFSQVRPUi50ZXN0KHgpKTtcbiAgICBpZiAoYmFkICE9PSB1bmRlZmluZWQpIHJldHVybiBgXCIke2JhZH1cIiBpcyBub3QgYSB2ZXJzaW9uLCBhIF4vfiByYW5nZSBvciBhIGNvbXBhcmF0b3IgKD49LCA8PSwgPiwgPCwgPSlgO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogVGhlIFBVQkxJU0hFRCBhZHZpc29yaWVzIHdob3NlIHJhbmdlIGNvdmVycyBgdmVyc2lvbmAgKGFueSBzZXZlcml0eSksIG1vc3Qgc2V2ZXJlIGZpcnN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkdmlzb3JpZXNDb3ZlcmluZzxBIGV4dGVuZHMgUGljazxQbHVnaW5BZHZpc29yeSwgJ3NldmVyaXR5JyB8ICdzdGF0ZScgfCAnYWZmZWN0ZWRSYW5nZSc+PihcbiAgYWR2aXNvcmllczogcmVhZG9ubHkgQVtdLFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4pOiBBW10ge1xuICBjb25zdCByYW5rOiBSZWNvcmQ8QWR2aXNvcnlTZXZlcml0eSwgbnVtYmVyPiA9IHsgY3JpdGljYWw6IDAsIGhpZ2g6IDEsIG1lZGl1bTogMiwgbG93OiAzIH07XG4gIHJldHVybiBhZHZpc29yaWVzXG4gICAgLmZpbHRlcigoYSkgPT4gYS5zdGF0ZSA9PT0gJ3B1Ymxpc2hlZCcgJiYgYWR2aXNvcnlSYW5nZUNvdmVycyhhLmFmZmVjdGVkUmFuZ2UsIHZlcnNpb24pKVxuICAgIC5zb3J0KChhLCBiKSA9PiByYW5rW2Euc2V2ZXJpdHldIC0gcmFua1tiLnNldmVyaXR5XSk7XG59XG5cbi8qKiBUaGUgUFVCTElTSEVEIGFkdmlzb3JpZXMgdGhlIHBvbGljeSBibG9ja3MgYHZlcnNpb25gIGZvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibG9ja2luZ0Fkdmlzb3JpZXMoXG4gIGFkdmlzb3JpZXM6IHJlYWRvbmx5IFBpY2s8UGx1Z2luQWR2aXNvcnksICdpZCcgfCAnc2V2ZXJpdHknIHwgJ3N0YXRlJyB8ICdhZmZlY3RlZFJhbmdlJyB8ICdmaXhlZFZlcnNpb24nIHwgJ3N1bW1hcnknPltdLFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHBvbGljeTogUGljazxDb25zdW1wdGlvblBvbGljeSwgJ2Jsb2NrT25BZHZpc29yeSc+LFxuKTogQXJyYXk8UGljazxQbHVnaW5BZHZpc29yeSwgJ2lkJyB8ICdzZXZlcml0eScgfCAnc3RhdGUnIHwgJ2FmZmVjdGVkUmFuZ2UnIHwgJ2ZpeGVkVmVyc2lvbicgfCAnc3VtbWFyeSc+PiB7XG4gIGNvbnN0IHNldmVyaXRpZXMgPSBBRFZJU09SWV9CTE9DS19TRVZFUklUSUVTW3BvbGljeS5ibG9ja09uQWR2aXNvcnldO1xuICBpZiAoc2V2ZXJpdGllcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgcmV0dXJuIGFkdmlzb3JpZXMuZmlsdGVyKChhKSA9PiBhLnN0YXRlID09PSAncHVibGlzaGVkJyAmJiBzZXZlcml0aWVzLmluY2x1ZGVzKGEuc2V2ZXJpdHkpICYmIGFkdmlzb3J5UmFuZ2VDb3ZlcnMoYS5hZmZlY3RlZFJhbmdlLCB2ZXJzaW9uKSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnN0YWxscyBhbmQgdmVyc2lvbiBjaG9pY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBIb3cgdGhlIG9yZyByZWFjaGVzIGEgbGlzdGluZzogYW4gZXhwbGljaXQgaW5zdGFsbCByb3csIG9yIHRoZSBpbXBsaWNpdCBPZmZpY2lhbCBvbmUuICovXG5leHBvcnQgdHlwZSBJbnN0YWxsTW9kZSA9XG4gIHwgeyBraW5kOiAnZXhwbGljaXQnOyBpbnN0YWxsOiBQbHVnaW5JbnN0YWxsOyBpbmhlcml0ZWQ6IGJvb2xlYW4gfVxuICB8IHsga2luZDogJ2ltcGxpY2l0JyB9O1xuXG50eXBlIFZlcnNpb25Sb3cgPSBQaWNrPFBsdWdpbkxpc3RpbmdWZXJzaW9uLCAndmVyc2lvbicgfCAneWFua2VkQXQnIHwgJ3BhdXNlZEF0JyB8ICdicmVha2luZyc+O1xuXG4vKiogVGhlIHJlZnVzYWwgYW4gZXhhY3QgcGluIHRvIGEgZmxhZ2dlZCB2ZXJzaW9uIGdldHMgd2hpbGUgYmxvY2tpbmcgKDQwOSkuICovXG5mdW5jdGlvbiB2dWxuUmVmdXNhbChyZWY6IHN0cmluZywgdjogUGljazxQbHVnaW5MaXN0aW5nVmVyc2lvbiwgJ3ZlcnNpb24nIHwgJ3NjYW5GbGFnJz4pOiBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIGNvbnN0IGZsYWcgPSBhc1NjYW5GbGFnKHYuc2NhbkZsYWcpID8/IHsgY3JpdGljYWw6IDAsIGhpZ2g6IDAsIG1heENyaXRpY2FsOiAwLCBmaW5kaW5nczogW10gfTtcbiAgY29uc3QgZml4ZWQgPSBbLi4ubmV3IFNldChmbGFnLmZpbmRpbmdzLmZsYXRNYXAoKGYpID0+IGYuZml4ZWRJbikpXTtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiAnUExVR0lOX1ZFUlNJT05fVlVMTl9CTE9DS0VEJyxcbiAgICByZWFzb246ICd2dWxuX2ZsYWdnZWQnLFxuICAgIG1lc3NhZ2U6IHZ1bG5CbG9ja2VkTWVzc2FnZShyZWYsIHYudmVyc2lvbiwgZmxhZyksXG4gICAgZGV0YWlsczogeyB2ZXJzaW9uOiB2LnZlcnNpb24sIGNyaXRpY2FsOiBmbGFnLmNyaXRpY2FsLCBoaWdoOiBmbGFnLmhpZ2gsIGZpbmRpbmdzOiBmbGFnLmZpbmRpbmdzLCAuLi4oZml4ZWQubGVuZ3RoID8geyBmaXhlZFZlcnNpb25zOiBmaXhlZCB9IDoge30pIH0sXG4gIH07XG59XG5cbmNvbnN0IGlzU3RhYmxlID0gKHY6IHN0cmluZyk6IGJvb2xlYW4gPT4gKHBhcnNlU2VtdmVyKHYpPy5wcmVyZWxlYXNlLmxlbmd0aCA/PyAxKSA9PT0gMDtcblxuLyoqXG4gKiBUaGUgaW1wbGljaXQgT2ZmaWNpYWwgaW5zdGFsbCdzIHJhbmdlOiBldmVyeSB2ZXJzaW9uIG9mIHRoZSBMT1dFU1QgbGl2ZVxuICogbWFqb3IgKGA8bWFqb3I+LnhgKSDigJQgcGF0Y2ggYW5kIG1pbm9yIHZlcnNpb25zIGZsb3csIGEgbmV3IG1ham9yIG5ldmVyIGRvZXNcbiAqICh0aGUgb3JnIG1vdmVzIHRvIGl0IHdpdGggYW4gZXhwbGljaXQgaW5zdGFsbCkuIE51bGwgd2hlbiBub3RoaW5nIGlzIGxpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBsaWNpdEluc3RhbGxSYW5nZSh2ZXJzaW9uczogcmVhZG9ubHkgVmVyc2lvblJvd1tdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1ham9ycyA9IHZlcnNpb25zXG4gICAgLmZpbHRlcigodikgPT4gIXYueWFua2VkQXQgJiYgaXNTdGFibGUodi52ZXJzaW9uKSlcbiAgICAubWFwKCh2KSA9PiBwYXJzZVNlbXZlcih2LnZlcnNpb24pIS5tYWpvcik7XG4gIGlmIChtYWpvcnMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGAke01hdGgubWluKC4uLm1ham9ycyl9LnhgO1xufVxuXG4vKiogV2hldGhlciBhbiBpbnN0YWxsJ3MgdmVyc2lvbiBwb2xpY3kgYWRtaXRzIGB2ZXJzaW9uYCAodGhlIGJhc2VsaW5lIGlzIGBwaW5uZWRWZXJzaW9uYCkuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbEFkbWl0cyhcbiAgaW5zdGFsbDogUGljazxQbHVnaW5JbnN0YWxsLCAndmVyc2lvblBvbGljeScgfCAncGlubmVkVmVyc2lvbic+LFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHZlcnNpb25zOiByZWFkb25seSBWZXJzaW9uUm93W10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZSA9IGluc3RhbGwucGlubmVkVmVyc2lvbjtcbiAgc3dpdGNoIChpbnN0YWxsLnZlcnNpb25Qb2xpY3kgYXMgSW5zdGFsbFZlcnNpb25Qb2xpY3kpIHtcbiAgICBjYXNlICdwaW5uZWQnOlxuICAgICAgcmV0dXJuIHZlcnNpb24gPT09IGJhc2U7XG4gICAgY2FzZSAncGF0Y2gnOlxuICAgICAgcmV0dXJuIGJhc2UgIT09IG51bGwgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModmVyc2lvbiwgYH4ke2Jhc2V9YCk7XG4gICAgY2FzZSAnbWlub3InOlxuICAgICAgcmV0dXJuIGJhc2UgIT09IG51bGwgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModmVyc2lvbiwgYF4ke2Jhc2V9YCk7XG4gICAgY2FzZSAnbGF0ZXN0Jzoge1xuICAgICAgaWYgKCFpc1N0YWJsZSh2ZXJzaW9uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGJhc2UgPT09IG51bGwpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGNvbXBhcmVTZW12ZXIodmVyc2lvbiwgYmFzZSkgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBOZXZlciBjcm9zcyBhIHZlcnNpb24gdGhlIHB1Ymxpc2hlciBtYXJrZWQgYnJlYWtpbmcuXG4gICAgICByZXR1cm4gIXZlcnNpb25zLnNvbWUoKHYpID0+IHYuYnJlYWtpbmcgJiYgY29tcGFyZVNlbXZlcih2LnZlcnNpb24sIGJhc2UpID4gMCAmJiBjb21wYXJlU2VtdmVyKHYudmVyc2lvbiwgdmVyc2lvbikgPD0gMCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIFdoZXRoZXIgYG1vZGVgIGFkbWl0cyBgdmVyc2lvbmAgKHRoZSBpbXBsaWNpdCByYW5nZSBmb3IgYW4gaW1wbGljaXQgaW5zdGFsbCkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZUFkbWl0cyhtb2RlOiBJbnN0YWxsTW9kZSwgdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uczogcmVhZG9ubHkgVmVyc2lvblJvd1tdKTogYm9vbGVhbiB7XG4gIGlmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcpIHJldHVybiBpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgdmVyc2lvbiwgdmVyc2lvbnMpO1xuICBjb25zdCByYW5nZSA9IGltcGxpY2l0SW5zdGFsbFJhbmdlKHZlcnNpb25zKTtcbiAgcmV0dXJuIHJhbmdlICE9PSBudWxsICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHZlcnNpb24sIHJhbmdlKTtcbn1cblxuLyoqIElucHV0IHRvIHtAbGluayBzZWxlY3RMaXN0aW5nVmVyc2lvbn0uICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25DaG9pY2VJbnB1dDxWIGV4dGVuZHMgUGx1Z2luTGlzdGluZ1ZlcnNpb24gPSBQbHVnaW5MaXN0aW5nVmVyc2lvbj4ge1xuICByZWY6IHN0cmluZztcbiAgdmVyc2lvbnM6IHJlYWRvbmx5IFZbXTtcbiAgbW9kZTogSW5zdGFsbE1vZGU7XG4gIC8qKiBUaGUgcmVmZXJlbmNlJ3Mgb3duIHZlcnNpb24gc3BlYyAoYGZpbHRlci52ZXJzaW9uYCkuICovXG4gIHJlcXVlc3RlZD86IHN0cmluZztcbiAgYWR2aXNvcmllczogcmVhZG9ubHkgUGx1Z2luQWR2aXNvcnlbXTtcbiAgcG9saWN5OiBDb25zdW1wdGlvblBvbGljeTtcbiAgLyoqIFNraXAgLyByZWZ1c2UgcmVzY2FuLWZsYWdnZWQgdmVyc2lvbnMgKGRlZmF1bHQ6IGBQTFVHSU5fQkxPQ0tfT05fTkVXX0NSSVRJQ0FMYCkuICovXG4gIGJsb2NrRmxhZ2dlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGljayB0aGUgbGlzdGVkIHZlcnNpb24gYSByZWZlcmVuY2UgcmVzb2x2ZXMgdG8gKHNlZSB0aGUgbW9kdWxlIGRvYyksIG9yXG4gKiB0aGUgcmVmdXNhbCB0aGF0IGV4cGxhaW5zIHdoeSBub25lIGNhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdExpc3RpbmdWZXJzaW9uPFYgZXh0ZW5kcyBQbHVnaW5MaXN0aW5nVmVyc2lvbj4oaW5wdXQ6IFZlcnNpb25DaG9pY2VJbnB1dDxWPik6IHsgdmVyc2lvbjogViB9IHwgeyByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbCB9IHtcbiAgY29uc3QgeyByZWYsIHZlcnNpb25zLCBtb2RlLCByZXF1ZXN0ZWQsIGFkdmlzb3JpZXMsIHBvbGljeSB9ID0gaW5wdXQ7XG4gIGNvbnN0IGJsb2NrRmxhZ2dlZCA9IGlucHV0LmJsb2NrRmxhZ2dlZCA/PyBibG9ja09uTmV3Q3JpdGljYWwoKTtcbiAgY29uc3QgZXhhY3QgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCAmJiAhaXNWZXJzaW9uUmFuZ2UocmVxdWVzdGVkKSA/IHJlcXVlc3RlZC50cmltKCkgOiBudWxsO1xuXG4gIGlmIChleGFjdCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHYgPSB2ZXJzaW9ucy5maW5kKCh4KSA9PiB4LnZlcnNpb24gPT09IGV4YWN0KTtcbiAgICBpZiAoIXYpIHJldHVybiB7IHJlZnVzYWw6IHsgY29kZTogJ05PVF9GT1VORCcsIHJlYXNvbjogJ3ZlcnNpb25fbm90X2ZvdW5kJywgbWVzc2FnZTogYCR7cmVmfSBoYXMgbm8gcHVibGlzaGVkIHZlcnNpb24gJHtleGFjdH0uYCB9IH07XG4gICAgaWYgKHYueWFua2VkQXQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZnVzYWw6IHtcbiAgICAgICAgICBjb2RlOiAnUExVR0lOX1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICByZWFzb246ICd5YW5rZWQnLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3JlZn1AJHtleGFjdH0gaXMgeWFua2VkJHt2LnlhbmtSZWFzb24gPyBgOiAke3YueWFua1JlYXNvbn1gIDogJyd9LiBNb3ZlIHRvIGEgc3VwcG9ydGVkIHZlcnNpb24uYCxcbiAgICAgICAgICBkZXRhaWxzOiB7IHZlcnNpb246IGV4YWN0IH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAobW9kZS5raW5kID09PSAnZXhwbGljaXQnICYmICFpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgZXhhY3QsIHZlcnNpb25zKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVmdXNhbDoge1xuICAgICAgICAgIGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsXG4gICAgICAgICAgcmVhc29uOiAndmVyc2lvbl9vdXRzaWRlX2luc3RhbGwnLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3JlZn1AJHtleGFjdH0gaXMgb3V0c2lkZSB5b3VyIGluc3RhbGwgKCR7bW9kZS5pbnN0YWxsLnZlcnNpb25Qb2xpY3l9IGZyb20gJHttb2RlLmluc3RhbGwucGlubmVkVmVyc2lvbn0pLiBVcGdyYWRlIHRoZSBpbnN0YWxsIGZpcnN0LmAsXG4gICAgICAgICAgZGV0YWlsczogeyB2ZXJzaW9uOiBleGFjdCwgdmVyc2lvblBvbGljeTogbW9kZS5pbnN0YWxsLnZlcnNpb25Qb2xpY3ksIHBpbm5lZFZlcnNpb246IG1vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9uIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBibG9ja2luZyA9IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCBleGFjdCwgcG9saWN5KTtcbiAgICBpZiAoYmxvY2tpbmcubGVuZ3RoKSByZXR1cm4geyByZWZ1c2FsOiBhZHZpc29yeVJlZnVzYWwocmVmLCBleGFjdCwgYmxvY2tpbmcpIH07XG4gICAgaWYgKGJsb2NrRmxhZ2dlZCAmJiB2LnNjYW5GbGFnZ2VkQXQpIHJldHVybiB7IHJlZnVzYWw6IHZ1bG5SZWZ1c2FsKHJlZiwgdikgfTtcbiAgICByZXR1cm4geyB2ZXJzaW9uOiB2IH07XG4gIH1cblxuICBjb25zdCByZXNvbHZlZEJlZm9yZSA9IG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyA/IG1vZGUuaW5zdGFsbC5yZXNvbHZlZFZlcnNpb24gOiBudWxsO1xuICAvLyBUaGUgcmFuZ2UgdGhlIElOU1RBTEwgYWxsb3dzLiBGb3IgdGhlIGltcGxpY2l0IGluc3RhbGwgYW4gZXhwbGljaXQgc3BlYyBvblxuICAvLyB0aGUgcmVmZXJlbmNlIHJlcGxhY2VzIHRoZSBpbXBsaWNpdCByYW5nZSAoaXQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSkuXG4gIGNvbnN0IGFkbWl0dGVkID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiAhdi55YW5rZWRBdFxuICAgICYmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcgPyBpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgdi52ZXJzaW9uLCB2ZXJzaW9ucylcbiAgICAgIDogcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgfHwgbW9kZUFkbWl0cyhtb2RlLCB2LnZlcnNpb24sIHZlcnNpb25zKSlcbiAgICAmJiAocmVxdWVzdGVkID09PSB1bmRlZmluZWQgfHwgc2F0aXNmaWVzVmVyc2lvblNwZWModi52ZXJzaW9uLCByZXF1ZXN0ZWQpKVxuICAgICYmICghdi5wYXVzZWRBdCB8fCB2LnZlcnNpb24gPT09IHJlc29sdmVkQmVmb3JlKSk7XG4gIGNvbnN0IGFsbG93ZWQgPSBhZG1pdHRlZC5maWx0ZXIoKHYpID0+IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCB2LnZlcnNpb24sIHBvbGljeSkubGVuZ3RoID09PSAwXG4gICAgJiYgIShibG9ja0ZsYWdnZWQgJiYgdi5zY2FuRmxhZ2dlZEF0KSk7XG4gIC8vIFJhbmdlcyBvbmx5IGFkbWl0IHByZXJlbGVhc2VzIHRoZXkgbmFtZSAobnBtIHNlbWFudGljcyksIHNvIHRoZSBoaWdoZXN0XG4gIC8vIGFkbWl0dGVkIHZlcnNpb24gaXMgdGhlIGFuc3dlci5cbiAgY29uc3QgYmVzdCA9IGhpZ2hlc3QoYWxsb3dlZC5tYXAoKHYpID0+IHYudmVyc2lvbikpO1xuICBpZiAoYmVzdCkgcmV0dXJuIHsgdmVyc2lvbjogYWxsb3dlZC5maW5kKCh2KSA9PiB2LnZlcnNpb24gPT09IGJlc3QpISB9O1xuXG4gIGlmIChhZG1pdHRlZC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbmV3ZXN0ID0gaGlnaGVzdChhZG1pdHRlZC5tYXAoKHYpID0+IHYudmVyc2lvbikpITtcbiAgICBjb25zdCBibG9ja2luZyA9IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCBuZXdlc3QsIHBvbGljeSk7XG4gICAgaWYgKGJsb2NraW5nLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgcmVmdXNhbDogdnVsblJlZnVzYWwocmVmLCBhZG1pdHRlZC5maW5kKCh2KSA9PiB2LnZlcnNpb24gPT09IG5ld2VzdCkhKSB9O1xuICAgIHJldHVybiB7IHJlZnVzYWw6IGFkdmlzb3J5UmVmdXNhbChyZWYsIG5ld2VzdCwgYmxvY2tpbmcpIH07XG4gIH1cbiAgaWYgKG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyAmJiByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZFxuICAgICYmIHZlcnNpb25zLnNvbWUoKHYpID0+ICF2LnlhbmtlZEF0ICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHYudmVyc2lvbiwgcmVxdWVzdGVkKSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmdXNhbDoge1xuICAgICAgICBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLFxuICAgICAgICByZWFzb246ICd2ZXJzaW9uX291dHNpZGVfaW5zdGFsbCcsXG4gICAgICAgIG1lc3NhZ2U6IGBObyB2ZXJzaW9uIG9mICR7cmVmfSBtYXRjaGluZyAke3JlcXVlc3RlZH0gaXMgaW5zaWRlIHlvdXIgaW5zdGFsbCAoJHttb2RlLmluc3RhbGwudmVyc2lvblBvbGljeX0gZnJvbSAke21vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9ufSkuIFVwZ3JhZGUgdGhlIGluc3RhbGwgZmlyc3QuYCxcbiAgICAgICAgZGV0YWlsczogeyByZXF1ZXN0ZWQsIHZlcnNpb25Qb2xpY3k6IG1vZGUuaW5zdGFsbC52ZXJzaW9uUG9saWN5LCBwaW5uZWRWZXJzaW9uOiBtb2RlLmluc3RhbGwucGlubmVkVmVyc2lvbiB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVmdXNhbDoge1xuICAgICAgY29kZTogJ05PVF9GT1VORCcsXG4gICAgICByZWFzb246ICdub19tYXRjaGluZ192ZXJzaW9uJyxcbiAgICAgIG1lc3NhZ2U6IGBObyByZXNvbHZhYmxlIHZlcnNpb24gb2YgJHtyZWZ9JHtyZXF1ZXN0ZWQgPyBgIG1hdGNoZXMgJHtyZXF1ZXN0ZWR9YCA6ICcnfS5gLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKiBUaGUgaGlnaGVzdCBvZiBgdmVyc2lvbnNgIGJ5IHNlbXZlciAocHJlcmVsZWFzZXMgaW5jbHVkZWQpLiAqL1xuZnVuY3Rpb24gaGlnaGVzdCh2ZXJzaW9uczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHZlcnNpb25zLnJlZHVjZTxzdHJpbmcgfCBudWxsPigoYmVzdCwgdikgPT4gKGJlc3QgPT09IG51bGwgfHwgY29tcGFyZVNlbXZlcih2LCBiZXN0KSA+IDAgPyB2IDogYmVzdCksIG51bGwpO1xufVxuXG5mdW5jdGlvbiBhZHZpc29yeVJlZnVzYWwocmVmOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgYmxvY2tpbmc6IFJlYWRvbmx5QXJyYXk8UGljazxQbHVnaW5BZHZpc29yeSwgJ2lkJyB8ICdzZXZlcml0eScgfCAnZml4ZWRWZXJzaW9uJyB8ICdzdW1tYXJ5Jz4+KTogUmVzb2x1dGlvblJlZnVzYWwge1xuICBjb25zdCBmaXhlZCA9IGJsb2NraW5nLm1hcCgoYSkgPT4gYS5maXhlZFZlcnNpb24pLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+ICEhdik7XG4gIHJldHVybiB7XG4gICAgY29kZTogJ1BMVUdJTl9CTE9DS0VEX0JZX1BPTElDWScsXG4gICAgcmVhc29uOiAnYWR2aXNvcnknLFxuICAgIG1lc3NhZ2U6IGAke3JlZn1AJHt2ZXJzaW9ufSBpcyBibG9ja2VkIGJ5IHlvdXIgb3JnYW5pemF0aW9uJ3MgYWR2aXNvcnkgcG9saWN5OiAke2Jsb2NraW5nLm1hcCgoYSkgPT4gYCR7YS5zZXZlcml0eX0g4oCUICR7YS5zdW1tYXJ5fWApLmpvaW4oJzsgJyl9LmBcbiAgICAgICsgKGZpeGVkLmxlbmd0aCA/IGAgRml4ZWQgaW4gJHtmaXhlZC5qb2luKCcsICcpfS5gIDogJycpLFxuICAgIGRldGFpbHM6IHsgdmVyc2lvbiwgYWR2aXNvcmllczogYmxvY2tpbmcubWFwKChhKSA9PiBhLmlkKSwgLi4uKGZpeGVkLmxlbmd0aCA/IHsgZml4ZWRWZXJzaW9uczogZml4ZWQgfSA6IHt9KSB9LFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIG9yZydzIGluc3RhbGwgc3RhdGUgZm9yIG9uZSBsaXN0aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIG9yZyAoYW5kLCBmb3IgYSB0ZWFtLCBpdHMgcm9vdCBvcmcpIGEgcmVzb2x1dGlvbiBydW5zIGZvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x1dGlvblNjb3BlIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgLyoqIFRoZSByb290IG9yZyB3aGVuIHRoZSBjYWxsZXIgaXMgYSB0ZWFtLiAqL1xuICByb290T3JnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgb3JnIGlkcyB3aG9zZSBpbnN0YWxscyBhbmQgcG9saWNpZXMgYXBwbHksIG93biBmaXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY29wZU9yZ0lkcyhzY29wZTogUmVzb2x1dGlvblNjb3BlKTogc3RyaW5nW10ge1xuICBjb25zdCBvd24gPSBzY29wZS5vcmdJZC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCByb290ID0gc2NvcGUucm9vdE9yZ0lkPy50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gcm9vdCAmJiByb290ICE9PSBvd24gPyBbb3duLCByb290XSA6IFtvd25dO1xufVxuXG4vKipcbiAqIEhvdyB0aGUgb3JnIHJlYWNoZXMgYGxpc3RpbmdgIOKAlCBvciB0aGUgcmVmdXNhbC4gQW4gQUNUSVZFIG93bi1vcmcgcm93IHdpbnMsXG4gKiB0aGVuIHRoZSByb290IG9yZydzIChhIHRlYW0gaW5oZXJpdHMgaXQpOyBmYWlsaW5nIGJvdGgsIHRoZSBpbXBsaWNpdFxuICogT2ZmaWNpYWwgaW5zdGFsbCAodW5sZXNzIHRoZSBwb2xpY3kgaXMgYGV4cGxpY2l0YCk7IG90aGVyd2lzZSB0aGUgb3JnJ3Mgb3duXG4gKiBwZW5kaW5nIC8gZGVuaWVkIHJvdyBleHBsYWlucyB0aGUgcmVmdXNhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxNb2RlRm9yKFxuICBwdWJsaXNoZXI6IFBpY2s8UHVibGlzaGVyLCAnaGFuZGxlJz4sXG4gIGxpc3Rpbmc6IFBpY2s8UGx1Z2luTGlzdGluZywgJ2lkJyB8ICduYW1lJz4sXG4gIGluc3RhbGxzOiByZWFkb25seSBQbHVnaW5JbnN0YWxsW10sXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3ksXG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUsXG4pOiBJbnN0YWxsTW9kZSB8IFJlc29sdXRpb25SZWZ1c2FsIHtcbiAgY29uc3QgW293biwgcm9vdF0gPSBzY29wZU9yZ0lkcyhzY29wZSk7XG4gIGNvbnN0IGZvckxpc3RpbmcgPSBpbnN0YWxscy5maWx0ZXIoKGkpID0+IGkubGlzdGluZ0lkID09PSBsaXN0aW5nLmlkKTtcbiAgY29uc3Qgb3duUm93ID0gZm9yTGlzdGluZy5maW5kKChpKSA9PiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IG93bik7XG4gIGNvbnN0IHJvb3RSb3cgPSByb290ID8gZm9yTGlzdGluZy5maW5kKChpKSA9PiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IHJvb3QpIDogdW5kZWZpbmVkO1xuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdhY3RpdmUnKSByZXR1cm4geyBraW5kOiAnZXhwbGljaXQnLCBpbnN0YWxsOiBvd25Sb3csIGluaGVyaXRlZDogZmFsc2UgfTtcbiAgaWYgKHJvb3RSb3c/LnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHJldHVybiB7IGtpbmQ6ICdleHBsaWNpdCcsIGluc3RhbGw6IHJvb3RSb3csIGluaGVyaXRlZDogdHJ1ZSB9O1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBpZiAocHVibGlzaGVyLmhhbmRsZSA9PT0gT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSkge1xuICAgIGlmIChwb2xpY3kub2ZmaWNpYWxJbnN0YWxscyA9PT0gJ2ltcGxpY2l0JykgcmV0dXJuIHsga2luZDogJ2ltcGxpY2l0JyB9O1xuICAgIGlmICghb3duUm93KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLFxuICAgICAgICByZWFzb246ICdvZmZpY2lhbF9leHBsaWNpdCcsXG4gICAgICAgIG1lc3NhZ2U6IGBZb3VyIG9yZ2FuaXphdGlvbiBpbnN0YWxscyBPZmZpY2lhbCBwbHVnaW5zIGV4cGxpY2l0bHk7IGluc3RhbGwgJHtyZWZ9IGZpcnN0LmAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdwZW5kaW5nX2FwcHJvdmFsJykge1xuICAgIHJldHVybiB7IGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsIHJlYXNvbjogJ3BlbmRpbmdfYXBwcm92YWwnLCBtZXNzYWdlOiBgVGhlIGluc3RhbGwgb2YgJHtyZWZ9IGlzIHdhaXRpbmcgZm9yIGFwcHJvdmFsLmAgfTtcbiAgfVxuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdkZW5pZWQnKSB7XG4gICAgcmV0dXJuIHsgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJywgcmVhc29uOiAnZGVuaWVkJywgbWVzc2FnZTogYFRoZSBpbnN0YWxsIG9mICR7cmVmfSB3YXMgZGVuaWVkLmAgfTtcbiAgfVxuICByZXR1cm4geyBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLCByZWFzb246ICdub3RfaW5zdGFsbGVkJywgbWVzc2FnZTogYCR7cmVmfSBpcyBub3QgaW5zdGFsbGVkIGluIHlvdXIgb3JnYW5pemF0aW9uLmAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERhdGEgc291cmNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIHJvd3MgdGhlIHJlc29sdmVyIHJlYWRzLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBydW4gd2l0aCBhIHNjb3BlIHRoYXQgY2FuXG4gKiAgcmVhZCB0aGUgZWNvc3lzdGVtIHRhYmxlcyBhbmQgdGhlIG9yZydzIChhbmQgcm9vdCBvcmcncykgaW5zdGFsbCByb3dzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0aW5nRGF0YVNvdXJjZSB7XG4gIHB1Ymxpc2hlckJ5SGFuZGxlKGhhbmRsZTogc3RyaW5nKTogUHJvbWlzZTxQdWJsaXNoZXIgfCBudWxsPjtcbiAgcHVibGlzaGVyc0J5SWRzKGlkczogc3RyaW5nW10pOiBQcm9taXNlPFB1Ymxpc2hlcltdPjtcbiAgbGlzdGluZ0J5TmFtZShwdWJsaXNoZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBsdWdpbkxpc3RpbmcgfCBudWxsPjtcbiAgLyoqIExpc3RlZCAvIHVubWFpbnRhaW5lZCBsaXN0aW5ncyAob3B0aW9uYWxseSBvbmx5IHRoZXNlIGlkcyBvciBuYW1lcykuICovXG4gIGxpdmVMaXN0aW5ncyhmaWx0ZXI/OiB7IGlkcz86IHN0cmluZ1tdOyBuYW1lcz86IHN0cmluZ1tdIH0pOiBQcm9taXNlPFBsdWdpbkxpc3RpbmdbXT47XG4gIHZlcnNpb25zRm9yTGlzdGluZ3MobGlzdGluZ0lkczogc3RyaW5nW10pOiBQcm9taXNlPFBsdWdpbkxpc3RpbmdWZXJzaW9uW10+O1xuICAvKiogUFVCTElTSEVEIGFkdmlzb3JpZXMuICovXG4gIGFkdmlzb3JpZXNGb3JMaXN0aW5ncyhsaXN0aW5nSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luQWR2aXNvcnlbXT47XG4gIGluc3RhbGxzRm9yT3JncyhvcmdJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQbHVnaW5JbnN0YWxsW10+O1xuICBwb2xpY2llc0Zvck9yZ3Mob3JnSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luSW5zdGFsbFBvbGljeVtdPjtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBMaXN0aW5nRGF0YVNvdXJjZX0gb3ZlciBhIGRyaXp6bGUgdHJhbnNhY3Rpb24uIFRoZSBjYWxsZXIgb3ducyB0aGVcbiAqIHRyYW5zYWN0aW9uJ3Mgc2NvcGU6IGl0IG11c3QgYmUgYWJsZSB0byByZWFkIHRoZSBlY29zeXN0ZW0gdGFibGVzIChhcHAtcm9sZVxuICogUkxTKSBhbmQgdGhlIGluc3RhbGwgcm93cyBvZiB0aGUgb3JnIEFORCBpdHMgcm9vdCBvcmcgKGEgdGVhbSdzIHJlYWRzIG9mIGl0c1xuICogcm9vdCdzIHJvd3MgbmVlZCBhbiBlbGV2YXRlZCBzY29wZSwgbGlrZSBwYXJlbnQtb3JnIHBsdWdpbiByZWFkcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcml6emxlTGlzdGluZ1NvdXJjZSh0eDogQ3J1ZFR4KTogTGlzdGluZ0RhdGFTb3VyY2Uge1xuICBjb25zdCBkYiA9IHR4O1xuICBjb25zdCBQID0gc2NoZW1hLnB1Ymxpc2hlcjtcbiAgY29uc3QgTCA9IHNjaGVtYS5wbHVnaW5MaXN0aW5nO1xuICBjb25zdCBWID0gc2NoZW1hLnBsdWdpbkxpc3RpbmdWZXJzaW9uO1xuICBjb25zdCBBID0gc2NoZW1hLnBsdWdpbkFkdmlzb3J5O1xuICBjb25zdCBJID0gc2NoZW1hLnBsdWdpbkluc3RhbGw7XG4gIGNvbnN0IElQID0gc2NoZW1hLnBsdWdpbkluc3RhbGxQb2xpY3k7XG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyQnlIYW5kbGU6IGFzeW5jIChoYW5kbGUpID0+ICgoYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShQKS53aGVyZShlcShQLmhhbmRsZSwgaGFuZGxlKSkpIGFzIFB1Ymxpc2hlcltdKVswXSA/PyBudWxsLFxuICAgIHB1Ymxpc2hlcnNCeUlkczogYXN5bmMgKGlkcykgPT4gKGlkcy5sZW5ndGggPyBkYi5zZWxlY3QoKS5mcm9tKFApLndoZXJlKGluQXJyYXkoUC5pZCwgaWRzKSkgOiBbXSksXG4gICAgbGlzdGluZ0J5TmFtZTogYXN5bmMgKHB1Ymxpc2hlcklkLCBuYW1lKSA9PlxuICAgICAgKChhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKEwpLndoZXJlKGFuZChlcShMLnB1Ymxpc2hlcklkLCBwdWJsaXNoZXJJZCksIGVxKEwubmFtZSwgbmFtZSkpKSkgYXMgUGx1Z2luTGlzdGluZ1tdKVswXSA/PyBudWxsLFxuICAgIGxpdmVMaXN0aW5nczogYXN5bmMgKGZpbHRlciA9IHt9KSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmlkcyAmJiBmaWx0ZXIuaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKGZpbHRlci5uYW1lcyAmJiBmaWx0ZXIubmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gZGIuc2VsZWN0KCkuZnJvbShMKS53aGVyZShhbmQoXG4gICAgICAgIGluQXJyYXkoTC5zdGF0ZSwgWydsaXN0ZWQnLCAndW5tYWludGFpbmVkJ10pLFxuICAgICAgICAuLi4oZmlsdGVyLmlkcyA/IFtpbkFycmF5KEwuaWQsIGZpbHRlci5pZHMpXSA6IFtdKSxcbiAgICAgICAgLi4uKGZpbHRlci5uYW1lcyA/IFtpbkFycmF5KEwubmFtZSwgZmlsdGVyLm5hbWVzKV0gOiBbXSksXG4gICAgICApKTtcbiAgICB9LFxuICAgIHZlcnNpb25zRm9yTGlzdGluZ3M6IGFzeW5jIChpZHMpID0+IChpZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShWKS53aGVyZShpbkFycmF5KFYubGlzdGluZ0lkLCBpZHMpKSA6IFtdKSxcbiAgICBhZHZpc29yaWVzRm9yTGlzdGluZ3M6IGFzeW5jIChpZHMpID0+IChpZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShBKS53aGVyZShhbmQoaW5BcnJheShBLmxpc3RpbmdJZCwgaWRzKSwgZXEoQS5zdGF0ZSwgJ3B1Ymxpc2hlZCcpKSkgOiBbXSksXG4gICAgaW5zdGFsbHNGb3JPcmdzOiBhc3luYyAob3JnSWRzKSA9PiAob3JnSWRzLmxlbmd0aCA/IGRiLnNlbGVjdCgpLmZyb20oSSkud2hlcmUoaW5BcnJheShJLm9yZ0lkLCBvcmdJZHMpKSA6IFtdKSxcbiAgICBwb2xpY2llc0Zvck9yZ3M6IGFzeW5jIChvcmdJZHMpID0+IChvcmdJZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShJUCkud2hlcmUoaW5BcnJheShJUC5vcmdJZCwgb3JnSWRzKSkgOiBbXSksXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXNvbHV0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQSBwbHVnaW4gcmVmZXJlbmNlIGFzIHRoZSByZXNvbHZlciByZWFkcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1JlZmVyZW5jZSB7XG4gIC8qKiBQdWJsaXNoZXIgaGFuZGxlOyBhYnNlbnQgPSB0aGUgT2ZmaWNpYWwgbGlzdGluZyAodGhlIHVucXVhbGlmaWVkIGZhbGxiYWNrKS4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVmZXJlbmNlJ3MgYGZpbHRlci52ZXJzaW9uYC4gKi9cbiAgdmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqIEEgcmVmZXJlbmNlIHRoYXQgcmVzb2x2ZWQgdG8gYSBsaXN0ZWQgdmVyc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1Jlc29sdmVkIHtcbiAgb2s6IHRydWU7XG4gIHB1Ymxpc2hlcjogUHVibGlzaGVyO1xuICBsaXN0aW5nOiBQbHVnaW5MaXN0aW5nO1xuICB2ZXJzaW9uOiBQbHVnaW5MaXN0aW5nVmVyc2lvbjtcbiAgbW9kZTogSW5zdGFsbE1vZGU7XG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG4gIC8qKiBUaGUgc3BlYyBkZWNsYXJlcyBzZWNyZXRzIHRoZSBwb2xpY3kgd2l0aGhvbGRzIGZyb20gdGhpcyB0aWVyLiAqL1xuICBzZWNyZXRzV2l0aGhlbGQ6IGJvb2xlYW47XG4gIHdhcm5pbmdzOiBSZXNvbHV0aW9uV2FybmluZ1tdO1xufVxuXG4vKiogQSByZWZlcmVuY2UgdGhhdCBuYW1lZCBhIGxpc3RpbmcgYnV0IGNhbid0IHJlc29sdmUuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RpbmdSZWZ1c2VkIHtcbiAgb2s6IGZhbHNlO1xuICByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbDtcbiAgcHVibGlzaGVyPzogUHVibGlzaGVyO1xuICBsaXN0aW5nPzogUGx1Z2luTGlzdGluZztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGByZWZgIHRvIGEgbGlzdGVkIHZlcnNpb24gZm9yIGBzY29wZWAsIG9yIHJlZnVzZS4gTnVsbCB3aGVuIHRoZVxuICogbGlzdGluZyBkb2Vzbid0IGV4aXN0IGF0IGFsbCAoYW4gdW5xdWFsaWZpZWQgcmVmZXJlbmNlIHRoZW4gc2ltcGx5IGhhcyBub1xuICogT2ZmaWNpYWwgZmFsbGJhY2spLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxpc3RpbmdSZWZlcmVuY2UoXG4gIHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHJlZjogTGlzdGluZ1JlZmVyZW5jZSxcbiAgc2NvcGU6IFJlc29sdXRpb25TY29wZSxcbik6IFByb21pc2U8TGlzdGluZ1Jlc29sdmVkIHwgTGlzdGluZ1JlZnVzZWQgfCBudWxsPiB7XG4gIGNvbnN0IGhhbmRsZSA9IHJlZi5wdWJsaXNoZXIgPz8gT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRTtcbiAgY29uc3QgcHVibGlzaGVyID0gYXdhaXQgc291cmNlLnB1Ymxpc2hlckJ5SGFuZGxlKGhhbmRsZSk7XG4gIGlmICghcHVibGlzaGVyKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbGlzdGluZyA9IGF3YWl0IHNvdXJjZS5saXN0aW5nQnlOYW1lKHB1Ymxpc2hlci5pZCwgcmVmLm5hbWUpO1xuICBpZiAoIWxpc3RpbmcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG9yZ0lkcyA9IHNjb3BlT3JnSWRzKHNjb3BlKTtcbiAgY29uc3QgW3BvbGljaWVzLCBpbnN0YWxsc10gPSBhd2FpdCBQcm9taXNlLmFsbChbc291cmNlLnBvbGljaWVzRm9yT3JncyhvcmdJZHMpLCBzb3VyY2UuaW5zdGFsbHNGb3JPcmdzKG9yZ0lkcyldKTtcbiAgY29uc3QgcG9saWN5ID0gZWZmZWN0aXZlQ29uc3VtcHRpb25Qb2xpY3kocG9saWNpZXMsIG9yZ0lkc1swXSEsIG9yZ0lkc1sxXSk7XG4gIGNvbnN0IGJsb2NrID0gbGlzdGluZ0Jsb2NrKHBvbGljeSwgcHVibGlzaGVyLCBsaXN0aW5nKTtcbiAgaWYgKGJsb2NrKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IGJsb2NrUmVmdXNhbChibG9jayksIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IG1vZGUgPSBpbnN0YWxsTW9kZUZvcihwdWJsaXNoZXIsIGxpc3RpbmcsIGluc3RhbGxzLCBwb2xpY3ksIHNjb3BlKTtcbiAgaWYgKCdjb2RlJyBpbiBtb2RlKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IG1vZGUsIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IFt2ZXJzaW9ucywgYWR2aXNvcmllc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgc291cmNlLnZlcnNpb25zRm9yTGlzdGluZ3MoW2xpc3RpbmcuaWRdKSxcbiAgICBzb3VyY2UuYWR2aXNvcmllc0Zvckxpc3RpbmdzKFtsaXN0aW5nLmlkXSksXG4gIF0pO1xuICBjb25zdCByZWZfID0gYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YDtcbiAgY29uc3QgY2hvaWNlID0gc2VsZWN0TGlzdGluZ1ZlcnNpb24oeyByZWY6IHJlZl8sIHZlcnNpb25zLCBtb2RlLCByZXF1ZXN0ZWQ6IHJlZi52ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSk7XG4gIGlmICgncmVmdXNhbCcgaW4gY2hvaWNlKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IGNob2ljZS5yZWZ1c2FsLCBwdWJsaXNoZXIsIGxpc3RpbmcgfTtcblxuICBjb25zdCB2ZXJzaW9uID0gY2hvaWNlLnZlcnNpb247XG4gIGNvbnN0IHsgd2FybmluZ3MsIHNlY3JldHNXaXRoaGVsZCB9ID0gbGlzdGVkVmVyc2lvbldhcm5pbmdzKHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSk7XG4gIHJldHVybiB7IG9rOiB0cnVlLCBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIG1vZGUsIHBvbGljeSwgc2VjcmV0c1dpdGhoZWxkLCB3YXJuaW5ncyB9O1xufVxuXG4vKipcbiAqIFRoZSBub24tZmF0YWwgbm90ZXMgYSByZXNvbHZlZCBsaXN0ZWQgdmVyc2lvbiBjYXJyaWVzIChsb29rdXAgYW5zd2VycyxcbiAqIHN5bnRoIHByaW50cyB0aGVtLCB0aGUgaW5zdGFsbHMgdmlldyBzaG93cyB0aGVtKTogYW4gdW5tYWludGFpbmVkIGxpc3RpbmcsIGFcbiAqIGRlcHJlY2F0ZWQgdmVyc2lvbiwgYSBQVUJMSVNIRUQgYWR2aXNvcnkgY292ZXJpbmcgdGhlIHZlcnNpb24gdGhhdCB0aGUgb3JnJ3NcbiAqIGBibG9ja09uQWR2aXNvcnlgIGRvZXNuJ3QgYmxvY2sgKGEgYmxvY2tpbmcgb25lIHJlZnVzZXMgcmVzb2x1dGlvbiBpbnN0ZWFkKSxcbiAqIGFuZCB3aXRoaGVsZCBzZWNyZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVkVmVyc2lvbldhcm5pbmdzKGlucHV0OiB7XG4gIHB1Ymxpc2hlcjogUGljazxQdWJsaXNoZXIsICdoYW5kbGUnIHwgJ3RpZXInPjtcbiAgbGlzdGluZzogUGljazxQbHVnaW5MaXN0aW5nLCAnbmFtZScgfCAnc3RhdGUnPjtcbiAgdmVyc2lvbjogUGljazxQbHVnaW5MaXN0aW5nVmVyc2lvbiwgJ3ZlcnNpb24nIHwgJ2RlcHJlY2F0ZWRBdCcgfCAnZGVwcmVjYXRpb25NZXNzYWdlJyB8ICdzcGVjU25hcHNob3QnPlxuICAgICYgUGFydGlhbDxQaWNrPFBsdWdpbkxpc3RpbmdWZXJzaW9uLCAnc2NhbkZsYWdnZWRBdCcgfCAnc2NhbkZsYWcnPj47XG4gIGFkdmlzb3JpZXM6IHJlYWRvbmx5IFBpY2s8UGx1Z2luQWR2aXNvcnksICdzZXZlcml0eScgfCAnc3RhdGUnIHwgJ2FmZmVjdGVkUmFuZ2UnIHwgJ2ZpeGVkVmVyc2lvbicgfCAnc3VtbWFyeSc+W107XG4gIHBvbGljeTogUGljazxDb25zdW1wdGlvblBvbGljeSwgJ3NlY3JldHNBbGxvd2VkVGllcnMnPjtcbn0pOiB7IHdhcm5pbmdzOiBSZXNvbHV0aW9uV2FybmluZ1tdOyBzZWNyZXRzV2l0aGhlbGQ6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSA9IGlucHV0O1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBjb25zdCBkZWNsYXJlc1NlY3JldHMgPSAodmVyc2lvbi5zcGVjU25hcHNob3Q/LnNlY3JldHMgPz8gW10pLmxlbmd0aCA+IDA7XG4gIGNvbnN0IHNlY3JldHNXaXRoaGVsZCA9IGRlY2xhcmVzU2VjcmV0cyAmJiAhcG9saWN5LnNlY3JldHNBbGxvd2VkVGllcnMuaW5jbHVkZXMocHVibGlzaGVyLnRpZXIpO1xuICBjb25zdCB3YXJuaW5nczogUmVzb2x1dGlvbldhcm5pbmdbXSA9IFtdO1xuICBpZiAobGlzdGluZy5zdGF0ZSA9PT0gJ3VubWFpbnRhaW5lZCcpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZTogJ0xJU1RJTkdfVU5NQUlOVEFJTkVEJywgbWVzc2FnZTogYCR7cmVmfSBpcyB1bm1haW50YWluZWQ6IGl0IHJlY2VpdmVzIG5vIHVwZGF0ZXMuIFBsYW4gYSByZXBsYWNlbWVudC5gIH0pO1xuICB9XG4gIGlmICh2ZXJzaW9uLmRlcHJlY2F0ZWRBdCkge1xuICAgIHdhcm5pbmdzLnB1c2goeyBjb2RlOiAnUExVR0lOX0RFUFJFQ0FURUQnLCBtZXNzYWdlOiBgJHtyZWZ9QCR7dmVyc2lvbi52ZXJzaW9ufSBpcyBkZXByZWNhdGVkJHt2ZXJzaW9uLmRlcHJlY2F0aW9uTWVzc2FnZSA/IGA6ICR7dmVyc2lvbi5kZXByZWNhdGlvbk1lc3NhZ2V9YCA6ICcnfS5gIH0pO1xuICB9XG4gIGZvciAoY29uc3QgYSBvZiBhZHZpc29yaWVzQ292ZXJpbmcoYWR2aXNvcmllcywgdmVyc2lvbi52ZXJzaW9uKSkge1xuICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgY29kZTogJ1BMVUdJTl9BRFZJU09SWScsXG4gICAgICBtZXNzYWdlOiBgJHtyZWZ9QCR7dmVyc2lvbi52ZXJzaW9ufSBpcyBhZmZlY3RlZCBieSBhICR7YS5zZXZlcml0eX0gc2VjdXJpdHkgYWR2aXNvcnk6ICR7YS5zdW1tYXJ5fWBcbiAgICAgICAgKyBgJHthLmZpeGVkVmVyc2lvbiA/IGAgRml4ZWQgaW4gJHthLmZpeGVkVmVyc2lvbn0uYCA6ICcnfWAsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgZmxhZyA9IHZlcnNpb24uc2NhbkZsYWdnZWRBdCA/IGFzU2NhbkZsYWcodmVyc2lvbi5zY2FuRmxhZykgOiBudWxsO1xuICBpZiAoZmxhZykgd2FybmluZ3MucHVzaCh2dWxuRmxhZ2dlZFdhcm5pbmcocmVmLCB2ZXJzaW9uLnZlcnNpb24sIGZsYWcpKTtcbiAgaWYgKHNlY3JldHNXaXRoaGVsZCkge1xuICAgIHdhcm5pbmdzLnB1c2goeyBjb2RlOiAnUExVR0lOX1NFQ1JFVFNfV0lUSEhFTEQnLCBtZXNzYWdlOiBgJHtyZWZ9IGlzIGEgJHtwdWJsaXNoZXIudGllcn0gcGx1Z2luOyB5b3VyIG9yZ2FuaXphdGlvbidzIHBvbGljeSBnaXZlcyBpdCBubyBzZWNyZXRzLCBzbyBpdHMgZGVjbGFyZWQgc2VjcmV0cyBhcmUgbm90IGluamVjdGVkLmAgfSk7XG4gIH1cbiAgcmV0dXJuIHsgd2FybmluZ3MsIHNlY3JldHNXaXRoaGVsZCB9O1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4gcmVjb3JkIGEgcmVzb2x2ZWQgbGlzdGluZyB2ZXJzaW9uIHJ1bnMgYXMg4oCUIHRoZSBzaGFwZSBzeW50aCBhbmRcbiAqIHRoZSBjb250cmFjdCBjaGVjayByZWFkIChhIGBwbHVnaW5zYCByb3cncyBydW4gZmllbGRzKSwgYnVpbHQgZnJvbSB0aGVcbiAqIHZlcnNpb24ncyBmcm96ZW4gc3BlYyBzbmFwc2hvdC4gYGlkYCBpcyB0aGUgTElTVElORyBWRVJTSU9OJ3MgaWQgKHRoZSBzdGVwXG4gKiBtYW5pZmVzdCByZXNvbHZlcyBpdCBiYWNrKSwgYGltYWdlUmVwb3NpdG9yeWAgaXRzIGBwdWJsaWMvKmAgY29weS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlZFBsdWdpblJlY29yZChyZXM6IExpc3RpbmdSZXNvbHZlZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIG1vZGUgfSA9IHJlcztcbiAgY29uc3QgcyA9ICh2ZXJzaW9uLnNwZWNTbmFwc2hvdCA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGFyciA9IDxUPih2OiB1bmtub3duKTogVFtdID0+IChBcnJheS5pc0FycmF5KHYpID8gdiBhcyBUW10gOiBbXSk7XG4gIGNvbnN0IG9iaiA9ICh2OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gKHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHYpID8gdiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHt9KTtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmVyc2lvbi5pZCxcbiAgICBzb3VyY2U6ICdsaXN0aW5nJyxcbiAgICBwdWJsaXNoZXI6IHB1Ymxpc2hlci5oYW5kbGUsXG4gICAgcHVibGlzaGVyVGllcjogcHVibGlzaGVyLnRpZXIsXG4gICAgbGlzdGluZ0lkOiBsaXN0aW5nLmlkLFxuICAgIGluc3RhbGw6IG1vZGUua2luZCxcbiAgICBuYW1lOiBsaXN0aW5nLm5hbWUsXG4gICAgdmVyc2lvbjogdmVyc2lvbi52ZXJzaW9uLFxuICAgIGltYWdlUmVwb3NpdG9yeTogdmVyc2lvbi5pbWFnZVJlcG9zaXRvcnksXG4gICAgaW1hZ2VEaWdlc3Q6IHZlcnNpb24uaW1hZ2VEaWdlc3QsXG4gICAgYnVpbGRUeXBlOiB0eXBlb2Ygcy5idWlsZFR5cGUgPT09ICdzdHJpbmcnID8gcy5idWlsZFR5cGUgOiAodmVyc2lvbi5pbWFnZURpZ2VzdCA/ICdidWlsZF9pbWFnZScgOiAnbWV0YWRhdGFfb25seScpLFxuICAgIHBsdWdpblR5cGU6IHMucGx1Z2luVHlwZSA/PyAnQ29kZUJ1aWxkU3RlcCcsXG4gICAgY29tcHV0ZVR5cGU6IHMuY29tcHV0ZVR5cGUgPz8gJ1NNQUxMJyxcbiAgICBkZXNjcmlwdGlvbjogcy5kZXNjcmlwdGlvbiA/PyBsaXN0aW5nLmRlc2NyaXB0aW9uID8/IG51bGwsXG4gICAgc3VtbWFyeTogcy5zdW1tYXJ5ID8/IGxpc3Rpbmcuc3VtbWFyeSA/PyBudWxsLFxuICAgIGRpc3BsYXlOYW1lOiBzLmRpc3BsYXlOYW1lID8/IG51bGwsXG4gICAga2V5d29yZHM6IGFycjxzdHJpbmc+KHMua2V5d29yZHMpLFxuICAgIGNhdGVnb3J5OiBzLmNhdGVnb3J5ID8/IGxpc3RpbmcuY2F0ZWdvcnksXG4gICAgbWV0YWRhdGE6IG9iaihzLm1ldGFkYXRhKSxcbiAgICBlbnY6IG9iaihzLmVudiksXG4gICAgYnVpbGRBcmdzOiB7fSxcbiAgICBpbnN0YWxsQ29tbWFuZHM6IGFycjxzdHJpbmc+KHMuaW5zdGFsbENvbW1hbmRzKSxcbiAgICBjb21tYW5kczogYXJyPHN0cmluZz4ocy5jb21tYW5kcyksXG4gICAgdGltZW91dDogcy50aW1lb3V0ID8/IG51bGwsXG4gICAgZmFpbHVyZUJlaGF2aW9yOiBzLmZhaWx1cmVCZWhhdmlvciA/PyAnZmFpbCcsXG4gICAgcHJpbWFyeU91dHB1dERpcmVjdG9yeTogcy5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5ID8/IG51bGwsXG4gICAgc2VjcmV0czogcmVzLnNlY3JldHNXaXRoaGVsZCA/IFtdIDogYXJyKHMuc2VjcmV0cyksXG4gICAgcmVxdWlyZWRNZXRhZGF0YTogYXJyPHN0cmluZz4ocy5yZXF1aXJlZE1ldGFkYXRhKSxcbiAgICByZXF1aXJlZFZhcnM6IGFycjxzdHJpbmc+KHMucmVxdWlyZWRWYXJzKSxcbiAgICBtZXRhZGF0YVR5cGVzOiBvYmoocy5tZXRhZGF0YVR5cGVzKSxcbiAgICB2YXJzVHlwZXM6IG9iaihzLnZhcnNUeXBlcyksXG4gICAgbmV0d29ya0VncmVzczogYXJyPHN0cmluZz4ocy5uZXR3b3JrRWdyZXNzKSxcbiAgICBydW5Bc1Jvb3Q6IHMucnVuQXNSb290ID8/IG51bGwsXG4gICAgbGljZW5zZTogcy5saWNlbnNlID8/IGxpc3RpbmcubGljZW5zZSA/PyBudWxsLFxuICAgIGhvbWVwYWdlVXJsOiBzLmhvbWVwYWdlVXJsID8/IGxpc3RpbmcuaG9tZXBhZ2VVcmwgPz8gbnVsbCxcbiAgICBzb3VyY2VVcmw6IHMuc291cmNlVXJsID8/IGxpc3Rpbmcuc291cmNlVXJsID8/IG51bGwsXG4gICAgZG9jdW1lbnRhdGlvblVybDogcy5kb2N1bWVudGF0aW9uVXJsID8/IG51bGwsXG4gICAgaWNvbjogcy5pY29uID8/IGxpc3RpbmcuaWNvbiA/PyBudWxsLFxuICAgIGNoYW5nZWxvZzogdmVyc2lvbi5jaGFuZ2Vsb2csXG4gICAgYnJlYWtpbmc6IHZlcnNpb24uYnJlYWtpbmcsXG4gICAgdnVsbkNyaXRpY2FsOiB2ZXJzaW9uLnZ1bG5Dcml0aWNhbCxcbiAgICB2dWxuSGlnaDogdmVyc2lvbi52dWxuSGlnaCxcbiAgICB2dWxuQ3JpdGljYWxGaXhhYmxlOiB2ZXJzaW9uLnZ1bG5Dcml0aWNhbEZpeGFibGUsXG4gICAgdnVsbkhpZ2hGaXhhYmxlOiB2ZXJzaW9uLnZ1bG5IaWdoRml4YWJsZSxcbiAgICBzY2FubmVkQXQ6IHZlcnNpb24uc2Nhbm5lZEF0LFxuICAgIHNjYW5GbGFnZ2VkQXQ6IHZlcnNpb24uc2NhbkZsYWdnZWRBdCxcbiAgICBzY2FuRmxhZzogdmVyc2lvbi5zY2FuRmxhZyxcbiAgICBsaWZlY3ljbGU6IHZlcnNpb24uZGVwcmVjYXRlZEF0ID8gJ2RlcHJlY2F0ZWQnIDogJ3Byb2R1Y3Rpb24nLFxuICAgIGRlcHJlY2F0ZWRBdDogdmVyc2lvbi5kZXByZWNhdGVkQXQsXG4gICAgZGVwcmVjYXRpb25NZXNzYWdlOiB2ZXJzaW9uLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICB5YW5rZWRBdDogbnVsbCxcbiAgICB5YW5rUmVhc29uOiBudWxsLFxuICAgIHZpc2liaWxpdHk6ICdwdWJsaWMnLFxuICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZXJ5dGhpbmcgYW4gb3JnIGNhbiByZXNvbHZlIChjYXRhbG9nLCBBSSBzZWxlY3Rpb24sIHBsYWNlaG9sZGVyIGd1YXJkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE9uZSBsaXN0aW5nIHdpdGggdGhlIG9yZydzIHN0YW5kaW5nIG9uIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdMaXN0aW5nU3RhdGUge1xuICBwdWJsaXNoZXI6IFB1Ymxpc2hlcjtcbiAgbGlzdGluZzogUGx1Z2luTGlzdGluZztcbiAgdmVyc2lvbnM6IFBsdWdpbkxpc3RpbmdWZXJzaW9uW107XG4gIC8qKiBIb3cgdGhlIG9yZyByZWFjaGVzIGl0LCBvciB3aHkgaXQgY2FuJ3QgKG5vdCBpbnN0YWxsZWQsIHBlbmRpbmcsIOKApikuICovXG4gIG1vZGU6IEluc3RhbGxNb2RlIHwgUmVzb2x1dGlvblJlZnVzYWw7XG4gIC8qKiBBIHBvbGljeSAvIHN0YXRlIGJsb2NrICh0aWVyLCBibG9ja2VkIGxpc3RpbmcsIHN1c3BlbmRlZCksIG9yIG51bGwuICovXG4gIGJsb2NrOiBMaXN0aW5nQmxvY2sgfCBudWxsO1xuICAvKiogV2hhdCBhbiBVTlZFUlNJT05FRCByZWZlcmVuY2UgcmVzb2x2ZXMgdG8gcmlnaHQgbm93LCBvciBudWxsLiAqL1xuICByZXNvbHZlZDogUGx1Z2luTGlzdGluZ1ZlcnNpb24gfCBudWxsO1xuICAvKiogV2h5IG5vdGhpbmcgcmVzb2x2ZXMsIHdoZW4gdGhlIG9yZyBkb2VzIHJlYWNoIHRoZSBsaXN0aW5nIChlLmcuIGFuIGFkdmlzb3J5IGJsb2NrKS4gKi9cbiAgcmVmdXNhbDogUmVzb2x1dGlvblJlZnVzYWwgfCBudWxsO1xuICAvKiogVGhlIGxpc3RpbmcncyBQVUJMSVNIRUQgYWR2aXNvcmllcy4gKi9cbiAgYWR2aXNvcmllczogUGx1Z2luQWR2aXNvcnlbXTtcbiAgLyoqIFRoZSBvcmcncyBvd24gaW5zdGFsbCByb3cgZm9yIGl0IChleHBsaWNpdCwgcG9zc2libHkgcGVuZGluZy9kZW5pZWQpLiAqL1xuICBvd25JbnN0YWxsOiBQbHVnaW5JbnN0YWxsIHwgbnVsbDtcbiAgLyoqIFRoZSBvcmcncyBlZmZlY3RpdmUgY29uc3VtcHRpb24gcG9saWN5ICh0aGUgc2FtZSBmb3IgZXZlcnkgbGlzdGluZykuICovXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG59XG5cbi8qKiBUaGUgb3JnJ3MgcG9saWN5ICsgaW5zdGFsbCByb3dzIChvd24gYW5kIHJvb3QpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdJbnN0YWxsQ29udGV4dCB7XG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG4gIGluc3RhbGxzOiBQbHVnaW5JbnN0YWxsW107XG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGU7XG59XG5cbi8qKiBMb2FkIHRoZSBvcmcncyBwb2xpY3kgYW5kIGluc3RhbGwgcm93cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkT3JnSW5zdGFsbENvbnRleHQoc291cmNlOiBMaXN0aW5nRGF0YVNvdXJjZSwgc2NvcGU6IFJlc29sdXRpb25TY29wZSk6IFByb21pc2U8T3JnSW5zdGFsbENvbnRleHQ+IHtcbiAgY29uc3Qgb3JnSWRzID0gc2NvcGVPcmdJZHMoc2NvcGUpO1xuICBjb25zdCBbcG9saWNpZXMsIGluc3RhbGxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzb3VyY2UucG9saWNpZXNGb3JPcmdzKG9yZ0lkcyksIHNvdXJjZS5pbnN0YWxsc0Zvck9yZ3Mob3JnSWRzKV0pO1xuICByZXR1cm4geyBwb2xpY3k6IGVmZmVjdGl2ZUNvbnN1bXB0aW9uUG9saWN5KHBvbGljaWVzLCBvcmdJZHNbMF0hLCBvcmdJZHNbMV0pLCBpbnN0YWxscywgc2NvcGUgfTtcbn1cblxuLyoqXG4gKiBUaGUgb3JnJ3Mgc3RhbmRpbmcgb24gZXZlcnkgbGl2ZSBsaXN0aW5nIChvciBvbmx5IGBmaWx0ZXJgJ3MpLiBVc2VkIGJ5IHRoZVxuICogaW4tYXBwIGNhdGFsb2c7IHtAbGluayByZXNvbHZhYmxlTGlzdGluZ3N9IG5hcnJvd3MgaXQgdG8gd2hhdCByZXNvbHZlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9yZ0xpc3RpbmdTdGF0ZXMoXG4gIHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUsXG4gIGZpbHRlcjogeyBpZHM/OiBzdHJpbmdbXTsgbmFtZXM/OiBzdHJpbmdbXSB9ID0ge30sXG4gIGN0eD86IE9yZ0luc3RhbGxDb250ZXh0LFxuKTogUHJvbWlzZTxPcmdMaXN0aW5nU3RhdGVbXT4ge1xuICBjb25zdCBjb250ZXh0ID0gY3R4ID8/IGF3YWl0IGxvYWRPcmdJbnN0YWxsQ29udGV4dChzb3VyY2UsIHNjb3BlKTtcbiAgY29uc3QgbGl2ZSA9IGF3YWl0IHNvdXJjZS5saXZlTGlzdGluZ3MoZmlsdGVyKTtcbiAgaWYgKGxpdmUubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGNvbnN0IGlkcyA9IGxpdmUubWFwKChsKSA9PiBsLmlkKTtcbiAgY29uc3QgW3B1YnMsIHZlcnNpb25zLCBhZHZpc29yaWVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzb3VyY2UucHVibGlzaGVyc0J5SWRzKFsuLi5uZXcgU2V0KGxpdmUubWFwKChsKSA9PiBsLnB1Ymxpc2hlcklkKSldKSxcbiAgICBzb3VyY2UudmVyc2lvbnNGb3JMaXN0aW5ncyhpZHMpLFxuICAgIHNvdXJjZS5hZHZpc29yaWVzRm9yTGlzdGluZ3MoaWRzKSxcbiAgXSk7XG4gIGNvbnN0IGJ5UHVibGlzaGVyID0gbmV3IE1hcChwdWJzLm1hcCgocCkgPT4gW3AuaWQsIHBdKSk7XG4gIGNvbnN0IG93biA9IHNjb3BlT3JnSWRzKHNjb3BlKVswXSE7XG4gIGNvbnN0IG91dDogT3JnTGlzdGluZ1N0YXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaXN0aW5nIG9mIGxpdmUpIHtcbiAgICBjb25zdCBwdWJsaXNoZXIgPSBieVB1Ymxpc2hlci5nZXQobGlzdGluZy5wdWJsaXNoZXJJZCk7XG4gICAgaWYgKCFwdWJsaXNoZXIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZzID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiB2Lmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCk7XG4gICAgY29uc3QgYmxvY2sgPSBsaXN0aW5nQmxvY2soY29udGV4dC5wb2xpY3ksIHB1Ymxpc2hlciwgbGlzdGluZyk7XG4gICAgY29uc3QgbW9kZSA9IGluc3RhbGxNb2RlRm9yKHB1Ymxpc2hlciwgbGlzdGluZywgY29udGV4dC5pbnN0YWxscywgY29udGV4dC5wb2xpY3ksIHNjb3BlKTtcbiAgICBjb25zdCBsaXN0aW5nQWR2aXNvcmllcyA9IGFkdmlzb3JpZXMuZmlsdGVyKChhKSA9PiBhLmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCk7XG4gICAgbGV0IHJlc29sdmVkOiBQbHVnaW5MaXN0aW5nVmVyc2lvbiB8IG51bGwgPSBudWxsO1xuICAgIGxldCByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbCB8IG51bGwgPSBudWxsO1xuICAgIGlmICghYmxvY2sgJiYgISgnY29kZScgaW4gbW9kZSkpIHtcbiAgICAgIGNvbnN0IGNob2ljZSA9IHNlbGVjdExpc3RpbmdWZXJzaW9uKHtcbiAgICAgICAgcmVmOiBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gLCB2ZXJzaW9uczogdnMsIG1vZGUsIGFkdmlzb3JpZXM6IGxpc3RpbmdBZHZpc29yaWVzLCBwb2xpY3k6IGNvbnRleHQucG9saWN5LFxuICAgICAgfSk7XG4gICAgICBpZiAoJ3ZlcnNpb24nIGluIGNob2ljZSkgcmVzb2x2ZWQgPSBjaG9pY2UudmVyc2lvbjtcbiAgICAgIGVsc2UgcmVmdXNhbCA9IGNob2ljZS5yZWZ1c2FsO1xuICAgIH1cbiAgICBjb25zdCBvd25JbnN0YWxsID0gY29udGV4dC5pbnN0YWxscy5maW5kKChpKSA9PiBpLmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCAmJiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IG93bikgPz8gbnVsbDtcbiAgICBvdXQucHVzaCh7IHB1Ymxpc2hlciwgbGlzdGluZywgdmVyc2lvbnM6IHZzLCBtb2RlLCBibG9jaywgcmVzb2x2ZWQsIHJlZnVzYWwsIGFkdmlzb3JpZXM6IGxpc3RpbmdBZHZpc29yaWVzLCBvd25JbnN0YWxsLCBwb2xpY3k6IGNvbnRleHQucG9saWN5IH0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgbGlzdGluZ3MgYW4gb3JnJ3MgcmVmZXJlbmNlcyByZXNvbHZlIHRvIG5vdyAoaW5zdGFsbGVkIG9yIGltcGxpY2l0LCBub3QgYmxvY2tlZCkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2YWJsZUxpc3RpbmdzKFxuICBzb3VyY2U6IExpc3RpbmdEYXRhU291cmNlLFxuICBzY29wZTogUmVzb2x1dGlvblNjb3BlLFxuICBmaWx0ZXI6IHsgbmFtZXM/OiBzdHJpbmdbXSB9ID0ge30sXG4pOiBQcm9taXNlPEFycmF5PE9yZ0xpc3RpbmdTdGF0ZSAmIHsgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIH0+PiB7XG4gIHJldHVybiAoYXdhaXQgb3JnTGlzdGluZ1N0YXRlcyhzb3VyY2UsIHNjb3BlLCBmaWx0ZXIpKVxuICAgIC5maWx0ZXIoKHMpOiBzIGlzIE9yZ0xpc3RpbmdTdGF0ZSAmIHsgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIH0gPT4gcy5yZXNvbHZlZCAhPT0gbnVsbCk7XG59XG4iXX0=
@@ -87,7 +87,12 @@ export interface DirectoryListingVersion {
87
87
  changelog: string | null;
88
88
  vulnCritical: number | null;
89
89
  vulnHigh: number | null;
90
+ /** Of those, the findings grype reports a fixed version for. */
91
+ vulnCriticalFixable: number | null;
92
+ vulnHighFixable: number | null;
90
93
  scannedAt: string | null;
94
+ /** When the nightly rescan flagged this version (fixable criticals over the platform floor); null = not flagged. */
95
+ scanFlaggedAt: string | null;
91
96
  /** Ids of the published advisories whose range covers this version. */
92
97
  advisoryIds: string[];
93
98
  }
@@ -117,6 +122,9 @@ export interface DirectoryListingDetail extends DirectoryListingCard {
117
122
  scannedAt: string | null;
118
123
  vulnCritical: number | null;
119
124
  vulnHigh: number | null;
125
+ vulnCriticalFixable: number | null;
126
+ vulnHighFixable: number | null;
127
+ scanFlaggedAt: string | null;
120
128
  sbomUrl: string | null;
121
129
  };
122
130
  advisories: {