@pipeline-builder/pipeline-data 4.3.6 → 4.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/lib/api/access-control-builder.js +1 -1
  2. package/lib/api/alert-destinations.js +1 -1
  3. package/lib/api/crud-service.js +1 -1
  4. package/lib/api/ecosystem-privacy.js +1 -1
  5. package/lib/api/keyset-cursor.js +1 -1
  6. package/lib/api/pipeline-step-resolution.js +1 -1
  7. package/lib/api/plugin-advisories.js +1 -1
  8. package/lib/api/plugin-consumption-policy.js +1 -1
  9. package/lib/api/plugin-resolution.js +6 -1
  10. package/lib/api/public-directory.d.ts +71 -3
  11. package/lib/api/public-directory.js +68 -22
  12. package/lib/api/query-builders.js +47 -2
  13. package/lib/api/reporting/analytics-queries.js +1 -1
  14. package/lib/api/reporting/caches.js +1 -1
  15. package/lib/api/reporting/daily-rollup.js +1 -1
  16. package/lib/api/reporting/deploy-rollup.js +1 -1
  17. package/lib/api/reporting/dora-scoring.js +1 -1
  18. package/lib/api/reporting/dora.js +1 -1
  19. package/lib/api/reporting/failure-classifier.js +1 -1
  20. package/lib/api/reporting/ingest.js +1 -1
  21. package/lib/api/reporting/last-deploy.js +1 -1
  22. package/lib/api/reporting/needs-attention.js +1 -1
  23. package/lib/api/reporting/plugin-exposure.js +1 -1
  24. package/lib/api/reporting/plugin-runtime.js +1 -1
  25. package/lib/api/reporting/query-scope.js +1 -1
  26. package/lib/api/reporting/retention-sweep.js +1 -1
  27. package/lib/api/reporting/retention.js +1 -1
  28. package/lib/api/reporting/sql-helpers.js +1 -1
  29. package/lib/api/reporting/stakeholder/compose.js +1 -1
  30. package/lib/api/reporting/stakeholder/index.js +1 -1
  31. package/lib/api/reporting/stakeholder/period.js +1 -1
  32. package/lib/api/reporting/stakeholder/report-html.js +1 -1
  33. package/lib/api/reporting/stakeholder/sections.js +1 -1
  34. package/lib/api/reporting/stakeholder/store.js +1 -1
  35. package/lib/api/reporting/stakeholder/templates.js +1 -1
  36. package/lib/api/reporting/types.js +1 -1
  37. package/lib/api/reporting-service.js +1 -1
  38. package/lib/api/semver-range.js +1 -1
  39. package/lib/api/soft-delete-sweep.js +1 -1
  40. package/lib/api/support-cases.js +1 -1
  41. package/lib/api/version-references.js +1 -1
  42. package/lib/api/viewer-context.js +1 -1
  43. package/lib/core/query-filters.d.ts +25 -0
  44. package/lib/core/query-filters.js +1 -1
  45. package/lib/database/drizzle-schema.d.ts +19 -0
  46. package/lib/database/drizzle-schema.js +1 -1
  47. package/lib/database/index.js +1 -1
  48. package/lib/database/pg-result.js +1 -1
  49. package/lib/database/postgres-connection.js +1 -1
  50. package/lib/database/public-reader.js +1 -1
  51. package/lib/database/read-connection.js +1 -1
  52. package/lib/database/read-lag.js +1 -1
  53. package/lib/database/retry-strategy.js +1 -1
  54. package/lib/database/schema/alert.js +1 -1
  55. package/lib/database/schema/compliance.js +1 -1
  56. package/lib/database/schema/dashboard.js +1 -1
  57. package/lib/database/schema/ecosystem.d.ts +17 -0
  58. package/lib/database/schema/ecosystem.js +3 -1
  59. package/lib/database/schema/message-attachment.js +1 -1
  60. package/lib/database/schema/message.d.ts +19 -0
  61. package/lib/database/schema/message.js +18 -1
  62. package/lib/database/schema/pipeline-template.js +1 -1
  63. package/lib/database/schema/pipeline.js +1 -1
  64. package/lib/database/schema/plugin.js +1 -1
  65. package/lib/database/schema/reporting-analytics.js +1 -1
  66. package/lib/database/schema/reporting-stakeholder.js +1 -1
  67. package/lib/database/schema/support.js +1 -1
  68. package/lib/database/tenancy.js +1 -1
  69. package/lib/index.js +1 -1
  70. package/package.json +8 -8
@@ -382,6 +382,11 @@ export function listedPluginRecord(res) {
382
382
  source: 'listing',
383
383
  publisher: publisher.handle,
384
384
  publisherTier: publisher.tier,
385
+ // The org that OWNS the listing — the vulnerability-waiver decision is keyed
386
+ // on it (waivers are the operator's, system-org-only). Distinct from the
387
+ // CONSUMING org doing the lookup; without it the assessment could not apply
388
+ // waivers at all and reported a waived Critical as an error to every tenant.
389
+ ownerOrgId: publisher.ownerOrgId ?? null,
385
390
  listingId: listing.id,
386
391
  install: mode.kind,
387
392
  name: listing.name,
@@ -489,4 +494,4 @@ export async function resolvableListings(source, scope, filter = {}) {
489
494
  return (await orgListingStates(source, scope, filter))
490
495
  .filter((s) => s.resolved !== null);
491
496
  }
492
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3BsdWdpbi1yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUVILE9BQU8sRUFDTCxVQUFVLEVBQUUsa0JBQWtCLEdBQy9CLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSwwQkFBMEIsRUFBMEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRyxPQUFPLEVBQ0wsYUFBYSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEdBQ2pFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixNQUFNLEdBUVAsTUFBTSwrQkFBK0IsQ0FBQztBQWtDdkMsK0dBQStHO0FBQy9HLE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxHQUFXLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQjtJQUMxRixPQUFPO1FBQ0wsSUFBSSxFQUFFLHdCQUF3QjtRQUM5QixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsR0FBRyxHQUFHLElBQUksUUFBUSxzREFBc0QsR0FBRyxJQUFJLFNBQVMseUVBQXlFO1FBQzFLLFFBQVE7UUFDUixnQkFBZ0IsRUFBRSxTQUFTO0tBQzVCLENBQUM7QUFDSixDQUFDO0FBUUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxZQUFZLENBQzFCLE1BQXlCLEVBQ3pCLFNBQTZELEVBQzdELE9BQThDO0lBRTlDLE1BQU0sR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLE1B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RyxFQUFFLEVBQUUsRUFBRTtZQUNsQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNyRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN6RCxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDbEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFDNUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNsRCxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3pELENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFN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QUFFO0lBRWpDLE9BQU8sQ0FBQyxNQUFNLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDbkQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUE2RCxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUNuRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUmVzb2x2aW5nIGEgcGx1Z2luIHJlZmVyZW5jZSB0byBhbiBlY29zeXN0ZW0gTElTVElORyB2ZXJzaW9uIHRocm91Z2ggdGhlXG4gKiBvcmcncyBpbnN0YWxsIChkb2NzL3BsdWdpbi1pbnN0YWxsaW5nLm1kKS5cbiAqXG4gKiBPbmUgaW1wbGVtZW50YXRpb24gc2hhcmVkIGJ5IGV2ZXJ5IHBsYWNlIHRoYXQgYW5zd2VycyBcIndoaWNoIGxpc3RlZCB2ZXJzaW9uXG4gKiBkb2VzIHRoaXMgb3JnJ3MgcmVmZXJlbmNlIHJ1bj9cIjogdGhlIHBsdWdpbiBzZXJ2aWNlJ3MgYC9wbHVnaW5zL2xvb2t1cGAgKHdoYXRcbiAqIHN5bnRoIHBpbnMpLCB0aGUgcGlwZWxpbmUgc2VydmljZSdzIGNvbnRyYWN0IGNoZWNrIGF0IHBpcGVsaW5lIGNyZWF0ZSwgdGhlIEFJXG4gKiBnZW5lcmF0b3IncyBwbHVnaW4gbGlzdCBhbmQgdGhlIHBsYWNlaG9sZGVyIGd1YXJkLiBUaGUgZGVjaXNpb25zIGFyZSBQVVJFXG4gKiBmdW5jdGlvbnMgb3ZlciBsb2FkZWQgcm93czsgdGhlIHJvd3MgY29tZSB0aHJvdWdoIGEge0BsaW5rIExpc3RpbmdEYXRhU291cmNlfVxuICogc28gZWFjaCBzZXJ2aWNlIGNhbiBsb2FkIHRoZW0gaXRzIG93biB3YXkgKHtAbGluayBkcml6emxlTGlzdGluZ1NvdXJjZX0gaXMgdGhlXG4gKiBwbGFpbiBkcml6emxlIG9uZSkuXG4gKlxuICogVGhlIG1vZGVsOlxuICogIC0gQW4gb3JnIHJlc29sdmVzIGEgbGlzdGluZyBvbmx5IHRocm91Z2ggYW4gSU5TVEFMTDogYW4gZXhwbGljaXRcbiAqICAgIGBwbHVnaW5faW5zdGFsbHNgIHJvdyAoaXRzIG93biwgb3Ig4oCUIGZvciBhIHRlYW0g4oCUIGl0cyByb290IG9yZydzKSwgb3JcbiAqICAgIGZvciB0aGUgT2ZmaWNpYWwgcHVibGlzaGVyIHRoZSBJTVBMSUNJVCBpbnN0YWxsIGV2ZXJ5IG9yZyBoYXMgdW5sZXNzIGl0c1xuICogICAgY29uc3VtcHRpb24gcG9saWN5IHNheXMgYG9mZmljaWFsSW5zdGFsbHM6IGV4cGxpY2l0YC4gQW4gZXhwbGljaXRcbiAqICAgIGluc3RhbGwgb3ZlcnJpZGVzIHRoZSBpbXBsaWNpdCBvbmUuXG4gKiAgLSBUaGUgb3JnJ3MgQ09OU1VNUFRJT04gUE9MSUNZIGlzIGFwcGxpZWQgYXQgZXZlcnkgcmVzb2x1dGlvbjogYWxsb3dlZFxuICogICAgdGllcnMsIGJsb2NrZWQgbGlzdGluZ3MsIGFkdmlzb3J5IGJsb2NraW5nOyBzZWNyZXRzIGFyZSB3aXRoaGVsZCBmcm9tIHRpZXJzXG4gKiAgICB0aGUgcG9saWN5IGRvZXNuJ3QgdHJ1c3Qgd2l0aCB0aGVtLiBBIHRlYW0ncyBwb2xpY3kgaXMgbWVyZ2VkIHdpdGggaXRzIHJvb3RcbiAqICAgIG9yZydzIGFuZCBjYW4gb25seSBiZSBzdHJpY3Rlci5cbiAqICAtIFZlcnNpb24gY2hvaWNlOiB0aGUgaW5zdGFsbCdzIHJhbmdlIChwaW5uZWQgLyBgfmAgLyBgXmAgLyBub24tYnJlYWtpbmdcbiAqICAgIGxhdGVzdDsgaW1wbGljaXQgPSB0aGUgbG93ZXN0IGxpdmUgbWFqb3IpLCBuYXJyb3dlZCBieSB0aGUgcmVmZXJlbmNlJ3Mgb3duXG4gKiAgICB2ZXJzaW9uIHNwZWMuIFlhbmtlZCB2ZXJzaW9ucyBuZXZlciByZXNvbHZlIGZvciBhIGxpc3Rpbmc7IGEgcGF1c2VkXG4gKiAgICB2ZXJzaW9uIGlzIHNraXBwZWQgdW5sZXNzIHRoZSBpbnN0YWxsIGFscmVhZHkgcmVzb2x2ZWQgdG8gaXQgb3IgdGhlXG4gKiAgICByZWZlcmVuY2UgcGlucyBpdCBleGFjdGx5OyBhZHZpc29yeS1ibG9ja2VkIHZlcnNpb25zIGFyZSBza2lwcGVkLlxuICogIC0gU2NhbiBmbGFnczogYSB2ZXJzaW9uIHRoZSBuaWdodGx5IHJlc2NhbiBGTEFHR0VEIChnYXRlZCBDcml0aWNhbHMgb3ZlclxuICogICAgYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2ApIHJlc29sdmVzIGxpa2UgYW55IG90aGVyLCB3aXRoIGEgYFZVTE5fRkxBR0dFRGBcbiAqICAgIHdhcm5pbmcgKHNldmVyaXR5IGBlcnJvcmAsIGBjcml0aWNhbGAgd2l0aCBhIEtFViBmaW5kaW5nKS4gVnVsbmVyYWJpbGl0eVxuICogICAgc3RhdGUgTkVWRVIgc2tpcHMgb3IgcmVmdXNlcyBhIHZlcnNpb24g4oCUIGl0IGlzIGdyYWRlZCwgYW5kIHRoZSBwaXBlbGluZSdzXG4gKiAgICBvd25lcnMgYXJlIHRvbGQuIFdoZW4gdGhlIHJlZmVyZW5jZSdzIHBpbiBrZWVwcyBpdCBPRkYgYSBuZXdlciB1bmZsYWdnZWRcbiAqICAgIHZlcnNpb24gdGhlIGluc3RhbGwgYWxsb3dzLCBgVlVMTl9VUEdSQURFX0FWQUlMQUJMRWAgKGluZm8pIG5hbWVzIGl0LlxuICovXG5cbmltcG9ydCB7XG4gIGFzU2NhbkZsYWcsIHZ1bG5GbGFnZ2VkV2FybmluZywgdHlwZSBWdWxuRmxhZ2dlZFdhcm5pbmcsXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIGluQXJyYXkgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IENydWRUeCB9IGZyb20gJy4vY3J1ZC1zZXJ2aWNlLmpzJztcbmltcG9ydCB7IGFkdmlzb3JpZXNDb3ZlcmluZywgYmxvY2tpbmdBZHZpc29yaWVzIH0gZnJvbSAnLi9wbHVnaW4tYWR2aXNvcmllcy5qcyc7XG5pbXBvcnQgeyBlZmZlY3RpdmVDb25zdW1wdGlvblBvbGljeSwgdHlwZSBDb25zdW1wdGlvblBvbGljeSB9IGZyb20gJy4vcGx1Z2luLWNvbnN1bXB0aW9uLXBvbGljeS5qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlU2VtdmVyLCBpc1ZlcnNpb25SYW5nZSwgcGFyc2VTZW12ZXIsIHNhdGlzZmllc1ZlcnNpb25TcGVjLFxufSBmcm9tICcuL3NlbXZlci1yYW5nZS5qcyc7XG5pbXBvcnQge1xuICBPRkZJQ0lBTF9QVUJMSVNIRVJfSEFORExFLFxuICBzY2hlbWEsXG4gIHR5cGUgSW5zdGFsbFZlcnNpb25Qb2xpY3ksXG4gIHR5cGUgUGx1Z2luQWR2aXNvcnksXG4gIHR5cGUgUGx1Z2luSW5zdGFsbCxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsUG9saWN5LFxuICB0eXBlIFBsdWdpbkxpc3RpbmcsXG4gIHR5cGUgUGx1Z2luTGlzdGluZ1ZlcnNpb24sXG4gIHR5cGUgUHVibGlzaGVyLFxufSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZWZ1c2FscyBhbmQgd2FybmluZ3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBXaHkgYSByZWZlcmVuY2UgY2FuJ3QgcmVzb2x2ZTsgYGNvZGVgIGlzIGFuIGFwaS1jb3JlIGBFcnJvckNvZGVgIG5hbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdXRpb25SZWZ1c2FsIHtcbiAgY29kZTogJ05PVF9GT1VORCcgfCAnUExVR0lOX05PVF9JTlNUQUxMRUQnIHwgJ1BMVUdJTl9CTE9DS0VEX0JZX1BPTElDWScgfCAnUExVR0lOX1VOQVZBSUxBQkxFJztcbiAgcmVhc29uOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIGBWVUxOX1VQR1JBREVfQVZBSUxBQkxFYCAoc2V2ZXJpdHkgYGluZm9gKTogdGhlIHJlc29sdmVkIHZlcnNpb24gaXMgRkxBR0dFRCxcbiAqIGFuZCBhIG5ld2VyIFVORkxBR0dFRCB2ZXJzaW9uIGV4aXN0cyB0aGF0IHRoZSBpbnN0YWxsIGFsbG93cyBidXQgdGhlXG4gKiByZWZlcmVuY2UncyBvd24gcGluIGV4Y2x1ZGVzIOKAlCBzbyB0aGUgcGlwZWxpbmUga2VlcHMgcnVubmluZyB0aGUgdnVsbmVyYWJsZVxuICogcmVsZWFzZSB1bnRpbCBzb21lb25lIG1vdmVzIHRoZSBwaW4uIGBzdWdnZXN0ZWRWZXJzaW9uYCBpcyB0aGUgd2F5IG91dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuVXBncmFkZUF2YWlsYWJsZVdhcm5pbmcge1xuICBjb2RlOiAnVlVMTl9VUEdSQURFX0FWQUlMQUJMRSc7XG4gIHNldmVyaXR5OiAnaW5mbyc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgcmVzb2x2ZWQ6IHN0cmluZztcbiAgc3VnZ2VzdGVkVmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKiogQSBub24tZmF0YWwgbm90ZSBhIHJlc29sdXRpb24gY2FycmllcyAoc3ludGggcHJpbnRzIGl0cyBgbWVzc2FnZWApLiAqL1xuZXhwb3J0IHR5cGUgUmVzb2x1dGlvbldhcm5pbmcgPVxuICB8IHsgY29kZTogJ1BMVUdJTl9BRFZJU09SWScgfCAnUExVR0lOX0RFUFJFQ0FURUQnIHwgJ1BMVUdJTl9TRUNSRVRTX1dJVEhIRUxEJyB8ICdMSVNUSU5HX1VOTUFJTlRBSU5FRCc7IG1lc3NhZ2U6IHN0cmluZyB9XG4gIHwgVnVsbkZsYWdnZWRXYXJuaW5nXG4gIHwgVnVsblVwZ3JhZGVBdmFpbGFibGVXYXJuaW5nO1xuXG4vKiogVGhlIGBWVUxOX1VQR1JBREVfQVZBSUxBQkxFYCB3YXJuaW5nIGZvciBgcmVmYCByZXNvbHZpbmcgdG8gYHJlc29sdmVkYCB3aXRoIGBzdWdnZXN0ZWRgIG91dHNpZGUgdGhlIHBpbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2dWxuVXBncmFkZUF2YWlsYWJsZVdhcm5pbmcocmVmOiBzdHJpbmcsIHJlc29sdmVkOiBzdHJpbmcsIHN1Z2dlc3RlZDogc3RyaW5nKTogVnVsblVwZ3JhZGVBdmFpbGFibGVXYXJuaW5nIHtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiAnVlVMTl9VUEdSQURFX0FWQUlMQUJMRScsXG4gICAgc2V2ZXJpdHk6ICdpbmZvJyxcbiAgICBtZXNzYWdlOiBgJHtyZWZ9QCR7cmVzb2x2ZWR9IGlzIGZsYWdnZWQgYW5kIHlvdXIgcGluIGtlZXBzIHRoZSBwaXBlbGluZSBvbiBpdDsgJHtyZWZ9QCR7c3VnZ2VzdGVkfSBpcyBub3QgZmxhZ2dlZCBhbmQgeW91ciBpbnN0YWxsIGFsbG93cyBpdC4gTW92ZSB0aGUgcGluIHRvIHBpY2sgaXQgdXAuYCxcbiAgICByZXNvbHZlZCxcbiAgICBzdWdnZXN0ZWRWZXJzaW9uOiBzdWdnZXN0ZWQsXG4gIH07XG59XG5cbi8qKiBXaHkgdGhlIG9yZydzIHBvbGljeSAob3IgdGhlIGxpc3RpbmcncyBzdGF0ZSkga2VlcHMgYSBsaXN0aW5nIG91dCwgb3IgbnVsbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ0Jsb2NrIHtcbiAgcmVhc29uOiAndGllcicgfCAnYmxvY2tlZF9saXN0aW5nJyB8ICdzdXNwZW5kZWQnO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBXaGV0aGVyIGBwb2xpY3lgIChvciB0aGUgbGlzdGluZydzIG93biBzdGF0ZSkgcmVmdXNlcyB0aGUgbGlzdGluZyBvdXRyaWdodC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0aW5nQmxvY2soXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3ksXG4gIHB1Ymxpc2hlcjogUGljazxQdWJsaXNoZXIsICdoYW5kbGUnIHwgJ3RpZXInIHwgJ3N1c3BlbmRlZEF0Jz4sXG4gIGxpc3Rpbmc6IFBpY2s8UGx1Z2luTGlzdGluZywgJ25hbWUnIHwgJ3N0YXRlJz4sXG4pOiBMaXN0aW5nQmxvY2sgfCBudWxsIHtcbiAgY29uc3QgcmVmID0gYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YDtcbiAgaWYgKHB1Ymxpc2hlci5zdXNwZW5kZWRBdCB8fCBsaXN0aW5nLnN0YXRlID09PSAnc3VzcGVuZGVkJyB8fCBsaXN0aW5nLnN0YXRlID09PSAndHJhbnNmZXJyZWQnKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAnc3VzcGVuZGVkJywgbWVzc2FnZTogYCR7cmVmfSBpcyAke2xpc3Rpbmcuc3RhdGUgPT09ICd0cmFuc2ZlcnJlZCcgPyAndHJhbnNmZXJyZWQnIDogJ3N1c3BlbmRlZCd9IGFuZCBubyBsb25nZXIgcmVzb2x2ZXMuYCB9O1xuICB9XG4gIGlmIChwb2xpY3kuYmxvY2tlZExpc3RpbmdzLnNvbWUoKGIpID0+IGIucHVibGlzaGVyID09PSBwdWJsaXNoZXIuaGFuZGxlICYmIGIubmFtZSA9PT0gbGlzdGluZy5uYW1lKSkge1xuICAgIHJldHVybiB7IHJlYXNvbjogJ2Jsb2NrZWRfbGlzdGluZycsIG1lc3NhZ2U6IGBZb3VyIG9yZ2FuaXphdGlvbidzIHBsdWdpbiBwb2xpY3kgYmxvY2tzICR7cmVmfS5gIH07XG4gIH1cbiAgaWYgKCFwb2xpY3kuYWxsb3dlZFRpZXJzLmluY2x1ZGVzKHB1Ymxpc2hlci50aWVyKSkge1xuICAgIHJldHVybiB7IHJlYXNvbjogJ3RpZXInLCBtZXNzYWdlOiBgWW91ciBvcmdhbml6YXRpb24ncyBwbHVnaW4gcG9saWN5IGRvZXNuJ3QgYWxsb3cgJHtwdWJsaXNoZXIudGllcn0gcGx1Z2lucyAoJHtyZWZ9KS5gIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBUaGUgcmVmdXNhbCBhIHtAbGluayBMaXN0aW5nQmxvY2t9IGJlY29tZXMuICovXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tSZWZ1c2FsKGJsb2NrOiBMaXN0aW5nQmxvY2spOiBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIHJldHVybiBibG9jay5yZWFzb24gPT09ICdzdXNwZW5kZWQnXG4gICAgPyB7IGNvZGU6ICdQTFVHSU5fVU5BVkFJTEFCTEUnLCByZWFzb246ICdzdXNwZW5kZWQnLCBtZXNzYWdlOiBibG9jay5tZXNzYWdlIH1cbiAgICA6IHsgY29kZTogJ1BMVUdJTl9CTE9DS0VEX0JZX1BPTElDWScsIHJlYXNvbjogYmxvY2sucmVhc29uLCBtZXNzYWdlOiBibG9jay5tZXNzYWdlIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBJbnN0YWxscyBhbmQgdmVyc2lvbiBjaG9pY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBIb3cgdGhlIG9yZyByZWFjaGVzIGEgbGlzdGluZzogYW4gZXhwbGljaXQgaW5zdGFsbCByb3csIG9yIHRoZSBpbXBsaWNpdCBPZmZpY2lhbCBvbmUuICovXG5leHBvcnQgdHlwZSBJbnN0YWxsTW9kZSA9XG4gIHwgeyBraW5kOiAnZXhwbGljaXQnOyBpbnN0YWxsOiBQbHVnaW5JbnN0YWxsOyBpbmhlcml0ZWQ6IGJvb2xlYW4gfVxuICB8IHsga2luZDogJ2ltcGxpY2l0JyB9O1xuXG50eXBlIFZlcnNpb25Sb3cgPSBQaWNrPFBsdWdpbkxpc3RpbmdWZXJzaW9uLCAndmVyc2lvbicgfCAneWFua2VkQXQnIHwgJ3BhdXNlZEF0JyB8ICdicmVha2luZyc+O1xuXG5jb25zdCBpc1N0YWJsZSA9ICh2OiBzdHJpbmcpOiBib29sZWFuID0+IChwYXJzZVNlbXZlcih2KT8ucHJlcmVsZWFzZS5sZW5ndGggPz8gMSkgPT09IDA7XG5cbi8qKlxuICogVGhlIGltcGxpY2l0IE9mZmljaWFsIGluc3RhbGwncyByYW5nZTogZXZlcnkgdmVyc2lvbiBvZiB0aGUgTE9XRVNUIGxpdmVcbiAqIG1ham9yIChgPG1ham9yPi54YCkg4oCUIHBhdGNoIGFuZCBtaW5vciB2ZXJzaW9ucyBmbG93LCBhIG5ldyBtYWpvciBuZXZlciBkb2VzXG4gKiAodGhlIG9yZyBtb3ZlcyB0byBpdCB3aXRoIGFuIGV4cGxpY2l0IGluc3RhbGwpLiBOdWxsIHdoZW4gbm90aGluZyBpcyBsaXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1wbGljaXRJbnN0YWxsUmFuZ2UodmVyc2lvbnM6IHJlYWRvbmx5IFZlcnNpb25Sb3dbXSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtYWpvcnMgPSB2ZXJzaW9uc1xuICAgIC5maWx0ZXIoKHYpID0+ICF2LnlhbmtlZEF0ICYmIGlzU3RhYmxlKHYudmVyc2lvbikpXG4gICAgLm1hcCgodikgPT4gcGFyc2VTZW12ZXIodi52ZXJzaW9uKSEubWFqb3IpO1xuICBpZiAobWFqb3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBgJHtNYXRoLm1pbiguLi5tYWpvcnMpfS54YDtcbn1cblxuLyoqIFdoZXRoZXIgYW4gaW5zdGFsbCdzIHZlcnNpb24gcG9saWN5IGFkbWl0cyBgdmVyc2lvbmAgKHRoZSBiYXNlbGluZSBpcyBgcGlubmVkVmVyc2lvbmApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxBZG1pdHMoXG4gIGluc3RhbGw6IFBpY2s8UGx1Z2luSW5zdGFsbCwgJ3ZlcnNpb25Qb2xpY3knIHwgJ3Bpbm5lZFZlcnNpb24nPixcbiAgdmVyc2lvbjogc3RyaW5nLFxuICB2ZXJzaW9uczogcmVhZG9ubHkgVmVyc2lvblJvd1tdLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJhc2UgPSBpbnN0YWxsLnBpbm5lZFZlcnNpb247XG4gIHN3aXRjaCAoaW5zdGFsbC52ZXJzaW9uUG9saWN5IGFzIEluc3RhbGxWZXJzaW9uUG9saWN5KSB7XG4gICAgY2FzZSAncGlubmVkJzpcbiAgICAgIHJldHVybiB2ZXJzaW9uID09PSBiYXNlO1xuICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgIHJldHVybiBiYXNlICE9PSBudWxsICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHZlcnNpb24sIGB+JHtiYXNlfWApO1xuICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgIHJldHVybiBiYXNlICE9PSBudWxsICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHZlcnNpb24sIGBeJHtiYXNlfWApO1xuICAgIGNhc2UgJ2xhdGVzdCc6IHtcbiAgICAgIGlmICghaXNTdGFibGUodmVyc2lvbikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChiYXNlID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjb21wYXJlU2VtdmVyKHZlcnNpb24sIGJhc2UpIDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gTmV2ZXIgY3Jvc3MgYSB2ZXJzaW9uIHRoZSBwdWJsaXNoZXIgbWFya2VkIGJyZWFraW5nLlxuICAgICAgcmV0dXJuICF2ZXJzaW9ucy5zb21lKCh2KSA9PiB2LmJyZWFraW5nICYmIGNvbXBhcmVTZW12ZXIodi52ZXJzaW9uLCBiYXNlKSA+IDAgJiYgY29tcGFyZVNlbXZlcih2LnZlcnNpb24sIHZlcnNpb24pIDw9IDApO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBXaGV0aGVyIGBtb2RlYCBhZG1pdHMgYHZlcnNpb25gICh0aGUgaW1wbGljaXQgcmFuZ2UgZm9yIGFuIGltcGxpY2l0IGluc3RhbGwpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVBZG1pdHMobW9kZTogSW5zdGFsbE1vZGUsIHZlcnNpb246IHN0cmluZywgdmVyc2lvbnM6IHJlYWRvbmx5IFZlcnNpb25Sb3dbXSk6IGJvb2xlYW4ge1xuICBpZiAobW9kZS5raW5kID09PSAnZXhwbGljaXQnKSByZXR1cm4gaW5zdGFsbEFkbWl0cyhtb2RlLmluc3RhbGwsIHZlcnNpb24sIHZlcnNpb25zKTtcbiAgY29uc3QgcmFuZ2UgPSBpbXBsaWNpdEluc3RhbGxSYW5nZSh2ZXJzaW9ucyk7XG4gIHJldHVybiByYW5nZSAhPT0gbnVsbCAmJiBzYXRpc2ZpZXNWZXJzaW9uU3BlYyh2ZXJzaW9uLCByYW5nZSk7XG59XG5cbi8qKiBJbnB1dCB0byB7QGxpbmsgc2VsZWN0TGlzdGluZ1ZlcnNpb259LiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uQ2hvaWNlSW5wdXQ8ViBleHRlbmRzIFBsdWdpbkxpc3RpbmdWZXJzaW9uID0gUGx1Z2luTGlzdGluZ1ZlcnNpb24+IHtcbiAgcmVmOiBzdHJpbmc7XG4gIHZlcnNpb25zOiByZWFkb25seSBWW107XG4gIG1vZGU6IEluc3RhbGxNb2RlO1xuICAvKiogVGhlIHJlZmVyZW5jZSdzIG93biB2ZXJzaW9uIHNwZWMgKGBmaWx0ZXIudmVyc2lvbmApLiAqL1xuICByZXF1ZXN0ZWQ/OiBzdHJpbmc7XG4gIGFkdmlzb3JpZXM6IHJlYWRvbmx5IFBsdWdpbkFkdmlzb3J5W107XG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG59XG5cbi8qKiBUaGUgbmV3ZXN0IHZlcnNpb24gKGJ5IHNlbXZlcikgb2YgYHZlcnNpb25zYCwgb3IgbnVsbC4gKi9cbmZ1bmN0aW9uIG5ld2VzdE9mPFYgZXh0ZW5kcyB7IHZlcnNpb246IHN0cmluZyB9Pih2ZXJzaW9uczogcmVhZG9ubHkgVltdKTogViB8IG51bGwge1xuICBjb25zdCBiZXN0ID0gaGlnaGVzdCh2ZXJzaW9ucy5tYXAoKHYpID0+IHYudmVyc2lvbikpO1xuICByZXR1cm4gYmVzdCA9PT0gbnVsbCA/IG51bGwgOiB2ZXJzaW9ucy5maW5kKCh2KSA9PiB2LnZlcnNpb24gPT09IGJlc3QpITtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBsaXN0ZWQgdmVyc2lvbiBhIHJlZmVyZW5jZSByZXNvbHZlcyB0byAoc2VlIHRoZSBtb2R1bGUgZG9jKSwgb3JcbiAqIHRoZSByZWZ1c2FsIHRoYXQgZXhwbGFpbnMgd2h5IG5vbmUgY2FuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0TGlzdGluZ1ZlcnNpb248ViBleHRlbmRzIFBsdWdpbkxpc3RpbmdWZXJzaW9uPihpbnB1dDogVmVyc2lvbkNob2ljZUlucHV0PFY+KTogeyB2ZXJzaW9uOiBWOyBzdWdnZXN0ZWRWZXJzaW9uOiBzdHJpbmcgfCBudWxsIH0gfCB7IHJlZnVzYWw6IFJlc29sdXRpb25SZWZ1c2FsIH0ge1xuICBjb25zdCB7IHJlZiwgdmVyc2lvbnMsIG1vZGUsIHJlcXVlc3RlZCwgYWR2aXNvcmllcywgcG9saWN5IH0gPSBpbnB1dDtcbiAgY29uc3QgZXhhY3QgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCAmJiAhaXNWZXJzaW9uUmFuZ2UocmVxdWVzdGVkKSA/IHJlcXVlc3RlZC50cmltKCkgOiBudWxsO1xuICBjb25zdCByZXNvbHZlZEJlZm9yZSA9IG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyA/IG1vZGUuaW5zdGFsbC5yZXNvbHZlZFZlcnNpb24gOiBudWxsO1xuICAvLyBGb3IgYSBGTEFHR0VEIGFuc3dlcjogdGhlIG5ld2VzdCBVTkZMQUdHRUQgdmVyc2lvbiBhYm92ZSBpdCB0aGF0IHRoZVxuICAvLyBJTlNUQUxMIGFsbG93cyBhbmQgbm8gYmxvY2tpbmcgYWR2aXNvcnkgY292ZXJzIOKAlCB0aGUgdmVyc2lvbiBhIHBpcGVsaW5lXG4gIC8vIG93bmVyIGlzIHRvbGQgdG8gbW92ZSB0by4gTnVsbCBmb3IgYW4gdW5mbGFnZ2VkIGFuc3dlciwgb3Igd2hlbiBub25lIGV4aXN0cy5cbiAgY29uc3Qgc3VnZ2VzdGlvbiA9IChyZXNvbHZlZDogVik6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGlmICghcmVzb2x2ZWQuc2NhbkZsYWdnZWRBdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcG9vbCA9IHZlcnNpb25zLmZpbHRlcigodikgPT4gIXYueWFua2VkQXQgJiYgIXYuc2NhbkZsYWdnZWRBdFxuICAgICAgJiYgY29tcGFyZVNlbXZlcih2LnZlcnNpb24sIHJlc29sdmVkLnZlcnNpb24pID4gMFxuICAgICAgJiYgbW9kZUFkbWl0cyhtb2RlLCB2LnZlcnNpb24sIHZlcnNpb25zKVxuICAgICAgJiYgKCF2LnBhdXNlZEF0IHx8IHYudmVyc2lvbiA9PT0gcmVzb2x2ZWRCZWZvcmUpXG4gICAgICAmJiBibG9ja2luZ0Fkdmlzb3JpZXMoYWR2aXNvcmllcywgdi52ZXJzaW9uLCBwb2xpY3kpLmxlbmd0aCA9PT0gMCk7XG4gICAgcmV0dXJuIG5ld2VzdE9mKHBvb2wpPy52ZXJzaW9uID8/IG51bGw7XG4gIH07XG5cbiAgaWYgKGV4YWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgdiA9IHZlcnNpb25zLmZpbmQoKHgpID0+IHgudmVyc2lvbiA9PT0gZXhhY3QpO1xuICAgIGlmICghdikgcmV0dXJuIHsgcmVmdXNhbDogeyBjb2RlOiAnTk9UX0ZPVU5EJywgcmVhc29uOiAndmVyc2lvbl9ub3RfZm91bmQnLCBtZXNzYWdlOiBgJHtyZWZ9IGhhcyBubyBwdWJsaXNoZWQgdmVyc2lvbiAke2V4YWN0fS5gIH0gfTtcbiAgICBpZiAodi55YW5rZWRBdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVmdXNhbDoge1xuICAgICAgICAgIGNvZGU6ICdQTFVHSU5fVU5BVkFJTEFCTEUnLFxuICAgICAgICAgIHJlYXNvbjogJ3lhbmtlZCcsXG4gICAgICAgICAgbWVzc2FnZTogYCR7cmVmfUAke2V4YWN0fSBpcyB5YW5rZWQke3YueWFua1JlYXNvbiA/IGA6ICR7di55YW5rUmVhc29ufWAgOiAnJ30uIE1vdmUgdG8gYSBzdXBwb3J0ZWQgdmVyc2lvbi5gLFxuICAgICAgICAgIGRldGFpbHM6IHsgdmVyc2lvbjogZXhhY3QgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcgJiYgIWluc3RhbGxBZG1pdHMobW9kZS5pbnN0YWxsLCBleGFjdCwgdmVyc2lvbnMpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWZ1c2FsOiB7XG4gICAgICAgICAgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJyxcbiAgICAgICAgICByZWFzb246ICd2ZXJzaW9uX291dHNpZGVfaW5zdGFsbCcsXG4gICAgICAgICAgbWVzc2FnZTogYCR7cmVmfUAke2V4YWN0fSBpcyBvdXRzaWRlIHlvdXIgaW5zdGFsbCAoJHttb2RlLmluc3RhbGwudmVyc2lvblBvbGljeX0gZnJvbSAke21vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9ufSkuIFVwZ3JhZGUgdGhlIGluc3RhbGwgZmlyc3QuYCxcbiAgICAgICAgICBkZXRhaWxzOiB7IHZlcnNpb246IGV4YWN0LCB2ZXJzaW9uUG9saWN5OiBtb2RlLmluc3RhbGwudmVyc2lvblBvbGljeSwgcGlubmVkVmVyc2lvbjogbW9kZS5pbnN0YWxsLnBpbm5lZFZlcnNpb24gfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGJsb2NraW5nID0gYmxvY2tpbmdBZHZpc29yaWVzKGFkdmlzb3JpZXMsIGV4YWN0LCBwb2xpY3kpO1xuICAgIGlmIChibG9ja2luZy5sZW5ndGgpIHJldHVybiB7IHJlZnVzYWw6IGFkdmlzb3J5UmVmdXNhbChyZWYsIGV4YWN0LCBibG9ja2luZykgfTtcbiAgICByZXR1cm4geyB2ZXJzaW9uOiB2LCBzdWdnZXN0ZWRWZXJzaW9uOiBzdWdnZXN0aW9uKHYpIH07XG4gIH1cblxuICAvLyBUaGUgcmFuZ2UgdGhlIElOU1RBTEwgYWxsb3dzLiBGb3IgdGhlIGltcGxpY2l0IGluc3RhbGwgYW4gZXhwbGljaXQgc3BlYyBvblxuICAvLyB0aGUgcmVmZXJlbmNlIHJlcGxhY2VzIHRoZSBpbXBsaWNpdCByYW5nZSAoaXQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSkuXG4gIGNvbnN0IGFkbWl0dGVkID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiAhdi55YW5rZWRBdFxuICAgICYmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcgPyBpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgdi52ZXJzaW9uLCB2ZXJzaW9ucylcbiAgICAgIDogcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgfHwgbW9kZUFkbWl0cyhtb2RlLCB2LnZlcnNpb24sIHZlcnNpb25zKSlcbiAgICAmJiAocmVxdWVzdGVkID09PSB1bmRlZmluZWQgfHwgc2F0aXNmaWVzVmVyc2lvblNwZWModi52ZXJzaW9uLCByZXF1ZXN0ZWQpKVxuICAgICYmICghdi5wYXVzZWRBdCB8fCB2LnZlcnNpb24gPT09IHJlc29sdmVkQmVmb3JlKSk7XG4gIC8vIEEgYmxvY2tpbmcgQURWSVNPUlkgKHRoZSBvcmcncyBpbnN0YWxsIHBvbGljeSkgc2tpcHMgYSB2ZXJzaW9uOyBhIHNjYW5cbiAgLy8gZmxhZyBuZXZlciBkb2VzLlxuICBjb25zdCBhbGxvd2VkID0gYWRtaXR0ZWQuZmlsdGVyKCh2KSA9PiBibG9ja2luZ0Fkdmlzb3JpZXMoYWR2aXNvcmllcywgdi52ZXJzaW9uLCBwb2xpY3kpLmxlbmd0aCA9PT0gMCk7XG4gIC8vIFJhbmdlcyBvbmx5IGFkbWl0IHByZXJlbGVhc2VzIHRoZXkgbmFtZSAobnBtIHNlbWFudGljcyksIHNvIHRoZSBoaWdoZXN0XG4gIC8vIGFkbWl0dGVkIHZlcnNpb24gaXMgdGhlIGFuc3dlci5cbiAgY29uc3QgYmVzdCA9IG5ld2VzdE9mKGFsbG93ZWQpO1xuICBpZiAoYmVzdCkgcmV0dXJuIHsgdmVyc2lvbjogYmVzdCwgc3VnZ2VzdGVkVmVyc2lvbjogc3VnZ2VzdGlvbihiZXN0KSB9O1xuXG4gIGlmIChhZG1pdHRlZC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbmV3ZXN0ID0gbmV3ZXN0T2YoYWRtaXR0ZWQpITtcbiAgICByZXR1cm4geyByZWZ1c2FsOiBhZHZpc29yeVJlZnVzYWwocmVmLCBuZXdlc3QudmVyc2lvbiwgYmxvY2tpbmdBZHZpc29yaWVzKGFkdmlzb3JpZXMsIG5ld2VzdC52ZXJzaW9uLCBwb2xpY3kpKSB9O1xuICB9XG4gIGlmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcgJiYgcmVxdWVzdGVkICE9PSB1bmRlZmluZWRcbiAgICAmJiB2ZXJzaW9ucy5zb21lKCh2KSA9PiAhdi55YW5rZWRBdCAmJiBzYXRpc2ZpZXNWZXJzaW9uU3BlYyh2LnZlcnNpb24sIHJlcXVlc3RlZCkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZnVzYWw6IHtcbiAgICAgICAgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJyxcbiAgICAgICAgcmVhc29uOiAndmVyc2lvbl9vdXRzaWRlX2luc3RhbGwnLFxuICAgICAgICBtZXNzYWdlOiBgTm8gdmVyc2lvbiBvZiAke3JlZn0gbWF0Y2hpbmcgJHtyZXF1ZXN0ZWR9IGlzIGluc2lkZSB5b3VyIGluc3RhbGwgKCR7bW9kZS5pbnN0YWxsLnZlcnNpb25Qb2xpY3l9IGZyb20gJHttb2RlLmluc3RhbGwucGlubmVkVmVyc2lvbn0pLiBVcGdyYWRlIHRoZSBpbnN0YWxsIGZpcnN0LmAsXG4gICAgICAgIGRldGFpbHM6IHsgcmVxdWVzdGVkLCB2ZXJzaW9uUG9saWN5OiBtb2RlLmluc3RhbGwudmVyc2lvblBvbGljeSwgcGlubmVkVmVyc2lvbjogbW9kZS5pbnN0YWxsLnBpbm5lZFZlcnNpb24gfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlZnVzYWw6IHtcbiAgICAgIGNvZGU6ICdOT1RfRk9VTkQnLFxuICAgICAgcmVhc29uOiAnbm9fbWF0Y2hpbmdfdmVyc2lvbicsXG4gICAgICBtZXNzYWdlOiBgTm8gcmVzb2x2YWJsZSB2ZXJzaW9uIG9mICR7cmVmfSR7cmVxdWVzdGVkID8gYCBtYXRjaGVzICR7cmVxdWVzdGVkfWAgOiAnJ30uYCxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogVGhlIGhpZ2hlc3Qgb2YgYHZlcnNpb25zYCBieSBzZW12ZXIgKHByZXJlbGVhc2VzIGluY2x1ZGVkKS4gKi9cbmZ1bmN0aW9uIGhpZ2hlc3QodmVyc2lvbnM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiB2ZXJzaW9ucy5yZWR1Y2U8c3RyaW5nIHwgbnVsbD4oKGJlc3QsIHYpID0+IChiZXN0ID09PSBudWxsIHx8IGNvbXBhcmVTZW12ZXIodiwgYmVzdCkgPiAwID8gdiA6IGJlc3QpLCBudWxsKTtcbn1cblxuZnVuY3Rpb24gYWR2aXNvcnlSZWZ1c2FsKHJlZjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGJsb2NraW5nOiBSZWFkb25seUFycmF5PFBpY2s8UGx1Z2luQWR2aXNvcnksICdpZCcgfCAnc2V2ZXJpdHknIHwgJ2ZpeGVkVmVyc2lvbicgfCAnc3VtbWFyeSc+Pik6IFJlc29sdXRpb25SZWZ1c2FsIHtcbiAgY29uc3QgZml4ZWQgPSBibG9ja2luZy5tYXAoKGEpID0+IGEuZml4ZWRWZXJzaW9uKS5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiAhIXYpO1xuICByZXR1cm4ge1xuICAgIGNvZGU6ICdQTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1knLFxuICAgIHJlYXNvbjogJ2Fkdmlzb3J5JyxcbiAgICBtZXNzYWdlOiBgJHtyZWZ9QCR7dmVyc2lvbn0gaXMgYmxvY2tlZCBieSB5b3VyIG9yZ2FuaXphdGlvbidzIGFkdmlzb3J5IHBvbGljeTogJHtibG9ja2luZy5tYXAoKGEpID0+IGAke2Euc2V2ZXJpdHl9IOKAlCAke2Euc3VtbWFyeX1gKS5qb2luKCc7ICcpfS5gXG4gICAgICArIChmaXhlZC5sZW5ndGggPyBgIEZpeGVkIGluICR7Zml4ZWQuam9pbignLCAnKX0uYCA6ICcnKSxcbiAgICBkZXRhaWxzOiB7IHZlcnNpb24sIGFkdmlzb3JpZXM6IGJsb2NraW5nLm1hcCgoYSkgPT4gYS5pZCksIC4uLihmaXhlZC5sZW5ndGggPyB7IGZpeGVkVmVyc2lvbnM6IGZpeGVkIH0gOiB7fSkgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBvcmcncyBpbnN0YWxsIHN0YXRlIGZvciBvbmUgbGlzdGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFRoZSBvcmcgKGFuZCwgZm9yIGEgdGVhbSwgaXRzIHJvb3Qgb3JnKSBhIHJlc29sdXRpb24gcnVucyBmb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdXRpb25TY29wZSB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBUaGUgcm9vdCBvcmcgd2hlbiB0aGUgY2FsbGVyIGlzIGEgdGVhbS4gKi9cbiAgcm9vdE9yZ0lkPzogc3RyaW5nO1xufVxuXG4vKiogVGhlIG9yZyBpZHMgd2hvc2UgaW5zdGFsbHMgYW5kIHBvbGljaWVzIGFwcGx5LCBvd24gZmlyc3QuICovXG5leHBvcnQgZnVuY3Rpb24gc2NvcGVPcmdJZHMoc2NvcGU6IFJlc29sdXRpb25TY29wZSk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgb3duID0gc2NvcGUub3JnSWQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgcm9vdCA9IHNjb3BlLnJvb3RPcmdJZD8udG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHJvb3QgJiYgcm9vdCAhPT0gb3duID8gW293biwgcm9vdF0gOiBbb3duXTtcbn1cblxuLyoqXG4gKiBIb3cgdGhlIG9yZyByZWFjaGVzIGBsaXN0aW5nYCDigJQgb3IgdGhlIHJlZnVzYWwuIEFuIEFDVElWRSBvd24tb3JnIHJvdyB3aW5zLFxuICogdGhlbiB0aGUgcm9vdCBvcmcncyAoYSB0ZWFtIGluaGVyaXRzIGl0KTsgZmFpbGluZyBib3RoLCB0aGUgaW1wbGljaXRcbiAqIE9mZmljaWFsIGluc3RhbGwgKHVubGVzcyB0aGUgcG9saWN5IGlzIGBleHBsaWNpdGApOyBvdGhlcndpc2UgdGhlIG9yZydzIG93blxuICogcGVuZGluZyAvIGRlbmllZCByb3cgZXhwbGFpbnMgdGhlIHJlZnVzYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsTW9kZUZvcihcbiAgcHVibGlzaGVyOiBQaWNrPFB1Ymxpc2hlciwgJ2hhbmRsZSc+LFxuICBsaXN0aW5nOiBQaWNrPFBsdWdpbkxpc3RpbmcsICdpZCcgfCAnbmFtZSc+LFxuICBpbnN0YWxsczogcmVhZG9ubHkgUGx1Z2luSW5zdGFsbFtdLFxuICBwb2xpY3k6IENvbnN1bXB0aW9uUG9saWN5LFxuICBzY29wZTogUmVzb2x1dGlvblNjb3BlLFxuKTogSW5zdGFsbE1vZGUgfCBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIGNvbnN0IFtvd24sIHJvb3RdID0gc2NvcGVPcmdJZHMoc2NvcGUpO1xuICBjb25zdCBmb3JMaXN0aW5nID0gaW5zdGFsbHMuZmlsdGVyKChpKSA9PiBpLmxpc3RpbmdJZCA9PT0gbGlzdGluZy5pZCk7XG4gIGNvbnN0IG93blJvdyA9IGZvckxpc3RpbmcuZmluZCgoaSkgPT4gaS5vcmdJZC50b0xvd2VyQ2FzZSgpID09PSBvd24pO1xuICBjb25zdCByb290Um93ID0gcm9vdCA/IGZvckxpc3RpbmcuZmluZCgoaSkgPT4gaS5vcmdJZC50b0xvd2VyQ2FzZSgpID09PSByb290KSA6IHVuZGVmaW5lZDtcbiAgaWYgKG93blJvdz8uc3RhdHVzID09PSAnYWN0aXZlJykgcmV0dXJuIHsga2luZDogJ2V4cGxpY2l0JywgaW5zdGFsbDogb3duUm93LCBpbmhlcml0ZWQ6IGZhbHNlIH07XG4gIGlmIChyb290Um93Py5zdGF0dXMgPT09ICdhY3RpdmUnKSByZXR1cm4geyBraW5kOiAnZXhwbGljaXQnLCBpbnN0YWxsOiByb290Um93LCBpbmhlcml0ZWQ6IHRydWUgfTtcbiAgY29uc3QgcmVmID0gYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YDtcbiAgaWYgKHB1Ymxpc2hlci5oYW5kbGUgPT09IE9GRklDSUFMX1BVQkxJU0hFUl9IQU5ETEUpIHtcbiAgICBpZiAocG9saWN5Lm9mZmljaWFsSW5zdGFsbHMgPT09ICdpbXBsaWNpdCcpIHJldHVybiB7IGtpbmQ6ICdpbXBsaWNpdCcgfTtcbiAgICBpZiAoIW93blJvdykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJyxcbiAgICAgICAgcmVhc29uOiAnb2ZmaWNpYWxfZXhwbGljaXQnLFxuICAgICAgICBtZXNzYWdlOiBgWW91ciBvcmdhbml6YXRpb24gaW5zdGFsbHMgT2ZmaWNpYWwgcGx1Z2lucyBleHBsaWNpdGx5OyBpbnN0YWxsICR7cmVmfSBmaXJzdC5gLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgaWYgKG93blJvdz8uc3RhdHVzID09PSAncGVuZGluZ19hcHByb3ZhbCcpIHtcbiAgICByZXR1cm4geyBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLCByZWFzb246ICdwZW5kaW5nX2FwcHJvdmFsJywgbWVzc2FnZTogYFRoZSBpbnN0YWxsIG9mICR7cmVmfSBpcyB3YWl0aW5nIGZvciBhcHByb3ZhbC5gIH07XG4gIH1cbiAgaWYgKG93blJvdz8uc3RhdHVzID09PSAnZGVuaWVkJykge1xuICAgIHJldHVybiB7IGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsIHJlYXNvbjogJ2RlbmllZCcsIG1lc3NhZ2U6IGBUaGUgaW5zdGFsbCBvZiAke3JlZn0gd2FzIGRlbmllZC5gIH07XG4gIH1cbiAgcmV0dXJuIHsgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJywgcmVhc29uOiAnbm90X2luc3RhbGxlZCcsIG1lc3NhZ2U6IGAke3JlZn0gaXMgbm90IGluc3RhbGxlZCBpbiB5b3VyIG9yZ2FuaXphdGlvbi5gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEYXRhIHNvdXJjZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFRoZSByb3dzIHRoZSByZXNvbHZlciByZWFkcy4gSW1wbGVtZW50YXRpb25zIG11c3QgcnVuIHdpdGggYSBzY29wZSB0aGF0IGNhblxuICogIHJlYWQgdGhlIGVjb3N5c3RlbSB0YWJsZXMgYW5kIHRoZSBvcmcncyAoYW5kIHJvb3Qgb3JnJ3MpIGluc3RhbGwgcm93cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ0RhdGFTb3VyY2Uge1xuICBwdWJsaXNoZXJCeUhhbmRsZShoYW5kbGU6IHN0cmluZyk6IFByb21pc2U8UHVibGlzaGVyIHwgbnVsbD47XG4gIHB1Ymxpc2hlcnNCeUlkcyhpZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQdWJsaXNoZXJbXT47XG4gIGxpc3RpbmdCeU5hbWUocHVibGlzaGVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5MaXN0aW5nIHwgbnVsbD47XG4gIC8qKiBMaXN0ZWQgLyB1bm1haW50YWluZWQgbGlzdGluZ3MgKG9wdGlvbmFsbHkgb25seSB0aGVzZSBpZHMgb3IgbmFtZXMpLiAqL1xuICBsaXZlTGlzdGluZ3MoZmlsdGVyPzogeyBpZHM/OiBzdHJpbmdbXTsgbmFtZXM/OiBzdHJpbmdbXSB9KTogUHJvbWlzZTxQbHVnaW5MaXN0aW5nW10+O1xuICB2ZXJzaW9uc0Zvckxpc3RpbmdzKGxpc3RpbmdJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQbHVnaW5MaXN0aW5nVmVyc2lvbltdPjtcbiAgLyoqIFBVQkxJU0hFRCBhZHZpc29yaWVzLiAqL1xuICBhZHZpc29yaWVzRm9yTGlzdGluZ3MobGlzdGluZ0lkczogc3RyaW5nW10pOiBQcm9taXNlPFBsdWdpbkFkdmlzb3J5W10+O1xuICBpbnN0YWxsc0Zvck9yZ3Mob3JnSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luSW5zdGFsbFtdPjtcbiAgcG9saWNpZXNGb3JPcmdzKG9yZ0lkczogc3RyaW5nW10pOiBQcm9taXNlPFBsdWdpbkluc3RhbGxQb2xpY3lbXT47XG59XG5cbi8qKlxuICogQSB7QGxpbmsgTGlzdGluZ0RhdGFTb3VyY2V9IG92ZXIgYSBkcml6emxlIHRyYW5zYWN0aW9uLiBUaGUgY2FsbGVyIG93bnMgdGhlXG4gKiB0cmFuc2FjdGlvbidzIHNjb3BlOiBpdCBtdXN0IGJlIGFibGUgdG8gcmVhZCB0aGUgZWNvc3lzdGVtIHRhYmxlcyAoYXBwLXJvbGVcbiAqIFJMUykgYW5kIHRoZSBpbnN0YWxsIHJvd3Mgb2YgdGhlIG9yZyBBTkQgaXRzIHJvb3Qgb3JnIChhIHRlYW0ncyByZWFkcyBvZiBpdHNcbiAqIHJvb3QncyByb3dzIG5lZWQgYW4gZWxldmF0ZWQgc2NvcGUsIGxpa2UgcGFyZW50LW9yZyBwbHVnaW4gcmVhZHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJpenpsZUxpc3RpbmdTb3VyY2UodHg6IENydWRUeCk6IExpc3RpbmdEYXRhU291cmNlIHtcbiAgY29uc3QgZGIgPSB0eDtcbiAgY29uc3QgUCA9IHNjaGVtYS5wdWJsaXNoZXI7XG4gIGNvbnN0IEwgPSBzY2hlbWEucGx1Z2luTGlzdGluZztcbiAgY29uc3QgViA9IHNjaGVtYS5wbHVnaW5MaXN0aW5nVmVyc2lvbjtcbiAgY29uc3QgQSA9IHNjaGVtYS5wbHVnaW5BZHZpc29yeTtcbiAgY29uc3QgSSA9IHNjaGVtYS5wbHVnaW5JbnN0YWxsO1xuICBjb25zdCBJUCA9IHNjaGVtYS5wbHVnaW5JbnN0YWxsUG9saWN5O1xuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlckJ5SGFuZGxlOiBhc3luYyAoaGFuZGxlKSA9PiAoKGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oUCkud2hlcmUoZXEoUC5oYW5kbGUsIGhhbmRsZSkpKSBhcyBQdWJsaXNoZXJbXSlbMF0gPz8gbnVsbCxcbiAgICBwdWJsaXNoZXJzQnlJZHM6IGFzeW5jIChpZHMpID0+IChpZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShQKS53aGVyZShpbkFycmF5KFAuaWQsIGlkcykpIDogW10pLFxuICAgIGxpc3RpbmdCeU5hbWU6IGFzeW5jIChwdWJsaXNoZXJJZCwgbmFtZSkgPT5cbiAgICAgICgoYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShMKS53aGVyZShhbmQoZXEoTC5wdWJsaXNoZXJJZCwgcHVibGlzaGVySWQpLCBlcShMLm5hbWUsIG5hbWUpKSkpIGFzIFBsdWdpbkxpc3RpbmdbXSlbMF0gPz8gbnVsbCxcbiAgICBsaXZlTGlzdGluZ3M6IGFzeW5jIChmaWx0ZXIgPSB7fSkgPT4ge1xuICAgICAgaWYgKGZpbHRlci5pZHMgJiYgZmlsdGVyLmlkcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChmaWx0ZXIubmFtZXMgJiYgZmlsdGVyLm5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIGRiLnNlbGVjdCgpLmZyb20oTCkud2hlcmUoYW5kKFxuICAgICAgICBpbkFycmF5KEwuc3RhdGUsIFsnbGlzdGVkJywgJ3VubWFpbnRhaW5lZCddKSxcbiAgICAgICAgLi4uKGZpbHRlci5pZHMgPyBbaW5BcnJheShMLmlkLCBmaWx0ZXIuaWRzKV0gOiBbXSksXG4gICAgICAgIC4uLihmaWx0ZXIubmFtZXMgPyBbaW5BcnJheShMLm5hbWUsIGZpbHRlci5uYW1lcyldIDogW10pLFxuICAgICAgKSk7XG4gICAgfSxcbiAgICB2ZXJzaW9uc0Zvckxpc3RpbmdzOiBhc3luYyAoaWRzKSA9PiAoaWRzLmxlbmd0aCA/IGRiLnNlbGVjdCgpLmZyb20oVikud2hlcmUoaW5BcnJheShWLmxpc3RpbmdJZCwgaWRzKSkgOiBbXSksXG4gICAgYWR2aXNvcmllc0Zvckxpc3RpbmdzOiBhc3luYyAoaWRzKSA9PiAoaWRzLmxlbmd0aCA/IGRiLnNlbGVjdCgpLmZyb20oQSkud2hlcmUoYW5kKGluQXJyYXkoQS5saXN0aW5nSWQsIGlkcyksIGVxKEEuc3RhdGUsICdwdWJsaXNoZWQnKSkpIDogW10pLFxuICAgIGluc3RhbGxzRm9yT3JnczogYXN5bmMgKG9yZ0lkcykgPT4gKG9yZ0lkcy5sZW5ndGggPyBkYi5zZWxlY3QoKS5mcm9tKEkpLndoZXJlKGluQXJyYXkoSS5vcmdJZCwgb3JnSWRzKSkgOiBbXSksXG4gICAgcG9saWNpZXNGb3JPcmdzOiBhc3luYyAob3JnSWRzKSA9PiAob3JnSWRzLmxlbmd0aCA/IGRiLnNlbGVjdCgpLmZyb20oSVApLndoZXJlKGluQXJyYXkoSVAub3JnSWQsIG9yZ0lkcykpIDogW10pLFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVzb2x1dGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgcGx1Z2luIHJlZmVyZW5jZSBhcyB0aGUgcmVzb2x2ZXIgcmVhZHMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RpbmdSZWZlcmVuY2Uge1xuICAvKiogUHVibGlzaGVyIGhhbmRsZTsgYWJzZW50ID0gdGhlIE9mZmljaWFsIGxpc3RpbmcgKHRoZSB1bnF1YWxpZmllZCBmYWxsYmFjaykuICovXG4gIHB1Ymxpc2hlcj86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogVGhlIHJlZmVyZW5jZSdzIGBmaWx0ZXIudmVyc2lvbmAuICovXG4gIHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKiBBIHJlZmVyZW5jZSB0aGF0IHJlc29sdmVkIHRvIGEgbGlzdGVkIHZlcnNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RpbmdSZXNvbHZlZCB7XG4gIG9rOiB0cnVlO1xuICAvKiogRm9yIGEgRkxBR0dFRCB2ZXJzaW9uOiB0aGUgbmV3ZXN0IHVuZmxhZ2dlZCBvbmUgYWJvdmUgaXQgdGhlIGluc3RhbGwgYWxsb3dzIChudWxsIG90aGVyd2lzZSkuICovXG4gIHN1Z2dlc3RlZFZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gIHB1Ymxpc2hlcjogUHVibGlzaGVyO1xuICBsaXN0aW5nOiBQbHVnaW5MaXN0aW5nO1xuICB2ZXJzaW9uOiBQbHVnaW5MaXN0aW5nVmVyc2lvbjtcbiAgbW9kZTogSW5zdGFsbE1vZGU7XG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3k7XG4gIC8qKiBUaGUgc3BlYyBkZWNsYXJlcyBzZWNyZXRzIHRoZSBwb2xpY3kgd2l0aGhvbGRzIGZyb20gdGhpcyB0aWVyLiAqL1xuICBzZWNyZXRzV2l0aGhlbGQ6IGJvb2xlYW47XG4gIHdhcm5pbmdzOiBSZXNvbHV0aW9uV2FybmluZ1tdO1xufVxuXG4vKiogQSByZWZlcmVuY2UgdGhhdCBuYW1lZCBhIGxpc3RpbmcgYnV0IGNhbid0IHJlc29sdmUuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RpbmdSZWZ1c2VkIHtcbiAgb2s6IGZhbHNlO1xuICByZWZ1c2FsOiBSZXNvbHV0aW9uUmVmdXNhbDtcbiAgcHVibGlzaGVyPzogUHVibGlzaGVyO1xuICBsaXN0aW5nPzogUGx1Z2luTGlzdGluZztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGByZWZgIHRvIGEgbGlzdGVkIHZlcnNpb24gZm9yIGBzY29wZWAsIG9yIHJlZnVzZS4gTnVsbCB3aGVuIHRoZVxuICogbGlzdGluZyBkb2Vzbid0IGV4aXN0IGF0IGFsbCAoYW4gdW5xdWFsaWZpZWQgcmVmZXJlbmNlIHRoZW4gc2ltcGx5IGhhcyBub1xuICogT2ZmaWNpYWwgZmFsbGJhY2spLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxpc3RpbmdSZWZlcmVuY2UoXG4gIHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHJlZjogTGlzdGluZ1JlZmVyZW5jZSxcbiAgc2NvcGU6IFJlc29sdXRpb25TY29wZSxcbik6IFByb21pc2U8TGlzdGluZ1Jlc29sdmVkIHwgTGlzdGluZ1JlZnVzZWQgfCBudWxsPiB7XG4gIGNvbnN0IGhhbmRsZSA9IHJlZi5wdWJsaXNoZXIgPz8gT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRTtcbiAgY29uc3QgcHVibGlzaGVyID0gYXdhaXQgc291cmNlLnB1Ymxpc2hlckJ5SGFuZGxlKGhhbmRsZSk7XG4gIGlmICghcHVibGlzaGVyKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbGlzdGluZyA9IGF3YWl0IHNvdXJjZS5saXN0aW5nQnlOYW1lKHB1Ymxpc2hlci5pZCwgcmVmLm5hbWUpO1xuICBpZiAoIWxpc3RpbmcpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG9yZ0lkcyA9IHNjb3BlT3JnSWRzKHNjb3BlKTtcbiAgY29uc3QgW3BvbGljaWVzLCBpbnN0YWxsc10gPSBhd2FpdCBQcm9taXNlLmFsbChbc291cmNlLnBvbGljaWVzRm9yT3JncyhvcmdJZHMpLCBzb3VyY2UuaW5zdGFsbHNGb3JPcmdzKG9yZ0lkcyldKTtcbiAgY29uc3QgcG9saWN5ID0gZWZmZWN0aXZlQ29uc3VtcHRpb25Qb2xpY3kocG9saWNpZXMsIG9yZ0lkc1swXSEsIG9yZ0lkc1sxXSk7XG4gIGNvbnN0IGJsb2NrID0gbGlzdGluZ0Jsb2NrKHBvbGljeSwgcHVibGlzaGVyLCBsaXN0aW5nKTtcbiAgaWYgKGJsb2NrKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IGJsb2NrUmVmdXNhbChibG9jayksIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IG1vZGUgPSBpbnN0YWxsTW9kZUZvcihwdWJsaXNoZXIsIGxpc3RpbmcsIGluc3RhbGxzLCBwb2xpY3ksIHNjb3BlKTtcbiAgaWYgKCdjb2RlJyBpbiBtb2RlKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IG1vZGUsIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IFt2ZXJzaW9ucywgYWR2aXNvcmllc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgc291cmNlLnZlcnNpb25zRm9yTGlzdGluZ3MoW2xpc3RpbmcuaWRdKSxcbiAgICBzb3VyY2UuYWR2aXNvcmllc0Zvckxpc3RpbmdzKFtsaXN0aW5nLmlkXSksXG4gIF0pO1xuICBjb25zdCByZWZfID0gYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YDtcbiAgY29uc3QgY2hvaWNlID0gc2VsZWN0TGlzdGluZ1ZlcnNpb24oeyByZWY6IHJlZl8sIHZlcnNpb25zLCBtb2RlLCByZXF1ZXN0ZWQ6IHJlZi52ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSk7XG4gIGlmICgncmVmdXNhbCcgaW4gY2hvaWNlKSByZXR1cm4geyBvazogZmFsc2UsIHJlZnVzYWw6IGNob2ljZS5yZWZ1c2FsLCBwdWJsaXNoZXIsIGxpc3RpbmcgfTtcblxuICBjb25zdCB2ZXJzaW9uID0gY2hvaWNlLnZlcnNpb247XG4gIGNvbnN0IHsgd2FybmluZ3MsIHNlY3JldHNXaXRoaGVsZCB9ID0gbGlzdGVkVmVyc2lvbldhcm5pbmdzKHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSk7XG4gIC8vIFRoZSBwaW4ga2VlcHMgdGhlIHBpcGVsaW5lIG9uIGEgZmxhZ2dlZCB2ZXJzaW9uIHdoaWxlIGEgY2xlYW4gb25lIGlzIGFsbG93ZWQuXG4gIGlmIChjaG9pY2Uuc3VnZ2VzdGVkVmVyc2lvbiAmJiByZWYudmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2FybmluZ3MucHVzaCh2dWxuVXBncmFkZUF2YWlsYWJsZVdhcm5pbmcocmVmXywgdmVyc2lvbi52ZXJzaW9uLCBjaG9pY2Uuc3VnZ2VzdGVkVmVyc2lvbikpO1xuICB9XG4gIHJldHVybiB7IG9rOiB0cnVlLCBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIG1vZGUsIHBvbGljeSwgc2VjcmV0c1dpdGhoZWxkLCB3YXJuaW5ncywgc3VnZ2VzdGVkVmVyc2lvbjogY2hvaWNlLnN1Z2dlc3RlZFZlcnNpb24gfTtcbn1cblxuLyoqXG4gKiBUaGUgbm9uLWZhdGFsIG5vdGVzIGEgcmVzb2x2ZWQgbGlzdGVkIHZlcnNpb24gY2FycmllcyAobG9va3VwIGFuc3dlcnMsXG4gKiBzeW50aCBwcmludHMgdGhlbSwgdGhlIGluc3RhbGxzIHZpZXcgc2hvd3MgdGhlbSk6IGFuIHVubWFpbnRhaW5lZCBsaXN0aW5nLCBhXG4gKiBkZXByZWNhdGVkIHZlcnNpb24sIGEgUFVCTElTSEVEIGFkdmlzb3J5IGNvdmVyaW5nIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIG9yZydzXG4gKiBgYmxvY2tPbkFkdmlzb3J5YCBkb2Vzbid0IGJsb2NrIChhIGJsb2NraW5nIG9uZSByZWZ1c2VzIHJlc29sdXRpb24gaW5zdGVhZCksXG4gKiBhbmQgd2l0aGhlbGQgc2VjcmV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlZFZlcnNpb25XYXJuaW5ncyhpbnB1dDoge1xuICBwdWJsaXNoZXI6IFBpY2s8UHVibGlzaGVyLCAnaGFuZGxlJyB8ICd0aWVyJz47XG4gIGxpc3Rpbmc6IFBpY2s8UGx1Z2luTGlzdGluZywgJ25hbWUnIHwgJ3N0YXRlJz47XG4gIHZlcnNpb246IFBpY2s8UGx1Z2luTGlzdGluZ1ZlcnNpb24sICd2ZXJzaW9uJyB8ICdkZXByZWNhdGVkQXQnIHwgJ2RlcHJlY2F0aW9uTWVzc2FnZScgfCAnc3BlY1NuYXBzaG90Jz5cbiAgICAmIFBhcnRpYWw8UGljazxQbHVnaW5MaXN0aW5nVmVyc2lvbiwgJ3NjYW5GbGFnZ2VkQXQnIHwgJ3NjYW5GbGFnJz4+O1xuICBhZHZpc29yaWVzOiByZWFkb25seSBQaWNrPFBsdWdpbkFkdmlzb3J5LCAnc2V2ZXJpdHknIHwgJ3N0YXRlJyB8ICdhZmZlY3RlZFJhbmdlJyB8ICdmaXhlZFZlcnNpb24nIHwgJ3N1bW1hcnknPltdO1xuICBwb2xpY3k6IFBpY2s8Q29uc3VtcHRpb25Qb2xpY3ksICdzZWNyZXRzQWxsb3dlZFRpZXJzJz47XG59KTogeyB3YXJuaW5nczogUmVzb2x1dGlvbldhcm5pbmdbXTsgc2VjcmV0c1dpdGhoZWxkOiBib29sZWFuIH0ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgbGlzdGluZywgdmVyc2lvbiwgYWR2aXNvcmllcywgcG9saWN5IH0gPSBpbnB1dDtcbiAgY29uc3QgcmVmID0gYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YDtcbiAgY29uc3QgZGVjbGFyZXNTZWNyZXRzID0gKHZlcnNpb24uc3BlY1NuYXBzaG90Py5zZWNyZXRzID8/IFtdKS5sZW5ndGggPiAwO1xuICBjb25zdCBzZWNyZXRzV2l0aGhlbGQgPSBkZWNsYXJlc1NlY3JldHMgJiYgIXBvbGljeS5zZWNyZXRzQWxsb3dlZFRpZXJzLmluY2x1ZGVzKHB1Ymxpc2hlci50aWVyKTtcbiAgY29uc3Qgd2FybmluZ3M6IFJlc29sdXRpb25XYXJuaW5nW10gPSBbXTtcbiAgaWYgKGxpc3Rpbmcuc3RhdGUgPT09ICd1bm1haW50YWluZWQnKSB7XG4gICAgd2FybmluZ3MucHVzaCh7IGNvZGU6ICdMSVNUSU5HX1VOTUFJTlRBSU5FRCcsIG1lc3NhZ2U6IGAke3JlZn0gaXMgdW5tYWludGFpbmVkOiBpdCByZWNlaXZlcyBubyB1cGRhdGVzLiBQbGFuIGEgcmVwbGFjZW1lbnQuYCB9KTtcbiAgfVxuICBpZiAodmVyc2lvbi5kZXByZWNhdGVkQXQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZTogJ1BMVUdJTl9ERVBSRUNBVEVEJywgbWVzc2FnZTogYCR7cmVmfUAke3ZlcnNpb24udmVyc2lvbn0gaXMgZGVwcmVjYXRlZCR7dmVyc2lvbi5kZXByZWNhdGlvbk1lc3NhZ2UgPyBgOiAke3ZlcnNpb24uZGVwcmVjYXRpb25NZXNzYWdlfWAgOiAnJ30uYCB9KTtcbiAgfVxuICBmb3IgKGNvbnN0IGEgb2YgYWR2aXNvcmllc0NvdmVyaW5nKGFkdmlzb3JpZXMsIHZlcnNpb24udmVyc2lvbikpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgIGNvZGU6ICdQTFVHSU5fQURWSVNPUlknLFxuICAgICAgbWVzc2FnZTogYCR7cmVmfUAke3ZlcnNpb24udmVyc2lvbn0gaXMgYWZmZWN0ZWQgYnkgYSAke2Euc2V2ZXJpdHl9IHNlY3VyaXR5IGFkdmlzb3J5OiAke2Euc3VtbWFyeX1gXG4gICAgICAgICsgYCR7YS5maXhlZFZlcnNpb24gPyBgIEZpeGVkIGluICR7YS5maXhlZFZlcnNpb259LmAgOiAnJ31gLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGZsYWcgPSB2ZXJzaW9uLnNjYW5GbGFnZ2VkQXQgPyBhc1NjYW5GbGFnKHZlcnNpb24uc2NhbkZsYWcpIDogbnVsbDtcbiAgaWYgKGZsYWcpIHdhcm5pbmdzLnB1c2godnVsbkZsYWdnZWRXYXJuaW5nKHJlZiwgdmVyc2lvbi52ZXJzaW9uLCBmbGFnKSk7XG4gIGlmIChzZWNyZXRzV2l0aGhlbGQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZTogJ1BMVUdJTl9TRUNSRVRTX1dJVEhIRUxEJywgbWVzc2FnZTogYCR7cmVmfSBpcyBhICR7cHVibGlzaGVyLnRpZXJ9IHBsdWdpbjsgeW91ciBvcmdhbml6YXRpb24ncyBwb2xpY3kgZ2l2ZXMgaXQgbm8gc2VjcmV0cywgc28gaXRzIGRlY2xhcmVkIHNlY3JldHMgYXJlIG5vdCBpbmplY3RlZC5gIH0pO1xuICB9XG4gIHJldHVybiB7IHdhcm5pbmdzLCBzZWNyZXRzV2l0aGhlbGQgfTtcbn1cblxuLyoqXG4gKiBUaGUgcGx1Z2luIHJlY29yZCBhIHJlc29sdmVkIGxpc3RpbmcgdmVyc2lvbiBydW5zIGFzIOKAlCB0aGUgc2hhcGUgc3ludGggYW5kXG4gKiB0aGUgY29udHJhY3QgY2hlY2sgcmVhZCAoYSBgcGx1Z2luc2Agcm93J3MgcnVuIGZpZWxkcyksIGJ1aWx0IGZyb20gdGhlXG4gKiB2ZXJzaW9uJ3MgZnJvemVuIHNwZWMgc25hcHNob3QuIGBpZGAgaXMgdGhlIExJU1RJTkcgVkVSU0lPTidzIGlkICh0aGUgc3RlcFxuICogbWFuaWZlc3QgcmVzb2x2ZXMgaXQgYmFjayksIGBpbWFnZVJlcG9zaXRvcnlgIGl0cyBgcHVibGljLypgIGNvcHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZWRQbHVnaW5SZWNvcmQocmVzOiBMaXN0aW5nUmVzb2x2ZWQpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBtb2RlIH0gPSByZXM7XG4gIGNvbnN0IHMgPSAodmVyc2lvbi5zcGVjU25hcHNob3QgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBhcnIgPSA8VD4odjogdW5rbm93bik6IFRbXSA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgYXMgVFtdIDogW10pO1xuICBjb25zdCBvYmogPSAodjogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+ICh2ICYmIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2KSA/IHYgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gOiB7fSk7XG4gIHJldHVybiB7XG4gICAgaWQ6IHZlcnNpb24uaWQsXG4gICAgc291cmNlOiAnbGlzdGluZycsXG4gICAgcHVibGlzaGVyOiBwdWJsaXNoZXIuaGFuZGxlLFxuICAgIHB1Ymxpc2hlclRpZXI6IHB1Ymxpc2hlci50aWVyLFxuICAgIGxpc3RpbmdJZDogbGlzdGluZy5pZCxcbiAgICBpbnN0YWxsOiBtb2RlLmtpbmQsXG4gICAgbmFtZTogbGlzdGluZy5uYW1lLFxuICAgIHZlcnNpb246IHZlcnNpb24udmVyc2lvbixcbiAgICBpbWFnZVJlcG9zaXRvcnk6IHZlcnNpb24uaW1hZ2VSZXBvc2l0b3J5LFxuICAgIGltYWdlRGlnZXN0OiB2ZXJzaW9uLmltYWdlRGlnZXN0LFxuICAgIGJ1aWxkVHlwZTogdHlwZW9mIHMuYnVpbGRUeXBlID09PSAnc3RyaW5nJyA/IHMuYnVpbGRUeXBlIDogKHZlcnNpb24uaW1hZ2VEaWdlc3QgPyAnYnVpbGRfaW1hZ2UnIDogJ21ldGFkYXRhX29ubHknKSxcbiAgICBwbHVnaW5UeXBlOiBzLnBsdWdpblR5cGUgPz8gJ0NvZGVCdWlsZFN0ZXAnLFxuICAgIGNvbXB1dGVUeXBlOiBzLmNvbXB1dGVUeXBlID8/ICdTTUFMTCcsXG4gICAgZGVzY3JpcHRpb246IHMuZGVzY3JpcHRpb24gPz8gbGlzdGluZy5kZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgIHN1bW1hcnk6IHMuc3VtbWFyeSA/PyBsaXN0aW5nLnN1bW1hcnkgPz8gbnVsbCxcbiAgICBkaXNwbGF5TmFtZTogcy5kaXNwbGF5TmFtZSA/PyBudWxsLFxuICAgIGtleXdvcmRzOiBhcnI8c3RyaW5nPihzLmtleXdvcmRzKSxcbiAgICBjYXRlZ29yeTogcy5jYXRlZ29yeSA/PyBsaXN0aW5nLmNhdGVnb3J5LFxuICAgIG1ldGFkYXRhOiBvYmoocy5tZXRhZGF0YSksXG4gICAgZW52OiBvYmoocy5lbnYpLFxuICAgIGJ1aWxkQXJnczoge30sXG4gICAgaW5zdGFsbENvbW1hbmRzOiBhcnI8c3RyaW5nPihzLmluc3RhbGxDb21tYW5kcyksXG4gICAgY29tbWFuZHM6IGFycjxzdHJpbmc+KHMuY29tbWFuZHMpLFxuICAgIHRpbWVvdXQ6IHMudGltZW91dCA/PyBudWxsLFxuICAgIGZhaWx1cmVCZWhhdmlvcjogcy5mYWlsdXJlQmVoYXZpb3IgPz8gJ2ZhaWwnLFxuICAgIHByaW1hcnlPdXRwdXREaXJlY3Rvcnk6IHMucHJpbWFyeU91dHB1dERpcmVjdG9yeSA/PyBudWxsLFxuICAgIHNlY3JldHM6IHJlcy5zZWNyZXRzV2l0aGhlbGQgPyBbXSA6IGFycihzLnNlY3JldHMpLFxuICAgIHJlcXVpcmVkTWV0YWRhdGE6IGFycjxzdHJpbmc+KHMucmVxdWlyZWRNZXRhZGF0YSksXG4gICAgcmVxdWlyZWRWYXJzOiBhcnI8c3RyaW5nPihzLnJlcXVpcmVkVmFycyksXG4gICAgbWV0YWRhdGFUeXBlczogb2JqKHMubWV0YWRhdGFUeXBlcyksXG4gICAgdmFyc1R5cGVzOiBvYmoocy52YXJzVHlwZXMpLFxuICAgIG5ldHdvcmtFZ3Jlc3M6IGFycjxzdHJpbmc+KHMubmV0d29ya0VncmVzcyksXG4gICAgcnVuQXNSb290OiBzLnJ1bkFzUm9vdCA/PyBudWxsLFxuICAgIGxpY2Vuc2U6IHMubGljZW5zZSA/PyBsaXN0aW5nLmxpY2Vuc2UgPz8gbnVsbCxcbiAgICBob21lcGFnZVVybDogcy5ob21lcGFnZVVybCA/PyBsaXN0aW5nLmhvbWVwYWdlVXJsID8/IG51bGwsXG4gICAgc291cmNlVXJsOiBzLnNvdXJjZVVybCA/PyBsaXN0aW5nLnNvdXJjZVVybCA/PyBudWxsLFxuICAgIGRvY3VtZW50YXRpb25Vcmw6IHMuZG9jdW1lbnRhdGlvblVybCA/PyBudWxsLFxuICAgIGljb246IHMuaWNvbiA/PyBsaXN0aW5nLmljb24gPz8gbnVsbCxcbiAgICBjaGFuZ2Vsb2c6IHZlcnNpb24uY2hhbmdlbG9nLFxuICAgIGJyZWFraW5nOiB2ZXJzaW9uLmJyZWFraW5nLFxuICAgIHZ1bG5Dcml0aWNhbDogdmVyc2lvbi52dWxuQ3JpdGljYWwsXG4gICAgdnVsbkhpZ2g6IHZlcnNpb24udnVsbkhpZ2gsXG4gICAgdnVsbkNyaXRpY2FsRml4YWJsZTogdmVyc2lvbi52dWxuQ3JpdGljYWxGaXhhYmxlLFxuICAgIHZ1bG5IaWdoRml4YWJsZTogdmVyc2lvbi52dWxuSGlnaEZpeGFibGUsXG4gICAgc2Nhbm5lZEF0OiB2ZXJzaW9uLnNjYW5uZWRBdCxcbiAgICBzY2FuRmxhZ2dlZEF0OiB2ZXJzaW9uLnNjYW5GbGFnZ2VkQXQsXG4gICAgc2NhbkZsYWc6IHZlcnNpb24uc2NhbkZsYWcsXG4gICAgc2NhblN1bW1hcnk6IHZlcnNpb24uc2NhblN1bW1hcnksXG4gICAgbGlmZWN5Y2xlOiB2ZXJzaW9uLmRlcHJlY2F0ZWRBdCA/ICdkZXByZWNhdGVkJyA6ICdwcm9kdWN0aW9uJyxcbiAgICBkZXByZWNhdGVkQXQ6IHZlcnNpb24uZGVwcmVjYXRlZEF0LFxuICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogdmVyc2lvbi5kZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgeWFua2VkQXQ6IG51bGwsXG4gICAgeWFua1JlYXNvbjogbnVsbCxcbiAgICB2aXNpYmlsaXR5OiAncHVibGljJyxcbiAgICBpc0RlZmF1bHQ6IHRydWUsXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFdmVyeXRoaW5nIGFuIG9yZyBjYW4gcmVzb2x2ZSAoY2F0YWxvZywgQUkgc2VsZWN0aW9uLCBwbGFjZWhvbGRlciBndWFyZClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBPbmUgbGlzdGluZyB3aXRoIHRoZSBvcmcncyBzdGFuZGluZyBvbiBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JnTGlzdGluZ1N0YXRlIHtcbiAgcHVibGlzaGVyOiBQdWJsaXNoZXI7XG4gIGxpc3Rpbmc6IFBsdWdpbkxpc3Rpbmc7XG4gIHZlcnNpb25zOiBQbHVnaW5MaXN0aW5nVmVyc2lvbltdO1xuICAvKiogSG93IHRoZSBvcmcgcmVhY2hlcyBpdCwgb3Igd2h5IGl0IGNhbid0IChub3QgaW5zdGFsbGVkLCBwZW5kaW5nLCDigKYpLiAqL1xuICBtb2RlOiBJbnN0YWxsTW9kZSB8IFJlc29sdXRpb25SZWZ1c2FsO1xuICAvKiogQSBwb2xpY3kgLyBzdGF0ZSBibG9jayAodGllciwgYmxvY2tlZCBsaXN0aW5nLCBzdXNwZW5kZWQpLCBvciBudWxsLiAqL1xuICBibG9jazogTGlzdGluZ0Jsb2NrIHwgbnVsbDtcbiAgLyoqIFdoYXQgYW4gVU5WRVJTSU9ORUQgcmVmZXJlbmNlIHJlc29sdmVzIHRvIHJpZ2h0IG5vdywgb3IgbnVsbC4gKi9cbiAgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIHwgbnVsbDtcbiAgLyoqIFdoeSBub3RoaW5nIHJlc29sdmVzLCB3aGVuIHRoZSBvcmcgZG9lcyByZWFjaCB0aGUgbGlzdGluZyAoZS5nLiBhbiBhZHZpc29yeSBibG9jaykuICovXG4gIHJlZnVzYWw6IFJlc29sdXRpb25SZWZ1c2FsIHwgbnVsbDtcbiAgLyoqIFRoZSBsaXN0aW5nJ3MgUFVCTElTSEVEIGFkdmlzb3JpZXMuICovXG4gIGFkdmlzb3JpZXM6IFBsdWdpbkFkdmlzb3J5W107XG4gIC8qKiBUaGUgb3JnJ3Mgb3duIGluc3RhbGwgcm93IGZvciBpdCAoZXhwbGljaXQsIHBvc3NpYmx5IHBlbmRpbmcvZGVuaWVkKS4gKi9cbiAgb3duSW5zdGFsbDogUGx1Z2luSW5zdGFsbCB8IG51bGw7XG4gIC8qKiBUaGUgb3JnJ3MgZWZmZWN0aXZlIGNvbnN1bXB0aW9uIHBvbGljeSAodGhlIHNhbWUgZm9yIGV2ZXJ5IGxpc3RpbmcpLiAqL1xuICBwb2xpY3k6IENvbnN1bXB0aW9uUG9saWN5O1xufVxuXG4vKiogVGhlIG9yZydzIHBvbGljeSArIGluc3RhbGwgcm93cyAob3duIGFuZCByb290KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JnSW5zdGFsbENvbnRleHQge1xuICBwb2xpY3k6IENvbnN1bXB0aW9uUG9saWN5O1xuICBpbnN0YWxsczogUGx1Z2luSW5zdGFsbFtdO1xuICBzY29wZTogUmVzb2x1dGlvblNjb3BlO1xufVxuXG4vKiogTG9hZCB0aGUgb3JnJ3MgcG9saWN5IGFuZCBpbnN0YWxsIHJvd3MuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZE9yZ0luc3RhbGxDb250ZXh0KHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUpOiBQcm9taXNlPE9yZ0luc3RhbGxDb250ZXh0PiB7XG4gIGNvbnN0IG9yZ0lkcyA9IHNjb3BlT3JnSWRzKHNjb3BlKTtcbiAgY29uc3QgW3BvbGljaWVzLCBpbnN0YWxsc10gPSBhd2FpdCBQcm9taXNlLmFsbChbc291cmNlLnBvbGljaWVzRm9yT3JncyhvcmdJZHMpLCBzb3VyY2UuaW5zdGFsbHNGb3JPcmdzKG9yZ0lkcyldKTtcbiAgcmV0dXJuIHsgcG9saWN5OiBlZmZlY3RpdmVDb25zdW1wdGlvblBvbGljeShwb2xpY2llcywgb3JnSWRzWzBdISwgb3JnSWRzWzFdKSwgaW5zdGFsbHMsIHNjb3BlIH07XG59XG5cbi8qKlxuICogVGhlIG9yZydzIHN0YW5kaW5nIG9uIGV2ZXJ5IGxpdmUgbGlzdGluZyAob3Igb25seSBgZmlsdGVyYCdzKS4gVXNlZCBieSB0aGVcbiAqIGluLWFwcCBjYXRhbG9nOyB7QGxpbmsgcmVzb2x2YWJsZUxpc3RpbmdzfSBuYXJyb3dzIGl0IHRvIHdoYXQgcmVzb2x2ZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcmdMaXN0aW5nU3RhdGVzKFxuICBzb3VyY2U6IExpc3RpbmdEYXRhU291cmNlLFxuICBzY29wZTogUmVzb2x1dGlvblNjb3BlLFxuICBmaWx0ZXI6IHsgaWRzPzogc3RyaW5nW107IG5hbWVzPzogc3RyaW5nW10gfSA9IHt9LFxuICBjdHg/OiBPcmdJbnN0YWxsQ29udGV4dCxcbik6IFByb21pc2U8T3JnTGlzdGluZ1N0YXRlW10+IHtcbiAgY29uc3QgY29udGV4dCA9IGN0eCA/PyBhd2FpdCBsb2FkT3JnSW5zdGFsbENvbnRleHQoc291cmNlLCBzY29wZSk7XG4gIGNvbnN0IGxpdmUgPSBhd2FpdCBzb3VyY2UubGl2ZUxpc3RpbmdzKGZpbHRlcik7XG4gIGlmIChsaXZlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICBjb25zdCBpZHMgPSBsaXZlLm1hcCgobCkgPT4gbC5pZCk7XG4gIGNvbnN0IFtwdWJzLCB2ZXJzaW9ucywgYWR2aXNvcmllc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgc291cmNlLnB1Ymxpc2hlcnNCeUlkcyhbLi4ubmV3IFNldChsaXZlLm1hcCgobCkgPT4gbC5wdWJsaXNoZXJJZCkpXSksXG4gICAgc291cmNlLnZlcnNpb25zRm9yTGlzdGluZ3MoaWRzKSxcbiAgICBzb3VyY2UuYWR2aXNvcmllc0Zvckxpc3RpbmdzKGlkcyksXG4gIF0pO1xuICBjb25zdCBieVB1Ymxpc2hlciA9IG5ldyBNYXAocHVicy5tYXAoKHApID0+IFtwLmlkLCBwXSkpO1xuICBjb25zdCBvd24gPSBzY29wZU9yZ0lkcyhzY29wZSlbMF0hO1xuICBjb25zdCBvdXQ6IE9yZ0xpc3RpbmdTdGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgbGlzdGluZyBvZiBsaXZlKSB7XG4gICAgY29uc3QgcHVibGlzaGVyID0gYnlQdWJsaXNoZXIuZ2V0KGxpc3RpbmcucHVibGlzaGVySWQpO1xuICAgIGlmICghcHVibGlzaGVyKSBjb250aW51ZTtcbiAgICBjb25zdCB2cyA9IHZlcnNpb25zLmZpbHRlcigodikgPT4gdi5saXN0aW5nSWQgPT09IGxpc3RpbmcuaWQpO1xuICAgIGNvbnN0IGJsb2NrID0gbGlzdGluZ0Jsb2NrKGNvbnRleHQucG9saWN5LCBwdWJsaXNoZXIsIGxpc3RpbmcpO1xuICAgIGNvbnN0IG1vZGUgPSBpbnN0YWxsTW9kZUZvcihwdWJsaXNoZXIsIGxpc3RpbmcsIGNvbnRleHQuaW5zdGFsbHMsIGNvbnRleHQucG9saWN5LCBzY29wZSk7XG4gICAgY29uc3QgbGlzdGluZ0Fkdmlzb3JpZXMgPSBhZHZpc29yaWVzLmZpbHRlcigoYSkgPT4gYS5saXN0aW5nSWQgPT09IGxpc3RpbmcuaWQpO1xuICAgIGxldCByZXNvbHZlZDogUGx1Z2luTGlzdGluZ1ZlcnNpb24gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgcmVmdXNhbDogUmVzb2x1dGlvblJlZnVzYWwgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoIWJsb2NrICYmICEoJ2NvZGUnIGluIG1vZGUpKSB7XG4gICAgICBjb25zdCBjaG9pY2UgPSBzZWxlY3RMaXN0aW5nVmVyc2lvbih7XG4gICAgICAgIHJlZjogYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YCwgdmVyc2lvbnM6IHZzLCBtb2RlLCBhZHZpc29yaWVzOiBsaXN0aW5nQWR2aXNvcmllcywgcG9saWN5OiBjb250ZXh0LnBvbGljeSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCd2ZXJzaW9uJyBpbiBjaG9pY2UpIHJlc29sdmVkID0gY2hvaWNlLnZlcnNpb247XG4gICAgICBlbHNlIHJlZnVzYWwgPSBjaG9pY2UucmVmdXNhbDtcbiAgICB9XG4gICAgY29uc3Qgb3duSW5zdGFsbCA9IGNvbnRleHQuaW5zdGFsbHMuZmluZCgoaSkgPT4gaS5saXN0aW5nSWQgPT09IGxpc3RpbmcuaWQgJiYgaS5vcmdJZC50b0xvd2VyQ2FzZSgpID09PSBvd24pID8/IG51bGw7XG4gICAgb3V0LnB1c2goeyBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb25zOiB2cywgbW9kZSwgYmxvY2ssIHJlc29sdmVkLCByZWZ1c2FsLCBhZHZpc29yaWVzOiBsaXN0aW5nQWR2aXNvcmllcywgb3duSW5zdGFsbCwgcG9saWN5OiBjb250ZXh0LnBvbGljeSB9KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogVGhlIGxpc3RpbmdzIGFuIG9yZydzIHJlZmVyZW5jZXMgcmVzb2x2ZSB0byBub3cgKGluc3RhbGxlZCBvciBpbXBsaWNpdCwgbm90IGJsb2NrZWQpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmFibGVMaXN0aW5ncyhcbiAgc291cmNlOiBMaXN0aW5nRGF0YVNvdXJjZSxcbiAgc2NvcGU6IFJlc29sdXRpb25TY29wZSxcbiAgZmlsdGVyOiB7IG5hbWVzPzogc3RyaW5nW10gfSA9IHt9LFxuKTogUHJvbWlzZTxBcnJheTxPcmdMaXN0aW5nU3RhdGUgJiB7IHJlc29sdmVkOiBQbHVnaW5MaXN0aW5nVmVyc2lvbiB9Pj4ge1xuICByZXR1cm4gKGF3YWl0IG9yZ0xpc3RpbmdTdGF0ZXMoc291cmNlLCBzY29wZSwgZmlsdGVyKSlcbiAgICAuZmlsdGVyKChzKTogcyBpcyBPcmdMaXN0aW5nU3RhdGUgJiB7IHJlc29sdmVkOiBQbHVnaW5MaXN0aW5nVmVyc2lvbiB9ID0+IHMucmVzb2x2ZWQgIT09IG51bGwpO1xufVxuIl19
497
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdXRpb24uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcGx1Z2luLXJlc29sdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBRUgsT0FBTyxFQUNMLFVBQVUsRUFBRSxrQkFBa0IsR0FDL0IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEYsT0FBTyxFQUFFLDBCQUEwQixFQUEwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3BHLE9BQU8sRUFDTCxhQUFhLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsR0FDakUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLE1BQU0sR0FRUCxNQUFNLCtCQUErQixDQUFDO0FBa0N2QywrR0FBK0c7QUFDL0csTUFBTSxVQUFVLDJCQUEyQixDQUFDLEdBQVcsRUFBRSxRQUFnQixFQUFFLFNBQWlCO0lBQzFGLE9BQU87UUFDTCxJQUFJLEVBQUUsd0JBQXdCO1FBQzlCLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxHQUFHLEdBQUcsSUFBSSxRQUFRLHNEQUFzRCxHQUFHLElBQUksU0FBUyx5RUFBeUU7UUFDMUssUUFBUTtRQUNSLGdCQUFnQixFQUFFLFNBQVM7S0FDNUIsQ0FBQztBQUNKLENBQUM7QUFRRCxrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLFlBQVksQ0FDMUIsTUFBeUIsRUFDekIsU0FBNkQsRUFDN0QsT0FBOEM7SUFFOUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FB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O1lBQ2xDLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3JELElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3pELE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUNsQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUM1QyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ2xELEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDekQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELG1CQUFtQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVHLHFCQUFxQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMs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RjtBQUM1RixNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxNQUF5QixFQUN6QixLQUFzQixFQUN0QixNQUFNLEdBQXlCLEVBQUU7SUFFakMsT0FBTyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNuRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQTZELEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQ25HLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSZXNvbHZpbmcgYSBwbHVnaW4gcmVmZXJlbmNlIHRvIGFuIGVjb3N5c3RlbSBMSVNUSU5HIHZlcnNpb24gdGhyb3VnaCB0aGVcbiAqIG9yZydzIGluc3RhbGwgKGRvY3MvcGx1Z2luLWluc3RhbGxpbmcubWQpLlxuICpcbiAqIE9uZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYnkgZXZlcnkgcGxhY2UgdGhhdCBhbnN3ZXJzIFwid2hpY2ggbGlzdGVkIHZlcnNpb25cbiAqIGRvZXMgdGhpcyBvcmcncyByZWZlcmVuY2UgcnVuP1wiOiB0aGUgcGx1Z2luIHNlcnZpY2UncyBgL3BsdWdpbnMvbG9va3VwYCAod2hhdFxuICogc3ludGggcGlucyksIHRoZSBwaXBlbGluZSBzZXJ2aWNlJ3MgY29udHJhY3QgY2hlY2sgYXQgcGlwZWxpbmUgY3JlYXRlLCB0aGUgQUlcbiAqIGdlbmVyYXRvcidzIHBsdWdpbiBsaXN0IGFuZCB0aGUgcGxhY2Vob2xkZXIgZ3VhcmQuIFRoZSBkZWNpc2lvbnMgYXJlIFBVUkVcbiAqIGZ1bmN0aW9ucyBvdmVyIGxvYWRlZCByb3dzOyB0aGUgcm93cyBjb21lIHRocm91Z2ggYSB7QGxpbmsgTGlzdGluZ0RhdGFTb3VyY2V9XG4gKiBzbyBlYWNoIHNlcnZpY2UgY2FuIGxvYWQgdGhlbSBpdHMgb3duIHdheSAoe0BsaW5rIGRyaXp6bGVMaXN0aW5nU291cmNlfSBpcyB0aGVcbiAqIHBsYWluIGRyaXp6bGUgb25lKS5cbiAqXG4gKiBUaGUgbW9kZWw6XG4gKiAgLSBBbiBvcmcgcmVzb2x2ZXMgYSBsaXN0aW5nIG9ubHkgdGhyb3VnaCBhbiBJTlNUQUxMOiBhbiBleHBsaWNpdFxuICogICAgYHBsdWdpbl9pbnN0YWxsc2Agcm93IChpdHMgb3duLCBvciDigJQgZm9yIGEgdGVhbSDigJQgaXRzIHJvb3Qgb3JnJ3MpLCBvclxuICogICAgZm9yIHRoZSBPZmZpY2lhbCBwdWJsaXNoZXIgdGhlIElNUExJQ0lUIGluc3RhbGwgZXZlcnkgb3JnIGhhcyB1bmxlc3MgaXRzXG4gKiAgICBjb25zdW1wdGlvbiBwb2xpY3kgc2F5cyBgb2ZmaWNpYWxJbnN0YWxsczogZXhwbGljaXRgLiBBbiBleHBsaWNpdFxuICogICAgaW5zdGFsbCBvdmVycmlkZXMgdGhlIGltcGxpY2l0IG9uZS5cbiAqICAtIFRoZSBvcmcncyBDT05TVU1QVElPTiBQT0xJQ1kgaXMgYXBwbGllZCBhdCBldmVyeSByZXNvbHV0aW9uOiBhbGxvd2VkXG4gKiAgICB0aWVycywgYmxvY2tlZCBsaXN0aW5ncywgYWR2aXNvcnkgYmxvY2tpbmc7IHNlY3JldHMgYXJlIHdpdGhoZWxkIGZyb20gdGllcnNcbiAqICAgIHRoZSBwb2xpY3kgZG9lc24ndCB0cnVzdCB3aXRoIHRoZW0uIEEgdGVhbSdzIHBvbGljeSBpcyBtZXJnZWQgd2l0aCBpdHMgcm9vdFxuICogICAgb3JnJ3MgYW5kIGNhbiBvbmx5IGJlIHN0cmljdGVyLlxuICogIC0gVmVyc2lvbiBjaG9pY2U6IHRoZSBpbnN0YWxsJ3MgcmFuZ2UgKHBpbm5lZCAvIGB+YCAvIGBeYCAvIG5vbi1icmVha2luZ1xuICogICAgbGF0ZXN0OyBpbXBsaWNpdCA9IHRoZSBsb3dlc3QgbGl2ZSBtYWpvciksIG5hcnJvd2VkIGJ5IHRoZSByZWZlcmVuY2UncyBvd25cbiAqICAgIHZlcnNpb24gc3BlYy4gWWFua2VkIHZlcnNpb25zIG5ldmVyIHJlc29sdmUgZm9yIGEgbGlzdGluZzsgYSBwYXVzZWRcbiAqICAgIHZlcnNpb24gaXMgc2tpcHBlZCB1bmxlc3MgdGhlIGluc3RhbGwgYWxyZWFkeSByZXNvbHZlZCB0byBpdCBvciB0aGVcbiAqICAgIHJlZmVyZW5jZSBwaW5zIGl0IGV4YWN0bHk7IGFkdmlzb3J5LWJsb2NrZWQgdmVyc2lvbnMgYXJlIHNraXBwZWQuXG4gKiAgLSBTY2FuIGZsYWdzOiBhIHZlcnNpb24gdGhlIG5pZ2h0bHkgcmVzY2FuIEZMQUdHRUQgKGdhdGVkIENyaXRpY2FscyBvdmVyXG4gKiAgICBgUExVR0lOX1ZVTE5fTUFYX0ZJTkRJTkdTYCkgcmVzb2x2ZXMgbGlrZSBhbnkgb3RoZXIsIHdpdGggYSBgVlVMTl9GTEFHR0VEYFxuICogICAgd2FybmluZyAoc2V2ZXJpdHkgYGVycm9yYCwgYGNyaXRpY2FsYCB3aXRoIGEgS0VWIGZpbmRpbmcpLiBWdWxuZXJhYmlsaXR5XG4gKiAgICBzdGF0ZSBORVZFUiBza2lwcyBvciByZWZ1c2VzIGEgdmVyc2lvbiDigJQgaXQgaXMgZ3JhZGVkLCBhbmQgdGhlIHBpcGVsaW5lJ3NcbiAqICAgIG93bmVycyBhcmUgdG9sZC4gV2hlbiB0aGUgcmVmZXJlbmNlJ3MgcGluIGtlZXBzIGl0IE9GRiBhIG5ld2VyIHVuZmxhZ2dlZFxuICogICAgdmVyc2lvbiB0aGUgaW5zdGFsbCBhbGxvd3MsIGBWVUxOX1VQR1JBREVfQVZBSUxBQkxFYCAoaW5mbykgbmFtZXMgaXQuXG4gKi9cblxuaW1wb3J0IHtcbiAgYXNTY2FuRmxhZywgdnVsbkZsYWdnZWRXYXJuaW5nLCB0eXBlIFZ1bG5GbGFnZ2VkV2FybmluZyxcbn0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgYW5kLCBlcSwgaW5BcnJheSB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQ3J1ZFR4IH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgYWR2aXNvcmllc0NvdmVyaW5nLCBibG9ja2luZ0Fkdmlzb3JpZXMgfSBmcm9tICcuL3BsdWdpbi1hZHZpc29yaWVzLmpzJztcbmltcG9ydCB7IGVmZmVjdGl2ZUNvbnN1bXB0aW9uUG9saWN5LCB0eXBlIENvbnN1bXB0aW9uUG9saWN5IH0gZnJvbSAnLi9wbHVnaW4tY29uc3VtcHRpb24tcG9saWN5LmpzJztcbmltcG9ydCB7XG4gIGNvbXBhcmVTZW12ZXIsIGlzVmVyc2lvblJhbmdlLCBwYXJzZVNlbXZlciwgc2F0aXNmaWVzVmVyc2lvblNwZWMsXG59IGZyb20gJy4vc2VtdmVyLXJhbmdlLmpzJztcbmltcG9ydCB7XG4gIE9GRklDSUFMX1BVQkxJU0hFUl9IQU5ETEUsXG4gIHNjaGVtYSxcbiAgdHlwZSBJbnN0YWxsVmVyc2lvblBvbGljeSxcbiAgdHlwZSBQbHVnaW5BZHZpc29yeSxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsLFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHR5cGUgUGx1Z2luTGlzdGluZyxcbiAgdHlwZSBQbHVnaW5MaXN0aW5nVmVyc2lvbixcbiAgdHlwZSBQdWJsaXNoZXIsXG59IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlZnVzYWxzIGFuZCB3YXJuaW5nc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFdoeSBhIHJlZmVyZW5jZSBjYW4ndCByZXNvbHZlOyBgY29kZWAgaXMgYW4gYXBpLWNvcmUgYEVycm9yQ29kZWAgbmFtZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x1dGlvblJlZnVzYWwge1xuICBjb2RlOiAnTk9UX0ZPVU5EJyB8ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcgfCAnUExVR0lOX0JMT0NLRURfQllfUE9MSUNZJyB8ICdQTFVHSU5fVU5BVkFJTEFCTEUnO1xuICByZWFzb246IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogYFZVTE5fVVBHUkFERV9BVkFJTEFCTEVgIChzZXZlcml0eSBgaW5mb2ApOiB0aGUgcmVzb2x2ZWQgdmVyc2lvbiBpcyBGTEFHR0VELFxuICogYW5kIGEgbmV3ZXIgVU5GTEFHR0VEIHZlcnNpb24gZXhpc3RzIHRoYXQgdGhlIGluc3RhbGwgYWxsb3dzIGJ1dCB0aGVcbiAqIHJlZmVyZW5jZSdzIG93biBwaW4gZXhjbHVkZXMg4oCUIHNvIHRoZSBwaXBlbGluZSBrZWVwcyBydW5uaW5nIHRoZSB2dWxuZXJhYmxlXG4gKiByZWxlYXNlIHVudGlsIHNvbWVvbmUgbW92ZXMgdGhlIHBpbi4gYHN1Z2dlc3RlZFZlcnNpb25gIGlzIHRoZSB3YXkgb3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZ1bG5VcGdyYWRlQXZhaWxhYmxlV2FybmluZyB7XG4gIGNvZGU6ICdWVUxOX1VQR1JBREVfQVZBSUxBQkxFJztcbiAgc2V2ZXJpdHk6ICdpbmZvJztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICByZXNvbHZlZDogc3RyaW5nO1xuICBzdWdnZXN0ZWRWZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKiBBIG5vbi1mYXRhbCBub3RlIGEgcmVzb2x1dGlvbiBjYXJyaWVzIChzeW50aCBwcmludHMgaXRzIGBtZXNzYWdlYCkuICovXG5leHBvcnQgdHlwZSBSZXNvbHV0aW9uV2FybmluZyA9XG4gIHwgeyBjb2RlOiAnUExVR0lOX0FEVklTT1JZJyB8ICdQTFVHSU5fREVQUkVDQVRFRCcgfCAnUExVR0lOX1NFQ1JFVFNfV0lUSEhFTEQnIHwgJ0xJU1RJTkdfVU5NQUlOVEFJTkVEJzsgbWVzc2FnZTogc3RyaW5nIH1cbiAgfCBWdWxuRmxhZ2dlZFdhcm5pbmdcbiAgfCBWdWxuVXBncmFkZUF2YWlsYWJsZVdhcm5pbmc7XG5cbi8qKiBUaGUgYFZVTE5fVVBHUkFERV9BVkFJTEFCTEVgIHdhcm5pbmcgZm9yIGByZWZgIHJlc29sdmluZyB0byBgcmVzb2x2ZWRgIHdpdGggYHN1Z2dlc3RlZGAgb3V0c2lkZSB0aGUgcGluLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZ1bG5VcGdyYWRlQXZhaWxhYmxlV2FybmluZyhyZWY6IHN0cmluZywgcmVzb2x2ZWQ6IHN0cmluZywgc3VnZ2VzdGVkOiBzdHJpbmcpOiBWdWxuVXBncmFkZUF2YWlsYWJsZVdhcm5pbmcge1xuICByZXR1cm4ge1xuICAgIGNvZGU6ICdWVUxOX1VQR1JBREVfQVZBSUxBQkxFJyxcbiAgICBzZXZlcml0eTogJ2luZm8nLFxuICAgIG1lc3NhZ2U6IGAke3JlZn1AJHtyZXNvbHZlZH0gaXMgZmxhZ2dlZCBhbmQgeW91ciBwaW4ga2VlcHMgdGhlIHBpcGVsaW5lIG9uIGl0OyAke3JlZn1AJHtzdWdnZXN0ZWR9IGlzIG5vdCBmbGFnZ2VkIGFuZCB5b3VyIGluc3RhbGwgYWxsb3dzIGl0LiBNb3ZlIHRoZSBwaW4gdG8gcGljayBpdCB1cC5gLFxuICAgIHJlc29sdmVkLFxuICAgIHN1Z2dlc3RlZFZlcnNpb246IHN1Z2dlc3RlZCxcbiAgfTtcbn1cblxuLyoqIFdoeSB0aGUgb3JnJ3MgcG9saWN5IChvciB0aGUgbGlzdGluZydzIHN0YXRlKSBrZWVwcyBhIGxpc3Rpbmcgb3V0LCBvciBudWxsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0aW5nQmxvY2sge1xuICByZWFzb246ICd0aWVyJyB8ICdibG9ja2VkX2xpc3RpbmcnIHwgJ3N1c3BlbmRlZCc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIFdoZXRoZXIgYHBvbGljeWAgKG9yIHRoZSBsaXN0aW5nJ3Mgb3duIHN0YXRlKSByZWZ1c2VzIHRoZSBsaXN0aW5nIG91dHJpZ2h0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RpbmdCbG9jayhcbiAgcG9saWN5OiBDb25zdW1wdGlvblBvbGljeSxcbiAgcHVibGlzaGVyOiBQaWNrPFB1Ymxpc2hlciwgJ2hhbmRsZScgfCAndGllcicgfCAnc3VzcGVuZGVkQXQnPixcbiAgbGlzdGluZzogUGljazxQbHVnaW5MaXN0aW5nLCAnbmFtZScgfCAnc3RhdGUnPixcbik6IExpc3RpbmdCbG9jayB8IG51bGwge1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBpZiAocHVibGlzaGVyLnN1c3BlbmRlZEF0IHx8IGxpc3Rpbmcuc3RhdGUgPT09ICdzdXNwZW5kZWQnIHx8IGxpc3Rpbmcuc3RhdGUgPT09ICd0cmFuc2ZlcnJlZCcpIHtcbiAgICByZXR1cm4geyByZWFzb246ICdzdXNwZW5kZWQnLCBtZXNzYWdlOiBgJHtyZWZ9IGlzICR7bGlzdGluZy5zdGF0ZSA9PT0gJ3RyYW5zZmVycmVkJyA/ICd0cmFuc2ZlcnJlZCcgOiAnc3VzcGVuZGVkJ30gYW5kIG5vIGxvbmdlciByZXNvbHZlcy5gIH07XG4gIH1cbiAgaWYgKHBvbGljeS5ibG9ja2VkTGlzdGluZ3Muc29tZSgoYikgPT4gYi5wdWJsaXNoZXIgPT09IHB1Ymxpc2hlci5oYW5kbGUgJiYgYi5uYW1lID09PSBsaXN0aW5nLm5hbWUpKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAnYmxvY2tlZF9saXN0aW5nJywgbWVzc2FnZTogYFlvdXIgb3JnYW5pemF0aW9uJ3MgcGx1Z2luIHBvbGljeSBibG9ja3MgJHtyZWZ9LmAgfTtcbiAgfVxuICBpZiAoIXBvbGljeS5hbGxvd2VkVGllcnMuaW5jbHVkZXMocHVibGlzaGVyLnRpZXIpKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAndGllcicsIG1lc3NhZ2U6IGBZb3VyIG9yZ2FuaXphdGlvbidzIHBsdWdpbiBwb2xpY3kgZG9lc24ndCBhbGxvdyAke3B1Ymxpc2hlci50aWVyfSBwbHVnaW5zICgke3JlZn0pLmAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIFRoZSByZWZ1c2FsIGEge0BsaW5rIExpc3RpbmdCbG9ja30gYmVjb21lcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibG9ja1JlZnVzYWwoYmxvY2s6IExpc3RpbmdCbG9jayk6IFJlc29sdXRpb25SZWZ1c2FsIHtcbiAgcmV0dXJuIGJsb2NrLnJlYXNvbiA9PT0gJ3N1c3BlbmRlZCdcbiAgICA/IHsgY29kZTogJ1BMVUdJTl9VTkFWQUlMQUJMRScsIHJlYXNvbjogJ3N1c3BlbmRlZCcsIG1lc3NhZ2U6IGJsb2NrLm1lc3NhZ2UgfVxuICAgIDogeyBjb2RlOiAnUExVR0lOX0JMT0NLRURfQllfUE9MSUNZJywgcmVhc29uOiBibG9jay5yZWFzb24sIG1lc3NhZ2U6IGJsb2NrLm1lc3NhZ2UgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEluc3RhbGxzIGFuZCB2ZXJzaW9uIGNob2ljZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEhvdyB0aGUgb3JnIHJlYWNoZXMgYSBsaXN0aW5nOiBhbiBleHBsaWNpdCBpbnN0YWxsIHJvdywgb3IgdGhlIGltcGxpY2l0IE9mZmljaWFsIG9uZS4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbGxNb2RlID1cbiAgfCB7IGtpbmQ6ICdleHBsaWNpdCc7IGluc3RhbGw6IFBsdWdpbkluc3RhbGw7IGluaGVyaXRlZDogYm9vbGVhbiB9XG4gIHwgeyBraW5kOiAnaW1wbGljaXQnIH07XG5cbnR5cGUgVmVyc2lvblJvdyA9IFBpY2s8UGx1Z2luTGlzdGluZ1ZlcnNpb24sICd2ZXJzaW9uJyB8ICd5YW5rZWRBdCcgfCAncGF1c2VkQXQnIHwgJ2JyZWFraW5nJz47XG5cbmNvbnN0IGlzU3RhYmxlID0gKHY6IHN0cmluZyk6IGJvb2xlYW4gPT4gKHBhcnNlU2VtdmVyKHYpPy5wcmVyZWxlYXNlLmxlbmd0aCA/PyAxKSA9PT0gMDtcblxuLyoqXG4gKiBUaGUgaW1wbGljaXQgT2ZmaWNpYWwgaW5zdGFsbCdzIHJhbmdlOiBldmVyeSB2ZXJzaW9uIG9mIHRoZSBMT1dFU1QgbGl2ZVxuICogbWFqb3IgKGA8bWFqb3I+LnhgKSDigJQgcGF0Y2ggYW5kIG1pbm9yIHZlcnNpb25zIGZsb3csIGEgbmV3IG1ham9yIG5ldmVyIGRvZXNcbiAqICh0aGUgb3JnIG1vdmVzIHRvIGl0IHdpdGggYW4gZXhwbGljaXQgaW5zdGFsbCkuIE51bGwgd2hlbiBub3RoaW5nIGlzIGxpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBsaWNpdEluc3RhbGxSYW5nZSh2ZXJzaW9uczogcmVhZG9ubHkgVmVyc2lvblJvd1tdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1ham9ycyA9IHZlcnNpb25zXG4gICAgLmZpbHRlcigodikgPT4gIXYueWFua2VkQXQgJiYgaXNTdGFibGUodi52ZXJzaW9uKSlcbiAgICAubWFwKCh2KSA9PiBwYXJzZVNlbXZlcih2LnZlcnNpb24pIS5tYWpvcik7XG4gIGlmIChtYWpvcnMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGAke01hdGgubWluKC4uLm1ham9ycyl9LnhgO1xufVxuXG4vKiogV2hldGhlciBhbiBpbnN0YWxsJ3MgdmVyc2lvbiBwb2xpY3kgYWRtaXRzIGB2ZXJzaW9uYCAodGhlIGJhc2VsaW5lIGlzIGBwaW5uZWRWZXJzaW9uYCkuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbEFkbWl0cyhcbiAgaW5zdGFsbDogUGljazxQbHVnaW5JbnN0YWxsLCAndmVyc2lvblBvbGljeScgfCAncGlubmVkVmVyc2lvbic+LFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHZlcnNpb25zOiByZWFkb25seSBWZXJzaW9uUm93W10sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZSA9IGluc3RhbGwucGlubmVkVmVyc2lvbjtcbiAgc3dpdGNoIChpbnN0YWxsLnZlcnNpb25Qb2xpY3kgYXMgSW5zdGFsbFZlcnNpb25Qb2xpY3kpIHtcbiAgICBjYXNlICdwaW5uZWQnOlxuICAgICAgcmV0dXJuIHZlcnNpb24gPT09IGJhc2U7XG4gICAgY2FzZSAncGF0Y2gnOlxuICAgICAgcmV0dXJuIGJhc2UgIT09IG51bGwgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModmVyc2lvbiwgYH4ke2Jhc2V9YCk7XG4gICAgY2FzZSAnbWlub3InOlxuICAgICAgcmV0dXJuIGJhc2UgIT09IG51bGwgJiYgc2F0aXNmaWVzVmVyc2lvblNwZWModmVyc2lvbiwgYF4ke2Jhc2V9YCk7XG4gICAgY2FzZSAnbGF0ZXN0Jzoge1xuICAgICAgaWYgKCFpc1N0YWJsZSh2ZXJzaW9uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGJhc2UgPT09IG51bGwpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGNvbXBhcmVTZW12ZXIodmVyc2lvbiwgYmFzZSkgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBOZXZlciBjcm9zcyBhIHZlcnNpb24gdGhlIHB1Ymxpc2hlciBtYXJrZWQgYnJlYWtpbmcuXG4gICAgICByZXR1cm4gIXZlcnNpb25zLnNvbWUoKHYpID0+IHYuYnJlYWtpbmcgJiYgY29tcGFyZVNlbXZlcih2LnZlcnNpb24sIGJhc2UpID4gMCAmJiBjb21wYXJlU2VtdmVyKHYudmVyc2lvbiwgdmVyc2lvbikgPD0gMCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIFdoZXRoZXIgYG1vZGVgIGFkbWl0cyBgdmVyc2lvbmAgKHRoZSBpbXBsaWNpdCByYW5nZSBmb3IgYW4gaW1wbGljaXQgaW5zdGFsbCkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZUFkbWl0cyhtb2RlOiBJbnN0YWxsTW9kZSwgdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uczogcmVhZG9ubHkgVmVyc2lvblJvd1tdKTogYm9vbGVhbiB7XG4gIGlmIChtb2RlLmtpbmQgPT09ICdleHBsaWNpdCcpIHJldHVybiBpbnN0YWxsQWRtaXRzKG1vZGUuaW5zdGFsbCwgdmVyc2lvbiwgdmVyc2lvbnMpO1xuICBjb25zdCByYW5nZSA9IGltcGxpY2l0SW5zdGFsbFJhbmdlKHZlcnNpb25zKTtcbiAgcmV0dXJuIHJhbmdlICE9PSBudWxsICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHZlcnNpb24sIHJhbmdlKTtcbn1cblxuLyoqIElucHV0IHRvIHtAbGluayBzZWxlY3RMaXN0aW5nVmVyc2lvbn0uICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25DaG9pY2VJbnB1dDxWIGV4dGVuZHMgUGx1Z2luTGlzdGluZ1ZlcnNpb24gPSBQbHVnaW5MaXN0aW5nVmVyc2lvbj4ge1xuICByZWY6IHN0cmluZztcbiAgdmVyc2lvbnM6IHJlYWRvbmx5IFZbXTtcbiAgbW9kZTogSW5zdGFsbE1vZGU7XG4gIC8qKiBUaGUgcmVmZXJlbmNlJ3Mgb3duIHZlcnNpb24gc3BlYyAoYGZpbHRlci52ZXJzaW9uYCkuICovXG4gIHJlcXVlc3RlZD86IHN0cmluZztcbiAgYWR2aXNvcmllczogcmVhZG9ubHkgUGx1Z2luQWR2aXNvcnlbXTtcbiAgcG9saWN5OiBDb25zdW1wdGlvblBvbGljeTtcbn1cblxuLyoqIFRoZSBuZXdlc3QgdmVyc2lvbiAoYnkgc2VtdmVyKSBvZiBgdmVyc2lvbnNgLCBvciBudWxsLiAqL1xuZnVuY3Rpb24gbmV3ZXN0T2Y8ViBleHRlbmRzIHsgdmVyc2lvbjogc3RyaW5nIH0+KHZlcnNpb25zOiByZWFkb25seSBWW10pOiBWIHwgbnVsbCB7XG4gIGNvbnN0IGJlc3QgPSBoaWdoZXN0KHZlcnNpb25zLm1hcCgodikgPT4gdi52ZXJzaW9uKSk7XG4gIHJldHVybiBiZXN0ID09PSBudWxsID8gbnVsbCA6IHZlcnNpb25zLmZpbmQoKHYpID0+IHYudmVyc2lvbiA9PT0gYmVzdCkhO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGxpc3RlZCB2ZXJzaW9uIGEgcmVmZXJlbmNlIHJlc29sdmVzIHRvIChzZWUgdGhlIG1vZHVsZSBkb2MpLCBvclxuICogdGhlIHJlZnVzYWwgdGhhdCBleHBsYWlucyB3aHkgbm9uZSBjYW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RMaXN0aW5nVmVyc2lvbjxWIGV4dGVuZHMgUGx1Z2luTGlzdGluZ1ZlcnNpb24+KGlucHV0OiBWZXJzaW9uQ2hvaWNlSW5wdXQ8Vj4pOiB7IHZlcnNpb246IFY7IHN1Z2dlc3RlZFZlcnNpb246IHN0cmluZyB8IG51bGwgfSB8IHsgcmVmdXNhbDogUmVzb2x1dGlvblJlZnVzYWwgfSB7XG4gIGNvbnN0IHsgcmVmLCB2ZXJzaW9ucywgbW9kZSwgcmVxdWVzdGVkLCBhZHZpc29yaWVzLCBwb2xpY3kgfSA9IGlucHV0O1xuICBjb25zdCBleGFjdCA9IHJlcXVlc3RlZCAhPT0gdW5kZWZpbmVkICYmICFpc1ZlcnNpb25SYW5nZShyZXF1ZXN0ZWQpID8gcmVxdWVzdGVkLnRyaW0oKSA6IG51bGw7XG4gIGNvbnN0IHJlc29sdmVkQmVmb3JlID0gbW9kZS5raW5kID09PSAnZXhwbGljaXQnID8gbW9kZS5pbnN0YWxsLnJlc29sdmVkVmVyc2lvbiA6IG51bGw7XG4gIC8vIEZvciBhIEZMQUdHRUQgYW5zd2VyOiB0aGUgbmV3ZXN0IFVORkxBR0dFRCB2ZXJzaW9uIGFib3ZlIGl0IHRoYXQgdGhlXG4gIC8vIElOU1RBTEwgYWxsb3dzIGFuZCBubyBibG9ja2luZyBhZHZpc29yeSBjb3ZlcnMg4oCUIHRoZSB2ZXJzaW9uIGEgcGlwZWxpbmVcbiAgLy8gb3duZXIgaXMgdG9sZCB0byBtb3ZlIHRvLiBOdWxsIGZvciBhbiB1bmZsYWdnZWQgYW5zd2VyLCBvciB3aGVuIG5vbmUgZXhpc3RzLlxuICBjb25zdCBzdWdnZXN0aW9uID0gKHJlc29sdmVkOiBWKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgaWYgKCFyZXNvbHZlZC5zY2FuRmxhZ2dlZEF0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBwb29sID0gdmVyc2lvbnMuZmlsdGVyKCh2KSA9PiAhdi55YW5rZWRBdCAmJiAhdi5zY2FuRmxhZ2dlZEF0XG4gICAgICAmJiBjb21wYXJlU2VtdmVyKHYudmVyc2lvbiwgcmVzb2x2ZWQudmVyc2lvbikgPiAwXG4gICAgICAmJiBtb2RlQWRtaXRzKG1vZGUsIHYudmVyc2lvbiwgdmVyc2lvbnMpXG4gICAgICAmJiAoIXYucGF1c2VkQXQgfHwgdi52ZXJzaW9uID09PSByZXNvbHZlZEJlZm9yZSlcbiAgICAgICYmIGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCB2LnZlcnNpb24sIHBvbGljeSkubGVuZ3RoID09PSAwKTtcbiAgICByZXR1cm4gbmV3ZXN0T2YocG9vbCk/LnZlcnNpb24gPz8gbnVsbDtcbiAgfTtcblxuICBpZiAoZXhhY3QgIT09IG51bGwpIHtcbiAgICBjb25zdCB2ID0gdmVyc2lvbnMuZmluZCgoeCkgPT4geC52ZXJzaW9uID09PSBleGFjdCk7XG4gICAgaWYgKCF2KSByZXR1cm4geyByZWZ1c2FsOiB7IGNvZGU6ICdOT1RfRk9VTkQnLCByZWFzb246ICd2ZXJzaW9uX25vdF9mb3VuZCcsIG1lc3NhZ2U6IGAke3JlZn0gaGFzIG5vIHB1Ymxpc2hlZCB2ZXJzaW9uICR7ZXhhY3R9LmAgfSB9O1xuICAgIGlmICh2LnlhbmtlZEF0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWZ1c2FsOiB7XG4gICAgICAgICAgY29kZTogJ1BMVUdJTl9VTkFWQUlMQUJMRScsXG4gICAgICAgICAgcmVhc29uOiAneWFua2VkJyxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtyZWZ9QCR7ZXhhY3R9IGlzIHlhbmtlZCR7di55YW5rUmVhc29uID8gYDogJHt2LnlhbmtSZWFzb259YCA6ICcnfS4gTW92ZSB0byBhIHN1cHBvcnRlZCB2ZXJzaW9uLmAsXG4gICAgICAgICAgZGV0YWlsczogeyB2ZXJzaW9uOiBleGFjdCB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyAmJiAhaW5zdGFsbEFkbWl0cyhtb2RlLmluc3RhbGwsIGV4YWN0LCB2ZXJzaW9ucykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZnVzYWw6IHtcbiAgICAgICAgICBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLFxuICAgICAgICAgIHJlYXNvbjogJ3ZlcnNpb25fb3V0c2lkZV9pbnN0YWxsJyxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtyZWZ9QCR7ZXhhY3R9IGlzIG91dHNpZGUgeW91ciBpbnN0YWxsICgke21vZGUuaW5zdGFsbC52ZXJzaW9uUG9saWN5fSBmcm9tICR7bW9kZS5pbnN0YWxsLnBpbm5lZFZlcnNpb259KS4gVXBncmFkZSB0aGUgaW5zdGFsbCBmaXJzdC5gLFxuICAgICAgICAgIGRldGFpbHM6IHsgdmVyc2lvbjogZXhhY3QsIHZlcnNpb25Qb2xpY3k6IG1vZGUuaW5zdGFsbC52ZXJzaW9uUG9saWN5LCBwaW5uZWRWZXJzaW9uOiBtb2RlLmluc3RhbGwucGlubmVkVmVyc2lvbiB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgYmxvY2tpbmcgPSBibG9ja2luZ0Fkdmlzb3JpZXMoYWR2aXNvcmllcywgZXhhY3QsIHBvbGljeSk7XG4gICAgaWYgKGJsb2NraW5nLmxlbmd0aCkgcmV0dXJuIHsgcmVmdXNhbDogYWR2aXNvcnlSZWZ1c2FsKHJlZiwgZXhhY3QsIGJsb2NraW5nKSB9O1xuICAgIHJldHVybiB7IHZlcnNpb246IHYsIHN1Z2dlc3RlZFZlcnNpb246IHN1Z2dlc3Rpb24odikgfTtcbiAgfVxuXG4gIC8vIFRoZSByYW5nZSB0aGUgSU5TVEFMTCBhbGxvd3MuIEZvciB0aGUgaW1wbGljaXQgaW5zdGFsbCBhbiBleHBsaWNpdCBzcGVjIG9uXG4gIC8vIHRoZSByZWZlcmVuY2UgcmVwbGFjZXMgdGhlIGltcGxpY2l0IHJhbmdlIChpdCBpcyBhIGRlbGliZXJhdGUgY2hvaWNlKS5cbiAgY29uc3QgYWRtaXR0ZWQgPSB2ZXJzaW9ucy5maWx0ZXIoKHYpID0+ICF2LnlhbmtlZEF0XG4gICAgJiYgKG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyA/IGluc3RhbGxBZG1pdHMobW9kZS5pbnN0YWxsLCB2LnZlcnNpb24sIHZlcnNpb25zKVxuICAgICAgOiByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCB8fCBtb2RlQWRtaXRzKG1vZGUsIHYudmVyc2lvbiwgdmVyc2lvbnMpKVxuICAgICYmIChyZXF1ZXN0ZWQgPT09IHVuZGVmaW5lZCB8fCBzYXRpc2ZpZXNWZXJzaW9uU3BlYyh2LnZlcnNpb24sIHJlcXVlc3RlZCkpXG4gICAgJiYgKCF2LnBhdXNlZEF0IHx8IHYudmVyc2lvbiA9PT0gcmVzb2x2ZWRCZWZvcmUpKTtcbiAgLy8gQSBibG9ja2luZyBBRFZJU09SWSAodGhlIG9yZydzIGluc3RhbGwgcG9saWN5KSBza2lwcyBhIHZlcnNpb247IGEgc2NhblxuICAvLyBmbGFnIG5ldmVyIGRvZXMuXG4gIGNvbnN0IGFsbG93ZWQgPSBhZG1pdHRlZC5maWx0ZXIoKHYpID0+IGJsb2NraW5nQWR2aXNvcmllcyhhZHZpc29yaWVzLCB2LnZlcnNpb24sIHBvbGljeSkubGVuZ3RoID09PSAwKTtcbiAgLy8gUmFuZ2VzIG9ubHkgYWRtaXQgcHJlcmVsZWFzZXMgdGhleSBuYW1lIChucG0gc2VtYW50aWNzKSwgc28gdGhlIGhpZ2hlc3RcbiAgLy8gYWRtaXR0ZWQgdmVyc2lvbiBpcyB0aGUgYW5zd2VyLlxuICBjb25zdCBiZXN0ID0gbmV3ZXN0T2YoYWxsb3dlZCk7XG4gIGlmIChiZXN0KSByZXR1cm4geyB2ZXJzaW9uOiBiZXN0LCBzdWdnZXN0ZWRWZXJzaW9uOiBzdWdnZXN0aW9uKGJlc3QpIH07XG5cbiAgaWYgKGFkbWl0dGVkLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBuZXdlc3QgPSBuZXdlc3RPZihhZG1pdHRlZCkhO1xuICAgIHJldHVybiB7IHJlZnVzYWw6IGFkdmlzb3J5UmVmdXNhbChyZWYsIG5ld2VzdC52ZXJzaW9uLCBibG9ja2luZ0Fkdmlzb3JpZXMoYWR2aXNvcmllcywgbmV3ZXN0LnZlcnNpb24sIHBvbGljeSkpIH07XG4gIH1cbiAgaWYgKG1vZGUua2luZCA9PT0gJ2V4cGxpY2l0JyAmJiByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZFxuICAgICYmIHZlcnNpb25zLnNvbWUoKHYpID0+ICF2LnlhbmtlZEF0ICYmIHNhdGlzZmllc1ZlcnNpb25TcGVjKHYudmVyc2lvbiwgcmVxdWVzdGVkKSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmdXNhbDoge1xuICAgICAgICBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLFxuICAgICAgICByZWFzb246ICd2ZXJzaW9uX291dHNpZGVfaW5zdGFsbCcsXG4gICAgICAgIG1lc3NhZ2U6IGBObyB2ZXJzaW9uIG9mICR7cmVmfSBtYXRjaGluZyAke3JlcXVlc3RlZH0gaXMgaW5zaWRlIHlvdXIgaW5zdGFsbCAoJHttb2RlLmluc3RhbGwudmVyc2lvblBvbGljeX0gZnJvbSAke21vZGUuaW5zdGFsbC5waW5uZWRWZXJzaW9ufSkuIFVwZ3JhZGUgdGhlIGluc3RhbGwgZmlyc3QuYCxcbiAgICAgICAgZGV0YWlsczogeyByZXF1ZXN0ZWQsIHZlcnNpb25Qb2xpY3k6IG1vZGUuaW5zdGFsbC52ZXJzaW9uUG9saWN5LCBwaW5uZWRWZXJzaW9uOiBtb2RlLmluc3RhbGwucGlubmVkVmVyc2lvbiB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVmdXNhbDoge1xuICAgICAgY29kZTogJ05PVF9GT1VORCcsXG4gICAgICByZWFzb246ICdub19tYXRjaGluZ192ZXJzaW9uJyxcbiAgICAgIG1lc3NhZ2U6IGBObyByZXNvbHZhYmxlIHZlcnNpb24gb2YgJHtyZWZ9JHtyZXF1ZXN0ZWQgPyBgIG1hdGNoZXMgJHtyZXF1ZXN0ZWR9YCA6ICcnfS5gLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKiBUaGUgaGlnaGVzdCBvZiBgdmVyc2lvbnNgIGJ5IHNlbXZlciAocHJlcmVsZWFzZXMgaW5jbHVkZWQpLiAqL1xuZnVuY3Rpb24gaGlnaGVzdCh2ZXJzaW9uczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHZlcnNpb25zLnJlZHVjZTxzdHJpbmcgfCBudWxsPigoYmVzdCwgdikgPT4gKGJlc3QgPT09IG51bGwgfHwgY29tcGFyZVNlbXZlcih2LCBiZXN0KSA+IDAgPyB2IDogYmVzdCksIG51bGwpO1xufVxuXG5mdW5jdGlvbiBhZHZpc29yeVJlZnVzYWwocmVmOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgYmxvY2tpbmc6IFJlYWRvbmx5QXJyYXk8UGljazxQbHVnaW5BZHZpc29yeSwgJ2lkJyB8ICdzZXZlcml0eScgfCAnZml4ZWRWZXJzaW9uJyB8ICdzdW1tYXJ5Jz4+KTogUmVzb2x1dGlvblJlZnVzYWwge1xuICBjb25zdCBmaXhlZCA9IGJsb2NraW5nLm1hcCgoYSkgPT4gYS5maXhlZFZlcnNpb24pLmZpbHRlcigodik6IHYgaXMgc3RyaW5nID0+ICEhdik7XG4gIHJldHVybiB7XG4gICAgY29kZTogJ1BMVUdJTl9CTE9DS0VEX0JZX1BPTElDWScsXG4gICAgcmVhc29uOiAnYWR2aXNvcnknLFxuICAgIG1lc3NhZ2U6IGAke3JlZn1AJHt2ZXJzaW9ufSBpcyBibG9ja2VkIGJ5IHlvdXIgb3JnYW5pemF0aW9uJ3MgYWR2aXNvcnkgcG9saWN5OiAke2Jsb2NraW5nLm1hcCgoYSkgPT4gYCR7YS5zZXZlcml0eX0g4oCUICR7YS5zdW1tYXJ5fWApLmpvaW4oJzsgJyl9LmBcbiAgICAgICsgKGZpeGVkLmxlbmd0aCA/IGAgRml4ZWQgaW4gJHtmaXhlZC5qb2luKCcsICcpfS5gIDogJycpLFxuICAgIGRldGFpbHM6IHsgdmVyc2lvbiwgYWR2aXNvcmllczogYmxvY2tpbmcubWFwKChhKSA9PiBhLmlkKSwgLi4uKGZpeGVkLmxlbmd0aCA/IHsgZml4ZWRWZXJzaW9uczogZml4ZWQgfSA6IHt9KSB9LFxuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIG9yZydzIGluc3RhbGwgc3RhdGUgZm9yIG9uZSBsaXN0aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIG9yZyAoYW5kLCBmb3IgYSB0ZWFtLCBpdHMgcm9vdCBvcmcpIGEgcmVzb2x1dGlvbiBydW5zIGZvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x1dGlvblNjb3BlIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgLyoqIFRoZSByb290IG9yZyB3aGVuIHRoZSBjYWxsZXIgaXMgYSB0ZWFtLiAqL1xuICByb290T3JnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgb3JnIGlkcyB3aG9zZSBpbnN0YWxscyBhbmQgcG9saWNpZXMgYXBwbHksIG93biBmaXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY29wZU9yZ0lkcyhzY29wZTogUmVzb2x1dGlvblNjb3BlKTogc3RyaW5nW10ge1xuICBjb25zdCBvd24gPSBzY29wZS5vcmdJZC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCByb290ID0gc2NvcGUucm9vdE9yZ0lkPy50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gcm9vdCAmJiByb290ICE9PSBvd24gPyBbb3duLCByb290XSA6IFtvd25dO1xufVxuXG4vKipcbiAqIEhvdyB0aGUgb3JnIHJlYWNoZXMgYGxpc3RpbmdgIOKAlCBvciB0aGUgcmVmdXNhbC4gQW4gQUNUSVZFIG93bi1vcmcgcm93IHdpbnMsXG4gKiB0aGVuIHRoZSByb290IG9yZydzIChhIHRlYW0gaW5oZXJpdHMgaXQpOyBmYWlsaW5nIGJvdGgsIHRoZSBpbXBsaWNpdFxuICogT2ZmaWNpYWwgaW5zdGFsbCAodW5sZXNzIHRoZSBwb2xpY3kgaXMgYGV4cGxpY2l0YCk7IG90aGVyd2lzZSB0aGUgb3JnJ3Mgb3duXG4gKiBwZW5kaW5nIC8gZGVuaWVkIHJvdyBleHBsYWlucyB0aGUgcmVmdXNhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxNb2RlRm9yKFxuICBwdWJsaXNoZXI6IFBpY2s8UHVibGlzaGVyLCAnaGFuZGxlJz4sXG4gIGxpc3Rpbmc6IFBpY2s8UGx1Z2luTGlzdGluZywgJ2lkJyB8ICduYW1lJz4sXG4gIGluc3RhbGxzOiByZWFkb25seSBQbHVnaW5JbnN0YWxsW10sXG4gIHBvbGljeTogQ29uc3VtcHRpb25Qb2xpY3ksXG4gIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUsXG4pOiBJbnN0YWxsTW9kZSB8IFJlc29sdXRpb25SZWZ1c2FsIHtcbiAgY29uc3QgW293biwgcm9vdF0gPSBzY29wZU9yZ0lkcyhzY29wZSk7XG4gIGNvbnN0IGZvckxpc3RpbmcgPSBpbnN0YWxscy5maWx0ZXIoKGkpID0+IGkubGlzdGluZ0lkID09PSBsaXN0aW5nLmlkKTtcbiAgY29uc3Qgb3duUm93ID0gZm9yTGlzdGluZy5maW5kKChpKSA9PiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IG93bik7XG4gIGNvbnN0IHJvb3RSb3cgPSByb290ID8gZm9yTGlzdGluZy5maW5kKChpKSA9PiBpLm9yZ0lkLnRvTG93ZXJDYXNlKCkgPT09IHJvb3QpIDogdW5kZWZpbmVkO1xuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdhY3RpdmUnKSByZXR1cm4geyBraW5kOiAnZXhwbGljaXQnLCBpbnN0YWxsOiBvd25Sb3csIGluaGVyaXRlZDogZmFsc2UgfTtcbiAgaWYgKHJvb3RSb3c/LnN0YXR1cyA9PT0gJ2FjdGl2ZScpIHJldHVybiB7IGtpbmQ6ICdleHBsaWNpdCcsIGluc3RhbGw6IHJvb3RSb3csIGluaGVyaXRlZDogdHJ1ZSB9O1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBpZiAocHVibGlzaGVyLmhhbmRsZSA9PT0gT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSkge1xuICAgIGlmIChwb2xpY3kub2ZmaWNpYWxJbnN0YWxscyA9PT0gJ2ltcGxpY2l0JykgcmV0dXJuIHsga2luZDogJ2ltcGxpY2l0JyB9O1xuICAgIGlmICghb3duUm93KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLFxuICAgICAgICByZWFzb246ICdvZmZpY2lhbF9leHBsaWNpdCcsXG4gICAgICAgIG1lc3NhZ2U6IGBZb3VyIG9yZ2FuaXphdGlvbiBpbnN0YWxscyBPZmZpY2lhbCBwbHVnaW5zIGV4cGxpY2l0bHk7IGluc3RhbGwgJHtyZWZ9IGZpcnN0LmAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdwZW5kaW5nX2FwcHJvdmFsJykge1xuICAgIHJldHVybiB7IGNvZGU6ICdQTFVHSU5fTk9UX0lOU1RBTExFRCcsIHJlYXNvbjogJ3BlbmRpbmdfYXBwcm92YWwnLCBtZXNzYWdlOiBgVGhlIGluc3RhbGwgb2YgJHtyZWZ9IGlzIHdhaXRpbmcgZm9yIGFwcHJvdmFsLmAgfTtcbiAgfVxuICBpZiAob3duUm93Py5zdGF0dXMgPT09ICdkZW5pZWQnKSB7XG4gICAgcmV0dXJuIHsgY29kZTogJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJywgcmVhc29uOiAnZGVuaWVkJywgbWVzc2FnZTogYFRoZSBpbnN0YWxsIG9mICR7cmVmfSB3YXMgZGVuaWVkLmAgfTtcbiAgfVxuICByZXR1cm4geyBjb2RlOiAnUExVR0lOX05PVF9JTlNUQUxMRUQnLCByZWFzb246ICdub3RfaW5zdGFsbGVkJywgbWVzc2FnZTogYCR7cmVmfSBpcyBub3QgaW5zdGFsbGVkIGluIHlvdXIgb3JnYW5pemF0aW9uLmAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERhdGEgc291cmNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIHJvd3MgdGhlIHJlc29sdmVyIHJlYWRzLiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBydW4gd2l0aCBhIHNjb3BlIHRoYXQgY2FuXG4gKiAgcmVhZCB0aGUgZWNvc3lzdGVtIHRhYmxlcyBhbmQgdGhlIG9yZydzIChhbmQgcm9vdCBvcmcncykgaW5zdGFsbCByb3dzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0aW5nRGF0YVNvdXJjZSB7XG4gIHB1Ymxpc2hlckJ5SGFuZGxlKGhhbmRsZTogc3RyaW5nKTogUHJvbWlzZTxQdWJsaXNoZXIgfCBudWxsPjtcbiAgcHVibGlzaGVyc0J5SWRzKGlkczogc3RyaW5nW10pOiBQcm9taXNlPFB1Ymxpc2hlcltdPjtcbiAgbGlzdGluZ0J5TmFtZShwdWJsaXNoZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBsdWdpbkxpc3RpbmcgfCBudWxsPjtcbiAgLyoqIExpc3RlZCAvIHVubWFpbnRhaW5lZCBsaXN0aW5ncyAob3B0aW9uYWxseSBvbmx5IHRoZXNlIGlkcyBvciBuYW1lcykuICovXG4gIGxpdmVMaXN0aW5ncyhmaWx0ZXI/OiB7IGlkcz86IHN0cmluZ1tdOyBuYW1lcz86IHN0cmluZ1tdIH0pOiBQcm9taXNlPFBsdWdpbkxpc3RpbmdbXT47XG4gIHZlcnNpb25zRm9yTGlzdGluZ3MobGlzdGluZ0lkczogc3RyaW5nW10pOiBQcm9taXNlPFBsdWdpbkxpc3RpbmdWZXJzaW9uW10+O1xuICAvKiogUFVCTElTSEVEIGFkdmlzb3JpZXMuICovXG4gIGFkdmlzb3JpZXNGb3JMaXN0aW5ncyhsaXN0aW5nSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luQWR2aXNvcnlbXT47XG4gIGluc3RhbGxzRm9yT3JncyhvcmdJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxQbHVnaW5JbnN0YWxsW10+O1xuICBwb2xpY2llc0Zvck9yZ3Mob3JnSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luSW5zdGFsbFBvbGljeVtdPjtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBMaXN0aW5nRGF0YVNvdXJjZX0gb3ZlciBhIGRyaXp6bGUgdHJhbnNhY3Rpb24uIFRoZSBjYWxsZXIgb3ducyB0aGVcbiAqIHRyYW5zYWN0aW9uJ3Mgc2NvcGU6IGl0IG11c3QgYmUgYWJsZSB0byByZWFkIHRoZSBlY29zeXN0ZW0gdGFibGVzIChhcHAtcm9sZVxuICogUkxTKSBhbmQgdGhlIGluc3RhbGwgcm93cyBvZiB0aGUgb3JnIEFORCBpdHMgcm9vdCBvcmcgKGEgdGVhbSdzIHJlYWRzIG9mIGl0c1xuICogcm9vdCdzIHJvd3MgbmVlZCBhbiBlbGV2YXRlZCBzY29wZSwgbGlrZSBwYXJlbnQtb3JnIHBsdWdpbiByZWFkcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcml6emxlTGlzdGluZ1NvdXJjZSh0eDogQ3J1ZFR4KTogTGlzdGluZ0RhdGFTb3VyY2Uge1xuICBjb25zdCBkYiA9IHR4O1xuICBjb25zdCBQID0gc2NoZW1hLnB1Ymxpc2hlcjtcbiAgY29uc3QgTCA9IHNjaGVtYS5wbHVnaW5MaXN0aW5nO1xuICBjb25zdCBWID0gc2NoZW1hLnBsdWdpbkxpc3RpbmdWZXJzaW9uO1xuICBjb25zdCBBID0gc2NoZW1hLnBsdWdpbkFkdmlzb3J5O1xuICBjb25zdCBJID0gc2NoZW1hLnBsdWdpbkluc3RhbGw7XG4gIGNvbnN0IElQID0gc2NoZW1hLnBsdWdpbkluc3RhbGxQb2xpY3k7XG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyQnlIYW5kbGU6IGFzeW5jIChoYW5kbGUpID0+ICgoYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShQKS53aGVyZShlcShQLmhhbmRsZSwgaGFuZGxlKSkpIGFzIFB1Ymxpc2hlcltdKVswXSA/PyBudWxsLFxuICAgIHB1Ymxpc2hlcnNCeUlkczogYXN5bmMgKGlkcykgPT4gKGlkcy5sZW5ndGggPyBkYi5zZWxlY3QoKS5mcm9tKFApLndoZXJlKGluQXJyYXkoUC5pZCwgaWRzKSkgOiBbXSksXG4gICAgbGlzdGluZ0J5TmFtZTogYXN5bmMgKHB1Ymxpc2hlcklkLCBuYW1lKSA9PlxuICAgICAgKChhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKEwpLndoZXJlKGFuZChlcShMLnB1Ymxpc2hlcklkLCBwdWJsaXNoZXJJZCksIGVxKEwubmFtZSwgbmFtZSkpKSkgYXMgUGx1Z2luTGlzdGluZ1tdKVswXSA/PyBudWxsLFxuICAgIGxpdmVMaXN0aW5nczogYXN5bmMgKGZpbHRlciA9IHt9KSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmlkcyAmJiBmaWx0ZXIuaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKGZpbHRlci5uYW1lcyAmJiBmaWx0ZXIubmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gZGIuc2VsZWN0KCkuZnJvbShMKS53aGVyZShhbmQoXG4gICAgICAgIGluQXJyYXkoTC5zdGF0ZSwgWydsaXN0ZWQnLCAndW5tYWludGFpbmVkJ10pLFxuICAgICAgICAuLi4oZmlsdGVyLmlkcyA/IFtpbkFycmF5KEwuaWQsIGZpbHRlci5pZHMpXSA6IFtdKSxcbiAgICAgICAgLi4uKGZpbHRlci5uYW1lcyA/IFtpbkFycmF5KEwubmFtZSwgZmlsdGVyLm5hbWVzKV0gOiBbXSksXG4gICAgICApKTtcbiAgICB9LFxuICAgIHZlcnNpb25zRm9yTGlzdGluZ3M6IGFzeW5jIChpZHMpID0+IChpZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShWKS53aGVyZShpbkFycmF5KFYubGlzdGluZ0lkLCBpZHMpKSA6IFtdKSxcbiAgICBhZHZpc29yaWVzRm9yTGlzdGluZ3M6IGFzeW5jIChpZHMpID0+IChpZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShBKS53aGVyZShhbmQoaW5BcnJheShBLmxpc3RpbmdJZCwgaWRzKSwgZXEoQS5zdGF0ZSwgJ3B1Ymxpc2hlZCcpKSkgOiBbXSksXG4gICAgaW5zdGFsbHNGb3JPcmdzOiBhc3luYyAob3JnSWRzKSA9PiAob3JnSWRzLmxlbmd0aCA/IGRiLnNlbGVjdCgpLmZyb20oSSkud2hlcmUoaW5BcnJheShJLm9yZ0lkLCBvcmdJZHMpKSA6IFtdKSxcbiAgICBwb2xpY2llc0Zvck9yZ3M6IGFzeW5jIChvcmdJZHMpID0+IChvcmdJZHMubGVuZ3RoID8gZGIuc2VsZWN0KCkuZnJvbShJUCkud2hlcmUoaW5BcnJheShJUC5vcmdJZCwgb3JnSWRzKSkgOiBbXSksXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXNvbHV0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQSBwbHVnaW4gcmVmZXJlbmNlIGFzIHRoZSByZXNvbHZlciByZWFkcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1JlZmVyZW5jZSB7XG4gIC8qKiBQdWJsaXNoZXIgaGFuZGxlOyBhYnNlbnQgPSB0aGUgT2ZmaWNpYWwgbGlzdGluZyAodGhlIHVucXVhbGlmaWVkIGZhbGxiYWNrKS4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVmZXJlbmNlJ3MgYGZpbHRlci52ZXJzaW9uYC4gKi9cbiAgdmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqIEEgcmVmZXJlbmNlIHRoYXQgcmVzb2x2ZWQgdG8gYSBsaXN0ZWQgdmVyc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1Jlc29sdmVkIHtcbiAgb2s6IHRydWU7XG4gIC8qKiBGb3IgYSBGTEFHR0VEIHZlcnNpb246IHRoZSBuZXdlc3QgdW5mbGFnZ2VkIG9uZSBhYm92ZSBpdCB0aGUgaW5zdGFsbCBhbGxvd3MgKG51bGwgb3RoZXJ3aXNlKS4gKi9cbiAgc3VnZ2VzdGVkVmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGlzaGVyOiBQdWJsaXNoZXI7XG4gIGxpc3Rpbmc6IFBsdWdpbkxpc3Rpbmc7XG4gIHZlcnNpb246IFBsdWdpbkxpc3RpbmdWZXJzaW9uO1xuICBtb2RlOiBJbnN0YWxsTW9kZTtcbiAgcG9saWN5OiBDb25zdW1wdGlvblBvbGljeTtcbiAgLyoqIFRoZSBzcGVjIGRlY2xhcmVzIHNlY3JldHMgdGhlIHBvbGljeSB3aXRoaG9sZHMgZnJvbSB0aGlzIHRpZXIuICovXG4gIHNlY3JldHNXaXRoaGVsZDogYm9vbGVhbjtcbiAgd2FybmluZ3M6IFJlc29sdXRpb25XYXJuaW5nW107XG59XG5cbi8qKiBBIHJlZmVyZW5jZSB0aGF0IG5hbWVkIGEgbGlzdGluZyBidXQgY2FuJ3QgcmVzb2x2ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGluZ1JlZnVzZWQge1xuICBvazogZmFsc2U7XG4gIHJlZnVzYWw6IFJlc29sdXRpb25SZWZ1c2FsO1xuICBwdWJsaXNoZXI/OiBQdWJsaXNoZXI7XG4gIGxpc3Rpbmc/OiBQbHVnaW5MaXN0aW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYHJlZmAgdG8gYSBsaXN0ZWQgdmVyc2lvbiBmb3IgYHNjb3BlYCwgb3IgcmVmdXNlLiBOdWxsIHdoZW4gdGhlXG4gKiBsaXN0aW5nIGRvZXNuJ3QgZXhpc3QgYXQgYWxsIChhbiB1bnF1YWxpZmllZCByZWZlcmVuY2UgdGhlbiBzaW1wbHkgaGFzIG5vXG4gKiBPZmZpY2lhbCBmYWxsYmFjaykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlTGlzdGluZ1JlZmVyZW5jZShcbiAgc291cmNlOiBMaXN0aW5nRGF0YVNvdXJjZSxcbiAgcmVmOiBMaXN0aW5nUmVmZXJlbmNlLFxuICBzY29wZTogUmVzb2x1dGlvblNjb3BlLFxuKTogUHJvbWlzZTxMaXN0aW5nUmVzb2x2ZWQgfCBMaXN0aW5nUmVmdXNlZCB8IG51bGw+IHtcbiAgY29uc3QgaGFuZGxlID0gcmVmLnB1Ymxpc2hlciA/PyBPRkZJQ0lBTF9QVUJMSVNIRVJfSEFORExFO1xuICBjb25zdCBwdWJsaXNoZXIgPSBhd2FpdCBzb3VyY2UucHVibGlzaGVyQnlIYW5kbGUoaGFuZGxlKTtcbiAgaWYgKCFwdWJsaXNoZXIpIHJldHVybiBudWxsO1xuICBjb25zdCBsaXN0aW5nID0gYXdhaXQgc291cmNlLmxpc3RpbmdCeU5hbWUocHVibGlzaGVyLmlkLCByZWYubmFtZSk7XG4gIGlmICghbGlzdGluZykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3Qgb3JnSWRzID0gc2NvcGVPcmdJZHMoc2NvcGUpO1xuICBjb25zdCBbcG9saWNpZXMsIGluc3RhbGxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzb3VyY2UucG9saWNpZXNGb3JPcmdzKG9yZ0lkcyksIHNvdXJjZS5pbnN0YWxsc0Zvck9yZ3Mob3JnSWRzKV0pO1xuICBjb25zdCBwb2xpY3kgPSBlZmZlY3RpdmVDb25zdW1wdGlvblBvbGljeShwb2xpY2llcywgb3JnSWRzWzBdISwgb3JnSWRzWzFdKTtcbiAgY29uc3QgYmxvY2sgPSBsaXN0aW5nQmxvY2socG9saWN5LCBwdWJsaXNoZXIsIGxpc3RpbmcpO1xuICBpZiAoYmxvY2spIHJldHVybiB7IG9rOiBmYWxzZSwgcmVmdXNhbDogYmxvY2tSZWZ1c2FsKGJsb2NrKSwgcHVibGlzaGVyLCBsaXN0aW5nIH07XG5cbiAgY29uc3QgbW9kZSA9IGluc3RhbGxNb2RlRm9yKHB1Ymxpc2hlciwgbGlzdGluZywgaW5zdGFsbHMsIHBvbGljeSwgc2NvcGUpO1xuICBpZiAoJ2NvZGUnIGluIG1vZGUpIHJldHVybiB7IG9rOiBmYWxzZSwgcmVmdXNhbDogbW9kZSwgcHVibGlzaGVyLCBsaXN0aW5nIH07XG5cbiAgY29uc3QgW3ZlcnNpb25zLCBhZHZpc29yaWVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzb3VyY2UudmVyc2lvbnNGb3JMaXN0aW5ncyhbbGlzdGluZy5pZF0pLFxuICAgIHNvdXJjZS5hZHZpc29yaWVzRm9yTGlzdGluZ3MoW2xpc3RpbmcuaWRdKSxcbiAgXSk7XG4gIGNvbnN0IHJlZl8gPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBjb25zdCBjaG9pY2UgPSBzZWxlY3RMaXN0aW5nVmVyc2lvbih7IHJlZjogcmVmXywgdmVyc2lvbnMsIG1vZGUsIHJlcXVlc3RlZDogcmVmLnZlcnNpb24sIGFkdmlzb3JpZXMsIHBvbGljeSB9KTtcbiAgaWYgKCdyZWZ1c2FsJyBpbiBjaG9pY2UpIHJldHVybiB7IG9rOiBmYWxzZSwgcmVmdXNhbDogY2hvaWNlLnJlZnVzYWwsIHB1Ymxpc2hlciwgbGlzdGluZyB9O1xuXG4gIGNvbnN0IHZlcnNpb24gPSBjaG9pY2UudmVyc2lvbjtcbiAgY29uc3QgeyB3YXJuaW5ncywgc2VjcmV0c1dpdGhoZWxkIH0gPSBsaXN0ZWRWZXJzaW9uV2FybmluZ3MoeyBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIGFkdmlzb3JpZXMsIHBvbGljeSB9KTtcbiAgLy8gVGhlIHBpbiBrZWVwcyB0aGUgcGlwZWxpbmUgb24gYSBmbGFnZ2VkIHZlcnNpb24gd2hpbGUgYSBjbGVhbiBvbmUgaXMgYWxsb3dlZC5cbiAgaWYgKGNob2ljZS5zdWdnZXN0ZWRWZXJzaW9uICYmIHJlZi52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHZ1bG5VcGdyYWRlQXZhaWxhYmxlV2FybmluZyhyZWZfLCB2ZXJzaW9uLnZlcnNpb24sIGNob2ljZS5zdWdnZXN0ZWRWZXJzaW9uKSk7XG4gIH1cbiAgcmV0dXJuIHsgb2s6IHRydWUsIHB1Ymxpc2hlciwgbGlzdGluZywgdmVyc2lvbiwgbW9kZSwgcG9saWN5LCBzZWNyZXRzV2l0aGhlbGQsIHdhcm5pbmdzLCBzdWdnZXN0ZWRWZXJzaW9uOiBjaG9pY2Uuc3VnZ2VzdGVkVmVyc2lvbiB9O1xufVxuXG4vKipcbiAqIFRoZSBub24tZmF0YWwgbm90ZXMgYSByZXNvbHZlZCBsaXN0ZWQgdmVyc2lvbiBjYXJyaWVzIChsb29rdXAgYW5zd2VycyxcbiAqIHN5bnRoIHByaW50cyB0aGVtLCB0aGUgaW5zdGFsbHMgdmlldyBzaG93cyB0aGVtKTogYW4gdW5tYWludGFpbmVkIGxpc3RpbmcsIGFcbiAqIGRlcHJlY2F0ZWQgdmVyc2lvbiwgYSBQVUJMSVNIRUQgYWR2aXNvcnkgY292ZXJpbmcgdGhlIHZlcnNpb24gdGhhdCB0aGUgb3JnJ3NcbiAqIGBibG9ja09uQWR2aXNvcnlgIGRvZXNuJ3QgYmxvY2sgKGEgYmxvY2tpbmcgb25lIHJlZnVzZXMgcmVzb2x1dGlvbiBpbnN0ZWFkKSxcbiAqIGFuZCB3aXRoaGVsZCBzZWNyZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVkVmVyc2lvbldhcm5pbmdzKGlucHV0OiB7XG4gIHB1Ymxpc2hlcjogUGljazxQdWJsaXNoZXIsICdoYW5kbGUnIHwgJ3RpZXInPjtcbiAgbGlzdGluZzogUGljazxQbHVnaW5MaXN0aW5nLCAnbmFtZScgfCAnc3RhdGUnPjtcbiAgdmVyc2lvbjogUGljazxQbHVnaW5MaXN0aW5nVmVyc2lvbiwgJ3ZlcnNpb24nIHwgJ2RlcHJlY2F0ZWRBdCcgfCAnZGVwcmVjYXRpb25NZXNzYWdlJyB8ICdzcGVjU25hcHNob3QnPlxuICAgICYgUGFydGlhbDxQaWNrPFBsdWdpbkxpc3RpbmdWZXJzaW9uLCAnc2NhbkZsYWdnZWRBdCcgfCAnc2NhbkZsYWcnPj47XG4gIGFkdmlzb3JpZXM6IHJlYWRvbmx5IFBpY2s8UGx1Z2luQWR2aXNvcnksICdzZXZlcml0eScgfCAnc3RhdGUnIHwgJ2FmZmVjdGVkUmFuZ2UnIHwgJ2ZpeGVkVmVyc2lvbicgfCAnc3VtbWFyeSc+W107XG4gIHBvbGljeTogUGljazxDb25zdW1wdGlvblBvbGljeSwgJ3NlY3JldHNBbGxvd2VkVGllcnMnPjtcbn0pOiB7IHdhcm5pbmdzOiBSZXNvbHV0aW9uV2FybmluZ1tdOyBzZWNyZXRzV2l0aGhlbGQ6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBsaXN0aW5nLCB2ZXJzaW9uLCBhZHZpc29yaWVzLCBwb2xpY3kgfSA9IGlucHV0O1xuICBjb25zdCByZWYgPSBgJHtwdWJsaXNoZXIuaGFuZGxlfS8ke2xpc3RpbmcubmFtZX1gO1xuICBjb25zdCBkZWNsYXJlc1NlY3JldHMgPSAodmVyc2lvbi5zcGVjU25hcHNob3Q/LnNlY3JldHMgPz8gW10pLmxlbmd0aCA+IDA7XG4gIGNvbnN0IHNlY3JldHNXaXRoaGVsZCA9IGRlY2xhcmVzU2VjcmV0cyAmJiAhcG9saWN5LnNlY3JldHNBbGxvd2VkVGllcnMuaW5jbHVkZXMocHVibGlzaGVyLnRpZXIpO1xuICBjb25zdCB3YXJuaW5nczogUmVzb2x1dGlvbldhcm5pbmdbXSA9IFtdO1xuICBpZiAobGlzdGluZy5zdGF0ZSA9PT0gJ3VubWFpbnRhaW5lZCcpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZTogJ0xJU1RJTkdfVU5NQUlOVEFJTkVEJywgbWVzc2FnZTogYCR7cmVmfSBpcyB1bm1haW50YWluZWQ6IGl0IHJlY2VpdmVzIG5vIHVwZGF0ZXMuIFBsYW4gYSByZXBsYWNlbWVudC5gIH0pO1xuICB9XG4gIGlmICh2ZXJzaW9uLmRlcHJlY2F0ZWRBdCkge1xuICAgIHdhcm5pbmdzLnB1c2goeyBjb2RlOiAnUExVR0lOX0RFUFJFQ0FURUQnLCBtZXNzYWdlOiBgJHtyZWZ9QCR7dmVyc2lvbi52ZXJzaW9ufSBpcyBkZXByZWNhdGVkJHt2ZXJzaW9uLmRlcHJlY2F0aW9uTWVzc2FnZSA/IGA6ICR7dmVyc2lvbi5kZXByZWNhdGlvbk1lc3NhZ2V9YCA6ICcnfS5gIH0pO1xuICB9XG4gIGZvciAoY29uc3QgYSBvZiBhZHZpc29yaWVzQ292ZXJpbmcoYWR2aXNvcmllcywgdmVyc2lvbi52ZXJzaW9uKSkge1xuICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgY29kZTogJ1BMVUdJTl9BRFZJU09SWScsXG4gICAgICBtZXNzYWdlOiBgJHtyZWZ9QCR7dmVyc2lvbi52ZXJzaW9ufSBpcyBhZmZlY3RlZCBieSBhICR7YS5zZXZlcml0eX0gc2VjdXJpdHkgYWR2aXNvcnk6ICR7YS5zdW1tYXJ5fWBcbiAgICAgICAgKyBgJHthLmZpeGVkVmVyc2lvbiA/IGAgRml4ZWQgaW4gJHthLmZpeGVkVmVyc2lvbn0uYCA6ICcnfWAsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgZmxhZyA9IHZlcnNpb24uc2NhbkZsYWdnZWRBdCA/IGFzU2NhbkZsYWcodmVyc2lvbi5zY2FuRmxhZykgOiBudWxsO1xuICBpZiAoZmxhZykgd2FybmluZ3MucHVzaCh2dWxuRmxhZ2dlZFdhcm5pbmcocmVmLCB2ZXJzaW9uLnZlcnNpb24sIGZsYWcpKTtcbiAgaWYgKHNlY3JldHNXaXRoaGVsZCkge1xuICAgIHdhcm5pbmdzLnB1c2goeyBjb2RlOiAnUExVR0lOX1NFQ1JFVFNfV0lUSEhFTEQnLCBtZXNzYWdlOiBgJHtyZWZ9IGlzIGEgJHtwdWJsaXNoZXIudGllcn0gcGx1Z2luOyB5b3VyIG9yZ2FuaXphdGlvbidzIHBvbGljeSBnaXZlcyBpdCBubyBzZWNyZXRzLCBzbyBpdHMgZGVjbGFyZWQgc2VjcmV0cyBhcmUgbm90IGluamVjdGVkLmAgfSk7XG4gIH1cbiAgcmV0dXJuIHsgd2FybmluZ3MsIHNlY3JldHNXaXRoaGVsZCB9O1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4gcmVjb3JkIGEgcmVzb2x2ZWQgbGlzdGluZyB2ZXJzaW9uIHJ1bnMgYXMg4oCUIHRoZSBzaGFwZSBzeW50aCBhbmRcbiAqIHRoZSBjb250cmFjdCBjaGVjayByZWFkIChhIGBwbHVnaW5zYCByb3cncyBydW4gZmllbGRzKSwgYnVpbHQgZnJvbSB0aGVcbiAqIHZlcnNpb24ncyBmcm96ZW4gc3BlYyBzbmFwc2hvdC4gYGlkYCBpcyB0aGUgTElTVElORyBWRVJTSU9OJ3MgaWQgKHRoZSBzdGVwXG4gKiBtYW5pZmVzdCByZXNvbHZlcyBpdCBiYWNrKSwgYGltYWdlUmVwb3NpdG9yeWAgaXRzIGBwdWJsaWMvKmAgY29weS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlZFBsdWdpblJlY29yZChyZXM6IExpc3RpbmdSZXNvbHZlZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb24sIG1vZGUgfSA9IHJlcztcbiAgY29uc3QgcyA9ICh2ZXJzaW9uLnNwZWNTbmFwc2hvdCA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGFyciA9IDxUPih2OiB1bmtub3duKTogVFtdID0+IChBcnJheS5pc0FycmF5KHYpID8gdiBhcyBUW10gOiBbXSk7XG4gIGNvbnN0IG9iaiA9ICh2OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gKHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHYpID8gdiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHt9KTtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmVyc2lvbi5pZCxcbiAgICBzb3VyY2U6ICdsaXN0aW5nJyxcbiAgICBwdWJsaXNoZXI6IHB1Ymxpc2hlci5oYW5kbGUsXG4gICAgcHVibGlzaGVyVGllcjogcHVibGlzaGVyLnRpZXIsXG4gICAgLy8gVGhlIG9yZyB0aGF0IE9XTlMgdGhlIGxpc3Rpbmcg4oCUIHRoZSB2dWxuZXJhYmlsaXR5LXdhaXZlciBkZWNpc2lvbiBpcyBrZXllZFxuICAgIC8vIG9uIGl0ICh3YWl2ZXJzIGFyZSB0aGUgb3BlcmF0b3Incywgc3lzdGVtLW9yZy1vbmx5KS4gRGlzdGluY3QgZnJvbSB0aGVcbiAgICAvLyBDT05TVU1JTkcgb3JnIGRvaW5nIHRoZSBsb29rdXA7IHdpdGhvdXQgaXQgdGhlIGFzc2Vzc21lbnQgY291bGQgbm90IGFwcGx5XG4gICAgLy8gd2FpdmVycyBhdCBhbGwgYW5kIHJlcG9ydGVkIGEgd2FpdmVkIENyaXRpY2FsIGFzIGFuIGVycm9yIHRvIGV2ZXJ5IHRlbmFudC5cbiAgICBvd25lck9yZ0lkOiBwdWJsaXNoZXIub3duZXJPcmdJZCA/PyBudWxsLFxuICAgIGxpc3RpbmdJZDogbGlzdGluZy5pZCxcbiAgICBpbnN0YWxsOiBtb2RlLmtpbmQsXG4gICAgbmFtZTogbGlzdGluZy5uYW1lLFxuICAgIHZlcnNpb246IHZlcnNpb24udmVyc2lvbixcbiAgICBpbWFnZVJlcG9zaXRvcnk6IHZlcnNpb24uaW1hZ2VSZXBvc2l0b3J5LFxuICAgIGltYWdlRGlnZXN0OiB2ZXJzaW9uLmltYWdlRGlnZXN0LFxuICAgIGJ1aWxkVHlwZTogdHlwZW9mIHMuYnVpbGRUeXBlID09PSAnc3RyaW5nJyA/IHMuYnVpbGRUeXBlIDogKHZlcnNpb24uaW1hZ2VEaWdlc3QgPyAnYnVpbGRfaW1hZ2UnIDogJ21ldGFkYXRhX29ubHknKSxcbiAgICBwbHVnaW5UeXBlOiBzLnBsdWdpblR5cGUgPz8gJ0NvZGVCdWlsZFN0ZXAnLFxuICAgIGNvbXB1dGVUeXBlOiBzLmNvbXB1dGVUeXBlID8/ICdTTUFMTCcsXG4gICAgZGVzY3JpcHRpb246IHMuZGVzY3JpcHRpb24gPz8gbGlzdGluZy5kZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgIHN1bW1hcnk6IHMuc3VtbWFyeSA/PyBsaXN0aW5nLnN1bW1hcnkgPz8gbnVsbCxcbiAgICBkaXNwbGF5TmFtZTogcy5kaXNwbGF5TmFtZSA/PyBudWxsLFxuICAgIGtleXdvcmRzOiBhcnI8c3RyaW5nPihzLmtleXdvcmRzKSxcbiAgICBjYXRlZ29yeTogcy5jYXRlZ29yeSA/PyBsaXN0aW5nLmNhdGVnb3J5LFxuICAgIG1ldGFkYXRhOiBvYmoocy5tZXRhZGF0YSksXG4gICAgZW52OiBvYmoocy5lbnYpLFxuICAgIGJ1aWxkQXJnczoge30sXG4gICAgaW5zdGFsbENvbW1hbmRzOiBhcnI8c3RyaW5nPihzLmluc3RhbGxDb21tYW5kcyksXG4gICAgY29tbWFuZHM6IGFycjxzdHJpbmc+KHMuY29tbWFuZHMpLFxuICAgIHRpbWVvdXQ6IHMudGltZW91dCA/PyBudWxsLFxuICAgIGZhaWx1cmVCZWhhdmlvcjogcy5mYWlsdXJlQmVoYXZpb3IgPz8gJ2ZhaWwnLFxuICAgIHByaW1hcnlPdXRwdXREaXJlY3Rvcnk6IHMucHJpbWFyeU91dHB1dERpcmVjdG9yeSA/PyBudWxsLFxuICAgIHNlY3JldHM6IHJlcy5zZWNyZXRzV2l0aGhlbGQgPyBbXSA6IGFycihzLnNlY3JldHMpLFxuICAgIHJlcXVpcmVkTWV0YWRhdGE6IGFycjxzdHJpbmc+KHMucmVxdWlyZWRNZXRhZGF0YSksXG4gICAgcmVxdWlyZWRWYXJzOiBhcnI8c3RyaW5nPihzLnJlcXVpcmVkVmFycyksXG4gICAgbWV0YWRhdGFUeXBlczogb2JqKHMubWV0YWRhdGFUeXBlcyksXG4gICAgdmFyc1R5cGVzOiBvYmoocy52YXJzVHlwZXMpLFxuICAgIG5ldHdvcmtFZ3Jlc3M6IGFycjxzdHJpbmc+KHMubmV0d29ya0VncmVzcyksXG4gICAgcnVuQXNSb290OiBzLnJ1bkFzUm9vdCA/PyBudWxsLFxuICAgIGxpY2Vuc2U6IHMubGljZW5zZSA/PyBsaXN0aW5nLmxpY2Vuc2UgPz8gbnVsbCxcbiAgICBob21lcGFnZVVybDogcy5ob21lcGFnZVVybCA/PyBsaXN0aW5nLmhvbWVwYWdlVXJsID8/IG51bGwsXG4gICAgc291cmNlVXJsOiBzLnNvdXJjZVVybCA/PyBsaXN0aW5nLnNvdXJjZVVybCA/PyBudWxsLFxuICAgIGRvY3VtZW50YXRpb25Vcmw6IHMuZG9jdW1lbnRhdGlvblVybCA/PyBudWxsLFxuICAgIGljb246IHMuaWNvbiA/PyBsaXN0aW5nLmljb24gPz8gbnVsbCxcbiAgICBjaGFuZ2Vsb2c6IHZlcnNpb24uY2hhbmdlbG9nLFxuICAgIGJyZWFraW5nOiB2ZXJzaW9uLmJyZWFraW5nLFxuICAgIHZ1bG5Dcml0aWNhbDogdmVyc2lvbi52dWxuQ3JpdGljYWwsXG4gICAgdnVsbkhpZ2g6IHZlcnNpb24udnVsbkhpZ2gsXG4gICAgdnVsbkNyaXRpY2FsRml4YWJsZTogdmVyc2lvbi52dWxuQ3JpdGljYWxGaXhhYmxlLFxuICAgIHZ1bG5IaWdoRml4YWJsZTogdmVyc2lvbi52dWxuSGlnaEZpeGFibGUsXG4gICAgc2Nhbm5lZEF0OiB2ZXJzaW9uLnNjYW5uZWRBdCxcbiAgICBzY2FuRmxhZ2dlZEF0OiB2ZXJzaW9uLnNjYW5GbGFnZ2VkQXQsXG4gICAgc2NhbkZsYWc6IHZlcnNpb24uc2NhbkZsYWcsXG4gICAgc2NhblN1bW1hcnk6IHZlcnNpb24uc2NhblN1bW1hcnksXG4gICAgbGlmZWN5Y2xlOiB2ZXJzaW9uLmRlcHJlY2F0ZWRBdCA/ICdkZXByZWNhdGVkJyA6ICdwcm9kdWN0aW9uJyxcbiAgICBkZXByZWNhdGVkQXQ6IHZlcnNpb24uZGVwcmVjYXRlZEF0LFxuICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogdmVyc2lvbi5kZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgeWFua2VkQXQ6IG51bGwsXG4gICAgeWFua1JlYXNvbjogbnVsbCxcbiAgICB2aXNpYmlsaXR5OiAncHVibGljJyxcbiAgICBpc0RlZmF1bHQ6IHRydWUsXG4gICAgaXNBY3RpdmU6IHRydWUsXG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFdmVyeXRoaW5nIGFuIG9yZyBjYW4gcmVzb2x2ZSAoY2F0YWxvZywgQUkgc2VsZWN0aW9uLCBwbGFjZWhvbGRlciBndWFyZClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBPbmUgbGlzdGluZyB3aXRoIHRoZSBvcmcncyBzdGFuZGluZyBvbiBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JnTGlzdGluZ1N0YXRlIHtcbiAgcHVibGlzaGVyOiBQdWJsaXNoZXI7XG4gIGxpc3Rpbmc6IFBsdWdpbkxpc3Rpbmc7XG4gIHZlcnNpb25zOiBQbHVnaW5MaXN0aW5nVmVyc2lvbltdO1xuICAvKiogSG93IHRoZSBvcmcgcmVhY2hlcyBpdCwgb3Igd2h5IGl0IGNhbid0IChub3QgaW5zdGFsbGVkLCBwZW5kaW5nLCDigKYpLiAqL1xuICBtb2RlOiBJbnN0YWxsTW9kZSB8IFJlc29sdXRpb25SZWZ1c2FsO1xuICAvKiogQSBwb2xpY3kgLyBzdGF0ZSBibG9jayAodGllciwgYmxvY2tlZCBsaXN0aW5nLCBzdXNwZW5kZWQpLCBvciBudWxsLiAqL1xuICBibG9jazogTGlzdGluZ0Jsb2NrIHwgbnVsbDtcbiAgLyoqIFdoYXQgYW4gVU5WRVJTSU9ORUQgcmVmZXJlbmNlIHJlc29sdmVzIHRvIHJpZ2h0IG5vdywgb3IgbnVsbC4gKi9cbiAgcmVzb2x2ZWQ6IFBsdWdpbkxpc3RpbmdWZXJzaW9uIHwgbnVsbDtcbiAgLyoqIFdoeSBub3RoaW5nIHJlc29sdmVzLCB3aGVuIHRoZSBvcmcgZG9lcyByZWFjaCB0aGUgbGlzdGluZyAoZS5nLiBhbiBhZHZpc29yeSBibG9jaykuICovXG4gIHJlZnVzYWw6IFJlc29sdXRpb25SZWZ1c2FsIHwgbnVsbDtcbiAgLyoqIFRoZSBsaXN0aW5nJ3MgUFVCTElTSEVEIGFkdmlzb3JpZXMuICovXG4gIGFkdmlzb3JpZXM6IFBsdWdpbkFkdmlzb3J5W107XG4gIC8qKiBUaGUgb3JnJ3Mgb3duIGluc3RhbGwgcm93IGZvciBpdCAoZXhwbGljaXQsIHBvc3NpYmx5IHBlbmRpbmcvZGVuaWVkKS4gKi9cbiAgb3duSW5zdGFsbDogUGx1Z2luSW5zdGFsbCB8IG51bGw7XG4gIC8qKiBUaGUgb3JnJ3MgZWZmZWN0aXZlIGNvbnN1bXB0aW9uIHBvbGljeSAodGhlIHNhbWUgZm9yIGV2ZXJ5IGxpc3RpbmcpLiAqL1xuICBwb2xpY3k6IENvbnN1bXB0aW9uUG9saWN5O1xufVxuXG4vKiogVGhlIG9yZydzIHBvbGljeSArIGluc3RhbGwgcm93cyAob3duIGFuZCByb290KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JnSW5zdGFsbENvbnRleHQge1xuICBwb2xpY3k6IENvbnN1bXB0aW9uUG9saWN5O1xuICBpbnN0YWxsczogUGx1Z2luSW5zdGFsbFtdO1xuICBzY29wZTogUmVzb2x1dGlvblNjb3BlO1xufVxuXG4vKiogTG9hZCB0aGUgb3JnJ3MgcG9saWN5IGFuZCBpbnN0YWxsIHJvd3MuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZE9yZ0luc3RhbGxDb250ZXh0KHNvdXJjZTogTGlzdGluZ0RhdGFTb3VyY2UsIHNjb3BlOiBSZXNvbHV0aW9uU2NvcGUpOiBQcm9taXNlPE9yZ0luc3RhbGxDb250ZXh0PiB7XG4gIGNvbnN0IG9yZ0lkcyA9IHNjb3BlT3JnSWRzKHNjb3BlKTtcbiAgY29uc3QgW3BvbGljaWVzLCBpbnN0YWxsc10gPSBhd2FpdCBQcm9taXNlLmFsbChbc291cmNlLnBvbGljaWVzRm9yT3JncyhvcmdJZHMpLCBzb3VyY2UuaW5zdGFsbHNGb3JPcmdzKG9yZ0lkcyldKTtcbiAgcmV0dXJuIHsgcG9saWN5OiBlZmZlY3RpdmVDb25zdW1wdGlvblBvbGljeShwb2xpY2llcywgb3JnSWRzWzBdISwgb3JnSWRzWzFdKSwgaW5zdGFsbHMsIHNjb3BlIH07XG59XG5cbi8qKlxuICogVGhlIG9yZydzIHN0YW5kaW5nIG9uIGV2ZXJ5IGxpdmUgbGlzdGluZyAob3Igb25seSBgZmlsdGVyYCdzKS4gVXNlZCBieSB0aGVcbiAqIGluLWFwcCBjYXRhbG9nOyB7QGxpbmsgcmVzb2x2YWJsZUxpc3RpbmdzfSBuYXJyb3dzIGl0IHRvIHdoYXQgcmVzb2x2ZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcmdMaXN0aW5nU3RhdGVzKFxuICBzb3VyY2U6IExpc3RpbmdEYXRhU291cmNlLFxuICBzY29wZTogUmVzb2x1dGlvblNjb3BlLFxuICBmaWx0ZXI6IHsgaWRzPzogc3RyaW5nW107IG5hbWVzPzogc3RyaW5nW10gfSA9IHt9LFxuICBjdHg/OiBPcmdJbnN0YWxsQ29udGV4dCxcbik6IFByb21pc2U8T3JnTGlzdGluZ1N0YXRlW10+IHtcbiAgY29uc3QgY29udGV4dCA9IGN0eCA/PyBhd2FpdCBsb2FkT3JnSW5zdGFsbENvbnRleHQoc291cmNlLCBzY29wZSk7XG4gIGNvbnN0IGxpdmUgPSBhd2FpdCBzb3VyY2UubGl2ZUxpc3RpbmdzKGZpbHRlcik7XG4gIGlmIChsaXZlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICBjb25zdCBpZHMgPSBsaXZlLm1hcCgobCkgPT4gbC5pZCk7XG4gIGNvbnN0IFtwdWJzLCB2ZXJzaW9ucywgYWR2aXNvcmllc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgc291cmNlLnB1Ymxpc2hlcnNCeUlkcyhbLi4ubmV3IFNldChsaXZlLm1hcCgobCkgPT4gbC5wdWJsaXNoZXJJZCkpXSksXG4gICAgc291cmNlLnZlcnNpb25zRm9yTGlzdGluZ3MoaWRzKSxcbiAgICBzb3VyY2UuYWR2aXNvcmllc0Zvckxpc3RpbmdzKGlkcyksXG4gIF0pO1xuICBjb25zdCBieVB1Ymxpc2hlciA9IG5ldyBNYXAocHVicy5tYXAoKHApID0+IFtwLmlkLCBwXSkpO1xuICBjb25zdCBvd24gPSBzY29wZU9yZ0lkcyhzY29wZSlbMF0hO1xuICBjb25zdCBvdXQ6IE9yZ0xpc3RpbmdTdGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgbGlzdGluZyBvZiBsaXZlKSB7XG4gICAgY29uc3QgcHVibGlzaGVyID0gYnlQdWJsaXNoZXIuZ2V0KGxpc3RpbmcucHVibGlzaGVySWQpO1xuICAgIGlmICghcHVibGlzaGVyKSBjb250aW51ZTtcbiAgICBjb25zdCB2cyA9IHZlcnNpb25zLmZpbHRlcigodikgPT4gdi5saXN0aW5nSWQgPT09IGxpc3RpbmcuaWQpO1xuICAgIGNvbnN0IGJsb2NrID0gbGlzdGluZ0Jsb2NrKGNvbnRleHQucG9saWN5LCBwdWJsaXNoZXIsIGxpc3RpbmcpO1xuICAgIGNvbnN0IG1vZGUgPSBpbnN0YWxsTW9kZUZvcihwdWJsaXNoZXIsIGxpc3RpbmcsIGNvbnRleHQuaW5zdGFsbHMsIGNvbnRleHQucG9saWN5LCBzY29wZSk7XG4gICAgY29uc3QgbGlzdGluZ0Fkdmlzb3JpZXMgPSBhZHZpc29yaWVzLmZpbHRlcigoYSkgPT4gYS5saXN0aW5nSWQgPT09IGxpc3RpbmcuaWQpO1xuICAgIGxldCByZXNvbHZlZDogUGx1Z2luTGlzdGluZ1ZlcnNpb24gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgcmVmdXNhbDogUmVzb2x1dGlvblJlZnVzYWwgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoIWJsb2NrICYmICEoJ2NvZGUnIGluIG1vZGUpKSB7XG4gICAgICBjb25zdCBjaG9pY2UgPSBzZWxlY3RMaXN0aW5nVmVyc2lvbih7XG4gICAgICAgIHJlZjogYCR7cHVibGlzaGVyLmhhbmRsZX0vJHtsaXN0aW5nLm5hbWV9YCwgdmVyc2lvbnM6IHZzLCBtb2RlLCBhZHZpc29yaWVzOiBsaXN0aW5nQWR2aXNvcmllcywgcG9saWN5OiBjb250ZXh0LnBvbGljeSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCd2ZXJzaW9uJyBpbiBjaG9pY2UpIHJlc29sdmVkID0gY2hvaWNlLnZlcnNpb247XG4gICAgICBlbHNlIHJlZnVzYWwgPSBjaG9pY2UucmVmdXNhbDtcbiAgICB9XG4gICAgY29uc3Qgb3duSW5zdGFsbCA9IGNvbnRleHQuaW5zdGFsbHMuZmluZCgoaSkgPT4gaS5saXN0aW5nSWQgPT09IGxpc3RpbmcuaWQgJiYgaS5vcmdJZC50b0xvd2VyQ2FzZSgpID09PSBvd24pID8/IG51bGw7XG4gICAgb3V0LnB1c2goeyBwdWJsaXNoZXIsIGxpc3RpbmcsIHZlcnNpb25zOiB2cywgbW9kZSwgYmxvY2ssIHJlc29sdmVkLCByZWZ1c2FsLCBhZHZpc29yaWVzOiBsaXN0aW5nQWR2aXNvcmllcywgb3duSW5zdGFsbCwgcG9saWN5OiBjb250ZXh0LnBvbGljeSB9KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogVGhlIGxpc3RpbmdzIGFuIG9yZydzIHJlZmVyZW5jZXMgcmVzb2x2ZSB0byBub3cgKGluc3RhbGxlZCBvciBpbXBsaWNpdCwgbm90IGJsb2NrZWQpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmFibGVMaXN0aW5ncyhcbiAgc291cmNlOiBMaXN0aW5nRGF0YVNvdXJjZSxcbiAgc2NvcGU6IFJlc29sdXRpb25TY29wZSxcbiAgZmlsdGVyOiB7IG5hbWVzPzogc3RyaW5nW10gfSA9IHt9LFxuKTogUHJvbWlzZTxBcnJheTxPcmdMaXN0aW5nU3RhdGUgJiB7IHJlc29sdmVkOiBQbHVnaW5MaXN0aW5nVmVyc2lvbiB9Pj4ge1xuICByZXR1cm4gKGF3YWl0IG9yZ0xpc3RpbmdTdGF0ZXMoc291cmNlLCBzY29wZSwgZmlsdGVyKSlcbiAgICAuZmlsdGVyKChzKTogcyBpcyBPcmdMaXN0aW5nU3RhdGUgJiB7IHJlc29sdmVkOiBQbHVnaW5MaXN0aW5nVmVyc2lvbiB9ID0+IHMucmVzb2x2ZWQgIT09IG51bGwpO1xufVxuIl19
@@ -1,5 +1,43 @@
1
+ /**
2
+ * Queries behind the anonymous public plugin directory
3
+ * (docs/plugin-publishing.md).
4
+ *
5
+ * Every query here reads ONLY the `public_listings`, `public_listed_versions`,
6
+ * `public_advisories` and `public_reviews` views, through the `ecosystem_public_reader`
7
+ * connection ({@link getPublicReaderDb}). Those views filter to public rows
8
+ * (listed/unmaintained listings of non-suspended publishers, non-paused
9
+ * listings and versions, published advisories) and project public columns only,
10
+ * so nothing here needs — or has — a tenant context.
11
+ *
12
+ * PAUSE IS THE VIEWS' JOB, and only theirs. Every query here used to repeat
13
+ * `l.paused_at IS NULL` because three of the four views did not filter it —
14
+ * `public_reviews` alone did — so the predicate lived in six places and the
15
+ * header claimed a guarantee the DDL did not make. The views now filter it,
16
+ * which is the single place it belongs: a query added later inherits the rule
17
+ * instead of having to remember it, which is exactly the failure the six copies
18
+ * were compensating for.
19
+ *
20
+ * The DDL in `postgres-init.sql` runs when the database is created, so this is
21
+ * the contract from the install forward rather than something layered on. It is
22
+ * pinned per view by `ecosystem-schema.test.ts`.
23
+ *
24
+ * Search: Postgres full-text (`search_vector`, weighted name A / keywords and
25
+ * category B / summary C / README D, `english` config) OR a trigram match on the
26
+ * name (typo tolerance), ranked by `ts_rank` + name similarity, blended with the
27
+ * Bayesian rating and install count when present. Paused listings are hidden.
28
+ */
29
+ import { type PublisherTier } from '@pipeline-builder/api-core';
1
30
  import type { HealthBreakdown } from '../database/drizzle-schema.js';
2
- export type DirectoryTrustTier = 'official' | 'verified' | 'community' | 'unverified';
31
+ /**
32
+ * DERIVED from api-core's canonical `PUBLISHER_TIERS`, not restated.
33
+ *
34
+ * This was a hand-written copy of the same four values, and the copy is what
35
+ * the public route's zod enum validated — while the view types in the same
36
+ * package already used `PublisherTier`. A fifth tier would have been stored and
37
+ * displayed and then silently unfilterable, because the filter would still only
38
+ * accept the four this list remembered.
39
+ */
40
+ export type DirectoryTrustTier = PublisherTier;
3
41
  export type DirectoryIconKind = 'vendor' | 'uploaded' | 'monogram' | 'category';
4
42
  export type DirectorySort = 'relevance' | 'rating' | 'installs' | 'updated' | 'name' | 'health';
5
43
  export declare const DIRECTORY_SORTS: readonly DirectorySort[];
@@ -83,11 +121,33 @@ export interface DirectoryListingVersion {
83
121
  changelog: string | null;
84
122
  vulnCritical: number | null;
85
123
  vulnHigh: number | null;
86
- /** Of those, the findings grype reports a fixed version for. */
124
+ /**
125
+ * Of those, the findings grype reports a fixed version for.
126
+ *
127
+ * RAW SCANNER COUNTS, deliberately — they describe the IMAGE, not the
128
+ * platform's verdict on it. The floor the build and publish gates apply is
129
+ * `isGatedFinding` (fixable OR KEV-listed) minus any operator waiver, and
130
+ * publishing THAT number here would be wrong in a way that matters to a
131
+ * third party: a Critical the vendor waived for its own catalog would be
132
+ * advertised to everyone else as "0 Critical", when the image still contains
133
+ * it and their risk is unchanged. A waiver is the vendor's decision about
134
+ * the vendor's own use; it is not a statement about the artifact.
135
+ *
136
+ * So the counts stay truthful and the VERDICT is disclosed separately — see
137
+ * `scanFlaggedAt` below, which is what says the platform gated it.
138
+ */
87
139
  vulnCriticalFixable: number | null;
88
140
  vulnHighFixable: number | null;
89
141
  scannedAt: string | null;
90
- /** When the nightly rescan flagged this version (fixable criticals over the platform floor); null = not flagged. */
142
+ /**
143
+ * When the nightly rescan flagged this version — the platform's own verdict,
144
+ * which is waiver- and KEV-aware (`isGatedFinding`). Null = not flagged.
145
+ *
146
+ * This is the field to read for "did the platform gate this", and the counts
147
+ * above for "what does the image contain". They can legitimately disagree: a
148
+ * waived Critical leaves a non-zero count and no flag, and a KEV-listed
149
+ * UNFIXABLE Critical leaves `vulnCriticalFixable: 0` and a flag.
150
+ */
91
151
  scanFlaggedAt: string | null;
92
152
  /** Ids of the published advisories whose range covers this version. */
93
153
  advisoryIds: string[];
@@ -237,6 +297,14 @@ export declare function normalizeQuery(q: string | undefined): string;
237
297
  export declare function highlightText(text: string, q: string): string | undefined;
238
298
  /** Opaque cursor: an offset, base64url-encoded so clients don't depend on it. */
239
299
  export declare function encodeOffsetCursor(offset: number): string;
300
+ /**
301
+ * How deep the directory may be paged. A bound on enumeration, not a page size:
302
+ * past it the decoder refuses the cursor, so a caller cannot walk the whole
303
+ * catalog by incrementing an offset.
304
+ */
305
+ export declare const MAX_DIRECTORY_OFFSET = 10000;
306
+ /** The facet bucket for rows whose nullable key is NULL — see the facet loop. */
307
+ export declare const FACET_NONE = "(none)";
240
308
  export declare function decodeOffsetCursor(cursor: string | undefined): number;
241
309
  /** Search the directory: one page of cards, facet counts, total and next cursor. */
242
310
  export declare function searchPublicListings(params: DirectorySearchParams): Promise<DirectorySearchResult>;