@pipeline-builder/pipeline-core 4.1.6 → 4.1.8

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.
@@ -12,13 +12,16 @@ export declare function loadBillingConfig(): BillingConfig;
12
12
  */
13
13
  export declare function assertCombosValid(combos: ComboDiscountConfig[], bundles: BundleConfig[]): void;
14
14
  /**
15
- * Config-load guardrail for the `requires` prerequisite graph. A `requires` entry
16
- * that doesn't resolve to an ACTIVE bundle — or that participates in a cycle —
17
- * silently makes the referencing bundle unpurchasable (the addon route rejects
18
- * with 400 forever because the prerequisite can never be satisfied). Catch it at
19
- * load with a clear error rather than shipping a dead SKU.
15
+ * Config-load guardrail for the `requires` / `requiresFeatures` prerequisites. A
16
+ * `requires` entry that doesn't resolve to an ACTIVE bundle — or that participates
17
+ * in a cycle — silently makes the referencing bundle unpurchasable (the addon
18
+ * route rejects with 400 forever because the prerequisite can never be
19
+ * satisfied). Catch it at load with a clear error rather than shipping a dead SKU.
20
20
  *
21
21
  * - Every id in a bundle's `requires` MUST name an active bundle in the catalog.
22
22
  * - The `requires` graph MUST be acyclic (a → b → a can never be satisfied).
23
+ * - Every `requiresFeatures` entry MUST be a real feature flag, attainable on
24
+ * EVERY tier the bundle is sold to — either tier-included (`TIER_FEATURES`) or
25
+ * granted by an active bundle offered on that same tier.
23
26
  */
24
27
  export declare function assertBundleRequiresValid(bundles: BundleConfig[]): void;
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * All defaults match the original hardcoded seed data.
15
15
  */
16
- import { QUOTA_TIERS, TIER_FEATURES, FEATURE_METADATA, VALID_TIERS, STANDARD_TIERS, isValidTier } from '@pipeline-builder/api-core';
16
+ import { QUOTA_TIERS, TIER_FEATURES, FEATURE_METADATA, VALID_TIERS, STANDARD_TIERS, isValidFeatureFlag, isValidTier } from '@pipeline-builder/api-core';
17
17
  // -- Default features ---------------------------------------------------------
18
18
  // The marketed feature list is built from two derived sources so it can never
19
19
  // drift from what the platform actually enforces:
@@ -23,8 +23,9 @@ import { QUOTA_TIERS, TIER_FEATURES, FEATURE_METADATA, VALID_TIERS, STANDARD_TIE
23
23
  // (TIER_FEATURES) via FEATURE_METADATA labels — so an advertised base
24
24
  // feature is always one `requireFeature` actually grants for that tier.
25
25
  // Only genuinely non-gated marketing copy (support level, dashboards, RBAC) is
26
- // hand-authored, passed as `perks`. Purchasable add-ons (sso, audit_log) are NOT
27
- // listed as base perks here — they are sold as bundles (see loadBundles()).
26
+ // hand-authored, passed as `perks`. Purchasable feature add-ons (sso,
27
+ // advanced_reporting, …) are NOT listed as base perks here — they are sold as
28
+ // bundles (see loadBundles()).
28
29
  /** "Up to N plugins" / "Unlimited plugins" from an effective limit (-1 = unlimited). */
29
30
  function limitLine(limit, singular, plural) {
30
31
  if (limit === -1)
@@ -46,9 +47,12 @@ function defaultFeatures(tier, perks) {
46
47
  }
47
48
  // Note: `perks` are non-gated marketing lines only. Enforced features (incl.
48
49
  // Priority Support for pro/team/enterprise) come from TIER_FEATURES above.
49
- const DEFAULT_DEVELOPER_FEATURES = defaultFeatures('developer', ['Community support']);
50
+ // The reporting dashboard is open to every tier (only the DORA/scorecard views
51
+ // are entitlement-gated), so it's listed on each plan rather than implying a
52
+ // lower tier lacks it.
53
+ const DEFAULT_DEVELOPER_FEATURES = defaultFeatures('developer', ['Community support', 'Reporting dashboard']);
50
54
  const DEFAULT_PRO_FEATURES = defaultFeatures('pro', ['Reporting dashboard']);
51
- const DEFAULT_TEAM_FEATURES = defaultFeatures('team', ['RBAC & team roles']);
55
+ const DEFAULT_TEAM_FEATURES = defaultFeatures('team', ['RBAC & team roles', 'Reporting dashboard']);
52
56
  const DEFAULT_ENTERPRISE_FEATURES = defaultFeatures('enterprise', [
53
57
  'RBAC & team roles', 'Reporting dashboard',
54
58
  ]);
@@ -390,6 +394,7 @@ function loadBundles() {
390
394
  ...(extra.features ? { features: extra.features } : {}),
391
395
  ...(extra.maxQuantity !== undefined ? { maxQuantity: extra.maxQuantity } : {}),
392
396
  ...(extra.requires ? { requires: extra.requires } : {}),
397
+ ...(extra.requiresFeatures ? { requiresFeatures: extra.requiresFeatures } : {}),
393
398
  ...(volumeTiers ? { volumeTiers } : {}),
394
399
  prices: {
395
400
  monthly: resolvedMonthly,
@@ -416,19 +421,20 @@ function loadBundles() {
416
421
  b('api_pack', 'API Pack (+100k)', '100,000 additional API calls / period', { apiCalls: 100_000 }, 1999, ALL, 3),
417
422
  b('ai_pack', 'AI Pack (+2.5k)', '2,500 additional AI calls / period', { aiCalls: 2500 }, 1999, ALL, 4),
418
423
  b('storage_pack', 'Storage Pack (+10 GB)', '10 GB additional registry storage', { storageBytes: 10 * BUNDLE_GB }, 1999, ALL, 5),
419
- b('audit_log', 'Audit Log', 'Audit log capability', {}, 2000, ['pro'], 6, { features: ['audit_log'], stackable: false }),
420
424
  // SSO is INCLUDED in Team (see TIER_FEATURES.team), so the add-on is Pro-only.
421
- b('sso', 'SSO / IdP', 'SSO + up to 5 IdP configs', { idpConfigs: 5 }, 4000, ['pro'], 7, { features: ['sso'], stackable: false }),
425
+ // The grant is ADDITIVE on Pro's own idpConfigs baseline, hence "additional".
426
+ b('sso', 'SSO / IdP', 'Single sign-on + 5 additional IdP configs', { idpConfigs: 5 }, 4000, ['pro'], 7, { features: ['sso'], stackable: false }),
422
427
  // DORA / advanced delivery analytics. INCLUDED in Enterprise (TIER_FEATURES),
423
428
  // so the add-on is offered to every other tier (developer/pro/team). Priced
424
- // between Audit Log ($20) and SSO ($40) — a higher-value, actively-used
425
- // analytics surface than the audit log, but below the SSO enterprise gate.
426
- b('advanced_reporting', 'Advanced Reporting (DORA)', 'DORA delivery metrics — deployment frequency, change failure rate, MTTR, lead-time proxy, performance bands + trend', {}, 3000, ['developer', 'pro', 'team'], 8, { features: ['advanced_reporting'], stackable: false }),
429
+ // below SSO ($40) — an analytics surface, not the enterprise identity gate.
430
+ // Lead time is MEASURED commit → deploy (reporting's deploy events), not a proxy.
431
+ b('advanced_reporting', 'Advanced Reporting (DORA)', 'DORA delivery metrics — deployment frequency, lead time (commit → deploy), change failure rate, MTTR, performance bands + trend', {}, 3000, ['developer', 'pro', 'team'], 8, { features: ['advanced_reporting'], stackable: false }),
427
432
  // Per-team usage breakdown across the org → team subtree. INCLUDED in
428
- // Enterprise (TIER_FEATURES); the add-on is offered to Pro/Team (developer has
429
- // no teams to break down). Priced at $30/mo ($300/yr) — parity with DORA, its
430
- // analytics sibling. Overridable via BILLING_BUNDLE_TEAM_USAGE_ANALYTICS_MONTHLY/_ANNUAL.
431
- b('team_usage_analytics', 'Team Usage Analytics', 'Per-team usage breakdown across the org → team subtree (all quota dimensions)', {}, 3000, ['pro', 'team'], 9, { features: ['team_usage_analytics'], stackable: false }),
433
+ // Enterprise (TIER_FEATURES); the add-on is offered to Team only — Developer
434
+ // and Pro can't nest teams (TEAM_CAPABLE_TIERS), so there'd be nothing to
435
+ // break down. Priced at $30/mo ($300/yr) — parity with DORA, its analytics
436
+ // sibling. Overridable via BILLING_BUNDLE_TEAM_USAGE_ANALYTICS_MONTHLY/_ANNUAL.
437
+ b('team_usage_analytics', 'Team Usage Analytics', 'Per-team usage breakdown across the org → team subtree (all quota dimensions)', {}, 3000, ['team'], 9, { features: ['team_usage_analytics'], stackable: false }),
432
438
  // Retention packs (docs/billing-bundles.md). Stackable capacity packs that
433
439
  // raise the reporting retention entitlement billing syncs to reporting's
434
440
  // `dora_settings`. NOT quota-metered flow — `eventRetentionDays`/`doraRetentionDays`
@@ -438,9 +444,10 @@ function loadBundles() {
438
444
  b('retention_pack', 'Standard Retention Pack (+90d)', '90 additional days of standard pipeline-event retention', { eventRetentionDays: 90 }, 1500, ALL, 10, { maxQuantity: 7 }),
439
445
  // DORA History Pack: +365d DORA retention AND per-org report-query window (the
440
446
  // window cap tracks doraRetentionDays). Only meaningful with Advanced Reporting
441
- // — INCLUDED in Enterprise, an add-on on developer/pro/team. Capped at 1
447
+ // — INCLUDED in Enterprise, an add-on on developer/pro/team — so it
448
+ // `requiresFeatures` it (the tier OR a held bundle satisfies it). Capped at 1
442
449
  // (180 + 365 = 545 ≤ the 730-day retention ceiling).
443
- b('dora_history_pack', 'DORA History Pack (+365d)', '365 additional days of DORA history + report-query window (requires Advanced Reporting)', { doraRetentionDays: 365 }, 3000, ALL, 11, { maxQuantity: 1 }),
450
+ b('dora_history_pack', 'DORA History Pack (+365d)', '365 additional days of DORA history + report-query window (requires Advanced Reporting)', { doraRetentionDays: 365 }, 3000, ALL, 11, { maxQuantity: 1, requiresFeatures: ['advanced_reporting'] }),
444
451
  // Compliance content add-ons (docs/plans/compliance-addons.md). Feature bundles
445
452
  // gating access to curated system-org published rule sets. INCLUDED in
446
453
  // Enterprise/Unlimited (via ALL_FEATURE_FLAGS); sold to Developer/Pro/Team.
@@ -453,14 +460,17 @@ function loadBundles() {
453
460
  return bundles;
454
461
  }
455
462
  /**
456
- * Config-load guardrail for the `requires` prerequisite graph. A `requires` entry
457
- * that doesn't resolve to an ACTIVE bundle — or that participates in a cycle —
458
- * silently makes the referencing bundle unpurchasable (the addon route rejects
459
- * with 400 forever because the prerequisite can never be satisfied). Catch it at
460
- * load with a clear error rather than shipping a dead SKU.
463
+ * Config-load guardrail for the `requires` / `requiresFeatures` prerequisites. A
464
+ * `requires` entry that doesn't resolve to an ACTIVE bundle — or that participates
465
+ * in a cycle — silently makes the referencing bundle unpurchasable (the addon
466
+ * route rejects with 400 forever because the prerequisite can never be
467
+ * satisfied). Catch it at load with a clear error rather than shipping a dead SKU.
461
468
  *
462
469
  * - Every id in a bundle's `requires` MUST name an active bundle in the catalog.
463
470
  * - The `requires` graph MUST be acyclic (a → b → a can never be satisfied).
471
+ * - Every `requiresFeatures` entry MUST be a real feature flag, attainable on
472
+ * EVERY tier the bundle is sold to — either tier-included (`TIER_FEATURES`) or
473
+ * granted by an active bundle offered on that same tier.
464
474
  */
465
475
  export function assertBundleRequiresValid(bundles) {
466
476
  const active = new Map(bundles.filter((b) => b.isActive).map((b) => [b.id, b]));
@@ -472,6 +482,21 @@ export function assertBundleRequiresValid(bundles) {
472
482
  }
473
483
  }
474
484
  }
485
+ // 1b. Feature prerequisites: a real flag, attainable on every sold-to tier.
486
+ for (const bundle of bundles) {
487
+ for (const flag of bundle.requiresFeatures ?? []) {
488
+ if (!isValidFeatureFlag(flag)) {
489
+ throw new Error(`[billing-config] Bundle "${bundle.id}" requiresFeatures "${flag}", which is not a feature flag.`);
490
+ }
491
+ for (const tier of bundle.availableForTiers) {
492
+ const tierIncludes = (TIER_FEATURES[tier] ?? []).includes(flag);
493
+ const buyable = [...active.values()].some((o) => o.availableForTiers.includes(tier) && (o.features ?? []).includes(flag));
494
+ if (!tierIncludes && !buyable) {
495
+ throw new Error(`[billing-config] Bundle "${bundle.id}" requires feature "${flag}", which the ${tier} tier neither includes nor can buy — it would be permanently unpurchasable there.`);
496
+ }
497
+ }
498
+ }
499
+ }
475
500
  // 2. Acyclicity: DFS over the requires edges, tracking the current path.
476
501
  const VISITING = 1;
477
502
  const DONE = 2;
@@ -494,4 +519,4 @@ export function assertBundleRequiresValid(bundles) {
494
519
  visit(bundle, []);
495
520
  }
496
521
  }
497
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2JpbGxpbmctY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQXdDLE1BQU0sNEJBQTRCLENBQUM7QUFPMUssZ0ZBQWdGO0FBQ2hGLDhFQUE4RTtBQUM5RSxrREFBa0Q7QUFDbEQsa0ZBQWtGO0FBQ2xGLGlEQUFpRDtBQUNqRCx3RUFBd0U7QUFDeEUsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsaUZBQWlGO0FBQ2pGLDRFQUE0RTtBQUU1RSx3RkFBd0Y7QUFDeEYsU0FBUyxTQUFTLENBQUMsS0FBYSxFQUFFLFFBQWdCLEVBQUUsTUFBYztJQUNoRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7UUFBRSxPQUFPLGFBQWEsTUFBTSxFQUFFLENBQUM7SUFDL0MsT0FBTyxTQUFTLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNyRixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsSUFBZSxFQUFFLEtBQWU7SUFDdkQsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQyxPQUFPO1FBQ0wsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUNuQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxDQUFDLENBQUMs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QUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ25ELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0QixDQUFDLENBQUM7SUFFRixLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ25DLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBMb2FkIGJpbGxpbmcgcGxhbiBjb25maWd1cmF0aW9uIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqIFBlci1wbGFuIHByaWNlcyBhcmUgdGhlIG1vc3QgbGlrZWx5IHRvIHZhcnkgYmV0d2VlbiBlbnZpcm9ubWVudHM6XG4gKiAgIEJJTExJTkdfUExBTl97VElFUn1fTU9OVEhMWSAvIEJJTExJTkdfUExBTl97VElFUn1fQU5OVUFMICAoaW4gY2VudHMpXG4gKlxuICogT3B0aW9uYWwgb3ZlcnJpZGVzIGZvciBkZXNjcmlwdGlvbnMgYW5kIGZlYXR1cmVzOlxuICogICBCSUxMSU5HX1BMQU5fe1RJRVJ9X05BTUUgICAgICAgICAgKHBsYWluIHN0cmluZywgZGlzcGxheSBuYW1lKVxuICogICBCSUxMSU5HX1BMQU5fe1RJRVJ9X0RFU0NSSVBUSU9OICAgKHBsYWluIHN0cmluZylcbiAqICAgQklMTElOR19QTEFOX3tUSUVSfV9GRUFUVVJFUyAgICAgIChKU09OIHN0cmluZyBhcnJheSlcbiAqXG4gKiBBbGwgZGVmYXVsdHMgbWF0Y2ggdGhlIG9yaWdpbmFsIGhhcmRjb2RlZCBzZWVkIGRhdGEuXG4gKi9cbmltcG9ydCB7IFFVT1RBX1RJRVJTLCBUSUVSX0ZFQVRVUkVTLCBGRUFUVVJFX01FVEFEQVRBLCBWQUxJRF9USUVSUywgU1RBTkRBUkRfVElFUlMsIGlzVmFsaWRUaWVyLCB0eXBlIFF1b3RhVGllciwgdHlwZSBRdW90YVRpZXJMaW1pdHMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IEJpbGxpbmdDb25maWcsIEJpbGxpbmdQbGFuQ29uZmlnLCBCdW5kbGVDb25maWcsIENvbWJvRGlzY291bnRDb25maWcgfSBmcm9tICcuL2NvbmZpZy10eXBlcy5qcyc7XG5cbi8qKiBQZXItdW5pdCBxdW90YSBkZWx0YXMgZm9yIGEgYnVuZGxlIOKAlCBrZXlzIGNvbnN0cmFpbmVkIHRvIHJlYWwgcXVvdGEgZmllbGRzXG4gKiAgKG1hdGNoZXMgYEJ1bmRsZUNvbmZpZy5ncmFudHNgKSwgc28gYSB0eXBvJ2QgZGltZW5zaW9uIGZhaWxzIHRvIGNvbXBpbGUuICovXG50eXBlIEdyYW50TWFwID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgUXVvdGFUaWVyTGltaXRzLCBudW1iZXI+PjtcblxuLy8gLS0gRGVmYXVsdCBmZWF0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBtYXJrZXRlZCBmZWF0dXJlIGxpc3QgaXMgYnVpbHQgZnJvbSB0d28gZGVyaXZlZCBzb3VyY2VzIHNvIGl0IGNhbiBuZXZlclxuLy8gZHJpZnQgZnJvbSB3aGF0IHRoZSBwbGF0Zm9ybSBhY3R1YWxseSBlbmZvcmNlczpcbi8vICAgMS4gTElNSVQgbGluZXMgZGVyaXZlZCBmcm9tIGVhY2ggdGllcidzIEVGRkVDVElWRSBxdW90YSBsaW1pdHMgKFFVT1RBX1RJRVJTKSxcbi8vICAgICAgc28gdGhleSB0cmFjayBRVU9UQV9USUVSXyogZW52IG92ZXJyaWRlcy5cbi8vICAgMi4gSU5DTFVERUQtRkVBVFVSRSBsaW5lcyBkZXJpdmVkIGZyb20gdGhlIGVuZm9yY2VkIGVudGl0bGVtZW50IHNldFxuLy8gICAgICAoVElFUl9GRUFUVVJFUykgdmlhIEZFQVRVUkVfTUVUQURBVEEgbGFiZWxzIOKAlCBzbyBhbiBhZHZlcnRpc2VkIGJhc2Vcbi8vICAgICAgZmVhdHVyZSBpcyBhbHdheXMgb25lIGByZXF1aXJlRmVhdHVyZWAgYWN0dWFsbHkgZ3JhbnRzIGZvciB0aGF0IHRpZXIuXG4vLyBPbmx5IGdlbnVpbmVseSBub24tZ2F0ZWQgbWFya2V0aW5nIGNvcHkgKHN1cHBvcnQgbGV2ZWwsIGRhc2hib2FyZHMsIFJCQUMpIGlzXG4vLyBoYW5kLWF1dGhvcmVkLCBwYXNzZWQgYXMgYHBlcmtzYC4gUHVyY2hhc2FibGUgYWRkLW9ucyAoc3NvLCBhdWRpdF9sb2cpIGFyZSBOT1Rcbi8vIGxpc3RlZCBhcyBiYXNlIHBlcmtzIGhlcmUg4oCUIHRoZXkgYXJlIHNvbGQgYXMgYnVuZGxlcyAoc2VlIGxvYWRCdW5kbGVzKCkpLlxuXG4vKiogXCJVcCB0byBOIHBsdWdpbnNcIiAvIFwiVW5saW1pdGVkIHBsdWdpbnNcIiBmcm9tIGFuIGVmZmVjdGl2ZSBsaW1pdCAoLTEgPSB1bmxpbWl0ZWQpLiAqL1xuZnVuY3Rpb24gbGltaXRMaW5lKGxpbWl0OiBudW1iZXIsIHNpbmd1bGFyOiBzdHJpbmcsIHBsdXJhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGxpbWl0ID09PSAtMSkgcmV0dXJuIGBVbmxpbWl0ZWQgJHtwbHVyYWx9YDtcbiAgcmV0dXJuIGBVcCB0byAke2xpbWl0LnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpfSAke2xpbWl0ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWx9YDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEZlYXR1cmVzKHRpZXI6IFF1b3RhVGllciwgcGVya3M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBsID0gUVVPVEFfVElFUlNbdGllcl0ubGltaXRzO1xuICByZXR1cm4gW1xuICAgIGxpbWl0TGluZShsLnNlYXRzLCAnc2VhdCcsICdzZWF0cycpLFxuICAgIGxpbWl0TGluZShsLnBsdWdpbnMsICdwbHVnaW4nLCAncGx1Z2lucycpLFxuICAgIGxpbWl0TGluZShsLnBpcGVsaW5lcywgJ3BpcGVsaW5lJywgJ3BpcGVsaW5lcycpLFxuICAgIGxpbWl0TGluZShsLmFwaUNhbGxzLCAnQVBJIGNhbGwnLCAnQVBJIGNhbGxzJyksXG4gICAgbGltaXRMaW5lKGwuYWlDYWxscywgJ0FJIGNhbGwnLCAnQUkgY2FsbHMnKSxcbiAgICAvLyBFbmZvcmNlZCBlbnRpdGxlbWVudHMg4oaSIGN1c3RvbWVyLWZhY2luZyBsYWJlbHMgKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpLlxuICAgIC4uLlRJRVJfRkVBVFVSRVNbdGllcl0ubWFwKChmKSA9PiBGRUFUVVJFX01FVEFEQVRBW2ZdLmxhYmVsKSxcbiAgICAuLi5wZXJrcyxcbiAgXTtcbn1cblxuLy8gTm90ZTogYHBlcmtzYCBhcmUgbm9uLWdhdGVkIG1hcmtldGluZyBsaW5lcyBvbmx5LiBFbmZvcmNlZCBmZWF0dXJlcyAoaW5jbC5cbi8vIFByaW9yaXR5IFN1cHBvcnQgZm9yIHByby90ZWFtL2VudGVycHJpc2UpIGNvbWUgZnJvbSBUSUVSX0ZFQVRVUkVTIGFib3ZlLlxuY29uc3QgREVGQVVMVF9ERVZFTE9QRVJfRkVBVFVSRVMgPSBkZWZhdWx0RmVhdHVyZXMoJ2RldmVsb3BlcicsIFsnQ29tbXVuaXR5IHN1cHBvcnQnXSk7XG5jb25zdCBERUZBVUxUX1BST19GRUFUVVJFUyA9IGRlZmF1bHRGZWF0dXJlcygncHJvJywgWydSZXBvcnRpbmcgZGFzaGJvYXJkJ10pO1xuY29uc3QgREVGQVVMVF9URUFNX0ZFQVRVUkVTID0gZGVmYXVsdEZlYXR1cmVzKCd0ZWFtJywgWydSQkFDICYgdGVhbSByb2xlcyddKTtcbmNvbnN0IERFRkFVTFRfRU5URVJQUklTRV9GRUFUVVJFUyA9IGRlZmF1bHRGZWF0dXJlcygnZW50ZXJwcmlzZScsIFtcbiAgJ1JCQUMgJiB0ZWFtIHJvbGVzJywgJ1JlcG9ydGluZyBkYXNoYm9hcmQnLFxuXSk7XG4vLyBVbmxpbWl0ZWQgaW5jbHVkZXMgZXZlcnkgZmVhdHVyZSAoVElFUl9GRUFUVVJFUy51bmxpbWl0ZWQgPSBhbGwpLlxuY29uc3QgREVGQVVMVF9VTkxJTUlURURfRkVBVFVSRVMgPSBkZWZhdWx0RmVhdHVyZXMoJ3VubGltaXRlZCcsIFtcbiAgJ1VubGltaXRlZCBldmVyeXRoaW5nJywgJ1JCQUMgJiB0ZWFtIHJvbGVzJywgJ1JlcG9ydGluZyBkYXNoYm9hcmQnLFxuXSk7XG5cbi8qKlxuICogUGFyc2UgYSBwcmljZSAoaW4gY2VudHMpIGZyb20gYW4gZW52IHZhciwgZmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0IHdoZW5cbiAqIHVuc2V0IE9SIG1hbGZvcm1lZC4gQSBOYU4gKGUuZy4gYEJJTExJTkdfUExBTl9QUk9fTU9OVEhMWT1hYmNgKSBtdXN0IG5ldmVyXG4gKiBmbG93IGludG8gdGhlIHJldHVybmVkIGNvbmZpZyBhcyBhIHByaWNlLlxuICovXG5mdW5jdGlvbiBlbnZDZW50cyhlbnZWYXI6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChlbnZWYXIgPT09IHVuZGVmaW5lZCB8fCBlbnZWYXIgPT09ICcnKSByZXR1cm4gZmFsbGJhY2s7XG4gIC8vIGBwYXJzZUludGAgaXMgdG9vIGxlbmllbnQgaGVyZTogJzQ5Ljk5J+KGkjQ5LCAnNDlhYmMn4oaSNDksICctMTAwJ+KGki0xMDAgd291bGQgYWxsXG4gIC8vIGZsb3cgdGhyb3VnaCBhcyBhIFwicHJpY2VcIi4gUmVxdWlyZSBhIGNsZWFuLCBub24tbmVnYXRpdmUgaW50ZWdlciAoY2VudHMpLFxuICAvLyBtYXRjaGluZyBgYXBwbHlHcmFudE92ZXJyaWRlYCdzIHJpZ29yIOKAlCBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2suXG4gIGNvbnN0IG4gPSBOdW1iZXIoZW52VmFyKTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAwID8gbiA6IGZhbGxiYWNrO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgSlNPTiBhcnJheSBmcm9tIGFuIGVudiB2YXIsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LlxuICovXG5mdW5jdGlvbiBwYXJzZUZlYXR1cmVzKGVudlZhcjogc3RyaW5nIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGlmICghZW52VmFyKSByZXR1cm4gZmFsbGJhY2s7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShlbnZWYXIpO1xuICAgIC8vIEFycmF5LW9mLXN0cmluZ3Mgb25seSDigJQgYSBKU09OIGFycmF5IG9mIG5vbi1zdHJpbmdzIChlLmcuIGBbMSwyXWApIG11c3Qgbm90XG4gICAgLy8gc2hpcCBudW1iZXJzIGFzIGZlYXR1cmUgbGFiZWxzLiBGaWx0ZXIgdG8gc3RyaW5ncyAobWlycm9ycyBhcHBseVRpZXJzT3ZlcnJpZGUpLlxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gZmFsbGJhY2s7XG4gICAgY29uc3Qgc3RyaW5ncyA9IHBhcnNlZC5maWx0ZXIoKHgpOiB4IGlzIHN0cmluZyA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpO1xuICAgIHJldHVybiBzdHJpbmdzLmxlbmd0aCA9PT0gcGFyc2VkLmxlbmd0aCA/IHN0cmluZ3MgOiBmYWxsYmFjaztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG59XG5cbi8qKlxuICogTG9hZCBiaWxsaW5nIHBsYW4gY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRCaWxsaW5nQ29uZmlnKCk6IEJpbGxpbmdDb25maWcge1xuICAvLyBLZXllZCBieSBRdW90YVRpZXIgc28gdGhlIGNvbXBpbGVyIGZvcmNlcyBhIHBsYW4gZm9yIEVWRVJZIHRpZXIg4oCUIGFkZGluZyBhXG4gIC8vIDV0aCBRdW90YVRpZXIgd2l0aG91dCBhIHBsYW4gaGVyZSBpcyBub3cgYSBjb21waWxlIGVycm9yICh3YXMgYSBoYW5kLWtlcHRcbiAgLy8gNC1lbGVtZW50IGFycmF5IHRoYXQgc2lsZW50bHkgc2hpcHBlZCBubyBwbGFuL3ByaWNlIGZvciBhIG5ldyB0aWVyKS4gVGhlXG4gIC8vIHB1YmxpYyBgY29uZmlnLnBsYW5zYCBzaGFwZSBzdGF5cyBhbiBhcnJheSwgZGVyaXZlZCBiZWxvdyBpbiBWQUxJRF9USUVSU1xuICAvLyBvcmRlciAoZGV2ZWxvcGVyLCBwcm8sIHRlYW0sIGVudGVycHJpc2UsIHVubGltaXRlZCkgdG8gcHJlc2VydmUgY29uc3VtZXIgb3JkZXJpbmcuXG4gIGNvbnN0IHBsYW5CeVRpZXI6IFJlY29yZDxRdW90YVRpZXIsIEJpbGxpbmdQbGFuQ29uZmlnPiA9IHtcbiAgICBkZXZlbG9wZXI6IHtcbiAgICAgIGlkOiAnZGV2ZWxvcGVyJyxcbiAgICAgIG5hbWU6IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9ERVZFTE9QRVJfTkFNRSB8fCAnRGV2ZWxvcGVyJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fREVWRUxPUEVSX0RFU0NSSVBUSU9OXG4gICAgICAgIHx8ICdGcmVlIHN0YXJ0ZXIgdGllciBmb3IgaW5kaXZpZHVhbCBkZXZlbG9wZXJzJyxcbiAgICAgIHRpZXI6ICdkZXZlbG9wZXInLFxuICAgICAgcHJpY2VzOiB7XG4gICAgICAgIG1vbnRobHk6IGVudkNlbnRzKHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9ERVZFTE9QRVJfTU9OVEhMWSwgMCksXG4gICAgICAgIGFubnVhbDogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0RFVkVMT1BFUl9BTk5VQUwsIDApLFxuICAgICAgfSxcbiAgICAgIGZlYXR1cmVzOiBwYXJzZUZlYXR1cmVzKFxuICAgICAgICBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fREVWRUxPUEVSX0ZFQVRVUkVTLFxuICAgICAgICBERUZBVUxUX0RFVkVMT1BFUl9GRUFUVVJFUyxcbiAgICAgICksXG4gICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICAgIHNvcnRPcmRlcjogMCxcbiAgICB9LFxuICAgIHBybzoge1xuICAgICAgaWQ6ICdwcm8nLFxuICAgICAgbmFtZTogcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1BST19OQU1FIHx8ICdQcm8nLFxuICAgICAgZGVzY3JpcHRpb246IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9QUk9fREVTQ1JJUFRJT05cbiAgICAgICAgfHwgJ0ZvciBpbmRpdmlkdWFsIHBvd2VyIHVzZXJzIGFuZCBwcm9kdWN0aW9uIHdvcmtsb2FkcycsXG4gICAgICB0aWVyOiAncHJvJyxcbiAgICAgIHByaWNlczoge1xuICAgICAgICBtb250aGx5OiBlbnZDZW50cyhwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fUFJPX01PTlRITFksIDM5MDApLFxuICAgICAgICBhbm51YWw6IGVudkNlbnRzKHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9QUk9fQU5OVUFMLCAzOTAwMCksXG4gICAgICB9LFxuICAgICAgZmVhdHVyZXM6IHBhcnNlRmVhdHVyZXMoXG4gICAgICAgIHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9QUk9fRkVBVFVSRVMsXG4gICAgICAgIERFRkFVTFRfUFJPX0ZFQVRVUkVTLFxuICAgICAgKSxcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIHNvcnRPcmRlcjogMSxcbiAgICB9LFxuICAgIHRlYW06IHtcbiAgICAgIGlkOiAndGVhbScsXG4gICAgICBuYW1lOiBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVEVBTV9OQU1FIHx8ICdUZWFtJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVEVBTV9ERVNDUklQVElPTlxuICAgICAgICB8fCAnRm9yIHRlYW1zIGNvbGxhYm9yYXRpbmcgb24gc2hhcmVkIHBpcGVsaW5lcycsXG4gICAgICB0aWVyOiAndGVhbScsXG4gICAgICBwcmljZXM6IHtcbiAgICAgICAgbW9udGhseTogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1RFQU1fTU9OVEhMWSwgNzkwMCksXG4gICAgICAgIGFubnVhbDogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1RFQU1fQU5OVUFMLCA3OTAwMCksXG4gICAgICB9LFxuICAgICAgZmVhdHVyZXM6IHBhcnNlRmVhdHVyZXMoXG4gICAgICAgIHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9URUFNX0ZFQVRVUkVTLFxuICAgICAgICBERUZBVUxUX1RFQU1fRkVBVFVSRVMsXG4gICAgICApLFxuICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgc29ydE9yZGVyOiAyLFxuICAgIH0sXG4gICAgZW50ZXJwcmlzZToge1xuICAgICAgaWQ6ICdlbnRlcnByaXNlJyxcbiAgICAgIG5hbWU6IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9FTlRFUlBSSVNFX05BTUUgfHwgJ0VudGVycHJpc2UnLFxuICAgICAgZGVzY3JpcHRpb246IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9FTlRFUlBSSVNFX0RFU0NSSVBUSU9OXG4gICAgICAgIHx8ICdPcmctd2lkZSBzY2FsZSB3aXRoIGEgaGlnaCBzZWF0IGJhc2VsaW5lIChleHBhbmRhYmxlIHZpYSBNZW1iZXIgU2VhdCBhZGQtb25zKSBhbmQgcHJpb3JpdHkgc3VwcG9ydCcsXG4gICAgICB0aWVyOiAnZW50ZXJwcmlzZScsXG4gICAgICBwcmljZXM6IHtcbiAgICAgICAgbW9udGhseTogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0VOVEVSUFJJU0VfTU9OVEhMWSwgNTk5MDApLFxuICAgICAgICBhbm51YWw6IGVudkNlbnRzKHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9FTlRFUlBSSVNFX0FOTlVBTCwgNTk5MDAwKSxcbiAgICAgIH0sXG4gICAgICBmZWF0dXJlczogcGFyc2VGZWF0dXJlcyhcbiAgICAgICAgcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0VOVEVSUFJJU0VfRkVBVFVSRVMsXG4gICAgICAgIERFRkFVTFRfRU5URVJQUklTRV9GRUFUVVJFUyxcbiAgICAgICksXG4gICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICBzb3J0T3JkZXI6IDMsXG4gICAgfSxcbiAgICAvLyBUaGUgYmlsbGluZy1ESVNBQkxFRCBkZWZhdWx0IHBsYW46IGV2ZXJ5dGhpbmcgdW5jYXBwZWQsIGFsbCBmZWF0dXJlcywgZnJlZS5cbiAgICAvLyBTZWVkZWQgc28gdGhlIHRpZXLihpJwbGFuIG1hcHBpbmcgcmVzb2x2ZXMsIGJ1dCBuZXZlciBvZmZlcmVkIGZvciBzYWxlIOKAlCB0aGVcbiAgICAvLyByZWFkLXBsYW5zIHJvdXRlIGZpbHRlcnMgaXQgb3V0IChzZWUgY3JlYXRlUmVhZFBsYW5Sb3V0ZXMpLCBzbyBpdCdzIGhpZGRlblxuICAgIC8vIHdoZW5ldmVyIGJpbGxpbmcgaXMgZW5hYmxlZCAodGhlIG9ubHkgdGltZSAvcGxhbnMgaXMgc2VydmVkKS5cbiAgICB1bmxpbWl0ZWQ6IHtcbiAgICAgIGlkOiAndW5saW1pdGVkJyxcbiAgICAgIG5hbWU6IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9VTkxJTUlURURfTkFNRSB8fCAnVW5saW1pdGVkJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVU5MSU1JVEVEX0RFU0NSSVBUSU9OXG4gICAgICAgIHx8ICdFdmVyeXRoaW5nIHVuY2FwcGVkIOKAlCB0aGUgZGVmYXVsdCB3aGVuIGJpbGxpbmcgaXMgZGlzYWJsZWQnLFxuICAgICAgdGllcjogJ3VubGltaXRlZCcsXG4gICAgICBwcmljZXM6IHtcbiAgICAgICAgbW9udGhseTogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1VOTElNSVRFRF9NT05USExZLCAwKSxcbiAgICAgICAgYW5udWFsOiBlbnZDZW50cyhwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVU5MSU1JVEVEX0FOTlVBTCwgMCksXG4gICAgICB9LFxuICAgICAgZmVhdHVyZXM6IHBhcnNlRmVhdHVyZXMoXG4gICAgICAgIHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9VTkxJTUlURURfRkVBVFVSRVMsXG4gICAgICAgIERFRkFVTFRfVU5MSU1JVEVEX0ZFQVRVUkVTLFxuICAgICAgKSxcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIHNvcnRPcmRlcjogNCxcbiAgICB9LFxuICB9O1xuXG4gIC8vIERlcml2ZSB0aGUgYXJyYXkgY29uc3VtZXJzIHJlYWQgKGBjb25maWcucGxhbnNgKSBpbiBjYW5vbmljYWwgdGllciBvcmRlci5cbiAgY29uc3QgcGxhbnM6IEJpbGxpbmdQbGFuQ29uZmlnW10gPSBWQUxJRF9USUVSUy5tYXAoKHRpZXIpID0+IHBsYW5CeVRpZXJbdGllcl0pO1xuXG4gIC8vIEJ1aWxkIGJ1bmRsZXMgT05DRSBhbmQgdGhyZWFkIHRoZW0gaW50byB0aGUgY29tYm8gbG9hZGVyICh3aGljaCBuZWVkcyB0aGVpclxuICAvLyBlbnYtZWZmZWN0aXZlIHByaWNlcykg4oCUIGF2b2lkcyBwYXJzaW5nIHRoZSB3aG9sZSBidW5kbGUgY2F0YWxvZyB0d2ljZSBwZXIgbG9hZC5cbiAgY29uc3QgYnVuZGxlcyA9IGxvYWRCdW5kbGVzKCk7XG4gIHJldHVybiB7IHBsYW5zLCBidW5kbGVzLCBjb21ib0Rpc2NvdW50czogbG9hZENvbWJvRGlzY291bnRzKGJ1bmRsZXMpIH07XG59XG5cbi8qKlxuICogQ29tYm8gZGlzY291bnRzIChkb2NzL2JpbGxpbmctYnVuZGxlcy5tZCDCp0NvbWJvIHByaWNpbmcpLiBXaGVuIGFuIGFjY291bnQgb3duc1xuICogZXZlcnkgbWVtYmVyIGJ1bmRsZSAoZWFjaCBhdCDiiaUgaXRzIG1pbmltdW0gcXVhbnRpdHkpLCB0aGUgc2V0IGlzIGJpbGxlZCBhdCB0aGVcbiAqIGNvbWJpbmVkIHByaWNlIGluc3RlYWQgb2YgdGhlIHN1bSBvZiB0aGUgbWVtYmVycyDigJQgcmVhbGl6ZWQgYXMgYSByZWN1cnJpbmcgdXNhZ2VcbiAqIGNyZWRpdCBmb3IgdGhlIGRpZmZlcmVuY2UuIE92ZXJsYXBwaW5nIGNvbWJvcyBhcmUgcmVzb2x2ZWQgYnkgbWF4LXdlaWdodCBwYWNraW5nXG4gKiAoYSBzaGFyZWQgYWRkLW9uIGlzIG5ldmVyIGRpc2NvdW50ZWQgdHdpY2UpOyBgc29ydE9yZGVyYCBicmVha3MgZXF1YWwtdG90YWwgdGllcy5cbiAqXG4gKiBEZWZhdWx0czpcbiAqICAtIFwiQW5hbHl0aWNzIFN1aXRlXCIg4oCUIEFkdmFuY2VkIFJlcG9ydGluZyAoRE9SQSkgKyBUZWFtIFVzYWdlIEFuYWx5dGljcywgZWFjaFxuICogICAgJDMwL21vLCB0b2dldGhlciAkNDIvbW8gKCQ0MjAveXIpIOKGkiBhICQxOC9tbyBjcmVkaXQgKH4zMCUgb2ZmKS5cbiAqICAtIFwiVGVhbSBHcm93dGggQnVuZGxlXCIg4oCUIOKJpTUgU2VhdHMgKCQxOS45OSBlYSkgKyBUZWFtIFVzYWdlIEFuYWx5dGljcyAoJDMwKSxcbiAqICAgIGJhc2tldCAkMTI5Ljk1L21vIOKGkiB0b2dldGhlciAkOTAuOTkvbW8gKCQ5MDkuOTAveXIpIOKGkiBhIH4kMzguOTYvbW8gY3JlZGl0ICh+MzAlIG9mZikuXG4gKiAgLSBcIlNjYWxlIEJ1bmRsZVwiIOKAlCBBUEkgUGFjayAoJDE5Ljk5KSArIFN0b3JhZ2UgUGFjayAoJDE5Ljk5KSwgYmFza2V0ICQzOS45OC9tb1xuICogICAg4oaSIHRvZ2V0aGVyICQyNy45OS9tbyAoJDI3OS45MC95cikg4oaSIGEgfiQxMS45OS9tbyBjcmVkaXQgKH4zMCUgb2ZmKS5cbiAqIFByaWNlcyBlbnYtb3ZlcnJpZGFibGUgdmlhIGBCSUxMSU5HX0NPTUJPXzxJRD5fTU9OVEhMWWAgLyBgX0FOTlVBTGAuXG4gKi9cbmZ1bmN0aW9uIGxvYWRDb21ib0Rpc2NvdW50cyhidW5kbGVzOiBCdW5kbGVDb25maWdbXSk6IENvbWJvRGlzY291bnRDb25maWdbXSB7XG4gIGNvbnN0IGMgPSAoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYnVuZGxlSWRzOiBzdHJpbmdbXSxcbiAgICBtb250aGx5OiBudW1iZXIsXG4gICAgYW5udWFsOiBudW1iZXIsXG4gICAgc29ydE9yZGVyOiBudW1iZXIsXG4gICAgbWluUXVhbnRpdGllcz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gICk6IENvbWJvRGlzY291bnRDb25maWcgPT4gKHtcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGJ1bmRsZUlkcyxcbiAgICAuLi4obWluUXVhbnRpdGllcyA/IHsgbWluUXVhbnRpdGllcyB9IDoge30pLFxuICAgIHByaWNlczoge1xuICAgICAgbW9udGhseTogZW52Q2VudHMocHJvY2Vzcy5lbnZbYEJJTExJTkdfQ09NQk9fJHtpZC50b1VwcGVyQ2FzZSgpfV9NT05USExZYF0sIG1vbnRobHkpLFxuICAgICAgYW5udWFsOiBlbnZDZW50cyhwcm9jZXNzLmVudltgQklMTElOR19DT01CT18ke2lkLnRvVXBwZXJDYXNlKCl9X0FOTlVBTGBdLCBhbm51YWwpLFxuICAgIH0sXG4gICAgc29ydE9yZGVyLFxuICAgIGlzQWN0aXZlOiB0cnVlLFxuICB9KTtcblxuICBjb25zdCBjb21ib3MgPSBbXG4gICAgYygnYW5hbHl0aWNzX3N1aXRlJywgJ0FuYWx5dGljcyBTdWl0ZScsIFsnYWR2YW5jZWRfcmVwb3J0aW5nJywgJ3RlYW1fdXNhZ2VfYW5hbHl0aWNzJ10sIDQyMDAsIDQyMDAwLCAwKSxcbiAgICAvLyBUZWFtIEdyb3d0aCDigJQg4omlNSBTZWF0cyAoJDE5Ljk5IGVhKSArIFRlYW0gVXNhZ2UgQW5hbHl0aWNzICgkMzApLiBCYXNrZXRcbiAgICAvLyA1w5ckMTkuOTkgKyAkMzAgPSAkMTI5Ljk1L21vIOKGkiBidW5kbGVkICQ5MC45OS9tbyAofjMwJSBvZmYsIH4kMzguOTYgY3JlZGl0KS5cbiAgICBjKCd0ZWFtX2dyb3d0aCcsICdUZWFtIEdyb3d0aCBCdW5kbGUnLCBbJ3NlYXQnLCAndGVhbV91c2FnZV9hbmFseXRpY3MnXSwgOTA5OSwgOTA5OTAsIDEsIHsgc2VhdDogNSB9KSxcbiAgICAvLyBDb21wbGlhbmNlIFN1aXRlIOKAlCBTdGFuZGFyZCArIEFkdmFuY2VkIGF0IDMwJSBvZmYgKCQ5MDguNjAveXIgdnMgJDEsMjk4IGxpc3QpLlxuICAgIGMoJ2NvbXBsaWFuY2Vfc3VpdGUnLCAnQ29tcGxpYW5jZSBTdWl0ZScsIFsnY29tcGxpYW5jZV9zdGFuZGFyZCcsICdjb21wbGlhbmNlX2FkdmFuY2VkJ10sIDkwODYsIDkwODYwLCAyKSxcbiAgICAvLyBTY2FsZSBCdW5kbGUg4oCUIEFQSSBQYWNrICgkMTkuOTkpICsgU3RvcmFnZSBQYWNrICgkMTkuOTkpLiBCYXNrZXQgJDM5Ljk4L21vIOKGklxuICAgIC8vIGJ1bmRsZWQgJDI3Ljk5L21vICh+MzAlIG9mZiwgfiQxMS45OSBjcmVkaXQpLiBCb3RoIG1lbWJlcnMgYWxsLXRpZXIuXG4gICAgYygnc2NhbGVfYnVuZGxlJywgJ1NjYWxlIEJ1bmRsZScsIFsnYXBpX3BhY2snLCAnc3RvcmFnZV9wYWNrJ10sIDI3OTksIDI3OTkwLCAzKSxcbiAgXTtcbiAgYXNzZXJ0Q29tYm9zVmFsaWQoY29tYm9zLCBidW5kbGVzKTtcbiAgd2Fybk9uTm9uRGlzY291bnRDb21ib3MoY29tYm9zLCBidW5kbGVzKTtcbiAgcmV0dXJuIGNvbWJvcztcbn1cblxuLyoqXG4gKiBDb25maWctbG9hZCBndWFyZHJhaWwgZm9yIGNvbWJvczogZXZlcnkgYGJ1bmRsZUlkYCBtdXN0IHJlc29sdmUgdG8gYW4gQUNUSVZFXG4gKiBidW5kbGUgYW5kIGV2ZXJ5IGBtaW5RdWFudGl0aWVzYCBrZXkgbXVzdCBiZSBvbmUgb2YgdGhlIGNvbWJvJ3MgYGJ1bmRsZUlkc2AuXG4gKiBBIHR5cG8nZCBtZW1iZXIgb3Igc3RyYXkgbWluUXVhbnRpdHkga2V5IG90aGVyd2lzZSBzaGlwcyBhIHBlcm1hbmVudGx5LWluZXJ0XG4gKiBjb21ibyAobWlzc2luZyBidW5kbGUgdHJlYXRlZCBhcyB1bml0IHByaWNlIDAsIG9yIGEgbWluIG5ldmVyIHNhdGlzZmlhYmxlKSxcbiAqIHNpbGVudGx5IG5ldmVyIGFwcGx5aW5nLiBUaHJvd3Mgc28gbWlzY29uZmlnIGZhaWxzIGZhc3QgYXQgYm9vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENvbWJvc1ZhbGlkKGNvbWJvczogQ29tYm9EaXNjb3VudENvbmZpZ1tdLCBidW5kbGVzOiBCdW5kbGVDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBhY3RpdmVJZHMgPSBuZXcgU2V0KGJ1bmRsZXMuZmlsdGVyKChiKSA9PiBiLmlzQWN0aXZlKS5tYXAoKGIpID0+IGIuaWQpKTtcbiAgZm9yIChjb25zdCBjb21ibyBvZiBjb21ib3MpIHtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGNvbWJvLmJ1bmRsZUlkcykge1xuICAgICAgaWYgKCFhY3RpdmVJZHMuaGFzKGlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbWJvIFwiJHtjb21iby5pZH1cIiByZWZlcmVuY2VzIGJ1bmRsZSBcIiR7aWR9XCIsIHdoaWNoIGlzIG5vdCBhbiBhY3RpdmUgYnVuZGxlLmApO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb21iby5taW5RdWFudGl0aWVzID8/IHt9KSkge1xuICAgICAgaWYgKCFjb21iby5idW5kbGVJZHMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbWJvIFwiJHtjb21iby5pZH1cIiBtaW5RdWFudGl0aWVzIGtleSBcIiR7a2V5fVwiIGlzIG5vdCBvbmUgb2YgaXRzIGJ1bmRsZUlkcy5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqIFRoZSB2b2x1bWUtZGlzY291bnQgcGVyY2VudCBhcHBseWluZyB0byBgcXVhbnRpdHlgIHVuaXRzIG9mIGEgYnVuZGxlIOKAlCB0aGVcbiAqICBoaWdoZXN0IGB2b2x1bWVUaWVyc2AgZW50cnkgd2hvc2UgYG1pblF1YW50aXR5IOKJpCBxdWFudGl0eWAsIGVsc2UgMC4gTWlycm9yc1xuICogIGB2b2x1bWVEaXNjb3VudFBjdGAgaW4gYXBpL2JpbGxpbmcncyBjb21iby1wcmljaW5nICh3aGljaCBjYW4ndCBiZSBpbXBvcnRlZCB0aGVcbiAqICBvdGhlciB3YXkpOyB0aGUgY29tYm8gY3JlZGl0IG1hdGggYW5kIHRoaXMgZ3VhcmRyYWlsIE1VU1QgdXNlIHRoZSBzYW1lIGJhc2lzLiAqL1xuZnVuY3Rpb24gdm9sdW1lRGlzY291bnRQY3RBdChidW5kbGU6IEJ1bmRsZUNvbmZpZyB8IHVuZGVmaW5lZCwgcXVhbnRpdHk6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBwY3QgPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgYnVuZGxlPy52b2x1bWVUaWVycyA/PyBbXSkgaWYgKHF1YW50aXR5ID49IHQubWluUXVhbnRpdHkpIHBjdCA9IHQuZGlzY291bnRQZXJjZW50O1xuICByZXR1cm4gcGN0O1xufVxuXG4vKipcbiAqIEd1YXJkcmFpbDogYSBjb21ibyB3aG9zZSBjb21iaW5lZCBwcmljZSBpcyDiiaUgaXRzIG1pbmltdW0tY29tcG9zaXRpb24gYmFza2V0IGdyYW50c1xuICogbm8gY3JlZGl0ICh0aGUgY3JlZGl0IGNsYW1wcyB0byAkMCkgYW5kIGlzIHNpbGVudGx5IGluZXJ0LiBXYXJuIGxvdWRseSBpbnN0ZWFkIHNvIGFcbiAqIG1pc2NvbmZpZ3VyZWQgYEJJTExJTkdfQ09NQk9fKmAgb3ZlcnJpZGUgaXMgY2F1Z2h0LiBOb24tZmF0YWwuXG4gKi9cbmZ1bmN0aW9uIHdhcm5Pbk5vbkRpc2NvdW50Q29tYm9zKGNvbWJvczogQ29tYm9EaXNjb3VudENvbmZpZ1tdLCBidW5kbGVzOiBCdW5kbGVDb25maWdbXSk6IHZvaWQge1xuICAvLyBDb21ibyBtZW1iZXJzIGFyZSBhbHdheXMgYnVuZGxlczsgcmVzb2x2ZSB0aGVpciAoZW52LWVmZmVjdGl2ZSkgdW5pdCBwcmljZXMgb25jZS5cbiAgY29uc3QgYnlJZCA9IG5ldyBNYXAoYnVuZGxlcy5tYXAoKGIpID0+IFtiLmlkLCBiXSkpO1xuICBmb3IgKGNvbnN0IGNvbWJvIG9mIGNvbWJvcykge1xuICAgIGZvciAoY29uc3QgaW50ZXJ2YWwgb2YgWydtb250aGx5JywgJ2FubnVhbCddIGFzIGNvbnN0KSB7XG4gICAgICAvLyBQb3N0LXZvbHVtZSBiYXNpcyAobWlycm9ycyBgY29tYm9CYXNpc0NlbnRzYCk6IGEgbWVtYmVyIHdpdGggdm9sdW1lIHRpZXJzIGlzXG4gICAgICAvLyBiYXNpc2VkIG9uIGl0cyBESVNDT1VOVEVEIHVuaXQgYXQgdGhlIGNvbWJvJ3MgbWluUXR5LCBzbyB0aGlzIGd1YXJkcmFpbCBjYW4ndFxuICAgICAgLy8gc2lsZW50bHkgbWlzcyBhIGNvbWJvIHRoYXQgZ3JhbnRzIG5vIHJlYWwgY3JlZGl0IG9uY2Ugdm9sdW1lIGlzIGFwcGxpZWQuXG4gICAgICBjb25zdCBiYXNrZXQgPSBjb21iby5idW5kbGVJZHMucmVkdWNlKChzLCBpZCkgPT4ge1xuICAgICAgICBjb25zdCBiID0gYnlJZC5nZXQoaWQpO1xuICAgICAgICBjb25zdCBxdHkgPSBjb21iby5taW5RdWFudGl0aWVzPy5baWRdID8/IDE7XG4gICAgICAgIGNvbnN0IHJhd1VuaXQgPSBiPy5wcmljZXNbaW50ZXJ2YWxdID8/IDA7XG4gICAgICAgIGNvbnN0IHVuaXQgPSBNYXRoLnJvdW5kKChyYXdVbml0ICogKDEwMCAtIHZvbHVtZURpc2NvdW50UGN0QXQoYiwgcXR5KSkpIC8gMTAwKTtcbiAgICAgICAgcmV0dXJuIHMgKyB1bml0ICogcXR5O1xuICAgICAgfSwgMCk7XG4gICAgICBpZiAoY29tYm8ucHJpY2VzW2ludGVydmFsXSA+PSBiYXNrZXQpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKGBbYmlsbGluZy1jb25maWddIENvbWJvIFwiJHtjb21iby5pZH1cIiAke2ludGVydmFsfSBwcmljZSAke2NvbWJvLnByaWNlc1tpbnRlcnZhbF19IOKJpSBtZW1iZXIgYmFza2V0ICR7YmFza2V0fTsgaXQgZ3JhbnRzIG5vIGRpc2NvdW50LmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBCVU5ETEVfR0IgPSAxMDI0ICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogQXBwbHkgYSBwZXItYnVuZGxlIGdyYW50IG92ZXJyaWRlLiBFYWNoIHN0YWNrYWJsZSBwYWNrIGdyYW50cyBleGFjdGx5IG9uZVxuICogcXVvdGEgZGltZW5zaW9uLCBzbyBgQklMTElOR19CVU5ETEVfPElEPl9HUkFOVGAgcmV0dW5lcyB0aGF0IGFtb3VudCAoZS5nLiBtYWtlXG4gKiB0aGUgUGx1Z2luIFBhY2sgZ3JhbnQgKzUwIGluc3RlYWQgb2YgKzI1KSDigJQgcGFyYWxsZWwgdG8gdGhlIHByaWNlIG92ZXJyaWRlcy5cbiAqIElnbm9yZWQgZm9yIG11bHRpLWRpbWVuc2lvbiBvciBmZWF0dXJlLW9ubHkgKGVtcHR5LWdyYW50KSBidW5kbGVzLCBhbmQgZm9yIGFcbiAqIG1hbGZvcm1lZC9uZWdhdGl2ZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlHcmFudE92ZXJyaWRlKGlkOiBzdHJpbmcsIGdyYW50czogR3JhbnRNYXApOiBHcmFudE1hcCB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W2BCSUxMSU5HX0JVTkRMRV8ke2lkLnRvVXBwZXJDYXNlKCl9X0dSQU5UYF07XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhncmFudHMpO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJyB8fCBrZXlzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGdyYW50cztcbiAgY29uc3QgbiA9IHBhcnNlSW50KHJhdywgMTApO1xuICBpZiAoTnVtYmVyLmlzTmFOKG4pIHx8IG4gPCAwKSByZXR1cm4gZ3JhbnRzO1xuICAvLyBga2V5c2AgY2FtZSBmcm9tIGEgR3JhbnRNYXAsIHNvIGl0cyBzb2xlIGtleSBpcyBhIFF1b3RhVGllckxpbWl0cyBmaWVsZC5cbiAgcmV0dXJuIHsgW2tleXNbMF0gYXMga2V5b2YgUXVvdGFUaWVyTGltaXRzXTogbiB9O1xufVxuXG4vKipcbiAqIEFwcGx5IGEgcGVyLWJ1bmRsZSB0aWVyLWF2YWlsYWJpbGl0eSBvdmVycmlkZS4gYEJJTExJTkdfQlVORExFXzxJRD5fVElFUlNgIGlzIGFcbiAqIEpTT04gYXJyYXkgb2YgdGllciBJRHMgdGhhdCBtYXkgcHVyY2hhc2UgdGhlIGJ1bmRsZSAoZS5nLiBgW1wiZGV2ZWxvcGVyXCIsXCJwcm9cIl1gKVxuICog4oCUIHBhcmFsbGVsIHRvIHRoZSBwcmljZS9ncmFudCBvdmVycmlkZXMuIEZhbGxzIGJhY2sgdG8gYGRlZmF1bHRUaWVyc2Agd2hlblxuICogdW5zZXQsIG1hbGZvcm1lZCwgZW1wdHksIG9yIGNvbnRhaW5pbmcgYW4gdW5rbm93biB0aWVyLlxuICovXG5mdW5jdGlvbiBhcHBseVRpZXJzT3ZlcnJpZGUoaWQ6IHN0cmluZywgZGVmYXVsdFRpZXJzOiBRdW90YVRpZXJbXSk6IFF1b3RhVGllcltdIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnZbYEJJTExJTkdfQlVORExFXyR7aWQudG9VcHBlckNhc2UoKX1fVElFUlNgXTtcbiAgaWYgKCFyYXcpIHJldHVybiBkZWZhdWx0VGllcnM7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQpIHx8IHBhcnNlZC5sZW5ndGggPT09IDApIHJldHVybiBkZWZhdWx0VGllcnM7XG4gICAgY29uc3QgdmFsaWQgPSBwYXJzZWQuZmlsdGVyKCh0KTogdCBpcyBRdW90YVRpZXIgPT4gdHlwZW9mIHQgPT09ICdzdHJpbmcnICYmIGlzVmFsaWRUaWVyKHQpKTtcbiAgICByZXR1cm4gdmFsaWQubGVuZ3RoID09PSBwYXJzZWQubGVuZ3RoID8gdmFsaWQgOiBkZWZhdWx0VGllcnM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBkZWZhdWx0VGllcnM7XG4gIH1cbn1cblxudHlwZSBWb2x1bWVUaWVyID0geyBtaW5RdWFudGl0eTogbnVtYmVyOyBkaXNjb3VudFBlcmNlbnQ6IG51bWJlciB9O1xuXG4vKipcbiAqIEFwcGx5IGEgcGVyLWJ1bmRsZSB2b2x1bWUtdGllciBvdmVycmlkZS4gYEJJTExJTkdfQlVORExFXzxJRD5fVk9MVU1FX1RJRVJTYCBpcyBhXG4gKiBKU09OIGFycmF5IG9mIGB7IG1pblF1YW50aXR5LCBkaXNjb3VudFBlcmNlbnQgfWAgKGUuZy5cbiAqIGBbe1wibWluUXVhbnRpdHlcIjo1LFwiZGlzY291bnRQZXJjZW50XCI6MTB9XWApIOKAlCBwYXJhbGxlbCB0byB0aGUgcHJpY2UvZ3JhbnQvdGllclxuICogb3ZlcnJpZGVzLiBGYWxscyBiYWNrIHRvIGBkZWZhdWx0VGllcnNgIHdoZW4gdW5zZXQsIG1hbGZvcm1lZCwgb3IgY29udGFpbmluZyBhblxuICogaW52YWxpZCBlbnRyeSAobWluUXVhbnRpdHkg4omlIDEsIDAgPCBkaXNjb3VudFBlcmNlbnQg4omkIDEwMCkuIFNvcnRlZCBhc2NlbmRpbmcgYnlcbiAqIG1pblF1YW50aXR5IHNvIHRoZSBcImhpZ2hlc3QgbWF0Y2hpbmcgdGllciB3aW5zXCIgbG9va3VwIGlzIGRldGVybWluaXN0aWMuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5Vm9sdW1lVGllcnNPdmVycmlkZShpZDogc3RyaW5nLCBkZWZhdWx0VGllcnM/OiBWb2x1bWVUaWVyW10pOiBWb2x1bWVUaWVyW10gfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudltgQklMTElOR19CVU5ETEVfJHtpZC50b1VwcGVyQ2FzZSgpfV9WT0xVTUVfVElFUlNgXTtcbiAgY29uc3Qgc29ydEFzYyA9ICh0OiBWb2x1bWVUaWVyW10pID0+IFsuLi50XS5zb3J0KChhLCBiKSA9PiBhLm1pblF1YW50aXR5IC0gYi5taW5RdWFudGl0eSk7XG4gIGNvbnN0IGZhbGxiYWNrID0gKCkgPT4gKGRlZmF1bHRUaWVycyA/IHNvcnRBc2MoZGVmYXVsdFRpZXJzKSA6IHVuZGVmaW5lZCk7XG4gIGlmICghcmF3KSByZXR1cm4gZmFsbGJhY2soKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZCkgfHwgcGFyc2VkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgLy8gRWFjaCBlbnRyeTogaW50ZWdlciBtaW5RdWFudGl0eSDiiaUgMSwgMCA8IGRpc2NvdW50UGVyY2VudCDiiaQgMTAwLlxuICAgIGNvbnN0IHZhbGlkID0gcGFyc2VkLmZpbHRlcigodCk6IHQgaXMgVm9sdW1lVGllciA9PlxuICAgICAgdCAmJiB0eXBlb2YgdC5taW5RdWFudGl0eSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcih0Lm1pblF1YW50aXR5KSAmJiB0Lm1pblF1YW50aXR5ID49IDFcbiAgICAgICYmIHR5cGVvZiB0LmRpc2NvdW50UGVyY2VudCA9PT0gJ251bWJlcicgJiYgdC5kaXNjb3VudFBlcmNlbnQgPiAwICYmIHQuZGlzY291bnRQZXJjZW50IDw9IDEwMCk7XG4gICAgaWYgKHZhbGlkLmxlbmd0aCAhPT0gcGFyc2VkLmxlbmd0aCkgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgY29uc3Qgc29ydGVkID0gc29ydEFzYyh2YWxpZCk7XG4gICAgLy8gUmVqZWN0IGEgbm9uLW1vbm90b25pYyBjdXJ2ZTogYnV5aW5nIE1PUkUgbXVzdCBuZXZlciBlYXJuIGEgU01BTExFUiBkaXNjb3VudCxcbiAgICAvLyBhbmQgZHVwbGljYXRlIHRocmVzaG9sZHMgYXJlIGFtYmlndW91cy4gKGB2b2x1bWVEaXNjb3VudFBjdGAgcGlja3MgdGhlIGxhc3RcbiAgICAvLyBxdWFsaWZ5aW5nIHRpZXIsIHNvIGEgZGVzY2VuZGluZyBwZXJjZW50IHdvdWxkIHBlbmFsaXplIGhpZ2hlciBxdWFudGl0aWVzLilcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNvcnRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHNvcnRlZFtpXS5taW5RdWFudGl0eSA9PT0gc29ydGVkW2kgLSAxXS5taW5RdWFudGl0eSkgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICBpZiAoc29ydGVkW2ldLmRpc2NvdW50UGVyY2VudCA8PSBzb3J0ZWRbaSAtIDFdLmRpc2NvdW50UGVyY2VudCkgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3J0ZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxsYmFjaygpO1xuICB9XG59XG5cbi8qKlxuICogUHVyY2hhc2FibGUgYWRkLW9uIGJ1bmRsZXMgKGRvY3MvYmlsbGluZy1idW5kbGVzLm1kIMKnMykuIEdyYW50cyBhcmUgcGVyLXVuaXRcbiAqIGRlbHRhcyBvbiBRdW90YVRpZXJMaW1pdHM7IHByaWNlcyAoY2VudHMsIGBCSUxMSU5HX0JVTkRMRV88SUQ+X01PTlRITFlgIC9cbiAqIGBfQU5OVUFMYCksIHRoZSBzaW5nbGUtZGltZW5zaW9uIGdyYW50IGFtb3VudCAoYEJJTExJTkdfQlVORExFXzxJRD5fR1JBTlRgKSxcbiAqIGFuZCB0aGUgcHVyY2hhc2FibGUtdGllciBsaXN0IChgQklMTElOR19CVU5ETEVfPElEPl9USUVSU2ApIGFyZSBhbGxcbiAqIGVudi1vdmVycmlkYWJsZS4gQW5udWFsIOKJiCAxMMOXIG1vbnRobHkuXG4gKi9cbmZ1bmN0aW9uIGxvYWRCdW5kbGVzKCk6IEJ1bmRsZUNvbmZpZ1tdIHtcbiAgY29uc3QgYiA9IChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIGdyYW50czogR3JhbnRNYXAsXG4gICAgbW9udGhseTogbnVtYmVyLFxuICAgIGF2YWlsYWJsZUZvclRpZXJzOiBRdW90YVRpZXJbXSxcbiAgICBzb3J0T3JkZXI6IG51bWJlcixcbiAgICBleHRyYTogeyBmZWF0dXJlcz86IHN0cmluZ1tdOyBzdGFja2FibGU/OiBib29sZWFuOyBtYXhRdWFudGl0eT86IG51bWJlcjsgcmVxdWlyZXM/OiBzdHJpbmdbXTsgdm9sdW1lVGllcnM/OiBWb2x1bWVUaWVyW10gfSA9IHt9LFxuICApOiBCdW5kbGVDb25maWcgPT4ge1xuICAgIC8vIFJlc29sdmUgbW9udGhseSBmaXJzdCBzbyB0aGUgYW5udWFsIGZhbGxiYWNrIHRyYWNrcyBhIGBfTU9OVEhMWWAgb3ZlcnJpZGVcbiAgICAvLyAoYW5udWFsIOKJiCAxMMOXIHRoZSAqZWZmZWN0aXZlKiBtb250aGx5LCBub3QgdGhlIGhhcmRjb2RlZCBkZWZhdWx0KS5cbiAgICBjb25zdCByZXNvbHZlZE1vbnRobHkgPSBlbnZDZW50cyhwcm9jZXNzLmVudltgQklMTElOR19CVU5ETEVfJHtpZC50b1VwcGVyQ2FzZSgpfV9NT05USExZYF0sIG1vbnRobHkpO1xuICAgIGNvbnN0IHZvbHVtZVRpZXJzID0gYXBwbHlWb2x1bWVUaWVyc092ZXJyaWRlKGlkLCBleHRyYS52b2x1bWVUaWVycyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgZ3JhbnRzOiBhcHBseUdyYW50T3ZlcnJpZGUoaWQsIGdyYW50cyksXG4gICAgICAuLi4oZXh0cmEuZmVhdHVyZXMgPyB7IGZlYXR1cmVzOiBleHRyYS5mZWF0dXJlcyB9IDoge30pLFxuICAgICAgLi4uKGV4dHJhLm1heFF1YW50aXR5ICE9PSB1bmRlZmluZWQgPyB7IG1heFF1YW50aXR5OiBleHRyYS5tYXhRdWFudGl0eSB9IDoge30pLFxuICAgICAgLi4uKGV4dHJhLnJlcXVpcmVzID8geyByZXF1aXJlczogZXh0cmEucmVxdWlyZXMgfSA6IHt9KSxcbiAgICAgIC4uLih2b2x1bWVUaWVycyA/IHsgdm9sdW1lVGllcnMgfSA6IHt9KSxcbiAgICAgIHByaWNlczoge1xuICAgICAgICBtb250aGx5OiByZXNvbHZlZE1vbnRobHksXG4gICAgICAgIGFubnVhbDogZW52Q2VudHMocHJvY2Vzcy5lbnZbYEJJTExJTkdfQlVORExFXyR7aWQudG9VcHBlckNhc2UoKX1fQU5OVUFMYF0sIHJlc29sdmVkTW9udGhseSAqIDEwKSxcbiAgICAgIH0sXG4gICAgICBzdGFja2FibGU6IGV4dHJhLnN0YWNrYWJsZSA/PyB0cnVlLFxuICAgICAgYXZhaWxhYmxlRm9yVGllcnM6IGFwcGx5VGllcnNPdmVycmlkZShpZCwgYXZhaWxhYmxlRm9yVGllcnMpLFxuICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICBzb3J0T3JkZXIsXG4gICAgfTtcbiAgfTtcblxuICAvLyBCdW5kbGVzIGFyZSBwdXJjaGFzYWJsZSBvbiBldmVyeSBTRUxFQ1RBQkxFIHRpZXIgKGV4Y2x1ZGVzIGB1bmxpbWl0ZWRgLCB3aGljaFxuICAvLyBpcyB0aGUgYmlsbGluZy1vZmYgdGllciBhbmQgYnV5cyBub3RoaW5nKSDigJQgc28gdGhpcyBpcyBleGFjdGx5IFNUQU5EQVJEX1RJRVJTLlxuICBjb25zdCBBTEw6IFF1b3RhVGllcltdID0gWy4uLlNUQU5EQVJEX1RJRVJTXTtcbiAgY29uc3QgYnVuZGxlczogQnVuZGxlQ29uZmlnW10gPSBbXG4gICAgLy8gYHNlYXRgIGFuZCBgcGlwZWxpbmVfcGFja2AgYXJlIHRoZSB0aWVyIGRpZmZlcmVudGlhdG9ycywgc28gYm90aCBhcmUgVGVhbStcbiAgICAvLyBPTkxZIOKAlCBhIHNpbmdsZS1zZWF0IERldmVsb3Blci9Qcm8gY2FuJ3QgY2hlYXBseSBzdGFjayBzZWF0cy9waXBlbGluZXMgdG9cbiAgICAvLyB1bmRlcmN1dCBUZWFtICgzIHNlYXRzIC8gNiBwaXBlbGluZXMpOyB0aGV5IG11c3QgdXBncmFkZS4gYHNlYXRgIGlzIGdyYW51bGFyXG4gICAgLy8gKHBlci1zZWF0KSB3aXRoIHZvbHVtZSB0aWVycyAoNS8xNS80MCDihpIgMTAvMjAvMzAlKS4gVGhlIG90aGVyIGNhcGFjaXR5IHBhY2tzXG4gICAgLy8gKHBsdWdpbi9hcGkvYWkvc3RvcmFnZSkgYXJlIE5PVCBkaWZmZXJlbnRpYXRvcnMsIHNvIHRoZXkgc3RheSBhbGwtdGllci5cbiAgICBiKCdzZWF0JywgJ01lbWJlciBTZWF0JywgJzEgYWRkaXRpb25hbCBtZW1iZXIgc2VhdCcsIHsgc2VhdHM6IDEgfSwgMTk5OSwgWyd0ZWFtJywgJ2VudGVycHJpc2UnXSwgMCxcbiAgICAgIHsgdm9sdW1lVGllcnM6IFt7IG1pblF1YW50aXR5OiA1LCBkaXNjb3VudFBlcmNlbnQ6IDEwIH0sIHsgbWluUXVhbnRpdHk6IDE1LCBkaXNjb3VudFBlcmNlbnQ6IDIwIH0sIHsgbWluUXVhbnRpdHk6IDQwLCBkaXNjb3VudFBlcmNlbnQ6IDMwIH1dIH0pLFxuICAgIGIoJ3BpcGVsaW5lX3BhY2snLCAnUGlwZWxpbmUgUGFjayAoKzUpJywgJzUgYWRkaXRpb25hbCBwaXBlbGluZXMnLCB7IHBpcGVsaW5lczogNSB9LCAxNTAwLCBbJ3RlYW0nLCAnZW50ZXJwcmlzZSddLCAxKSxcbiAgICBiKCdwbHVnaW5fcGFjaycsICdQbHVnaW4gUGFjayAoKzI1KScsICcyNSBhZGRpdGlvbmFsIHBsdWdpbnMnLCB7IHBsdWdpbnM6IDI1IH0sIDEwMDAsIEFMTCwgMiksXG4gICAgYignYXBpX3BhY2snLCAnQVBJIFBhY2sgKCsxMDBrKScsICcxMDAsMDAwIGFkZGl0aW9uYWwgQVBJIGNhbGxzIC8gcGVyaW9kJywgeyBhcGlDYWxsczogMTAwXzAwMCB9LCAxOTk5LCBBTEwsIDMpLFxuICAgIGIoJ2FpX3BhY2snLCAnQUkgUGFjayAoKzIuNWspJywgJzIsNTAwIGFkZGl0aW9uYWwgQUkgY2FsbHMgLyBwZXJpb2QnLCB7IGFpQ2FsbHM6IDI1MDAgfSwgMTk5OSwgQUxMLCA0KSxcbiAgICBiKCdzdG9yYWdlX3BhY2snLCAnU3RvcmFnZSBQYWNrICgrMTAgR0IpJywgJzEwIEdCIGFkZGl0aW9uYWwgcmVnaXN0cnkgc3RvcmFnZScsIHsgc3RvcmFnZUJ5dGVzOiAxMCAqIEJVTkRMRV9HQiB9LCAxOTk5LCBBTEwsIDUpLFxuICAgIGIoJ2F1ZGl0X2xvZycsICdBdWRpdCBMb2cnLCAnQXVkaXQgbG9nIGNhcGFiaWxpdHknLCB7fSwgMjAwMCwgWydwcm8nXSwgNiwgeyBmZWF0dXJlczogWydhdWRpdF9sb2cnXSwgc3RhY2thYmxlOiBmYWxzZSB9KSxcbiAgICAvLyBTU08gaXMgSU5DTFVERUQgaW4gVGVhbSAoc2VlIFRJRVJfRkVBVFVSRVMudGVhbSksIHNvIHRoZSBhZGQtb24gaXMgUHJvLW9ubHkuXG4gICAgYignc3NvJywgJ1NTTyAvIElkUCcsICdTU08gKyB1cCB0byA1IElkUCBjb25maWdzJywgeyBpZHBDb25maWdzOiA1IH0sIDQwMDAsIFsncHJvJ10sIDcsIHsgZmVhdHVyZXM6IFsnc3NvJ10sIHN0YWNrYWJsZTogZmFsc2UgfSksXG4gICAgLy8gRE9SQSAvIGFkdmFuY2VkIGRlbGl2ZXJ5IGFuYWx5dGljcy4gSU5DTFVERUQgaW4gRW50ZXJwcmlzZSAoVElFUl9GRUFUVVJFUyksXG4gICAgLy8gc28gdGhlIGFkZC1vbiBpcyBvZmZlcmVkIHRvIGV2ZXJ5IG90aGVyIHRpZXIgKGRldmVsb3Blci9wcm8vdGVhbSkuIFByaWNlZFxuICAgIC8vIGJldHdlZW4gQXVkaXQgTG9nICgkMjApIGFuZCBTU08gKCQ0MCkg4oCUIGEgaGlnaGVyLXZhbHVlLCBhY3RpdmVseS11c2VkXG4gICAgLy8gYW5hbHl0aWNzIHN1cmZhY2UgdGhhbiB0aGUgYXVkaXQgbG9nLCBidXQgYmVsb3cgdGhlIFNTTyBlbnRlcnByaXNlIGdhdGUuXG4gICAgYignYWR2YW5jZWRfcmVwb3J0aW5nJywgJ0FkdmFuY2VkIFJlcG9ydGluZyAoRE9SQSknLCAnRE9SQSBkZWxpdmVyeSBtZXRyaWNzIOKAlCBkZXBsb3ltZW50IGZyZXF1ZW5jeSwgY2hhbmdlIGZhaWx1cmUgcmF0ZSwgTVRUUiwgbGVhZC10aW1lIHByb3h5LCBwZXJmb3JtYW5jZSBiYW5kcyArIHRyZW5kJywge30sIDMwMDAsIFsnZGV2ZWxvcGVyJywgJ3BybycsICd0ZWFtJ10sIDgsIHsgZmVhdHVyZXM6IFsnYWR2YW5jZWRfcmVwb3J0aW5nJ10sIHN0YWNrYWJsZTogZmFsc2UgfSksXG4gICAgLy8gUGVyLXRlYW0gdXNhZ2UgYnJlYWtkb3duIGFjcm9zcyB0aGUgb3JnIOKGkiB0ZWFtIHN1YnRyZWUuIElOQ0xVREVEIGluXG4gICAgLy8gRW50ZXJwcmlzZSAoVElFUl9GRUFUVVJFUyk7IHRoZSBhZGQtb24gaXMgb2ZmZXJlZCB0byBQcm8vVGVhbSAoZGV2ZWxvcGVyIGhhc1xuICAgIC8vIG5vIHRlYW1zIHRvIGJyZWFrIGRvd24pLiBQcmljZWQgYXQgJDMwL21vICgkMzAwL3lyKSDigJQgcGFyaXR5IHdpdGggRE9SQSwgaXRzXG4gICAgLy8gYW5hbHl0aWNzIHNpYmxpbmcuIE92ZXJyaWRhYmxlIHZpYSBCSUxMSU5HX0JVTkRMRV9URUFNX1VTQUdFX0FOQUxZVElDU19NT05USExZL19BTk5VQUwuXG4gICAgYigndGVhbV91c2FnZV9hbmFseXRpY3MnLCAnVGVhbSBVc2FnZSBBbmFseXRpY3MnLCAnUGVyLXRlYW0gdXNhZ2UgYnJlYWtkb3duIGFjcm9zcyB0aGUgb3JnIOKGkiB0ZWFtIHN1YnRyZWUgKGFsbCBxdW90YSBkaW1lbnNpb25zKScsIHt9LCAzMDAwLCBbJ3BybycsICd0ZWFtJ10sIDksIHsgZmVhdHVyZXM6IFsndGVhbV91c2FnZV9hbmFseXRpY3MnXSwgc3RhY2thYmxlOiBmYWxzZSB9KSxcbiAgICAvLyBSZXRlbnRpb24gcGFja3MgKGRvY3MvYmlsbGluZy1idW5kbGVzLm1kKS4gU3RhY2thYmxlIGNhcGFjaXR5IHBhY2tzIHRoYXRcbiAgICAvLyByYWlzZSB0aGUgcmVwb3J0aW5nIHJldGVudGlvbiBlbnRpdGxlbWVudCBiaWxsaW5nIHN5bmNzIHRvIHJlcG9ydGluZydzXG4gICAgLy8gYGRvcmFfc2V0dGluZ3NgLiBOT1QgcXVvdGEtbWV0ZXJlZCBmbG93IOKAlCBgZXZlbnRSZXRlbnRpb25EYXlzYC9gZG9yYVJldGVudGlvbkRheXNgXG4gICAgLy8gYXJlIGFic2VudCBmcm9tIFZBTElEX1FVT1RBX1RZUEVTLCBzbyB0aGV5IG5ldmVyIHJpZGUgdGhlIHF1b3RhLXNlcnZpY2UgbGVnLlxuICAgIC8vIFN0YW5kYXJkIFJldGVudGlvbiBQYWNrOiArOTBkIHN0YW5kYXJkLWV2ZW50IHJldGVudGlvbiAoYmFzZSAzMCDihpIgMTIwIOKGkiAyMTDigKYpLlxuICAgIC8vIENhcHBlZCBhdCA3ICgzMCArIDfDlzkwID0gNjYwIOKJpCB0aGUgNzMwLWRheSByZXRlbnRpb24gY2VpbGluZykuXG4gICAgYigncmV0ZW50aW9uX3BhY2snLCAnU3RhbmRhcmQgUmV0ZW50aW9uIFBhY2sgKCs5MGQpJywgJzkwIGFkZGl0aW9uYWwgZGF5cyBvZiBzdGFuZGFyZCBwaXBlbGluZS1ldmVudCByZXRlbnRpb24nLCB7IGV2ZW50UmV0ZW50aW9uRGF5czogOTAgfSwgMTUwMCwgQUxMLCAxMCwgeyBtYXhRdWFudGl0eTogNyB9KSxcbiAgICAvLyBET1JBIEhpc3RvcnkgUGFjazogKzM2NWQgRE9SQSByZXRlbnRpb24gQU5EIHBlci1vcmcgcmVwb3J0LXF1ZXJ5IHdpbmRvdyAodGhlXG4gICAgLy8gd2luZG93IGNhcCB0cmFja3MgZG9yYVJldGVudGlvbkRheXMpLiBPbmx5IG1lYW5pbmdmdWwgd2l0aCBBZHZhbmNlZCBSZXBvcnRpbmdcbiAgICAvLyDigJQgSU5DTFVERUQgaW4gRW50ZXJwcmlzZSwgYW4gYWRkLW9uIG9uIGRldmVsb3Blci9wcm8vdGVhbS4gQ2FwcGVkIGF0IDFcbiAgICAvLyAoMTgwICsgMzY1ID0gNTQ1IOKJpCB0aGUgNzMwLWRheSByZXRlbnRpb24gY2VpbGluZykuXG4gICAgYignZG9yYV9oaXN0b3J5X3BhY2snLCAnRE9SQSBIaXN0b3J5IFBhY2sgKCszNjVkKScsICczNjUgYWRkaXRpb25hbCBkYXlzIG9mIERPUkEgaGlzdG9yeSArIHJlcG9ydC1xdWVyeSB3aW5kb3cgKHJlcXVpcmVzIEFkdmFuY2VkIFJlcG9ydGluZyknLCB7IGRvcmFSZXRlbnRpb25EYXlzOiAzNjUgfSwgMzAwMCwgQUxMLCAxMSwgeyBtYXhRdWFudGl0eTogMSB9KSxcbiAgICAvLyBDb21wbGlhbmNlIGNvbnRlbnQgYWRkLW9ucyAoZG9jcy9wbGFucy9jb21wbGlhbmNlLWFkZG9ucy5tZCkuIEZlYXR1cmUgYnVuZGxlc1xuICAgIC8vIGdhdGluZyBhY2Nlc3MgdG8gY3VyYXRlZCBzeXN0ZW0tb3JnIHB1Ymxpc2hlZCBydWxlIHNldHMuIElOQ0xVREVEIGluXG4gICAgLy8gRW50ZXJwcmlzZS9VbmxpbWl0ZWQgKHZpYSBBTExfRkVBVFVSRV9GTEFHUyk7IHNvbGQgdG8gRGV2ZWxvcGVyL1Byby9UZWFtLlxuICAgIC8vIFN0YW5kYXJkID0gfjIwIENJL0NEIGJlc3QtcHJhY3RpY2UgcnVsZXMuIEFkdmFuY2VkID0gU09DMi9QQ0kvQ0lTIGZyYW1ld29ya1xuICAgIC8vIGxpYnJhcmllczsgUkVRVUlSRVMgU3RhbmRhcmQgKG9yIGJ1eSB0aGUgU3VpdGUgY29tYm8gZm9yIGJvdGggYXQgMzAlIG9mZikuXG4gICAgYignY29tcGxpYW5jZV9zdGFuZGFyZCcsICdTdGFuZGFyZCBDb21wbGlhbmNlJywgJ0N1cmF0ZWQgQ0kvQ0QgYmVzdC1wcmFjdGljZSBjb21wbGlhbmNlIHJ1bGVzJywge30sIDI5OTAsIFsnZGV2ZWxvcGVyJywgJ3BybycsICd0ZWFtJ10sIDEyLCB7IGZlYXR1cmVzOiBbJ2NvbXBsaWFuY2Vfc3RhbmRhcmQnXSwgc3RhY2thYmxlOiBmYWxzZSB9KSxcbiAgICBiKCdjb21wbGlhbmNlX2FkdmFuY2VkJywgJ0FkdmFuY2VkIENvbXBsaWFuY2UnLCAnQ3VyYXRlZCBmcmFtZXdvcmsgY29tcGxpYW5jZSBsaWJyYXJpZXMgKFNPQzIgLyBQQ0ktRFNTIC8gQ0lTKScsIHt9LCA5OTkwLCBbJ2RldmVsb3BlcicsICdwcm8nLCAndGVhbSddLCAxMywgeyBmZWF0dXJlczogWydjb21wbGlhbmNlX2FkdmFuY2VkJ10sIHN0YWNrYWJsZTogZmFsc2UsIHJlcXVpcmVzOiBbJ2NvbXBsaWFuY2Vfc3RhbmRhcmQnXSB9KSxcbiAgXTtcbiAgYXNzZXJ0QnVuZGxlUmVxdWlyZXNWYWxpZChidW5kbGVzKTtcbiAgcmV0dXJuIGJ1bmRsZXM7XG59XG5cbi8qKlxuICogQ29uZmlnLWxvYWQgZ3VhcmRyYWlsIGZvciB0aGUgYHJlcXVpcmVzYCBwcmVyZXF1aXNpdGUgZ3JhcGguIEEgYHJlcXVpcmVzYCBlbnRyeVxuICogdGhhdCBkb2Vzbid0IHJlc29sdmUgdG8gYW4gQUNUSVZFIGJ1bmRsZSDigJQgb3IgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSBjeWNsZSDigJRcbiAqIHNpbGVudGx5IG1ha2VzIHRoZSByZWZlcmVuY2luZyBidW5kbGUgdW5wdXJjaGFzYWJsZSAodGhlIGFkZG9uIHJvdXRlIHJlamVjdHNcbiAqIHdpdGggNDAwIGZvcmV2ZXIgYmVjYXVzZSB0aGUgcHJlcmVxdWlzaXRlIGNhbiBuZXZlciBiZSBzYXRpc2ZpZWQpLiBDYXRjaCBpdCBhdFxuICogbG9hZCB3aXRoIGEgY2xlYXIgZXJyb3IgcmF0aGVyIHRoYW4gc2hpcHBpbmcgYSBkZWFkIFNLVS5cbiAqXG4gKiAgLSBFdmVyeSBpZCBpbiBhIGJ1bmRsZSdzIGByZXF1aXJlc2AgTVVTVCBuYW1lIGFuIGFjdGl2ZSBidW5kbGUgaW4gdGhlIGNhdGFsb2cuXG4gKiAgLSBUaGUgYHJlcXVpcmVzYCBncmFwaCBNVVNUIGJlIGFjeWNsaWMgKGEg4oaSIGIg4oaSIGEgY2FuIG5ldmVyIGJlIHNhdGlzZmllZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCdW5kbGVSZXF1aXJlc1ZhbGlkKGJ1bmRsZXM6IEJ1bmRsZUNvbmZpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2ZSA9IG5ldyBNYXAoYnVuZGxlcy5maWx0ZXIoKGIpID0+IGIuaXNBY3RpdmUpLm1hcCgoYikgPT4gW2IuaWQsIGJdKSk7XG5cbiAgLy8gMS4gVmFsaWRpdHk6IGV2ZXJ5IHJlcXVpcmVzIGlkIHJlc29sdmVzIHRvIGFuIGFjdGl2ZSBidW5kbGUuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICBmb3IgKGNvbnN0IHJlcUlkIG9mIGJ1bmRsZS5yZXF1aXJlcyA/PyBbXSkge1xuICAgICAgaWYgKCFhY3RpdmUuaGFzKHJlcUlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFtiaWxsaW5nLWNvbmZpZ10gQnVuZGxlIFwiJHtidW5kbGUuaWR9XCIgcmVxdWlyZXMgXCIke3JlcUlkfVwiLCB3aGljaCBpcyBub3QgYW4gYWN0aXZlIGJ1bmRsZSBpbiB0aGUgY2F0YWxvZyDigJQgaXQgd291bGQgYmUgcGVybWFuZW50bHkgdW5wdXJjaGFzYWJsZS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIDIuIEFjeWNsaWNpdHk6IERGUyBvdmVyIHRoZSByZXF1aXJlcyBlZGdlcywgdHJhY2tpbmcgdGhlIGN1cnJlbnQgcGF0aC5cbiAgY29uc3QgVklTSVRJTkcgPSAxO1xuICBjb25zdCBET05FID0gMjtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIGNvbnN0IHZpc2l0ID0gKGlkOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogdm9pZCA9PiB7XG4gICAgY29uc3QgcyA9IHN0YXRlLmdldChpZCk7XG4gICAgaWYgKHMgPT09IERPTkUpIHJldHVybjtcbiAgICBpZiAocyA9PT0gVklTSVRJTkcpIHtcbiAgICAgIGNvbnN0IGN5Y2xlID0gWy4uLnBhdGguc2xpY2UocGF0aC5pbmRleE9mKGlkKSksIGlkXS5qb2luKCcgLT4gJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtiaWxsaW5nLWNvbmZpZ10gQnVuZGxlIFwicmVxdWlyZXNcIiBjeWNsZSBkZXRlY3RlZDogJHtjeWNsZX0uYCk7XG4gICAgfVxuICAgIHN0YXRlLnNldChpZCwgVklTSVRJTkcpO1xuICAgIGZvciAoY29uc3QgcmVxSWQgb2YgYWN0aXZlLmdldChpZCk/LnJlcXVpcmVzID8/IFtdKSB7XG4gICAgICB2aXNpdChyZXFJZCwgWy4uLnBhdGgsIGlkXSk7XG4gICAgfVxuICAgIHN0YXRlLnNldChpZCwgRE9ORSk7XG4gIH07XG5cbiAgZm9yIChjb25zdCBidW5kbGUgb2YgYWN0aXZlLmtleXMoKSkge1xuICAgIHZpc2l0KGJ1bmRsZSwgW10pO1xuICB9XG59XG4iXX0=
522
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2JpbGxpbmctY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQXdDLE1BQU0sNEJBQTRCLENBQUM7QUFPOUwsZ0ZBQWdGO0FBQ2hGLDhFQUE4RTtBQUM5RSxrREFBa0Q7QUFDbEQsa0ZBQWtGO0FBQ2xGLGlEQUFpRDtBQUNqRCx3RUFBd0U7QUFDeEUsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0Usc0VBQXNFO0FBQ3RFLDhFQUE4RTtBQUM5RSwrQkFBK0I7QUFFL0Isd0ZBQXdGO0FBQ3hGLFNBQVMsU0FBUyxDQUFDLEtBQWEsRUFBRSxRQUFnQixFQUFFLE1BQWM7SUFDaEUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQUUsT0FBTyxhQUFhLE1BQU0sRUFBRSxDQUFDO0lBQy9DLE9BQU8sU0FBUyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDckYsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLElBQWUsRUFBRSxLQUFlO0lBQ3ZELE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDbkMsT0FBTztRQUNMLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7UUFDbkMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztR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LFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNuRCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0lBRUYsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogTG9hZCBiaWxsaW5nIHBsYW4gY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBQZXItcGxhbiBwcmljZXMgYXJlIHRoZSBtb3N0IGxpa2VseSB0byB2YXJ5IGJldHdlZW4gZW52aXJvbm1lbnRzOlxuICogICBCSUxMSU5HX1BMQU5fe1RJRVJ9X01PTlRITFkgLyBCSUxMSU5HX1BMQU5fe1RJRVJ9X0FOTlVBTCAgKGluIGNlbnRzKVxuICpcbiAqIE9wdGlvbmFsIG92ZXJyaWRlcyBmb3IgZGVzY3JpcHRpb25zIGFuZCBmZWF0dXJlczpcbiAqICAgQklMTElOR19QTEFOX3tUSUVSfV9OQU1FICAgICAgICAgIChwbGFpbiBzdHJpbmcsIGRpc3BsYXkgbmFtZSlcbiAqICAgQklMTElOR19QTEFOX3tUSUVSfV9ERVNDUklQVElPTiAgIChwbGFpbiBzdHJpbmcpXG4gKiAgIEJJTExJTkdfUExBTl97VElFUn1fRkVBVFVSRVMgICAgICAoSlNPTiBzdHJpbmcgYXJyYXkpXG4gKlxuICogQWxsIGRlZmF1bHRzIG1hdGNoIHRoZSBvcmlnaW5hbCBoYXJkY29kZWQgc2VlZCBkYXRhLlxuICovXG5pbXBvcnQgeyBRVU9UQV9USUVSUywgVElFUl9GRUFUVVJFUywgRkVBVFVSRV9NRVRBREFUQSwgVkFMSURfVElFUlMsIFNUQU5EQVJEX1RJRVJTLCBpc1ZhbGlkRmVhdHVyZUZsYWcsIGlzVmFsaWRUaWVyLCB0eXBlIFF1b3RhVGllciwgdHlwZSBRdW90YVRpZXJMaW1pdHMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IEJpbGxpbmdDb25maWcsIEJpbGxpbmdQbGFuQ29uZmlnLCBCdW5kbGVDb25maWcsIENvbWJvRGlzY291bnRDb25maWcgfSBmcm9tICcuL2NvbmZpZy10eXBlcy5qcyc7XG5cbi8qKiBQZXItdW5pdCBxdW90YSBkZWx0YXMgZm9yIGEgYnVuZGxlIOKAlCBrZXlzIGNvbnN0cmFpbmVkIHRvIHJlYWwgcXVvdGEgZmllbGRzXG4gKiAgKG1hdGNoZXMgYEJ1bmRsZUNvbmZpZy5ncmFudHNgKSwgc28gYSB0eXBvJ2QgZGltZW5zaW9uIGZhaWxzIHRvIGNvbXBpbGUuICovXG50eXBlIEdyYW50TWFwID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgUXVvdGFUaWVyTGltaXRzLCBudW1iZXI+PjtcblxuLy8gLS0gRGVmYXVsdCBmZWF0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBtYXJrZXRlZCBmZWF0dXJlIGxpc3QgaXMgYnVpbHQgZnJvbSB0d28gZGVyaXZlZCBzb3VyY2VzIHNvIGl0IGNhbiBuZXZlclxuLy8gZHJpZnQgZnJvbSB3aGF0IHRoZSBwbGF0Zm9ybSBhY3R1YWxseSBlbmZvcmNlczpcbi8vICAgMS4gTElNSVQgbGluZXMgZGVyaXZlZCBmcm9tIGVhY2ggdGllcidzIEVGRkVDVElWRSBxdW90YSBsaW1pdHMgKFFVT1RBX1RJRVJTKSxcbi8vICAgICAgc28gdGhleSB0cmFjayBRVU9UQV9USUVSXyogZW52IG92ZXJyaWRlcy5cbi8vICAgMi4gSU5DTFVERUQtRkVBVFVSRSBsaW5lcyBkZXJpdmVkIGZyb20gdGhlIGVuZm9yY2VkIGVudGl0bGVtZW50IHNldFxuLy8gICAgICAoVElFUl9GRUFUVVJFUykgdmlhIEZFQVRVUkVfTUVUQURBVEEgbGFiZWxzIOKAlCBzbyBhbiBhZHZlcnRpc2VkIGJhc2Vcbi8vICAgICAgZmVhdHVyZSBpcyBhbHdheXMgb25lIGByZXF1aXJlRmVhdHVyZWAgYWN0dWFsbHkgZ3JhbnRzIGZvciB0aGF0IHRpZXIuXG4vLyBPbmx5IGdlbnVpbmVseSBub24tZ2F0ZWQgbWFya2V0aW5nIGNvcHkgKHN1cHBvcnQgbGV2ZWwsIGRhc2hib2FyZHMsIFJCQUMpIGlzXG4vLyBoYW5kLWF1dGhvcmVkLCBwYXNzZWQgYXMgYHBlcmtzYC4gUHVyY2hhc2FibGUgZmVhdHVyZSBhZGQtb25zIChzc28sXG4vLyBhZHZhbmNlZF9yZXBvcnRpbmcsIOKApikgYXJlIE5PVCBsaXN0ZWQgYXMgYmFzZSBwZXJrcyBoZXJlIOKAlCB0aGV5IGFyZSBzb2xkIGFzXG4vLyBidW5kbGVzIChzZWUgbG9hZEJ1bmRsZXMoKSkuXG5cbi8qKiBcIlVwIHRvIE4gcGx1Z2luc1wiIC8gXCJVbmxpbWl0ZWQgcGx1Z2luc1wiIGZyb20gYW4gZWZmZWN0aXZlIGxpbWl0ICgtMSA9IHVubGltaXRlZCkuICovXG5mdW5jdGlvbiBsaW1pdExpbmUobGltaXQ6IG51bWJlciwgc2luZ3VsYXI6IHN0cmluZywgcGx1cmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAobGltaXQgPT09IC0xKSByZXR1cm4gYFVubGltaXRlZCAke3BsdXJhbH1gO1xuICByZXR1cm4gYFVwIHRvICR7bGltaXQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyl9ICR7bGltaXQgPT09IDEgPyBzaW5ndWxhciA6IHBsdXJhbH1gO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RmVhdHVyZXModGllcjogUXVvdGFUaWVyLCBwZXJrczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGwgPSBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHM7XG4gIHJldHVybiBbXG4gICAgbGltaXRMaW5lKGwuc2VhdHMsICdzZWF0JywgJ3NlYXRzJyksXG4gICAgbGltaXRMaW5lKGwucGx1Z2lucywgJ3BsdWdpbicsICdwbHVnaW5zJyksXG4gICAgbGltaXRMaW5lKGwucGlwZWxpbmVzLCAncGlwZWxpbmUnLCAncGlwZWxpbmVzJyksXG4gICAgbGltaXRMaW5lKGwuYXBpQ2FsbHMsICdBUEkgY2FsbCcsICdBUEkgY2FsbHMnKSxcbiAgICBsaW1pdExpbmUobC5haUNhbGxzLCAnQUkgY2FsbCcsICdBSSBjYWxscycpLFxuICAgIC8vIEVuZm9yY2VkIGVudGl0bGVtZW50cyDihpIgY3VzdG9tZXItZmFjaW5nIGxhYmVscyAoc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCkuXG4gICAgLi4uVElFUl9GRUFUVVJFU1t0aWVyXS5tYXAoKGYpID0+IEZFQVRVUkVfTUVUQURBVEFbZl0ubGFiZWwpLFxuICAgIC4uLnBlcmtzLFxuICBdO1xufVxuXG4vLyBOb3RlOiBgcGVya3NgIGFyZSBub24tZ2F0ZWQgbWFya2V0aW5nIGxpbmVzIG9ubHkuIEVuZm9yY2VkIGZlYXR1cmVzIChpbmNsLlxuLy8gUHJpb3JpdHkgU3VwcG9ydCBmb3IgcHJvL3RlYW0vZW50ZXJwcmlzZSkgY29tZSBmcm9tIFRJRVJfRkVBVFVSRVMgYWJvdmUuXG4vLyBUaGUgcmVwb3J0aW5nIGRhc2hib2FyZCBpcyBvcGVuIHRvIGV2ZXJ5IHRpZXIgKG9ubHkgdGhlIERPUkEvc2NvcmVjYXJkIHZpZXdzXG4vLyBhcmUgZW50aXRsZW1lbnQtZ2F0ZWQpLCBzbyBpdCdzIGxpc3RlZCBvbiBlYWNoIHBsYW4gcmF0aGVyIHRoYW4gaW1wbHlpbmcgYVxuLy8gbG93ZXIgdGllciBsYWNrcyBpdC5cbmNvbnN0IERFRkFVTFRfREVWRUxPUEVSX0ZFQVRVUkVTID0gZGVmYXVsdEZlYXR1cmVzKCdkZXZlbG9wZXInLCBbJ0NvbW11bml0eSBzdXBwb3J0JywgJ1JlcG9ydGluZyBkYXNoYm9hcmQnXSk7XG5jb25zdCBERUZBVUxUX1BST19GRUFUVVJFUyA9IGRlZmF1bHRGZWF0dXJlcygncHJvJywgWydSZXBvcnRpbmcgZGFzaGJvYXJkJ10pO1xuY29uc3QgREVGQVVMVF9URUFNX0ZFQVRVUkVTID0gZGVmYXVsdEZlYXR1cmVzKCd0ZWFtJywgWydSQkFDICYgdGVhbSByb2xlcycsICdSZXBvcnRpbmcgZGFzaGJvYXJkJ10pO1xuY29uc3QgREVGQVVMVF9FTlRFUlBSSVNFX0ZFQVRVUkVTID0gZGVmYXVsdEZlYXR1cmVzKCdlbnRlcnByaXNlJywgW1xuICAnUkJBQyAmIHRlYW0gcm9sZXMnLCAnUmVwb3J0aW5nIGRhc2hib2FyZCcsXG5dKTtcbi8vIFVubGltaXRlZCBpbmNsdWRlcyBldmVyeSBmZWF0dXJlIChUSUVSX0ZFQVRVUkVTLnVubGltaXRlZCA9IGFsbCkuXG5jb25zdCBERUZBVUxUX1VOTElNSVRFRF9GRUFUVVJFUyA9IGRlZmF1bHRGZWF0dXJlcygndW5saW1pdGVkJywgW1xuICAnVW5saW1pdGVkIGV2ZXJ5dGhpbmcnLCAnUkJBQyAmIHRlYW0gcm9sZXMnLCAnUmVwb3J0aW5nIGRhc2hib2FyZCcsXG5dKTtcblxuLyoqXG4gKiBQYXJzZSBhIHByaWNlIChpbiBjZW50cykgZnJvbSBhbiBlbnYgdmFyLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGRlZmF1bHQgd2hlblxuICogdW5zZXQgT1IgbWFsZm9ybWVkLiBBIE5hTiAoZS5nLiBgQklMTElOR19QTEFOX1BST19NT05USExZPWFiY2ApIG11c3QgbmV2ZXJcbiAqIGZsb3cgaW50byB0aGUgcmV0dXJuZWQgY29uZmlnIGFzIGEgcHJpY2UuXG4gKi9cbmZ1bmN0aW9uIGVudkNlbnRzKGVudlZhcjogc3RyaW5nIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGVudlZhciA9PT0gdW5kZWZpbmVkIHx8IGVudlZhciA9PT0gJycpIHJldHVybiBmYWxsYmFjaztcbiAgLy8gYHBhcnNlSW50YCBpcyB0b28gbGVuaWVudCBoZXJlOiAnNDkuOTkn4oaSNDksICc0OWFiYyfihpI0OSwgJy0xMDAn4oaSLTEwMCB3b3VsZCBhbGxcbiAgLy8gZmxvdyB0aHJvdWdoIGFzIGEgXCJwcmljZVwiLiBSZXF1aXJlIGEgY2xlYW4sIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIChjZW50cyksXG4gIC8vIG1hdGNoaW5nIGBhcHBseUdyYW50T3ZlcnJpZGVgJ3Mgcmlnb3Ig4oCUIGFueXRoaW5nIGVsc2UgZmFsbHMgYmFjay5cbiAgY29uc3QgbiA9IE51bWJlcihlbnZWYXIpO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuID49IDAgPyBuIDogZmFsbGJhY2s7XG59XG5cbi8qKlxuICogUGFyc2UgYSBKU09OIGFycmF5IGZyb20gYW4gZW52IHZhciwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRmVhdHVyZXMoZW52VmFyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCFlbnZWYXIpIHJldHVybiBmYWxsYmFjaztcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGVudlZhcik7XG4gICAgLy8gQXJyYXktb2Ytc3RyaW5ncyBvbmx5IOKAlCBhIEpTT04gYXJyYXkgb2Ygbm9uLXN0cmluZ3MgKGUuZy4gYFsxLDJdYCkgbXVzdCBub3RcbiAgICAvLyBzaGlwIG51bWJlcnMgYXMgZmVhdHVyZSBsYWJlbHMuIEZpbHRlciB0byBzdHJpbmdzIChtaXJyb3JzIGFwcGx5VGllcnNPdmVycmlkZSkuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZCkpIHJldHVybiBmYWxsYmFjaztcbiAgICBjb25zdCBzdHJpbmdzID0gcGFyc2VkLmZpbHRlcigoeCk6IHggaXMgc3RyaW5nID0+IHR5cGVvZiB4ID09PSAnc3RyaW5nJyk7XG4gICAgcmV0dXJuIHN0cmluZ3MubGVuZ3RoID09PSBwYXJzZWQubGVuZ3RoID8gc3RyaW5ncyA6IGZhbGxiYWNrO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkIGJpbGxpbmcgcGxhbiBjb25maWd1cmF0aW9uIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEJpbGxpbmdDb25maWcoKTogQmlsbGluZ0NvbmZpZyB7XG4gIC8vIEtleWVkIGJ5IFF1b3RhVGllciBzbyB0aGUgY29tcGlsZXIgZm9yY2VzIGEgcGxhbiBmb3IgRVZFUlkgdGllciDigJQgYWRkaW5nIGFcbiAgLy8gNXRoIFF1b3RhVGllciB3aXRob3V0IGEgcGxhbiBoZXJlIGlzIG5vdyBhIGNvbXBpbGUgZXJyb3IgKHdhcyBhIGhhbmQta2VwdFxuICAvLyA0LWVsZW1lbnQgYXJyYXkgdGhhdCBzaWxlbnRseSBzaGlwcGVkIG5vIHBsYW4vcHJpY2UgZm9yIGEgbmV3IHRpZXIpLiBUaGVcbiAgLy8gcHVibGljIGBjb25maWcucGxhbnNgIHNoYXBlIHN0YXlzIGFuIGFycmF5LCBkZXJpdmVkIGJlbG93IGluIFZBTElEX1RJRVJTXG4gIC8vIG9yZGVyIChkZXZlbG9wZXIsIHBybywgdGVhbSwgZW50ZXJwcmlzZSwgdW5saW1pdGVkKSB0byBwcmVzZXJ2ZSBjb25zdW1lciBvcmRlcmluZy5cbiAgY29uc3QgcGxhbkJ5VGllcjogUmVjb3JkPFF1b3RhVGllciwgQmlsbGluZ1BsYW5Db25maWc+ID0ge1xuICAgIGRldmVsb3Blcjoge1xuICAgICAgaWQ6ICdkZXZlbG9wZXInLFxuICAgICAgbmFtZTogcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0RFVkVMT1BFUl9OQU1FIHx8ICdEZXZlbG9wZXInLFxuICAgICAgZGVzY3JpcHRpb246IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9ERVZFTE9QRVJfREVTQ1JJUFRJT05cbiAgICAgICAgfHwgJ0ZyZWUgc3RhcnRlciB0aWVyIGZvciBpbmRpdmlkdWFsIGRldmVsb3BlcnMnLFxuICAgICAgdGllcjogJ2RldmVsb3BlcicsXG4gICAgICBwcmljZXM6IHtcbiAgICAgICAgbW9udGhseTogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0RFVkVMT1BFUl9NT05USExZLCAwKSxcbiAgICAgICAgYW5udWFsOiBlbnZDZW50cyhwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fREVWRUxPUEVSX0FOTlVBTCwgMCksXG4gICAgICB9LFxuICAgICAgZmVhdHVyZXM6IHBhcnNlRmVhdHVyZXMoXG4gICAgICAgIHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9ERVZFTE9QRVJfRkVBVFVSRVMsXG4gICAgICAgIERFRkFVTFRfREVWRUxPUEVSX0ZFQVRVUkVTLFxuICAgICAgKSxcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgaXNEZWZhdWx0OiB0cnVlLFxuICAgICAgc29ydE9yZGVyOiAwLFxuICAgIH0sXG4gICAgcHJvOiB7XG4gICAgICBpZDogJ3BybycsXG4gICAgICBuYW1lOiBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fUFJPX05BTUUgfHwgJ1BybycsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1BST19ERVNDUklQVElPTlxuICAgICAgICB8fCAnRm9yIGluZGl2aWR1YWwgcG93ZXIgdXNlcnMgYW5kIHByb2R1Y3Rpb24gd29ya2xvYWRzJyxcbiAgICAgIHRpZXI6ICdwcm8nLFxuICAgICAgcHJpY2VzOiB7XG4gICAgICAgIG1vbnRobHk6IGVudkNlbnRzKHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9QUk9fTU9OVEhMWSwgMzkwMCksXG4gICAgICAgIGFubnVhbDogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1BST19BTk5VQUwsIDM5MDAwKSxcbiAgICAgIH0sXG4gICAgICBmZWF0dXJlczogcGFyc2VGZWF0dXJlcyhcbiAgICAgICAgcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1BST19GRUFUVVJFUyxcbiAgICAgICAgREVGQVVMVF9QUk9fRkVBVFVSRVMsXG4gICAgICApLFxuICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgc29ydE9yZGVyOiAxLFxuICAgIH0sXG4gICAgdGVhbToge1xuICAgICAgaWQ6ICd0ZWFtJyxcbiAgICAgIG5hbWU6IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9URUFNX05BTUUgfHwgJ1RlYW0nLFxuICAgICAgZGVzY3JpcHRpb246IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9URUFNX0RFU0NSSVBUSU9OXG4gICAgICAgIHx8ICdGb3IgdGVhbXMgY29sbGFib3JhdGluZyBvbiBzaGFyZWQgcGlwZWxpbmVzJyxcbiAgICAgIHRpZXI6ICd0ZWFtJyxcbiAgICAgIHByaWNlczoge1xuICAgICAgICBtb250aGx5OiBlbnZDZW50cyhwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVEVBTV9NT05USExZLCA3OTAwKSxcbiAgICAgICAgYW5udWFsOiBlbnZDZW50cyhwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVEVBTV9BTk5VQUwsIDc5MDAwKSxcbiAgICAgIH0sXG4gICAgICBmZWF0dXJlczogcGFyc2VGZWF0dXJlcyhcbiAgICAgICAgcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1RFQU1fRkVBVFVSRVMsXG4gICAgICAgIERFRkFVTFRfVEVBTV9GRUFUVVJFUyxcbiAgICAgICksXG4gICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICBzb3J0T3JkZXI6IDIsXG4gICAgfSxcbiAgICBlbnRlcnByaXNlOiB7XG4gICAgICBpZDogJ2VudGVycHJpc2UnLFxuICAgICAgbmFtZTogcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0VOVEVSUFJJU0VfTkFNRSB8fCAnRW50ZXJwcmlzZScsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0VOVEVSUFJJU0VfREVTQ1JJUFRJT05cbiAgICAgICAgfHwgJ09yZy13aWRlIHNjYWxlIHdpdGggYSBoaWdoIHNlYXQgYmFzZWxpbmUgKGV4cGFuZGFibGUgdmlhIE1lbWJlciBTZWF0IGFkZC1vbnMpIGFuZCBwcmlvcml0eSBzdXBwb3J0JyxcbiAgICAgIHRpZXI6ICdlbnRlcnByaXNlJyxcbiAgICAgIHByaWNlczoge1xuICAgICAgICBtb250aGx5OiBlbnZDZW50cyhwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fRU5URVJQUklTRV9NT05USExZLCA1OTkwMCksXG4gICAgICAgIGFubnVhbDogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0VOVEVSUFJJU0VfQU5OVUFMLCA1OTkwMDApLFxuICAgICAgfSxcbiAgICAgIGZlYXR1cmVzOiBwYXJzZUZlYXR1cmVzKFxuICAgICAgICBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fRU5URVJQUklTRV9GRUFUVVJFUyxcbiAgICAgICAgREVGQVVMVF9FTlRFUlBSSVNFX0ZFQVRVUkVTLFxuICAgICAgKSxcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIHNvcnRPcmRlcjogMyxcbiAgICB9LFxuICAgIC8vIFRoZSBiaWxsaW5nLURJU0FCTEVEIGRlZmF1bHQgcGxhbjogZXZlcnl0aGluZyB1bmNhcHBlZCwgYWxsIGZlYXR1cmVzLCBmcmVlLlxuICAgIC8vIFNlZWRlZCBzbyB0aGUgdGllcuKGknBsYW4gbWFwcGluZyByZXNvbHZlcywgYnV0IG5ldmVyIG9mZmVyZWQgZm9yIHNhbGUg4oCUIHRoZVxuICAgIC8vIHJlYWQtcGxhbnMgcm91dGUgZmlsdGVycyBpdCBvdXQgKHNlZSBjcmVhdGVSZWFkUGxhblJvdXRlcyksIHNvIGl0J3MgaGlkZGVuXG4gICAgLy8gd2hlbmV2ZXIgYmlsbGluZyBpcyBlbmFibGVkICh0aGUgb25seSB0aW1lIC9wbGFucyBpcyBzZXJ2ZWQpLlxuICAgIHVubGltaXRlZDoge1xuICAgICAgaWQ6ICd1bmxpbWl0ZWQnLFxuICAgICAgbmFtZTogcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1VOTElNSVRFRF9OQU1FIHx8ICdVbmxpbWl0ZWQnLFxuICAgICAgZGVzY3JpcHRpb246IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9VTkxJTUlURURfREVTQ1JJUFRJT05cbiAgICAgICAgfHwgJ0V2ZXJ5dGhpbmcgdW5jYXBwZWQg4oCUIHRoZSBkZWZhdWx0IHdoZW4gYmlsbGluZyBpcyBkaXNhYmxlZCcsXG4gICAgICB0aWVyOiAndW5saW1pdGVkJyxcbiAgICAgIHByaWNlczoge1xuICAgICAgICBtb250aGx5OiBlbnZDZW50cyhwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVU5MSU1JVEVEX01PTlRITFksIDApLFxuICAgICAgICBhbm51YWw6IGVudkNlbnRzKHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9VTkxJTUlURURfQU5OVUFMLCAwKSxcbiAgICAgIH0sXG4gICAgICBmZWF0dXJlczogcGFyc2VGZWF0dXJlcyhcbiAgICAgICAgcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1VOTElNSVRFRF9GRUFUVVJFUyxcbiAgICAgICAgREVGQVVMVF9VTkxJTUlURURfRkVBVFVSRVMsXG4gICAgICApLFxuICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgc29ydE9yZGVyOiA0LFxuICAgIH0sXG4gIH07XG5cbiAgLy8gRGVyaXZlIHRoZSBhcnJheSBjb25zdW1lcnMgcmVhZCAoYGNvbmZpZy5wbGFuc2ApIGluIGNhbm9uaWNhbCB0aWVyIG9yZGVyLlxuICBjb25zdCBwbGFuczogQmlsbGluZ1BsYW5Db25maWdbXSA9IFZBTElEX1RJRVJTLm1hcCgodGllcikgPT4gcGxhbkJ5VGllclt0aWVyXSk7XG5cbiAgLy8gQnVpbGQgYnVuZGxlcyBPTkNFIGFuZCB0aHJlYWQgdGhlbSBpbnRvIHRoZSBjb21ibyBsb2FkZXIgKHdoaWNoIG5lZWRzIHRoZWlyXG4gIC8vIGVudi1lZmZlY3RpdmUgcHJpY2VzKSDigJQgYXZvaWRzIHBhcnNpbmcgdGhlIHdob2xlIGJ1bmRsZSBjYXRhbG9nIHR3aWNlIHBlciBsb2FkLlxuICBjb25zdCBidW5kbGVzID0gbG9hZEJ1bmRsZXMoKTtcbiAgcmV0dXJuIHsgcGxhbnMsIGJ1bmRsZXMsIGNvbWJvRGlzY291bnRzOiBsb2FkQ29tYm9EaXNjb3VudHMoYnVuZGxlcykgfTtcbn1cblxuLyoqXG4gKiBDb21ibyBkaXNjb3VudHMgKGRvY3MvYmlsbGluZy1idW5kbGVzLm1kIMKnQ29tYm8gcHJpY2luZykuIFdoZW4gYW4gYWNjb3VudCBvd25zXG4gKiBldmVyeSBtZW1iZXIgYnVuZGxlIChlYWNoIGF0IOKJpSBpdHMgbWluaW11bSBxdWFudGl0eSksIHRoZSBzZXQgaXMgYmlsbGVkIGF0IHRoZVxuICogY29tYmluZWQgcHJpY2UgaW5zdGVhZCBvZiB0aGUgc3VtIG9mIHRoZSBtZW1iZXJzIOKAlCByZWFsaXplZCBhcyBhIHJlY3VycmluZyB1c2FnZVxuICogY3JlZGl0IGZvciB0aGUgZGlmZmVyZW5jZS4gT3ZlcmxhcHBpbmcgY29tYm9zIGFyZSByZXNvbHZlZCBieSBtYXgtd2VpZ2h0IHBhY2tpbmdcbiAqIChhIHNoYXJlZCBhZGQtb24gaXMgbmV2ZXIgZGlzY291bnRlZCB0d2ljZSk7IGBzb3J0T3JkZXJgIGJyZWFrcyBlcXVhbC10b3RhbCB0aWVzLlxuICpcbiAqIERlZmF1bHRzOlxuICogIC0gXCJBbmFseXRpY3MgU3VpdGVcIiDigJQgQWR2YW5jZWQgUmVwb3J0aW5nIChET1JBKSArIFRlYW0gVXNhZ2UgQW5hbHl0aWNzLCBlYWNoXG4gKiAgICAkMzAvbW8sIHRvZ2V0aGVyICQ0Mi9tbyAoJDQyMC95cikg4oaSIGEgJDE4L21vIGNyZWRpdCAofjMwJSBvZmYpLlxuICogIC0gXCJUZWFtIEdyb3d0aCBCdW5kbGVcIiDigJQg4omlNSBTZWF0cyAoJDE5Ljk5IGVhKSArIFRlYW0gVXNhZ2UgQW5hbHl0aWNzICgkMzApLFxuICogICAgYmFza2V0ICQxMjkuOTUvbW8g4oaSIHRvZ2V0aGVyICQ5MC45OS9tbyAoJDkwOS45MC95cikg4oaSIGEgfiQzOC45Ni9tbyBjcmVkaXQgKH4zMCUgb2ZmKS5cbiAqICAtIFwiU2NhbGUgQnVuZGxlXCIg4oCUIEFQSSBQYWNrICgkMTkuOTkpICsgU3RvcmFnZSBQYWNrICgkMTkuOTkpLCBiYXNrZXQgJDM5Ljk4L21vXG4gKiAgICDihpIgdG9nZXRoZXIgJDI3Ljk5L21vICgkMjc5LjkwL3lyKSDihpIgYSB+JDExLjk5L21vIGNyZWRpdCAofjMwJSBvZmYpLlxuICogUHJpY2VzIGVudi1vdmVycmlkYWJsZSB2aWEgYEJJTExJTkdfQ09NQk9fPElEPl9NT05USExZYCAvIGBfQU5OVUFMYC5cbiAqL1xuZnVuY3Rpb24gbG9hZENvbWJvRGlzY291bnRzKGJ1bmRsZXM6IEJ1bmRsZUNvbmZpZ1tdKTogQ29tYm9EaXNjb3VudENvbmZpZ1tdIHtcbiAgY29uc3QgYyA9IChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBidW5kbGVJZHM6IHN0cmluZ1tdLFxuICAgIG1vbnRobHk6IG51bWJlcixcbiAgICBhbm51YWw6IG51bWJlcixcbiAgICBzb3J0T3JkZXI6IG51bWJlcixcbiAgICBtaW5RdWFudGl0aWVzPzogUmVjb3JkPHN0cmluZywgbnVtYmVyPixcbiAgKTogQ29tYm9EaXNjb3VudENvbmZpZyA9PiAoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgYnVuZGxlSWRzLFxuICAgIC4uLihtaW5RdWFudGl0aWVzID8geyBtaW5RdWFudGl0aWVzIH0gOiB7fSksXG4gICAgcHJpY2VzOiB7XG4gICAgICBtb250aGx5OiBlbnZDZW50cyhwcm9jZXNzLmVudltgQklMTElOR19DT01CT18ke2lkLnRvVXBwZXJDYXNlKCl9X01PTlRITFlgXSwgbW9udGhseSksXG4gICAgICBhbm51YWw6IGVudkNlbnRzKHByb2Nlc3MuZW52W2BCSUxMSU5HX0NPTUJPXyR7aWQudG9VcHBlckNhc2UoKX1fQU5OVUFMYF0sIGFubnVhbCksXG4gICAgfSxcbiAgICBzb3J0T3JkZXIsXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbWJvcyA9IFtcbiAgICBjKCdhbmFseXRpY3Nfc3VpdGUnLCAnQW5hbHl0aWNzIFN1aXRlJywgWydhZHZhbmNlZF9yZXBvcnRpbmcnLCAndGVhbV91c2FnZV9hbmFseXRpY3MnXSwgNDIwMCwgNDIwMDAsIDApLFxuICAgIC8vIFRlYW0gR3Jvd3RoIOKAlCDiiaU1IFNlYXRzICgkMTkuOTkgZWEpICsgVGVhbSBVc2FnZSBBbmFseXRpY3MgKCQzMCkuIEJhc2tldFxuICAgIC8vIDXDlyQxOS45OSArICQzMCA9ICQxMjkuOTUvbW8g4oaSIGJ1bmRsZWQgJDkwLjk5L21vICh+MzAlIG9mZiwgfiQzOC45NiBjcmVkaXQpLlxuICAgIGMoJ3RlYW1fZ3Jvd3RoJywgJ1RlYW0gR3Jvd3RoIEJ1bmRsZScsIFsnc2VhdCcsICd0ZWFtX3VzYWdlX2FuYWx5dGljcyddLCA5MDk5LCA5MDk5MCwgMSwgeyBzZWF0OiA1IH0pLFxuICAgIC8vIENvbXBsaWFuY2UgU3VpdGUg4oCUIFN0YW5kYXJkICsgQWR2YW5jZWQgYXQgMzAlIG9mZiAoJDkwOC42MC95ciB2cyAkMSwyOTggbGlzdCkuXG4gICAgYygnY29tcGxpYW5jZV9zdWl0ZScsICdDb21wbGlhbmNlIFN1aXRlJywgWydjb21wbGlhbmNlX3N0YW5kYXJkJywgJ2NvbXBsaWFuY2VfYWR2YW5jZWQnXSwgOTA4NiwgOTA4NjAsIDIpLFxuICAgIC8vIFNjYWxlIEJ1bmRsZSDigJQgQVBJIFBhY2sgKCQxOS45OSkgKyBTdG9yYWdlIFBhY2sgKCQxOS45OSkuIEJhc2tldCAkMzkuOTgvbW8g4oaSXG4gICAgLy8gYnVuZGxlZCAkMjcuOTkvbW8gKH4zMCUgb2ZmLCB+JDExLjk5IGNyZWRpdCkuIEJvdGggbWVtYmVycyBhbGwtdGllci5cbiAgICBjKCdzY2FsZV9idW5kbGUnLCAnU2NhbGUgQnVuZGxlJywgWydhcGlfcGFjaycsICdzdG9yYWdlX3BhY2snXSwgMjc5OSwgMjc5OTAsIDMpLFxuICBdO1xuICBhc3NlcnRDb21ib3NWYWxpZChjb21ib3MsIGJ1bmRsZXMpO1xuICB3YXJuT25Ob25EaXNjb3VudENvbWJvcyhjb21ib3MsIGJ1bmRsZXMpO1xuICByZXR1cm4gY29tYm9zO1xufVxuXG4vKipcbiAqIENvbmZpZy1sb2FkIGd1YXJkcmFpbCBmb3IgY29tYm9zOiBldmVyeSBgYnVuZGxlSWRgIG11c3QgcmVzb2x2ZSB0byBhbiBBQ1RJVkVcbiAqIGJ1bmRsZSBhbmQgZXZlcnkgYG1pblF1YW50aXRpZXNgIGtleSBtdXN0IGJlIG9uZSBvZiB0aGUgY29tYm8ncyBgYnVuZGxlSWRzYC5cbiAqIEEgdHlwbydkIG1lbWJlciBvciBzdHJheSBtaW5RdWFudGl0eSBrZXkgb3RoZXJ3aXNlIHNoaXBzIGEgcGVybWFuZW50bHktaW5lcnRcbiAqIGNvbWJvIChtaXNzaW5nIGJ1bmRsZSB0cmVhdGVkIGFzIHVuaXQgcHJpY2UgMCwgb3IgYSBtaW4gbmV2ZXIgc2F0aXNmaWFibGUpLFxuICogc2lsZW50bHkgbmV2ZXIgYXBwbHlpbmcuIFRocm93cyBzbyBtaXNjb25maWcgZmFpbHMgZmFzdCBhdCBib290LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q29tYm9zVmFsaWQoY29tYm9zOiBDb21ib0Rpc2NvdW50Q29uZmlnW10sIGJ1bmRsZXM6IEJ1bmRsZUNvbmZpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2ZUlkcyA9IG5ldyBTZXQoYnVuZGxlcy5maWx0ZXIoKGIpID0+IGIuaXNBY3RpdmUpLm1hcCgoYikgPT4gYi5pZCkpO1xuICBmb3IgKGNvbnN0IGNvbWJvIG9mIGNvbWJvcykge1xuICAgIGZvciAoY29uc3QgaWQgb2YgY29tYm8uYnVuZGxlSWRzKSB7XG4gICAgICBpZiAoIWFjdGl2ZUlkcy5oYXMoaWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tYm8gXCIke2NvbWJvLmlkfVwiIHJlZmVyZW5jZXMgYnVuZGxlIFwiJHtpZH1cIiwgd2hpY2ggaXMgbm90IGFuIGFjdGl2ZSBidW5kbGUuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbWJvLm1pblF1YW50aXRpZXMgPz8ge30pKSB7XG4gICAgICBpZiAoIWNvbWJvLmJ1bmRsZUlkcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tYm8gXCIke2NvbWJvLmlkfVwiIG1pblF1YW50aXRpZXMga2V5IFwiJHtrZXl9XCIgaXMgbm90IG9uZSBvZiBpdHMgYnVuZGxlSWRzLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiogVGhlIHZvbHVtZS1kaXNjb3VudCBwZXJjZW50IGFwcGx5aW5nIHRvIGBxdWFudGl0eWAgdW5pdHMgb2YgYSBidW5kbGUg4oCUIHRoZVxuICogIGhpZ2hlc3QgYHZvbHVtZVRpZXJzYCBlbnRyeSB3aG9zZSBgbWluUXVhbnRpdHkg4omkIHF1YW50aXR5YCwgZWxzZSAwLiBNaXJyb3JzXG4gKiAgYHZvbHVtZURpc2NvdW50UGN0YCBpbiBhcGkvYmlsbGluZydzIGNvbWJvLXByaWNpbmcgKHdoaWNoIGNhbid0IGJlIGltcG9ydGVkIHRoZVxuICogIG90aGVyIHdheSk7IHRoZSBjb21ibyBjcmVkaXQgbWF0aCBhbmQgdGhpcyBndWFyZHJhaWwgTVVTVCB1c2UgdGhlIHNhbWUgYmFzaXMuICovXG5mdW5jdGlvbiB2b2x1bWVEaXNjb3VudFBjdEF0KGJ1bmRsZTogQnVuZGxlQ29uZmlnIHwgdW5kZWZpbmVkLCBxdWFudGl0eTogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IHBjdCA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiBidW5kbGU/LnZvbHVtZVRpZXJzID8/IFtdKSBpZiAocXVhbnRpdHkgPj0gdC5taW5RdWFudGl0eSkgcGN0ID0gdC5kaXNjb3VudFBlcmNlbnQ7XG4gIHJldHVybiBwY3Q7XG59XG5cbi8qKlxuICogR3VhcmRyYWlsOiBhIGNvbWJvIHdob3NlIGNvbWJpbmVkIHByaWNlIGlzIOKJpSBpdHMgbWluaW11bS1jb21wb3NpdGlvbiBiYXNrZXQgZ3JhbnRzXG4gKiBubyBjcmVkaXQgKHRoZSBjcmVkaXQgY2xhbXBzIHRvICQwKSBhbmQgaXMgc2lsZW50bHkgaW5lcnQuIFdhcm4gbG91ZGx5IGluc3RlYWQgc28gYVxuICogbWlzY29uZmlndXJlZCBgQklMTElOR19DT01CT18qYCBvdmVycmlkZSBpcyBjYXVnaHQuIE5vbi1mYXRhbC5cbiAqL1xuZnVuY3Rpb24gd2Fybk9uTm9uRGlzY291bnRDb21ib3MoY29tYm9zOiBDb21ib0Rpc2NvdW50Q29uZmlnW10sIGJ1bmRsZXM6IEJ1bmRsZUNvbmZpZ1tdKTogdm9pZCB7XG4gIC8vIENvbWJvIG1lbWJlcnMgYXJlIGFsd2F5cyBidW5kbGVzOyByZXNvbHZlIHRoZWlyIChlbnYtZWZmZWN0aXZlKSB1bml0IHByaWNlcyBvbmNlLlxuICBjb25zdCBieUlkID0gbmV3IE1hcChidW5kbGVzLm1hcCgoYikgPT4gW2IuaWQsIGJdKSk7XG4gIGZvciAoY29uc3QgY29tYm8gb2YgY29tYm9zKSB7XG4gICAgZm9yIChjb25zdCBpbnRlcnZhbCBvZiBbJ21vbnRobHknLCAnYW5udWFsJ10gYXMgY29uc3QpIHtcbiAgICAgIC8vIFBvc3Qtdm9sdW1lIGJhc2lzIChtaXJyb3JzIGBjb21ib0Jhc2lzQ2VudHNgKTogYSBtZW1iZXIgd2l0aCB2b2x1bWUgdGllcnMgaXNcbiAgICAgIC8vIGJhc2lzZWQgb24gaXRzIERJU0NPVU5URUQgdW5pdCBhdCB0aGUgY29tYm8ncyBtaW5RdHksIHNvIHRoaXMgZ3VhcmRyYWlsIGNhbid0XG4gICAgICAvLyBzaWxlbnRseSBtaXNzIGEgY29tYm8gdGhhdCBncmFudHMgbm8gcmVhbCBjcmVkaXQgb25jZSB2b2x1bWUgaXMgYXBwbGllZC5cbiAgICAgIGNvbnN0IGJhc2tldCA9IGNvbWJvLmJ1bmRsZUlkcy5yZWR1Y2UoKHMsIGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IGIgPSBieUlkLmdldChpZCk7XG4gICAgICAgIGNvbnN0IHF0eSA9IGNvbWJvLm1pblF1YW50aXRpZXM/LltpZF0gPz8gMTtcbiAgICAgICAgY29uc3QgcmF3VW5pdCA9IGI/LnByaWNlc1tpbnRlcnZhbF0gPz8gMDtcbiAgICAgICAgY29uc3QgdW5pdCA9IE1hdGgucm91bmQoKHJhd1VuaXQgKiAoMTAwIC0gdm9sdW1lRGlzY291bnRQY3RBdChiLCBxdHkpKSkgLyAxMDApO1xuICAgICAgICByZXR1cm4gcyArIHVuaXQgKiBxdHk7XG4gICAgICB9LCAwKTtcbiAgICAgIGlmIChjb21iby5wcmljZXNbaW50ZXJ2YWxdID49IGJhc2tldCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oYFtiaWxsaW5nLWNvbmZpZ10gQ29tYm8gXCIke2NvbWJvLmlkfVwiICR7aW50ZXJ2YWx9IHByaWNlICR7Y29tYm8ucHJpY2VzW2ludGVydmFsXX0g4omlIG1lbWJlciBiYXNrZXQgJHtiYXNrZXR9OyBpdCBncmFudHMgbm8gZGlzY291bnQuYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IEJVTkRMRV9HQiA9IDEwMjQgKiAxMDI0ICogMTAyNDtcblxuLyoqXG4gKiBBcHBseSBhIHBlci1idW5kbGUgZ3JhbnQgb3ZlcnJpZGUuIEVhY2ggc3RhY2thYmxlIHBhY2sgZ3JhbnRzIGV4YWN0bHkgb25lXG4gKiBxdW90YSBkaW1lbnNpb24sIHNvIGBCSUxMSU5HX0JVTkRMRV88SUQ+X0dSQU5UYCByZXR1bmVzIHRoYXQgYW1vdW50IChlLmcuIG1ha2VcbiAqIHRoZSBQbHVnaW4gUGFjayBncmFudCArNTAgaW5zdGVhZCBvZiArMjUpIOKAlCBwYXJhbGxlbCB0byB0aGUgcHJpY2Ugb3ZlcnJpZGVzLlxuICogSWdub3JlZCBmb3IgbXVsdGktZGltZW5zaW9uIG9yIGZlYXR1cmUtb25seSAoZW1wdHktZ3JhbnQpIGJ1bmRsZXMsIGFuZCBmb3IgYVxuICogbWFsZm9ybWVkL25lZ2F0aXZlIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcHBseUdyYW50T3ZlcnJpZGUoaWQ6IHN0cmluZywgZ3JhbnRzOiBHcmFudE1hcCk6IEdyYW50TWFwIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnZbYEJJTExJTkdfQlVORExFXyR7aWQudG9VcHBlckNhc2UoKX1fR1JBTlRgXTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGdyYW50cyk7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnIHx8IGtleXMubGVuZ3RoICE9PSAxKSByZXR1cm4gZ3JhbnRzO1xuICBjb25zdCBuID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gIGlmIChOdW1iZXIuaXNOYU4obikgfHwgbiA8IDApIHJldHVybiBncmFudHM7XG4gIC8vIGBrZXlzYCBjYW1lIGZyb20gYSBHcmFudE1hcCwgc28gaXRzIHNvbGUga2V5IGlzIGEgUXVvdGFUaWVyTGltaXRzIGZpZWxkLlxuICByZXR1cm4geyBba2V5c1swXSBhcyBrZXlvZiBRdW90YVRpZXJMaW1pdHNdOiBuIH07XG59XG5cbi8qKlxuICogQXBwbHkgYSBwZXItYnVuZGxlIHRpZXItYXZhaWxhYmlsaXR5IG92ZXJyaWRlLiBgQklMTElOR19CVU5ETEVfPElEPl9USUVSU2AgaXMgYVxuICogSlNPTiBhcnJheSBvZiB0aWVyIElEcyB0aGF0IG1heSBwdXJjaGFzZSB0aGUgYnVuZGxlIChlLmcuIGBbXCJkZXZlbG9wZXJcIixcInByb1wiXWApXG4gKiDigJQgcGFyYWxsZWwgdG8gdGhlIHByaWNlL2dyYW50IG92ZXJyaWRlcy4gRmFsbHMgYmFjayB0byBgZGVmYXVsdFRpZXJzYCB3aGVuXG4gKiB1bnNldCwgbWFsZm9ybWVkLCBlbXB0eSwgb3IgY29udGFpbmluZyBhbiB1bmtub3duIHRpZXIuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5VGllcnNPdmVycmlkZShpZDogc3RyaW5nLCBkZWZhdWx0VGllcnM6IFF1b3RhVGllcltdKTogUXVvdGFUaWVyW10ge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudltgQklMTElOR19CVU5ETEVfJHtpZC50b1VwcGVyQ2FzZSgpfV9USUVSU2BdO1xuICBpZiAoIXJhdykgcmV0dXJuIGRlZmF1bHRUaWVycztcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZCkgfHwgcGFyc2VkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGRlZmF1bHRUaWVycztcbiAgICBjb25zdCB2YWxpZCA9IHBhcnNlZC5maWx0ZXIoKHQpOiB0IGlzIFF1b3RhVGllciA9PiB0eXBlb2YgdCA9PT0gJ3N0cmluZycgJiYgaXNWYWxpZFRpZXIodCkpO1xuICAgIHJldHVybiB2YWxpZC5sZW5ndGggPT09IHBhcnNlZC5sZW5ndGggPyB2YWxpZCA6IGRlZmF1bHRUaWVycztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGRlZmF1bHRUaWVycztcbiAgfVxufVxuXG50eXBlIFZvbHVtZVRpZXIgPSB7IG1pblF1YW50aXR5OiBudW1iZXI7IGRpc2NvdW50UGVyY2VudDogbnVtYmVyIH07XG5cbi8qKlxuICogQXBwbHkgYSBwZXItYnVuZGxlIHZvbHVtZS10aWVyIG92ZXJyaWRlLiBgQklMTElOR19CVU5ETEVfPElEPl9WT0xVTUVfVElFUlNgIGlzIGFcbiAqIEpTT04gYXJyYXkgb2YgYHsgbWluUXVhbnRpdHksIGRpc2NvdW50UGVyY2VudCB9YCAoZS5nLlxuICogYFt7XCJtaW5RdWFudGl0eVwiOjUsXCJkaXNjb3VudFBlcmNlbnRcIjoxMH1dYCkg4oCUIHBhcmFsbGVsIHRvIHRoZSBwcmljZS9ncmFudC90aWVyXG4gKiBvdmVycmlkZXMuIEZhbGxzIGJhY2sgdG8gYGRlZmF1bHRUaWVyc2Agd2hlbiB1bnNldCwgbWFsZm9ybWVkLCBvciBjb250YWluaW5nIGFuXG4gKiBpbnZhbGlkIGVudHJ5IChtaW5RdWFudGl0eSDiiaUgMSwgMCA8IGRpc2NvdW50UGVyY2VudCDiiaQgMTAwKS4gU29ydGVkIGFzY2VuZGluZyBieVxuICogbWluUXVhbnRpdHkgc28gdGhlIFwiaGlnaGVzdCBtYXRjaGluZyB0aWVyIHdpbnNcIiBsb29rdXAgaXMgZGV0ZXJtaW5pc3RpYy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlWb2x1bWVUaWVyc092ZXJyaWRlKGlkOiBzdHJpbmcsIGRlZmF1bHRUaWVycz86IFZvbHVtZVRpZXJbXSk6IFZvbHVtZVRpZXJbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W2BCSUxMSU5HX0JVTkRMRV8ke2lkLnRvVXBwZXJDYXNlKCl9X1ZPTFVNRV9USUVSU2BdO1xuICBjb25zdCBzb3J0QXNjID0gKHQ6IFZvbHVtZVRpZXJbXSkgPT4gWy4uLnRdLnNvcnQoKGEsIGIpID0+IGEubWluUXVhbnRpdHkgLSBiLm1pblF1YW50aXR5KTtcbiAgY29uc3QgZmFsbGJhY2sgPSAoKSA9PiAoZGVmYXVsdFRpZXJzID8gc29ydEFzYyhkZWZhdWx0VGllcnMpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFyYXcpIHJldHVybiBmYWxsYmFjaygpO1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyc2VkKSB8fCBwYXJzZWQubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAvLyBFYWNoIGVudHJ5OiBpbnRlZ2VyIG1pblF1YW50aXR5IOKJpSAxLCAwIDwgZGlzY291bnRQZXJjZW50IOKJpCAxMDAuXG4gICAgY29uc3QgdmFsaWQgPSBwYXJzZWQuZmlsdGVyKCh0KTogdCBpcyBWb2x1bWVUaWVyID0+XG4gICAgICB0ICYmIHR5cGVvZiB0Lm1pblF1YW50aXR5ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKHQubWluUXVhbnRpdHkpICYmIHQubWluUXVhbnRpdHkgPj0gMVxuICAgICAgJiYgdHlwZW9mIHQuZGlzY291bnRQZXJjZW50ID09PSAnbnVtYmVyJyAmJiB0LmRpc2NvdW50UGVyY2VudCA+IDAgJiYgdC5kaXNjb3VudFBlcmNlbnQgPD0gMTAwKTtcbiAgICBpZiAodmFsaWQubGVuZ3RoICE9PSBwYXJzZWQubGVuZ3RoKSByZXR1cm4gZmFsbGJhY2soKTtcbiAgICBjb25zdCBzb3J0ZWQgPSBzb3J0QXNjKHZhbGlkKTtcbiAgICAvLyBSZWplY3QgYSBub24tbW9ub3RvbmljIGN1cnZlOiBidXlpbmcgTU9SRSBtdXN0IG5ldmVyIGVhcm4gYSBTTUFMTEVSIGRpc2NvdW50LFxuICAgIC8vIGFuZCBkdXBsaWNhdGUgdGhyZXNob2xkcyBhcmUgYW1iaWd1b3VzLiAoYHZvbHVtZURpc2NvdW50UGN0YCBwaWNrcyB0aGUgbGFzdFxuICAgIC8vIHF1YWxpZnlpbmcgdGllciwgc28gYSBkZXNjZW5kaW5nIHBlcmNlbnQgd291bGQgcGVuYWxpemUgaGlnaGVyIHF1YW50aXRpZXMuKVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc29ydGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoc29ydGVkW2ldLm1pblF1YW50aXR5ID09PSBzb3J0ZWRbaSAtIDFdLm1pblF1YW50aXR5KSByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIGlmIChzb3J0ZWRbaV0uZGlzY291bnRQZXJjZW50IDw9IHNvcnRlZFtpIC0gMV0uZGlzY291bnRQZXJjZW50KSByZXR1cm4gZmFsbGJhY2soKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRlZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQdXJjaGFzYWJsZSBhZGQtb24gYnVuZGxlcyAoZG9jcy9iaWxsaW5nLWJ1bmRsZXMubWQgwqczKS4gR3JhbnRzIGFyZSBwZXItdW5pdFxuICogZGVsdGFzIG9uIFF1b3RhVGllckxpbWl0czsgcHJpY2VzIChjZW50cywgYEJJTExJTkdfQlVORExFXzxJRD5fTU9OVEhMWWAgL1xuICogYF9BTk5VQUxgKSwgdGhlIHNpbmdsZS1kaW1lbnNpb24gZ3JhbnQgYW1vdW50IChgQklMTElOR19CVU5ETEVfPElEPl9HUkFOVGApLFxuICogYW5kIHRoZSBwdXJjaGFzYWJsZS10aWVyIGxpc3QgKGBCSUxMSU5HX0JVTkRMRV88SUQ+X1RJRVJTYCkgYXJlIGFsbFxuICogZW52LW92ZXJyaWRhYmxlLiBBbm51YWwg4omIIDEww5cgbW9udGhseS5cbiAqL1xuZnVuY3Rpb24gbG9hZEJ1bmRsZXMoKTogQnVuZGxlQ29uZmlnW10ge1xuICBjb25zdCBiID0gKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgZ3JhbnRzOiBHcmFudE1hcCxcbiAgICBtb250aGx5OiBudW1iZXIsXG4gICAgYXZhaWxhYmxlRm9yVGllcnM6IFF1b3RhVGllcltdLFxuICAgIHNvcnRPcmRlcjogbnVtYmVyLFxuICAgIGV4dHJhOiB7IGZlYXR1cmVzPzogc3RyaW5nW107IHN0YWNrYWJsZT86IGJvb2xlYW47IG1heFF1YW50aXR5PzogbnVtYmVyOyByZXF1aXJlcz86IHN0cmluZ1tdOyByZXF1aXJlc0ZlYXR1cmVzPzogc3RyaW5nW107IHZvbHVtZVRpZXJzPzogVm9sdW1lVGllcltdIH0gPSB7fSxcbiAgKTogQnVuZGxlQ29uZmlnID0+IHtcbiAgICAvLyBSZXNvbHZlIG1vbnRobHkgZmlyc3Qgc28gdGhlIGFubnVhbCBmYWxsYmFjayB0cmFja3MgYSBgX01PTlRITFlgIG92ZXJyaWRlXG4gICAgLy8gKGFubnVhbCDiiYggMTDDlyB0aGUgKmVmZmVjdGl2ZSogbW9udGhseSwgbm90IHRoZSBoYXJkY29kZWQgZGVmYXVsdCkuXG4gICAgY29uc3QgcmVzb2x2ZWRNb250aGx5ID0gZW52Q2VudHMocHJvY2Vzcy5lbnZbYEJJTExJTkdfQlVORExFXyR7aWQudG9VcHBlckNhc2UoKX1fTU9OVEhMWWBdLCBtb250aGx5KTtcbiAgICBjb25zdCB2b2x1bWVUaWVycyA9IGFwcGx5Vm9sdW1lVGllcnNPdmVycmlkZShpZCwgZXh0cmEudm9sdW1lVGllcnMpO1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGdyYW50czogYXBwbHlHcmFudE92ZXJyaWRlKGlkLCBncmFudHMpLFxuICAgICAgLi4uKGV4dHJhLmZlYXR1cmVzID8geyBmZWF0dXJlczogZXh0cmEuZmVhdHVyZXMgfSA6IHt9KSxcbiAgICAgIC4uLihleHRyYS5tYXhRdWFudGl0eSAhPT0gdW5kZWZpbmVkID8geyBtYXhRdWFudGl0eTogZXh0cmEubWF4UXVhbnRpdHkgfSA6IHt9KSxcbiAgICAgIC4uLihleHRyYS5yZXF1aXJlcyA/IHsgcmVxdWlyZXM6IGV4dHJhLnJlcXVpcmVzIH0gOiB7fSksXG4gICAgICAuLi4oZXh0cmEucmVxdWlyZXNGZWF0dXJlcyA/IHsgcmVxdWlyZXNGZWF0dXJlczogZXh0cmEucmVxdWlyZXNGZWF0dXJlcyB9IDoge30pLFxuICAgICAgLi4uKHZvbHVtZVRpZXJzID8geyB2b2x1bWVUaWVycyB9IDoge30pLFxuICAgICAgcHJpY2VzOiB7XG4gICAgICAgIG1vbnRobHk6IHJlc29sdmVkTW9udGhseSxcbiAgICAgICAgYW5udWFsOiBlbnZDZW50cyhwcm9jZXNzLmVudltgQklMTElOR19CVU5ETEVfJHtpZC50b1VwcGVyQ2FzZSgpfV9BTk5VQUxgXSwgcmVzb2x2ZWRNb250aGx5ICogMTApLFxuICAgICAgfSxcbiAgICAgIHN0YWNrYWJsZTogZXh0cmEuc3RhY2thYmxlID8/IHRydWUsXG4gICAgICBhdmFpbGFibGVGb3JUaWVyczogYXBwbHlUaWVyc092ZXJyaWRlKGlkLCBhdmFpbGFibGVGb3JUaWVycyksXG4gICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgIHNvcnRPcmRlcixcbiAgICB9O1xuICB9O1xuXG4gIC8vIEJ1bmRsZXMgYXJlIHB1cmNoYXNhYmxlIG9uIGV2ZXJ5IFNFTEVDVEFCTEUgdGllciAoZXhjbHVkZXMgYHVubGltaXRlZGAsIHdoaWNoXG4gIC8vIGlzIHRoZSBiaWxsaW5nLW9mZiB0aWVyIGFuZCBidXlzIG5vdGhpbmcpIOKAlCBzbyB0aGlzIGlzIGV4YWN0bHkgU1RBTkRBUkRfVElFUlMuXG4gIGNvbnN0IEFMTDogUXVvdGFUaWVyW10gPSBbLi4uU1RBTkRBUkRfVElFUlNdO1xuICBjb25zdCBidW5kbGVzOiBCdW5kbGVDb25maWdbXSA9IFtcbiAgICAvLyBgc2VhdGAgYW5kIGBwaXBlbGluZV9wYWNrYCBhcmUgdGhlIHRpZXIgZGlmZmVyZW50aWF0b3JzLCBzbyBib3RoIGFyZSBUZWFtK1xuICAgIC8vIE9OTFkg4oCUIGEgc2luZ2xlLXNlYXQgRGV2ZWxvcGVyL1BybyBjYW4ndCBjaGVhcGx5IHN0YWNrIHNlYXRzL3BpcGVsaW5lcyB0b1xuICAgIC8vIHVuZGVyY3V0IFRlYW0gKDMgc2VhdHMgLyA2IHBpcGVsaW5lcyk7IHRoZXkgbXVzdCB1cGdyYWRlLiBgc2VhdGAgaXMgZ3JhbnVsYXJcbiAgICAvLyAocGVyLXNlYXQpIHdpdGggdm9sdW1lIHRpZXJzICg1LzE1LzQwIOKGkiAxMC8yMC8zMCUpLiBUaGUgb3RoZXIgY2FwYWNpdHkgcGFja3NcbiAgICAvLyAocGx1Z2luL2FwaS9haS9zdG9yYWdlKSBhcmUgTk9UIGRpZmZlcmVudGlhdG9ycywgc28gdGhleSBzdGF5IGFsbC10aWVyLlxuICAgIGIoJ3NlYXQnLCAnTWVtYmVyIFNlYXQnLCAnMSBhZGRpdGlvbmFsIG1lbWJlciBzZWF0JywgeyBzZWF0czogMSB9LCAxOTk5LCBbJ3RlYW0nLCAnZW50ZXJwcmlzZSddLCAwLFxuICAgICAgeyB2b2x1bWVUaWVyczogW3sgbWluUXVhbnRpdHk6IDUsIGRpc2NvdW50UGVyY2VudDogMTAgfSwgeyBtaW5RdWFudGl0eTogMTUsIGRpc2NvdW50UGVyY2VudDogMjAgfSwgeyBtaW5RdWFudGl0eTogNDAsIGRpc2NvdW50UGVyY2VudDogMzAgfV0gfSksXG4gICAgYigncGlwZWxpbmVfcGFjaycsICdQaXBlbGluZSBQYWNrICgrNSknLCAnNSBhZGRpdGlvbmFsIHBpcGVsaW5lcycsIHsgcGlwZWxpbmVzOiA1IH0sIDE1MDAsIFsndGVhbScsICdlbnRlcnByaXNlJ10sIDEpLFxuICAgIGIoJ3BsdWdpbl9wYWNrJywgJ1BsdWdpbiBQYWNrICgrMjUpJywgJzI1IGFkZGl0aW9uYWwgcGx1Z2lucycsIHsgcGx1Z2luczogMjUgfSwgMTAwMCwgQUxMLCAyKSxcbiAgICBiKCdhcGlfcGFjaycsICdBUEkgUGFjayAoKzEwMGspJywgJzEwMCwwMDAgYWRkaXRpb25hbCBBUEkgY2FsbHMgLyBwZXJpb2QnLCB7IGFwaUNhbGxzOiAxMDBfMDAwIH0sIDE5OTksIEFMTCwgMyksXG4gICAgYignYWlfcGFjaycsICdBSSBQYWNrICgrMi41ayknLCAnMiw1MDAgYWRkaXRpb25hbCBBSSBjYWxscyAvIHBlcmlvZCcsIHsgYWlDYWxsczogMjUwMCB9LCAxOTk5LCBBTEwsIDQpLFxuICAgIGIoJ3N0b3JhZ2VfcGFjaycsICdTdG9yYWdlIFBhY2sgKCsxMCBHQiknLCAnMTAgR0IgYWRkaXRpb25hbCByZWdpc3RyeSBzdG9yYWdlJywgeyBzdG9yYWdlQnl0ZXM6IDEwICogQlVORExFX0dCIH0sIDE5OTksIEFMTCwgNSksXG4gICAgLy8gU1NPIGlzIElOQ0xVREVEIGluIFRlYW0gKHNlZSBUSUVSX0ZFQVRVUkVTLnRlYW0pLCBzbyB0aGUgYWRkLW9uIGlzIFByby1vbmx5LlxuICAgIC8vIFRoZSBncmFudCBpcyBBRERJVElWRSBvbiBQcm8ncyBvd24gaWRwQ29uZmlncyBiYXNlbGluZSwgaGVuY2UgXCJhZGRpdGlvbmFsXCIuXG4gICAgYignc3NvJywgJ1NTTyAvIElkUCcsICdTaW5nbGUgc2lnbi1vbiArIDUgYWRkaXRpb25hbCBJZFAgY29uZmlncycsIHsgaWRwQ29uZmlnczogNSB9LCA0MDAwLCBbJ3BybyddLCA3LCB7IGZlYXR1cmVzOiBbJ3NzbyddLCBzdGFja2FibGU6IGZhbHNlIH0pLFxuICAgIC8vIERPUkEgLyBhZHZhbmNlZCBkZWxpdmVyeSBhbmFseXRpY3MuIElOQ0xVREVEIGluIEVudGVycHJpc2UgKFRJRVJfRkVBVFVSRVMpLFxuICAgIC8vIHNvIHRoZSBhZGQtb24gaXMgb2ZmZXJlZCB0byBldmVyeSBvdGhlciB0aWVyIChkZXZlbG9wZXIvcHJvL3RlYW0pLiBQcmljZWRcbiAgICAvLyBiZWxvdyBTU08gKCQ0MCkg4oCUIGFuIGFuYWx5dGljcyBzdXJmYWNlLCBub3QgdGhlIGVudGVycHJpc2UgaWRlbnRpdHkgZ2F0ZS5cbiAgICAvLyBMZWFkIHRpbWUgaXMgTUVBU1VSRUQgY29tbWl0IOKGkiBkZXBsb3kgKHJlcG9ydGluZydzIGRlcGxveSBldmVudHMpLCBub3QgYSBwcm94eS5cbiAgICBiKCdhZHZhbmNlZF9yZXBvcnRpbmcnLCAnQWR2YW5jZWQgUmVwb3J0aW5nIChET1JBKScsICdET1JBIGRlbGl2ZXJ5IG1ldHJpY3Mg4oCUIGRlcGxveW1lbnQgZnJlcXVlbmN5LCBsZWFkIHRpbWUgKGNvbW1pdCDihpIgZGVwbG95KSwgY2hhbmdlIGZhaWx1cmUgcmF0ZSwgTVRUUiwgcGVyZm9ybWFuY2UgYmFuZHMgKyB0cmVuZCcsIHt9LCAzMDAwLCBbJ2RldmVsb3BlcicsICdwcm8nLCAndGVhbSddLCA4LCB7IGZlYXR1cmVzOiBbJ2FkdmFuY2VkX3JlcG9ydGluZyddLCBzdGFja2FibGU6IGZhbHNlIH0pLFxuICAgIC8vIFBlci10ZWFtIHVzYWdlIGJyZWFrZG93biBhY3Jvc3MgdGhlIG9yZyDihpIgdGVhbSBzdWJ0cmVlLiBJTkNMVURFRCBpblxuICAgIC8vIEVudGVycHJpc2UgKFRJRVJfRkVBVFVSRVMpOyB0aGUgYWRkLW9uIGlzIG9mZmVyZWQgdG8gVGVhbSBvbmx5IOKAlCBEZXZlbG9wZXJcbiAgICAvLyBhbmQgUHJvIGNhbid0IG5lc3QgdGVhbXMgKFRFQU1fQ0FQQUJMRV9USUVSUyksIHNvIHRoZXJlJ2QgYmUgbm90aGluZyB0b1xuICAgIC8vIGJyZWFrIGRvd24uIFByaWNlZCBhdCAkMzAvbW8gKCQzMDAveXIpIOKAlCBwYXJpdHkgd2l0aCBET1JBLCBpdHMgYW5hbHl0aWNzXG4gICAgLy8gc2libGluZy4gT3ZlcnJpZGFibGUgdmlhIEJJTExJTkdfQlVORExFX1RFQU1fVVNBR0VfQU5BTFlUSUNTX01PTlRITFkvX0FOTlVBTC5cbiAgICBiKCd0ZWFtX3VzYWdlX2FuYWx5dGljcycsICdUZWFtIFVzYWdlIEFuYWx5dGljcycsICdQZXItdGVhbSB1c2FnZSBicmVha2Rvd24gYWNyb3NzIHRoZSBvcmcg4oaSIHRlYW0gc3VidHJlZSAoYWxsIHF1b3RhIGRpbWVuc2lvbnMpJywge30sIDMwMDAsIFsndGVhbSddLCA5LCB7IGZlYXR1cmVzOiBbJ3RlYW1fdXNhZ2VfYW5hbHl0aWNzJ10sIHN0YWNrYWJsZTogZmFsc2UgfSksXG4gICAgLy8gUmV0ZW50aW9uIHBhY2tzIChkb2NzL2JpbGxpbmctYnVuZGxlcy5tZCkuIFN0YWNrYWJsZSBjYXBhY2l0eSBwYWNrcyB0aGF0XG4gICAgLy8gcmFpc2UgdGhlIHJlcG9ydGluZyByZXRlbnRpb24gZW50aXRsZW1lbnQgYmlsbGluZyBzeW5jcyB0byByZXBvcnRpbmcnc1xuICAgIC8vIGBkb3JhX3NldHRpbmdzYC4gTk9UIHF1b3RhLW1ldGVyZWQgZmxvdyDigJQgYGV2ZW50UmV0ZW50aW9uRGF5c2AvYGRvcmFSZXRlbnRpb25EYXlzYFxuICAgIC8vIGFyZSBhYnNlbnQgZnJvbSBWQUxJRF9RVU9UQV9UWVBFUywgc28gdGhleSBuZXZlciByaWRlIHRoZSBxdW90YS1zZXJ2aWNlIGxlZy5cbiAgICAvLyBTdGFuZGFyZCBSZXRlbnRpb24gUGFjazogKzkwZCBzdGFuZGFyZC1ldmVudCByZXRlbnRpb24gKGJhc2UgMzAg4oaSIDEyMCDihpIgMjEw4oCmKS5cbiAgICAvLyBDYXBwZWQgYXQgNyAoMzAgKyA3w5c5MCA9IDY2MCDiiaQgdGhlIDczMC1kYXkgcmV0ZW50aW9uIGNlaWxpbmcpLlxuICAgIGIoJ3JldGVudGlvbl9wYWNrJywgJ1N0YW5kYXJkIFJldGVudGlvbiBQYWNrICgrOTBkKScsICc5MCBhZGRpdGlvbmFsIGRheXMgb2Ygc3RhbmRhcmQgcGlwZWxpbmUtZXZlbnQgcmV0ZW50aW9uJywgeyBldmVudFJldGVudGlvbkRheXM6IDkwIH0sIDE1MDAsIEFMTCwgMTAsIHsgbWF4UXVhbnRpdHk6IDcgfSksXG4gICAgLy8gRE9SQSBIaXN0b3J5IFBhY2s6ICszNjVkIERPUkEgcmV0ZW50aW9uIEFORCBwZXItb3JnIHJlcG9ydC1xdWVyeSB3aW5kb3cgKHRoZVxuICAgIC8vIHdpbmRvdyBjYXAgdHJhY2tzIGRvcmFSZXRlbnRpb25EYXlzKS4gT25seSBtZWFuaW5nZnVsIHdpdGggQWR2YW5jZWQgUmVwb3J0aW5nXG4gICAgLy8g4oCUIElOQ0xVREVEIGluIEVudGVycHJpc2UsIGFuIGFkZC1vbiBvbiBkZXZlbG9wZXIvcHJvL3RlYW0g4oCUIHNvIGl0XG4gICAgLy8gYHJlcXVpcmVzRmVhdHVyZXNgIGl0ICh0aGUgdGllciBPUiBhIGhlbGQgYnVuZGxlIHNhdGlzZmllcyBpdCkuIENhcHBlZCBhdCAxXG4gICAgLy8gKDE4MCArIDM2NSA9IDU0NSDiiaQgdGhlIDczMC1kYXkgcmV0ZW50aW9uIGNlaWxpbmcpLlxuICAgIGIoJ2RvcmFfaGlzdG9yeV9wYWNrJywgJ0RPUkEgSGlzdG9yeSBQYWNrICgrMzY1ZCknLCAnMzY1IGFkZGl0aW9uYWwgZGF5cyBvZiBET1JBIGhpc3RvcnkgKyByZXBvcnQtcXVlcnkgd2luZG93IChyZXF1aXJlcyBBZHZhbmNlZCBSZXBvcnRpbmcpJywgeyBkb3JhUmV0ZW50aW9uRGF5czogMzY1IH0sIDMwMDAsIEFMTCwgMTEsIHsgbWF4UXVhbnRpdHk6IDEsIHJlcXVpcmVzRmVhdHVyZXM6IFsnYWR2YW5jZWRfcmVwb3J0aW5nJ10gfSksXG4gICAgLy8gQ29tcGxpYW5jZSBjb250ZW50IGFkZC1vbnMgKGRvY3MvcGxhbnMvY29tcGxpYW5jZS1hZGRvbnMubWQpLiBGZWF0dXJlIGJ1bmRsZXNcbiAgICAvLyBnYXRpbmcgYWNjZXNzIHRvIGN1cmF0ZWQgc3lzdGVtLW9yZyBwdWJsaXNoZWQgcnVsZSBzZXRzLiBJTkNMVURFRCBpblxuICAgIC8vIEVudGVycHJpc2UvVW5saW1pdGVkICh2aWEgQUxMX0ZFQVRVUkVfRkxBR1MpOyBzb2xkIHRvIERldmVsb3Blci9Qcm8vVGVhbS5cbiAgICAvLyBTdGFuZGFyZCA9IH4yMCBDSS9DRCBiZXN0LXByYWN0aWNlIHJ1bGVzLiBBZHZhbmNlZCA9IFNPQzIvUENJL0NJUyBmcmFtZXdvcmtcbiAgICAvLyBsaWJyYXJpZXM7IFJFUVVJUkVTIFN0YW5kYXJkIChvciBidXkgdGhlIFN1aXRlIGNvbWJvIGZvciBib3RoIGF0IDMwJSBvZmYpLlxuICAgIGIoJ2NvbXBsaWFuY2Vfc3RhbmRhcmQnLCAnU3RhbmRhcmQgQ29tcGxpYW5jZScsICdDdXJhdGVkIENJL0NEIGJlc3QtcHJhY3RpY2UgY29tcGxpYW5jZSBydWxlcycsIHt9LCAyOTkwLCBbJ2RldmVsb3BlcicsICdwcm8nLCAndGVhbSddLCAxMiwgeyBmZWF0dXJlczogWydjb21wbGlhbmNlX3N0YW5kYXJkJ10sIHN0YWNrYWJsZTogZmFsc2UgfSksXG4gICAgYignY29tcGxpYW5jZV9hZHZhbmNlZCcsICdBZHZhbmNlZCBDb21wbGlhbmNlJywgJ0N1cmF0ZWQgZnJhbWV3b3JrIGNvbXBsaWFuY2UgbGlicmFyaWVzIChTT0MyIC8gUENJLURTUyAvIENJUyknLCB7fSwgOTk5MCwgWydkZXZlbG9wZXInLCAncHJvJywgJ3RlYW0nXSwgMTMsIHsgZmVhdHVyZXM6IFsnY29tcGxpYW5jZV9hZHZhbmNlZCddLCBzdGFja2FibGU6IGZhbHNlLCByZXF1aXJlczogWydjb21wbGlhbmNlX3N0YW5kYXJkJ10gfSksXG4gIF07XG4gIGFzc2VydEJ1bmRsZVJlcXVpcmVzVmFsaWQoYnVuZGxlcyk7XG4gIHJldHVybiBidW5kbGVzO1xufVxuXG4vKipcbiAqIENvbmZpZy1sb2FkIGd1YXJkcmFpbCBmb3IgdGhlIGByZXF1aXJlc2AgLyBgcmVxdWlyZXNGZWF0dXJlc2AgcHJlcmVxdWlzaXRlcy4gQVxuICogYHJlcXVpcmVzYCBlbnRyeSB0aGF0IGRvZXNuJ3QgcmVzb2x2ZSB0byBhbiBBQ1RJVkUgYnVuZGxlIOKAlCBvciB0aGF0IHBhcnRpY2lwYXRlc1xuICogaW4gYSBjeWNsZSDigJQgc2lsZW50bHkgbWFrZXMgdGhlIHJlZmVyZW5jaW5nIGJ1bmRsZSB1bnB1cmNoYXNhYmxlICh0aGUgYWRkb25cbiAqIHJvdXRlIHJlamVjdHMgd2l0aCA0MDAgZm9yZXZlciBiZWNhdXNlIHRoZSBwcmVyZXF1aXNpdGUgY2FuIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQpLiBDYXRjaCBpdCBhdCBsb2FkIHdpdGggYSBjbGVhciBlcnJvciByYXRoZXIgdGhhbiBzaGlwcGluZyBhIGRlYWQgU0tVLlxuICpcbiAqICAtIEV2ZXJ5IGlkIGluIGEgYnVuZGxlJ3MgYHJlcXVpcmVzYCBNVVNUIG5hbWUgYW4gYWN0aXZlIGJ1bmRsZSBpbiB0aGUgY2F0YWxvZy5cbiAqICAtIFRoZSBgcmVxdWlyZXNgIGdyYXBoIE1VU1QgYmUgYWN5Y2xpYyAoYSDihpIgYiDihpIgYSBjYW4gbmV2ZXIgYmUgc2F0aXNmaWVkKS5cbiAqICAtIEV2ZXJ5IGByZXF1aXJlc0ZlYXR1cmVzYCBlbnRyeSBNVVNUIGJlIGEgcmVhbCBmZWF0dXJlIGZsYWcsIGF0dGFpbmFibGUgb25cbiAqICAgIEVWRVJZIHRpZXIgdGhlIGJ1bmRsZSBpcyBzb2xkIHRvIOKAlCBlaXRoZXIgdGllci1pbmNsdWRlZCAoYFRJRVJfRkVBVFVSRVNgKSBvclxuICogICAgZ3JhbnRlZCBieSBhbiBhY3RpdmUgYnVuZGxlIG9mZmVyZWQgb24gdGhhdCBzYW1lIHRpZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRCdW5kbGVSZXF1aXJlc1ZhbGlkKGJ1bmRsZXM6IEJ1bmRsZUNvbmZpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2ZSA9IG5ldyBNYXAoYnVuZGxlcy5maWx0ZXIoKGIpID0+IGIuaXNBY3RpdmUpLm1hcCgoYikgPT4gW2IuaWQsIGJdKSk7XG5cbiAgLy8gMS4gVmFsaWRpdHk6IGV2ZXJ5IHJlcXVpcmVzIGlkIHJlc29sdmVzIHRvIGFuIGFjdGl2ZSBidW5kbGUuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICBmb3IgKGNvbnN0IHJlcUlkIG9mIGJ1bmRsZS5yZXF1aXJlcyA/PyBbXSkge1xuICAgICAgaWYgKCFhY3RpdmUuaGFzKHJlcUlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFtiaWxsaW5nLWNvbmZpZ10gQnVuZGxlIFwiJHtidW5kbGUuaWR9XCIgcmVxdWlyZXMgXCIke3JlcUlkfVwiLCB3aGljaCBpcyBub3QgYW4gYWN0aXZlIGJ1bmRsZSBpbiB0aGUgY2F0YWxvZyDigJQgaXQgd291bGQgYmUgcGVybWFuZW50bHkgdW5wdXJjaGFzYWJsZS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIDFiLiBGZWF0dXJlIHByZXJlcXVpc2l0ZXM6IGEgcmVhbCBmbGFnLCBhdHRhaW5hYmxlIG9uIGV2ZXJ5IHNvbGQtdG8gdGllci5cbiAgZm9yIChjb25zdCBidW5kbGUgb2YgYnVuZGxlcykge1xuICAgIGZvciAoY29uc3QgZmxhZyBvZiBidW5kbGUucmVxdWlyZXNGZWF0dXJlcyA/PyBbXSkge1xuICAgICAgaWYgKCFpc1ZhbGlkRmVhdHVyZUZsYWcoZmxhZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbYmlsbGluZy1jb25maWddIEJ1bmRsZSBcIiR7YnVuZGxlLmlkfVwiIHJlcXVpcmVzRmVhdHVyZXMgXCIke2ZsYWd9XCIsIHdoaWNoIGlzIG5vdCBhIGZlYXR1cmUgZmxhZy5gKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdGllciBvZiBidW5kbGUuYXZhaWxhYmxlRm9yVGllcnMpIHtcbiAgICAgICAgY29uc3QgdGllckluY2x1ZGVzID0gKFRJRVJfRkVBVFVSRVNbdGllcl0gPz8gW10pLmluY2x1ZGVzKGZsYWcpO1xuICAgICAgICBjb25zdCBidXlhYmxlID0gWy4uLmFjdGl2ZS52YWx1ZXMoKV0uc29tZSgobykgPT4gby5hdmFpbGFibGVGb3JUaWVycy5pbmNsdWRlcyh0aWVyKSAmJiAoby5mZWF0dXJlcyA/PyBbXSkuaW5jbHVkZXMoZmxhZykpO1xuICAgICAgICBpZiAoIXRpZXJJbmNsdWRlcyAmJiAhYnV5YWJsZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbYmlsbGluZy1jb25maWddIEJ1bmRsZSBcIiR7YnVuZGxlLmlkfVwiIHJlcXVpcmVzIGZlYXR1cmUgXCIke2ZsYWd9XCIsIHdoaWNoIHRoZSAke3RpZXJ9IHRpZXIgbmVpdGhlciBpbmNsdWRlcyBub3IgY2FuIGJ1eSDigJQgaXQgd291bGQgYmUgcGVybWFuZW50bHkgdW5wdXJjaGFzYWJsZSB0aGVyZS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAyLiBBY3ljbGljaXR5OiBERlMgb3ZlciB0aGUgcmVxdWlyZXMgZWRnZXMsIHRyYWNraW5nIHRoZSBjdXJyZW50IHBhdGguXG4gIGNvbnN0IFZJU0lUSU5HID0gMTtcbiAgY29uc3QgRE9ORSA9IDI7XG4gIGNvbnN0IHN0YXRlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBjb25zdCB2aXNpdCA9IChpZDogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHMgPSBzdGF0ZS5nZXQoaWQpO1xuICAgIGlmIChzID09PSBET05FKSByZXR1cm47XG4gICAgaWYgKHMgPT09IFZJU0lUSU5HKSB7XG4gICAgICBjb25zdCBjeWNsZSA9IFsuLi5wYXRoLnNsaWNlKHBhdGguaW5kZXhPZihpZCkpLCBpZF0uam9pbignIC0+ICcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbYmlsbGluZy1jb25maWddIEJ1bmRsZSBcInJlcXVpcmVzXCIgY3ljbGUgZGV0ZWN0ZWQ6ICR7Y3ljbGV9LmApO1xuICAgIH1cbiAgICBzdGF0ZS5zZXQoaWQsIFZJU0lUSU5HKTtcbiAgICBmb3IgKGNvbnN0IHJlcUlkIG9mIGFjdGl2ZS5nZXQoaWQpPy5yZXF1aXJlcyA/PyBbXSkge1xuICAgICAgdmlzaXQocmVxSWQsIFsuLi5wYXRoLCBpZF0pO1xuICAgIH1cbiAgICBzdGF0ZS5zZXQoaWQsIERPTkUpO1xuICB9O1xuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGFjdGl2ZS5rZXlzKCkpIHtcbiAgICB2aXNpdChidW5kbGUsIFtdKTtcbiAgfVxufVxuIl19
@@ -273,7 +273,7 @@ export interface BundleConfig {
273
273
  * constrained to real quota fields so a typo is a compile error (was
274
274
  * `Record<string, number>`, where a misspelled key was silently unenforceable). */
275
275
  readonly grants: Readonly<Partial<Record<keyof QuotaTierLimits, number>>>;
276
- /** Feature flags granted by a feature bundle (e.g. `audit_log`). */
276
+ /** Feature flags granted by a feature bundle (e.g. `sso`). */
277
277
  readonly features?: readonly string[];
278
278
  /** Per-unit price (cents). Stripe multiplies by quantity. */
279
279
  readonly prices: BillingPlanPrices;
@@ -308,6 +308,17 @@ export interface BundleConfig {
308
308
  * Absent ⇒ no prerequisite.
309
309
  */
310
310
  readonly requires?: readonly string[];
311
+ /**
312
+ * Prerequisite FEATURE flags the account must hold — from its plan tier
313
+ * (`TIER_FEATURES`) or from a feature bundle it holds after the change — before
314
+ * this bundle can be added. Distinct from {@link requires} because a feature can
315
+ * be tier-included (no bundle to name): e.g. `dora_history_pack` needs
316
+ * `advanced_reporting`, which Enterprise includes and lower tiers buy as an
317
+ * add-on. Enforced by the addon purchase/preview route (400 when unmet), and a
318
+ * held bundle whose feature prerequisite disappears (its granting bundle removed,
319
+ * or a downgrade to a tier without it) is cascade-removed. Absent ⇒ none.
320
+ */
321
+ readonly requiresFeatures?: readonly string[];
311
322
  readonly isActive: boolean;
312
323
  readonly sortOrder: number;
313
324
  }
@@ -1,4 +1,4 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export {};
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9jb25maWctdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVGllciwgUXVvdGFUaWVyTGltaXRzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuXG4vKipcbiAqIFR5cGUtc2FmZSBjb25maWd1cmF0aW9uIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZyB7XG4gIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyQ29uZmlnO1xuICByZWFkb25seSBhdXRoOiBBdXRoQ29uZmlnO1xuICByZWFkb25seSBkYXRhYmFzZTogRGF0YWJhc2VDb25maWc7XG4gIHJlYWRvbmx5IHJlZ2lzdHJ5OiBSZWdpc3RyeUNvbmZpZztcbiAgcmVhZG9ubHkgcGx1Z2luQnVpbGQ6IFBsdWdpbkJ1aWxkQ29uZmlnO1xuICByZWFkb25seSBkb2NrZXJDb25maWc6IEJ1aWxkQ29uZmlnO1xuICByZWFkb25seSBvYnNlcnZhYmlsaXR5OiBPYnNlcnZhYmlsaXR5Q29uZmlnO1xuICByZWFkb25seSBjb21wbGlhbmNlOiBDb21wbGlhbmNlQ29uZmlnO1xuICByZWFkb25seSBhd3M6IEFXU0NvbmZpZztcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0OiBSYXRlTGltaXRDb25maWc7XG4gIHJlYWRvbmx5IGJpbGxpbmc6IEJpbGxpbmdDb25maWc7XG59XG5cbi8qKiBFeHByZXNzIHNlcnZlciBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJDb25maWcge1xuICAvKiogSFRUUCBsaXN0ZW4gcG9ydCAoZW52OiBgUE9SVGApLiAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvcnM6IHtcbiAgICAvKiogV2hldGhlciB0byBpbmNsdWRlIGNyZWRlbnRpYWxzIGluIENPUlMgcmVzcG9uc2VzIChlbnY6IGBDT1JTX0NSRURFTlRJQUxTYCkuICovXG4gICAgcmVhZG9ubHkgY3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgLyoqIEFsbG93ZWQgb3JpZ2luKHMpIOKAlCBzaW5nbGUgc3RyaW5nLCBhcnJheSwgb3IgYCcqJ2AgKGVudjogYENPUlNfT1JJR0lOYCkuICovXG4gICAgcmVhZG9ubHkgb3JpZ2luOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgfTtcbiAgLyoqIE51bWJlciBvZiByZXZlcnNlIHByb3h5IGhvcHMgdG8gdHJ1c3QgKGVudjogYFRSVVNUX1BST1hZYCkuICovXG4gIHJlYWRvbmx5IHRydXN0UHJveHk6IG51bWJlcjtcbiAgLyoqIEZyb250ZW5kIGJhc2UgVVJMLCB1c2VkIGFzIENPUlMgZmFsbGJhY2sgKGVudjogYFBMQVRGT1JNX0JBU0VfVVJMYCkuICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtVXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGh0dHBDbGllbnQ6IHtcbiAgICAvKiogRGVmYXVsdCBIVFRQIHJlcXVlc3QgdGltZW91dCBpbiBtcyAoZW52OiBgSFRUUF9DTElFTlRfVElNRU9VVGApLiAqL1xuICAgIHJlYWRvbmx5IHRpbWVvdXQ6IG51bWJlcjtcbiAgICAvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBmb3IgZmFpbGVkIHJlcXVlc3RzIChlbnY6IGBIVFRQX0NMSUVOVF9NQVhfUkVUUklFU2ApLiAqL1xuICAgIHJlYWRvbmx5IG1heFJldHJpZXM6IG51bWJlcjtcbiAgICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbXMgKGVudjogYEhUVFBfQ0xJRU5UX1JFVFJZX0RFTEFZX01TYCkuICovXG4gICAgcmVhZG9ubHkgcmV0cnlEZWxheU1zOiBudW1iZXI7XG4gIH07XG4gIHJlYWRvbmx5IHNzZToge1xuICAgIC8qKiBNYXggU1NFIGNsaWVudHMgcGVyIHJlcXVlc3QgKGVudjogYFNTRV9NQVhfQ0xJRU5UU19QRVJfUkVRVUVTVGApLiAqL1xuICAgIHJlYWRvbmx5IG1heENsaWVudHNQZXJSZXF1ZXN0OiBudW1iZXI7XG4gICAgLyoqIFNTRSBjbGllbnQgdGltZW91dCBpbiBtcyAoZW52OiBgU1NFX0NMSUVOVF9USU1FT1VUX01TYCkuICovXG4gICAgcmVhZG9ubHkgY2xpZW50VGltZW91dE1zOiBudW1iZXI7XG4gICAgLyoqIFNTRSBjbGVhbnVwIGludGVydmFsIGluIG1zIChlbnY6IGBTU0VfQ0xFQU5VUF9JTlRFUlZBTF9NU2ApLiAqL1xuICAgIHJlYWRvbmx5IGNsZWFudXBJbnRlcnZhbE1zOiBudW1iZXI7XG4gIH07XG4gIHJlYWRvbmx5IHNlcnZpY2VzOiB7XG4gICAgcmVhZG9ubHkgcGx1Z2luSG9zdDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBsdWdpblBvcnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBwaXBlbGluZUhvc3Q6IHN0cmluZztcbiAgICByZWFkb25seSBwaXBlbGluZVBvcnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBtZXNzYWdlSG9zdDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IG1lc3NhZ2VQb3J0OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcGxhdGZvcm1Ib3N0OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcGxhdGZvcm1Qb3J0OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgY29tcGxpYW5jZUhvc3Q6IHN0cmluZztcbiAgICByZWFkb25seSBjb21wbGlhbmNlUG9ydDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGJpbGxpbmdIb3N0OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYmlsbGluZ1BvcnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBiaWxsaW5nVGltZW91dDogbnVtYmVyO1xuICB9O1xufVxuXG4vKiogQXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGdlbmVyaWMgc2VydmljZSBzY2FmZm9sZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aENvbmZpZyB7XG4gIHJlYWRvbmx5IGp3dDoge1xuICAgIC8qKlxuICAgICAqIFRva2VuIGxpZmV0aW1lIGluIHNlY29uZHMgKGVudjogYEpXVF9FWFBJUkVTX0lOYCkuXG4gICAgICpcbiAgICAgKiBUaGVyZSBpcyBubyBKV1QgU0VDUkVUIGhlcmUgYW55IG1vcmUuIEV2ZXJ5IHRva2VuIGlzIGFzeW1tZXRyaWM6IGEgdXNlclxuICAgICAqIHRva2VuIGlzIEVTMjU2IHNpZ25lZCBieSBwbGF0Zm9ybSBhbG9uZSAoYHNlcnZpY2VzL3Rva2VuLXNpZ25pbmdgKSwgYW5kIGFuXG4gICAgICogaW50ZXJuYWwgc2VydmljZSB0b2tlbiBpcyBFUzI1NiBzaWduZWQgYnkgdGhlIENBTExJTkcgc2VydmljZSB3aXRoIGl0cyBvd25cbiAgICAgKiBrZXkgKCMxNCwgYFNFUlZJQ0VfU0lHTklOR19LRVlfRklMRWAgLyBgU0VSVklDRV9LRVlfQlVORExFX0ZJTEVgKS5cbiAgICAgKi9cbiAgICByZWFkb25seSBleHBpcmVzSW46IG51bWJlcjtcbiAgICAvKiogYmNyeXB0IHNhbHQgcm91bmRzIGZvciBwYXNzd29yZCBoYXNoaW5nIChlbnY6IGBCQ1JZUFRfU0FMVF9ST1VORFNgKS4gKi9cbiAgICByZWFkb25seSBzYWx0Um91bmRzOiBudW1iZXI7XG4gIH07XG4gIHJlYWRvbmx5IHJlZnJlc2hUb2tlbjoge1xuICAgIC8qKlxuICAgICAqIFRva2VuIGxpZmV0aW1lIGluIHNlY29uZHMgKGVudjogYFJFRlJFU0hfVE9LRU5fRVhQSVJFU19JTmApLiBUaGVyZSBpcyBub1xuICAgICAqIHJlZnJlc2gtdG9rZW4gU0VDUkVUIGFueSBtb3JlOiBhIHJlZnJlc2ggdG9rZW4gaXMgYSB1c2VyIHRva2VuLCBzaWduZWRcbiAgICAgKiB3aXRoIHBsYXRmb3JtJ3MgRVMyNTYga2V5IGxpa2UgZXZlcnkgb3RoZXIgY3JlZGVudGlhbCBhIHBlcnNvbiBob2xkcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBleHBpcmVzSW46IG51bWJlcjtcbiAgfTtcbn1cblxuLyoqIFBvc3RncmVTUUwgYW5kIERyaXp6bGUgT1JNIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlQ29uZmlnIHtcbiAgcmVhZG9ubHkgcG9zdGdyZXM6IHtcbiAgICAvKiogUG9zdGdyZVNRTCBob3N0IChlbnY6IGBEQl9IT1NUYCkuICovXG4gICAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICAgIC8qKiBQb3N0Z3JlU1FMIHBvcnQgKGVudjogYERCX1BPUlRgKS4gKi9cbiAgICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gICAgLyoqIERhdGFiYXNlIG5hbWUgKGVudjogYERBVEFCQVNFYCkuICovXG4gICAgcmVhZG9ubHkgZGF0YWJhc2U6IHN0cmluZztcbiAgICAvKiogRGF0YWJhc2UgdXNlciAoZW52OiBgREJfVVNFUmApLiAqL1xuICAgIHJlYWRvbmx5IHVzZXI6IHN0cmluZztcbiAgICAvKiogRGF0YWJhc2UgcGFzc3dvcmQgKGVudjogYERCX1BBU1NXT1JEYCkuICovXG4gICAgcmVhZG9ubHkgcGFzc3dvcmQ6IHN0cmluZztcbiAgfTtcbiAgcmVhZG9ubHkgZHJpenpsZToge1xuICAgIC8qKiBNYXhpbXVtIGNvbm5lY3Rpb24gcG9vbCBzaXplIChlbnY6IGBEUklaWkxFX01BWF9QT09MX1NJWkVgKS4gKi9cbiAgICByZWFkb25seSBtYXhQb29sU2l6ZTogbnVtYmVyO1xuICAgIC8qKiBJZGxlIGNvbm5lY3Rpb24gdGltZW91dCBpbiBtcyAoZW52OiBgRFJJWlpMRV9JRExFX1RJTUVPVVRfTUlMTElTYCkuICovXG4gICAgcmVhZG9ubHkgaWRsZVRpbWVvdXRNaWxsaXM6IG51bWJlcjtcbiAgICAvKiogTmV3IGNvbm5lY3Rpb24gdGltZW91dCBpbiBtcyAoZW52OiBgRFJJWlpMRV9DT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTYCkuICovXG4gICAgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeUNvbmZpZyB7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogSG9zdC9wb3J0IGFuIE9VVC1PRi1DTFVTVEVSIGNsaWVudCAobm90YWJseSBBV1MgQ29kZUJ1aWxkKSB1c2VzIHRvIHB1bGxcbiAgICogcGx1Z2luIGltYWdlcywgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluLWNsdXN0ZXIgYGhvc3RgL2Bwb3J0YC4gVGhlXG4gICAqIGluLWNsdXN0ZXIgYHJlZ2lzdHJ5OjUwMDBgIENsdXN0ZXJJUCBpc24ndCByZXNvbHZhYmxlIGZyb20gdGhlIFZQQywgc28gdGhlXG4gICAqIHN5bnRoZXNpemVkIENvZGVCdWlsZCBpbWFnZSBVUkkgbXVzdCBwb2ludCBhdCB0aGUgcHVibGljIGdhdGV3YXkgaW5zdGVhZC5cbiAgICogRW52OiBgSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUYCAvIGBJTUFHRV9SRUdJU1RSWV9QVUxMX1BPUlRgLiBPcHRpb25hbDtcbiAgICogY29uc3VtZXJzIGZhbGwgYmFjayB0byBgaG9zdGAvYHBvcnRgIHdoZW4gdW5zZXQgKHNpbmdsZS1ob3N0IC9cbiAgICogaW4tY2x1c3Rlci1vbmx5IGRlcGxveXMpLiBgbG9hZFJlZ2lzdHJ5Q29uZmlnYCBhbHdheXMgcG9wdWxhdGVzIHRoZW0uXG4gICAqL1xuICByZWFkb25seSBwdWxsSG9zdD86IHN0cmluZztcbiAgcmVhZG9ubHkgcHVsbFBvcnQ/OiBudW1iZXI7XG4gIC8qKiBEb2NrZXIgbmV0d29yayBmb3IgYnVpbGQvcHVzaCAoZW1wdHkgc3RyaW5nID0gZGVmYXVsdCkuICovXG4gIHJlYWRvbmx5IG5ldHdvcms6IHN0cmluZztcbiAgLyoqXG4gICAqIEJ1aWxkS2l0IHRhbGtzIHRvIHRoZSByZWdpc3RyeSBvdmVyIHBsYWluIEhUVFAgd2hlbiB0cnVlOyBIVFRQUyB3aXRoIHRoZVxuICAgKiBzeXN0ZW0gQ0EgYnVuZGxlIG90aGVyd2lzZS4gRW52OiBgSU1BR0VfUkVHSVNUUllfSFRUUGAgKGRlZmF1bHRzIHRydWUg4oCUXG4gICAqIHRoZSBpbi1jbHVzdGVyIHJlZ2lzdHJ5IGhhcyBubyBUTFMpLlxuICAgKi9cbiAgcmVhZG9ubHkgaHR0cDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5CdWlsZENvbmZpZyB7XG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heEF0dGVtcHRzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJhY2tvZmZEZWxheU1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHdvcmtlclRpbWVvdXRNczogbnVtYmVyO1xuICByZWFkb25seSB0ZW1wRGlyTWF4QWdlTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgZGxxTWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgZGxxQmFja29mZkJhc2VNczogbnVtYmVyO1xuICByZWFkb25seSBkbHFNYXhTaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRDb25maWcge1xuICAvKiogUm9vdCBkaXJlY3RvcnkgZm9yIGJ1aWxkIHRlbXAgZmlsZXMuICovXG4gIHJlYWRvbmx5IHRlbXBSb290OiBzdHJpbmc7XG4gIC8qKiBCdWlsZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXI7XG4gIC8qKiBQdXNoIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICByZWFkb25seSBwdXNoVGltZW91dE1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBidWlsZGtpdGQgc29ja2V0IHRoZSBwbHVnaW4ncyBgYnVpbGRjdGxgIGNvbm5lY3RzIHRvLiBJbiBrOHNcbiAgICogYW5kIGNvbXBvc2UgdGhpcyBpcyBhIHNoYXJlZCBlbXB0eURpci90bXBmcyB2b2x1bWUgbW91bnRlZCBmcm9tIHRoZVxuICAgKiBidWlsZGtpdGQgc2lkZWNhci5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxka2l0QWRkcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9ic2VydmFiaWxpdHlDb25maWcge1xuICByZWFkb25seSBsb2dMZXZlbDogc3RyaW5nO1xuICByZWFkb25seSBsb2dGb3JtYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdHJhY2luZzoge1xuICAgIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlQ29uZmlnIHtcbiAgcmVhZG9ubHkgc2NhblNjaGVkdWxlckludGVydmFsTXM6IG51bWJlcjtcbiAgLyoqIFdoZW4gZmFsc2UsIHRoZSBzY2hlZHVsZXIgc2tpcHMgc2NhbnMvc2NoZWR1bGVzIGZvciB0aGUgc3lzdGVtIG9yZy4gRGVmYXVsdDogZmFsc2UuICovXG4gIHJlYWRvbmx5IHN5c3RlbU9yZ1NjYW5zRW5hYmxlZDogYm9vbGVhbjtcbiAgLyoqIENyb3NzLXBvZCBsZWFkZXItbG9jayBUVEwgZm9yIHRoZSBzY2FuIHNjaGVkdWxlciAobXMpLiBEZWZhdWx0OiAzMDAwMDAuICovXG4gIHJlYWRvbmx5IHNjYW5Mb2NrVHRsTXM6IG51bWJlcjtcbiAgLyoqIEhvdyBvZnRlbiB0aGUgZGlnZXN0IHNjaGVkdWxlciBjaGVja3MgZm9yIGR1ZSBkaWdlc3RzIChtcykuIERlZmF1bHQ6IDM2MDAwMDAuICovXG4gIHJlYWRvbmx5IGRpZ2VzdFNjaGVkdWxlckludGVydmFsTXM6IG51bWJlcjtcbiAgLyoqIENyb3NzLXBvZCBsZWFkZXItbG9jayBUVEwgZm9yIHRoZSBkaWdlc3Qgc2NoZWR1bGVyIChtcykuIERlZmF1bHQ6IDMwMDAwMC4gKi9cbiAgcmVhZG9ubHkgZGlnZXN0TG9ja1R0bE1zOiBudW1iZXI7XG59XG5cbi8qKlxuICogQVdTIGluZnJhc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRGVsaWJlcmF0ZWx5IGV4cHJlc3NlZCBpbiBQTEFJTiBEQVRBIChudW1iZXJzLCBzdHJpbmdzLCBzdHJpbmcgdW5pb25zKSByYXRoZXJcbiAqIHRoYW4gQ0RLIHZhbHVlIG9iamVjdHMgKGBEdXJhdGlvbmAsIGBSdW50aW1lYCwgYFJldGVudGlvbkRheXNgLCAuLi4pLiBDb25maWcgaXNcbiAqIGxvYWRlZCBieSBldmVyeSBzZXJ2aWNlLCBidXQgb25seSB0aGUgQ0RLIGVudHJ5IHBvaW50IChgQHBpcGVsaW5lLWJ1aWxkZXIvXG4gKiBwaXBlbGluZS1jb3JlL2Nka2ApIGJ1aWxkcyBzdGFja3MgIHR5cGluZyB0aGlzIGJsb2NrIHdpdGggQ0RLIGNsYXNzZXMgcHV0XG4gKiBgYXdzLWNkay1saWJgIG9uIHRoZSBpbXBvcnQgZ3JhcGggb2YgYENvbmZpZ2AsIGFuZCB0aGVyZWZvcmUgb2YgZXZlcnkgQVBJXG4gKiBzZXJ2aWNlIHRoYXQgcmVhZHMgc28gbXVjaCBhcyBhIHBvcnQgbnVtYmVyLiBDb252ZXJzaW9uIHRvIENESyBvYmplY3RzIGhhcHBlbnNcbiAqIGF0IHRoZSBjb25zdHJ1Y3QgYm91bmRhcnkgaW4gYGNvbmZpZy9hd3MtY29uZmlnLWNkay50c2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQVdTQ29uZmlnIHtcbiAgcmVhZG9ubHkgbGFtYmRhOiB7XG4gICAgLyoqIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIsIGUuZy4gYCdub2RlanMyNC54J2AgKGVudjogYExBTUJEQV9SVU5USU1FYCkuICovXG4gICAgcmVhZG9ubHkgcnVudGltZTogc3RyaW5nO1xuICAgIC8qKiBGdW5jdGlvbiB0aW1lb3V0IGluIHNlY29uZHMgKGVudjogYExBTUJEQV9USU1FT1VUYCkuICovXG4gICAgcmVhZG9ubHkgdGltZW91dFNlY29uZHM6IG51bWJlcjtcbiAgICByZWFkb25seSBtZW1vcnlTaXplOiBudW1iZXI7XG4gICAgLyoqIExhbWJkYSBDUFUgYXJjaGl0ZWN0dXJlIChlbnY6IGBMQU1CREFfQVJDSElURUNUVVJFYCwgYEFSTV82NGAgb3IgYHg4Nl82NGApLiAqL1xuICAgIHJlYWRvbmx5IGFyY2hpdGVjdHVyZTogJ2FybTY0JyB8ICd4ODZfNjQnO1xuICAgIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG4gIH07XG4gIHJlYWRvbmx5IGxvZ2dpbmc6IHtcbiAgICByZWFkb25seSBncm91cE5hbWU6IHN0cmluZztcbiAgfTtcbiAgcmVhZG9ubHkgY29kZUJ1aWxkOiB7XG4gICAgLyoqIENvZGVCdWlsZCBjb21wdXRlIHR5cGUgbmFtZSwgZS5nLiBgJ1NNQUxMJ2AgKGVudjogYENPREVCVUlMRF9DT01QVVRFX1RZUEVgKS4gKi9cbiAgICByZWFkb25seSBjb21wdXRlVHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEltYWdlIHVzZWQgZm9yIENvZGVCdWlsZCBzdGVwcyB0aGF0IGRvbid0IGhhdmUgYSBwbHVnaW4tYmFrZWQgaW1hZ2VcbiAgICAgKiAoY29sZC1zdGFydCBzeW50aCBib290c3RyYXAsIFNoZWxsU3RlcHMgd2l0aCBubyByZWdpc3RyeSwgYW5kXG4gICAgICogYG1ldGFkYXRhX29ubHlgIHBsdWdpbnMpLiBlbnY6IGBDT0RFQlVJTERfREVGQVVMVF9JTUFHRWAuIERlZmF1bHRcbiAgICAgKiBgcGlwZWxpbmUtYm9vdHN0cmFwOjEuMGAg4oCUIHRoZSBsb2NhbCB0YWcgYnVpbHQgYnlcbiAgICAgKiBgZGVwbG95L2NvZGVidWlsZC9ib290c3RyYXAvRG9ja2VyZmlsZWAsIHdpdGggYHBpcGVsaW5lLW1hbmFnZXJgXG4gICAgICogYmFrZWQgaW4uXG4gICAgICpcbiAgICAgKiBDb250cmFjdDogdGhlIGltYWdlIE1VU1QgaGF2ZSBgcGlwZWxpbmUtbWFuYWdlcmAgb24gUEFUSC4gVGhlXG4gICAgICogYm9vdHN0cmFwIHN5bnRoIHBhdGggbm8gbG9uZ2VyIHNlbGYtaGVhbHMgdmlhIGBucG0gaW5zdGFsbCAtZ2A7XG4gICAgICogcG9pbnRpbmcgdGhpcyBhdCBhbiBpbWFnZSB3aXRob3V0IHRoZSB0b29sIGdldHMgZXhpdCAxMjcgb24gdGhlXG4gICAgICogZmlyc3QgY29sZC1zdGFydCBidWlsZC5cbiAgICAgKlxuICAgICAqIFJlc29sdXRpb246XG4gICAgICogLSBCYXJlIHRhZyAobm8gYC9gKSDihpIgYXV0by1wcmVmaXhlZCB0b1xuICAgICAqICAgYDxyZWdpc3RyeS1ob3N0Pjo8cG9ydD4vbGlicmFyeS88dGFnPmAgdXNpbmcgdGhlIHJlZ2lzdHJ5IGNvbmZpZyxcbiAgICAgKiAgIHdpdGggdGhlIHBlci1vcmcgcGxhdGZvcm0gU2VjcmV0IGFzIEJhc2ljIGF1dGggKHNhbWUgZmxvdyBhc1xuICAgICAqICAgcGx1Z2luIGltYWdlcykuXG4gICAgICogLSBGdWxseS1xdWFsaWZpZWQgcmVnaXN0cnkgVVJJIChjb250YWlucyBgL2ApIOKGkiB1c2VkIGFzLWlzLCBub1xuICAgICAqICAgYXV0aCB3aXJlZCAob3BlcmF0b3Igb3ducyBtYWtpbmcgaXQgcHVsbGFibGUpLlxuICAgICAqIC0gV2hlbiB0aGUgcmVnaXN0cnkgaXNuJ3QgY29uZmlndXJlZCBvciBwZXItb3JnIGF1dGggaXNuJ3RcbiAgICAgKiAgIGF2YWlsYWJsZSBhdCB0aGUgY2FsbCBzaXRlLCBmYWxscyBiYWNrIHRvXG4gICAgICogICBgYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo4LjBgIHdpdGggYSB3YXJuaW5nIOKAlCBjb2xkLXN0YXJ0IHN5bnRoXG4gICAgICogICB3aWxsIHRoZW4gZmFpbCBvbiBgcGlwZWxpbmUtbWFuYWdlcjogbm90IGZvdW5kYCwgc3VyZmFjaW5nIHRoZVxuICAgICAqICAgbWlzY29uZmlndXJhdGlvbiBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSBzd2FwcGluZyBpbWFnZXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdEltYWdlOiBzdHJpbmc7XG4gIH07XG59XG5cbi8qKiBFeHByZXNzIHJhdGUgbGltaXRpbmcgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF0ZUxpbWl0Q29uZmlnIHtcbiAgLyoqIE1heGltdW0gcmVxdWVzdHMgcGVyIHdpbmRvdyAoZW52OiBgTElNSVRFUl9NQVhgKS4gKi9cbiAgcmVhZG9ubHkgbWF4OiBudW1iZXI7XG4gIC8qKiBSYXRlIGxpbWl0IHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgKGVudjogYExJTUlURVJfV0lORE9XTVNgKS4gKi9cbiAgcmVhZG9ubHkgd2luZG93TXM6IG51bWJlcjtcbiAgLyoqIEluY2x1ZGUgbGVnYWN5IGBYLVJhdGVMaW1pdC0qYCBoZWFkZXJzLiAqL1xuICByZWFkb25seSBsZWdhY3lIZWFkZXJzOiBib29sZWFuO1xuICAvKiogSW5jbHVkZSBzdGFuZGFyZCBgUmF0ZUxpbWl0LSpgIGhlYWRlcnMgKFJGQyA2NTg1KS4gKi9cbiAgcmVhZG9ubHkgc3RhbmRhcmRIZWFkZXJzOiBib29sZWFuO1xufVxuXG4vKiogUHJpY2UgY29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgYmlsbGluZyBwbGFuIChpbiBjZW50cykuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbGxpbmdQbGFuUHJpY2VzIHtcbiAgcmVhZG9ubHkgbW9udGhseTogbnVtYmVyO1xuICByZWFkb25seSBhbm51YWw6IG51bWJlcjtcbn1cblxuLyoqIEZ1bGwgYmlsbGluZyBwbGFuIGRlZmluaXRpb24gdXNlZCBmb3Igc2VlZGluZyBhbmQgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaWxsaW5nUGxhbkNvbmZpZyB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgdGllcjogUXVvdGFUaWVyO1xuICByZWFkb25seSBwcmljZXM6IEJpbGxpbmdQbGFuUHJpY2VzO1xuICByZWFkb25seSBmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGlzQWN0aXZlOiBib29sZWFuO1xuICByZWFkb25seSBpc0RlZmF1bHQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvcnRPcmRlcjogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgcHVyY2hhc2FibGUgYWRkLW9uIGJ1bmRsZTogYSBxdWFudGl0eS1zdGFja2FibGUgcGFjayB0aGF0IEFERFMgdG8gdGhlXG4gKiBhY2NvdW50J3MgYmFzZSAodGllcikgbGltaXRzIGFuZCBhZGRzIGEgcmVjdXJyaW5nIGxpbmUgaXRlbS4gU2VlXG4gKiBkb2NzL2JpbGxpbmctYnVuZGxlcy5tZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVDb25maWcge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBQZXItdW5pdCBkZWx0YXMgb24gYFF1b3RhVGllckxpbWl0c2AgZmllbGRzLCBlLmcuIGB7IHNlYXRzOiA1IH1gLiBLZXlzIGFyZVxuICAgKiAgY29uc3RyYWluZWQgdG8gcmVhbCBxdW90YSBmaWVsZHMgc28gYSB0eXBvIGlzIGEgY29tcGlsZSBlcnJvciAod2FzXG4gICAqICBgUmVjb3JkPHN0cmluZywgbnVtYmVyPmAsIHdoZXJlIGEgbWlzc3BlbGxlZCBrZXkgd2FzIHNpbGVudGx5IHVuZW5mb3JjZWFibGUpLiAqL1xuICByZWFkb25seSBncmFudHM6IFJlYWRvbmx5PFBhcnRpYWw8UmVjb3JkPGtleW9mIFF1b3RhVGllckxpbWl0cywgbnVtYmVyPj4+O1xuICAvKiogRmVhdHVyZSBmbGFncyBncmFudGVkIGJ5IGEgZmVhdHVyZSBidW5kbGUgKGUuZy4gYGF1ZGl0X2xvZ2ApLiAqL1xuICByZWFkb25seSBmZWF0dXJlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogUGVyLXVuaXQgcHJpY2UgKGNlbnRzKS4gU3RyaXBlIG11bHRpcGxpZXMgYnkgcXVhbnRpdHkuICovXG4gIHJlYWRvbmx5IHByaWNlczogQmlsbGluZ1BsYW5QcmljZXM7XG4gIC8qKiBUcnVlIGZvciBzdGFja2FibGUgcmVzb3VyY2UgcGFja3M7IGZhbHNlIGZvciBhIGJvb2xlYW4gZmVhdHVyZSBidW5kbGUuICovXG4gIHJlYWRvbmx5IHN0YWNrYWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE1heGltdW0gcHVyY2hhc2FibGUgcXVhbnRpdHkgZm9yIGEgc3RhY2thYmxlIHBhY2suIEVuZm9yY2VkIGJ5IHRoZSBhZGRvblxuICAgKiBwdXJjaGFzZS9wcmV2aWV3IHJvdXRlIChgcXVhbnRpdHkg4omkIG1heFF1YW50aXR5YCwgcmVqZWN0IG92ZXItY2FwKS4gVXNlZCB0b1xuICAgKiBrZWVwIHJldGVudGlvbiBwYWNrcyB1bmRlciB0aGUgNzMwLWRheSByZXRlbnRpb24gY2VpbGluZyAoZS5nLiB0aGUgU3RhbmRhcmRcbiAgICogUmV0ZW50aW9uIFBhY2sgY2FwcyBhdCA3IHNvIDMwICsgN8OXOTAgPSA2NjAg4omkIDczMCkuIEFic2VudCDih5IgdW5ib3VuZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4UXVhbnRpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBwZXItdW5pdCB2b2x1bWUgZGlzY291bnQgdGllcnMgZm9yIGEgc3RhY2thYmxlIHBhY2s6IGF0IOKJpSBgbWluUXVhbnRpdHlgXG4gICAqIHB1cmNoYXNlZCB1bml0cywgYGRpc2NvdW50UGVyY2VudGAgY29tZXMgb2ZmIHRoZSBsaW5lIHN1YnRvdGFsICh1bml0IMOXIHF1YW50aXR5KS5cbiAgICogVGhlIGhpZ2hlc3QgbWF0Y2hpbmcgdGllciB3aW5zLiBSZWFsaXplZCBhcyBhIHJlY3VycmluZyB1c2FnZSBjcmVkaXQgKGxpa2UgYVxuICAgKiBjb21ibyksIHNvIHRoZSBwcm92aWRlciBzdGlsbCBjaGFyZ2VzIHVuaXTDl3F0eSBhbmQgdGhlIGNyZWRpdCBvZmZzZXRzIHRoZVxuICAgKiBiYWxhbmNlLiBFbnYtb3ZlcnJpZGFibGUgdmlhIGBCSUxMSU5HX0JVTkRMRV88SUQ+X1ZPTFVNRV9USUVSU2AgKEpTT04pLiBVc2VkIGJ5XG4gICAqIHRoZSBwZXItc2VhdCBgc2VhdGAgYnVuZGxlLiBBYnNlbnQg4oeSIG5vIHZvbHVtZSBkaXNjb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZVRpZXJzPzogcmVhZG9ubHkgeyByZWFkb25seSBtaW5RdWFudGl0eTogbnVtYmVyOyByZWFkb25seSBkaXNjb3VudFBlcmNlbnQ6IG51bWJlciB9W107XG4gIC8qKiBCYXNlIHRpZXJzIHRoaXMgYnVuZGxlIGlzIG9mZmVyZWQgdG8uICovXG4gIHJlYWRvbmx5IGF2YWlsYWJsZUZvclRpZXJzOiByZWFkb25seSBRdW90YVRpZXJbXTtcbiAgLyoqXG4gICAqIFByZXJlcXVpc2l0ZSBidW5kbGUgaWRzIHRoYXQgbXVzdCBiZSBoZWxkIChvciBwdXJjaGFzZWQgaW4gdGhlIHNhbWUgYWN0aW9uKVxuICAgKiBiZWZvcmUgdGhpcyBidW5kbGUgY2FuIGJlIGFkZGVkLiBFbmZvcmNlZCBieSB0aGUgYWRkb24gcHVyY2hhc2UvcHJldmlldyByb3V0ZVxuICAgKiAocmVqZWN0IHdpdGggNDAwIHdoZW4gdW5tZXQpOyBhIGNvbWJvIHRoYXQgaW5jbHVkZXMgdGhlIHByZXJlcXVpc2l0ZSBzYXRpc2ZpZXNcbiAgICogaXQuIFVzZWQgYnkgYGNvbXBsaWFuY2VfYWR2YW5jZWRgIChgcmVxdWlyZXM6IFsnY29tcGxpYW5jZV9zdGFuZGFyZCddYCkuXG4gICAqIEFic2VudCDih5Igbm8gcHJlcmVxdWlzaXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaXNBY3RpdmU6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvcnRPcmRlcjogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgY29tYm8gZGlzY291bnQ6IHdoZW4gYW4gYWNjb3VudCBob2xkcyBFVkVSWSBidW5kbGUgaW4gYGJ1bmRsZUlkc2AsIHRoZSBwYWlyXG4gKiBpcyBiaWxsZWQgYXQgYHByaWNlc2AgKHRoZSBjb21iaW5lZCBwcmljZSkgaW5zdGVhZCBvZiB0aGUgc3VtIG9mIHRoZSBtZW1iZXJzJ1xuICogaW5kaXZpZHVhbCBwcmljZXMuIFJlYWxpemVkIGFzIGEgcmVjdXJyaW5nIHVzYWdlIGNyZWRpdCBmb3IgdGhlIGRpZmZlcmVuY2Ug4oCUXG4gKiBuZXZlciBhIHByb3ZpZGVyIGNvdXBvbiDigJQgY29uc2lzdGVudCB3aXRoIHRoZSB1c2FnZS1jcmVkaXQgZGlzY291bnQgbW9kZWwuIFNlZVxuICogZG9jcy9iaWxsaW5nLWJ1bmRsZXMubWQgwqdDb21ibyBwcmljaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbWJvRGlzY291bnRDb25maWcge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgbWVtYmVyIGJ1bmRsZSBpZHMgdGhhdCBtdXN0IEFMTCBiZSBwcmVzZW50IGZvciB0aGUgY29tYm8gdG8gYXBwbHkuICovXG4gIHJlYWRvbmx5IGJ1bmRsZUlkczogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBQZXItbWVtYmVyIG1pbmltdW0gcXVhbnRpdHkgKGJ1bmRsZUlkIOKGkiBjb3VudDsgYWJzZW50IOKHkiAxKS4gTGV0cyBhIHN0YWNrYWJsZVxuICAgKiAgY2FwYWNpdHkgcGFjayBhbmNob3IgYSBjb21ibyDigJQgZS5nLiBgeyBzZWF0OiA1IH1gID0gXCLiiaUgNSBzZWF0c1wiLiBUaGUgY3JlZGl0XG4gICAqICBiYXNpcyB1c2VzIHRoaXMgbWluaW11bSwgc28gZXh0cmEgdW5pdHMgbmV2ZXIgaW5mbGF0ZSB0aGUgZGlzY291bnQuICovXG4gIHJlYWRvbmx5IG1pblF1YW50aXRpZXM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcbiAgLyoqIFRoZSBjb21iaW5lZCBwcmljZSBmb3IgdGhlIG1pbmltdW0gc2V0IChjZW50cykuIFRoZSBjcmVkaXQgaXNcbiAgICogIGDOoyBtZW1iZXIgdW5pdCBwcmljZSDDlyBtaW5RdHkg4oiSIHByaWNlc2AsIGNsYW1wZWQg4omlIDAuICovXG4gIHJlYWRvbmx5IHByaWNlczogQmlsbGluZ1BsYW5QcmljZXM7XG4gIC8qKiBEZXRlcm1pbmlzdGljIHRpZS1icmVhayBhbW9uZyBlcXVhbC10b3RhbCBvcHRpbWFsIHBhY2tpbmdzIHdoZW4gY29tYm9zIG92ZXJsYXBcbiAgICogIChsb3dlciB3aW5zKS4gKi9cbiAgcmVhZG9ubHkgc29ydE9yZGVyOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlzQWN0aXZlOiBib29sZWFuO1xufVxuXG4vKiogQmlsbGluZyBwbGFucyArIGFkZC1vbiBidW5kbGUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmlsbGluZ0NvbmZpZyB7XG4gIHJlYWRvbmx5IHBsYW5zOiByZWFkb25seSBCaWxsaW5nUGxhbkNvbmZpZ1tdO1xuICByZWFkb25seSBidW5kbGVzOiByZWFkb25seSBCdW5kbGVDb25maWdbXTtcbiAgcmVhZG9ubHkgY29tYm9EaXNjb3VudHM6IHJlYWRvbmx5IENvbWJvRGlzY291bnRDb25maWdbXTtcbn1cbiJdfQ==
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9jb25maWctdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVGllciwgUXVvdGFUaWVyTGltaXRzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuXG4vKipcbiAqIFR5cGUtc2FmZSBjb25maWd1cmF0aW9uIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcENvbmZpZyB7XG4gIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyQ29uZmlnO1xuICByZWFkb25seSBhdXRoOiBBdXRoQ29uZmlnO1xuICByZWFkb25seSBkYXRhYmFzZTogRGF0YWJhc2VDb25maWc7XG4gIHJlYWRvbmx5IHJlZ2lzdHJ5OiBSZWdpc3RyeUNvbmZpZztcbiAgcmVhZG9ubHkgcGx1Z2luQnVpbGQ6IFBsdWdpbkJ1aWxkQ29uZmlnO1xuICByZWFkb25seSBkb2NrZXJDb25maWc6IEJ1aWxkQ29uZmlnO1xuICByZWFkb25seSBvYnNlcnZhYmlsaXR5OiBPYnNlcnZhYmlsaXR5Q29uZmlnO1xuICByZWFkb25seSBjb21wbGlhbmNlOiBDb21wbGlhbmNlQ29uZmlnO1xuICByZWFkb25seSBhd3M6IEFXU0NvbmZpZztcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0OiBSYXRlTGltaXRDb25maWc7XG4gIHJlYWRvbmx5IGJpbGxpbmc6IEJpbGxpbmdDb25maWc7XG59XG5cbi8qKiBFeHByZXNzIHNlcnZlciBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJDb25maWcge1xuICAvKiogSFRUUCBsaXN0ZW4gcG9ydCAoZW52OiBgUE9SVGApLiAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvcnM6IHtcbiAgICAvKiogV2hldGhlciB0byBpbmNsdWRlIGNyZWRlbnRpYWxzIGluIENPUlMgcmVzcG9uc2VzIChlbnY6IGBDT1JTX0NSRURFTlRJQUxTYCkuICovXG4gICAgcmVhZG9ubHkgY3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgLyoqIEFsbG93ZWQgb3JpZ2luKHMpIOKAlCBzaW5nbGUgc3RyaW5nLCBhcnJheSwgb3IgYCcqJ2AgKGVudjogYENPUlNfT1JJR0lOYCkuICovXG4gICAgcmVhZG9ubHkgb3JpZ2luOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgfTtcbiAgLyoqIE51bWJlciBvZiByZXZlcnNlIHByb3h5IGhvcHMgdG8gdHJ1c3QgKGVudjogYFRSVVNUX1BST1hZYCkuICovXG4gIHJlYWRvbmx5IHRydXN0UHJveHk6IG51bWJlcjtcbiAgLyoqIEZyb250ZW5kIGJhc2UgVVJMLCB1c2VkIGFzIENPUlMgZmFsbGJhY2sgKGVudjogYFBMQVRGT1JNX0JBU0VfVVJMYCkuICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtVXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGh0dHBDbGllbnQ6IHtcbiAgICAvKiogRGVmYXVsdCBIVFRQIHJlcXVlc3QgdGltZW91dCBpbiBtcyAoZW52OiBgSFRUUF9DTElFTlRfVElNRU9VVGApLiAqL1xuICAgIHJlYWRvbmx5IHRpbWVvdXQ6IG51bWJlcjtcbiAgICAvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBmb3IgZmFpbGVkIHJlcXVlc3RzIChlbnY6IGBIVFRQX0NMSUVOVF9NQVhfUkVUUklFU2ApLiAqL1xuICAgIHJlYWRvbmx5IG1heFJldHJpZXM6IG51bWJlcjtcbiAgICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbXMgKGVudjogYEhUVFBfQ0xJRU5UX1JFVFJZX0RFTEFZX01TYCkuICovXG4gICAgcmVhZG9ubHkgcmV0cnlEZWxheU1zOiBudW1iZXI7XG4gIH07XG4gIHJlYWRvbmx5IHNzZToge1xuICAgIC8qKiBNYXggU1NFIGNsaWVudHMgcGVyIHJlcXVlc3QgKGVudjogYFNTRV9NQVhfQ0xJRU5UU19QRVJfUkVRVUVTVGApLiAqL1xuICAgIHJlYWRvbmx5IG1heENsaWVudHNQZXJSZXF1ZXN0OiBudW1iZXI7XG4gICAgLyoqIFNTRSBjbGllbnQgdGltZW91dCBpbiBtcyAoZW52OiBgU1NFX0NMSUVOVF9USU1FT1VUX01TYCkuICovXG4gICAgcmVhZG9ubHkgY2xpZW50VGltZW91dE1zOiBudW1iZXI7XG4gICAgLyoqIFNTRSBjbGVhbnVwIGludGVydmFsIGluIG1zIChlbnY6IGBTU0VfQ0xFQU5VUF9JTlRFUlZBTF9NU2ApLiAqL1xuICAgIHJlYWRvbmx5IGNsZWFudXBJbnRlcnZhbE1zOiBudW1iZXI7XG4gIH07XG4gIHJlYWRvbmx5IHNlcnZpY2VzOiB7XG4gICAgcmVhZG9ubHkgcGx1Z2luSG9zdDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBsdWdpblBvcnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBwaXBlbGluZUhvc3Q6IHN0cmluZztcbiAgICByZWFkb25seSBwaXBlbGluZVBvcnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBtZXNzYWdlSG9zdDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IG1lc3NhZ2VQb3J0OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcGxhdGZvcm1Ib3N0OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcGxhdGZvcm1Qb3J0OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgY29tcGxpYW5jZUhvc3Q6IHN0cmluZztcbiAgICByZWFkb25seSBjb21wbGlhbmNlUG9ydDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGJpbGxpbmdIb3N0OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYmlsbGluZ1BvcnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBiaWxsaW5nVGltZW91dDogbnVtYmVyO1xuICB9O1xufVxuXG4vKiogQXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGdlbmVyaWMgc2VydmljZSBzY2FmZm9sZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aENvbmZpZyB7XG4gIHJlYWRvbmx5IGp3dDoge1xuICAgIC8qKlxuICAgICAqIFRva2VuIGxpZmV0aW1lIGluIHNlY29uZHMgKGVudjogYEpXVF9FWFBJUkVTX0lOYCkuXG4gICAgICpcbiAgICAgKiBUaGVyZSBpcyBubyBKV1QgU0VDUkVUIGhlcmUgYW55IG1vcmUuIEV2ZXJ5IHRva2VuIGlzIGFzeW1tZXRyaWM6IGEgdXNlclxuICAgICAqIHRva2VuIGlzIEVTMjU2IHNpZ25lZCBieSBwbGF0Zm9ybSBhbG9uZSAoYHNlcnZpY2VzL3Rva2VuLXNpZ25pbmdgKSwgYW5kIGFuXG4gICAgICogaW50ZXJuYWwgc2VydmljZSB0b2tlbiBpcyBFUzI1NiBzaWduZWQgYnkgdGhlIENBTExJTkcgc2VydmljZSB3aXRoIGl0cyBvd25cbiAgICAgKiBrZXkgKCMxNCwgYFNFUlZJQ0VfU0lHTklOR19LRVlfRklMRWAgLyBgU0VSVklDRV9LRVlfQlVORExFX0ZJTEVgKS5cbiAgICAgKi9cbiAgICByZWFkb25seSBleHBpcmVzSW46IG51bWJlcjtcbiAgICAvKiogYmNyeXB0IHNhbHQgcm91bmRzIGZvciBwYXNzd29yZCBoYXNoaW5nIChlbnY6IGBCQ1JZUFRfU0FMVF9ST1VORFNgKS4gKi9cbiAgICByZWFkb25seSBzYWx0Um91bmRzOiBudW1iZXI7XG4gIH07XG4gIHJlYWRvbmx5IHJlZnJlc2hUb2tlbjoge1xuICAgIC8qKlxuICAgICAqIFRva2VuIGxpZmV0aW1lIGluIHNlY29uZHMgKGVudjogYFJFRlJFU0hfVE9LRU5fRVhQSVJFU19JTmApLiBUaGVyZSBpcyBub1xuICAgICAqIHJlZnJlc2gtdG9rZW4gU0VDUkVUIGFueSBtb3JlOiBhIHJlZnJlc2ggdG9rZW4gaXMgYSB1c2VyIHRva2VuLCBzaWduZWRcbiAgICAgKiB3aXRoIHBsYXRmb3JtJ3MgRVMyNTYga2V5IGxpa2UgZXZlcnkgb3RoZXIgY3JlZGVudGlhbCBhIHBlcnNvbiBob2xkcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBleHBpcmVzSW46IG51bWJlcjtcbiAgfTtcbn1cblxuLyoqIFBvc3RncmVTUUwgYW5kIERyaXp6bGUgT1JNIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlQ29uZmlnIHtcbiAgcmVhZG9ubHkgcG9zdGdyZXM6IHtcbiAgICAvKiogUG9zdGdyZVNRTCBob3N0IChlbnY6IGBEQl9IT1NUYCkuICovXG4gICAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICAgIC8qKiBQb3N0Z3JlU1FMIHBvcnQgKGVudjogYERCX1BPUlRgKS4gKi9cbiAgICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gICAgLyoqIERhdGFiYXNlIG5hbWUgKGVudjogYERBVEFCQVNFYCkuICovXG4gICAgcmVhZG9ubHkgZGF0YWJhc2U6IHN0cmluZztcbiAgICAvKiogRGF0YWJhc2UgdXNlciAoZW52OiBgREJfVVNFUmApLiAqL1xuICAgIHJlYWRvbmx5IHVzZXI6IHN0cmluZztcbiAgICAvKiogRGF0YWJhc2UgcGFzc3dvcmQgKGVudjogYERCX1BBU1NXT1JEYCkuICovXG4gICAgcmVhZG9ubHkgcGFzc3dvcmQ6IHN0cmluZztcbiAgfTtcbiAgcmVhZG9ubHkgZHJpenpsZToge1xuICAgIC8qKiBNYXhpbXVtIGNvbm5lY3Rpb24gcG9vbCBzaXplIChlbnY6IGBEUklaWkxFX01BWF9QT09MX1NJWkVgKS4gKi9cbiAgICByZWFkb25seSBtYXhQb29sU2l6ZTogbnVtYmVyO1xuICAgIC8qKiBJZGxlIGNvbm5lY3Rpb24gdGltZW91dCBpbiBtcyAoZW52OiBgRFJJWlpMRV9JRExFX1RJTUVPVVRfTUlMTElTYCkuICovXG4gICAgcmVhZG9ubHkgaWRsZVRpbWVvdXRNaWxsaXM6IG51bWJlcjtcbiAgICAvKiogTmV3IGNvbm5lY3Rpb24gdGltZW91dCBpbiBtcyAoZW52OiBgRFJJWlpMRV9DT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTYCkuICovXG4gICAgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeUNvbmZpZyB7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogSG9zdC9wb3J0IGFuIE9VVC1PRi1DTFVTVEVSIGNsaWVudCAobm90YWJseSBBV1MgQ29kZUJ1aWxkKSB1c2VzIHRvIHB1bGxcbiAgICogcGx1Z2luIGltYWdlcywgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluLWNsdXN0ZXIgYGhvc3RgL2Bwb3J0YC4gVGhlXG4gICAqIGluLWNsdXN0ZXIgYHJlZ2lzdHJ5OjUwMDBgIENsdXN0ZXJJUCBpc24ndCByZXNvbHZhYmxlIGZyb20gdGhlIFZQQywgc28gdGhlXG4gICAqIHN5bnRoZXNpemVkIENvZGVCdWlsZCBpbWFnZSBVUkkgbXVzdCBwb2ludCBhdCB0aGUgcHVibGljIGdhdGV3YXkgaW5zdGVhZC5cbiAgICogRW52OiBgSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUYCAvIGBJTUFHRV9SRUdJU1RSWV9QVUxMX1BPUlRgLiBPcHRpb25hbDtcbiAgICogY29uc3VtZXJzIGZhbGwgYmFjayB0byBgaG9zdGAvYHBvcnRgIHdoZW4gdW5zZXQgKHNpbmdsZS1ob3N0IC9cbiAgICogaW4tY2x1c3Rlci1vbmx5IGRlcGxveXMpLiBgbG9hZFJlZ2lzdHJ5Q29uZmlnYCBhbHdheXMgcG9wdWxhdGVzIHRoZW0uXG4gICAqL1xuICByZWFkb25seSBwdWxsSG9zdD86IHN0cmluZztcbiAgcmVhZG9ubHkgcHVsbFBvcnQ/OiBudW1iZXI7XG4gIC8qKiBEb2NrZXIgbmV0d29yayBmb3IgYnVpbGQvcHVzaCAoZW1wdHkgc3RyaW5nID0gZGVmYXVsdCkuICovXG4gIHJlYWRvbmx5IG5ldHdvcms6IHN0cmluZztcbiAgLyoqXG4gICAqIEJ1aWxkS2l0IHRhbGtzIHRvIHRoZSByZWdpc3RyeSBvdmVyIHBsYWluIEhUVFAgd2hlbiB0cnVlOyBIVFRQUyB3aXRoIHRoZVxuICAgKiBzeXN0ZW0gQ0EgYnVuZGxlIG90aGVyd2lzZS4gRW52OiBgSU1BR0VfUkVHSVNUUllfSFRUUGAgKGRlZmF1bHRzIHRydWUg4oCUXG4gICAqIHRoZSBpbi1jbHVzdGVyIHJlZ2lzdHJ5IGhhcyBubyBUTFMpLlxuICAgKi9cbiAgcmVhZG9ubHkgaHR0cDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5CdWlsZENvbmZpZyB7XG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1heEF0dGVtcHRzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGJhY2tvZmZEZWxheU1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHdvcmtlclRpbWVvdXRNczogbnVtYmVyO1xuICByZWFkb25seSB0ZW1wRGlyTWF4QWdlTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgZGxxTWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgZGxxQmFja29mZkJhc2VNczogbnVtYmVyO1xuICByZWFkb25seSBkbHFNYXhTaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRDb25maWcge1xuICAvKiogUm9vdCBkaXJlY3RvcnkgZm9yIGJ1aWxkIHRlbXAgZmlsZXMuICovXG4gIHJlYWRvbmx5IHRlbXBSb290OiBzdHJpbmc7XG4gIC8qKiBCdWlsZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXI7XG4gIC8qKiBQdXNoIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICByZWFkb25seSBwdXNoVGltZW91dE1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBidWlsZGtpdGQgc29ja2V0IHRoZSBwbHVnaW4ncyBgYnVpbGRjdGxgIGNvbm5lY3RzIHRvLiBJbiBrOHNcbiAgICogYW5kIGNvbXBvc2UgdGhpcyBpcyBhIHNoYXJlZCBlbXB0eURpci90bXBmcyB2b2x1bWUgbW91bnRlZCBmcm9tIHRoZVxuICAgKiBidWlsZGtpdGQgc2lkZWNhci5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxka2l0QWRkcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9ic2VydmFiaWxpdHlDb25maWcge1xuICByZWFkb25seSBsb2dMZXZlbDogc3RyaW5nO1xuICByZWFkb25seSBsb2dGb3JtYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdHJhY2luZzoge1xuICAgIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlQ29uZmlnIHtcbiAgcmVhZG9ubHkgc2NhblNjaGVkdWxlckludGVydmFsTXM6IG51bWJlcjtcbiAgLyoqIFdoZW4gZmFsc2UsIHRoZSBzY2hlZHVsZXIgc2tpcHMgc2NhbnMvc2NoZWR1bGVzIGZvciB0aGUgc3lzdGVtIG9yZy4gRGVmYXVsdDogZmFsc2UuICovXG4gIHJlYWRvbmx5IHN5c3RlbU9yZ1NjYW5zRW5hYmxlZDogYm9vbGVhbjtcbiAgLyoqIENyb3NzLXBvZCBsZWFkZXItbG9jayBUVEwgZm9yIHRoZSBzY2FuIHNjaGVkdWxlciAobXMpLiBEZWZhdWx0OiAzMDAwMDAuICovXG4gIHJlYWRvbmx5IHNjYW5Mb2NrVHRsTXM6IG51bWJlcjtcbiAgLyoqIEhvdyBvZnRlbiB0aGUgZGlnZXN0IHNjaGVkdWxlciBjaGVja3MgZm9yIGR1ZSBkaWdlc3RzIChtcykuIERlZmF1bHQ6IDM2MDAwMDAuICovXG4gIHJlYWRvbmx5IGRpZ2VzdFNjaGVkdWxlckludGVydmFsTXM6IG51bWJlcjtcbiAgLyoqIENyb3NzLXBvZCBsZWFkZXItbG9jayBUVEwgZm9yIHRoZSBkaWdlc3Qgc2NoZWR1bGVyIChtcykuIERlZmF1bHQ6IDMwMDAwMC4gKi9cbiAgcmVhZG9ubHkgZGlnZXN0TG9ja1R0bE1zOiBudW1iZXI7XG59XG5cbi8qKlxuICogQVdTIGluZnJhc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRGVsaWJlcmF0ZWx5IGV4cHJlc3NlZCBpbiBQTEFJTiBEQVRBIChudW1iZXJzLCBzdHJpbmdzLCBzdHJpbmcgdW5pb25zKSByYXRoZXJcbiAqIHRoYW4gQ0RLIHZhbHVlIG9iamVjdHMgKGBEdXJhdGlvbmAsIGBSdW50aW1lYCwgYFJldGVudGlvbkRheXNgLCAuLi4pLiBDb25maWcgaXNcbiAqIGxvYWRlZCBieSBldmVyeSBzZXJ2aWNlLCBidXQgb25seSB0aGUgQ0RLIGVudHJ5IHBvaW50IChgQHBpcGVsaW5lLWJ1aWxkZXIvXG4gKiBwaXBlbGluZS1jb3JlL2Nka2ApIGJ1aWxkcyBzdGFja3MgIHR5cGluZyB0aGlzIGJsb2NrIHdpdGggQ0RLIGNsYXNzZXMgcHV0XG4gKiBgYXdzLWNkay1saWJgIG9uIHRoZSBpbXBvcnQgZ3JhcGggb2YgYENvbmZpZ2AsIGFuZCB0aGVyZWZvcmUgb2YgZXZlcnkgQVBJXG4gKiBzZXJ2aWNlIHRoYXQgcmVhZHMgc28gbXVjaCBhcyBhIHBvcnQgbnVtYmVyLiBDb252ZXJzaW9uIHRvIENESyBvYmplY3RzIGhhcHBlbnNcbiAqIGF0IHRoZSBjb25zdHJ1Y3QgYm91bmRhcnkgaW4gYGNvbmZpZy9hd3MtY29uZmlnLWNkay50c2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQVdTQ29uZmlnIHtcbiAgcmVhZG9ubHkgbGFtYmRhOiB7XG4gICAgLyoqIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIsIGUuZy4gYCdub2RlanMyNC54J2AgKGVudjogYExBTUJEQV9SVU5USU1FYCkuICovXG4gICAgcmVhZG9ubHkgcnVudGltZTogc3RyaW5nO1xuICAgIC8qKiBGdW5jdGlvbiB0aW1lb3V0IGluIHNlY29uZHMgKGVudjogYExBTUJEQV9USU1FT1VUYCkuICovXG4gICAgcmVhZG9ubHkgdGltZW91dFNlY29uZHM6IG51bWJlcjtcbiAgICByZWFkb25seSBtZW1vcnlTaXplOiBudW1iZXI7XG4gICAgLyoqIExhbWJkYSBDUFUgYXJjaGl0ZWN0dXJlIChlbnY6IGBMQU1CREFfQVJDSElURUNUVVJFYCwgYEFSTV82NGAgb3IgYHg4Nl82NGApLiAqL1xuICAgIHJlYWRvbmx5IGFyY2hpdGVjdHVyZTogJ2FybTY0JyB8ICd4ODZfNjQnO1xuICAgIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG4gIH07XG4gIHJlYWRvbmx5IGxvZ2dpbmc6IHtcbiAgICByZWFkb25seSBncm91cE5hbWU6IHN0cmluZztcbiAgfTtcbiAgcmVhZG9ubHkgY29kZUJ1aWxkOiB7XG4gICAgLyoqIENvZGVCdWlsZCBjb21wdXRlIHR5cGUgbmFtZSwgZS5nLiBgJ1NNQUxMJ2AgKGVudjogYENPREVCVUlMRF9DT01QVVRFX1RZUEVgKS4gKi9cbiAgICByZWFkb25seSBjb21wdXRlVHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEltYWdlIHVzZWQgZm9yIENvZGVCdWlsZCBzdGVwcyB0aGF0IGRvbid0IGhhdmUgYSBwbHVnaW4tYmFrZWQgaW1hZ2VcbiAgICAgKiAoY29sZC1zdGFydCBzeW50aCBib290c3RyYXAsIFNoZWxsU3RlcHMgd2l0aCBubyByZWdpc3RyeSwgYW5kXG4gICAgICogYG1ldGFkYXRhX29ubHlgIHBsdWdpbnMpLiBlbnY6IGBDT0RFQlVJTERfREVGQVVMVF9JTUFHRWAuIERlZmF1bHRcbiAgICAgKiBgcGlwZWxpbmUtYm9vdHN0cmFwOjEuMGAg4oCUIHRoZSBsb2NhbCB0YWcgYnVpbHQgYnlcbiAgICAgKiBgZGVwbG95L2NvZGVidWlsZC9ib290c3RyYXAvRG9ja2VyZmlsZWAsIHdpdGggYHBpcGVsaW5lLW1hbmFnZXJgXG4gICAgICogYmFrZWQgaW4uXG4gICAgICpcbiAgICAgKiBDb250cmFjdDogdGhlIGltYWdlIE1VU1QgaGF2ZSBgcGlwZWxpbmUtbWFuYWdlcmAgb24gUEFUSC4gVGhlXG4gICAgICogYm9vdHN0cmFwIHN5bnRoIHBhdGggbm8gbG9uZ2VyIHNlbGYtaGVhbHMgdmlhIGBucG0gaW5zdGFsbCAtZ2A7XG4gICAgICogcG9pbnRpbmcgdGhpcyBhdCBhbiBpbWFnZSB3aXRob3V0IHRoZSB0b29sIGdldHMgZXhpdCAxMjcgb24gdGhlXG4gICAgICogZmlyc3QgY29sZC1zdGFydCBidWlsZC5cbiAgICAgKlxuICAgICAqIFJlc29sdXRpb246XG4gICAgICogLSBCYXJlIHRhZyAobm8gYC9gKSDihpIgYXV0by1wcmVmaXhlZCB0b1xuICAgICAqICAgYDxyZWdpc3RyeS1ob3N0Pjo8cG9ydD4vbGlicmFyeS88dGFnPmAgdXNpbmcgdGhlIHJlZ2lzdHJ5IGNvbmZpZyxcbiAgICAgKiAgIHdpdGggdGhlIHBlci1vcmcgcGxhdGZvcm0gU2VjcmV0IGFzIEJhc2ljIGF1dGggKHNhbWUgZmxvdyBhc1xuICAgICAqICAgcGx1Z2luIGltYWdlcykuXG4gICAgICogLSBGdWxseS1xdWFsaWZpZWQgcmVnaXN0cnkgVVJJIChjb250YWlucyBgL2ApIOKGkiB1c2VkIGFzLWlzLCBub1xuICAgICAqICAgYXV0aCB3aXJlZCAob3BlcmF0b3Igb3ducyBtYWtpbmcgaXQgcHVsbGFibGUpLlxuICAgICAqIC0gV2hlbiB0aGUgcmVnaXN0cnkgaXNuJ3QgY29uZmlndXJlZCBvciBwZXItb3JnIGF1dGggaXNuJ3RcbiAgICAgKiAgIGF2YWlsYWJsZSBhdCB0aGUgY2FsbCBzaXRlLCBmYWxscyBiYWNrIHRvXG4gICAgICogICBgYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo4LjBgIHdpdGggYSB3YXJuaW5nIOKAlCBjb2xkLXN0YXJ0IHN5bnRoXG4gICAgICogICB3aWxsIHRoZW4gZmFpbCBvbiBgcGlwZWxpbmUtbWFuYWdlcjogbm90IGZvdW5kYCwgc3VyZmFjaW5nIHRoZVxuICAgICAqICAgbWlzY29uZmlndXJhdGlvbiBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSBzd2FwcGluZyBpbWFnZXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdEltYWdlOiBzdHJpbmc7XG4gIH07XG59XG5cbi8qKiBFeHByZXNzIHJhdGUgbGltaXRpbmcgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF0ZUxpbWl0Q29uZmlnIHtcbiAgLyoqIE1heGltdW0gcmVxdWVzdHMgcGVyIHdpbmRvdyAoZW52OiBgTElNSVRFUl9NQVhgKS4gKi9cbiAgcmVhZG9ubHkgbWF4OiBudW1iZXI7XG4gIC8qKiBSYXRlIGxpbWl0IHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgKGVudjogYExJTUlURVJfV0lORE9XTVNgKS4gKi9cbiAgcmVhZG9ubHkgd2luZG93TXM6IG51bWJlcjtcbiAgLyoqIEluY2x1ZGUgbGVnYWN5IGBYLVJhdGVMaW1pdC0qYCBoZWFkZXJzLiAqL1xuICByZWFkb25seSBsZWdhY3lIZWFkZXJzOiBib29sZWFuO1xuICAvKiogSW5jbHVkZSBzdGFuZGFyZCBgUmF0ZUxpbWl0LSpgIGhlYWRlcnMgKFJGQyA2NTg1KS4gKi9cbiAgcmVhZG9ubHkgc3RhbmRhcmRIZWFkZXJzOiBib29sZWFuO1xufVxuXG4vKiogUHJpY2UgY29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgYmlsbGluZyBwbGFuIChpbiBjZW50cykuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbGxpbmdQbGFuUHJpY2VzIHtcbiAgcmVhZG9ubHkgbW9udGhseTogbnVtYmVyO1xuICByZWFkb25seSBhbm51YWw6IG51bWJlcjtcbn1cblxuLyoqIEZ1bGwgYmlsbGluZyBwbGFuIGRlZmluaXRpb24gdXNlZCBmb3Igc2VlZGluZyBhbmQgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaWxsaW5nUGxhbkNvbmZpZyB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgdGllcjogUXVvdGFUaWVyO1xuICByZWFkb25seSBwcmljZXM6IEJpbGxpbmdQbGFuUHJpY2VzO1xuICByZWFkb25seSBmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGlzQWN0aXZlOiBib29sZWFuO1xuICByZWFkb25seSBpc0RlZmF1bHQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvcnRPcmRlcjogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgcHVyY2hhc2FibGUgYWRkLW9uIGJ1bmRsZTogYSBxdWFudGl0eS1zdGFja2FibGUgcGFjayB0aGF0IEFERFMgdG8gdGhlXG4gKiBhY2NvdW50J3MgYmFzZSAodGllcikgbGltaXRzIGFuZCBhZGRzIGEgcmVjdXJyaW5nIGxpbmUgaXRlbS4gU2VlXG4gKiBkb2NzL2JpbGxpbmctYnVuZGxlcy5tZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVDb25maWcge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBQZXItdW5pdCBkZWx0YXMgb24gYFF1b3RhVGllckxpbWl0c2AgZmllbGRzLCBlLmcuIGB7IHNlYXRzOiA1IH1gLiBLZXlzIGFyZVxuICAgKiAgY29uc3RyYWluZWQgdG8gcmVhbCBxdW90YSBmaWVsZHMgc28gYSB0eXBvIGlzIGEgY29tcGlsZSBlcnJvciAod2FzXG4gICAqICBgUmVjb3JkPHN0cmluZywgbnVtYmVyPmAsIHdoZXJlIGEgbWlzc3BlbGxlZCBrZXkgd2FzIHNpbGVudGx5IHVuZW5mb3JjZWFibGUpLiAqL1xuICByZWFkb25seSBncmFudHM6IFJlYWRvbmx5PFBhcnRpYWw8UmVjb3JkPGtleW9mIFF1b3RhVGllckxpbWl0cywgbnVtYmVyPj4+O1xuICAvKiogRmVhdHVyZSBmbGFncyBncmFudGVkIGJ5IGEgZmVhdHVyZSBidW5kbGUgKGUuZy4gYHNzb2ApLiAqL1xuICByZWFkb25seSBmZWF0dXJlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogUGVyLXVuaXQgcHJpY2UgKGNlbnRzKS4gU3RyaXBlIG11bHRpcGxpZXMgYnkgcXVhbnRpdHkuICovXG4gIHJlYWRvbmx5IHByaWNlczogQmlsbGluZ1BsYW5QcmljZXM7XG4gIC8qKiBUcnVlIGZvciBzdGFja2FibGUgcmVzb3VyY2UgcGFja3M7IGZhbHNlIGZvciBhIGJvb2xlYW4gZmVhdHVyZSBidW5kbGUuICovXG4gIHJlYWRvbmx5IHN0YWNrYWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE1heGltdW0gcHVyY2hhc2FibGUgcXVhbnRpdHkgZm9yIGEgc3RhY2thYmxlIHBhY2suIEVuZm9yY2VkIGJ5IHRoZSBhZGRvblxuICAgKiBwdXJjaGFzZS9wcmV2aWV3IHJvdXRlIChgcXVhbnRpdHkg4omkIG1heFF1YW50aXR5YCwgcmVqZWN0IG92ZXItY2FwKS4gVXNlZCB0b1xuICAgKiBrZWVwIHJldGVudGlvbiBwYWNrcyB1bmRlciB0aGUgNzMwLWRheSByZXRlbnRpb24gY2VpbGluZyAoZS5nLiB0aGUgU3RhbmRhcmRcbiAgICogUmV0ZW50aW9uIFBhY2sgY2FwcyBhdCA3IHNvIDMwICsgN8OXOTAgPSA2NjAg4omkIDczMCkuIEFic2VudCDih5IgdW5ib3VuZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4UXVhbnRpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBwZXItdW5pdCB2b2x1bWUgZGlzY291bnQgdGllcnMgZm9yIGEgc3RhY2thYmxlIHBhY2s6IGF0IOKJpSBgbWluUXVhbnRpdHlgXG4gICAqIHB1cmNoYXNlZCB1bml0cywgYGRpc2NvdW50UGVyY2VudGAgY29tZXMgb2ZmIHRoZSBsaW5lIHN1YnRvdGFsICh1bml0IMOXIHF1YW50aXR5KS5cbiAgICogVGhlIGhpZ2hlc3QgbWF0Y2hpbmcgdGllciB3aW5zLiBSZWFsaXplZCBhcyBhIHJlY3VycmluZyB1c2FnZSBjcmVkaXQgKGxpa2UgYVxuICAgKiBjb21ibyksIHNvIHRoZSBwcm92aWRlciBzdGlsbCBjaGFyZ2VzIHVuaXTDl3F0eSBhbmQgdGhlIGNyZWRpdCBvZmZzZXRzIHRoZVxuICAgKiBiYWxhbmNlLiBFbnYtb3ZlcnJpZGFibGUgdmlhIGBCSUxMSU5HX0JVTkRMRV88SUQ+X1ZPTFVNRV9USUVSU2AgKEpTT04pLiBVc2VkIGJ5XG4gICAqIHRoZSBwZXItc2VhdCBgc2VhdGAgYnVuZGxlLiBBYnNlbnQg4oeSIG5vIHZvbHVtZSBkaXNjb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHZvbHVtZVRpZXJzPzogcmVhZG9ubHkgeyByZWFkb25seSBtaW5RdWFudGl0eTogbnVtYmVyOyByZWFkb25seSBkaXNjb3VudFBlcmNlbnQ6IG51bWJlciB9W107XG4gIC8qKiBCYXNlIHRpZXJzIHRoaXMgYnVuZGxlIGlzIG9mZmVyZWQgdG8uICovXG4gIHJlYWRvbmx5IGF2YWlsYWJsZUZvclRpZXJzOiByZWFkb25seSBRdW90YVRpZXJbXTtcbiAgLyoqXG4gICAqIFByZXJlcXVpc2l0ZSBidW5kbGUgaWRzIHRoYXQgbXVzdCBiZSBoZWxkIChvciBwdXJjaGFzZWQgaW4gdGhlIHNhbWUgYWN0aW9uKVxuICAgKiBiZWZvcmUgdGhpcyBidW5kbGUgY2FuIGJlIGFkZGVkLiBFbmZvcmNlZCBieSB0aGUgYWRkb24gcHVyY2hhc2UvcHJldmlldyByb3V0ZVxuICAgKiAocmVqZWN0IHdpdGggNDAwIHdoZW4gdW5tZXQpOyBhIGNvbWJvIHRoYXQgaW5jbHVkZXMgdGhlIHByZXJlcXVpc2l0ZSBzYXRpc2ZpZXNcbiAgICogaXQuIFVzZWQgYnkgYGNvbXBsaWFuY2VfYWR2YW5jZWRgIChgcmVxdWlyZXM6IFsnY29tcGxpYW5jZV9zdGFuZGFyZCddYCkuXG4gICAqIEFic2VudCDih5Igbm8gcHJlcmVxdWlzaXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFByZXJlcXVpc2l0ZSBGRUFUVVJFIGZsYWdzIHRoZSBhY2NvdW50IG11c3QgaG9sZCDigJQgZnJvbSBpdHMgcGxhbiB0aWVyXG4gICAqIChgVElFUl9GRUFUVVJFU2ApIG9yIGZyb20gYSBmZWF0dXJlIGJ1bmRsZSBpdCBob2xkcyBhZnRlciB0aGUgY2hhbmdlIOKAlCBiZWZvcmVcbiAgICogdGhpcyBidW5kbGUgY2FuIGJlIGFkZGVkLiBEaXN0aW5jdCBmcm9tIHtAbGluayByZXF1aXJlc30gYmVjYXVzZSBhIGZlYXR1cmUgY2FuXG4gICAqIGJlIHRpZXItaW5jbHVkZWQgKG5vIGJ1bmRsZSB0byBuYW1lKTogZS5nLiBgZG9yYV9oaXN0b3J5X3BhY2tgIG5lZWRzXG4gICAqIGBhZHZhbmNlZF9yZXBvcnRpbmdgLCB3aGljaCBFbnRlcnByaXNlIGluY2x1ZGVzIGFuZCBsb3dlciB0aWVycyBidXkgYXMgYW5cbiAgICogYWRkLW9uLiBFbmZvcmNlZCBieSB0aGUgYWRkb24gcHVyY2hhc2UvcHJldmlldyByb3V0ZSAoNDAwIHdoZW4gdW5tZXQpLCBhbmQgYVxuICAgKiBoZWxkIGJ1bmRsZSB3aG9zZSBmZWF0dXJlIHByZXJlcXVpc2l0ZSBkaXNhcHBlYXJzIChpdHMgZ3JhbnRpbmcgYnVuZGxlIHJlbW92ZWQsXG4gICAqIG9yIGEgZG93bmdyYWRlIHRvIGEgdGllciB3aXRob3V0IGl0KSBpcyBjYXNjYWRlLXJlbW92ZWQuIEFic2VudCDih5Igbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVzRmVhdHVyZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaXNBY3RpdmU6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvcnRPcmRlcjogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgY29tYm8gZGlzY291bnQ6IHdoZW4gYW4gYWNjb3VudCBob2xkcyBFVkVSWSBidW5kbGUgaW4gYGJ1bmRsZUlkc2AsIHRoZSBwYWlyXG4gKiBpcyBiaWxsZWQgYXQgYHByaWNlc2AgKHRoZSBjb21iaW5lZCBwcmljZSkgaW5zdGVhZCBvZiB0aGUgc3VtIG9mIHRoZSBtZW1iZXJzJ1xuICogaW5kaXZpZHVhbCBwcmljZXMuIFJlYWxpemVkIGFzIGEgcmVjdXJyaW5nIHVzYWdlIGNyZWRpdCBmb3IgdGhlIGRpZmZlcmVuY2Ug4oCUXG4gKiBuZXZlciBhIHByb3ZpZGVyIGNvdXBvbiDigJQgY29uc2lzdGVudCB3aXRoIHRoZSB1c2FnZS1jcmVkaXQgZGlzY291bnQgbW9kZWwuIFNlZVxuICogZG9jcy9iaWxsaW5nLWJ1bmRsZXMubWQgwqdDb21ibyBwcmljaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbWJvRGlzY291bnRDb25maWcge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgbWVtYmVyIGJ1bmRsZSBpZHMgdGhhdCBtdXN0IEFMTCBiZSBwcmVzZW50IGZvciB0aGUgY29tYm8gdG8gYXBwbHkuICovXG4gIHJlYWRvbmx5IGJ1bmRsZUlkczogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBQZXItbWVtYmVyIG1pbmltdW0gcXVhbnRpdHkgKGJ1bmRsZUlkIOKGkiBjb3VudDsgYWJzZW50IOKHkiAxKS4gTGV0cyBhIHN0YWNrYWJsZVxuICAgKiAgY2FwYWNpdHkgcGFjayBhbmNob3IgYSBjb21ibyDigJQgZS5nLiBgeyBzZWF0OiA1IH1gID0gXCLiiaUgNSBzZWF0c1wiLiBUaGUgY3JlZGl0XG4gICAqICBiYXNpcyB1c2VzIHRoaXMgbWluaW11bSwgc28gZXh0cmEgdW5pdHMgbmV2ZXIgaW5mbGF0ZSB0aGUgZGlzY291bnQuICovXG4gIHJlYWRvbmx5IG1pblF1YW50aXRpZXM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcbiAgLyoqIFRoZSBjb21iaW5lZCBwcmljZSBmb3IgdGhlIG1pbmltdW0gc2V0IChjZW50cykuIFRoZSBjcmVkaXQgaXNcbiAgICogIGDOoyBtZW1iZXIgdW5pdCBwcmljZSDDlyBtaW5RdHkg4oiSIHByaWNlc2AsIGNsYW1wZWQg4omlIDAuICovXG4gIHJlYWRvbmx5IHByaWNlczogQmlsbGluZ1BsYW5QcmljZXM7XG4gIC8qKiBEZXRlcm1pbmlzdGljIHRpZS1icmVhayBhbW9uZyBlcXVhbC10b3RhbCBvcHRpbWFsIHBhY2tpbmdzIHdoZW4gY29tYm9zIG92ZXJsYXBcbiAgICogIChsb3dlciB3aW5zKS4gKi9cbiAgcmVhZG9ubHkgc29ydE9yZGVyOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlzQWN0aXZlOiBib29sZWFuO1xufVxuXG4vKiogQmlsbGluZyBwbGFucyArIGFkZC1vbiBidW5kbGUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmlsbGluZ0NvbmZpZyB7XG4gIHJlYWRvbmx5IHBsYW5zOiByZWFkb25seSBCaWxsaW5nUGxhbkNvbmZpZ1tdO1xuICByZWFkb25seSBidW5kbGVzOiByZWFkb25seSBCdW5kbGVDb25maWdbXTtcbiAgcmVhZG9ubHkgY29tYm9EaXNjb3VudHM6IHJlYWRvbmx5IENvbWJvRGlzY291bnRDb25maWdbXTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -33,8 +33,8 @@
33
33
  "dependencies": {
34
34
  "axios": "1.19.0",
35
35
  "jsonwebtoken": "9.0.3",
36
- "@pipeline-builder/api-core": "4.1.5",
37
- "@pipeline-builder/pipeline-data": "4.1.6"
36
+ "@pipeline-builder/api-core": "4.1.7",
37
+ "@pipeline-builder/pipeline-data": "4.1.8"
38
38
  },
39
39
  "keywords": [
40
40
  "ci-cd",
@@ -90,7 +90,7 @@
90
90
  "access": "public",
91
91
  "registry": "https://registry.npmjs.org/"
92
92
  },
93
- "version": "4.1.6",
93
+ "version": "4.1.8",
94
94
  "bugs": {
95
95
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
96
96
  },