@pipeline-builder/pipeline-core 3.4.144 → 3.4.146

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.
@@ -1,8 +1,16 @@
1
- import type { BillingConfig, BundleConfig } from './config-types.js';
1
+ import type { BillingConfig, BundleConfig, ComboDiscountConfig } from './config-types.js';
2
2
  /**
3
3
  * Load billing plan configuration from environment variables.
4
4
  */
5
5
  export declare function loadBillingConfig(): BillingConfig;
6
+ /**
7
+ * Config-load guardrail for combos: every `bundleId` must resolve to an ACTIVE
8
+ * bundle and every `minQuantities` key must be one of the combo's `bundleIds`.
9
+ * A typo'd member or stray minQuantity key otherwise ships a permanently-inert
10
+ * combo (missing bundle treated as unit price 0, or a min never satisfiable),
11
+ * silently never applying. Throws so misconfig fails fast at boot.
12
+ */
13
+ export declare function assertCombosValid(combos: ComboDiscountConfig[], bundles: BundleConfig[]): void;
6
14
  /**
7
15
  * Config-load guardrail for the `requires` prerequisite graph. A `requires` entry
8
16
  * that doesn't resolve to an ACTIVE bundle — or that participates in a cycle —
@@ -148,7 +148,7 @@ export function loadBillingConfig() {
148
148
  id: 'enterprise',
149
149
  name: process.env.BILLING_PLAN_ENTERPRISE_NAME || 'Enterprise',
150
150
  description: process.env.BILLING_PLAN_ENTERPRISE_DESCRIPTION
151
- || 'Org-wide scale with unlimited seats and priority support',
151
+ || 'Org-wide scale with a high seat baseline (expandable via Member Seat add-ons) and priority support',
152
152
  tier: 'enterprise',
153
153
  prices: {
154
154
  monthly: envCents(process.env.BILLING_PLAN_ENTERPRISE_MONTHLY, 59900),
@@ -226,9 +226,43 @@ function loadComboDiscounts(bundles) {
226
226
  // bundled $27.99/mo (~30% off, ~$11.99 credit). Both members all-tier.
227
227
  c('scale_bundle', 'Scale Bundle', ['api_pack', 'storage_pack'], 2799, 27990, 3),
228
228
  ];
229
+ assertCombosValid(combos, bundles);
229
230
  warnOnNonDiscountCombos(combos, bundles);
230
231
  return combos;
231
232
  }
233
+ /**
234
+ * Config-load guardrail for combos: every `bundleId` must resolve to an ACTIVE
235
+ * bundle and every `minQuantities` key must be one of the combo's `bundleIds`.
236
+ * A typo'd member or stray minQuantity key otherwise ships a permanently-inert
237
+ * combo (missing bundle treated as unit price 0, or a min never satisfiable),
238
+ * silently never applying. Throws so misconfig fails fast at boot.
239
+ */
240
+ export function assertCombosValid(combos, bundles) {
241
+ const activeIds = new Set(bundles.filter((b) => b.isActive).map((b) => b.id));
242
+ for (const combo of combos) {
243
+ for (const id of combo.bundleIds) {
244
+ if (!activeIds.has(id)) {
245
+ throw new Error(`Combo "${combo.id}" references bundle "${id}", which is not an active bundle.`);
246
+ }
247
+ }
248
+ for (const key of Object.keys(combo.minQuantities ?? {})) {
249
+ if (!combo.bundleIds.includes(key)) {
250
+ throw new Error(`Combo "${combo.id}" minQuantities key "${key}" is not one of its bundleIds.`);
251
+ }
252
+ }
253
+ }
254
+ }
255
+ /** The volume-discount percent applying to `quantity` units of a bundle — the
256
+ * highest `volumeTiers` entry whose `minQuantity ≤ quantity`, else 0. Mirrors
257
+ * `volumeDiscountPct` in api/billing's combo-pricing (which can't be imported the
258
+ * other way); the combo credit math and this guardrail MUST use the same basis. */
259
+ function volumeDiscountPctAt(bundle, quantity) {
260
+ let pct = 0;
261
+ for (const t of bundle?.volumeTiers ?? [])
262
+ if (quantity >= t.minQuantity)
263
+ pct = t.discountPercent;
264
+ return pct;
265
+ }
232
266
  /**
233
267
  * Guardrail: a combo whose combined price is ≥ its minimum-composition basket grants
234
268
  * no credit (the credit clamps to $0) and is silently inert. Warn loudly instead so a
@@ -239,7 +273,16 @@ function warnOnNonDiscountCombos(combos, bundles) {
239
273
  const byId = new Map(bundles.map((b) => [b.id, b]));
240
274
  for (const combo of combos) {
241
275
  for (const interval of ['monthly', 'annual']) {
242
- const basket = combo.bundleIds.reduce((s, id) => s + (byId.get(id)?.prices[interval] ?? 0) * (combo.minQuantities?.[id] ?? 1), 0);
276
+ // Post-volume basis (mirrors `comboBasisCents`): a member with volume tiers is
277
+ // basised on its DISCOUNTED unit at the combo's minQty, so this guardrail can't
278
+ // silently miss a combo that grants no real credit once volume is applied.
279
+ const basket = combo.bundleIds.reduce((s, id) => {
280
+ const b = byId.get(id);
281
+ const qty = combo.minQuantities?.[id] ?? 1;
282
+ const rawUnit = b?.prices[interval] ?? 0;
283
+ const unit = Math.round((rawUnit * (100 - volumeDiscountPctAt(b, qty))) / 100);
284
+ return s + unit * qty;
285
+ }, 0);
243
286
  if (combo.prices[interval] >= basket) {
244
287
  // eslint-disable-next-line no-console
245
288
  console.warn(`[billing-config] Combo "${combo.id}" ${interval} price ${combo.prices[interval]} ≥ member basket ${basket}; it grants no discount.`);
@@ -298,18 +341,32 @@ function applyTiersOverride(id, defaultTiers) {
298
341
  function applyVolumeTiersOverride(id, defaultTiers) {
299
342
  const raw = process.env[`BILLING_BUNDLE_${id.toUpperCase()}_VOLUME_TIERS`];
300
343
  const sortAsc = (t) => [...t].sort((a, b) => a.minQuantity - b.minQuantity);
344
+ const fallback = () => (defaultTiers ? sortAsc(defaultTiers) : undefined);
301
345
  if (!raw)
302
- return defaultTiers ? sortAsc(defaultTiers) : undefined;
346
+ return fallback();
303
347
  try {
304
348
  const parsed = JSON.parse(raw);
305
349
  if (!Array.isArray(parsed) || parsed.length === 0)
306
- return defaultTiers ? sortAsc(defaultTiers) : undefined;
307
- const valid = parsed.filter((t) => t && typeof t.minQuantity === 'number' && t.minQuantity >= 1
350
+ return fallback();
351
+ // Each entry: integer minQuantity 1, 0 < discountPercent 100.
352
+ const valid = parsed.filter((t) => t && typeof t.minQuantity === 'number' && Number.isInteger(t.minQuantity) && t.minQuantity >= 1
308
353
  && typeof t.discountPercent === 'number' && t.discountPercent > 0 && t.discountPercent <= 100);
309
- return valid.length === parsed.length ? sortAsc(valid) : (defaultTiers ? sortAsc(defaultTiers) : undefined);
354
+ if (valid.length !== parsed.length)
355
+ return fallback();
356
+ const sorted = sortAsc(valid);
357
+ // Reject a non-monotonic curve: buying MORE must never earn a SMALLER discount,
358
+ // and duplicate thresholds are ambiguous. (`volumeDiscountPct` picks the last
359
+ // qualifying tier, so a descending percent would penalize higher quantities.)
360
+ for (let i = 1; i < sorted.length; i++) {
361
+ if (sorted[i].minQuantity === sorted[i - 1].minQuantity)
362
+ return fallback();
363
+ if (sorted[i].discountPercent <= sorted[i - 1].discountPercent)
364
+ return fallback();
365
+ }
366
+ return sorted;
310
367
  }
311
368
  catch {
312
- return defaultTiers ? sortAsc(defaultTiers) : undefined;
369
+ return fallback();
313
370
  }
314
371
  }
315
372
  /**
@@ -437,4 +494,4 @@ export function assertBundleRequiresValid(bundles) {
437
494
  visit(bundle, []);
438
495
  }
439
496
  }
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2JpbGxpbmctY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQXdDLE1BQU0sNEJBQTRCLENBQUM7QUFPMUssZ0ZBQWdGO0FBQ2hGLDhFQUE4RTtBQUM5RSxrREFBa0Q7QUFDbEQsa0ZBQWtGO0FBQ2xGLGlEQUFpRDtBQUNqRCx3RUFBd0U7QUFDeEUsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsaUZBQWlGO0FBQ2pGLDRFQUE0RTtBQUU1RSx3RkFBd0Y7QUFDeEYsU0FBUyxTQUFTLENBQUMsS0FBYSxFQUFFLFFBQWdCLEVBQUUsTUFBYztJQUNoRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7UUFBRSxPQUFPLGFBQWEsTUFBTSxFQUFFLENBQUM7SUFDL0MsT0FBTyxTQUFTLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNyRixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsSUFBZSxFQUFFLEtBQWU7SUFDdkQsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQyxPQUFPO1FBQ0wsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUNuQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxDQUFDLENBQUMs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LElBQUksS0FBSyxDQUFDLHNEQUFzRCxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ25ELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0QixDQUFDLENBQUM7SUFFRixLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ25DLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBMb2FkIGJpbGxpbmcgcGxhbiBjb25maWd1cmF0aW9uIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqIFBlci1wbGFuIHByaWNlcyBhcmUgdGhlIG1vc3QgbGlrZWx5IHRvIHZhcnkgYmV0d2VlbiBlbnZpcm9ubWVudHM6XG4gKiAgIEJJTExJTkdfUExBTl97VElFUn1fTU9OVEhMWSAvIEJJTExJTkdfUExBTl97VElFUn1fQU5OVUFMICAoaW4gY2VudHMpXG4gKlxuICogT3B0aW9uYWwgb3ZlcnJpZGVzIGZvciBkZXNjcmlwdGlvbnMgYW5kIGZlYXR1cmVzOlxuICogICBCSUxMSU5HX1BMQU5fe1RJRVJ9X05BTUUgICAgICAgICAgKHBsYWluIHN0cmluZywgZGlzcGxheSBuYW1lKVxuICogICBCSUxMSU5HX1BMQU5fe1RJRVJ9X0RFU0NSSVBUSU9OICAgKHBsYWluIHN0cmluZylcbiAqICAgQklMTElOR19QTEFOX3tUSUVSfV9GRUFUVVJFUyAgICAgIChKU09OIHN0cmluZyBhcnJheSlcbiAqXG4gKiBBbGwgZGVmYXVsdHMgbWF0Y2ggdGhlIG9yaWdpbmFsIGhhcmRjb2RlZCBzZWVkIGRhdGEuXG4gKi9cbmltcG9ydCB7IFFVT1RBX1RJRVJTLCBUSUVSX0ZFQVRVUkVTLCBGRUFUVVJFX01FVEFEQVRBLCBWQUxJRF9USUVSUywgU1RBTkRBUkRfVElFUlMsIGlzVmFsaWRUaWVyLCB0eXBlIFF1b3RhVGllciwgdHlwZSBRdW90YVRpZXJMaW1pdHMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IEJpbGxpbmdDb25maWcsIEJpbGxpbmdQbGFuQ29uZmlnLCBCdW5kbGVDb25maWcsIENvbWJvRGlzY291bnRDb25maWcgfSBmcm9tICcuL2NvbmZpZy10eXBlcy5qcyc7XG5cbi8qKiBQZXItdW5pdCBxdW90YSBkZWx0YXMgZm9yIGEgYnVuZGxlIOKAlCBrZXlzIGNvbnN0cmFpbmVkIHRvIHJlYWwgcXVvdGEgZmllbGRzXG4gKiAgKG1hdGNoZXMgYEJ1bmRsZUNvbmZpZy5ncmFudHNgKSwgc28gYSB0eXBvJ2QgZGltZW5zaW9uIGZhaWxzIHRvIGNvbXBpbGUuICovXG50eXBlIEdyYW50TWFwID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgUXVvdGFUaWVyTGltaXRzLCBudW1iZXI+PjtcblxuLy8gLS0gRGVmYXVsdCBmZWF0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBtYXJrZXRlZCBmZWF0dXJlIGxpc3QgaXMgYnVpbHQgZnJvbSB0d28gZGVyaXZlZCBzb3VyY2VzIHNvIGl0IGNhbiBuZXZlclxuLy8gZHJpZnQgZnJvbSB3aGF0IHRoZSBwbGF0Zm9ybSBhY3R1YWxseSBlbmZvcmNlczpcbi8vICAgMS4gTElNSVQgbGluZXMgZGVyaXZlZCBmcm9tIGVhY2ggdGllcidzIEVGRkVDVElWRSBxdW90YSBsaW1pdHMgKFFVT1RBX1RJRVJTKSxcbi8vICAgICAgc28gdGhleSB0cmFjayBRVU9UQV9USUVSXyogZW52IG92ZXJyaWRlcy5cbi8vICAgMi4gSU5DTFVERUQtRkVBVFVSRSBsaW5lcyBkZXJpdmVkIGZyb20gdGhlIGVuZm9yY2VkIGVudGl0bGVtZW50IHNldFxuLy8gICAgICAoVElFUl9GRUFUVVJFUykgdmlhIEZFQVRVUkVfTUVUQURBVEEgbGFiZWxzIOKAlCBzbyBhbiBhZHZlcnRpc2VkIGJhc2Vcbi8vICAgICAgZmVhdHVyZSBpcyBhbHdheXMgb25lIGByZXF1aXJlRmVhdHVyZWAgYWN0dWFsbHkgZ3JhbnRzIGZvciB0aGF0IHRpZXIuXG4vLyBPbmx5IGdlbnVpbmVseSBub24tZ2F0ZWQgbWFya2V0aW5nIGNvcHkgKHN1cHBvcnQgbGV2ZWwsIGRhc2hib2FyZHMsIFJCQUMpIGlzXG4vLyBoYW5kLWF1dGhvcmVkLCBwYXNzZWQgYXMgYHBlcmtzYC4gUHVyY2hhc2FibGUgYWRkLW9ucyAoc3NvLCBhdWRpdF9sb2cpIGFyZSBOT1Rcbi8vIGxpc3RlZCBhcyBiYXNlIHBlcmtzIGhlcmUg4oCUIHRoZXkgYXJlIHNvbGQgYXMgYnVuZGxlcyAoc2VlIGxvYWRCdW5kbGVzKCkpLlxuXG4vKiogXCJVcCB0byBOIHBsdWdpbnNcIiAvIFwiVW5saW1pdGVkIHBsdWdpbnNcIiBmcm9tIGFuIGVmZmVjdGl2ZSBsaW1pdCAoLTEgPSB1bmxpbWl0ZWQpLiAqL1xuZnVuY3Rpb24gbGltaXRMaW5lKGxpbWl0OiBudW1iZXIsIHNpbmd1bGFyOiBzdHJpbmcsIHBsdXJhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGxpbWl0ID09PSAtMSkgcmV0dXJuIGBVbmxpbWl0ZWQgJHtwbHVyYWx9YDtcbiAgcmV0dXJuIGBVcCB0byAke2xpbWl0LnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpfSAke2xpbWl0ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWx9YDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEZlYXR1cmVzKHRpZXI6IFF1b3RhVGllciwgcGVya3M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBsID0gUVVPVEFfVElFUlNbdGllcl0ubGltaXRzO1xuICByZXR1cm4gW1xuICAgIGxpbWl0TGluZShsLnNlYXRzLCAnc2VhdCcsICdzZWF0cycpLFxuICAgIGxpbWl0TGluZShsLnBsdWdpbnMsICdwbHVnaW4nLCAncGx1Z2lucycpLFxuICAgIGxpbWl0TGluZShsLnBpcGVsaW5lcywgJ3BpcGVsaW5lJywgJ3BpcGVsaW5lcycpLFxuICAgIGxpbWl0TGluZShsLmFwaUNhbGxzLCAnQVBJIGNhbGwnLCAnQVBJIGNhbGxzJyksXG4gICAgbGltaXRMaW5lKGwuYWlDYWxscywgJ0FJIGNhbGwnLCAnQUkgY2FsbHMnKSxcbiAgICAvLyBFbmZvcmNlZCBlbnRpdGxlbWVudHMg4oaSIGN1c3RvbWVyLWZhY2luZyBsYWJlbHMgKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpLlxuICAgIC4uLlRJRVJfRkVBVFVSRVNbdGllcl0ubWFwKChmKSA9PiBGRUFUVVJFX01FVEFEQVRBW2ZdLmxhYmVsKSxcbiAgICAuLi5wZXJrcyxcbiAgXTtcbn1cblxuLy8gTm90ZTogYHBlcmtzYCBhcmUgbm9uLWdhdGVkIG1hcmtldGluZyBsaW5lcyBvbmx5LiBFbmZvcmNlZCBmZWF0dXJlcyAoaW5jbC5cbi8vIFByaW9yaXR5IFN1cHBvcnQgZm9yIHByby90ZWFtL2VudGVycHJpc2UpIGNvbWUgZnJvbSBUSUVSX0ZFQVRVUkVTIGFib3ZlLlxuY29uc3QgREVGQVVMVF9ERVZFTE9QRVJfRkVBVFVSRVMgPSBkZWZhdWx0RmVhdHVyZXMoJ2RldmVsb3BlcicsIFsnQ29tbXVuaXR5IHN1cHBvcnQnXSk7XG5jb25zdCBERUZBVUxUX1BST19GRUFUVVJFUyA9IGRlZmF1bHRGZWF0dXJlcygncHJvJywgWydSZXBvcnRpbmcgZGFzaGJvYXJkJ10pO1xuY29uc3QgREVGQVVMVF9URUFNX0ZFQVRVUkVTID0gZGVmYXVsdEZlYXR1cmVzKCd0ZWFtJywgWydSQkFDICYgdGVhbSByb2xlcyddKTtcbmNvbnN0IERFRkFVTFRfRU5URVJQUklTRV9GRUFUVVJFUyA9IGRlZmF1bHRGZWF0dXJlcygnZW50ZXJwcmlzZScsIFtcbiAgJ1JCQUMgJiB0ZWFtIHJvbGVzJywgJ1JlcG9ydGluZyBkYXNoYm9hcmQnLFxuXSk7XG4vLyBVbmxpbWl0ZWQgaW5jbHVkZXMgZXZlcnkgZmVhdHVyZSAoVElFUl9GRUFUVVJFUy51bmxpbWl0ZWQgPSBhbGwpLlxuY29uc3QgREVGQVVMVF9VTkxJTUlURURfRkVBVFVSRVMgPSBkZWZhdWx0RmVhdHVyZXMoJ3VubGltaXRlZCcsIFtcbiAgJ1VubGltaXRlZCBldmVyeXRoaW5nJywgJ1JCQUMgJiB0ZWFtIHJvbGVzJywgJ1JlcG9ydGluZyBkYXNoYm9hcmQnLFxuXSk7XG5cbi8qKlxuICogUGFyc2UgYSBwcmljZSAoaW4gY2VudHMpIGZyb20gYW4gZW52IHZhciwgZmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0IHdoZW5cbiAqIHVuc2V0IE9SIG1hbGZvcm1lZC4gQSBOYU4gKGUuZy4gYEJJTExJTkdfUExBTl9QUk9fTU9OVEhMWT1hYmNgKSBtdXN0IG5ldmVyXG4gKiBmbG93IGludG8gdGhlIHJldHVybmVkIGNvbmZpZyBhcyBhIHByaWNlLlxuICovXG5mdW5jdGlvbiBlbnZDZW50cyhlbnZWYXI6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChlbnZWYXIgPT09IHVuZGVmaW5lZCB8fCBlbnZWYXIgPT09ICcnKSByZXR1cm4gZmFsbGJhY2s7XG4gIC8vIGBwYXJzZUludGAgaXMgdG9vIGxlbmllbnQgaGVyZTogJzQ5Ljk5J+KGkjQ5LCAnNDlhYmMn4oaSNDksICctMTAwJ+KGki0xMDAgd291bGQgYWxsXG4gIC8vIGZsb3cgdGhyb3VnaCBhcyBhIFwicHJpY2VcIi4gUmVxdWlyZSBhIGNsZWFuLCBub24tbmVnYXRpdmUgaW50ZWdlciAoY2VudHMpLFxuICAvLyBtYXRjaGluZyBgYXBwbHlHcmFudE92ZXJyaWRlYCdzIHJpZ29yIOKAlCBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2suXG4gIGNvbnN0IG4gPSBOdW1iZXIoZW52VmFyKTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAwID8gbiA6IGZhbGxiYWNrO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgSlNPTiBhcnJheSBmcm9tIGFuIGVudiB2YXIsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LlxuICovXG5mdW5jdGlvbiBwYXJzZUZlYXR1cmVzKGVudlZhcjogc3RyaW5nIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGlmICghZW52VmFyKSByZXR1cm4gZmFsbGJhY2s7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShlbnZWYXIpO1xuICAgIC8vIEFycmF5LW9mLXN0cmluZ3Mgb25seSDigJQgYSBKU09OIGFycmF5IG9mIG5vbi1zdHJpbmdzIChlLmcuIGBbMSwyXWApIG11c3Qgbm90XG4gICAgLy8gc2hpcCBudW1iZXJzIGFzIGZlYXR1cmUgbGFiZWxzLiBGaWx0ZXIgdG8gc3RyaW5ncyAobWlycm9ycyBhcHBseVRpZXJzT3ZlcnJpZGUpLlxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gZmFsbGJhY2s7XG4gICAgY29uc3Qgc3RyaW5ncyA9IHBhcnNlZC5maWx0ZXIoKHgpOiB4IGlzIHN0cmluZyA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpO1xuICAgIHJldHVybiBzdHJpbmdzLmxlbmd0aCA9PT0gcGFyc2VkLmxlbmd0aCA/IHN0cmluZ3MgOiBmYWxsYmFjaztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG59XG5cbi8qKlxuICogTG9hZCBiaWxsaW5nIHBsYW4gY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRCaWxsaW5nQ29uZmlnKCk6IEJpbGxpbmdDb25maWcge1xuICAvLyBLZXllZCBieSBRdW90YVRpZXIgc28gdGhlIGNvbXBpbGVyIGZvcmNlcyBhIHBsYW4gZm9yIEVWRVJZIHRpZXIg4oCUIGFkZGluZyBhXG4gIC8vIDV0aCBRdW90YVRpZXIgd2l0aG91dCBhIHBsYW4gaGVyZSBpcyBub3cgYSBjb21waWxlIGVycm9yICh3YXMgYSBoYW5kLWtlcHRcbiAgLy8gNC1lbGVtZW50IGFycmF5IHRoYXQgc2lsZW50bHkgc2hpcHBlZCBubyBwbGFuL3ByaWNlIGZvciBhIG5ldyB0aWVyKS4gVGhlXG4gIC8vIHB1YmxpYyBgY29uZmlnLnBsYW5zYCBzaGFwZSBzdGF5cyBhbiBhcnJheSwgZGVyaXZlZCBiZWxvdyBpbiBWQUxJRF9USUVSU1xuICAvLyBvcmRlciAoZGV2ZWxvcGVyLCBwcm8sIHRlYW0sIGVudGVycHJpc2UsIHVubGltaXRlZCkgdG8gcHJlc2VydmUgY29uc3VtZXIgb3JkZXJpbmcuXG4gIGNvbnN0IHBsYW5CeVRpZXI6IFJlY29yZDxRdW90YVRpZXIsIEJpbGxpbmdQbGFuQ29uZmlnPiA9IHtcbiAgICBkZXZlbG9wZXI6IHtcbiAgICAgIGlkOiAnZGV2ZWxvcGVyJyxcbiAgICAgIG5hbWU6IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9ERVZFTE9QRVJfTkFNRSB8fCAnRGV2ZWxvcGVyJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fREVWRUxPUEVSX0RFU0NSSVBUSU9OXG4gICAgICAgIHx8ICdGcmVlIHN0YXJ0ZXIgdGllciBmb3IgaW5kaXZpZHVhbCBkZXZlbG9wZXJzJyxcbiAgICAgIHRpZXI6ICdkZXZlbG9wZXInLFxuICAgICAgcHJpY2VzOiB7XG4gICAgICAgIG1vbnRobHk6IGVudkNlbnRzKHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9ERVZFTE9QRVJfTU9OVEhMWSwgMCksXG4gICAgICAgIGFubnVhbDogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0RFVkVMT1BFUl9BTk5VQUwsIDApLFxuICAgICAgfSxcbiAgICAgIGZlYXR1cmVzOiBwYXJzZUZlYXR1cmVzKFxuICAgICAgICBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fREVWRUxPUEVSX0ZFQVRVUkVTLFxuICAgICAgICBERUZBVUxUX0RFVkVMT1BFUl9GRUFUVVJFUyxcbiAgICAgICksXG4gICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICAgIHNvcnRPcmRlcjogMCxcbiAgICB9LFxuICAgIHBybzoge1xuICAgICAgaWQ6ICdwcm8nLFxuICAgICAgbmFtZTogcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1BST19OQU1FIHx8ICdQcm8nLFxuICAgICAgZGVzY3JpcHRpb246IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9QUk9fREVTQ1JJUFRJT05cbiAgICAgICAgfHwgJ0ZvciBpbmRpdmlkdWFsIHBvd2VyIHVzZXJzIGFuZCBwcm9kdWN0aW9uIHdvcmtsb2FkcycsXG4gICAgICB0aWVyOiAncHJvJyxcbiAgICAgIHByaWNlczoge1xuICAgICAgICBtb250aGx5OiBlbnZDZW50cyhwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fUFJPX01PTlRITFksIDM5MDApLFxuICAgICAgICBhbm51YWw6IGVudkNlbnRzKHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9QUk9fQU5OVUFMLCAzOTAwMCksXG4gICAgICB9LFxuICAgICAgZmVhdHVyZXM6IHBhcnNlRmVhdHVyZXMoXG4gICAgICAgIHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9QUk9fRkVBVFVSRVMsXG4gICAgICAgIERFRkFVTFRfUFJPX0ZFQVRVUkVTLFxuICAgICAgKSxcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIHNvcnRPcmRlcjogMSxcbiAgICB9LFxuICAgIHRlYW06IHtcbiAgICAgIGlkOiAndGVhbScsXG4gICAgICBuYW1lOiBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVEVBTV9OQU1FIHx8ICdUZWFtJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVEVBTV9ERVNDUklQVElPTlxuICAgICAgICB8fCAnRm9yIHRlYW1zIGNvbGxhYm9yYXRpbmcgb24gc2hhcmVkIHBpcGVsaW5lcycsXG4gICAgICB0aWVyOiAndGVhbScsXG4gICAgICBwcmljZXM6IHtcbiAgICAgICAgbW9udGhseTogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1RFQU1fTU9OVEhMWSwgNzkwMCksXG4gICAgICAgIGFubnVhbDogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1RFQU1fQU5OVUFMLCA3OTAwMCksXG4gICAgICB9LFxuICAgICAgZmVhdHVyZXM6IHBhcnNlRmVhdHVyZXMoXG4gICAgICAgIHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9URUFNX0ZFQVRVUkVTLFxuICAgICAgICBERUZBVUxUX1RFQU1fRkVBVFVSRVMsXG4gICAgICApLFxuICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgc29ydE9yZGVyOiAyLFxuICAgIH0sXG4gICAgZW50ZXJwcmlzZToge1xuICAgICAgaWQ6ICdlbnRlcnByaXNlJyxcbiAgICAgIG5hbWU6IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9FTlRFUlBSSVNFX05BTUUgfHwgJ0VudGVycHJpc2UnLFxuICAgICAgZGVzY3JpcHRpb246IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9FTlRFUlBSSVNFX0RFU0NSSVBUSU9OXG4gICAgICAgIHx8ICdPcmctd2lkZSBzY2FsZSB3aXRoIHVubGltaXRlZCBzZWF0cyBhbmQgcHJpb3JpdHkgc3VwcG9ydCcsXG4gICAgICB0aWVyOiAnZW50ZXJwcmlzZScsXG4gICAgICBwcmljZXM6IHtcbiAgICAgICAgbW9udGhseTogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0VOVEVSUFJJU0VfTU9OVEhMWSwgNTk5MDApLFxuICAgICAgICBhbm51YWw6IGVudkNlbnRzKHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9FTlRFUlBSSVNFX0FOTlVBTCwgNTk5MDAwKSxcbiAgICAgIH0sXG4gICAgICBmZWF0dXJlczogcGFyc2VGZWF0dXJlcyhcbiAgICAgICAgcHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX0VOVEVSUFJJU0VfRkVBVFVSRVMsXG4gICAgICAgIERFRkFVTFRfRU5URVJQUklTRV9GRUFUVVJFUyxcbiAgICAgICksXG4gICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICBzb3J0T3JkZXI6IDMsXG4gICAgfSxcbiAgICAvLyBUaGUgYmlsbGluZy1ESVNBQkxFRCBkZWZhdWx0IHBsYW46IGV2ZXJ5dGhpbmcgdW5jYXBwZWQsIGFsbCBmZWF0dXJlcywgZnJlZS5cbiAgICAvLyBTZWVkZWQgc28gdGhlIHRpZXLihpJwbGFuIG1hcHBpbmcgcmVzb2x2ZXMsIGJ1dCBuZXZlciBvZmZlcmVkIGZvciBzYWxlIOKAlCB0aGVcbiAgICAvLyByZWFkLXBsYW5zIHJvdXRlIGZpbHRlcnMgaXQgb3V0IChzZWUgY3JlYXRlUmVhZFBsYW5Sb3V0ZXMpLCBzbyBpdCdzIGhpZGRlblxuICAgIC8vIHdoZW5ldmVyIGJpbGxpbmcgaXMgZW5hYmxlZCAodGhlIG9ubHkgdGltZSAvcGxhbnMgaXMgc2VydmVkKS5cbiAgICB1bmxpbWl0ZWQ6IHtcbiAgICAgIGlkOiAndW5saW1pdGVkJyxcbiAgICAgIG5hbWU6IHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9VTkxJTUlURURfTkFNRSB8fCAnVW5saW1pdGVkJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVU5MSU1JVEVEX0RFU0NSSVBUSU9OXG4gICAgICAgIHx8ICdFdmVyeXRoaW5nIHVuY2FwcGVkIOKAlCB0aGUgZGVmYXVsdCB3aGVuIGJpbGxpbmcgaXMgZGlzYWJsZWQnLFxuICAgICAgdGllcjogJ3VubGltaXRlZCcsXG4gICAgICBwcmljZXM6IHtcbiAgICAgICAgbW9udGhseTogZW52Q2VudHMocHJvY2Vzcy5lbnYuQklMTElOR19QTEFOX1VOTElNSVRFRF9NT05USExZLCAwKSxcbiAgICAgICAgYW5udWFsOiBlbnZDZW50cyhwcm9jZXNzLmVudi5CSUxMSU5HX1BMQU5fVU5MSU1JVEVEX0FOTlVBTCwgMCksXG4gICAgICB9LFxuICAgICAgZmVhdHVyZXM6IHBhcnNlRmVhdHVyZXMoXG4gICAgICAgIHByb2Nlc3MuZW52LkJJTExJTkdfUExBTl9VTkxJTUlURURfRkVBVFVSRVMsXG4gICAgICAgIERFRkFVTFRfVU5MSU1JVEVEX0ZFQVRVUkVTLFxuICAgICAgKSxcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIHNvcnRPcmRlcjogNCxcbiAgICB9LFxuICB9O1xuXG4gIC8vIERlcml2ZSB0aGUgYXJyYXkgY29uc3VtZXJzIHJlYWQgKGBjb25maWcucGxhbnNgKSBpbiBjYW5vbmljYWwgdGllciBvcmRlci5cbiAgY29uc3QgcGxhbnM6IEJpbGxpbmdQbGFuQ29uZmlnW10gPSBWQUxJRF9USUVSUy5tYXAoKHRpZXIpID0+IHBsYW5CeVRpZXJbdGllcl0pO1xuXG4gIC8vIEJ1aWxkIGJ1bmRsZXMgT05DRSBhbmQgdGhyZWFkIHRoZW0gaW50byB0aGUgY29tYm8gbG9hZGVyICh3aGljaCBuZWVkcyB0aGVpclxuICAvLyBlbnYtZWZmZWN0aXZlIHByaWNlcykg4oCUIGF2b2lkcyBwYXJzaW5nIHRoZSB3aG9sZSBidW5kbGUgY2F0YWxvZyB0d2ljZSBwZXIgbG9hZC5cbiAgY29uc3QgYnVuZGxlcyA9IGxvYWRCdW5kbGVzKCk7XG4gIHJldHVybiB7IHBsYW5zLCBidW5kbGVzLCBjb21ib0Rpc2NvdW50czogbG9hZENvbWJvRGlzY291bnRzKGJ1bmRsZXMpIH07XG59XG5cbi8qKlxuICogQ29tYm8gZGlzY291bnRzIChkb2NzL2JpbGxpbmctYnVuZGxlcy5tZCDCp0NvbWJvIHByaWNpbmcpLiBXaGVuIGFuIGFjY291bnQgb3duc1xuICogZXZlcnkgbWVtYmVyIGJ1bmRsZSAoZWFjaCBhdCDiiaUgaXRzIG1pbmltdW0gcXVhbnRpdHkpLCB0aGUgc2V0IGlzIGJpbGxlZCBhdCB0aGVcbiAqIGNvbWJpbmVkIHByaWNlIGluc3RlYWQgb2YgdGhlIHN1bSBvZiB0aGUgbWVtYmVycyDigJQgcmVhbGl6ZWQgYXMgYSByZWN1cnJpbmcgdXNhZ2VcbiAqIGNyZWRpdCBmb3IgdGhlIGRpZmZlcmVuY2UuIE92ZXJsYXBwaW5nIGNvbWJvcyBhcmUgcmVzb2x2ZWQgYnkgbWF4LXdlaWdodCBwYWNraW5nXG4gKiAoYSBzaGFyZWQgYWRkLW9uIGlzIG5ldmVyIGRpc2NvdW50ZWQgdHdpY2UpOyBgc29ydE9yZGVyYCBicmVha3MgZXF1YWwtdG90YWwgdGllcy5cbiAqXG4gKiBEZWZhdWx0czpcbiAqICAtIFwiQW5hbHl0aWNzIFN1aXRlXCIg4oCUIEFkdmFuY2VkIFJlcG9ydGluZyAoRE9SQSkgKyBUZWFtIFVzYWdlIEFuYWx5dGljcywgZWFjaFxuICogICAgJDMwL21vLCB0b2dldGhlciAkNDIvbW8gKCQ0MjAveXIpIOKGkiBhICQxOC9tbyBjcmVkaXQgKH4zMCUgb2ZmKS5cbiAqICAtIFwiVGVhbSBHcm93dGggQnVuZGxlXCIg4oCUIOKJpTUgU2VhdHMgKCQxOS45OSBlYSkgKyBUZWFtIFVzYWdlIEFuYWx5dGljcyAoJDMwKSxcbiAqICAgIGJhc2tldCAkMTI5Ljk1L21vIOKGkiB0b2dldGhlciAkOTAuOTkvbW8gKCQ5MDkuOTAveXIpIOKGkiBhIH4kMzguOTYvbW8gY3JlZGl0ICh+MzAlIG9mZikuXG4gKiAgLSBcIlNjYWxlIEJ1bmRsZVwiIOKAlCBBUEkgUGFjayAoJDE5Ljk5KSArIFN0b3JhZ2UgUGFjayAoJDE5Ljk5KSwgYmFza2V0ICQzOS45OC9tb1xuICogICAg4oaSIHRvZ2V0aGVyICQyNy45OS9tbyAoJDI3OS45MC95cikg4oaSIGEgfiQxMS45OS9tbyBjcmVkaXQgKH4zMCUgb2ZmKS5cbiAqIFByaWNlcyBlbnYtb3ZlcnJpZGFibGUgdmlhIGBCSUxMSU5HX0NPTUJPXzxJRD5fTU9OVEhMWWAgLyBgX0FOTlVBTGAuXG4gKi9cbmZ1bmN0aW9uIGxvYWRDb21ib0Rpc2NvdW50cyhidW5kbGVzOiBCdW5kbGVDb25maWdbXSk6IENvbWJvRGlzY291bnRDb25maWdbXSB7XG4gIGNvbnN0IGMgPSAoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYnVuZGxlSWRzOiBzdHJpbmdbXSxcbiAgICBtb250aGx5OiBudW1iZXIsXG4gICAgYW5udWFsOiBudW1iZXIsXG4gICAgc29ydE9yZGVyOiBudW1iZXIsXG4gICAgbWluUXVhbnRpdGllcz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gICk6IENvbWJvRGlzY291bnRDb25maWcgPT4gKHtcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGJ1bmRsZUlkcyxcbiAgICAuLi4obWluUXVhbnRpdGllcyA/IHsgbWluUXVhbnRpdGllcyB9IDoge30pLFxuICAgIHByaWNlczoge1xuICAgICAgbW9udGhseTogZW52Q2VudHMocHJvY2Vzcy5lbnZbYEJJTExJTkdfQ09NQk9fJHtpZC50b1VwcGVyQ2FzZSgpfV9NT05USExZYF0sIG1vbnRobHkpLFxuICAgICAgYW5udWFsOiBlbnZDZW50cyhwcm9jZXNzLmVudltgQklMTElOR19DT01CT18ke2lkLnRvVXBwZXJDYXNlKCl9X0FOTlVBTGBdLCBhbm51YWwpLFxuICAgIH0sXG4gICAgc29ydE9yZGVyLFxuICAgIGlzQWN0aXZlOiB0cnVlLFxuICB9KTtcblxuICBjb25zdCBjb21ib3MgPSBbXG4gICAgYygnYW5hbHl0aWNzX3N1aXRlJywgJ0FuYWx5dGljcyBTdWl0ZScsIFsnYWR2YW5jZWRfcmVwb3J0aW5nJywgJ3RlYW1fdXNhZ2VfYW5hbHl0aWNzJ10sIDQyMDAsIDQyMDAwLCAwKSxcbiAgICAvLyBUZWFtIEdyb3d0aCDigJQg4omlNSBTZWF0cyAoJDE5Ljk5IGVhKSArIFRlYW0gVXNhZ2UgQW5hbHl0aWNzICgkMzApLiBCYXNrZXRcbiAgICAvLyA1w5ckMTkuOTkgKyAkMzAgPSAkMTI5Ljk1L21vIOKGkiBidW5kbGVkICQ5MC45OS9tbyAofjMwJSBvZmYsIH4kMzguOTYgY3JlZGl0KS5cbiAgICBjKCd0ZWFtX2dyb3d0aCcsICdUZWFtIEdyb3d0aCBCdW5kbGUnLCBbJ3NlYXQnLCAndGVhbV91c2FnZV9hbmFseXRpY3MnXSwgOTA5OSwgOTA5OTAsIDEsIHsgc2VhdDogNSB9KSxcbiAgICAvLyBDb21wbGlhbmNlIFN1aXRlIOKAlCBTdGFuZGFyZCArIEFkdmFuY2VkIGF0IDMwJSBvZmYgKCQ5MDguNjAveXIgdnMgJDEsMjk4IGxpc3QpLlxuICAgIGMoJ2NvbXBsaWFuY2Vfc3VpdGUnLCAnQ29tcGxpYW5jZSBTdWl0ZScsIFsnY29tcGxpYW5jZV9zdGFuZGFyZCcsICdjb21wbGlhbmNlX2FkdmFuY2VkJ10sIDkwODYsIDkwODYwLCAyKSxcbiAgICAvLyBTY2FsZSBCdW5kbGUg4oCUIEFQSSBQYWNrICgkMTkuOTkpICsgU3RvcmFnZSBQYWNrICgkMTkuOTkpLiBCYXNrZXQgJDM5Ljk4L21vIOKGklxuICAgIC8vIGJ1bmRsZWQgJDI3Ljk5L21vICh+MzAlIG9mZiwgfiQxMS45OSBjcmVkaXQpLiBCb3RoIG1lbWJlcnMgYWxsLXRpZXIuXG4gICAgYygnc2NhbGVfYnVuZGxlJywgJ1NjYWxlIEJ1bmRsZScsIFsnYXBpX3BhY2snLCAnc3RvcmFnZV9wYWNrJ10sIDI3OTksIDI3OTkwLCAzKSxcbiAgXTtcbiAgd2Fybk9uTm9uRGlzY291bnRDb21ib3MoY29tYm9zLCBidW5kbGVzKTtcbiAgcmV0dXJuIGNvbWJvcztcbn1cblxuLyoqXG4gKiBHdWFyZHJhaWw6IGEgY29tYm8gd2hvc2UgY29tYmluZWQgcHJpY2UgaXMg4omlIGl0cyBtaW5pbXVtLWNvbXBvc2l0aW9uIGJhc2tldCBncmFudHNcbiAqIG5vIGNyZWRpdCAodGhlIGNyZWRpdCBjbGFtcHMgdG8gJDApIGFuZCBpcyBzaWxlbnRseSBpbmVydC4gV2FybiBsb3VkbHkgaW5zdGVhZCBzbyBhXG4gKiBtaXNjb25maWd1cmVkIGBCSUxMSU5HX0NPTUJPXypgIG92ZXJyaWRlIGlzIGNhdWdodC4gTm9uLWZhdGFsLlxuICovXG5mdW5jdGlvbiB3YXJuT25Ob25EaXNjb3VudENvbWJvcyhjb21ib3M6IENvbWJvRGlzY291bnRDb25maWdbXSwgYnVuZGxlczogQnVuZGxlQ29uZmlnW10pOiB2b2lkIHtcbiAgLy8gQ29tYm8gbWVtYmVycyBhcmUgYWx3YXlzIGJ1bmRsZXM7IHJlc29sdmUgdGhlaXIgKGVudi1lZmZlY3RpdmUpIHVuaXQgcHJpY2VzIG9uY2UuXG4gIGNvbnN0IGJ5SWQgPSBuZXcgTWFwKGJ1bmRsZXMubWFwKChiKSA9PiBbYi5pZCwgYl0pKTtcbiAgZm9yIChjb25zdCBjb21ibyBvZiBjb21ib3MpIHtcbiAgICBmb3IgKGNvbnN0IGludGVydmFsIG9mIFsnbW9udGhseScsICdhbm51YWwnXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgYmFza2V0ID0gY29tYm8uYnVuZGxlSWRzLnJlZHVjZSgocywgaWQpID0+IHMgKyAoYnlJZC5nZXQoaWQpPy5wcmljZXNbaW50ZXJ2YWxdID8/IDApICogKGNvbWJvLm1pblF1YW50aXRpZXM/LltpZF0gPz8gMSksIDApO1xuICAgICAgaWYgKGNvbWJvLnByaWNlc1tpbnRlcnZhbF0gPj0gYmFza2V0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihgW2JpbGxpbmctY29uZmlnXSBDb21ibyBcIiR7Y29tYm8uaWR9XCIgJHtpbnRlcnZhbH0gcHJpY2UgJHtjb21iby5wcmljZXNbaW50ZXJ2YWxdfSDiiaUgbWVtYmVyIGJhc2tldCAke2Jhc2tldH07IGl0IGdyYW50cyBubyBkaXNjb3VudC5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgQlVORExFX0dCID0gMTAyNCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIEFwcGx5IGEgcGVyLWJ1bmRsZSBncmFudCBvdmVycmlkZS4gRWFjaCBzdGFja2FibGUgcGFjayBncmFudHMgZXhhY3RseSBvbmVcbiAqIHF1b3RhIGRpbWVuc2lvbiwgc28gYEJJTExJTkdfQlVORExFXzxJRD5fR1JBTlRgIHJldHVuZXMgdGhhdCBhbW91bnQgKGUuZy4gbWFrZVxuICogdGhlIFBsdWdpbiBQYWNrIGdyYW50ICs1MCBpbnN0ZWFkIG9mICsyNSkg4oCUIHBhcmFsbGVsIHRvIHRoZSBwcmljZSBvdmVycmlkZXMuXG4gKiBJZ25vcmVkIGZvciBtdWx0aS1kaW1lbnNpb24gb3IgZmVhdHVyZS1vbmx5IChlbXB0eS1ncmFudCkgYnVuZGxlcywgYW5kIGZvciBhXG4gKiBtYWxmb3JtZWQvbmVnYXRpdmUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5R3JhbnRPdmVycmlkZShpZDogc3RyaW5nLCBncmFudHM6IEdyYW50TWFwKTogR3JhbnRNYXAge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudltgQklMTElOR19CVU5ETEVfJHtpZC50b1VwcGVyQ2FzZSgpfV9HUkFOVGBdO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZ3JhbnRzKTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycgfHwga2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBncmFudHM7XG4gIGNvbnN0IG4gPSBwYXJzZUludChyYXcsIDEwKTtcbiAgaWYgKE51bWJlci5pc05hTihuKSB8fCBuIDwgMCkgcmV0dXJuIGdyYW50cztcbiAgLy8gYGtleXNgIGNhbWUgZnJvbSBhIEdyYW50TWFwLCBzbyBpdHMgc29sZSBrZXkgaXMgYSBRdW90YVRpZXJMaW1pdHMgZmllbGQuXG4gIHJldHVybiB7IFtrZXlzWzBdIGFzIGtleW9mIFF1b3RhVGllckxpbWl0c106IG4gfTtcbn1cblxuLyoqXG4gKiBBcHBseSBhIHBlci1idW5kbGUgdGllci1hdmFpbGFiaWxpdHkgb3ZlcnJpZGUuIGBCSUxMSU5HX0JVTkRMRV88SUQ+X1RJRVJTYCBpcyBhXG4gKiBKU09OIGFycmF5IG9mIHRpZXIgSURzIHRoYXQgbWF5IHB1cmNoYXNlIHRoZSBidW5kbGUgKGUuZy4gYFtcImRldmVsb3BlclwiLFwicHJvXCJdYClcbiAqIOKAlCBwYXJhbGxlbCB0byB0aGUgcHJpY2UvZ3JhbnQgb3ZlcnJpZGVzLiBGYWxscyBiYWNrIHRvIGBkZWZhdWx0VGllcnNgIHdoZW5cbiAqIHVuc2V0LCBtYWxmb3JtZWQsIGVtcHR5LCBvciBjb250YWluaW5nIGFuIHVua25vd24gdGllci5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUaWVyc092ZXJyaWRlKGlkOiBzdHJpbmcsIGRlZmF1bHRUaWVyczogUXVvdGFUaWVyW10pOiBRdW90YVRpZXJbXSB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W2BCSUxMSU5HX0JVTkRMRV8ke2lkLnRvVXBwZXJDYXNlKCl9X1RJRVJTYF07XG4gIGlmICghcmF3KSByZXR1cm4gZGVmYXVsdFRpZXJzO1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyc2VkKSB8fCBwYXJzZWQubGVuZ3RoID09PSAwKSByZXR1cm4gZGVmYXVsdFRpZXJzO1xuICAgIGNvbnN0IHZhbGlkID0gcGFyc2VkLmZpbHRlcigodCk6IHQgaXMgUXVvdGFUaWVyID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyAmJiBpc1ZhbGlkVGllcih0KSk7XG4gICAgcmV0dXJuIHZhbGlkLmxlbmd0aCA9PT0gcGFyc2VkLmxlbmd0aCA/IHZhbGlkIDogZGVmYXVsdFRpZXJzO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZGVmYXVsdFRpZXJzO1xuICB9XG59XG5cbnR5cGUgVm9sdW1lVGllciA9IHsgbWluUXVhbnRpdHk6IG51bWJlcjsgZGlzY291bnRQZXJjZW50OiBudW1iZXIgfTtcblxuLyoqXG4gKiBBcHBseSBhIHBlci1idW5kbGUgdm9sdW1lLXRpZXIgb3ZlcnJpZGUuIGBCSUxMSU5HX0JVTkRMRV88SUQ+X1ZPTFVNRV9USUVSU2AgaXMgYVxuICogSlNPTiBhcnJheSBvZiBgeyBtaW5RdWFudGl0eSwgZGlzY291bnRQZXJjZW50IH1gIChlLmcuXG4gKiBgW3tcIm1pblF1YW50aXR5XCI6NSxcImRpc2NvdW50UGVyY2VudFwiOjEwfV1gKSDigJQgcGFyYWxsZWwgdG8gdGhlIHByaWNlL2dyYW50L3RpZXJcbiAqIG92ZXJyaWRlcy4gRmFsbHMgYmFjayB0byBgZGVmYXVsdFRpZXJzYCB3aGVuIHVuc2V0LCBtYWxmb3JtZWQsIG9yIGNvbnRhaW5pbmcgYW5cbiAqIGludmFsaWQgZW50cnkgKG1pblF1YW50aXR5IOKJpSAxLCAwIDwgZGlzY291bnRQZXJjZW50IOKJpCAxMDApLiBTb3J0ZWQgYXNjZW5kaW5nIGJ5XG4gKiBtaW5RdWFudGl0eSBzbyB0aGUgXCJoaWdoZXN0IG1hdGNoaW5nIHRpZXIgd2luc1wiIGxvb2t1cCBpcyBkZXRlcm1pbmlzdGljLlxuICovXG5mdW5jdGlvbiBhcHBseVZvbHVtZVRpZXJzT3ZlcnJpZGUoaWQ6IHN0cmluZywgZGVmYXVsdFRpZXJzPzogVm9sdW1lVGllcltdKTogVm9sdW1lVGllcltdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnZbYEJJTExJTkdfQlVORExFXyR7aWQudG9VcHBlckNhc2UoKX1fVk9MVU1FX1RJRVJTYF07XG4gIGNvbnN0IHNvcnRBc2MgPSAodDogVm9sdW1lVGllcltdKSA9PiBbLi4udF0uc29ydCgoYSwgYikgPT4gYS5taW5RdWFudGl0eSAtIGIubWluUXVhbnRpdHkpO1xuICBpZiAoIXJhdykgcmV0dXJuIGRlZmF1bHRUaWVycyA/IHNvcnRBc2MoZGVmYXVsdFRpZXJzKSA6IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZCkgfHwgcGFyc2VkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGRlZmF1bHRUaWVycyA/IHNvcnRBc2MoZGVmYXVsdFRpZXJzKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWxpZCA9IHBhcnNlZC5maWx0ZXIoKHQpOiB0IGlzIFZvbHVtZVRpZXIgPT5cbiAgICAgIHQgJiYgdHlwZW9mIHQubWluUXVhbnRpdHkgPT09ICdudW1iZXInICYmIHQubWluUXVhbnRpdHkgPj0gMVxuICAgICAgJiYgdHlwZW9mIHQuZGlzY291bnRQZXJjZW50ID09PSAnbnVtYmVyJyAmJiB0LmRpc2NvdW50UGVyY2VudCA+IDAgJiYgdC5kaXNjb3VudFBlcmNlbnQgPD0gMTAwKTtcbiAgICByZXR1cm4gdmFsaWQubGVuZ3RoID09PSBwYXJzZWQubGVuZ3RoID8gc29ydEFzYyh2YWxpZCkgOiAoZGVmYXVsdFRpZXJzID8gc29ydEFzYyhkZWZhdWx0VGllcnMpIDogdW5kZWZpbmVkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGRlZmF1bHRUaWVycyA/IHNvcnRBc2MoZGVmYXVsdFRpZXJzKSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFB1cmNoYXNhYmxlIGFkZC1vbiBidW5kbGVzIChkb2NzL2JpbGxpbmctYnVuZGxlcy5tZCDCpzMpLiBHcmFudHMgYXJlIHBlci11bml0XG4gKiBkZWx0YXMgb24gUXVvdGFUaWVyTGltaXRzOyBwcmljZXMgKGNlbnRzLCBgQklMTElOR19CVU5ETEVfPElEPl9NT05USExZYCAvXG4gKiBgX0FOTlVBTGApLCB0aGUgc2luZ2xlLWRpbWVuc2lvbiBncmFudCBhbW91bnQgKGBCSUxMSU5HX0JVTkRMRV88SUQ+X0dSQU5UYCksXG4gKiBhbmQgdGhlIHB1cmNoYXNhYmxlLXRpZXIgbGlzdCAoYEJJTExJTkdfQlVORExFXzxJRD5fVElFUlNgKSBhcmUgYWxsXG4gKiBlbnYtb3ZlcnJpZGFibGUuIEFubnVhbCDiiYggMTDDlyBtb250aGx5LlxuICovXG5mdW5jdGlvbiBsb2FkQnVuZGxlcygpOiBCdW5kbGVDb25maWdbXSB7XG4gIGNvbnN0IGIgPSAoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBncmFudHM6IEdyYW50TWFwLFxuICAgIG1vbnRobHk6IG51bWJlcixcbiAgICBhdmFpbGFibGVGb3JUaWVyczogUXVvdGFUaWVyW10sXG4gICAgc29ydE9yZGVyOiBudW1iZXIsXG4gICAgZXh0cmE6IHsgZmVhdHVyZXM/OiBzdHJpbmdbXTsgc3RhY2thYmxlPzogYm9vbGVhbjsgbWF4UXVhbnRpdHk/OiBudW1iZXI7IHJlcXVpcmVzPzogc3RyaW5nW107IHZvbHVtZVRpZXJzPzogVm9sdW1lVGllcltdIH0gPSB7fSxcbiAgKTogQnVuZGxlQ29uZmlnID0+IHtcbiAgICAvLyBSZXNvbHZlIG1vbnRobHkgZmlyc3Qgc28gdGhlIGFubnVhbCBmYWxsYmFjayB0cmFja3MgYSBgX01PTlRITFlgIG92ZXJyaWRlXG4gICAgLy8gKGFubnVhbCDiiYggMTDDlyB0aGUgKmVmZmVjdGl2ZSogbW9udGhseSwgbm90IHRoZSBoYXJkY29kZWQgZGVmYXVsdCkuXG4gICAgY29uc3QgcmVzb2x2ZWRNb250aGx5ID0gZW52Q2VudHMocHJvY2Vzcy5lbnZbYEJJTExJTkdfQlVORExFXyR7aWQudG9VcHBlckNhc2UoKX1fTU9OVEhMWWBdLCBtb250aGx5KTtcbiAgICBjb25zdCB2b2x1bWVUaWVycyA9IGFwcGx5Vm9sdW1lVGllcnNPdmVycmlkZShpZCwgZXh0cmEudm9sdW1lVGllcnMpO1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGdyYW50czogYXBwbHlHcmFudE92ZXJyaWRlKGlkLCBncmFudHMpLFxuICAgICAgLi4uKGV4dHJhLmZlYXR1cmVzID8geyBmZWF0dXJlczogZXh0cmEuZmVhdHVyZXMgfSA6IHt9KSxcbiAgICAgIC4uLihleHRyYS5tYXhRdWFudGl0eSAhPT0gdW5kZWZpbmVkID8geyBtYXhRdWFudGl0eTogZXh0cmEubWF4UXVhbnRpdHkgfSA6IHt9KSxcbiAgICAgIC4uLihleHRyYS5yZXF1aXJlcyA/IHsgcmVxdWlyZXM6IGV4dHJhLnJlcXVpcmVzIH0gOiB7fSksXG4gICAgICAuLi4odm9sdW1lVGllcnMgPyB7IHZvbHVtZVRpZXJzIH0gOiB7fSksXG4gICAgICBwcmljZXM6IHtcbiAgICAgICAgbW9udGhseTogcmVzb2x2ZWRNb250aGx5LFxuICAgICAgICBhbm51YWw6IGVudkNlbnRzKHByb2Nlc3MuZW52W2BCSUxMSU5HX0JVTkRMRV8ke2lkLnRvVXBwZXJDYXNlKCl9X0FOTlVBTGBdLCByZXNvbHZlZE1vbnRobHkgKiAxMCksXG4gICAgICB9LFxuICAgICAgc3RhY2thYmxlOiBleHRyYS5zdGFja2FibGUgPz8gdHJ1ZSxcbiAgICAgIGF2YWlsYWJsZUZvclRpZXJzOiBhcHBseVRpZXJzT3ZlcnJpZGUoaWQsIGF2YWlsYWJsZUZvclRpZXJzKSxcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxuICAgICAgc29ydE9yZGVyLFxuICAgIH07XG4gIH07XG5cbiAgLy8gQnVuZGxlcyBhcmUgcHVyY2hhc2FibGUgb24gZXZlcnkgU0VMRUNUQUJMRSB0aWVyIChleGNsdWRlcyBgdW5saW1pdGVkYCwgd2hpY2hcbiAgLy8gaXMgdGhlIGJpbGxpbmctb2ZmIHRpZXIgYW5kIGJ1eXMgbm90aGluZykg4oCUIHNvIHRoaXMgaXMgZXhhY3RseSBTVEFOREFSRF9USUVSUy5cbiAgY29uc3QgQUxMOiBRdW90YVRpZXJbXSA9IFsuLi5TVEFOREFSRF9USUVSU107XG4gIGNvbnN0IGJ1bmRsZXM6IEJ1bmRsZUNvbmZpZ1tdID0gW1xuICAgIC8vIGBzZWF0YCBhbmQgYHBpcGVsaW5lX3BhY2tgIGFyZSB0aGUgdGllciBkaWZmZXJlbnRpYXRvcnMsIHNvIGJvdGggYXJlIFRlYW0rXG4gICAgLy8gT05MWSDigJQgYSBzaW5nbGUtc2VhdCBEZXZlbG9wZXIvUHJvIGNhbid0IGNoZWFwbHkgc3RhY2sgc2VhdHMvcGlwZWxpbmVzIHRvXG4gICAgLy8gdW5kZXJjdXQgVGVhbSAoMyBzZWF0cyAvIDYgcGlwZWxpbmVzKTsgdGhleSBtdXN0IHVwZ3JhZGUuIGBzZWF0YCBpcyBncmFudWxhclxuICAgIC8vIChwZXItc2VhdCkgd2l0aCB2b2x1bWUgdGllcnMgKDUvMTUvNDAg4oaSIDEwLzIwLzMwJSkuIFRoZSBvdGhlciBjYXBhY2l0eSBwYWNrc1xuICAgIC8vIChwbHVnaW4vYXBpL2FpL3N0b3JhZ2UpIGFyZSBOT1QgZGlmZmVyZW50aWF0b3JzLCBzbyB0aGV5IHN0YXkgYWxsLXRpZXIuXG4gICAgYignc2VhdCcsICdNZW1iZXIgU2VhdCcsICcxIGFkZGl0aW9uYWwgbWVtYmVyIHNlYXQnLCB7IHNlYXRzOiAxIH0sIDE5OTksIFsndGVhbScsICdlbnRlcnByaXNlJ10sIDAsXG4gICAgICB7IHZvbHVtZVRpZXJzOiBbeyBtaW5RdWFudGl0eTogNSwgZGlzY291bnRQZXJjZW50OiAxMCB9LCB7IG1pblF1YW50aXR5OiAxNSwgZGlzY291bnRQZXJjZW50OiAyMCB9LCB7IG1pblF1YW50aXR5OiA0MCwgZGlzY291bnRQZXJjZW50OiAzMCB9XSB9KSxcbiAgICBiKCdwaXBlbGluZV9wYWNrJywgJ1BpcGVsaW5lIFBhY2sgKCs1KScsICc1IGFkZGl0aW9uYWwgcGlwZWxpbmVzJywgeyBwaXBlbGluZXM6IDUgfSwgMTUwMCwgWyd0ZWFtJywgJ2VudGVycHJpc2UnXSwgMSksXG4gICAgYigncGx1Z2luX3BhY2snLCAnUGx1Z2luIFBhY2sgKCsyNSknLCAnMjUgYWRkaXRpb25hbCBwbHVnaW5zJywgeyBwbHVnaW5zOiAyNSB9LCAxMDAwLCBBTEwsIDIpLFxuICAgIGIoJ2FwaV9wYWNrJywgJ0FQSSBQYWNrICgrMTAwayknLCAnMTAwLDAwMCBhZGRpdGlvbmFsIEFQSSBjYWxscyAvIHBlcmlvZCcsIHsgYXBpQ2FsbHM6IDEwMF8wMDAgfSwgMTk5OSwgQUxMLCAzKSxcbiAgICBiKCdhaV9wYWNrJywgJ0FJIFBhY2sgKCsyLjVrKScsICcyLDUwMCBhZGRpdGlvbmFsIEFJIGNhbGxzIC8gcGVyaW9kJywgeyBhaUNhbGxzOiAyNTAwIH0sIDE5OTksIEFMTCwgNCksXG4gICAgYignc3RvcmFnZV9wYWNrJywgJ1N0b3JhZ2UgUGFjayAoKzEwIEdCKScsICcxMCBHQiBhZGRpdGlvbmFsIHJlZ2lzdHJ5IHN0b3JhZ2UnLCB7IHN0b3JhZ2VCeXRlczogMTAgKiBCVU5ETEVfR0IgfSwgMTk5OSwgQUxMLCA1KSxcbiAgICBiKCdhdWRpdF9sb2cnLCAnQXVkaXQgTG9nJywgJ0F1ZGl0IGxvZyBjYXBhYmlsaXR5Jywge30sIDIwMDAsIFsncHJvJ10sIDYsIHsgZmVhdHVyZXM6IFsnYXVkaXRfbG9nJ10sIHN0YWNrYWJsZTogZmFsc2UgfSksXG4gICAgLy8gU1NPIGlzIElOQ0xVREVEIGluIFRlYW0gKHNlZSBUSUVSX0ZFQVRVUkVTLnRlYW0pLCBzbyB0aGUgYWRkLW9uIGlzIFByby1vbmx5LlxuICAgIGIoJ3NzbycsICdTU08gLyBJZFAnLCAnU1NPICsgdXAgdG8gNSBJZFAgY29uZmlncycsIHsgaWRwQ29uZmlnczogNSB9LCA0MDAwLCBbJ3BybyddLCA3LCB7IGZlYXR1cmVzOiBbJ3NzbyddLCBzdGFja2FibGU6IGZhbHNlIH0pLFxuICAgIC8vIERPUkEgLyBhZHZhbmNlZCBkZWxpdmVyeSBhbmFseXRpY3MuIElOQ0xVREVEIGluIEVudGVycHJpc2UgKFRJRVJfRkVBVFVSRVMpLFxuICAgIC8vIHNvIHRoZSBhZGQtb24gaXMgb2ZmZXJlZCB0byBldmVyeSBvdGhlciB0aWVyIChkZXZlbG9wZXIvcHJvL3RlYW0pLiBQcmljZWRcbiAgICAvLyBiZXR3ZWVuIEF1ZGl0IExvZyAoJDIwKSBhbmQgU1NPICgkNDApIOKAlCBhIGhpZ2hlci12YWx1ZSwgYWN0aXZlbHktdXNlZFxuICAgIC8vIGFuYWx5dGljcyBzdXJmYWNlIHRoYW4gdGhlIGF1ZGl0IGxvZywgYnV0IGJlbG93IHRoZSBTU08gZW50ZXJwcmlzZSBnYXRlLlxuICAgIGIoJ2FkdmFuY2VkX3JlcG9ydGluZycsICdBZHZhbmNlZCBSZXBvcnRpbmcgKERPUkEpJywgJ0RPUkEgZGVsaXZlcnkgbWV0cmljcyDigJQgZGVwbG95bWVudCBmcmVxdWVuY3ksIGNoYW5nZSBmYWlsdXJlIHJhdGUsIE1UVFIsIGxlYWQtdGltZSBwcm94eSwgcGVyZm9ybWFuY2UgYmFuZHMgKyB0cmVuZCcsIHt9LCAzMDAwLCBbJ2RldmVsb3BlcicsICdwcm8nLCAndGVhbSddLCA4LCB7IGZlYXR1cmVzOiBbJ2FkdmFuY2VkX3JlcG9ydGluZyddLCBzdGFja2FibGU6IGZhbHNlIH0pLFxuICAgIC8vIFBlci10ZWFtIHVzYWdlIGJyZWFrZG93biBhY3Jvc3MgdGhlIG9yZyDihpIgdGVhbSBzdWJ0cmVlLiBJTkNMVURFRCBpblxuICAgIC8vIEVudGVycHJpc2UgKFRJRVJfRkVBVFVSRVMpOyB0aGUgYWRkLW9uIGlzIG9mZmVyZWQgdG8gUHJvL1RlYW0gKGRldmVsb3BlciBoYXNcbiAgICAvLyBubyB0ZWFtcyB0byBicmVhayBkb3duKS4gUHJpY2VkIGF0ICQzMC9tbyAoJDMwMC95cikg4oCUIHBhcml0eSB3aXRoIERPUkEsIGl0c1xuICAgIC8vIGFuYWx5dGljcyBzaWJsaW5nLiBPdmVycmlkYWJsZSB2aWEgQklMTElOR19CVU5ETEVfVEVBTV9VU0FHRV9BTkFMWVRJQ1NfTU9OVEhMWS9fQU5OVUFMLlxuICAgIGIoJ3RlYW1fdXNhZ2VfYW5hbHl0aWNzJywgJ1RlYW0gVXNhZ2UgQW5hbHl0aWNzJywgJ1Blci10ZWFtIHVzYWdlIGJyZWFrZG93biBhY3Jvc3MgdGhlIG9yZyDihpIgdGVhbSBzdWJ0cmVlIChhbGwgcXVvdGEgZGltZW5zaW9ucyknLCB7fSwgMzAwMCwgWydwcm8nLCAndGVhbSddLCA5LCB7IGZlYXR1cmVzOiBbJ3RlYW1fdXNhZ2VfYW5hbHl0aWNzJ10sIHN0YWNrYWJsZTogZmFsc2UgfSksXG4gICAgLy8gUmV0ZW50aW9uIHBhY2tzIChkb2NzL2JpbGxpbmctYnVuZGxlcy5tZCkuIFN0YWNrYWJsZSBjYXBhY2l0eSBwYWNrcyB0aGF0XG4gICAgLy8gcmFpc2UgdGhlIHJlcG9ydGluZyByZXRlbnRpb24gZW50aXRsZW1lbnQgYmlsbGluZyBzeW5jcyB0byByZXBvcnRpbmcnc1xuICAgIC8vIGBkb3JhX3NldHRpbmdzYC4gTk9UIHF1b3RhLW1ldGVyZWQgZmxvdyDigJQgYGV2ZW50UmV0ZW50aW9uRGF5c2AvYGRvcmFSZXRlbnRpb25EYXlzYFxuICAgIC8vIGFyZSBhYnNlbnQgZnJvbSBWQUxJRF9RVU9UQV9UWVBFUywgc28gdGhleSBuZXZlciByaWRlIHRoZSBxdW90YS1zZXJ2aWNlIGxlZy5cbiAgICAvLyBTdGFuZGFyZCBSZXRlbnRpb24gUGFjazogKzkwZCBzdGFuZGFyZC1ldmVudCByZXRlbnRpb24gKGJhc2UgMzAg4oaSIDEyMCDihpIgMjEw4oCmKS5cbiAgICAvLyBDYXBwZWQgYXQgNyAoMzAgKyA3w5c5MCA9IDY2MCDiiaQgdGhlIDczMC1kYXkgcmV0ZW50aW9uIGNlaWxpbmcpLlxuICAgIGIoJ3JldGVudGlvbl9wYWNrJywgJ1N0YW5kYXJkIFJldGVudGlvbiBQYWNrICgrOTBkKScsICc5MCBhZGRpdGlvbmFsIGRheXMgb2Ygc3RhbmRhcmQgcGlwZWxpbmUtZXZlbnQgcmV0ZW50aW9uJywgeyBldmVudFJldGVudGlvbkRheXM6IDkwIH0sIDE1MDAsIEFMTCwgMTAsIHsgbWF4UXVhbnRpdHk6IDcgfSksXG4gICAgLy8gRE9SQSBIaXN0b3J5IFBhY2s6ICszNjVkIERPUkEgcmV0ZW50aW9uIEFORCBwZXItb3JnIHJlcG9ydC1xdWVyeSB3aW5kb3cgKHRoZVxuICAgIC8vIHdpbmRvdyBjYXAgdHJhY2tzIGRvcmFSZXRlbnRpb25EYXlzKS4gT25seSBtZWFuaW5nZnVsIHdpdGggQWR2YW5jZWQgUmVwb3J0aW5nXG4gICAgLy8g4oCUIElOQ0xVREVEIGluIEVudGVycHJpc2UsIGFuIGFkZC1vbiBvbiBkZXZlbG9wZXIvcHJvL3RlYW0uIENhcHBlZCBhdCAxXG4gICAgLy8gKDE4MCArIDM2NSA9IDU0NSDiiaQgdGhlIDczMC1kYXkgcmV0ZW50aW9uIGNlaWxpbmcpLlxuICAgIGIoJ2RvcmFfaGlzdG9yeV9wYWNrJywgJ0RPUkEgSGlzdG9yeSBQYWNrICgrMzY1ZCknLCAnMzY1IGFkZGl0aW9uYWwgZGF5cyBvZiBET1JBIGhpc3RvcnkgKyByZXBvcnQtcXVlcnkgd2luZG93IChyZXF1aXJlcyBBZHZhbmNlZCBSZXBvcnRpbmcpJywgeyBkb3JhUmV0ZW50aW9uRGF5czogMzY1IH0sIDMwMDAsIEFMTCwgMTEsIHsgbWF4UXVhbnRpdHk6IDEgfSksXG4gICAgLy8gQ29tcGxpYW5jZSBjb250ZW50IGFkZC1vbnMgKGRvY3MvcGxhbnMvY29tcGxpYW5jZS1hZGRvbnMubWQpLiBGZWF0dXJlIGJ1bmRsZXNcbiAgICAvLyBnYXRpbmcgYWNjZXNzIHRvIGN1cmF0ZWQgc3lzdGVtLW9yZyBwdWJsaXNoZWQgcnVsZSBzZXRzLiBJTkNMVURFRCBpblxuICAgIC8vIEVudGVycHJpc2UvVW5saW1pdGVkICh2aWEgQUxMX0ZFQVRVUkVfRkxBR1MpOyBzb2xkIHRvIERldmVsb3Blci9Qcm8vVGVhbS5cbiAgICAvLyBTdGFuZGFyZCA9IH4yMCBDSS9DRCBiZXN0LXByYWN0aWNlIHJ1bGVzLiBBZHZhbmNlZCA9IFNPQzIvUENJL0NJUyBmcmFtZXdvcmtcbiAgICAvLyBsaWJyYXJpZXM7IFJFUVVJUkVTIFN0YW5kYXJkIChvciBidXkgdGhlIFN1aXRlIGNvbWJvIGZvciBib3RoIGF0IDMwJSBvZmYpLlxuICAgIGIoJ2NvbXBsaWFuY2Vfc3RhbmRhcmQnLCAnU3RhbmRhcmQgQ29tcGxpYW5jZScsICdDdXJhdGVkIENJL0NEIGJlc3QtcHJhY3RpY2UgY29tcGxpYW5jZSBydWxlcycsIHt9LCAyOTkwLCBbJ2RldmVsb3BlcicsICdwcm8nLCAndGVhbSddLCAxMiwgeyBmZWF0dXJlczogWydjb21wbGlhbmNlX3N0YW5kYXJkJ10sIHN0YWNrYWJsZTogZmFsc2UgfSksXG4gICAgYignY29tcGxpYW5jZV9hZHZhbmNlZCcsICdBZHZhbmNlZCBDb21wbGlhbmNlJywgJ0N1cmF0ZWQgZnJhbWV3b3JrIGNvbXBsaWFuY2UgbGlicmFyaWVzIChTT0MyIC8gUENJLURTUyAvIENJUyknLCB7fSwgOTk5MCwgWydkZXZlbG9wZXInLCAncHJvJywgJ3RlYW0nXSwgMTMsIHsgZmVhdHVyZXM6IFsnY29tcGxpYW5jZV9hZHZhbmNlZCddLCBzdGFja2FibGU6IGZhbHNlLCByZXF1aXJlczogWydjb21wbGlhbmNlX3N0YW5kYXJkJ10gfSksXG4gIF07XG4gIGFzc2VydEJ1bmRsZVJlcXVpcmVzVmFsaWQoYnVuZGxlcyk7XG4gIHJldHVybiBidW5kbGVzO1xufVxuXG4vKipcbiAqIENvbmZpZy1sb2FkIGd1YXJkcmFpbCBmb3IgdGhlIGByZXF1aXJlc2AgcHJlcmVxdWlzaXRlIGdyYXBoLiBBIGByZXF1aXJlc2AgZW50cnlcbiAqIHRoYXQgZG9lc24ndCByZXNvbHZlIHRvIGFuIEFDVElWRSBidW5kbGUg4oCUIG9yIHRoYXQgcGFydGljaXBhdGVzIGluIGEgY3ljbGUg4oCUXG4gKiBzaWxlbnRseSBtYWtlcyB0aGUgcmVmZXJlbmNpbmcgYnVuZGxlIHVucHVyY2hhc2FibGUgKHRoZSBhZGRvbiByb3V0ZSByZWplY3RzXG4gKiB3aXRoIDQwMCBmb3JldmVyIGJlY2F1c2UgdGhlIHByZXJlcXVpc2l0ZSBjYW4gbmV2ZXIgYmUgc2F0aXNmaWVkKS4gQ2F0Y2ggaXQgYXRcbiAqIGxvYWQgd2l0aCBhIGNsZWFyIGVycm9yIHJhdGhlciB0aGFuIHNoaXBwaW5nIGEgZGVhZCBTS1UuXG4gKlxuICogIC0gRXZlcnkgaWQgaW4gYSBidW5kbGUncyBgcmVxdWlyZXNgIE1VU1QgbmFtZSBhbiBhY3RpdmUgYnVuZGxlIGluIHRoZSBjYXRhbG9nLlxuICogIC0gVGhlIGByZXF1aXJlc2AgZ3JhcGggTVVTVCBiZSBhY3ljbGljIChhIOKGkiBiIOKGkiBhIGNhbiBuZXZlciBiZSBzYXRpc2ZpZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QnVuZGxlUmVxdWlyZXNWYWxpZChidW5kbGVzOiBCdW5kbGVDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBhY3RpdmUgPSBuZXcgTWFwKGJ1bmRsZXMuZmlsdGVyKChiKSA9PiBiLmlzQWN0aXZlKS5tYXAoKGIpID0+IFtiLmlkLCBiXSkpO1xuXG4gIC8vIDEuIFZhbGlkaXR5OiBldmVyeSByZXF1aXJlcyBpZCByZXNvbHZlcyB0byBhbiBhY3RpdmUgYnVuZGxlLlxuICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgZm9yIChjb25zdCByZXFJZCBvZiBidW5kbGUucmVxdWlyZXMgPz8gW10pIHtcbiAgICAgIGlmICghYWN0aXZlLmhhcyhyZXFJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBbYmlsbGluZy1jb25maWddIEJ1bmRsZSBcIiR7YnVuZGxlLmlkfVwiIHJlcXVpcmVzIFwiJHtyZXFJZH1cIiwgd2hpY2ggaXMgbm90IGFuIGFjdGl2ZSBidW5kbGUgaW4gdGhlIGNhdGFsb2cg4oCUIGl0IHdvdWxkIGJlIHBlcm1hbmVudGx5IHVucHVyY2hhc2FibGUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAyLiBBY3ljbGljaXR5OiBERlMgb3ZlciB0aGUgcmVxdWlyZXMgZWRnZXMsIHRyYWNraW5nIHRoZSBjdXJyZW50IHBhdGguXG4gIGNvbnN0IFZJU0lUSU5HID0gMTtcbiAgY29uc3QgRE9ORSA9IDI7XG4gIGNvbnN0IHN0YXRlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBjb25zdCB2aXNpdCA9IChpZDogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHMgPSBzdGF0ZS5nZXQoaWQpO1xuICAgIGlmIChzID09PSBET05FKSByZXR1cm47XG4gICAgaWYgKHMgPT09IFZJU0lUSU5HKSB7XG4gICAgICBjb25zdCBjeWNsZSA9IFsuLi5wYXRoLnNsaWNlKHBhdGguaW5kZXhPZihpZCkpLCBpZF0uam9pbignIC0+ICcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbYmlsbGluZy1jb25maWddIEJ1bmRsZSBcInJlcXVpcmVzXCIgY3ljbGUgZGV0ZWN0ZWQ6ICR7Y3ljbGV9LmApO1xuICAgIH1cbiAgICBzdGF0ZS5zZXQoaWQsIFZJU0lUSU5HKTtcbiAgICBmb3IgKGNvbnN0IHJlcUlkIG9mIGFjdGl2ZS5nZXQoaWQpPy5yZXF1aXJlcyA/PyBbXSkge1xuICAgICAgdmlzaXQocmVxSWQsIFsuLi5wYXRoLCBpZF0pO1xuICAgIH1cbiAgICBzdGF0ZS5zZXQoaWQsIERPTkUpO1xuICB9O1xuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGFjdGl2ZS5rZXlzKCkpIHtcbiAgICB2aXNpdChidW5kbGUsIFtdKTtcbiAgfVxufVxuIl19
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=
@@ -7,7 +7,7 @@
7
7
  * one implementation instead of re-deriving the coalesce. Pure: the tier limits
8
8
  * come from api-core (`getTierLimits`) and the bundle catalog is passed in.
9
9
  */
10
- import { type QuotaTier } from '@pipeline-builder/api-core';
10
+ import { type QuotaTier, type QuotaTierLimits } from '@pipeline-builder/api-core';
11
11
  import type { BundleConfig } from './config-types.js';
12
12
  /**
13
13
  * Compute an account's EFFECTIVE entitlements = tier base limits + Σ(bundle
@@ -18,6 +18,6 @@ export declare function effectiveEntitlements(tier: QuotaTier, addons: ReadonlyA
18
18
  bundleId: string;
19
19
  quantity: number;
20
20
  }>, bundles: readonly BundleConfig[]): {
21
- limits: Record<string, number>;
21
+ limits: Record<keyof QuotaTierLimits, number>;
22
22
  features: string[];
23
23
  };
@@ -23,15 +23,17 @@ export function effectiveEntitlements(tier, addons, bundles) {
23
23
  const bundle = byId.get(bundleId);
24
24
  if (!bundle || quantity <= 0)
25
25
  continue;
26
- // Enforce the non-stackable invariant in the CANONICAL math, not just at the
27
- // purchase route: a `stackable:false` bundle counts once regardless of a
28
- // stored quantity > 1, so a non-route caller (drift reconciler,
29
- // subscription-lifecycle) can't over-grant its quota.
30
- const effectiveQty = bundle.stackable ? quantity : 1;
31
- for (const [field, delta] of Object.entries(bundle.grants)) {
26
+ // Enforce the non-stackable invariant AND the maxQuantity ceiling in the
27
+ // CANONICAL math, not just at the purchase route: a `stackable:false` bundle
28
+ // counts once, and a stackable pack is clamped to its `maxQuantity` — so a
29
+ // non-route caller (drift reconciler, subscription-lifecycle) can't over-grant
30
+ // a quota from a stored/drifted quantity (e.g. a retention pack past its cap).
31
+ const effectiveQty = bundle.stackable ? Math.min(quantity, bundle.maxQuantity ?? quantity) : 1;
32
+ for (const [rawField, delta] of Object.entries(bundle.grants)) {
32
33
  // `grants` is a Partial map, so a value can be undefined — skip those.
33
34
  if (delta === undefined)
34
35
  continue;
36
+ const field = rawField; // grants keys ARE quota fields
35
37
  if (limits[field] === -1)
36
38
  continue; // already unlimited
37
39
  limits[field] = (limits[field] ?? 0) + delta * effectiveQty;
@@ -41,4 +43,4 @@ export function effectiveEntitlements(tier, addons, bundles) {
41
43
  }
42
44
  return { limits, features: [...features] };
43
45
  }
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9lbnRpdGxlbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQWtCLE1BQU0sNEJBQTRCLENBQUM7QUFHM0U7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsSUFBZSxFQUNmLE1BQTZELEVBQzdELE9BQWdDO0lBRWhDLE1BQU0sTUFBTSxHQUEyQixFQUFFLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELEtBQUssTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQ3ZDLDZFQUE2RTtRQUM3RSx5RUFBeUU7UUFDekUsZ0VBQWdFO1FBQ2hFLHNEQUFzRDtRQUN0RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMzRCx1RUFBdUU7WUFDdkUsSUFBSSxLQUFLLEtBQUssU0FBUztnQkFBRSxTQUFTO1lBQ2xDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFBRSxTQUFTLENBQUMsb0JBQW9CO1lBQ3hELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsWUFBWSxDQUFDO1FBQzlELENBQUM7UUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRTtZQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBFZmZlY3RpdmUtZW50aXRsZW1lbnQgbWF0aCBmb3IgdGhlIGFjY291bnQvZW50aXRsZW1lbnQgbW9kZWwuXG4gKlxuICogVGhlIGNhbm9uaWNhbCBcImVmZmVjdGl2ZSBsaW1pdHMgPSB0aWVyIGJhc2UgKyDOoyhidW5kbGUgZ3JhbnRzKVwiIGNvbXB1dGF0aW9uXG4gKiBsaXZlcyBoZXJlIOKAlCBuZXh0IHRvIHRoZSBwbGFuL2J1bmRsZSBjb25maWcgaXQgb3BlcmF0ZXMgb24g4oCUIHNvIEFOWVxuICogYWNjb3VudC1zY29wZWQgY29uc3VtZXIgKGJpbGxpbmcsIGFuZCBmdXR1cmUgcXVvdGEvcGxhdGZvcm0gcmVhZGVycykgc2hhcmVzXG4gKiBvbmUgaW1wbGVtZW50YXRpb24gaW5zdGVhZCBvZiByZS1kZXJpdmluZyB0aGUgY29hbGVzY2UuIFB1cmU6IHRoZSB0aWVyIGxpbWl0c1xuICogY29tZSBmcm9tIGFwaS1jb3JlIChgZ2V0VGllckxpbWl0c2ApIGFuZCB0aGUgYnVuZGxlIGNhdGFsb2cgaXMgcGFzc2VkIGluLlxuICovXG5cbmltcG9ydCB7IGdldFRpZXJMaW1pdHMsIHR5cGUgUXVvdGFUaWVyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBCdW5kbGVDb25maWcgfSBmcm9tICcuL2NvbmZpZy10eXBlcy5qcyc7XG5cbi8qKlxuICogQ29tcHV0ZSBhbiBhY2NvdW50J3MgRUZGRUNUSVZFIGVudGl0bGVtZW50cyA9IHRpZXIgYmFzZSBsaW1pdHMgKyDOoyhidW5kbGVcbiAqIGdyYW50cyDDlyBxdWFudGl0eSksIHBsdXMgdGhlIHVuaW9uIG9mIGJ1bmRsZS1ncmFudGVkIGZlYXR1cmUgZmxhZ3MuIEEgZmllbGRcbiAqIGFscmVhZHkgYC0xYCAodW5saW1pdGVkKSBzdGF5cyBgLTFgLiBQdXJlOyB0aGUgY2F0YWxvZyBpcyBwYXNzZWQgaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlZmZlY3RpdmVFbnRpdGxlbWVudHMoXG4gIHRpZXI6IFF1b3RhVGllcixcbiAgYWRkb25zOiBSZWFkb25seUFycmF5PHsgYnVuZGxlSWQ6IHN0cmluZzsgcXVhbnRpdHk6IG51bWJlciB9PixcbiAgYnVuZGxlczogcmVhZG9ubHkgQnVuZGxlQ29uZmlnW10sXG4pOiB7IGxpbWl0czogUmVjb3JkPHN0cmluZywgbnVtYmVyPjsgZmVhdHVyZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBsaW1pdHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7IC4uLmdldFRpZXJMaW1pdHModGllcikgfTtcbiAgY29uc3QgZmVhdHVyZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgYnlJZCA9IG5ldyBNYXAoYnVuZGxlcy5tYXAoKGIpID0+IFtiLmlkLCBiXSkpO1xuICBmb3IgKGNvbnN0IHsgYnVuZGxlSWQsIHF1YW50aXR5IH0gb2YgYWRkb25zKSB7XG4gICAgY29uc3QgYnVuZGxlID0gYnlJZC5nZXQoYnVuZGxlSWQpO1xuICAgIGlmICghYnVuZGxlIHx8IHF1YW50aXR5IDw9IDApIGNvbnRpbnVlO1xuICAgIC8vIEVuZm9yY2UgdGhlIG5vbi1zdGFja2FibGUgaW52YXJpYW50IGluIHRoZSBDQU5PTklDQUwgbWF0aCwgbm90IGp1c3QgYXQgdGhlXG4gICAgLy8gcHVyY2hhc2Ugcm91dGU6IGEgYHN0YWNrYWJsZTpmYWxzZWAgYnVuZGxlIGNvdW50cyBvbmNlIHJlZ2FyZGxlc3Mgb2YgYVxuICAgIC8vIHN0b3JlZCBxdWFudGl0eSA+IDEsIHNvIGEgbm9uLXJvdXRlIGNhbGxlciAoZHJpZnQgcmVjb25jaWxlcixcbiAgICAvLyBzdWJzY3JpcHRpb24tbGlmZWN5Y2xlKSBjYW4ndCBvdmVyLWdyYW50IGl0cyBxdW90YS5cbiAgICBjb25zdCBlZmZlY3RpdmVRdHkgPSBidW5kbGUuc3RhY2thYmxlID8gcXVhbnRpdHkgOiAxO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBkZWx0YV0gb2YgT2JqZWN0LmVudHJpZXMoYnVuZGxlLmdyYW50cykpIHtcbiAgICAgIC8vIGBncmFudHNgIGlzIGEgUGFydGlhbCBtYXAsIHNvIGEgdmFsdWUgY2FuIGJlIHVuZGVmaW5lZCDigJQgc2tpcCB0aG9zZS5cbiAgICAgIGlmIChkZWx0YSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChsaW1pdHNbZmllbGRdID09PSAtMSkgY29udGludWU7IC8vIGFscmVhZHkgdW5saW1pdGVkXG4gICAgICBsaW1pdHNbZmllbGRdID0gKGxpbWl0c1tmaWVsZF0gPz8gMCkgKyBkZWx0YSAqIGVmZmVjdGl2ZVF0eTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmIG9mIGJ1bmRsZS5mZWF0dXJlcyA/PyBbXSkgZmVhdHVyZXMuYWRkKGYpO1xuICB9XG4gIHJldHVybiB7IGxpbWl0cywgZmVhdHVyZXM6IFsuLi5mZWF0dXJlc10gfTtcbn1cbiJdfQ==
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9lbnRpdGxlbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQXdDLE1BQU0sNEJBQTRCLENBQUM7QUFHakc7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsSUFBZSxFQUNmLE1BQTZELEVBQzdELE9BQWdDO0lBRWhDLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQTJDLENBQUM7SUFDbkYsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELEtBQUssTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQ3ZDLHlFQUF5RTtRQUN6RSw2RUFBNkU7UUFDN0UsMkVBQTJFO1FBQzNFLCtFQUErRTtRQUMvRSwrRUFBK0U7UUFDL0UsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzlELHVFQUF1RTtZQUN2RSxJQUFJLEtBQUssS0FBSyxTQUFTO2dCQUFFLFNBQVM7WUFDbEMsTUFBTSxLQUFLLEdBQUcsUUFBaUMsQ0FBQyxDQUFDLCtCQUErQjtZQUNoRixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQUUsU0FBUyxDQUFDLG9CQUFvQjtZQUN4RCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFlBQVksQ0FBQztRQUM5RCxDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogRWZmZWN0aXZlLWVudGl0bGVtZW50IG1hdGggZm9yIHRoZSBhY2NvdW50L2VudGl0bGVtZW50IG1vZGVsLlxuICpcbiAqIFRoZSBjYW5vbmljYWwgXCJlZmZlY3RpdmUgbGltaXRzID0gdGllciBiYXNlICsgzqMoYnVuZGxlIGdyYW50cylcIiBjb21wdXRhdGlvblxuICogbGl2ZXMgaGVyZSDigJQgbmV4dCB0byB0aGUgcGxhbi9idW5kbGUgY29uZmlnIGl0IG9wZXJhdGVzIG9uIOKAlCBzbyBBTllcbiAqIGFjY291bnQtc2NvcGVkIGNvbnN1bWVyIChiaWxsaW5nLCBhbmQgZnV0dXJlIHF1b3RhL3BsYXRmb3JtIHJlYWRlcnMpIHNoYXJlc1xuICogb25lIGltcGxlbWVudGF0aW9uIGluc3RlYWQgb2YgcmUtZGVyaXZpbmcgdGhlIGNvYWxlc2NlLiBQdXJlOiB0aGUgdGllciBsaW1pdHNcbiAqIGNvbWUgZnJvbSBhcGktY29yZSAoYGdldFRpZXJMaW1pdHNgKSBhbmQgdGhlIGJ1bmRsZSBjYXRhbG9nIGlzIHBhc3NlZCBpbi5cbiAqL1xuXG5pbXBvcnQgeyBnZXRUaWVyTGltaXRzLCB0eXBlIFF1b3RhVGllciwgdHlwZSBRdW90YVRpZXJMaW1pdHMgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IEJ1bmRsZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnLXR5cGVzLmpzJztcblxuLyoqXG4gKiBDb21wdXRlIGFuIGFjY291bnQncyBFRkZFQ1RJVkUgZW50aXRsZW1lbnRzID0gdGllciBiYXNlIGxpbWl0cyArIM6jKGJ1bmRsZVxuICogZ3JhbnRzIMOXIHF1YW50aXR5KSwgcGx1cyB0aGUgdW5pb24gb2YgYnVuZGxlLWdyYW50ZWQgZmVhdHVyZSBmbGFncy4gQSBmaWVsZFxuICogYWxyZWFkeSBgLTFgICh1bmxpbWl0ZWQpIHN0YXlzIGAtMWAuIFB1cmU7IHRoZSBjYXRhbG9nIGlzIHBhc3NlZCBpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdGl2ZUVudGl0bGVtZW50cyhcbiAgdGllcjogUXVvdGFUaWVyLFxuICBhZGRvbnM6IFJlYWRvbmx5QXJyYXk8eyBidW5kbGVJZDogc3RyaW5nOyBxdWFudGl0eTogbnVtYmVyIH0+LFxuICBidW5kbGVzOiByZWFkb25seSBCdW5kbGVDb25maWdbXSxcbik6IHsgbGltaXRzOiBSZWNvcmQ8a2V5b2YgUXVvdGFUaWVyTGltaXRzLCBudW1iZXI+OyBmZWF0dXJlczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGxpbWl0cyA9IHsgLi4uZ2V0VGllckxpbWl0cyh0aWVyKSB9IGFzIFJlY29yZDxrZXlvZiBRdW90YVRpZXJMaW1pdHMsIG51bWJlcj47XG4gIGNvbnN0IGZlYXR1cmVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGJ5SWQgPSBuZXcgTWFwKGJ1bmRsZXMubWFwKChiKSA9PiBbYi5pZCwgYl0pKTtcbiAgZm9yIChjb25zdCB7IGJ1bmRsZUlkLCBxdWFudGl0eSB9IG9mIGFkZG9ucykge1xuICAgIGNvbnN0IGJ1bmRsZSA9IGJ5SWQuZ2V0KGJ1bmRsZUlkKTtcbiAgICBpZiAoIWJ1bmRsZSB8fCBxdWFudGl0eSA8PSAwKSBjb250aW51ZTtcbiAgICAvLyBFbmZvcmNlIHRoZSBub24tc3RhY2thYmxlIGludmFyaWFudCBBTkQgdGhlIG1heFF1YW50aXR5IGNlaWxpbmcgaW4gdGhlXG4gICAgLy8gQ0FOT05JQ0FMIG1hdGgsIG5vdCBqdXN0IGF0IHRoZSBwdXJjaGFzZSByb3V0ZTogYSBgc3RhY2thYmxlOmZhbHNlYCBidW5kbGVcbiAgICAvLyBjb3VudHMgb25jZSwgYW5kIGEgc3RhY2thYmxlIHBhY2sgaXMgY2xhbXBlZCB0byBpdHMgYG1heFF1YW50aXR5YCDigJQgc28gYVxuICAgIC8vIG5vbi1yb3V0ZSBjYWxsZXIgKGRyaWZ0IHJlY29uY2lsZXIsIHN1YnNjcmlwdGlvbi1saWZlY3ljbGUpIGNhbid0IG92ZXItZ3JhbnRcbiAgICAvLyBhIHF1b3RhIGZyb20gYSBzdG9yZWQvZHJpZnRlZCBxdWFudGl0eSAoZS5nLiBhIHJldGVudGlvbiBwYWNrIHBhc3QgaXRzIGNhcCkuXG4gICAgY29uc3QgZWZmZWN0aXZlUXR5ID0gYnVuZGxlLnN0YWNrYWJsZSA/IE1hdGgubWluKHF1YW50aXR5LCBidW5kbGUubWF4UXVhbnRpdHkgPz8gcXVhbnRpdHkpIDogMTtcbiAgICBmb3IgKGNvbnN0IFtyYXdGaWVsZCwgZGVsdGFdIG9mIE9iamVjdC5lbnRyaWVzKGJ1bmRsZS5ncmFudHMpKSB7XG4gICAgICAvLyBgZ3JhbnRzYCBpcyBhIFBhcnRpYWwgbWFwLCBzbyBhIHZhbHVlIGNhbiBiZSB1bmRlZmluZWQg4oCUIHNraXAgdGhvc2UuXG4gICAgICBpZiAoZGVsdGEgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBjb25zdCBmaWVsZCA9IHJhd0ZpZWxkIGFzIGtleW9mIFF1b3RhVGllckxpbWl0czsgLy8gZ3JhbnRzIGtleXMgQVJFIHF1b3RhIGZpZWxkc1xuICAgICAgaWYgKGxpbWl0c1tmaWVsZF0gPT09IC0xKSBjb250aW51ZTsgLy8gYWxyZWFkeSB1bmxpbWl0ZWRcbiAgICAgIGxpbWl0c1tmaWVsZF0gPSAobGltaXRzW2ZpZWxkXSA/PyAwKSArIGRlbHRhICogZWZmZWN0aXZlUXR5O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGYgb2YgYnVuZGxlLmZlYXR1cmVzID8/IFtdKSBmZWF0dXJlcy5hZGQoZik7XG4gIH1cbiAgcmV0dXJuIHsgbGltaXRzLCBmZWF0dXJlczogWy4uLmZlYXR1cmVzXSB9O1xufVxuIl19
package/package.json CHANGED
@@ -34,8 +34,8 @@
34
34
  "axios": "1.19.0",
35
35
  "jsonwebtoken": "9.0.3",
36
36
  "uuid": "14.0.1",
37
- "@pipeline-builder/pipeline-data": "3.4.129",
38
- "@pipeline-builder/api-core": "3.4.124"
37
+ "@pipeline-builder/api-core": "3.4.126",
38
+ "@pipeline-builder/pipeline-data": "3.4.131"
39
39
  },
40
40
  "keywords": [
41
41
  "ci-cd",
@@ -91,7 +91,7 @@
91
91
  "access": "public",
92
92
  "registry": "https://registry.npmjs.org/"
93
93
  },
94
- "version": "3.4.144",
94
+ "version": "3.4.146",
95
95
  "bugs": {
96
96
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
97
97
  },