@pipeline-builder/pipeline-data 4.3.12 → 4.3.14

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 (33) hide show
  1. package/lib/api/managed-toolchain.d.ts +1 -5
  2. package/lib/api/managed-toolchain.js +18 -20
  3. package/lib/api/public-directory.d.ts +4 -15
  4. package/lib/api/public-directory.js +1 -31
  5. package/lib/api/reporting/stakeholder/compose.d.ts +3 -2
  6. package/lib/api/reporting/stakeholder/compose.js +1 -1
  7. package/lib/api/reporting/stakeholder/period.d.ts +5 -4
  8. package/lib/api/reporting/stakeholder/period.js +1 -1
  9. package/lib/api/reporting/stakeholder/sections.d.ts +4 -4
  10. package/lib/api/reporting/stakeholder/sections.js +1 -1
  11. package/lib/api/reporting/stakeholder/store.d.ts +3 -2
  12. package/lib/api/reporting/stakeholder/store.js +1 -1
  13. package/lib/api/reporting/toolchain-runs.d.ts +0 -6
  14. package/lib/api/reporting/toolchain-runs.js +4 -5
  15. package/lib/api/reporting/types.d.ts +3 -2
  16. package/lib/api/reporting/types.js +1 -1
  17. package/lib/api/support-cases.d.ts +50 -24
  18. package/lib/api/support-cases.js +96 -37
  19. package/lib/core/query-filters.d.ts +6 -6
  20. package/lib/core/query-filters.js +1 -1
  21. package/lib/database/drizzle-schema.d.ts +48 -41
  22. package/lib/database/schema/alert.js +4 -4
  23. package/lib/database/schema/compliance.d.ts +29 -40
  24. package/lib/database/schema/compliance.js +10 -14
  25. package/lib/database/schema/ecosystem.d.ts +17 -0
  26. package/lib/database/schema/ecosystem.js +6 -1
  27. package/lib/database/schema/message.js +2 -2
  28. package/lib/database/schema/reporting-stakeholder.d.ts +2 -1
  29. package/lib/database/schema/reporting-stakeholder.js +2 -27
  30. package/lib/index.d.ts +4 -4
  31. package/lib/index.js +5 -5
  32. package/lib/testing/exports.json +2 -4
  33. package/package.json +2 -2
@@ -22,12 +22,10 @@
22
22
  * - The answer carries `resolvedVia` and nothing about any other org: no
23
23
  * rollout membership, no ancestor's settings.
24
24
  */
25
- import { AppError, ErrorCode, type GetParentOrgId, type ManagedToolchainPlugin, type PluginToolchain } from '@pipeline-builder/api-core';
25
+ import { AppError, ErrorCode, type GetParentOrgId, type ManagedToolchainPlugin, type PluginToolchain, type ToolchainResolvedVia } from '@pipeline-builder/api-core';
26
26
  import type { CrudTx } from './crud-service.js';
27
27
  import type { ResolutionRefusal } from './plugin-resolution.js';
28
28
  import { type OrgToolchainDefault, type Plugin, type ToolchainRelease } from '../database/drizzle-schema.js';
29
- /** How a resolution chose its release. Never names the org it came from. */
30
- export type ToolchainResolvedVia = 'pin' | 'org-default' | 'canary' | 'default';
31
29
  /** A non-fatal note on a resolved release (synth prints it). */
32
30
  export interface ManagedToolchainWarning {
33
31
  code: string;
@@ -78,8 +76,6 @@ export declare function loadReleaseHalves(db: ToolchainDb, releaseVersion: strin
78
76
  * over-deep chain throws rather than resolving the wrong org's toolchain.
79
77
  */
80
78
  export declare function toolchainOrgChain(orgId: string, getParent: GetParentOrgId): Promise<string[]>;
81
- /** Test hook: drop cached parent lookups. */
82
- export declare function clearToolchainParentCacheForTests(): void;
83
79
  /** Test hook: replace the resolver's reads and hierarchy (null restores production). */
84
80
  export declare function setManagedToolchainDepsForTests(deps: ManagedToolchainDeps | null): void;
85
81
  /** Why a stored release is not LIVE (empty = live: both halves present, active, unyanked, not deprecated). */
@@ -24,7 +24,7 @@
24
24
  * - The answer carries `resolvedVia` and nothing about any other org: no
25
25
  * rollout membership, no ancestor's settings.
26
26
  */
27
- import { AppError, compareSemver, createLogger, envInt, ErrorCode, fetchParentOrgId, getStatusForErrorCode, isSystemOrgId, MANAGED_TOOLCHAIN_PLUGINS, MAX_ORG_DEPTH, SYSTEM_ORG_ID, TOOLCHAIN_RELEASE_VERSION_PATTERN, toolchainFromMetadata, toOrgIdString, } from '@pipeline-builder/api-core';
27
+ import { AppError, compareSemver, createLogger, envInt, ErrorCode, fetchParentOrgId, getStatusForErrorCode, isSystemOrgId, MANAGED_TOOLCHAIN, MANAGED_TOOLCHAIN_PLUGINS, MAX_ORG_DEPTH, SYSTEM_ORG_ID, TOOLCHAIN_RELEASE_VERSION_PATTERN, toolchainFromMetadata, toOrgIdString, } from '@pipeline-builder/api-core';
28
28
  import { and, eq, inArray, isNull, sql } from 'drizzle-orm';
29
29
  import { schema } from '../database/drizzle-schema.js';
30
30
  import { runWithTenantContext, withTenantTx } from '../database/tenancy.js';
@@ -40,13 +40,12 @@ export class ManagedToolchainError extends AppError {
40
40
  export function isToolchainReleaseVersion(version) {
41
41
  return typeof version === 'string' && TOOLCHAIN_RELEASE_VERSION_PATTERN.test(version);
42
42
  }
43
- const BOOTSTRAP = 'pipeline-bootstrap';
44
- const SYNTH = 'cdk-synth';
43
+ const { bootstrap: BOOTSTRAP, synth: SYNTH } = MANAGED_TOOLCHAIN;
45
44
  /** The release row and both SYSTEM-ORG halves of `releaseVersion` (deleted rows excluded). */
46
45
  export async function loadReleaseHalves(db, releaseVersion) {
47
46
  const [releases, rows] = await Promise.all([
48
47
  db.select().from(schema.toolchainRelease).where(eq(schema.toolchainRelease.releaseVersion, releaseVersion)),
49
- db.select().from(schema.plugin).where(and(sql `lower(${schema.plugin.orgId}) = ${SYSTEM_ORG_ID}`, inArray(schema.plugin.name, [...MANAGED_TOOLCHAIN_PLUGINS]), eq(schema.plugin.version, releaseVersion), isNull(schema.plugin.deletedAt))),
48
+ db.select().from(schema.plugin).where(and(eq(schema.plugin.orgId, SYSTEM_ORG_ID), inArray(schema.plugin.name, [...MANAGED_TOOLCHAIN_PLUGINS]), eq(schema.plugin.version, releaseVersion), isNull(schema.plugin.deletedAt))),
50
49
  ]);
51
50
  const plugins = rows;
52
51
  return {
@@ -136,10 +135,6 @@ async function platformParent(orgId) {
136
135
  parentCache.set(orgId, { parent, at: Date.now() });
137
136
  return parent;
138
137
  }
139
- /** Test hook: drop cached parent lookups. */
140
- export function clearToolchainParentCacheForTests() {
141
- parentCache.clear();
142
- }
143
138
  const productionDeps = {
144
139
  read: (fn) => runWithTenantContext({ isSuperAdmin: true }, () => withTenantTx((tx) => fn(tx))),
145
140
  getParent: platformParent,
@@ -374,7 +369,7 @@ export async function listEligibleReleasesWith(deps, orgId) {
374
369
  return deps.read(async (db) => {
375
370
  const [releases, rows, history, platformDefault, canary] = await Promise.all([
376
371
  db.select().from(schema.toolchainRelease),
377
- db.select().from(schema.plugin).where(and(sql `lower(${schema.plugin.orgId}) = ${SYSTEM_ORG_ID}`, inArray(schema.plugin.name, [...MANAGED_TOOLCHAIN_PLUGINS]), isNull(schema.plugin.deletedAt))),
372
+ db.select().from(schema.plugin).where(and(eq(schema.plugin.orgId, SYSTEM_ORG_ID), inArray(schema.plugin.name, [...MANAGED_TOOLCHAIN_PLUGINS]), isNull(schema.plugin.deletedAt))),
378
373
  db.select({ releaseVersion: schema.toolchainDefaultHistory.releaseVersion }).from(schema.toolchainDefaultHistory),
379
374
  currentPlatformDefault(db),
380
375
  nearestOnChain(db, schema.toolchainRollout, chain),
@@ -413,18 +408,21 @@ export function listEligibleReleases(orgId) {
413
408
  // -----------------------------------------------------------------------------
414
409
  // Caller helpers
415
410
  // -----------------------------------------------------------------------------
411
+ /**
412
+ * Each resolver refusal code's step-resolution refusal (anything else is
413
+ * `toolchain_unresolved`). `details` rides along except for NO_DEFAULT, which
414
+ * carries none worth showing.
415
+ */
416
+ const REFUSAL_BY_CODE = {
417
+ [ErrorCode.NOT_FOUND]: { code: 'NOT_FOUND', reason: 'toolchain_release_not_found', details: true },
418
+ [ErrorCode.VALIDATION_ERROR]: { code: 'NOT_FOUND', reason: 'toolchain_release_invalid', details: true },
419
+ [ErrorCode.TOOLCHAIN_NO_DEFAULT]: { code: 'PLUGIN_UNAVAILABLE', reason: 'toolchain_no_default', details: false },
420
+ };
421
+ const UNRESOLVED_REFUSAL = { code: 'PLUGIN_UNAVAILABLE', reason: 'toolchain_unresolved', details: true };
416
422
  /** The resolver's error as the refusal shape step resolution reports (contract check, declared side, facts). */
417
423
  export function managedToolchainRefusal(err) {
418
- switch (err.code) {
419
- case ErrorCode.NOT_FOUND:
420
- return { code: 'NOT_FOUND', reason: 'toolchain_release_not_found', message: err.message, ...(err.details ? { details: err.details } : {}) };
421
- case ErrorCode.VALIDATION_ERROR:
422
- return { code: 'NOT_FOUND', reason: 'toolchain_release_invalid', message: err.message, ...(err.details ? { details: err.details } : {}) };
423
- case ErrorCode.TOOLCHAIN_NO_DEFAULT:
424
- return { code: 'PLUGIN_UNAVAILABLE', reason: 'toolchain_no_default', message: err.message };
425
- default:
426
- return { code: 'PLUGIN_UNAVAILABLE', reason: 'toolchain_unresolved', message: err.message, ...(err.details ? { details: err.details } : {}) };
427
- }
424
+ const r = REFUSAL_BY_CODE[err.code] ?? UNRESOLVED_REFUSAL;
425
+ return { code: r.code, reason: r.reason, message: err.message, ...(r.details && err.details ? { details: err.details } : {}) };
428
426
  }
429
427
  /**
430
428
  * Resolve ONE managed half for a step: the plugin row plus the resolution, or
@@ -442,4 +440,4 @@ export async function resolveManagedToolchainHalf(caller, name, opts = {}) {
442
440
  throw err;
443
441
  }
444
442
  }
445
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC10b29sY2hhaW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWFuYWdlZC10b29sY2hhaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQ0wsUUFBUSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQ2hILHlCQUF5QixFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsaUNBQWlDLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxHQUVqSSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVELE9BQU8sRUFBRSxNQUFNLEVBQWdFLE1BQU0sK0JBQStCLENBQUM7QUFDckgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBeUJqRCxrSEFBa0g7QUFDbEgsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFFBQVE7SUFDakQsWUFBWSxJQUFlLEVBQUUsT0FBZSxFQUFFLE9BQWlDO1FBQzdFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBT0Qsb0VBQW9FO0FBQ3BFLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxPQUFnQjtJQUN4RCxPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxpQ0FBaUMsQ0FBQyxJQUFJ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R0FBRyxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUSEUgcmVzb2x2ZXIgZm9yIHRoZSBtYW5hZ2VkIHRvb2xjaGFpbiAoZG9jcy9wbGFucy9ib290c3RyYXAtaW1hZ2UtdmVyc2lvbmluZy5tZFxuICogwqcyKS4gYHBpcGVsaW5lLWJvb3RzdHJhcEBWYCBhbmQgYGNkay1zeW50aEBWYCBhcmUgdHdvIFNZU1RFTS1PUkcgcGx1Z2luIHJvd3NcbiAqIHRoYXQgc2hhcmUgb25lIHJlbGVhc2UgdmVyc2lvbiBgVmA7IGV2ZXJ5IHBhdGggdGhhdCBjYW4gcmVzb2x2ZSBhIG1hbmFnZWRcbiAqIG5hbWUgYW5zd2VycyBmcm9tIGhlcmUgYW5kIG5vdGhpbmcgZWxzZSBtYXk6XG4gKlxuICogICByZWxlYXNlIHBpbiBnaXZlbiDihpIgdGhhdCByZWxlYXNlLCBpZiBpdCBFWElTVFMgKHlhbmtlZCAvIGRlcHJlY2F0ZWQgL1xuICogICAgICAgICAgICAgICAgICAgICAgIG5ldmVyLXByb21vdGVkIHN0aWxsIHJlc29sdmUsIHdpdGggYSB3YXJuaW5nOyBkZWxldGVkIOKHkiA0MDQpXG4gKiAgIGVsc2Ugb3JnIGRlZmF1bHQgIOKGkiB0aGUgTkVBUkVTVCBgb3JnX3Rvb2xjaGFpbl9kZWZhdWx0YCB3YWxraW5nIGNhbGxlciDihpIg4oCmIOKGkiByb290XG4gKiAgIGVsc2UgY2FuYXJ5ICAgICAgIOKGkiB0aGUgTkVBUkVTVCBgdG9vbGNoYWluX3JvbGxvdXRgIG1lbWJlcnNoaXAsIHNlcnZlZCBvbmx5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgaXQgcGFzc2VzIHRoZSBzY2FuICsgbWV0YWRhdGEgZ3VhcmRzXG4gKiAgIGVsc2UgcGxhdGZvcm0gICAgIOKGkiBgdG9vbGNoYWluX3BsYXRmb3JtX2RlZmF1bHRgXG4gKiAgIGVsc2UgICAgICAgICAgICAgIOKGkiA0MDkgVE9PTENIQUlOX05PX0RFRkFVTFQgKG5ldmVyIFwiaGlnaGVzdCB2ZXJzaW9uXCIsIEQxMSlcbiAqXG4gKiAtIFJlYWRzIGFyZSBFTEVWQVRFRCAoYHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0pYCwgYXNcbiAqICAgYHZlcnNpb25SZWZlcmVuY2VzYCBkb2VzKSBhbmQgdG91Y2ggU1lTVEVNLU9SRyBwbHVnaW4gcm93cyBvbmx5OiB0aGUgb3duZXJcbiAqICAgcmFuayBvZiBgcGx1Z2luUmVzb2x1dGlvbk9yZGVyQnlgIGlzIG5ldmVyIGNvbnN1bHRlZCwgc28gYSBzYW1lLW5hbWVkIHJvdyBpblxuICogICBhbnkgb3RoZXIgb3JnIGlzIG5ldmVyIGEgY2FuZGlkYXRlLlxuICogLSBFbGlnaWJpbGl0eSAoRDE1KSBpcyBhIFNFVC10aW1lIHJ1bGUgKHtAbGluayBpc0VsaWdpYmxlUmVsZWFzZX0pOyBhdCByZXNvbHZlXG4gKiAgIHRpbWUgYSBwaW4gLyBvcmcgZGVmYXVsdCBvbmx5IGhhcyB0byBleGlzdC5cbiAqIC0gQm90aCBoYWx2ZXMgYWx3YXlzIGNvbWUgZnJvbSBPTkUgcmVsZWFzZSAoYFRPT0xDSEFJTl9QQUlSX01JU01BVENIYCBvdGhlcndpc2UpLlxuICogLSBUaGUgYW5zd2VyIGNhcnJpZXMgYHJlc29sdmVkVmlhYCBhbmQgbm90aGluZyBhYm91dCBhbnkgb3RoZXIgb3JnOiBub1xuICogICByb2xsb3V0IG1lbWJlcnNoaXAsIG5vIGFuY2VzdG9yJ3Mgc2V0dGluZ3MuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXBwRXJyb3IsIGNvbXBhcmVTZW12ZXIsIGNyZWF0ZUxvZ2dlciwgZW52SW50LCBFcnJvckNvZGUsIGZldGNoUGFyZW50T3JnSWQsIGdldFN0YXR1c0ZvckVycm9yQ29kZSwgaXNTeXN0ZW1PcmdJZCxcbiAgTUFOQUdFRF9UT09MQ0hBSU5fUExVR0lOUywgTUFYX09SR19ERVBUSCwgU1lTVEVNX09SR19JRCwgVE9PTENIQUlOX1JFTEVBU0VfVkVSU0lPTl9QQVRURVJOLCB0b29sY2hhaW5Gcm9tTWV0YWRhdGEsIHRvT3JnSWRTdHJpbmcsXG4gIHR5cGUgR2V0UGFyZW50T3JnSWQsIHR5cGUgTWFuYWdlZFRvb2xjaGFpblBsdWdpbiwgdHlwZSBQbHVnaW5Ub29sY2hhaW4sXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIGluQXJyYXksIGlzTnVsbCwgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHR5cGUgeyBDcnVkVHggfSBmcm9tICcuL2NydWQtc2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdXRpb25SZWZ1c2FsIH0gZnJvbSAnLi9wbHVnaW4tcmVzb2x1dGlvbi5qcyc7XG5pbXBvcnQgeyBzY2hlbWEsIHR5cGUgT3JnVG9vbGNoYWluRGVmYXVsdCwgdHlwZSBQbHVnaW4sIHR5cGUgVG9vbGNoYWluUmVsZWFzZSB9IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHJ1bldpdGhUZW5hbnRDb250ZXh0LCB3aXRoVGVuYW50VHggfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdtYW5hZ2VkLXRvb2xjaGFpbicpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljIHNoYXBlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEhvdyBhIHJlc29sdXRpb24gY2hvc2UgaXRzIHJlbGVhc2UuIE5ldmVyIG5hbWVzIHRoZSBvcmcgaXQgY2FtZSBmcm9tLiAqL1xuZXhwb3J0IHR5cGUgVG9vbGNoYWluUmVzb2x2ZWRWaWEgPSAncGluJyB8ICdvcmctZGVmYXVsdCcgfCAnY2FuYXJ5JyB8ICdkZWZhdWx0JztcblxuLyoqIEEgbm9uLWZhdGFsIG5vdGUgb24gYSByZXNvbHZlZCByZWxlYXNlIChzeW50aCBwcmludHMgaXQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5hZ2VkVG9vbGNoYWluV2FybmluZyB7XG4gIGNvZGU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzZXZlcml0eTogJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJztcbn1cblxuLyoqIE9uZSByZWxlYXNlLCBib3RoIGhhbHZlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlZFRvb2xjaGFpblJlc29sdXRpb24ge1xuICByZWxlYXNlVmVyc2lvbjogc3RyaW5nO1xuICByZXNvbHZlZFZpYTogVG9vbGNoYWluUmVzb2x2ZWRWaWE7XG4gIGJvb3RzdHJhcDogUGx1Z2luO1xuICBzeW50aDogUGx1Z2luO1xuICB3YXJuaW5nczogTWFuYWdlZFRvb2xjaGFpbldhcm5pbmdbXTtcbn1cblxuLyoqIEEgcmVzb2x2ZXIgcmVmdXNhbDogYGNvZGVgIGlzIFRPT0xDSEFJTl9OT19ERUZBVUxULCBOT1RfRk9VTkQsIFRPT0xDSEFJTl9QQUlSX01JU01BVENIIG9yIFZBTElEQVRJT05fRVJST1IuICovXG5leHBvcnQgY2xhc3MgTWFuYWdlZFRvb2xjaGFpbkVycm9yIGV4dGVuZHMgQXBwRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihjb2RlOiBFcnJvckNvZGUsIG1lc3NhZ2U6IHN0cmluZywgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKGNvZGUpLCBjb2RlLCBtZXNzYWdlLCBkZXRhaWxzKTtcbiAgICB0aGlzLm5hbWUgPSAnTWFuYWdlZFRvb2xjaGFpbkVycm9yJztcbiAgfVxufVxuXG4vKiogVGhlIGNhbGxlciBhIHJlc29sdXRpb24gcnVucyBmb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZWRUb29sY2hhaW5DYWxsZXIge1xuICBvcmdJZDogc3RyaW5nO1xufVxuXG4vKiogV2hldGhlciBgdmVyc2lvbmAgaXMgYSByZWxlYXNlIHZlcnNpb24gKGBNQUpPUi5NSU5PUi5QQVRDSGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVG9vbGNoYWluUmVsZWFzZVZlcnNpb24odmVyc2lvbjogdW5rbm93bik6IHZlcnNpb24gaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJiBUT09MQ0hBSU5fUkVMRUFTRV9WRVJTSU9OX1BBVFRFUk4udGVzdCh2ZXJzaW9uKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERhdGEgYWNjZXNzIChzeXN0ZW0tb3JnIHJvd3MsIGVsZXZhdGVkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFdoYXQgdGhlIHJlc29sdmVyIHJlYWRzIHdpdGg6IGEgZHJpenpsZSB0cmFuc2FjdGlvbiAob3IgYW55IGRyaXp6bGUgZGF0YWJhc2UgaW4gdGVzdHMpLiAqL1xuZXhwb3J0IHR5cGUgVG9vbGNoYWluRGIgPSBQaWNrPENydWRUeCwgJ3NlbGVjdCc+O1xuXG4vKiogSG93IHRoZSByZXNvbHZlciByZWFkcyBhbmQgd2Fsa3MgdGhlIG9yZyB0cmVlIChpbmplY3RhYmxlIGZvciB0ZXN0cykuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZWRUb29sY2hhaW5EZXBzIHtcbiAgLyoqIFJ1biBgZm5gIHdpdGggRUxFVkFURUQgcmVhZHMuICovXG4gIHJlYWQ8VD4oZm46IChkYjogVG9vbGNoYWluRGIpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+O1xuICAvKiogQW4gb3JnJ3MgZGlyZWN0IHBhcmVudCwgb3IgdW5kZWZpbmVkIGZvciBhIHJvb3QuIFRocm93cyB3aGVuIGl0IGNhbid0IHRlbGwuICovXG4gIGdldFBhcmVudDogR2V0UGFyZW50T3JnSWQ7XG59XG5cbi8qKiBCb3RoIGhhbHZlcyBvZiBvbmUgcmVsZWFzZSBhcyBzdG9yZWQsIHdpdGggdGhlIHJlbGVhc2Ugcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWxlYXNlSGFsdmVzIHtcbiAgcmVsZWFzZVZlcnNpb246IHN0cmluZztcbiAgcmVsZWFzZTogVG9vbGNoYWluUmVsZWFzZSB8IG51bGw7XG4gIGJvb3RzdHJhcDogUGx1Z2luIHwgbnVsbDtcbiAgc3ludGg6IFBsdWdpbiB8IG51bGw7XG59XG5cbmNvbnN0IEJPT1RTVFJBUDogTWFuYWdlZFRvb2xjaGFpblBsdWdpbiA9ICdwaXBlbGluZS1ib290c3RyYXAnO1xuY29uc3QgU1lOVEg6IE1hbmFnZWRUb29sY2hhaW5QbHVnaW4gPSAnY2RrLXN5bnRoJztcblxuLyoqIFRoZSByZWxlYXNlIHJvdyBhbmQgYm90aCBTWVNURU0tT1JHIGhhbHZlcyBvZiBgcmVsZWFzZVZlcnNpb25gIChkZWxldGVkIHJvd3MgZXhjbHVkZWQpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRSZWxlYXNlSGFsdmVzKGRiOiBUb29sY2hhaW5EYiwgcmVsZWFzZVZlcnNpb246IHN0cmluZyk6IFByb21pc2U8UmVsZWFzZUhhbHZlcz4ge1xuICBjb25zdCBbcmVsZWFzZXMsIHJvd3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnRvb2xjaGFpblJlbGVhc2UpLndoZXJlKGVxKHNjaGVtYS50b29sY2hhaW5SZWxlYXNlLnJlbGVhc2VWZXJzaW9uLCByZWxlYXNlVmVyc2lvbikpLFxuICAgIGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnBsdWdpbikud2hlcmUoYW5kKFxuICAgICAgc3FsYGxvd2VyKCR7c2NoZW1hLnBsdWdpbi5vcmdJZH0pID0gJHtTWVNURU1fT1JHX0lEfWAsXG4gICAgICBpbkFycmF5KHNjaGVtYS5wbHVnaW4ubmFtZSwgWy4uLk1BTkFHRURfVE9PTENIQUlOX1BMVUdJTlNdKSxcbiAgICAgIGVxKHNjaGVtYS5wbHVnaW4udmVyc2lvbiwgcmVsZWFzZVZlcnNpb24pLFxuICAgICAgaXNOdWxsKHNjaGVtYS5wbHVnaW4uZGVsZXRlZEF0KSxcbiAgICApKSxcbiAgXSk7XG4gIGNvbnN0IHBsdWdpbnMgPSByb3dzIGFzIFBsdWdpbltdO1xuICByZXR1cm4ge1xuICAgIHJlbGVhc2VWZXJzaW9uLFxuICAgIHJlbGVhc2U6IChyZWxlYXNlcyBhcyBUb29sY2hhaW5SZWxlYXNlW10pWzBdID8/IG51bGwsXG4gICAgYm9vdHN0cmFwOiBwbHVnaW5zLmZpbmQoKHApID0+IHAubmFtZSA9PT0gQk9PVFNUUkFQKSA/PyBudWxsLFxuICAgIHN5bnRoOiBwbHVnaW5zLmZpbmQoKHApID0+IHAubmFtZSA9PT0gU1lOVEgpID8/IG51bGwsXG4gIH07XG59XG5cbi8qKiBBIHNldHRpbmcgZm91bmQgb24gdGhlIGNhbGxlcidzIGNoYWluOiB3aGljaCBjaGFpbiBpbmRleCwgYW5kIGl0cyByZWxlYXNlLiAqL1xuaW50ZXJmYWNlIENoYWluU2V0dGluZyB7IGRlcHRoOiBudW1iZXI7IHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcgfVxuXG4vKiogVGhlIE5FQVJFU1Qgcm93IG9mIGB0YWJsZWAgKGtleWVkIGJ5IGBvcmdfaWRgKSBvbiBgY2hhaW5gIChvd24gb3JnIGZpcnN0KS4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5lYXJlc3RPbkNoYWluKFxuICBkYjogVG9vbGNoYWluRGIsXG4gIHRhYmxlOiB0eXBlb2Ygc2NoZW1hLm9yZ1Rvb2xjaGFpbkRlZmF1bHQgfCB0eXBlb2Ygc2NoZW1hLnRvb2xjaGFpblJvbGxvdXQsXG4gIGNoYWluOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8Q2hhaW5TZXR0aW5nIHwgbnVsbD4ge1xuICBpZiAoY2hhaW4ubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IGRiLnNlbGVjdCh7IG9yZ0lkOiB0YWJsZS5vcmdJZCwgcmVsZWFzZVZlcnNpb246IHRhYmxlLnJlbGVhc2VWZXJzaW9uIH0pXG4gICAgLmZyb20odGFibGUpXG4gICAgLndoZXJlKGluQXJyYXkoc3FsPHN0cmluZz5gbG93ZXIoJHt0YWJsZS5vcmdJZH0pYCwgWy4uLmNoYWluXSkpIGFzIEFycmF5PHsgb3JnSWQ6IHN0cmluZzsgcmVsZWFzZVZlcnNpb246IHN0cmluZyB9PjtcbiAgbGV0IGJlc3Q6IENoYWluU2V0dGluZyB8IG51bGwgPSBudWxsO1xuICBmb3IgKGNvbnN0IHIgb2Ygcm93cykge1xuICAgIGNvbnN0IGRlcHRoID0gY2hhaW4uaW5kZXhPZihyLm9yZ0lkLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmIChkZXB0aCA+PSAwICYmICghYmVzdCB8fCBkZXB0aCA8IGJlc3QuZGVwdGgpKSBiZXN0ID0geyBkZXB0aCwgcmVsZWFzZVZlcnNpb246IHIucmVsZWFzZVZlcnNpb24gfTtcbiAgfVxuICByZXR1cm4gYmVzdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3VycmVudFBsYXRmb3JtRGVmYXVsdChkYjogVG9vbGNoYWluRGIpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IGRiLnNlbGVjdCh7IHJlbGVhc2VWZXJzaW9uOiBzY2hlbWEudG9vbGNoYWluUGxhdGZvcm1EZWZhdWx0LnJlbGVhc2VWZXJzaW9uIH0pXG4gICAgLmZyb20oc2NoZW1hLnRvb2xjaGFpblBsYXRmb3JtRGVmYXVsdCkubGltaXQoMSkgYXMgQXJyYXk8eyByZWxlYXNlVmVyc2lvbjogc3RyaW5nIH0+O1xuICByZXR1cm4gcm93c1swXT8ucmVsZWFzZVZlcnNpb24gPz8gbnVsbDtcbn1cblxuLyoqIFdoZXRoZXIgYHJlbGVhc2VWZXJzaW9uYCBoYXMgZXZlciBiZWVuIChvciBpcykgdGhlIHBsYXRmb3JtIGRlZmF1bHQuICovXG5hc3luYyBmdW5jdGlvbiB3YXNQbGF0Zm9ybURlZmF1bHQoZGI6IFRvb2xjaGFpbkRiLCByZWxlYXNlVmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IFtoaXN0b3J5LCBjdXJyZW50XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBkYi5zZWxlY3QoeyBpZDogc2NoZW1hLnRvb2xjaGFpbkRlZmF1bHRIaXN0b3J5LmlkIH0pLmZyb20oc2NoZW1hLnRvb2xjaGFpbkRlZmF1bHRIaXN0b3J5KVxuICAgICAgLndoZXJlKGVxKHNjaGVtYS50b29sY2hhaW5EZWZhdWx0SGlzdG9yeS5yZWxlYXNlVmVyc2lvbiwgcmVsZWFzZVZlcnNpb24pKS5saW1pdCgxKSxcbiAgICBjdXJyZW50UGxhdGZvcm1EZWZhdWx0KGRiKSxcbiAgXSk7XG4gIHJldHVybiAoaGlzdG9yeSBhcyB1bmtub3duW10pLmxlbmd0aCA+IDAgfHwgY3VycmVudCA9PT0gcmVsZWFzZVZlcnNpb247XG59XG5cbi8qKiBXaGV0aGVyIEFOWSBvcmcgaGFzIGFuIG9yZyBkZWZhdWx0IG9yIGEgY2FuYXJ5IG1lbWJlcnNoaXAgKGVsc2Ugbm8gd2FsayBpcyBuZWVkZWQpLiAqL1xuYXN5bmMgZnVuY3Rpb24gYW55T3JnU2V0dGluZ3MoZGI6IFRvb2xjaGFpbkRiKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IFtkZWZhdWx0cywgcm9sbG91dF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZGIuc2VsZWN0KHsgb3JnSWQ6IHNjaGVtYS5vcmdUb29sY2hhaW5EZWZhdWx0Lm9yZ0lkIH0pLmZyb20oc2NoZW1hLm9yZ1Rvb2xjaGFpbkRlZmF1bHQpLmxpbWl0KDEpLFxuICAgIGRiLnNlbGVjdCh7IG9yZ0lkOiBzY2hlbWEudG9vbGNoYWluUm9sbG91dC5vcmdJZCB9KS5mcm9tKHNjaGVtYS50b29sY2hhaW5Sb2xsb3V0KS5saW1pdCgxKSxcbiAgXSk7XG4gIHJldHVybiAoZGVmYXVsdHMgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwIHx8IChyb2xsb3V0IGFzIHVua25vd25bXSkubGVuZ3RoID4gMDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBvcmcgY2hhaW4gKGNhbGxlciDihpIg4oCmIOKGkiByb290KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBUaGUgY2FsbGVyJ3MgY2hhaW4sIG93biBvcmcgZmlyc3QsIGxvd2VyY2FzZWQ6IGBbc2VsZiwgcGFyZW50LCDigKYsIHJvb3RdYC5cbiAqIFRoZSBzYW1lIHBhcmVudCB3YWxrIGFzIGBvcmctcmVhY2hhYmlsaXR5LnRzYCAocGxhdGZvcm0nc1xuICogYEdFVCAvb3JnYW5pemF0aW9uLzppZC9wYXJlbnRgKSwgY3ljbGUtc2FmZSBhbmQgY2FwcGVkIGF0IGBNQVhfT1JHX0RFUFRIYCBsaWtlXG4gKiBgcmVwb3J0aW5nLXJldGVudGlvbi50c2Ag4oCUIGJ1dCBGQUlMLUNMT1NFRDogYSBsb29rdXAgZmFpbHVyZSwgYSBjeWNsZSBvciBhblxuICogb3Zlci1kZWVwIGNoYWluIHRocm93cyByYXRoZXIgdGhhbiByZXNvbHZpbmcgdGhlIHdyb25nIG9yZydzIHRvb2xjaGFpbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvb2xjaGFpbk9yZ0NoYWluKG9yZ0lkOiBzdHJpbmcsIGdldFBhcmVudDogR2V0UGFyZW50T3JnSWQpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHNlbGYgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBjaGFpbiA9IFtzZWxmXTtcbiAgaWYgKGlzU3lzdGVtT3JnSWQoc2VsZikpIHJldHVybiBjaGFpbjtcbiAgbGV0IGN1cnJlbnQgPSBzZWxmO1xuICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgTUFYX09SR19ERVBUSDsgZGVwdGgrKykge1xuICAgIGNvbnN0IHBhcmVudCA9IHRvT3JnSWRTdHJpbmcoYXdhaXQgZ2V0UGFyZW50KGN1cnJlbnQpKT8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQgPT09IGN1cnJlbnQpIHJldHVybiBjaGFpbjtcbiAgICBpZiAoY2hhaW4uaW5jbHVkZXMocGFyZW50KSkge1xuICAgICAgdGhyb3cgbmV3IE1hbmFnZWRUb29sY2hhaW5FcnJvcihFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsICdUaGUgb3JnYW5pemF0aW9uIGhpZXJhcmNoeSBoYXMgYSBjeWNsZTsgdGhlIHRvb2xjaGFpbiByZWxlYXNlIGNhbm5vdCBiZSByZXNvbHZlZC4nLCB7IG9yZ0lkOiBzZWxmIH0pO1xuICAgIH1cbiAgICBjaGFpbi5wdXNoKHBhcmVudCk7XG4gICAgY3VycmVudCA9IHBhcmVudDtcbiAgfVxuICB0aHJvdyBuZXcgTWFuYWdlZFRvb2xjaGFpbkVycm9yKEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiwgYFRoZSBvcmdhbml6YXRpb24gaGllcmFyY2h5IGlzIGRlZXBlciB0aGFuICR7TUFYX09SR19ERVBUSH07IHRoZSB0b29sY2hhaW4gcmVsZWFzZSBjYW5ub3QgYmUgcmVzb2x2ZWQuYCwgeyBvcmdJZDogc2VsZiB9KTtcbn1cblxuLyoqIFBhcmVudCBsb29rdXBzIGFyZSBjYWNoZWQgYnJpZWZseTogb25lIHN5bnRoIG1ha2VzIHNldmVyYWwgbG9va3VwcyBmb3IgdGhlIHNhbWUgb3JnLiAqL1xuY29uc3QgUEFSRU5UX0NBQ0hFX1RUTF9NUyA9IDMwXzAwMDtcbmNvbnN0IFBBUkVOVF9DQUNIRV9NQVggPSA1XzAwMDtcbmNvbnN0IHBhcmVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgcGFyZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7IGF0OiBudW1iZXIgfT4oKTtcblxuYXN5bmMgZnVuY3Rpb24gcGxhdGZvcm1QYXJlbnQob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGhpdCA9IHBhcmVudENhY2hlLmdldChvcmdJZCk7XG4gIGlmIChoaXQgJiYgRGF0ZS5ub3coKSAtIGhpdC5hdCA8IFBBUkVOVF9DQUNIRV9UVExfTVMpIHJldHVybiBoaXQucGFyZW50O1xuICAvLyBBIHN5c3RlbS1zY29wZWQgc2VydmljZSB0b2tlbjsgYSBub24tMnh4IFRIUk9XUyAoZmFpbC1jbG9zZWQsIHNlZSB0b29sY2hhaW5PcmdDaGFpbikuXG4gIGNvbnN0IHBhcmVudCA9IGF3YWl0IGZldGNoUGFyZW50T3JnSWQob3JnSWQsIHsgYXV0aE9yZ0lkOiBTWVNURU1fT1JHX0lELCB0aHJvd09uSHR0cEVycm9yOiB0cnVlLCB0aW1lb3V0OiA1XzAwMCB9KTtcbiAgaWYgKHBhcmVudENhY2hlLnNpemUgPj0gUEFSRU5UX0NBQ0hFX01BWCkgcGFyZW50Q2FjaGUuY2xlYXIoKTtcbiAgcGFyZW50Q2FjaGUuc2V0KG9yZ0lkLCB7IHBhcmVudCwgYXQ6IERhdGUubm93KCkgfSk7XG4gIHJldHVybiBwYXJlbnQ7XG59XG5cbi8qKiBUZXN0IGhvb2s6IGRyb3AgY2FjaGVkIHBhcmVudCBsb29rdXBzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyVG9vbGNoYWluUGFyZW50Q2FjaGVGb3JUZXN0cygpOiB2b2lkIHtcbiAgcGFyZW50Q2FjaGUuY2xlYXIoKTtcbn1cblxuY29uc3QgcHJvZHVjdGlvbkRlcHM6IE1hbmFnZWRUb29sY2hhaW5EZXBzID0ge1xuICByZWFkOiAoZm4pID0+IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IGZuKHR4KSkpLFxuICBnZXRQYXJlbnQ6IHBsYXRmb3JtUGFyZW50LFxufTtcbmxldCBkZWZhdWx0RGVwczogTWFuYWdlZFRvb2xjaGFpbkRlcHMgPSBwcm9kdWN0aW9uRGVwcztcblxuLyoqIFRlc3QgaG9vazogcmVwbGFjZSB0aGUgcmVzb2x2ZXIncyByZWFkcyBhbmQgaGllcmFyY2h5IChudWxsIHJlc3RvcmVzIHByb2R1Y3Rpb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE1hbmFnZWRUb29sY2hhaW5EZXBzRm9yVGVzdHMoZGVwczogTWFuYWdlZFRvb2xjaGFpbkRlcHMgfCBudWxsKTogdm9pZCB7XG4gIGRlZmF1bHREZXBzID0gZGVwcyA/PyBwcm9kdWN0aW9uRGVwcztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExpZmVjeWNsZSwgZWxpZ2liaWxpdHkgYW5kIHRoZSBjYW5hcnkgZ3VhcmRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogV2h5IGEgc3RvcmVkIHJlbGVhc2UgaXMgbm90IExJVkUgKGVtcHR5ID0gbGl2ZTogYm90aCBoYWx2ZXMgcHJlc2VudCwgYWN0aXZlLCB1bnlhbmtlZCwgbm90IGRlcHJlY2F0ZWQpLiAqL1xuZXhwb3J0IHR5cGUgUmVsZWFzZUxpZmVjeWNsZVByb2JsZW0gPSAnbWlzc2luZycgfCAnaW5hY3RpdmUnIHwgJ3lhbmtlZCcgfCAnZGVwcmVjYXRlZCc7XG5cbmNvbnN0IGlzWWFua2VkID0gKHA6IFBsdWdpbikgPT4gcC55YW5rZWRBdCAhPT0gbnVsbCB8fCBwLmxpZmVjeWNsZSA9PT0gJ3lhbmtlZCc7XG5jb25zdCBpc0RlcHJlY2F0ZWQgPSAocDogUGx1Z2luKSA9PiBwLmRlcHJlY2F0ZWRBdCAhPT0gbnVsbCB8fCBwLmxpZmVjeWNsZSA9PT0gJ2RlcHJlY2F0ZWQnO1xuXG4vKiogV2hldGhlciBib3RoIGhhbHZlcyBhcmUgcHJlc2VudCAodGhlIHJlbGVhc2UgRVhJU1RTKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWxlYXNlRXhpc3RzKGg6IFJlbGVhc2VIYWx2ZXMpOiBoIGlzIFJlbGVhc2VIYWx2ZXMgJiB7IGJvb3RzdHJhcDogUGx1Z2luOyBzeW50aDogUGx1Z2luIH0ge1xuICByZXR1cm4gaC5yZWxlYXNlICE9PSBudWxsICYmIGguYm9vdHN0cmFwICE9PSBudWxsICYmIGguc3ludGggIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxlYXNlTGlmZWN5Y2xlUHJvYmxlbXMoaDogUmVsZWFzZUhhbHZlcyk6IFJlbGVhc2VMaWZlY3ljbGVQcm9ibGVtW10ge1xuICBpZiAoIXJlbGVhc2VFeGlzdHMoaCkpIHJldHVybiBbJ21pc3NpbmcnXTtcbiAgY29uc3QgaGFsdmVzID0gW2guYm9vdHN0cmFwLCBoLnN5bnRoXTtcbiAgY29uc3Qgb3V0OiBSZWxlYXNlTGlmZWN5Y2xlUHJvYmxlbVtdID0gW107XG4gIGlmIChoYWx2ZXMuc29tZSgocCkgPT4gIXAuaXNBY3RpdmUpKSBvdXQucHVzaCgnaW5hY3RpdmUnKTtcbiAgaWYgKGhhbHZlcy5zb21lKGlzWWFua2VkKSkgb3V0LnB1c2goJ3lhbmtlZCcpO1xuICBpZiAoaGFsdmVzLnNvbWUoaXNEZXByZWNhdGVkKSkgb3V0LnB1c2goJ2RlcHJlY2F0ZWQnKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUaGUgYm9vdHN0cmFwIGhhbGYncyB0b29sY2hhaW4gbWV0YWRhdGEgKGBwaXBlbGluZU1hbmFnZXJgLCBgYXdzQ2RrYCwg4oCmKSwgb3JcbiAqIG51bGwgd2hlbiBpdCBjYXJyaWVzIG5vIGNvbXBsZXRlLCB2YWxpZCBvbmUuIFVwbG9hZCBwZXJzaXN0cyBpdCBvbiB0aGUgcm93J3NcbiAqIGBtZXRhZGF0YWAgYXMgZmxhdCBgdG9vbGNoYWluLjxmaWVsZD5gIGtleXMgKGFwaS1jb3JlIGB0b29sY2hhaW5NZXRhZGF0YWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYm9vdHN0cmFwVG9vbGNoYWluT2Yocm93OiBQbHVnaW4gfCBudWxsIHwgdW5kZWZpbmVkKTogUGx1Z2luVG9vbGNoYWluIHwgbnVsbCB7XG4gIHJldHVybiByb3cgPyB0b29sY2hhaW5Gcm9tTWV0YWRhdGEocm93Lm1ldGFkYXRhKSA6IG51bGw7XG59XG5cbi8qKiBgUExVR0lOX1ZVTE5fTUFYX0ZJTkRJTkdTYCAoZGVmYXVsdCAwKTogdGhlIGZpeGFibGUtQ3JpdGljYWwgZmxvb3IgYSByZWxlYXNlIG11c3QgYmUgd2l0aGluLiAqL1xuZnVuY3Rpb24gdnVsbkZsb29yKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZJbnQoJ1BMVUdJTl9WVUxOX01BWF9GSU5ESU5HUycsIDAsIHsgbWluOiAwIH0pO1xufVxuXG4vKipcbiAqIFRoZSDCpzggY2FuZGlkYXRlIGd1YXJkcyAocGFpciwgc2NhbiwgbWV0YWRhdGEpIGEgcmVsZWFzZSBmYWlscywgYXMgdGhlaXJcbiAqIGVycm9yIGNvZGVzIOKAlCBlbXB0eSB3aGVuIGl0IHBhc3Nlcy4gVGhlIGNhbmFyeSBnYXRlIGFuZCBjb25jdXJyZW5jeSBhcmUgdGhlXG4gKiBwbGF0Zm9ybS1kZWZhdWx0IHNlcnZpY2UnczsgYSBjYW5hcnkgaXMgc2VydmVkIG9ubHkgd2hpbGUgdGhpcyBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2xjaGFpbkNhbmRpZGF0ZVByb2JsZW1zKGg6IFJlbGVhc2VIYWx2ZXMpOiBFcnJvckNvZGVbXSB7XG4gIGlmICghcmVsZWFzZUV4aXN0cyhoKSB8fCByZWxlYXNlTGlmZWN5Y2xlUHJvYmxlbXMoaCkubGVuZ3RoID4gMCkgcmV0dXJuIFtFcnJvckNvZGUuVE9PTENIQUlOX0dVQVJEX1BBSVJfSU5DT01QTEVURV07XG4gIGNvbnN0IG91dDogRXJyb3JDb2RlW10gPSBbXTtcbiAgY29uc3QgaGFsdmVzID0gW2guYm9vdHN0cmFwLCBoLnN5bnRoXTtcbiAgaWYgKGhhbHZlcy5zb21lKChwKSA9PiAhcC5zY2FubmVkQXQpKSBvdXQucHVzaChFcnJvckNvZGUuVE9PTENIQUlOX0dVQVJEX1VOU0NBTk5FRCk7XG4gIGVsc2UgaWYgKGhhbHZlcy5zb21lKChwKSA9PiAocC52dWxuQ3JpdGljYWxGaXhhYmxlID8/IDApID4gdnVsbkZsb29yKCkpKSBvdXQucHVzaChFcnJvckNvZGUuVE9PTENIQUlOX0dVQVJEX1ZVTE5fRkxPT1IpO1xuICBpZiAoIWJvb3RzdHJhcFRvb2xjaGFpbk9mKGguYm9vdHN0cmFwKSkgb3V0LnB1c2goRXJyb3JDb2RlLlRPT0xDSEFJTl9HVUFSRF9NRVRBREFUQSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBXYXJuaW5ncyBmb3IgYSByZWxlYXNlIHRoYXQgRVhJU1RTIGJ1dCBpcyBubyBsb25nZXIgKG9yIG5ldmVyIHdhcykgZWxpZ2libGUuICovXG5mdW5jdGlvbiBzdGFuZGluZ1dhcm5pbmdzKGg6IFJlbGVhc2VIYWx2ZXMgJiB7IGJvb3RzdHJhcDogUGx1Z2luOyBzeW50aDogUGx1Z2luIH0sIHByb21vdGVkOiBib29sZWFuLCB2aWE6IFRvb2xjaGFpblJlc29sdmVkVmlhKTogTWFuYWdlZFRvb2xjaGFpbldhcm5pbmdbXSB7XG4gIGNvbnN0IHJlZiA9IGBUb29sY2hhaW4gcmVsZWFzZSAke2gucmVsZWFzZVZlcnNpb259YDtcbiAgY29uc3Qgb3V0OiBNYW5hZ2VkVG9vbGNoYWluV2FybmluZ1tdID0gW107XG4gIGNvbnN0IHlhbmtlZCA9IFtoLmJvb3RzdHJhcCwgaC5zeW50aF0uZmluZChpc1lhbmtlZCk7XG4gIGlmICh5YW5rZWQpIHtcbiAgICBvdXQucHVzaCh7XG4gICAgICBjb2RlOiAnVE9PTENIQUlOX1JFTEVBU0VfWUFOS0VEJyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiBgJHtyZWZ9IGlzIHlhbmtlZCR7eWFua2VkLnlhbmtSZWFzb24gPyBgOiAke3lhbmtlZC55YW5rUmVhc29ufWAgOiAnJ30uIEl0IHJlc29sdmVzIG9ubHkgYmVjYXVzZSBpdCBpcyBzZWxlY3RlZCBleGFjdGx5OyBtb3ZlIHRvIGEgc3VwcG9ydGVkIHJlbGVhc2UuYCxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBkZXByZWNhdGVkID0gW2guYm9vdHN0cmFwLCBoLnN5bnRoXS5maW5kKGlzRGVwcmVjYXRlZCk7XG4gIGlmIChkZXByZWNhdGVkKSB7XG4gICAgb3V0LnB1c2goe1xuICAgICAgY29kZTogJ1RPT0xDSEFJTl9SRUxFQVNFX0RFUFJFQ0FURUQnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6IGAke3JlZn0gaXMgZGVwcmVjYXRlZCR7ZGVwcmVjYXRlZC5kZXByZWNhdGlvbk1lc3NhZ2UgPyBgOiAke2RlcHJlY2F0ZWQuZGVwcmVjYXRpb25NZXNzYWdlfWAgOiAnJ30uYCxcbiAgICB9KTtcbiAgfVxuICBpZiAoW2guYm9vdHN0cmFwLCBoLnN5bnRoXS5zb21lKChwKSA9PiAhcC5pc0FjdGl2ZSkpIHtcbiAgICBvdXQucHVzaCh7IGNvZGU6ICdUT09MQ0hBSU5fUkVMRUFTRV9JTkFDVElWRScsIHNldmVyaXR5OiAnd2FybmluZycsIG1lc3NhZ2U6IGAke3JlZn0gaXMgaW5hY3RpdmU7IG1vdmUgdG8gYSBzdXBwb3J0ZWQgcmVsZWFzZS5gIH0pO1xuICB9XG4gIGlmICghcHJvbW90ZWQgJiYgKHZpYSA9PT0gJ3BpbicgfHwgdmlhID09PSAnb3JnLWRlZmF1bHQnKSkge1xuICAgIG91dC5wdXNoKHtcbiAgICAgIGNvZGU6ICdUT09MQ0hBSU5fUkVMRUFTRV9OT1RfUFJPTU9URUQnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6IGAke3JlZn0gd2FzIG5ldmVyIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGFuZCBpcyBub3QgaW4gYSBjYW5hcnkgZm9yIHlvdXIgb3JnYW5pemF0aW9uOyBpdCByZXNvbHZlcyBvbmx5IGJlY2F1c2UgaXQgaXMgc2VsZWN0ZWQgZXhhY3RseS5gLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXNvbHV0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBwYWlyT2YoaDogUmVsZWFzZUhhbHZlcywgdmlhOiBUb29sY2hhaW5SZXNvbHZlZFZpYSk6IHsgYm9vdHN0cmFwOiBQbHVnaW47IHN5bnRoOiBQbHVnaW4gfSB7XG4gIGlmICghcmVsZWFzZUV4aXN0cyhoKSkge1xuICAgIC8vIEEgZGVmYXVsdCAocGxhdGZvcm0gb3Igb3JnKSB3aG9zZSBoYWx2ZXMgYXJlIGdvbmUgaXMgYSBicm9rZW4gaW52YXJpYW50XG4gICAgLy8gKGluLXVzZSBwcm90ZWN0aW9uIGNvdW50cyBkZWZhdWx0cyk6IHJlZnVzZWQsIG5ldmVyIHNlcnZlZC5cbiAgICB0aHJvdyBuZXcgTWFuYWdlZFRvb2xjaGFpbkVycm9yKEVycm9yQ29kZS5UT09MQ0hBSU5fUEFJUl9NSVNNQVRDSCwgYFRvb2xjaGFpbiByZWxlYXNlICR7aC5yZWxlYXNlVmVyc2lvbn0gKCR7dmlhfSkgaXMgaW5jb21wbGV0ZTsgaXQgaXMgbmV2ZXIgc2VydmVkLmAsIHtcbiAgICAgIHJlbGVhc2VWZXJzaW9uOiBoLnJlbGVhc2VWZXJzaW9uLFxuICAgICAgbWlzc2luZzogWy4uLihoLmJvb3RzdHJhcCA/IFtdIDogW0JPT1RTVFJBUF0pLCAuLi4oaC5zeW50aCA/IFtdIDogW1NZTlRIXSksIC4uLihoLnJlbGVhc2UgPyBbXSA6IFsndG9vbGNoYWluX3JlbGVhc2UnXSldLFxuICAgIH0pO1xuICB9XG4gIGlmIChoLmJvb3RzdHJhcC52ZXJzaW9uICE9PSBoLnJlbGVhc2VWZXJzaW9uIHx8IGguc3ludGgudmVyc2lvbiAhPT0gaC5yZWxlYXNlVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBNYW5hZ2VkVG9vbGNoYWluRXJyb3IoRXJyb3JDb2RlLlRPT0xDSEFJTl9QQUlSX01JU01BVENILCBgVG9vbGNoYWluIGhhbHZlcyBkaXNhZ3JlZSAoJHtCT09UU1RSQVB9QCR7aC5ib290c3RyYXAudmVyc2lvbn0sICR7U1lOVEh9QCR7aC5zeW50aC52ZXJzaW9ufSk7IG5ldmVyIHNlcnZlZC5gLCB7XG4gICAgICByZWxlYXNlVmVyc2lvbjogaC5yZWxlYXNlVmVyc2lvbixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4geyBib290c3RyYXA6IGguYm9vdHN0cmFwLCBzeW50aDogaC5zeW50aCB9O1xufVxuXG4vKiogVGhlIHJlc29sdXRpb24gaW5zaWRlIG9uZSBlbGV2YXRlZCByZWFkLCBvdmVyIGEga25vd24gY2hhaW4uICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlT25DaGFpbihkYjogVG9vbGNoYWluRGIsIGNoYWluOiByZWFkb25seSBzdHJpbmdbXSwgcmVsZWFzZVBpbj86IHN0cmluZyk6IFByb21pc2U8TWFuYWdlZFRvb2xjaGFpblJlc29sdXRpb24+IHtcbiAgY29uc3QgY2FuYXJ5ID0gYXdhaXQgbmVhcmVzdE9uQ2hhaW4oZGIsIHNjaGVtYS50b29sY2hhaW5Sb2xsb3V0LCBjaGFpbik7XG4gIGNvbnN0IGFuc3dlciA9IGFzeW5jIChoOiBSZWxlYXNlSGFsdmVzLCB2aWE6IFRvb2xjaGFpblJlc29sdmVkVmlhKTogUHJvbWlzZTxNYW5hZ2VkVG9vbGNoYWluUmVzb2x1dGlvbj4gPT4ge1xuICAgIGNvbnN0IHBhaXIgPSBwYWlyT2YoaCwgdmlhKTtcbiAgICBjb25zdCBwcm9tb3RlZCA9IHZpYSA9PT0gJ3BpbicgfHwgdmlhID09PSAnb3JnLWRlZmF1bHQnXG4gICAgICA/IChhd2FpdCB3YXNQbGF0Zm9ybURlZmF1bHQoZGIsIGgucmVsZWFzZVZlcnNpb24pKSB8fCBjYW5hcnk/LnJlbGVhc2VWZXJzaW9uID09PSBoLnJlbGVhc2VWZXJzaW9uXG4gICAgICA6IHRydWU7XG4gICAgcmV0dXJuIHsgcmVsZWFzZVZlcnNpb246IGgucmVsZWFzZVZlcnNpb24sIHJlc29sdmVkVmlhOiB2aWEsIC4uLnBhaXIsIHdhcm5pbmdzOiBzdGFuZGluZ1dhcm5pbmdzKHsgLi4uaCwgLi4ucGFpciB9LCBwcm9tb3RlZCwgdmlhKSB9O1xuICB9O1xuXG4gIGlmIChyZWxlYXNlUGluICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWlzVG9vbGNoYWluUmVsZWFzZVZlcnNpb24ocmVsZWFzZVBpbikpIHtcbiAgICAgIHRocm93IG5ldyBNYW5hZ2VkVG9vbGNoYWluRXJyb3IoRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1IsICdyZWxlYXNlUGluIG11c3QgYmUgYSByZWxlYXNlIHZlcnNpb24gKE1BSk9SLk1JTk9SLlBBVENILCBlLmcuIDEuNC4yKS4nLCB7IHJlbGVhc2VQaW4gfSk7XG4gICAgfVxuICAgIGNvbnN0IGggPSBhd2FpdCBsb2FkUmVsZWFzZUhhbHZlcyhkYiwgcmVsZWFzZVBpbik7XG4gICAgaWYgKCFyZWxlYXNlRXhpc3RzKGgpKSB7XG4gICAgICB0aHJvdyBuZXcgTWFuYWdlZFRvb2xjaGFpbkVycm9yKEVycm9yQ29kZS5OT1RfRk9VTkQsIGBUb29sY2hhaW4gcmVsZWFzZSAke3JlbGVhc2VQaW59IGRvZXMgbm90IGV4aXN0IChvciB3YXMgZGVsZXRlZCkuIFBpbiBhbiBlbGlnaWJsZSByZWxlYXNlLCBvciByZW1vdmUgdG9vbGNoYWluLnJlbGVhc2UgdG8gZm9sbG93IHlvdXIgb3JnYW5pemF0aW9uJ3MgZGVmYXVsdC5gLCB7XG4gICAgICAgIHJlYXNvbjogJ3Rvb2xjaGFpbl9yZWxlYXNlX25vdF9mb3VuZCcsIHJlbGVhc2VWZXJzaW9uOiByZWxlYXNlUGluLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhbnN3ZXIoaCwgJ3BpbicpO1xuICB9XG5cbiAgY29uc3Qgb3JnRGVmYXVsdCA9IGF3YWl0IG5lYXJlc3RPbkNoYWluKGRiLCBzY2hlbWEub3JnVG9vbGNoYWluRGVmYXVsdCwgY2hhaW4pO1xuICBpZiAob3JnRGVmYXVsdCkgcmV0dXJuIGFuc3dlcihhd2FpdCBsb2FkUmVsZWFzZUhhbHZlcyhkYiwgb3JnRGVmYXVsdC5yZWxlYXNlVmVyc2lvbiksICdvcmctZGVmYXVsdCcpO1xuXG4gIGlmIChjYW5hcnkpIHtcbiAgICBjb25zdCBoID0gYXdhaXQgbG9hZFJlbGVhc2VIYWx2ZXMoZGIsIGNhbmFyeS5yZWxlYXNlVmVyc2lvbik7XG4gICAgY29uc3QgcHJvYmxlbXMgPSB0b29sY2hhaW5DYW5kaWRhdGVQcm9ibGVtcyhoKTtcbiAgICBpZiAocHJvYmxlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gYW5zd2VyKGgsICdjYW5hcnknKTtcbiAgICAvLyBNZW1iZXJzIGZhbGwgdGhyb3VnaCB0byB0aGUgcGxhdGZvcm0gZGVmYXVsdC4gTG9nZ2VkLCBuZXZlciByZXR1cm5lZDpcbiAgICAvLyB0aGUgYW5zd2VyIG11c3Qgbm90IHJldmVhbCBjYW5hcnkgbWVtYmVyc2hpcC5cbiAgICBsb2dnZXIud2FybignQ2FuYXJ5IHRvb2xjaGFpbiByZWxlYXNlIGZhaWxzIGl0cyBndWFyZHM7IHNlcnZpbmcgdGhlIHBsYXRmb3JtIGRlZmF1bHQnLCB7IHJlbGVhc2VWZXJzaW9uOiBjYW5hcnkucmVsZWFzZVZlcnNpb24sIHByb2JsZW1zIH0pO1xuICB9XG5cbiAgY29uc3QgcGxhdGZvcm0gPSBhd2FpdCBjdXJyZW50UGxhdGZvcm1EZWZhdWx0KGRiKTtcbiAgaWYgKCFwbGF0Zm9ybSkge1xuICAgIHRocm93IG5ldyBNYW5hZ2VkVG9vbGNoYWluRXJyb3IoRXJyb3JDb2RlLlRPT0xDSEFJTl9OT19ERUZBVUxULCAnTm8gcGxhdGZvcm0gZGVmYXVsdCB0b29sY2hhaW4gcmVsZWFzZSBpcyBzZXQuIEFuIG9wZXJhdG9yIG11c3Qgc2V0IG9uZSAoaW5pdC1wbGF0Zm9ybSBkb2VzIHRoaXMgb24gYSBmcmVzaCBpbnN0YWxsKS4nKTtcbiAgfVxuICByZXR1cm4gYW5zd2VyKGF3YWl0IGxvYWRSZWxlYXNlSGFsdmVzKGRiLCBwbGF0Zm9ybSksICdkZWZhdWx0Jyk7XG59XG5cbi8qKiB7QGxpbmsgcmVzb2x2ZU1hbmFnZWRUb29sY2hhaW59IHdpdGggaW5qZWN0ZWQgcmVhZHMgYW5kIGhpZXJhcmNoeSAodGVzdHMpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNYW5hZ2VkVG9vbGNoYWluV2l0aChcbiAgZGVwczogTWFuYWdlZFRvb2xjaGFpbkRlcHMsXG4gIGNhbGxlcjogTWFuYWdlZFRvb2xjaGFpbkNhbGxlcixcbiAgb3B0czogeyByZWxlYXNlUGluPzogc3RyaW5nIH0gPSB7fSxcbik6IFByb21pc2U8TWFuYWdlZFRvb2xjaGFpblJlc29sdXRpb24+IHtcbiAgY29uc3Qgc2VsZiA9IGNhbGxlci5vcmdJZC50b0xvd2VyQ2FzZSgpO1xuICAvLyBXYWxrIHRoZSBoaWVyYXJjaHkgb25seSB3aGVuIHNvbWUgb3JnIGhhcyBhIHNldHRpbmcgKGFuZCBvdXRzaWRlIHRoZSB0cmFuc2FjdGlvbikuXG4gIGNvbnN0IHdhbGsgPSBhd2FpdCBkZXBzLnJlYWQoKGRiKSA9PiBhbnlPcmdTZXR0aW5ncyhkYikpO1xuICBjb25zdCBjaGFpbiA9IHdhbGsgPyBhd2FpdCB0b29sY2hhaW5PcmdDaGFpbihzZWxmLCBkZXBzLmdldFBhcmVudCkgOiBbc2VsZl07XG4gIHJldHVybiBkZXBzLnJlYWQoKGRiKSA9PiByZXNvbHZlT25DaGFpbihkYiwgY2hhaW4sIG9wdHMucmVsZWFzZVBpbikpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIG1hbmFnZWQgdG9vbGNoYWluIHJlbGVhc2UgZm9yIGBjYWxsZXJgIChzZWUgdGhlIG1vZHVsZSBkb2MpLlxuICogVGhyb3dzIHtAbGluayBNYW5hZ2VkVG9vbGNoYWluRXJyb3J9OiBUT09MQ0hBSU5fTk9fREVGQVVMVCAoNDA5LCBubyBwbGF0Zm9ybVxuICogZGVmYXVsdCksIE5PVF9GT1VORCAoNDA0LCBhIG1pc3NpbmcgLyBkZWxldGVkIHBpbiksIFRPT0xDSEFJTl9QQUlSX01JU01BVENIXG4gKiAoNTAwKSwgVkFMSURBVElPTl9FUlJPUiAoNDAwLCBhIG1hbGZvcm1lZCBwaW4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1hbmFnZWRUb29sY2hhaW4oY2FsbGVyOiBNYW5hZ2VkVG9vbGNoYWluQ2FsbGVyLCBvcHRzOiB7IHJlbGVhc2VQaW4/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxNYW5hZ2VkVG9vbGNoYWluUmVzb2x1dGlvbj4ge1xuICByZXR1cm4gcmVzb2x2ZU1hbmFnZWRUb29sY2hhaW5XaXRoKGRlZmF1bHREZXBzLCBjYWxsZXIsIG9wdHMpO1xufVxuXG4vKioge0BsaW5rIGlzRWxpZ2libGVSZWxlYXNlfSB3aXRoIGluamVjdGVkIHJlYWRzIGFuZCBoaWVyYXJjaHkgKHRlc3RzKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0VsaWdpYmxlUmVsZWFzZVdpdGgoZGVwczogTWFuYWdlZFRvb2xjaGFpbkRlcHMsIG9yZ0lkOiBzdHJpbmcsIHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKCFpc1Rvb2xjaGFpblJlbGVhc2VWZXJzaW9uKHJlbGVhc2VWZXJzaW9uKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzZWxmID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaGFsdmVzID0gYXdhaXQgZGVwcy5yZWFkKChkYikgPT4gbG9hZFJlbGVhc2VIYWx2ZXMoZGIsIHJlbGVhc2VWZXJzaW9uKSk7XG4gIGlmIChyZWxlYXNlTGlmZWN5Y2xlUHJvYmxlbXMoaGFsdmVzKS5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhd2FpdCBkZXBzLnJlYWQoKGRiKSA9PiB3YXNQbGF0Zm9ybURlZmF1bHQoZGIsIHJlbGVhc2VWZXJzaW9uKSkpIHJldHVybiB0cnVlO1xuICBjb25zdCB3YWxrID0gYXdhaXQgZGVwcy5yZWFkKChkYikgPT4gYW55T3JnU2V0dGluZ3MoZGIpKTtcbiAgaWYgKCF3YWxrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGNoYWluID0gYXdhaXQgdG9vbGNoYWluT3JnQ2hhaW4oc2VsZiwgZGVwcy5nZXRQYXJlbnQpO1xuICBjb25zdCBjYW5hcnkgPSBhd2FpdCBkZXBzLnJlYWQoKGRiKSA9PiBuZWFyZXN0T25DaGFpbihkYiwgc2NoZW1hLnRvb2xjaGFpblJvbGxvdXQsIGNoYWluKSk7XG4gIHJldHVybiBjYW5hcnk/LnJlbGVhc2VWZXJzaW9uID09PSByZWxlYXNlVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBEMTU6IHdoZXRoZXIgYG9yZ0lkYCBtYXkgU0VUIGByZWxlYXNlVmVyc2lvbmAgYXMgYSBwaXBlbGluZSBwaW4gb3IgaXRzIG9yZ1xuICogZGVmYXVsdCDigJQgYm90aCBoYWx2ZXMgbGl2ZSAoYWN0aXZlLCB1bnlhbmtlZCwgbm90IGRlcHJlY2F0ZWQpIEFORCBlaXRoZXIgaXRcbiAqIGhhcyBiZWVuIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IG9yIGl0IGlzIHRoZSBjYWxsZXIncyBjYW5hcnkgKG5lYXJlc3RcbiAqIG1lbWJlcnNoaXAgb24gaXRzIGNoYWluKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWxpZ2libGVSZWxlYXNlKG9yZ0lkOiBzdHJpbmcsIHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGlzRWxpZ2libGVSZWxlYXNlV2l0aChkZWZhdWx0RGVwcywgb3JnSWQsIHJlbGVhc2VWZXJzaW9uKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBvcmcncyBvd24gcGljdHVyZTogdGhlIG9yZy1kZWZhdWx0IHBhbmVsIGFuZCB0aGUgZWxpZ2libGUtcmVsZWFzZSBsaXN0XG4vLyAoZG9jcy9wbGFucy9ib290c3RyYXAtaW1hZ2UtdmVyc2lvbmluZy5tZCDCpzUsIFBoYXNlIDQsIEQxNSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogV2hhdCB0aGUgb3JnLWRlZmF1bHQgcGFuZWwgc2hvd3MgYSBjYWxsZXIgYWJvdXQgSVRTIE9XTiBvcmc6IG5ldmVyIGFub3RoZXJcbiAqIG9yZydzIGNob2ljZSwgYW5kIG9mIHRoZSBhbmNlc3RvcnMgb25seSB3aGljaCBvbmUncyBkZWZhdWx0IGFwcGxpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JnVG9vbGNoYWluT3ZlcnZpZXcge1xuICAvKiogVGhlIGNhbGxlcidzIGNoYWluLCBvd24gb3JnIGZpcnN0IChsb3dlcmNhc2VkKS4gKi9cbiAgY2hhaW46IHN0cmluZ1tdO1xuICAvKiogV2hhdCB0aGUgb3JnJ3MgVU5QSU5ORUQgcGlwZWxpbmVzIHJlc29sdmUgdG8gbm93LiAqL1xuICBlZmZlY3RpdmU6IHsgcmVsZWFzZVZlcnNpb246IHN0cmluZzsgcmVzb2x2ZWRWaWE6IFRvb2xjaGFpblJlc29sdmVkVmlhOyB3YXJuaW5nczogTWFuYWdlZFRvb2xjaGFpbldhcm5pbmdbXSB9O1xuICAvKiogVGhlIGNhbGxlciBvcmcncyBvd24gYG9yZ190b29sY2hhaW5fZGVmYXVsdGAgcm93LCBpZiBpdCBzZXQgb25lLiAqL1xuICBvd25EZWZhdWx0OiBPcmdUb29sY2hhaW5EZWZhdWx0IHwgbnVsbDtcbiAgLyoqIFRoZSBhbmNlc3RvciB3aG9zZSBvcmcgZGVmYXVsdCBhcHBsaWVzLCB3aGVuIHRoZSBvcmcgc2V0IG5vbmUgb2YgaXRzIG93bi4gKi9cbiAgaW5oZXJpdGVkRnJvbTogeyBvcmdJZDogc3RyaW5nOyByZWxlYXNlVmVyc2lvbjogc3RyaW5nIH0gfCBudWxsO1xuICAvKiogVGhlIGNhbGxlcidzIGNhbmFyeSByZWxlYXNlIChpdHMgTkVBUkVTVCBtZW1iZXJzaGlwIG9uIHRoZSBjaGFpbiksIG9yIG51bGwuICovXG4gIGNhbmFyeVJlbGVhc2U6IHN0cmluZyB8IG51bGw7XG4gIHBsYXRmb3JtRGVmYXVsdDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIHtAbGluayByZWFkT3JnVG9vbGNoYWluT3ZlcnZpZXd9IHdpdGggaW5qZWN0ZWQgcmVhZHMgYW5kIGhpZXJhcmNoeSAodGVzdHMpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRPcmdUb29sY2hhaW5PdmVydmlld1dpdGgoZGVwczogTWFuYWdlZFRvb2xjaGFpbkRlcHMsIG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPE9yZ1Rvb2xjaGFpbk92ZXJ2aWV3PiB7XG4gIGNvbnN0IHNlbGYgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCB3YWxrID0gYXdhaXQgZGVwcy5yZWFkKChkYikgPT4gYW55T3JnU2V0dGluZ3MoZGIpKTtcbiAgY29uc3QgY2hhaW4gPSB3YWxrID8gYXdhaXQgdG9vbGNoYWluT3JnQ2hhaW4oc2VsZiwgZGVwcy5nZXRQYXJlbnQpIDogW3NlbGZdO1xuICByZXR1cm4gZGVwcy5yZWFkKGFzeW5jIChkYikgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS5vcmdUb29sY2hhaW5EZWZhdWx0KVxuICAgICAgLndoZXJlKGluQXJyYXkoc3FsPHN0cmluZz5gbG93ZXIoJHtzY2hlbWEub3JnVG9vbGNoYWluRGVmYXVsdC5vcmdJZH0pYCwgY2hhaW4pKSBhcyBPcmdUb29sY2hhaW5EZWZhdWx0W107XG4gICAgY29uc3QgZGVwdGhPZiA9IChyOiBPcmdUb29sY2hhaW5EZWZhdWx0KSA9PiBjaGFpbi5pbmRleE9mKHIub3JnSWQudG9Mb3dlckNhc2UoKSk7XG4gICAgY29uc3Qgb3duRGVmYXVsdCA9IHJvd3MuZmluZCgocikgPT4gZGVwdGhPZihyKSA9PT0gMCkgPz8gbnVsbDtcbiAgICBjb25zdCBuZWFyZXN0ID0gcm93cy5maWx0ZXIoKHIpID0+IGRlcHRoT2YocikgPj0gMCkuc29ydCgoYSwgYikgPT4gZGVwdGhPZihhKSAtIGRlcHRoT2YoYikpWzBdID8/IG51bGw7XG4gICAgY29uc3QgW2NhbmFyeSwgcGxhdGZvcm1EZWZhdWx0LCByZXNvbHV0aW9uXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIG5lYXJlc3RPbkNoYWluKGRiLCBzY2hlbWEudG9vbGNoYWluUm9sbG91dCwgY2hhaW4pLFxuICAgICAgY3VycmVudFBsYXRmb3JtRGVmYXVsdChkYiksXG4gICAgICByZXNvbHZlT25DaGFpbihkYiwgY2hhaW4pLFxuICAgIF0pO1xuICAgIHJldHVybiB7XG4gICAgICBjaGFpbixcbiAgICAgIGVmZmVjdGl2ZTogeyByZWxlYXNlVmVyc2lvbjogcmVzb2x1dGlvbi5yZWxlYXNlVmVyc2lvbiwgcmVzb2x2ZWRWaWE6IHJlc29sdXRpb24ucmVzb2x2ZWRWaWEsIHdhcm5pbmdzOiByZXNvbHV0aW9uLndhcm5pbmdzIH0sXG4gICAgICBvd25EZWZhdWx0LFxuICAgICAgaW5oZXJpdGVkRnJvbTogIW93bkRlZmF1bHQgJiYgbmVhcmVzdCA/IHsgb3JnSWQ6IG5lYXJlc3Qub3JnSWQsIHJlbGVhc2VWZXJzaW9uOiBuZWFyZXN0LnJlbGVhc2VWZXJzaW9uIH0gOiBudWxsLFxuICAgICAgY2FuYXJ5UmVsZWFzZTogY2FuYXJ5Py5yZWxlYXNlVmVyc2lvbiA/PyBudWxsLFxuICAgICAgcGxhdGZvcm1EZWZhdWx0LFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBjYWxsZXIgb3JnJ3MgdG9vbGNoYWluIG92ZXJ2aWV3IChlbGV2YXRlZCByZWFkcywgdGhlIHNhbWUgY2hhaW4gd2FsayBhbmRcbiAqIHByZWNlZGVuY2UgYXMge0BsaW5rIHJlc29sdmVNYW5hZ2VkVG9vbGNoYWlufSkuIFRocm93cyB3aGF0IHRoZSByZXNvbHZlclxuICogdGhyb3dzIOKAlCBUT09MQ0hBSU5fTk9fREVGQVVMVCAoNDA5KSB3aGVuIG5vdGhpbmcgcmVzb2x2ZXMgYXQgYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZE9yZ1Rvb2xjaGFpbk92ZXJ2aWV3KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPE9yZ1Rvb2xjaGFpbk92ZXJ2aWV3PiB7XG4gIHJldHVybiByZWFkT3JnVG9vbGNoYWluT3ZlcnZpZXdXaXRoKGRlZmF1bHREZXBzLCBvcmdJZCk7XG59XG5cbi8qKiBPbmUgcmVsZWFzZSB0aGUgY2FsbGVyIG1heSBwaW4gb3Igc2V0IChEMTUpLCB3aXRoIHdoYXQgdGhlIHNlbGVjdG9ycyBzaG93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbGlnaWJsZVRvb2xjaGFpblJlbGVhc2Uge1xuICByZWxlYXNlVmVyc2lvbjogc3RyaW5nO1xuICByZWxlYXNlOiBUb29sY2hhaW5SZWxlYXNlO1xuICBib290c3RyYXA6IFBsdWdpbjtcbiAgc3ludGg6IFBsdWdpbjtcbiAgLyoqIFRIRSBwbGF0Zm9ybSBkZWZhdWx0IG5vdy4gKi9cbiAgaXNQbGF0Zm9ybURlZmF1bHQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgY2FsbGVyJ3MgY2FuYXJ5IHJlbGVhc2UgKG5lYXJlc3QgbWVtYmVyc2hpcCkuICovXG4gIGlzQ2FuYXJ5OiBib29sZWFuO1xufVxuXG4vKioge0BsaW5rIGxpc3RFbGlnaWJsZVJlbGVhc2VzfSB3aXRoIGluamVjdGVkIHJlYWRzIGFuZCBoaWVyYXJjaHkgKHRlc3RzKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0RWxpZ2libGVSZWxlYXNlc1dpdGgoZGVwczogTWFuYWdlZFRvb2xjaGFpbkRlcHMsIG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHsgcGxhdGZvcm1EZWZhdWx0OiBzdHJpbmcgfCBudWxsOyByZWxlYXNlczogRWxpZ2libGVUb29sY2hhaW5SZWxlYXNlW10gfT4ge1xuICBjb25zdCBzZWxmID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgd2FsayA9IGF3YWl0IGRlcHMucmVhZCgoZGIpID0+IGFueU9yZ1NldHRpbmdzKGRiKSk7XG4gIGNvbnN0IGNoYWluID0gd2FsayA/IGF3YWl0IHRvb2xjaGFpbk9yZ0NoYWluKHNlbGYsIGRlcHMuZ2V0UGFyZW50KSA6IFtzZWxmXTtcbiAgcmV0dXJuIGRlcHMucmVhZChhc3luYyAoZGIpID0+IHtcbiAgICBjb25zdCBbcmVsZWFzZXMsIHJvd3MsIGhpc3RvcnksIHBsYXRmb3JtRGVmYXVsdCwgY2FuYXJ5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnRvb2xjaGFpblJlbGVhc2UpIGFzIFByb21pc2U8VG9vbGNoYWluUmVsZWFzZVtdPixcbiAgICAgIGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnBsdWdpbikud2hlcmUoYW5kKFxuICAgICAgICBzcWxgbG93ZXIoJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSkgPSAke1NZU1RFTV9PUkdfSUR9YCxcbiAgICAgICAgaW5BcnJheShzY2hlbWEucGx1Z2luLm5hbWUsIFsuLi5NQU5BR0VEX1RPT0xDSEFJTl9QTFVHSU5TXSksXG4gICAgICAgIGlzTnVsbChzY2hlbWEucGx1Z2luLmRlbGV0ZWRBdCksXG4gICAgICApKSBhcyBQcm9taXNlPFBsdWdpbltdPixcbiAgICAgIGRiLnNlbGVjdCh7IHJlbGVhc2VWZXJzaW9uOiBzY2hlbWEudG9vbGNoYWluRGVmYXVsdEhpc3RvcnkucmVsZWFzZVZlcnNpb24gfSkuZnJvbShzY2hlbWEudG9vbGNoYWluRGVmYXVsdEhpc3RvcnkpIGFzIFByb21pc2U8QXJyYXk8eyByZWxlYXNlVmVyc2lvbjogc3RyaW5nIH0+PixcbiAgICAgIGN1cnJlbnRQbGF0Zm9ybURlZmF1bHQoZGIpLFxuICAgICAgbmVhcmVzdE9uQ2hhaW4oZGIsIHNjaGVtYS50b29sY2hhaW5Sb2xsb3V0LCBjaGFpbiksXG4gICAgXSk7XG4gICAgY29uc3QgcHJvbW90ZWQgPSBuZXcgU2V0KGhpc3RvcnkubWFwKChoKSA9PiBoLnJlbGVhc2VWZXJzaW9uKSk7XG4gICAgaWYgKHBsYXRmb3JtRGVmYXVsdCkgcHJvbW90ZWQuYWRkKHBsYXRmb3JtRGVmYXVsdCk7XG4gICAgY29uc3Qgb3V0OiBFbGlnaWJsZVRvb2xjaGFpblJlbGVhc2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmVsZWFzZSBvZiByZWxlYXNlcykge1xuICAgICAgY29uc3QgdiA9IHJlbGVhc2UucmVsZWFzZVZlcnNpb247XG4gICAgICBjb25zdCBoYWx2ZXM6IFJlbGVhc2VIYWx2ZXMgPSB7XG4gICAgICAgIHJlbGVhc2VWZXJzaW9uOiB2LFxuICAgICAgICByZWxlYXNlLFxuICAgICAgICBib290c3RyYXA6IHJvd3MuZmluZCgocCkgPT4gcC5uYW1lID09PSBCT09UU1RSQVAgJiYgcC52ZXJzaW9uID09PSB2KSA/PyBudWxsLFxuICAgICAgICBzeW50aDogcm93cy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFNZTlRIICYmIHAudmVyc2lvbiA9PT0gdikgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgICBpZiAoIXJlbGVhc2VFeGlzdHMoaGFsdmVzKSB8fCByZWxlYXNlTGlmZWN5Y2xlUHJvYmxlbXMoaGFsdmVzKS5sZW5ndGggPiAwKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGlzQ2FuYXJ5ID0gY2FuYXJ5Py5yZWxlYXNlVmVyc2lvbiA9PT0gdjtcbiAgICAgIGlmICghcHJvbW90ZWQuaGFzKHYpICYmICFpc0NhbmFyeSkgY29udGludWU7XG4gICAgICBvdXQucHVzaCh7IHJlbGVhc2VWZXJzaW9uOiB2LCByZWxlYXNlLCBib290c3RyYXA6IGhhbHZlcy5ib290c3RyYXAsIHN5bnRoOiBoYWx2ZXMuc3ludGgsIGlzUGxhdGZvcm1EZWZhdWx0OiBwbGF0Zm9ybURlZmF1bHQgPT09IHYsIGlzQ2FuYXJ5IH0pO1xuICAgIH1cbiAgICBvdXQuc29ydCgoYSwgYikgPT4gY29tcGFyZVNlbXZlcihiLnJlbGVhc2VWZXJzaW9uLCBhLnJlbGVhc2VWZXJzaW9uKSk7XG4gICAgcmV0dXJuIHsgcGxhdGZvcm1EZWZhdWx0LCByZWxlYXNlczogb3V0IH07XG4gIH0pO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHJlbGVhc2UgYG9yZ0lkYCBtYXkgU0VUIGFzIGEgcGlwZWxpbmUgcGluIG9yIGl0cyBvcmcgZGVmYXVsdCAoRDE1LCB0aGVcbiAqIHNhbWUgcnVsZSBhcyB7QGxpbmsgaXNFbGlnaWJsZVJlbGVhc2V9KSwgbmV3ZXN0IGZpcnN0LiBOZXZlciBhbm90aGVyIG9yZydzXG4gKiBkYXRhOiBhIGNhbmFyeSBhcHBlYXJzIG9ubHkgd2hlbiBpdCBpcyB0aGUgY2FsbGVyJ3Mgb3duIChuZWFyZXN0KSBtZW1iZXJzaGlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdEVsaWdpYmxlUmVsZWFzZXMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8eyBwbGF0Zm9ybURlZmF1bHQ6IHN0cmluZyB8IG51bGw7IHJlbGVhc2VzOiBFbGlnaWJsZVRvb2xjaGFpblJlbGVhc2VbXSB9PiB7XG4gIHJldHVybiBsaXN0RWxpZ2libGVSZWxlYXNlc1dpdGgoZGVmYXVsdERlcHMsIG9yZ0lkKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENhbGxlciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogVGhlIHJlc29sdmVyJ3MgZXJyb3IgYXMgdGhlIHJlZnVzYWwgc2hhcGUgc3RlcCByZXNvbHV0aW9uIHJlcG9ydHMgKGNvbnRyYWN0IGNoZWNrLCBkZWNsYXJlZCBzaWRlLCBmYWN0cykuICovXG5leHBvcnQgZnVuY3Rpb24gbWFuYWdlZFRvb2xjaGFpblJlZnVzYWwoZXJyOiBNYW5hZ2VkVG9vbGNoYWluRXJyb3IpOiBSZXNvbHV0aW9uUmVmdXNhbCB7XG4gIHN3aXRjaCAoZXJyLmNvZGUpIHtcbiAgICBjYXNlIEVycm9yQ29kZS5OT1RfRk9VTkQ6XG4gICAgICByZXR1cm4geyBjb2RlOiAnTk9UX0ZPVU5EJywgcmVhc29uOiAndG9vbGNoYWluX3JlbGVhc2Vfbm90X2ZvdW5kJywgbWVzc2FnZTogZXJyLm1lc3NhZ2UsIC4uLihlcnIuZGV0YWlscyA/IHsgZGV0YWlsczogZXJyLmRldGFpbHMgfSA6IHt9KSB9O1xuICAgIGNhc2UgRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1I6XG4gICAgICByZXR1cm4geyBjb2RlOiAnTk9UX0ZPVU5EJywgcmVhc29uOiAndG9vbGNoYWluX3JlbGVhc2VfaW52YWxpZCcsIG1lc3NhZ2U6IGVyci5tZXNzYWdlLCAuLi4oZXJyLmRldGFpbHMgPyB7IGRldGFpbHM6IGVyci5kZXRhaWxzIH0gOiB7fSkgfTtcbiAgICBjYXNlIEVycm9yQ29kZS5UT09MQ0hBSU5fTk9fREVGQVVMVDpcbiAgICAgIHJldHVybiB7IGNvZGU6ICdQTFVHSU5fVU5BVkFJTEFCTEUnLCByZWFzb246ICd0b29sY2hhaW5fbm9fZGVmYXVsdCcsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IGNvZGU6ICdQTFVHSU5fVU5BVkFJTEFCTEUnLCByZWFzb246ICd0b29sY2hhaW5fdW5yZXNvbHZlZCcsIG1lc3NhZ2U6IGVyci5tZXNzYWdlLCAuLi4oZXJyLmRldGFpbHMgPyB7IGRldGFpbHM6IGVyci5kZXRhaWxzIH0gOiB7fSkgfTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmUgT05FIG1hbmFnZWQgaGFsZiBmb3IgYSBzdGVwOiB0aGUgcGx1Z2luIHJvdyBwbHVzIHRoZSByZXNvbHV0aW9uLCBvclxuICogdGhlIHJlZnVzYWwuIEFueSBub24tcmVzb2x2ZXIgZXJyb3IgKGEgZGF0YWJhc2Ugb3IgaGllcmFyY2h5IGZhaWx1cmUpXG4gKiBwcm9wYWdhdGVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU1hbmFnZWRUb29sY2hhaW5IYWxmKFxuICBjYWxsZXI6IE1hbmFnZWRUb29sY2hhaW5DYWxsZXIsXG4gIG5hbWU6IE1hbmFnZWRUb29sY2hhaW5QbHVnaW4sXG4gIG9wdHM6IHsgcmVsZWFzZVBpbj86IHN0cmluZyB9ID0ge30sXG4pOiBQcm9taXNlPHsgcGx1Z2luOiBQbHVnaW47IHJlc29sdXRpb246IE1hbmFnZWRUb29sY2hhaW5SZXNvbHV0aW9uIH0gfCB7IHJlZnVzYWw6IFJlc29sdXRpb25SZWZ1c2FsOyBlcnJvcjogTWFuYWdlZFRvb2xjaGFpbkVycm9yIH0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNvbHV0aW9uID0gYXdhaXQgcmVzb2x2ZU1hbmFnZWRUb29sY2hhaW4oY2FsbGVyLCBvcHRzKTtcbiAgICByZXR1cm4geyBwbHVnaW46IG5hbWUgPT09IEJPT1RTVFJBUCA/IHJlc29sdXRpb24uYm9vdHN0cmFwIDogcmVzb2x1dGlvbi5zeW50aCwgcmVzb2x1dGlvbiB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWFuYWdlZFRvb2xjaGFpbkVycm9yKSByZXR1cm4geyByZWZ1c2FsOiBtYW5hZ2VkVG9vbGNoYWluUmVmdXNhbChlcnIpLCBlcnJvcjogZXJyIH07XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iXX0=
443
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC10b29sY2hhaW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWFuYWdlZC10b29sY2hhaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQ0wsUUFBUSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQ2hILGlCQUFpQixFQUFFLHlCQUF5QixFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsaUNBQWlDLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxHQUVwSixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVELE9BQU8sRUFBRSxNQUFNLEVBQWdFLE1BQU0sK0JBQStCLENBQUM7QUFDckgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBc0JqRCxrSEFBa0g7QUFDbEgsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFFBQVE7SUFDakQsWUFBWSxJQUFlLEVBQUUsT0FBZSxFQUFFLE9BQWlDO1FBQzdFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBT0Qsb0VBQW9FO0FBQ3BFLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxPQUFnQjtJQUN4RCxPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxpQ0FB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QixDQUFDLEdBQTBCO0lBQ2hFLE1BQU0sQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBaUIsQ0FBQyxJQUFJLGtCQUFrQixDQUFDO0lBQ3ZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDakksQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxNQUE4QixFQUM5QixJQUE0QixFQUM1QixJQUFJLEdBQTRCLEVBQUU7SUFFbEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzlGLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxHQUFHLFlBQVkscUJBQXFCO1lBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDdkcsTUFBTSxHQUFHLENBQUM7SUFDWixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRIRSByZXNvbHZlciBmb3IgdGhlIG1hbmFnZWQgdG9vbGNoYWluIChkb2NzL3BsYW5zL2Jvb3RzdHJhcC1pbWFnZS12ZXJzaW9uaW5nLm1kXG4gKiDCpzIpLiBgcGlwZWxpbmUtYm9vdHN0cmFwQFZgIGFuZCBgY2RrLXN5bnRoQFZgIGFyZSB0d28gU1lTVEVNLU9SRyBwbHVnaW4gcm93c1xuICogdGhhdCBzaGFyZSBvbmUgcmVsZWFzZSB2ZXJzaW9uIGBWYDsgZXZlcnkgcGF0aCB0aGF0IGNhbiByZXNvbHZlIGEgbWFuYWdlZFxuICogbmFtZSBhbnN3ZXJzIGZyb20gaGVyZSBhbmQgbm90aGluZyBlbHNlIG1heTpcbiAqXG4gKiAgIHJlbGVhc2UgcGluIGdpdmVuIOKGkiB0aGF0IHJlbGVhc2UsIGlmIGl0IEVYSVNUUyAoeWFua2VkIC8gZGVwcmVjYXRlZCAvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgbmV2ZXItcHJvbW90ZWQgc3RpbGwgcmVzb2x2ZSwgd2l0aCBhIHdhcm5pbmc7IGRlbGV0ZWQg4oeSIDQwNClcbiAqICAgZWxzZSBvcmcgZGVmYXVsdCAg4oaSIHRoZSBORUFSRVNUIGBvcmdfdG9vbGNoYWluX2RlZmF1bHRgIHdhbGtpbmcgY2FsbGVyIOKGkiDigKYg4oaSIHJvb3RcbiAqICAgZWxzZSBjYW5hcnkgICAgICAg4oaSIHRoZSBORUFSRVNUIGB0b29sY2hhaW5fcm9sbG91dGAgbWVtYmVyc2hpcCwgc2VydmVkIG9ubHlcbiAqICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBpdCBwYXNzZXMgdGhlIHNjYW4gKyBtZXRhZGF0YSBndWFyZHNcbiAqICAgZWxzZSBwbGF0Zm9ybSAgICAg4oaSIGB0b29sY2hhaW5fcGxhdGZvcm1fZGVmYXVsdGBcbiAqICAgZWxzZSAgICAgICAgICAgICAg4oaSIDQwOSBUT09MQ0hBSU5fTk9fREVGQVVMVCAobmV2ZXIgXCJoaWdoZXN0IHZlcnNpb25cIiwgRDExKVxuICpcbiAqIC0gUmVhZHMgYXJlIEVMRVZBVEVEIChgcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSlgLCBhc1xuICogICBgdmVyc2lvblJlZmVyZW5jZXNgIGRvZXMpIGFuZCB0b3VjaCBTWVNURU0tT1JHIHBsdWdpbiByb3dzIG9ubHk6IHRoZSBvd25lclxuICogICByYW5rIG9mIGBwbHVnaW5SZXNvbHV0aW9uT3JkZXJCeWAgaXMgbmV2ZXIgY29uc3VsdGVkLCBzbyBhIHNhbWUtbmFtZWQgcm93IGluXG4gKiAgIGFueSBvdGhlciBvcmcgaXMgbmV2ZXIgYSBjYW5kaWRhdGUuXG4gKiAtIEVsaWdpYmlsaXR5IChEMTUpIGlzIGEgU0VULXRpbWUgcnVsZSAoe0BsaW5rIGlzRWxpZ2libGVSZWxlYXNlfSk7IGF0IHJlc29sdmVcbiAqICAgdGltZSBhIHBpbiAvIG9yZyBkZWZhdWx0IG9ubHkgaGFzIHRvIGV4aXN0LlxuICogLSBCb3RoIGhhbHZlcyBhbHdheXMgY29tZSBmcm9tIE9ORSByZWxlYXNlIChgVE9PTENIQUlOX1BBSVJfTUlTTUFUQ0hgIG90aGVyd2lzZSkuXG4gKiAtIFRoZSBhbnN3ZXIgY2FycmllcyBgcmVzb2x2ZWRWaWFgIGFuZCBub3RoaW5nIGFib3V0IGFueSBvdGhlciBvcmc6IG5vXG4gKiAgIHJvbGxvdXQgbWVtYmVyc2hpcCwgbm8gYW5jZXN0b3IncyBzZXR0aW5ncy5cbiAqL1xuXG5pbXBvcnQge1xuICBBcHBFcnJvciwgY29tcGFyZVNlbXZlciwgY3JlYXRlTG9nZ2VyLCBlbnZJbnQsIEVycm9yQ29kZSwgZmV0Y2hQYXJlbnRPcmdJZCwgZ2V0U3RhdHVzRm9yRXJyb3JDb2RlLCBpc1N5c3RlbU9yZ0lkLFxuICBNQU5BR0VEX1RPT0xDSEFJTiwgTUFOQUdFRF9UT09MQ0hBSU5fUExVR0lOUywgTUFYX09SR19ERVBUSCwgU1lTVEVNX09SR19JRCwgVE9PTENIQUlOX1JFTEVBU0VfVkVSU0lPTl9QQVRURVJOLCB0b29sY2hhaW5Gcm9tTWV0YWRhdGEsIHRvT3JnSWRTdHJpbmcsXG4gIHR5cGUgR2V0UGFyZW50T3JnSWQsIHR5cGUgTWFuYWdlZFRvb2xjaGFpblBsdWdpbiwgdHlwZSBQbHVnaW5Ub29sY2hhaW4sIHR5cGUgVG9vbGNoYWluUmVzb2x2ZWRWaWEsXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIGluQXJyYXksIGlzTnVsbCwgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHR5cGUgeyBDcnVkVHggfSBmcm9tICcuL2NydWQtc2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdXRpb25SZWZ1c2FsIH0gZnJvbSAnLi9wbHVnaW4tcmVzb2x1dGlvbi5qcyc7XG5pbXBvcnQgeyBzY2hlbWEsIHR5cGUgT3JnVG9vbGNoYWluRGVmYXVsdCwgdHlwZSBQbHVnaW4sIHR5cGUgVG9vbGNoYWluUmVsZWFzZSB9IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHJ1bldpdGhUZW5hbnRDb250ZXh0LCB3aXRoVGVuYW50VHggfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdtYW5hZ2VkLXRvb2xjaGFpbicpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljIHNoYXBlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgbm9uLWZhdGFsIG5vdGUgb24gYSByZXNvbHZlZCByZWxlYXNlIChzeW50aCBwcmludHMgaXQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5hZ2VkVG9vbGNoYWluV2FybmluZyB7XG4gIGNvZGU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzZXZlcml0eTogJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJztcbn1cblxuLyoqIE9uZSByZWxlYXNlLCBib3RoIGhhbHZlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlZFRvb2xjaGFpblJlc29sdXRpb24ge1xuICByZWxlYXNlVmVyc2lvbjogc3RyaW5nO1xuICByZXNvbHZlZFZpYTogVG9vbGNoYWluUmVzb2x2ZWRWaWE7XG4gIGJvb3RzdHJhcDogUGx1Z2luO1xuICBzeW50aDogUGx1Z2luO1xuICB3YXJuaW5nczogTWFuYWdlZFRvb2xjaGFpbldhcm5pbmdbXTtcbn1cblxuLyoqIEEgcmVzb2x2ZXIgcmVmdXNhbDogYGNvZGVgIGlzIFRPT0xDSEFJTl9OT19ERUZBVUxULCBOT1RfRk9VTkQsIFRPT0xDSEFJTl9QQUlSX01JU01BVENIIG9yIFZBTElEQVRJT05fRVJST1IuICovXG5leHBvcnQgY2xhc3MgTWFuYWdlZFRvb2xjaGFpbkVycm9yIGV4dGVuZHMgQXBwRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihjb2RlOiBFcnJvckNvZGUsIG1lc3NhZ2U6IHN0cmluZywgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKGNvZGUpLCBjb2RlLCBtZXNzYWdlLCBkZXRhaWxzKTtcbiAgICB0aGlzLm5hbWUgPSAnTWFuYWdlZFRvb2xjaGFpbkVycm9yJztcbiAgfVxufVxuXG4vKiogVGhlIGNhbGxlciBhIHJlc29sdXRpb24gcnVucyBmb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZWRUb29sY2hhaW5DYWxsZXIge1xuICBvcmdJZDogc3RyaW5nO1xufVxuXG4vKiogV2hldGhlciBgdmVyc2lvbmAgaXMgYSByZWxlYXNlIHZlcnNpb24gKGBNQUpPUi5NSU5PUi5QQVRDSGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVG9vbGNoYWluUmVsZWFzZVZlcnNpb24odmVyc2lvbjogdW5rbm93bik6IHZlcnNpb24gaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJiBUT09MQ0hBSU5fUkVMRUFTRV9WRVJTSU9OX1BBVFRFUk4udGVzdCh2ZXJzaW9uKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERhdGEgYWNjZXNzIChzeXN0ZW0tb3JnIHJvd3MsIGVsZXZhdGVkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFdoYXQgdGhlIHJlc29sdmVyIHJlYWRzIHdpdGg6IGEgZHJpenpsZSB0cmFuc2FjdGlvbiAob3IgYW55IGRyaXp6bGUgZGF0YWJhc2UgaW4gdGVzdHMpLiAqL1xuZXhwb3J0IHR5cGUgVG9vbGNoYWluRGIgPSBQaWNrPENydWRUeCwgJ3NlbGVjdCc+O1xuXG4vKiogSG93IHRoZSByZXNvbHZlciByZWFkcyBhbmQgd2Fsa3MgdGhlIG9yZyB0cmVlIChpbmplY3RhYmxlIGZvciB0ZXN0cykuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZWRUb29sY2hhaW5EZXBzIHtcbiAgLyoqIFJ1biBgZm5gIHdpdGggRUxFVkFURUQgcmVhZHMuICovXG4gIHJlYWQ8VD4oZm46IChkYjogVG9vbGNoYWluRGIpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+O1xuICAvKiogQW4gb3JnJ3MgZGlyZWN0IHBhcmVudCwgb3IgdW5kZWZpbmVkIGZvciBhIHJvb3QuIFRocm93cyB3aGVuIGl0IGNhbid0IHRlbGwuICovXG4gIGdldFBhcmVudDogR2V0UGFyZW50T3JnSWQ7XG59XG5cbi8qKiBCb3RoIGhhbHZlcyBvZiBvbmUgcmVsZWFzZSBhcyBzdG9yZWQsIHdpdGggdGhlIHJlbGVhc2Ugcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWxlYXNlSGFsdmVzIHtcbiAgcmVsZWFzZVZlcnNpb246IHN0cmluZztcbiAgcmVsZWFzZTogVG9vbGNoYWluUmVsZWFzZSB8IG51bGw7XG4gIGJvb3RzdHJhcDogUGx1Z2luIHwgbnVsbDtcbiAgc3ludGg6IFBsdWdpbiB8IG51bGw7XG59XG5cbmNvbnN0IHsgYm9vdHN0cmFwOiBCT09UU1RSQVAsIHN5bnRoOiBTWU5USCB9ID0gTUFOQUdFRF9UT09MQ0hBSU47XG5cbi8qKiBUaGUgcmVsZWFzZSByb3cgYW5kIGJvdGggU1lTVEVNLU9SRyBoYWx2ZXMgb2YgYHJlbGVhc2VWZXJzaW9uYCAoZGVsZXRlZCByb3dzIGV4Y2x1ZGVkKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUmVsZWFzZUhhbHZlcyhkYjogVG9vbGNoYWluRGIsIHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPFJlbGVhc2VIYWx2ZXM+IHtcbiAgY29uc3QgW3JlbGVhc2VzLCByb3dzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBkYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS50b29sY2hhaW5SZWxlYXNlKS53aGVyZShlcShzY2hlbWEudG9vbGNoYWluUmVsZWFzZS5yZWxlYXNlVmVyc2lvbiwgcmVsZWFzZVZlcnNpb24pKSxcbiAgICBkYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS5wbHVnaW4pLndoZXJlKGFuZChcbiAgICAgIGVxKHNjaGVtYS5wbHVnaW4ub3JnSWQsIFNZU1RFTV9PUkdfSUQpLFxuICAgICAgaW5BcnJheShzY2hlbWEucGx1Z2luLm5hbWUsIFsuLi5NQU5BR0VEX1RPT0xDSEFJTl9QTFVHSU5TXSksXG4gICAgICBlcShzY2hlbWEucGx1Z2luLnZlcnNpb24sIHJlbGVhc2VWZXJzaW9uKSxcbiAgICAgIGlzTnVsbChzY2hlbWEucGx1Z2luLmRlbGV0ZWRBdCksXG4gICAgKSksXG4gIF0pO1xuICBjb25zdCBwbHVnaW5zID0gcm93cyBhcyBQbHVnaW5bXTtcbiAgcmV0dXJuIHtcbiAgICByZWxlYXNlVmVyc2lvbixcbiAgICByZWxlYXNlOiAocmVsZWFzZXMgYXMgVG9vbGNoYWluUmVsZWFzZVtdKVswXSA/PyBudWxsLFxuICAgIGJvb3RzdHJhcDogcGx1Z2lucy5maW5kKChwKSA9PiBwLm5hbWUgPT09IEJPT1RTVFJBUCkgPz8gbnVsbCxcbiAgICBzeW50aDogcGx1Z2lucy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFNZTlRIKSA/PyBudWxsLFxuICB9O1xufVxuXG4vKiogQSBzZXR0aW5nIGZvdW5kIG9uIHRoZSBjYWxsZXIncyBjaGFpbjogd2hpY2ggY2hhaW4gaW5kZXgsIGFuZCBpdHMgcmVsZWFzZS4gKi9cbmludGVyZmFjZSBDaGFpblNldHRpbmcgeyBkZXB0aDogbnVtYmVyOyByZWxlYXNlVmVyc2lvbjogc3RyaW5nIH1cblxuLyoqIFRoZSBORUFSRVNUIHJvdyBvZiBgdGFibGVgIChrZXllZCBieSBgb3JnX2lkYCkgb24gYGNoYWluYCAob3duIG9yZyBmaXJzdCkuICovXG5hc3luYyBmdW5jdGlvbiBuZWFyZXN0T25DaGFpbihcbiAgZGI6IFRvb2xjaGFpbkRiLFxuICB0YWJsZTogdHlwZW9mIHNjaGVtYS5vcmdUb29sY2hhaW5EZWZhdWx0IHwgdHlwZW9mIHNjaGVtYS50b29sY2hhaW5Sb2xsb3V0LFxuICBjaGFpbjogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQcm9taXNlPENoYWluU2V0dGluZyB8IG51bGw+IHtcbiAgaWYgKGNoYWluLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBkYi5zZWxlY3QoeyBvcmdJZDogdGFibGUub3JnSWQsIHJlbGVhc2VWZXJzaW9uOiB0YWJsZS5yZWxlYXNlVmVyc2lvbiB9KVxuICAgIC5mcm9tKHRhYmxlKVxuICAgIC53aGVyZShpbkFycmF5KHNxbDxzdHJpbmc+YGxvd2VyKCR7dGFibGUub3JnSWR9KWAsIFsuLi5jaGFpbl0pKSBhcyBBcnJheTx7IG9yZ0lkOiBzdHJpbmc7IHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcgfT47XG4gIGxldCBiZXN0OiBDaGFpblNldHRpbmcgfCBudWxsID0gbnVsbDtcbiAgZm9yIChjb25zdCByIG9mIHJvd3MpIHtcbiAgICBjb25zdCBkZXB0aCA9IGNoYWluLmluZGV4T2Yoci5vcmdJZC50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoZGVwdGggPj0gMCAmJiAoIWJlc3QgfHwgZGVwdGggPCBiZXN0LmRlcHRoKSkgYmVzdCA9IHsgZGVwdGgsIHJlbGVhc2VWZXJzaW9uOiByLnJlbGVhc2VWZXJzaW9uIH07XG4gIH1cbiAgcmV0dXJuIGJlc3Q7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGN1cnJlbnRQbGF0Zm9ybURlZmF1bHQoZGI6IFRvb2xjaGFpbkRiKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBkYi5zZWxlY3QoeyByZWxlYXNlVmVyc2lvbjogc2NoZW1hLnRvb2xjaGFpblBsYXRmb3JtRGVmYXVsdC5yZWxlYXNlVmVyc2lvbiB9KVxuICAgIC5mcm9tKHNjaGVtYS50b29sY2hhaW5QbGF0Zm9ybURlZmF1bHQpLmxpbWl0KDEpIGFzIEFycmF5PHsgcmVsZWFzZVZlcnNpb246IHN0cmluZyB9PjtcbiAgcmV0dXJuIHJvd3NbMF0/LnJlbGVhc2VWZXJzaW9uID8/IG51bGw7XG59XG5cbi8qKiBXaGV0aGVyIGByZWxlYXNlVmVyc2lvbmAgaGFzIGV2ZXIgYmVlbiAob3IgaXMpIHRoZSBwbGF0Zm9ybSBkZWZhdWx0LiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FzUGxhdGZvcm1EZWZhdWx0KGRiOiBUb29sY2hhaW5EYiwgcmVsZWFzZVZlcnNpb246IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbaGlzdG9yeSwgY3VycmVudF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZGIuc2VsZWN0KHsgaWQ6IHNjaGVtYS50b29sY2hhaW5EZWZhdWx0SGlzdG9yeS5pZCB9KS5mcm9tKHNjaGVtYS50b29sY2hhaW5EZWZhdWx0SGlzdG9yeSlcbiAgICAgIC53aGVyZShlcShzY2hlbWEudG9vbGNoYWluRGVmYXVsdEhpc3RvcnkucmVsZWFzZVZlcnNpb24sIHJlbGVhc2VWZXJzaW9uKSkubGltaXQoMSksXG4gICAgY3VycmVudFBsYXRmb3JtRGVmYXVsdChkYiksXG4gIF0pO1xuICByZXR1cm4gKGhpc3RvcnkgYXMgdW5rbm93bltdKS5sZW5ndGggPiAwIHx8IGN1cnJlbnQgPT09IHJlbGVhc2VWZXJzaW9uO1xufVxuXG4vKiogV2hldGhlciBBTlkgb3JnIGhhcyBhbiBvcmcgZGVmYXVsdCBvciBhIGNhbmFyeSBtZW1iZXJzaGlwIChlbHNlIG5vIHdhbGsgaXMgbmVlZGVkKS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFueU9yZ1NldHRpbmdzKGRiOiBUb29sY2hhaW5EYik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbZGVmYXVsdHMsIHJvbGxvdXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGRiLnNlbGVjdCh7IG9yZ0lkOiBzY2hlbWEub3JnVG9vbGNoYWluRGVmYXVsdC5vcmdJZCB9KS5mcm9tKHNjaGVtYS5vcmdUb29sY2hhaW5EZWZhdWx0KS5saW1pdCgxKSxcbiAgICBkYi5zZWxlY3QoeyBvcmdJZDogc2NoZW1hLnRvb2xjaGFpblJvbGxvdXQub3JnSWQgfSkuZnJvbShzY2hlbWEudG9vbGNoYWluUm9sbG91dCkubGltaXQoMSksXG4gIF0pO1xuICByZXR1cm4gKGRlZmF1bHRzIGFzIHVua25vd25bXSkubGVuZ3RoID4gMCB8fCAocm9sbG91dCBhcyB1bmtub3duW10pLmxlbmd0aCA+IDA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGUgb3JnIGNoYWluIChjYWxsZXIg4oaSIOKApiDihpIgcm9vdClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVGhlIGNhbGxlcidzIGNoYWluLCBvd24gb3JnIGZpcnN0LCBsb3dlcmNhc2VkOiBgW3NlbGYsIHBhcmVudCwg4oCmLCByb290XWAuXG4gKiBUaGUgc2FtZSBwYXJlbnQgd2FsayBhcyBgb3JnLXJlYWNoYWJpbGl0eS50c2AgKHBsYXRmb3JtJ3NcbiAqIGBHRVQgL29yZ2FuaXphdGlvbi86aWQvcGFyZW50YCksIGN5Y2xlLXNhZmUgYW5kIGNhcHBlZCBhdCBgTUFYX09SR19ERVBUSGAgbGlrZVxuICogYHJlcG9ydGluZy1yZXRlbnRpb24udHNgIOKAlCBidXQgRkFJTC1DTE9TRUQ6IGEgbG9va3VwIGZhaWx1cmUsIGEgY3ljbGUgb3IgYW5cbiAqIG92ZXItZGVlcCBjaGFpbiB0aHJvd3MgcmF0aGVyIHRoYW4gcmVzb2x2aW5nIHRoZSB3cm9uZyBvcmcncyB0b29sY2hhaW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b29sY2hhaW5PcmdDaGFpbihvcmdJZDogc3RyaW5nLCBnZXRQYXJlbnQ6IEdldFBhcmVudE9yZ0lkKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzZWxmID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgY2hhaW4gPSBbc2VsZl07XG4gIGlmIChpc1N5c3RlbU9yZ0lkKHNlbGYpKSByZXR1cm4gY2hhaW47XG4gIGxldCBjdXJyZW50ID0gc2VsZjtcbiAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8IE1BWF9PUkdfREVQVEg7IGRlcHRoKyspIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0b09yZ0lkU3RyaW5nKGF3YWl0IGdldFBhcmVudChjdXJyZW50KSk/LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09PSBjdXJyZW50KSByZXR1cm4gY2hhaW47XG4gICAgaWYgKGNoYWluLmluY2x1ZGVzKHBhcmVudCkpIHtcbiAgICAgIHRocm93IG5ldyBNYW5hZ2VkVG9vbGNoYWluRXJyb3IoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SLCAnVGhlIG9yZ2FuaXphdGlvbiBoaWVyYXJjaHkgaGFzIGEgY3ljbGU7IHRoZSB0b29sY2hhaW4gcmVsZWFzZSBjYW5ub3QgYmUgcmVzb2x2ZWQuJywgeyBvcmdJZDogc2VsZiB9KTtcbiAgICB9XG4gICAgY2hhaW4ucHVzaChwYXJlbnQpO1xuICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gIH1cbiAgdGhyb3cgbmV3IE1hbmFnZWRUb29sY2hhaW5FcnJvcihFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsIGBUaGUgb3JnYW5pemF0aW9uIGhpZXJhcmNoeSBpcyBkZWVwZXIgdGhhbiAke01BWF9PUkdfREVQVEh9OyB0aGUgdG9vbGNoYWluIHJlbGVhc2UgY2Fubm90IGJlIHJlc29sdmVkLmAsIHsgb3JnSWQ6IHNlbGYgfSk7XG59XG5cbi8qKiBQYXJlbnQgbG9va3VwcyBhcmUgY2FjaGVkIGJyaWVmbHk6IG9uZSBzeW50aCBtYWtlcyBzZXZlcmFsIGxvb2t1cHMgZm9yIHRoZSBzYW1lIG9yZy4gKi9cbmNvbnN0IFBBUkVOVF9DQUNIRV9UVExfTVMgPSAzMF8wMDA7XG5jb25zdCBQQVJFTlRfQ0FDSEVfTUFYID0gNV8wMDA7XG5jb25zdCBwYXJlbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHBhcmVudDogc3RyaW5nIHwgdW5kZWZpbmVkOyBhdDogbnVtYmVyIH0+KCk7XG5cbmFzeW5jIGZ1bmN0aW9uIHBsYXRmb3JtUGFyZW50KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBoaXQgPSBwYXJlbnRDYWNoZS5nZXQob3JnSWQpO1xuICBpZiAoaGl0ICYmIERhdGUubm93KCkgLSBoaXQuYXQgPCBQQVJFTlRfQ0FDSEVfVFRMX01TKSByZXR1cm4gaGl0LnBhcmVudDtcbiAgLy8gQSBzeXN0ZW0tc2NvcGVkIHNlcnZpY2UgdG9rZW47IGEgbm9uLTJ4eCBUSFJPV1MgKGZhaWwtY2xvc2VkLCBzZWUgdG9vbGNoYWluT3JnQ2hhaW4pLlxuICBjb25zdCBwYXJlbnQgPSBhd2FpdCBmZXRjaFBhcmVudE9yZ0lkKG9yZ0lkLCB7IGF1dGhPcmdJZDogU1lTVEVNX09SR19JRCwgdGhyb3dPbkh0dHBFcnJvcjogdHJ1ZSwgdGltZW91dDogNV8wMDAgfSk7XG4gIGlmIChwYXJlbnRDYWNoZS5zaXplID49IFBBUkVOVF9DQUNIRV9NQVgpIHBhcmVudENhY2hlLmNsZWFyKCk7XG4gIHBhcmVudENhY2hlLnNldChvcmdJZCwgeyBwYXJlbnQsIGF0OiBEYXRlLm5vdygpIH0pO1xuICByZXR1cm4gcGFyZW50O1xufVxuXG5jb25zdCBwcm9kdWN0aW9uRGVwczogTWFuYWdlZFRvb2xjaGFpbkRlcHMgPSB7XG4gIHJlYWQ6IChmbikgPT4gcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gZm4odHgpKSksXG4gIGdldFBhcmVudDogcGxhdGZvcm1QYXJlbnQsXG59O1xubGV0IGRlZmF1bHREZXBzOiBNYW5hZ2VkVG9vbGNoYWluRGVwcyA9IHByb2R1Y3Rpb25EZXBzO1xuXG4vKiogVGVzdCBob29rOiByZXBsYWNlIHRoZSByZXNvbHZlcidzIHJlYWRzIGFuZCBoaWVyYXJjaHkgKG51bGwgcmVzdG9yZXMgcHJvZHVjdGlvbikuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TWFuYWdlZFRvb2xjaGFpbkRlcHNGb3JUZXN0cyhkZXBzOiBNYW5hZ2VkVG9vbGNoYWluRGVwcyB8IG51bGwpOiB2b2lkIHtcbiAgZGVmYXVsdERlcHMgPSBkZXBzID8/IHByb2R1Y3Rpb25EZXBzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTGlmZWN5Y2xlLCBlbGlnaWJpbGl0eSBhbmQgdGhlIGNhbmFyeSBndWFyZHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBXaHkgYSBzdG9yZWQgcmVsZWFzZSBpcyBub3QgTElWRSAoZW1wdHkgPSBsaXZlOiBib3RoIGhhbHZlcyBwcmVzZW50LCBhY3RpdmUsIHVueWFua2VkLCBub3QgZGVwcmVjYXRlZCkuICovXG5leHBvcnQgdHlwZSBSZWxlYXNlTGlmZWN5Y2xlUHJvYmxlbSA9ICdtaXNzaW5nJyB8ICdpbmFjdGl2ZScgfCAneWFua2VkJyB8ICdkZXByZWNhdGVkJztcblxuY29uc3QgaXNZYW5rZWQgPSAocDogUGx1Z2luKSA9PiBwLnlhbmtlZEF0ICE9PSBudWxsIHx8IHAubGlmZWN5Y2xlID09PSAneWFua2VkJztcbmNvbnN0IGlzRGVwcmVjYXRlZCA9IChwOiBQbHVnaW4pID0+IHAuZGVwcmVjYXRlZEF0ICE9PSBudWxsIHx8IHAubGlmZWN5Y2xlID09PSAnZGVwcmVjYXRlZCc7XG5cbi8qKiBXaGV0aGVyIGJvdGggaGFsdmVzIGFyZSBwcmVzZW50ICh0aGUgcmVsZWFzZSBFWElTVFMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbGVhc2VFeGlzdHMoaDogUmVsZWFzZUhhbHZlcyk6IGggaXMgUmVsZWFzZUhhbHZlcyAmIHsgYm9vdHN0cmFwOiBQbHVnaW47IHN5bnRoOiBQbHVnaW4gfSB7XG4gIHJldHVybiBoLnJlbGVhc2UgIT09IG51bGwgJiYgaC5ib290c3RyYXAgIT09IG51bGwgJiYgaC5zeW50aCAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGVhc2VMaWZlY3ljbGVQcm9ibGVtcyhoOiBSZWxlYXNlSGFsdmVzKTogUmVsZWFzZUxpZmVjeWNsZVByb2JsZW1bXSB7XG4gIGlmICghcmVsZWFzZUV4aXN0cyhoKSkgcmV0dXJuIFsnbWlzc2luZyddO1xuICBjb25zdCBoYWx2ZXMgPSBbaC5ib290c3RyYXAsIGguc3ludGhdO1xuICBjb25zdCBvdXQ6IFJlbGVhc2VMaWZlY3ljbGVQcm9ibGVtW10gPSBbXTtcbiAgaWYgKGhhbHZlcy5zb21lKChwKSA9PiAhcC5pc0FjdGl2ZSkpIG91dC5wdXNoKCdpbmFjdGl2ZScpO1xuICBpZiAoaGFsdmVzLnNvbWUoaXNZYW5rZWQpKSBvdXQucHVzaCgneWFua2VkJyk7XG4gIGlmIChoYWx2ZXMuc29tZShpc0RlcHJlY2F0ZWQpKSBvdXQucHVzaCgnZGVwcmVjYXRlZCcpO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRoZSBib290c3RyYXAgaGFsZidzIHRvb2xjaGFpbiBtZXRhZGF0YSAoYHBpcGVsaW5lTWFuYWdlcmAsIGBhd3NDZGtgLCDigKYpLCBvclxuICogbnVsbCB3aGVuIGl0IGNhcnJpZXMgbm8gY29tcGxldGUsIHZhbGlkIG9uZS4gVXBsb2FkIHBlcnNpc3RzIGl0IG9uIHRoZSByb3cnc1xuICogYG1ldGFkYXRhYCBhcyBmbGF0IGB0b29sY2hhaW4uPGZpZWxkPmAga2V5cyAoYXBpLWNvcmUgYHRvb2xjaGFpbk1ldGFkYXRhYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBUb29sY2hhaW5PZihyb3c6IFBsdWdpbiB8IG51bGwgfCB1bmRlZmluZWQpOiBQbHVnaW5Ub29sY2hhaW4gfCBudWxsIHtcbiAgcmV0dXJuIHJvdyA/IHRvb2xjaGFpbkZyb21NZXRhZGF0YShyb3cubWV0YWRhdGEpIDogbnVsbDtcbn1cblxuLyoqIGBQTFVHSU5fVlVMTl9NQVhfRklORElOR1NgIChkZWZhdWx0IDApOiB0aGUgZml4YWJsZS1Dcml0aWNhbCBmbG9vciBhIHJlbGVhc2UgbXVzdCBiZSB3aXRoaW4uICovXG5mdW5jdGlvbiB2dWxuRmxvb3IoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudkludCgnUExVR0lOX1ZVTE5fTUFYX0ZJTkRJTkdTJywgMCwgeyBtaW46IDAgfSk7XG59XG5cbi8qKlxuICogVGhlIMKnOCBjYW5kaWRhdGUgZ3VhcmRzIChwYWlyLCBzY2FuLCBtZXRhZGF0YSkgYSByZWxlYXNlIGZhaWxzLCBhcyB0aGVpclxuICogZXJyb3IgY29kZXMg4oCUIGVtcHR5IHdoZW4gaXQgcGFzc2VzLiBUaGUgY2FuYXJ5IGdhdGUgYW5kIGNvbmN1cnJlbmN5IGFyZSB0aGVcbiAqIHBsYXRmb3JtLWRlZmF1bHQgc2VydmljZSdzOyBhIGNhbmFyeSBpcyBzZXJ2ZWQgb25seSB3aGlsZSB0aGlzIGlzIGVtcHR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9vbGNoYWluQ2FuZGlkYXRlUHJvYmxlbXMoaDogUmVsZWFzZUhhbHZlcyk6IEVycm9yQ29kZVtdIHtcbiAgaWYgKCFyZWxlYXNlRXhpc3RzKGgpIHx8IHJlbGVhc2VMaWZlY3ljbGVQcm9ibGVtcyhoKS5sZW5ndGggPiAwKSByZXR1cm4gW0Vycm9yQ29kZS5UT09MQ0hBSU5fR1VBUkRfUEFJUl9JTkNPTVBMRVRFXTtcbiAgY29uc3Qgb3V0OiBFcnJvckNvZGVbXSA9IFtdO1xuICBjb25zdCBoYWx2ZXMgPSBbaC5ib290c3RyYXAsIGguc3ludGhdO1xuICBpZiAoaGFsdmVzLnNvbWUoKHApID0+ICFwLnNjYW5uZWRBdCkpIG91dC5wdXNoKEVycm9yQ29kZS5UT09MQ0hBSU5fR1VBUkRfVU5TQ0FOTkVEKTtcbiAgZWxzZSBpZiAoaGFsdmVzLnNvbWUoKHApID0+IChwLnZ1bG5Dcml0aWNhbEZpeGFibGUgPz8gMCkgPiB2dWxuRmxvb3IoKSkpIG91dC5wdXNoKEVycm9yQ29kZS5UT09MQ0hBSU5fR1VBUkRfVlVMTl9GTE9PUik7XG4gIGlmICghYm9vdHN0cmFwVG9vbGNoYWluT2YoaC5ib290c3RyYXApKSBvdXQucHVzaChFcnJvckNvZGUuVE9PTENIQUlOX0dVQVJEX01FVEFEQVRBKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFdhcm5pbmdzIGZvciBhIHJlbGVhc2UgdGhhdCBFWElTVFMgYnV0IGlzIG5vIGxvbmdlciAob3IgbmV2ZXIgd2FzKSBlbGlnaWJsZS4gKi9cbmZ1bmN0aW9uIHN0YW5kaW5nV2FybmluZ3MoaDogUmVsZWFzZUhhbHZlcyAmIHsgYm9vdHN0cmFwOiBQbHVnaW47IHN5bnRoOiBQbHVnaW4gfSwgcHJvbW90ZWQ6IGJvb2xlYW4sIHZpYTogVG9vbGNoYWluUmVzb2x2ZWRWaWEpOiBNYW5hZ2VkVG9vbGNoYWluV2FybmluZ1tdIHtcbiAgY29uc3QgcmVmID0gYFRvb2xjaGFpbiByZWxlYXNlICR7aC5yZWxlYXNlVmVyc2lvbn1gO1xuICBjb25zdCBvdXQ6IE1hbmFnZWRUb29sY2hhaW5XYXJuaW5nW10gPSBbXTtcbiAgY29uc3QgeWFua2VkID0gW2guYm9vdHN0cmFwLCBoLnN5bnRoXS5maW5kKGlzWWFua2VkKTtcbiAgaWYgKHlhbmtlZCkge1xuICAgIG91dC5wdXNoKHtcbiAgICAgIGNvZGU6ICdUT09MQ0hBSU5fUkVMRUFTRV9ZQU5LRUQnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6IGAke3JlZn0gaXMgeWFua2VkJHt5YW5rZWQueWFua1JlYXNvbiA/IGA6ICR7eWFua2VkLnlhbmtSZWFzb259YCA6ICcnfS4gSXQgcmVzb2x2ZXMgb25seSBiZWNhdXNlIGl0IGlzIHNlbGVjdGVkIGV4YWN0bHk7IG1vdmUgdG8gYSBzdXBwb3J0ZWQgcmVsZWFzZS5gLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGRlcHJlY2F0ZWQgPSBbaC5ib290c3RyYXAsIGguc3ludGhdLmZpbmQoaXNEZXByZWNhdGVkKTtcbiAgaWYgKGRlcHJlY2F0ZWQpIHtcbiAgICBvdXQucHVzaCh7XG4gICAgICBjb2RlOiAnVE9PTENIQUlOX1JFTEVBU0VfREVQUkVDQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTogYCR7cmVmfSBpcyBkZXByZWNhdGVkJHtkZXByZWNhdGVkLmRlcHJlY2F0aW9uTWVzc2FnZSA/IGA6ICR7ZGVwcmVjYXRlZC5kZXByZWNhdGlvbk1lc3NhZ2V9YCA6ICcnfS5gLFxuICAgIH0pO1xuICB9XG4gIGlmIChbaC5ib290c3RyYXAsIGguc3ludGhdLnNvbWUoKHApID0+ICFwLmlzQWN0aXZlKSkge1xuICAgIG91dC5wdXNoKHsgY29kZTogJ1RPT0xDSEFJTl9SRUxFQVNFX0lOQUNUSVZFJywgc2V2ZXJpdHk6ICd3YXJuaW5nJywgbWVzc2FnZTogYCR7cmVmfSBpcyBpbmFjdGl2ZTsgbW92ZSB0byBhIHN1cHBvcnRlZCByZWxlYXNlLmAgfSk7XG4gIH1cbiAgaWYgKCFwcm9tb3RlZCAmJiAodmlhID09PSAncGluJyB8fCB2aWEgPT09ICdvcmctZGVmYXVsdCcpKSB7XG4gICAgb3V0LnB1c2goe1xuICAgICAgY29kZTogJ1RPT0xDSEFJTl9SRUxFQVNFX05PVF9QUk9NT1RFRCcsXG4gICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTogYCR7cmVmfSB3YXMgbmV2ZXIgdGhlIHBsYXRmb3JtIGRlZmF1bHQgYW5kIGlzIG5vdCBpbiBhIGNhbmFyeSBmb3IgeW91ciBvcmdhbml6YXRpb247IGl0IHJlc29sdmVzIG9ubHkgYmVjYXVzZSBpdCBpcyBzZWxlY3RlZCBleGFjdGx5LmAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc29sdXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHBhaXJPZihoOiBSZWxlYXNlSGFsdmVzLCB2aWE6IFRvb2xjaGFpblJlc29sdmVkVmlhKTogeyBib290c3RyYXA6IFBsdWdpbjsgc3ludGg6IFBsdWdpbiB9IHtcbiAgaWYgKCFyZWxlYXNlRXhpc3RzKGgpKSB7XG4gICAgLy8gQSBkZWZhdWx0IChwbGF0Zm9ybSBvciBvcmcpIHdob3NlIGhhbHZlcyBhcmUgZ29uZSBpcyBhIGJyb2tlbiBpbnZhcmlhbnRcbiAgICAvLyAoaW4tdXNlIHByb3RlY3Rpb24gY291bnRzIGRlZmF1bHRzKTogcmVmdXNlZCwgbmV2ZXIgc2VydmVkLlxuICAgIHRocm93IG5ldyBNYW5hZ2VkVG9vbGNoYWluRXJyb3IoRXJyb3JDb2RlLlRPT0xDSEFJTl9QQUlSX01JU01BVENILCBgVG9vbGNoYWluIHJlbGVhc2UgJHtoLnJlbGVhc2VWZXJzaW9ufSAoJHt2aWF9KSBpcyBpbmNvbXBsZXRlOyBpdCBpcyBuZXZlciBzZXJ2ZWQuYCwge1xuICAgICAgcmVsZWFzZVZlcnNpb246IGgucmVsZWFzZVZlcnNpb24sXG4gICAgICBtaXNzaW5nOiBbLi4uKGguYm9vdHN0cmFwID8gW10gOiBbQk9PVFNUUkFQXSksIC4uLihoLnN5bnRoID8gW10gOiBbU1lOVEhdKSwgLi4uKGgucmVsZWFzZSA/IFtdIDogWyd0b29sY2hhaW5fcmVsZWFzZSddKV0sXG4gICAgfSk7XG4gIH1cbiAgaWYgKGguYm9vdHN0cmFwLnZlcnNpb24gIT09IGgucmVsZWFzZVZlcnNpb24gfHwgaC5zeW50aC52ZXJzaW9uICE9PSBoLnJlbGVhc2VWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IE1hbmFnZWRUb29sY2hhaW5FcnJvcihFcnJvckNvZGUuVE9PTENIQUlOX1BBSVJfTUlTTUFUQ0gsIGBUb29sY2hhaW4gaGFsdmVzIGRpc2FncmVlICgke0JPT1RTVFJBUH1AJHtoLmJvb3RzdHJhcC52ZXJzaW9ufSwgJHtTWU5USH1AJHtoLnN5bnRoLnZlcnNpb259KTsgbmV2ZXIgc2VydmVkLmAsIHtcbiAgICAgIHJlbGVhc2VWZXJzaW9uOiBoLnJlbGVhc2VWZXJzaW9uLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7IGJvb3RzdHJhcDogaC5ib290c3RyYXAsIHN5bnRoOiBoLnN5bnRoIH07XG59XG5cbi8qKiBUaGUgcmVzb2x1dGlvbiBpbnNpZGUgb25lIGVsZXZhdGVkIHJlYWQsIG92ZXIgYSBrbm93biBjaGFpbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVPbkNoYWluKGRiOiBUb29sY2hhaW5EYiwgY2hhaW46IHJlYWRvbmx5IHN0cmluZ1tdLCByZWxlYXNlUGluPzogc3RyaW5nKTogUHJvbWlzZTxNYW5hZ2VkVG9vbGNoYWluUmVzb2x1dGlvbj4ge1xuICBjb25zdCBjYW5hcnkgPSBhd2FpdCBuZWFyZXN0T25DaGFpbihkYiwgc2NoZW1hLnRvb2xjaGFpblJvbGxvdXQsIGNoYWluKTtcbiAgY29uc3QgYW5zd2VyID0gYXN5bmMgKGg6IFJlbGVhc2VIYWx2ZXMsIHZpYTogVG9vbGNoYWluUmVzb2x2ZWRWaWEpOiBQcm9taXNlPE1hbmFnZWRUb29sY2hhaW5SZXNvbHV0aW9uPiA9PiB7XG4gICAgY29uc3QgcGFpciA9IHBhaXJPZihoLCB2aWEpO1xuICAgIGNvbnN0IHByb21vdGVkID0gdmlhID09PSAncGluJyB8fCB2aWEgPT09ICdvcmctZGVmYXVsdCdcbiAgICAgID8gKGF3YWl0IHdhc1BsYXRmb3JtRGVmYXVsdChkYiwgaC5yZWxlYXNlVmVyc2lvbikpIHx8IGNhbmFyeT8ucmVsZWFzZVZlcnNpb24gPT09IGgucmVsZWFzZVZlcnNpb25cbiAgICAgIDogdHJ1ZTtcbiAgICByZXR1cm4geyByZWxlYXNlVmVyc2lvbjogaC5yZWxlYXNlVmVyc2lvbiwgcmVzb2x2ZWRWaWE6IHZpYSwgLi4ucGFpciwgd2FybmluZ3M6IHN0YW5kaW5nV2FybmluZ3MoeyAuLi5oLCAuLi5wYWlyIH0sIHByb21vdGVkLCB2aWEpIH07XG4gIH07XG5cbiAgaWYgKHJlbGVhc2VQaW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghaXNUb29sY2hhaW5SZWxlYXNlVmVyc2lvbihyZWxlYXNlUGluKSkge1xuICAgICAgdGhyb3cgbmV3IE1hbmFnZWRUb29sY2hhaW5FcnJvcihFcnJvckNvZGUuVkFMSURBVElPTl9FUlJPUiwgJ3JlbGVhc2VQaW4gbXVzdCBiZSBhIHJlbGVhc2UgdmVyc2lvbiAoTUFKT1IuTUlOT1IuUEFUQ0gsIGUuZy4gMS40LjIpLicsIHsgcmVsZWFzZVBpbiB9KTtcbiAgICB9XG4gICAgY29uc3QgaCA9IGF3YWl0IGxvYWRSZWxlYXNlSGFsdmVzKGRiLCByZWxlYXNlUGluKTtcbiAgICBpZiAoIXJlbGVhc2VFeGlzdHMoaCkpIHtcbiAgICAgIHRocm93IG5ldyBNYW5hZ2VkVG9vbGNoYWluRXJyb3IoRXJyb3JDb2RlLk5PVF9GT1VORCwgYFRvb2xjaGFpbiByZWxlYXNlICR7cmVsZWFzZVBpbn0gZG9lcyBub3QgZXhpc3QgKG9yIHdhcyBkZWxldGVkKS4gUGluIGFuIGVsaWdpYmxlIHJlbGVhc2UsIG9yIHJlbW92ZSB0b29sY2hhaW4ucmVsZWFzZSB0byBmb2xsb3cgeW91ciBvcmdhbml6YXRpb24ncyBkZWZhdWx0LmAsIHtcbiAgICAgICAgcmVhc29uOiAndG9vbGNoYWluX3JlbGVhc2Vfbm90X2ZvdW5kJywgcmVsZWFzZVZlcnNpb246IHJlbGVhc2VQaW4sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFuc3dlcihoLCAncGluJyk7XG4gIH1cblxuICBjb25zdCBvcmdEZWZhdWx0ID0gYXdhaXQgbmVhcmVzdE9uQ2hhaW4oZGIsIHNjaGVtYS5vcmdUb29sY2hhaW5EZWZhdWx0LCBjaGFpbik7XG4gIGlmIChvcmdEZWZhdWx0KSByZXR1cm4gYW5zd2VyKGF3YWl0IGxvYWRSZWxlYXNlSGFsdmVzKGRiLCBvcmdEZWZhdWx0LnJlbGVhc2VWZXJzaW9uKSwgJ29yZy1kZWZhdWx0Jyk7XG5cbiAgaWYgKGNhbmFyeSkge1xuICAgIGNvbnN0IGggPSBhd2FpdCBsb2FkUmVsZWFzZUhhbHZlcyhkYiwgY2FuYXJ5LnJlbGVhc2VWZXJzaW9uKTtcbiAgICBjb25zdCBwcm9ibGVtcyA9IHRvb2xjaGFpbkNhbmRpZGF0ZVByb2JsZW1zKGgpO1xuICAgIGlmIChwcm9ibGVtcy5sZW5ndGggPT09IDApIHJldHVybiBhbnN3ZXIoaCwgJ2NhbmFyeScpO1xuICAgIC8vIE1lbWJlcnMgZmFsbCB0aHJvdWdoIHRvIHRoZSBwbGF0Zm9ybSBkZWZhdWx0LiBMb2dnZWQsIG5ldmVyIHJldHVybmVkOlxuICAgIC8vIHRoZSBhbnN3ZXIgbXVzdCBub3QgcmV2ZWFsIGNhbmFyeSBtZW1iZXJzaGlwLlxuICAgIGxvZ2dlci53YXJuKCdDYW5hcnkgdG9vbGNoYWluIHJlbGVhc2UgZmFpbHMgaXRzIGd1YXJkczsgc2VydmluZyB0aGUgcGxhdGZvcm0gZGVmYXVsdCcsIHsgcmVsZWFzZVZlcnNpb246IGNhbmFyeS5yZWxlYXNlVmVyc2lvbiwgcHJvYmxlbXMgfSk7XG4gIH1cblxuICBjb25zdCBwbGF0Zm9ybSA9IGF3YWl0IGN1cnJlbnRQbGF0Zm9ybURlZmF1bHQoZGIpO1xuICBpZiAoIXBsYXRmb3JtKSB7XG4gICAgdGhyb3cgbmV3IE1hbmFnZWRUb29sY2hhaW5FcnJvcihFcnJvckNvZGUuVE9PTENIQUlOX05PX0RFRkFVTFQsICdObyBwbGF0Zm9ybSBkZWZhdWx0IHRvb2xjaGFpbiByZWxlYXNlIGlzIHNldC4gQW4gb3BlcmF0b3IgbXVzdCBzZXQgb25lIChpbml0LXBsYXRmb3JtIGRvZXMgdGhpcyBvbiBhIGZyZXNoIGluc3RhbGwpLicpO1xuICB9XG4gIHJldHVybiBhbnN3ZXIoYXdhaXQgbG9hZFJlbGVhc2VIYWx2ZXMoZGIsIHBsYXRmb3JtKSwgJ2RlZmF1bHQnKTtcbn1cblxuLyoqIHtAbGluayByZXNvbHZlTWFuYWdlZFRvb2xjaGFpbn0gd2l0aCBpbmplY3RlZCByZWFkcyBhbmQgaGllcmFyY2h5ICh0ZXN0cykuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU1hbmFnZWRUb29sY2hhaW5XaXRoKFxuICBkZXBzOiBNYW5hZ2VkVG9vbGNoYWluRGVwcyxcbiAgY2FsbGVyOiBNYW5hZ2VkVG9vbGNoYWluQ2FsbGVyLFxuICBvcHRzOiB7IHJlbGVhc2VQaW4/OiBzdHJpbmcgfSA9IHt9LFxuKTogUHJvbWlzZTxNYW5hZ2VkVG9vbGNoYWluUmVzb2x1dGlvbj4ge1xuICBjb25zdCBzZWxmID0gY2FsbGVyLm9yZ0lkLnRvTG93ZXJDYXNlKCk7XG4gIC8vIFdhbGsgdGhlIGhpZXJhcmNoeSBvbmx5IHdoZW4gc29tZSBvcmcgaGFzIGEgc2V0dGluZyAoYW5kIG91dHNpZGUgdGhlIHRyYW5zYWN0aW9uKS5cbiAgY29uc3Qgd2FsayA9IGF3YWl0IGRlcHMucmVhZCgoZGIpID0+IGFueU9yZ1NldHRpbmdzKGRiKSk7XG4gIGNvbnN0IGNoYWluID0gd2FsayA/IGF3YWl0IHRvb2xjaGFpbk9yZ0NoYWluKHNlbGYsIGRlcHMuZ2V0UGFyZW50KSA6IFtzZWxmXTtcbiAgcmV0dXJuIGRlcHMucmVhZCgoZGIpID0+IHJlc29sdmVPbkNoYWluKGRiLCBjaGFpbiwgb3B0cy5yZWxlYXNlUGluKSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbWFuYWdlZCB0b29sY2hhaW4gcmVsZWFzZSBmb3IgYGNhbGxlcmAgKHNlZSB0aGUgbW9kdWxlIGRvYykuXG4gKiBUaHJvd3Mge0BsaW5rIE1hbmFnZWRUb29sY2hhaW5FcnJvcn06IFRPT0xDSEFJTl9OT19ERUZBVUxUICg0MDksIG5vIHBsYXRmb3JtXG4gKiBkZWZhdWx0KSwgTk9UX0ZPVU5EICg0MDQsIGEgbWlzc2luZyAvIGRlbGV0ZWQgcGluKSwgVE9PTENIQUlOX1BBSVJfTUlTTUFUQ0hcbiAqICg1MDApLCBWQUxJREFUSU9OX0VSUk9SICg0MDAsIGEgbWFsZm9ybWVkIHBpbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTWFuYWdlZFRvb2xjaGFpbihjYWxsZXI6IE1hbmFnZWRUb29sY2hhaW5DYWxsZXIsIG9wdHM6IHsgcmVsZWFzZVBpbj86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPE1hbmFnZWRUb29sY2hhaW5SZXNvbHV0aW9uPiB7XG4gIHJldHVybiByZXNvbHZlTWFuYWdlZFRvb2xjaGFpbldpdGgoZGVmYXVsdERlcHMsIGNhbGxlciwgb3B0cyk7XG59XG5cbi8qKiB7QGxpbmsgaXNFbGlnaWJsZVJlbGVhc2V9IHdpdGggaW5qZWN0ZWQgcmVhZHMgYW5kIGhpZXJhcmNoeSAodGVzdHMpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzRWxpZ2libGVSZWxlYXNlV2l0aChkZXBzOiBNYW5hZ2VkVG9vbGNoYWluRGVwcywgb3JnSWQ6IHN0cmluZywgcmVsZWFzZVZlcnNpb246IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIWlzVG9vbGNoYWluUmVsZWFzZVZlcnNpb24ocmVsZWFzZVZlcnNpb24pKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHNlbGYgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoYWx2ZXMgPSBhd2FpdCBkZXBzLnJlYWQoKGRiKSA9PiBsb2FkUmVsZWFzZUhhbHZlcyhkYiwgcmVsZWFzZVZlcnNpb24pKTtcbiAgaWYgKHJlbGVhc2VMaWZlY3ljbGVQcm9ibGVtcyhoYWx2ZXMpLmxlbmd0aCA+IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKGF3YWl0IGRlcHMucmVhZCgoZGIpID0+IHdhc1BsYXRmb3JtRGVmYXVsdChkYiwgcmVsZWFzZVZlcnNpb24pKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHdhbGsgPSBhd2FpdCBkZXBzLnJlYWQoKGRiKSA9PiBhbnlPcmdTZXR0aW5ncyhkYikpO1xuICBpZiAoIXdhbGspIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY2hhaW4gPSBhd2FpdCB0b29sY2hhaW5PcmdDaGFpbihzZWxmLCBkZXBzLmdldFBhcmVudCk7XG4gIGNvbnN0IGNhbmFyeSA9IGF3YWl0IGRlcHMucmVhZCgoZGIpID0+IG5lYXJlc3RPbkNoYWluKGRiLCBzY2hlbWEudG9vbGNoYWluUm9sbG91dCwgY2hhaW4pKTtcbiAgcmV0dXJuIGNhbmFyeT8ucmVsZWFzZVZlcnNpb24gPT09IHJlbGVhc2VWZXJzaW9uO1xufVxuXG4vKipcbiAqIEQxNTogd2hldGhlciBgb3JnSWRgIG1heSBTRVQgYHJlbGVhc2VWZXJzaW9uYCBhcyBhIHBpcGVsaW5lIHBpbiBvciBpdHMgb3JnXG4gKiBkZWZhdWx0IOKAlCBib3RoIGhhbHZlcyBsaXZlIChhY3RpdmUsIHVueWFua2VkLCBub3QgZGVwcmVjYXRlZCkgQU5EIGVpdGhlciBpdFxuICogaGFzIGJlZW4gdGhlIHBsYXRmb3JtIGRlZmF1bHQgb3IgaXQgaXMgdGhlIGNhbGxlcidzIGNhbmFyeSAobmVhcmVzdFxuICogbWVtYmVyc2hpcCBvbiBpdHMgY2hhaW4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGlnaWJsZVJlbGVhc2Uob3JnSWQ6IHN0cmluZywgcmVsZWFzZVZlcnNpb246IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gaXNFbGlnaWJsZVJlbGVhc2VXaXRoKGRlZmF1bHREZXBzLCBvcmdJZCwgcmVsZWFzZVZlcnNpb24pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIG9yZydzIG93biBwaWN0dXJlOiB0aGUgb3JnLWRlZmF1bHQgcGFuZWwgYW5kIHRoZSBlbGlnaWJsZS1yZWxlYXNlIGxpc3Rcbi8vIChkb2NzL3BsYW5zL2Jvb3RzdHJhcC1pbWFnZS12ZXJzaW9uaW5nLm1kIMKnNSwgUGhhc2UgNCwgRDE1KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBXaGF0IHRoZSBvcmctZGVmYXVsdCBwYW5lbCBzaG93cyBhIGNhbGxlciBhYm91dCBJVFMgT1dOIG9yZzogbmV2ZXIgYW5vdGhlclxuICogb3JnJ3MgY2hvaWNlLCBhbmQgb2YgdGhlIGFuY2VzdG9ycyBvbmx5IHdoaWNoIG9uZSdzIGRlZmF1bHQgYXBwbGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdUb29sY2hhaW5PdmVydmlldyB7XG4gIC8qKiBUaGUgY2FsbGVyJ3MgY2hhaW4sIG93biBvcmcgZmlyc3QgKGxvd2VyY2FzZWQpLiAqL1xuICBjaGFpbjogc3RyaW5nW107XG4gIC8qKiBXaGF0IHRoZSBvcmcncyBVTlBJTk5FRCBwaXBlbGluZXMgcmVzb2x2ZSB0byBub3cuICovXG4gIGVmZmVjdGl2ZTogeyByZWxlYXNlVmVyc2lvbjogc3RyaW5nOyByZXNvbHZlZFZpYTogVG9vbGNoYWluUmVzb2x2ZWRWaWE7IHdhcm5pbmdzOiBNYW5hZ2VkVG9vbGNoYWluV2FybmluZ1tdIH07XG4gIC8qKiBUaGUgY2FsbGVyIG9yZydzIG93biBgb3JnX3Rvb2xjaGFpbl9kZWZhdWx0YCByb3csIGlmIGl0IHNldCBvbmUuICovXG4gIG93bkRlZmF1bHQ6IE9yZ1Rvb2xjaGFpbkRlZmF1bHQgfCBudWxsO1xuICAvKiogVGhlIGFuY2VzdG9yIHdob3NlIG9yZyBkZWZhdWx0IGFwcGxpZXMsIHdoZW4gdGhlIG9yZyBzZXQgbm9uZSBvZiBpdHMgb3duLiAqL1xuICBpbmhlcml0ZWRGcm9tOiB7IG9yZ0lkOiBzdHJpbmc7IHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcgfSB8IG51bGw7XG4gIC8qKiBUaGUgY2FsbGVyJ3MgY2FuYXJ5IHJlbGVhc2UgKGl0cyBORUFSRVNUIG1lbWJlcnNoaXAgb24gdGhlIGNoYWluKSwgb3IgbnVsbC4gKi9cbiAgY2FuYXJ5UmVsZWFzZTogc3RyaW5nIHwgbnVsbDtcbiAgcGxhdGZvcm1EZWZhdWx0OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKioge0BsaW5rIHJlYWRPcmdUb29sY2hhaW5PdmVydmlld30gd2l0aCBpbmplY3RlZCByZWFkcyBhbmQgaGllcmFyY2h5ICh0ZXN0cykuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE9yZ1Rvb2xjaGFpbk92ZXJ2aWV3V2l0aChkZXBzOiBNYW5hZ2VkVG9vbGNoYWluRGVwcywgb3JnSWQ6IHN0cmluZyk6IFByb21pc2U8T3JnVG9vbGNoYWluT3ZlcnZpZXc+IHtcbiAgY29uc3Qgc2VsZiA9IG9yZ0lkLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHdhbGsgPSBhd2FpdCBkZXBzLnJlYWQoKGRiKSA9PiBhbnlPcmdTZXR0aW5ncyhkYikpO1xuICBjb25zdCBjaGFpbiA9IHdhbGsgPyBhd2FpdCB0b29sY2hhaW5PcmdDaGFpbihzZWxmLCBkZXBzLmdldFBhcmVudCkgOiBbc2VsZl07XG4gIHJldHVybiBkZXBzLnJlYWQoYXN5bmMgKGRiKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLm9yZ1Rvb2xjaGFpbkRlZmF1bHQpXG4gICAgICAud2hlcmUoaW5BcnJheShzcWw8c3RyaW5nPmBsb3dlcigke3NjaGVtYS5vcmdUb29sY2hhaW5EZWZhdWx0Lm9yZ0lkfSlgLCBjaGFpbikpIGFzIE9yZ1Rvb2xjaGFpbkRlZmF1bHRbXTtcbiAgICBjb25zdCBkZXB0aE9mID0gKHI6IE9yZ1Rvb2xjaGFpbkRlZmF1bHQpID0+IGNoYWluLmluZGV4T2Yoci5vcmdJZC50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCBvd25EZWZhdWx0ID0gcm93cy5maW5kKChyKSA9PiBkZXB0aE9mKHIpID09PSAwKSA/PyBudWxsO1xuICAgIGNvbnN0IG5lYXJlc3QgPSByb3dzLmZpbHRlcigocikgPT4gZGVwdGhPZihyKSA+PSAwKS5zb3J0KChhLCBiKSA9PiBkZXB0aE9mKGEpIC0gZGVwdGhPZihiKSlbMF0gPz8gbnVsbDtcbiAgICBjb25zdCBbY2FuYXJ5LCBwbGF0Zm9ybURlZmF1bHQsIHJlc29sdXRpb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgbmVhcmVzdE9uQ2hhaW4oZGIsIHNjaGVtYS50b29sY2hhaW5Sb2xsb3V0LCBjaGFpbiksXG4gICAgICBjdXJyZW50UGxhdGZvcm1EZWZhdWx0KGRiKSxcbiAgICAgIHJlc29sdmVPbkNoYWluKGRiLCBjaGFpbiksXG4gICAgXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYWluLFxuICAgICAgZWZmZWN0aXZlOiB7IHJlbGVhc2VWZXJzaW9uOiByZXNvbHV0aW9uLnJlbGVhc2VWZXJzaW9uLCByZXNvbHZlZFZpYTogcmVzb2x1dGlvbi5yZXNvbHZlZFZpYSwgd2FybmluZ3M6IHJlc29sdXRpb24ud2FybmluZ3MgfSxcbiAgICAgIG93bkRlZmF1bHQsXG4gICAgICBpbmhlcml0ZWRGcm9tOiAhb3duRGVmYXVsdCAmJiBuZWFyZXN0ID8geyBvcmdJZDogbmVhcmVzdC5vcmdJZCwgcmVsZWFzZVZlcnNpb246IG5lYXJlc3QucmVsZWFzZVZlcnNpb24gfSA6IG51bGwsXG4gICAgICBjYW5hcnlSZWxlYXNlOiBjYW5hcnk/LnJlbGVhc2VWZXJzaW9uID8/IG51bGwsXG4gICAgICBwbGF0Zm9ybURlZmF1bHQsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIGNhbGxlciBvcmcncyB0b29sY2hhaW4gb3ZlcnZpZXcgKGVsZXZhdGVkIHJlYWRzLCB0aGUgc2FtZSBjaGFpbiB3YWxrIGFuZFxuICogcHJlY2VkZW5jZSBhcyB7QGxpbmsgcmVzb2x2ZU1hbmFnZWRUb29sY2hhaW59KS4gVGhyb3dzIHdoYXQgdGhlIHJlc29sdmVyXG4gKiB0aHJvd3Mg4oCUIFRPT0xDSEFJTl9OT19ERUZBVUxUICg0MDkpIHdoZW4gbm90aGluZyByZXNvbHZlcyBhdCBhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3JnVG9vbGNoYWluT3ZlcnZpZXcob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8T3JnVG9vbGNoYWluT3ZlcnZpZXc+IHtcbiAgcmV0dXJuIHJlYWRPcmdUb29sY2hhaW5PdmVydmlld1dpdGgoZGVmYXVsdERlcHMsIG9yZ0lkKTtcbn1cblxuLyoqIE9uZSByZWxlYXNlIHRoZSBjYWxsZXIgbWF5IHBpbiBvciBzZXQgKEQxNSksIHdpdGggd2hhdCB0aGUgc2VsZWN0b3JzIHNob3cuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsaWdpYmxlVG9vbGNoYWluUmVsZWFzZSB7XG4gIHJlbGVhc2VWZXJzaW9uOiBzdHJpbmc7XG4gIHJlbGVhc2U6IFRvb2xjaGFpblJlbGVhc2U7XG4gIGJvb3RzdHJhcDogUGx1Z2luO1xuICBzeW50aDogUGx1Z2luO1xuICAvKiogVEhFIHBsYXRmb3JtIGRlZmF1bHQgbm93LiAqL1xuICBpc1BsYXRmb3JtRGVmYXVsdDogYm9vbGVhbjtcbiAgLyoqIFRoZSBjYWxsZXIncyBjYW5hcnkgcmVsZWFzZSAobmVhcmVzdCBtZW1iZXJzaGlwKS4gKi9cbiAgaXNDYW5hcnk6IGJvb2xlYW47XG59XG5cbi8qKiB7QGxpbmsgbGlzdEVsaWdpYmxlUmVsZWFzZXN9IHdpdGggaW5qZWN0ZWQgcmVhZHMgYW5kIGhpZXJhcmNoeSAodGVzdHMpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RFbGlnaWJsZVJlbGVhc2VzV2l0aChkZXBzOiBNYW5hZ2VkVG9vbGNoYWluRGVwcywgb3JnSWQ6IHN0cmluZyk6IFByb21pc2U8eyBwbGF0Zm9ybURlZmF1bHQ6IHN0cmluZyB8IG51bGw7IHJlbGVhc2VzOiBFbGlnaWJsZVRvb2xjaGFpblJlbGVhc2VbXSB9PiB7XG4gIGNvbnN0IHNlbGYgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCB3YWxrID0gYXdhaXQgZGVwcy5yZWFkKChkYikgPT4gYW55T3JnU2V0dGluZ3MoZGIpKTtcbiAgY29uc3QgY2hhaW4gPSB3YWxrID8gYXdhaXQgdG9vbGNoYWluT3JnQ2hhaW4oc2VsZiwgZGVwcy5nZXRQYXJlbnQpIDogW3NlbGZdO1xuICByZXR1cm4gZGVwcy5yZWFkKGFzeW5jIChkYikgPT4ge1xuICAgIGNvbnN0IFtyZWxlYXNlcywgcm93cywgaGlzdG9yeSwgcGxhdGZvcm1EZWZhdWx0LCBjYW5hcnldID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZGIuc2VsZWN0KCkuZnJvbShzY2hlbWEudG9vbGNoYWluUmVsZWFzZSkgYXMgUHJvbWlzZTxUb29sY2hhaW5SZWxlYXNlW10+LFxuICAgICAgZGIuc2VsZWN0KCkuZnJvbShzY2hlbWEucGx1Z2luKS53aGVyZShhbmQoXG4gICAgICAgIGVxKHNjaGVtYS5wbHVnaW4ub3JnSWQsIFNZU1RFTV9PUkdfSUQpLFxuICAgICAgICBpbkFycmF5KHNjaGVtYS5wbHVnaW4ubmFtZSwgWy4uLk1BTkFHRURfVE9PTENIQUlOX1BMVUdJTlNdKSxcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5wbHVnaW4uZGVsZXRlZEF0KSxcbiAgICAgICkpIGFzIFByb21pc2U8UGx1Z2luW10+LFxuICAgICAgZGIuc2VsZWN0KHsgcmVsZWFzZVZlcnNpb246IHNjaGVtYS50b29sY2hhaW5EZWZhdWx0SGlzdG9yeS5yZWxlYXNlVmVyc2lvbiB9KS5mcm9tKHNjaGVtYS50b29sY2hhaW5EZWZhdWx0SGlzdG9yeSkgYXMgUHJvbWlzZTxBcnJheTx7IHJlbGVhc2VWZXJzaW9uOiBzdHJpbmcgfT4+LFxuICAgICAgY3VycmVudFBsYXRmb3JtRGVmYXVsdChkYiksXG4gICAgICBuZWFyZXN0T25DaGFpbihkYiwgc2NoZW1hLnRvb2xjaGFpblJvbGxvdXQsIGNoYWluKSxcbiAgICBdKTtcbiAgICBjb25zdCBwcm9tb3RlZCA9IG5ldyBTZXQoaGlzdG9yeS5tYXAoKGgpID0+IGgucmVsZWFzZVZlcnNpb24pKTtcbiAgICBpZiAocGxhdGZvcm1EZWZhdWx0KSBwcm9tb3RlZC5hZGQocGxhdGZvcm1EZWZhdWx0KTtcbiAgICBjb25zdCBvdXQ6IEVsaWdpYmxlVG9vbGNoYWluUmVsZWFzZVtdID0gW107XG4gICAgZm9yIChjb25zdCByZWxlYXNlIG9mIHJlbGVhc2VzKSB7XG4gICAgICBjb25zdCB2ID0gcmVsZWFzZS5yZWxlYXNlVmVyc2lvbjtcbiAgICAgIGNvbnN0IGhhbHZlczogUmVsZWFzZUhhbHZlcyA9IHtcbiAgICAgICAgcmVsZWFzZVZlcnNpb246IHYsXG4gICAgICAgIHJlbGVhc2UsXG4gICAgICAgIGJvb3RzdHJhcDogcm93cy5maW5kKChwKSA9PiBwLm5hbWUgPT09IEJPT1RTVFJBUCAmJiBwLnZlcnNpb24gPT09IHYpID8/IG51bGwsXG4gICAgICAgIHN5bnRoOiByb3dzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gU1lOVEggJiYgcC52ZXJzaW9uID09PSB2KSA/PyBudWxsLFxuICAgICAgfTtcbiAgICAgIGlmICghcmVsZWFzZUV4aXN0cyhoYWx2ZXMpIHx8IHJlbGVhc2VMaWZlY3ljbGVQcm9ibGVtcyhoYWx2ZXMpLmxlbmd0aCA+IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaXNDYW5hcnkgPSBjYW5hcnk/LnJlbGVhc2VWZXJzaW9uID09PSB2O1xuICAgICAgaWYgKCFwcm9tb3RlZC5oYXModikgJiYgIWlzQ2FuYXJ5KSBjb250aW51ZTtcbiAgICAgIG91dC5wdXNoKHsgcmVsZWFzZVZlcnNpb246IHYsIHJlbGVhc2UsIGJvb3RzdHJhcDogaGFsdmVzLmJvb3RzdHJhcCwgc3ludGg6IGhhbHZlcy5zeW50aCwgaXNQbGF0Zm9ybURlZmF1bHQ6IHBsYXRmb3JtRGVmYXVsdCA9PT0gdiwgaXNDYW5hcnkgfSk7XG4gICAgfVxuICAgIG91dC5zb3J0KChhLCBiKSA9PiBjb21wYXJlU2VtdmVyKGIucmVsZWFzZVZlcnNpb24sIGEucmVsZWFzZVZlcnNpb24pKTtcbiAgICByZXR1cm4geyBwbGF0Zm9ybURlZmF1bHQsIHJlbGVhc2VzOiBvdXQgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXZlcnkgcmVsZWFzZSBgb3JnSWRgIG1heSBTRVQgYXMgYSBwaXBlbGluZSBwaW4gb3IgaXRzIG9yZyBkZWZhdWx0IChEMTUsIHRoZVxuICogc2FtZSBydWxlIGFzIHtAbGluayBpc0VsaWdpYmxlUmVsZWFzZX0pLCBuZXdlc3QgZmlyc3QuIE5ldmVyIGFub3RoZXIgb3JnJ3NcbiAqIGRhdGE6IGEgY2FuYXJ5IGFwcGVhcnMgb25seSB3aGVuIGl0IGlzIHRoZSBjYWxsZXIncyBvd24gKG5lYXJlc3QpIG1lbWJlcnNoaXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RWxpZ2libGVSZWxlYXNlcyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7IHBsYXRmb3JtRGVmYXVsdDogc3RyaW5nIHwgbnVsbDsgcmVsZWFzZXM6IEVsaWdpYmxlVG9vbGNoYWluUmVsZWFzZVtdIH0+IHtcbiAgcmV0dXJuIGxpc3RFbGlnaWJsZVJlbGVhc2VzV2l0aChkZWZhdWx0RGVwcywgb3JnSWQpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2FsbGVyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRWFjaCByZXNvbHZlciByZWZ1c2FsIGNvZGUncyBzdGVwLXJlc29sdXRpb24gcmVmdXNhbCAoYW55dGhpbmcgZWxzZSBpc1xuICogYHRvb2xjaGFpbl91bnJlc29sdmVkYCkuIGBkZXRhaWxzYCByaWRlcyBhbG9uZyBleGNlcHQgZm9yIE5PX0RFRkFVTFQsIHdoaWNoXG4gKiBjYXJyaWVzIG5vbmUgd29ydGggc2hvd2luZy5cbiAqL1xuY29uc3QgUkVGVVNBTF9CWV9DT0RFOiBQYXJ0aWFsPFJlY29yZDxFcnJvckNvZGUsIHsgY29kZTogUmVzb2x1dGlvblJlZnVzYWxbJ2NvZGUnXTsgcmVhc29uOiBzdHJpbmc7IGRldGFpbHM6IGJvb2xlYW4gfT4+ID0ge1xuICBbRXJyb3JDb2RlLk5PVF9GT1VORF06IHsgY29kZTogJ05PVF9GT1VORCcsIHJlYXNvbjogJ3Rvb2xjaGFpbl9yZWxlYXNlX25vdF9mb3VuZCcsIGRldGFpbHM6IHRydWUgfSxcbiAgW0Vycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SXTogeyBjb2RlOiAnTk9UX0ZPVU5EJywgcmVhc29uOiAndG9vbGNoYWluX3JlbGVhc2VfaW52YWxpZCcsIGRldGFpbHM6IHRydWUgfSxcbiAgW0Vycm9yQ29kZS5UT09MQ0hBSU5fTk9fREVGQVVMVF06IHsgY29kZTogJ1BMVUdJTl9VTkFWQUlMQUJMRScsIHJlYXNvbjogJ3Rvb2xjaGFpbl9ub19kZWZhdWx0JywgZGV0YWlsczogZmFsc2UgfSxcbn07XG5jb25zdCBVTlJFU09MVkVEX1JFRlVTQUwgPSB7IGNvZGU6ICdQTFVHSU5fVU5BVkFJTEFCTEUnLCByZWFzb246ICd0b29sY2hhaW5fdW5yZXNvbHZlZCcsIGRldGFpbHM6IHRydWUgfSBhcyBjb25zdDtcblxuLyoqIFRoZSByZXNvbHZlcidzIGVycm9yIGFzIHRoZSByZWZ1c2FsIHNoYXBlIHN0ZXAgcmVzb2x1dGlvbiByZXBvcnRzIChjb250cmFjdCBjaGVjaywgZGVjbGFyZWQgc2lkZSwgZmFjdHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbmFnZWRUb29sY2hhaW5SZWZ1c2FsKGVycjogTWFuYWdlZFRvb2xjaGFpbkVycm9yKTogUmVzb2x1dGlvblJlZnVzYWwge1xuICBjb25zdCByID0gUkVGVVNBTF9CWV9DT0RFW2Vyci5jb2RlIGFzIEVycm9yQ29kZV0gPz8gVU5SRVNPTFZFRF9SRUZVU0FMO1xuICByZXR1cm4geyBjb2RlOiByLmNvZGUsIHJlYXNvbjogci5yZWFzb24sIG1lc3NhZ2U6IGVyci5tZXNzYWdlLCAuLi4oci5kZXRhaWxzICYmIGVyci5kZXRhaWxzID8geyBkZXRhaWxzOiBlcnIuZGV0YWlscyB9IDoge30pIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBPTkUgbWFuYWdlZCBoYWxmIGZvciBhIHN0ZXA6IHRoZSBwbHVnaW4gcm93IHBsdXMgdGhlIHJlc29sdXRpb24sIG9yXG4gKiB0aGUgcmVmdXNhbC4gQW55IG5vbi1yZXNvbHZlciBlcnJvciAoYSBkYXRhYmFzZSBvciBoaWVyYXJjaHkgZmFpbHVyZSlcbiAqIHByb3BhZ2F0ZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlTWFuYWdlZFRvb2xjaGFpbkhhbGYoXG4gIGNhbGxlcjogTWFuYWdlZFRvb2xjaGFpbkNhbGxlcixcbiAgbmFtZTogTWFuYWdlZFRvb2xjaGFpblBsdWdpbixcbiAgb3B0czogeyByZWxlYXNlUGluPzogc3RyaW5nIH0gPSB7fSxcbik6IFByb21pc2U8eyBwbHVnaW46IFBsdWdpbjsgcmVzb2x1dGlvbjogTWFuYWdlZFRvb2xjaGFpblJlc29sdXRpb24gfSB8IHsgcmVmdXNhbDogUmVzb2x1dGlvblJlZnVzYWw7IGVycm9yOiBNYW5hZ2VkVG9vbGNoYWluRXJyb3IgfT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSBhd2FpdCByZXNvbHZlTWFuYWdlZFRvb2xjaGFpbihjYWxsZXIsIG9wdHMpO1xuICAgIHJldHVybiB7IHBsdWdpbjogbmFtZSA9PT0gQk9PVFNUUkFQID8gcmVzb2x1dGlvbi5ib290c3RyYXAgOiByZXNvbHV0aW9uLnN5bnRoLCByZXNvbHV0aW9uIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBNYW5hZ2VkVG9vbGNoYWluRXJyb3IpIHJldHVybiB7IHJlZnVzYWw6IG1hbmFnZWRUb29sY2hhaW5SZWZ1c2FsKGVyciksIGVycm9yOiBlcnIgfTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cbiJdfQ==
@@ -26,22 +26,11 @@
26
26
  * name (typo tolerance), ranked by `ts_rank` + name similarity, blended with the
27
27
  * Bayesian rating and install count when present. Paused listings are hidden.
28
28
  */
29
- import { type PublisherTier } from '@pipeline-builder/api-core';
29
+ import type { PublisherTier } from '@pipeline-builder/api-core';
30
30
  import type { HealthBreakdown } from '../database/drizzle-schema.js';
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;
41
31
  export type DirectoryIconKind = 'vendor' | 'uploaded' | 'monogram' | 'category';
42
32
  export type DirectorySort = 'relevance' | 'rating' | 'installs' | 'updated' | 'name' | 'health';
43
33
  export declare const DIRECTORY_SORTS: readonly DirectorySort[];
44
- export declare const DIRECTORY_TIERS: readonly DirectoryTrustTier[];
45
34
  /** Minimum `word_similarity(query, name)` for a fuzzy name match (typo tolerance). */
46
35
  export declare const FUZZY_NAME_THRESHOLD = 0.3;
47
36
  /** Max query length accepted (longer is truncated, never an error). */
@@ -51,7 +40,7 @@ export declare const DIRECTORY_MAX_LIMIT = 60;
51
40
  export interface DirectorySearchParams {
52
41
  q?: string;
53
42
  category?: string;
54
- tier?: DirectoryTrustTier;
43
+ tier?: PublisherTier;
55
44
  license?: string;
56
45
  computeType?: string;
57
46
  needsSecrets?: boolean;
@@ -64,7 +53,7 @@ export interface DirectoryListingCard {
64
53
  publisher: {
65
54
  handle: string;
66
55
  displayName: string;
67
- tier: DirectoryTrustTier;
56
+ tier: PublisherTier;
68
57
  };
69
58
  name: string;
70
59
  summary: string;
@@ -248,7 +237,7 @@ export interface PublicListingRow {
248
237
  id: string;
249
238
  publisher_handle: string;
250
239
  publisher_display_name: string;
251
- publisher_tier: DirectoryTrustTier;
240
+ publisher_tier: PublisherTier;
252
241
  name: string;
253
242
  category: string;
254
243
  summary: string | null;