velocious 1.0.633 → 1.0.635

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 (50) hide show
  1. package/README.md +21 -1
  2. package/build/background-jobs/lifecycle-client.js +1 -1
  3. package/build/background-jobs/lifecycle-control-server.js +1 -1
  4. package/build/background-jobs/main.js +9 -3
  5. package/build/cli/commands/db/migrate.js +3 -1
  6. package/build/cli/commands/db/tenants/migrate.js +4 -1
  7. package/build/cli/commands/db/tenants/migrations/pending.js +4 -1
  8. package/build/cli/index.js +1 -1
  9. package/build/cli/migration-execution-phase-argument.js +20 -0
  10. package/build/database/migration/index.js +21 -0
  11. package/build/database/migration-execution-phase.js +34 -0
  12. package/build/database/migrator.js +6 -1
  13. package/build/src/background-jobs/lifecycle-client.d.ts +1 -1
  14. package/build/src/background-jobs/lifecycle-client.d.ts.map +1 -1
  15. package/build/src/background-jobs/lifecycle-client.js +2 -2
  16. package/build/src/background-jobs/lifecycle-control-server.js +2 -2
  17. package/build/src/background-jobs/main.d.ts.map +1 -1
  18. package/build/src/background-jobs/main.js +11 -4
  19. package/build/src/cli/commands/db/migrate.d.ts.map +1 -1
  20. package/build/src/cli/commands/db/migrate.js +4 -2
  21. package/build/src/cli/commands/db/tenants/migrate.d.ts.map +1 -1
  22. package/build/src/cli/commands/db/tenants/migrate.js +5 -2
  23. package/build/src/cli/commands/db/tenants/migrations/pending.d.ts.map +1 -1
  24. package/build/src/cli/commands/db/tenants/migrations/pending.js +5 -2
  25. package/build/src/cli/index.js +2 -2
  26. package/build/src/cli/migration-execution-phase-argument.d.ts +7 -0
  27. package/build/src/cli/migration-execution-phase-argument.d.ts.map +1 -0
  28. package/build/src/cli/migration-execution-phase-argument.js +17 -0
  29. package/build/src/database/migration/index.d.ts +13 -0
  30. package/build/src/database/migration/index.d.ts.map +1 -1
  31. package/build/src/database/migration/index.js +19 -1
  32. package/build/src/database/migration-execution-phase.d.ts +18 -0
  33. package/build/src/database/migration-execution-phase.d.ts.map +1 -0
  34. package/build/src/database/migration-execution-phase.js +30 -0
  35. package/build/src/database/migrator.d.ts +4 -1
  36. package/build/src/database/migrator.d.ts.map +1 -1
  37. package/build/src/database/migrator.js +9 -2
  38. package/build/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +1 -1
  40. package/src/background-jobs/lifecycle-client.js +1 -1
  41. package/src/background-jobs/lifecycle-control-server.js +1 -1
  42. package/src/background-jobs/main.js +9 -3
  43. package/src/cli/commands/db/migrate.js +3 -1
  44. package/src/cli/commands/db/tenants/migrate.js +4 -1
  45. package/src/cli/commands/db/tenants/migrations/pending.js +4 -1
  46. package/src/cli/index.js +1 -1
  47. package/src/cli/migration-execution-phase-argument.js +20 -0
  48. package/src/database/migration/index.js +21 -0
  49. package/src/database/migration-execution-phase.js +34 -0
  50. package/src/database/migrator.js +6 -1
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  * Connection-scoped advisory locks with automatic cleanup before pooled connections are reused or closed (see [docs/advisory-locks.md](docs/advisory-locks.md))
8
8
  * Built-in record auditing for model lifecycle changes (see [docs/auditing.md](docs/auditing.md))
9
9
  * Declarative state machines for models, with typed event methods generated into the base model (see [docs/state-machine.md](docs/state-machine.md))
10
- * Migrations for schema changes and UTC datetime storage, including recorded `changeTable` batches that combine operations into one `ALTER` on bulk-capable drivers (see [docs/database-migrations.md](docs/database-migrations.md) and [docs/change-table.md](docs/change-table.md))
10
+ * Migrations for schema changes and UTC datetime storage, including caller-selected `pre-runtime` and `post-publication` execution sets and recorded `changeTable` batches that combine operations into one `ALTER` on bulk-capable drivers (see [docs/database-migrations.md](docs/database-migrations.md), [docs/migration-execution-phases.md](docs/migration-execution-phases.md), and [docs/change-table.md](docs/change-table.md))
11
11
  * Tenant-selected base-model and structure generation with one immutable, fail-closed physical database context; tenant-only model metadata initializes only after that context is active (see [docs/tenant-selected-database-generation.md](docs/tenant-selected-database-generation.md))
12
12
  * Read-only tenant migration deploy preflight with stable JSON output and fail-closed ledger reads (see [docs/tenant-migration-deploy-preflight.md](docs/tenant-migration-deploy-preflight.md))
13
13
  * External packages (engines) that contribute data models, frontend-model resources and migrations to a consuming app (see [docs/packages.md](docs/packages.md))
@@ -59,6 +59,10 @@ npm install velocious
59
59
  npx velocious init
60
60
  ```
61
61
 
62
+ Pinned Git commits can be installed without lifecycle scripts by using a GitHub
63
+ commit archive. Velocious checks in generated `build/` output for this purpose;
64
+ see [Git dependency installation](docs/git-installation.md).
65
+
62
66
  By default, Velocious looks for your configuration in `src/config/configuration.js`. If you keep the configuration elsewhere, make sure your app imports it early and calls `configuration.setCurrent()`.
63
67
 
64
68
  Application initializers may implement `teardown()` and inspect their frozen
@@ -1429,6 +1433,22 @@ Migrations that must be rerunnable can guard changes with `tableExists(...)`, `c
1429
1433
  npx velocious db:migrate
1430
1434
  ```
1431
1435
 
1436
+ Migrations default to the `pre-runtime` phase. A migration can declare
1437
+ `Migration.runInPhase("post-publication")`, and callers can run exactly one
1438
+ declared set while preserving timestamp order, package migrations, database
1439
+ targets, and ledger behavior:
1440
+
1441
+ ```bash
1442
+ npx velocious db:migrate --phase pre-runtime
1443
+ npx velocious db:migrate --phase post-publication
1444
+ ```
1445
+
1446
+ Omitting `--phase` remains backward-compatible and runs all pending migrations.
1447
+ Velocious does not choose when either set runs; the application or deployment
1448
+ caller owns invocation timing. See [migration execution phases](docs/migration-execution-phases.md)
1449
+ for the class API, programmatic selector, require-context behavior, and tenant
1450
+ commands.
1451
+
1432
1452
  Run project seeds from `src/db/seed.js` (default export should be an async function):
1433
1453
 
1434
1454
  ```bash
@@ -6,7 +6,7 @@ import timeout from "awaitery/build/timeout.js"
6
6
  import JsonSocket from "./json-socket.js"
7
7
 
8
8
  const DEFAULT_REQUEST_TIMEOUT_MS = 10000
9
- export const MAX_LIFECYCLE_REQUEST_TIMEOUT_MS = 60000
9
+ export const MAX_LIFECYCLE_REQUEST_TIMEOUT_MS = 120000
10
10
 
11
11
  /** One-request acknowledged lifecycle client. */
12
12
  export default class BackgroundJobsLifecycleClient {
@@ -244,7 +244,7 @@ export default class BackgroundJobsLifecycleControlServer {
244
244
  try {
245
245
  this._validateRequest(message)
246
246
  if (action === "activate") await this.main.activate()
247
- else await this.main.retire()
247
+ else void this.main.retire()
248
248
 
249
249
  this._writeResponse(socket, {
250
250
  type: "background-jobs-lifecycle-ack",
@@ -602,10 +602,14 @@ export default class BackgroundJobsMain {
602
602
  * @returns {Promise<void>} - Activation completion.
603
603
  */
604
604
  async _activate() {
605
+ this.logger.info(() => ["Background jobs generation activation starting", {generationId: this.generationId}])
605
606
  await this._startActiveOwnership()
606
607
  this.lifecycleState = "active"
607
608
  this._creditReadyWorkers()
608
- await this._drain()
609
+ this.logger.info(() => ["Background jobs generation activation acknowledged", {generationId: this.generationId}])
610
+ void this._drain().catch((error) => {
611
+ this.logger.error(() => ["Background jobs generation post-activation drain failed", {error, generationId: this.generationId}])
612
+ })
609
613
  }
610
614
 
611
615
  /**
@@ -614,7 +618,7 @@ export default class BackgroundJobsMain {
614
618
  */
615
619
  retire() {
616
620
  if (!this.generationId) throw new Error("Background jobs generation retirement requires generation mode")
617
- if (this.lifecycleState === "retiring" || this.lifecycleState === "retired") return this._retirementPromise || Promise.resolve()
621
+ if (this.lifecycleState === "retiring" || this.lifecycleState === "retired") return Promise.resolve()
618
622
  if (this.lifecycleState !== "active") throw new Error(`Cannot retire background jobs generation from ${this.lifecycleState}`)
619
623
 
620
624
  this.lifecycleState = "retiring"
@@ -624,8 +628,9 @@ export default class BackgroundJobsMain {
624
628
  this._clearDispatchTimers()
625
629
  this._disconnectBeaconHandlers()
626
630
  this._retirementPromise = this._retire()
631
+ void this._retirementPromise.catch((error) => this._reportConnectionHandlerError(error))
627
632
 
628
- return this._retirementPromise
633
+ return Promise.resolve()
629
634
  }
630
635
 
631
636
  /**
@@ -636,6 +641,7 @@ export default class BackgroundJobsMain {
636
641
  await this.scheduler?.stop()
637
642
  this.scheduler = undefined
638
643
  if (this._drainPromise) await this._drainPromise
644
+ if (this._stopped) return
639
645
 
640
646
  for (const worker of this.workers) {
641
647
  worker.isDraining = true
@@ -1,11 +1,13 @@
1
1
  import BaseCommand from "../../base-command.js"
2
2
  import {digg} from "diggerize"
3
3
  import Migrator from "../../../database/migrator.js"
4
+ import migrationExecutionPhaseArgument from "../../migration-execution-phase-argument.js"
4
5
 
5
6
  export default class DbMigrate extends BaseCommand {
6
7
  async execute() {
8
+ const executionPhase = migrationExecutionPhaseArgument(this.processArgs || [])
7
9
  const migrations = await this.getEnvironmentHandler().findMigrations()
8
- const migrator = new Migrator({configuration: this.getConfiguration()})
10
+ const migrator = new Migrator({configuration: this.getConfiguration(), executionPhase})
9
11
 
10
12
  console.log(`Running ${migrations.length} migrations`)
11
13
 
@@ -4,6 +4,7 @@ import {digg} from "diggerize"
4
4
  import BaseCommand from "../../../base-command.js"
5
5
  import Migrator from "../../../../database/migrator.js"
6
6
  import TenantDatabaseCommandHelper from "../../../tenant-database-command-helper.js"
7
+ import migrationExecutionPhaseArgument from "../../../migration-execution-phase-argument.js"
7
8
 
8
9
  export default class DbTenantsMigrate extends BaseCommand {
9
10
  /**
@@ -11,6 +12,7 @@ export default class DbTenantsMigrate extends BaseCommand {
11
12
  * @returns {Promise<{identifier: string, migrationCount: number, tenantCount: number} | void>} - Result in test mode.
12
13
  */
13
14
  async execute() {
15
+ const executionPhase = migrationExecutionPhaseArgument(this.processArgs || [])
14
16
  const helper = new TenantDatabaseCommandHelper({
15
17
  command: this,
16
18
  identifier: this.processArgs?.[1]
@@ -19,7 +21,8 @@ export default class DbTenantsMigrate extends BaseCommand {
19
21
  const tenantCount = await helper.eachTenant(async ({databaseConfiguration, tenant}) => {
20
22
  const migrator = new Migrator({
21
23
  configuration: this.getConfiguration(),
22
- databaseIdentifiers: [helper.identifier]
24
+ databaseIdentifiers: [helper.identifier],
25
+ executionPhase
23
26
  })
24
27
 
25
28
  let migrationsApplied = 0
@@ -4,6 +4,8 @@ import {digg} from "diggerize"
4
4
  import BaseCommand from "../../../../base-command.js"
5
5
  import TenantDatabaseCommandHelper from "../../../../tenant-database-command-helper.js"
6
6
  import TenantMigrationPendingInspector from "../../../../../database/tenants/migration-pending-inspector.js"
7
+ import { migrationRunsInExecutionPhase } from "../../../../../database/migration-execution-phase.js"
8
+ import migrationExecutionPhaseArgument from "../../../../migration-execution-phase-argument.js"
7
9
 
8
10
  export default class DbTenantsMigrationsPending extends BaseCommand {
9
11
  /**
@@ -11,6 +13,7 @@ export default class DbTenantsMigrationsPending extends BaseCommand {
11
13
  * @returns {Promise<{hasPendingMigrations: boolean, identifier: string, migrationCount: number, pendingTenantCount: number, tenantCount: number}>} - Deploy preflight result.
12
14
  */
13
15
  async execute() {
16
+ const executionPhase = migrationExecutionPhaseArgument(this.processArgs || [])
14
17
  const helper = new TenantDatabaseCommandHelper({
15
18
  command: this,
16
19
  identifier: this.processArgs?.[1]
@@ -24,7 +27,7 @@ export default class DbTenantsMigrationsPending extends BaseCommand {
24
27
 
25
28
  const MigrationClass = await requireMigration(migration.fullPath)
26
29
 
27
- if ((MigrationClass.getDatabaseIdentifiers() || ["default"]).includes(helper.identifier)) {
30
+ if (migrationRunsInExecutionPhase(MigrationClass, executionPhase) && (MigrationClass.getDatabaseIdentifiers() || ["default"]).includes(helper.identifier)) {
28
31
  applicableMigrationVersions.push(migration.date)
29
32
  }
30
33
  }
@@ -1,6 +1,6 @@
1
1
  // @ts-check
2
2
 
3
- const COMMAND_VALUE_OPTIONS = new Set(["--generation", "--initial-generation-state", "--lifecycle-socket", "--socket", "--tenant"])
3
+ const COMMAND_VALUE_OPTIONS = new Set(["--generation", "--initial-generation-state", "--lifecycle-socket", "--phase", "--socket", "--tenant"])
4
4
 
5
5
  export default class VelociousCli {
6
6
  /**
@@ -0,0 +1,20 @@
1
+ // @ts-check
2
+
3
+ import { migrationExecutionPhase } from "../database/migration-execution-phase.js"
4
+
5
+ /**
6
+ * Reads an optional `--phase` value from one command's raw arguments.
7
+ * @param {string[]} processArgs - Raw command arguments including the command name.
8
+ * @returns {import("../database/migration-execution-phase.js").MigrationExecutionPhase | undefined} - Selected phase.
9
+ */
10
+ export default function migrationExecutionPhaseArgument(processArgs) {
11
+ const phaseArgumentIndex = processArgs.indexOf("--phase")
12
+
13
+ if (phaseArgumentIndex < 0) return undefined
14
+
15
+ const phase = processArgs[phaseArgumentIndex + 1]
16
+
17
+ if (!phase || phase.startsWith("-")) throw new Error("Missing value for --phase")
18
+
19
+ return migrationExecutionPhase(phase)
20
+ }
@@ -28,6 +28,7 @@
28
28
  import { convertLegacyDateValueToUtcStorage } from "../datetime-storage.js"
29
29
  import * as inflection from "inflection"
30
30
  import restArgsError from "../../utils/rest-args-error.js"
31
+ import { DEFAULT_MIGRATION_EXECUTION_PHASE, migrationExecutionPhase } from "../migration-execution-phase.js"
31
32
  import ChangeTable from "./change-table.js"
32
33
  import CreateIndexBase from "../query/create-index-base.js"
33
34
  import TableColumn from "../table-data/table-column.js"
@@ -38,6 +39,26 @@ class NotImplementedError extends Error {}
38
39
  export {NotImplementedError}
39
40
 
40
41
  export default class VelociousDatabaseMigration {
42
+ /** @type {import("../migration-execution-phase.js").MigrationExecutionPhase | undefined} */
43
+ static _executionPhase
44
+
45
+ /**
46
+ * Declares when this migration is eligible to run.
47
+ * @param {import("../migration-execution-phase.js").MigrationExecutionPhase} phase - Execution phase.
48
+ * @returns {void} - No return value.
49
+ */
50
+ static runInPhase(phase) {
51
+ this._executionPhase = migrationExecutionPhase(phase)
52
+ }
53
+
54
+ /**
55
+ * Gets the declared execution phase.
56
+ * @returns {import("../migration-execution-phase.js").MigrationExecutionPhase} - Declared execution phase.
57
+ */
58
+ static getExecutionPhase() {
59
+ return this._executionPhase || DEFAULT_MIGRATION_EXECUTION_PHASE
60
+ }
61
+
41
62
  /**
42
63
  * Runs on databases.
43
64
  * @param {string[]} databaseIdentifiers - Database identifiers.
@@ -0,0 +1,34 @@
1
+ // @ts-check
2
+
3
+ /** @typedef {"post-publication" | "pre-runtime"} MigrationExecutionPhase */
4
+
5
+ /** @type {MigrationExecutionPhase} */
6
+ export const DEFAULT_MIGRATION_EXECUTION_PHASE = "pre-runtime"
7
+
8
+ /**
9
+ * Validates and returns one supported migration execution phase.
10
+ * @param {string | undefined} phase - Migration execution phase.
11
+ * @returns {MigrationExecutionPhase} - Validated execution phase.
12
+ */
13
+ export function migrationExecutionPhase(phase) {
14
+ if (phase === undefined) {
15
+ throw new Error("Missing migration execution phase. Expected one of: pre-runtime, post-publication")
16
+ }
17
+ if (phase !== "pre-runtime" && phase !== "post-publication") {
18
+ throw new Error(`Unknown migration execution phase ${JSON.stringify(phase)}. Expected one of: pre-runtime, post-publication`)
19
+ }
20
+
21
+ return phase
22
+ }
23
+
24
+ /**
25
+ * Tests whether a migration class belongs to an optional selected phase.
26
+ * @param {typeof import("./migration/index.js").default} MigrationClass - Migration class.
27
+ * @param {MigrationExecutionPhase | undefined} executionPhase - Optional selected phase.
28
+ * @returns {boolean} - Whether the migration belongs to the selection.
29
+ */
30
+ export function migrationRunsInExecutionPhase(MigrationClass, executionPhase) {
31
+ if (executionPhase === undefined) return true
32
+
33
+ return MigrationClass.getExecutionPhase() === executionPhase
34
+ }
@@ -5,6 +5,7 @@ import * as inflection from "inflection"
5
5
  import Logger from "../logger.js"
6
6
  import MigrationsLedger from "./migrations-ledger.js"
7
7
  import {NotImplementedError} from "./migration/index.js"
8
+ import { migrationExecutionPhase, migrationRunsInExecutionPhase } from "./migration-execution-phase.js"
8
9
  import restArgsError from "../utils/rest-args-error.js"
9
10
 
10
11
  export default class VelociousDatabaseMigrator {
@@ -18,14 +19,16 @@ export default class VelociousDatabaseMigrator {
18
19
  * @param {object} args - Options object.
19
20
  * @param {import("../configuration.js").default} args.configuration - Configuration instance.
20
21
  * @param {string[]} [args.databaseIdentifiers] - Optional database identifiers to migrate.
22
+ * @param {import("./migration-execution-phase.js").MigrationExecutionPhase} [args.executionPhase] - Optional migration execution phase to select.
21
23
  */
22
- constructor({configuration, databaseIdentifiers, ...restArgs}) {
24
+ constructor({configuration, databaseIdentifiers, executionPhase, ...restArgs}) {
23
25
  restArgsError(restArgs)
24
26
 
25
27
  if (!configuration) throw new Error("configuration argument is required")
26
28
 
27
29
  this.configuration = configuration
28
30
  this.databaseIdentifiers = databaseIdentifiers
31
+ this.executionPhase = executionPhase === undefined ? undefined : migrationExecutionPhase(executionPhase)
29
32
  this.logger = new Logger(this)
30
33
  }
31
34
 
@@ -188,6 +191,7 @@ export default class VelociousDatabaseMigrator {
188
191
  if (!MigrationClass || typeof MigrationClass !== "function") {
189
192
  throw new Error(`Migration ${migration.file} must export a default migration class. Type: ${typeof MigrationClass}`)
190
193
  }
194
+ if (!migrationRunsInExecutionPhase(MigrationClass, this.executionPhase)) continue
191
195
  if (!(MigrationClass.getDatabaseIdentifiers() || ["default"]).includes(databaseIdentifier)) continue
192
196
 
193
197
  const migrationInstance = new MigrationClass({configuration: this.configuration, databaseIdentifier, db})
@@ -519,6 +523,7 @@ export default class VelociousDatabaseMigrator {
519
523
  if (!migrationClass || typeof migrationClass !== "function") {
520
524
  throw new Error(`Migration ${migration.file} must export a default migration class. Type: ${typeof migrationClass}`)
521
525
  }
526
+ if (direction == "up" && !migrationRunsInExecutionPhase(migrationClass, this.executionPhase)) return false
522
527
 
523
528
  const migrationDatabaseIdentifiers = migrationClass.getDatabaseIdentifiers() || ["default"]
524
529
 
@@ -1,4 +1,4 @@
1
- export declare const MAX_LIFECYCLE_REQUEST_TIMEOUT_MS = 60000;
1
+ export declare const MAX_LIFECYCLE_REQUEST_TIMEOUT_MS = 120000;
2
2
  /** One-request acknowledged lifecycle client. */
3
3
  export default class BackgroundJobsLifecycleClient {
4
4
  generationId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle-client.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/lifecycle-client.js"],"names":[],"mappings":"AAQA,eAAO,MAAM,gCAAgC,QAAQ,CAAA;AAErD,iDAAiD;AACjD,MAAM,CAAC,OAAO,OAAO,6BAA6B;IAezC,YAAY;IACZ,UAAU;IAIV,gBAAgB;IAnBvB;;;;;;;OAOG;IACH,YAAY,EAAC,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,gBAA6C,EAAC,EALjG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAsB,YAAY,AAAlC,CACA,EADQ,MAAM,CACd;QAAsB,UAAU,AAAhC,CACA,EADQ,MAAM,CACd;QAAsB,gBAAgB,AAAtC,CACF,EADU,MAAM,CAChB;KACmG,EAcnG;IAED;;;OAGG;IACG,QAAQ,IAFD,OAAO,CAAC,OAAO,YAAY,EAAE,sCAAsC,CAAC,CAEtB;IAE3D;;;OAGG;IACG,MAAM,IAFC,OAAO,CAAC,OAAO,YAAY,EAAE,sCAAsC,CAAC,CAE1B;IAEvD;;;;OAIG;IACG,QAAQ,CAAC,MAAM,EAHV,UAAU,GAAG,QAGH,GAFR,OAAO,CAAC,OAAO,YAAY,EAAE,sCAAsC,CAAC,CAOhF;IAED;;;;;;OAMG;IACG,WAAW,CAAC,EAAC,MAAM,EAAE,MAAM,EAAC,EAJ/B;QAAoC,MAAM,EAAlC,UAAU,GAAG,QAAQ,CAC7B;QAA0B,MAAM,EAAxB,WAAW,CACnB;KAE+B,GAFrB,OAAO,CAAC,OAAO,YAAY,EAAE,sCAAsC,CAAC,CA4DhF;CACF"}
1
+ {"version":3,"file":"lifecycle-client.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/lifecycle-client.js"],"names":[],"mappings":"AAQA,eAAO,MAAM,gCAAgC,SAAS,CAAA;AAEtD,iDAAiD;AACjD,MAAM,CAAC,OAAO,OAAO,6BAA6B;IAezC,YAAY;IACZ,UAAU;IAIV,gBAAgB;IAnBvB;;;;;;;OAOG;IACH,YAAY,EAAC,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,gBAA6C,EAAC,EALjG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAsB,YAAY,AAAlC,CACA,EADQ,MAAM,CACd;QAAsB,UAAU,AAAhC,CACA,EADQ,MAAM,CACd;QAAsB,gBAAgB,AAAtC,CACF,EADU,MAAM,CAChB;KACmG,EAcnG;IAED;;;OAGG;IACG,QAAQ,IAFD,OAAO,CAAC,OAAO,YAAY,EAAE,sCAAsC,CAAC,CAEtB;IAE3D;;;OAGG;IACG,MAAM,IAFC,OAAO,CAAC,OAAO,YAAY,EAAE,sCAAsC,CAAC,CAE1B;IAEvD;;;;OAIG;IACG,QAAQ,CAAC,MAAM,EAHV,UAAU,GAAG,QAGH,GAFR,OAAO,CAAC,OAAO,YAAY,EAAE,sCAAsC,CAAC,CAOhF;IAED;;;;;;OAMG;IACG,WAAW,CAAC,EAAC,MAAM,EAAE,MAAM,EAAC,EAJ/B;QAAoC,MAAM,EAAlC,UAAU,GAAG,QAAQ,CAC7B;QAA0B,MAAM,EAAxB,WAAW,CACnB;KAE+B,GAFrB,OAAO,CAAC,OAAO,YAAY,EAAE,sCAAsC,CAAC,CA4DhF;CACF"}
@@ -4,7 +4,7 @@ import net from "node:net";
4
4
  import timeout from "awaitery/build/timeout.js";
5
5
  import JsonSocket from "./json-socket.js";
6
6
  const DEFAULT_REQUEST_TIMEOUT_MS = 10000;
7
- export const MAX_LIFECYCLE_REQUEST_TIMEOUT_MS = 60000;
7
+ export const MAX_LIFECYCLE_REQUEST_TIMEOUT_MS = 120000;
8
8
  /** One-request acknowledged lifecycle client. */
9
9
  export default class BackgroundJobsLifecycleClient {
10
10
  /**
@@ -123,4 +123,4 @@ export default class BackgroundJobsLifecycleClient {
123
123
  });
124
124
  }
125
125
  }
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZ3JvdW5kLWpvYnMvbGlmZWN5Y2xlLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN4QyxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUE7QUFDMUIsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUE7QUFFekMsTUFBTSwwQkFBMEIsR0FBRyxLQUFLLENBQUE7QUFDeEMsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsS0FBSyxDQUFBO0FBRXJELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsT0FBTyxPQUFPLDZCQUE2QjtJQUNoRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixHQUFHLDBCQUEwQixFQUFDO1FBQ2xHLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLHFDQUFxQyxDQUFDO1lBQzNFLFlBQVk7WUFDWixtQkFBbUIsRUFBRSxVQUFVO1lBQy9CLFVBQVUsRUFBRSwrQkFBK0I7U0FDNUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUE7UUFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQTtRQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLGdCQUFnQixHQUFHLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxnQ0FBZ0MsRUFBRSxDQUFDO1lBQ3ZILE1BQU0sSUFBSSxTQUFTLENBQUMscURBQXFELGdDQUFnQyxFQUFFLENBQUMsQ0FBQTtRQUM5RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdC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Q0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUE7b0JBQy9FLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7b0JBQy9CLE9BQU07Z0JBQ1IsQ0FBQztnQkFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssK0JBQStCLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ25HLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUMsQ0FBQyxDQUFBO29CQUN4RixPQUFNO2dCQUNSLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7WUFDbkQsQ0FBQyxDQUFDLENBQUE7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUNqQyxJQUFJLE1BQU0sQ0FBQyxPQUFPO2dCQUFFLE9BQU8sRUFBRSxDQUFBO1FBQy9CLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IG5ldCBmcm9tIFwibm9kZTpuZXRcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IEpzb25Tb2NrZXQgZnJvbSBcIi4vanNvbi1zb2NrZXQuanNcIlxuXG5jb25zdCBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9NUyA9IDEwMDAwXG5leHBvcnQgY29uc3QgTUFYX0xJRkVDWUNMRV9SRVFVRVNUX1RJTUVPVVRfTVMgPSA2MDAwMFxuXG4vKiogT25lLXJlcXVlc3QgYWNrbm93bGVkZ2VkIGxpZmVjeWNsZSBjbGllbnQuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrZ3JvdW5kSm9ic0xpZmVjeWNsZUNsaWVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbGlmZWN5Y2xlIGNsaWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBDbGllbnQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5nZW5lcmF0aW9uSWRdIC0gRXhwbGljaXQgZ2VuZXJhdGlvbiBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnNvY2tldFBhdGhdIC0gRXhwbGljaXQgY29udHJvbCBzb2NrZXQgcGF0aC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnJlcXVlc3RUaW1lb3V0TXNdIC0gUmVxdWVzdCBkZWFkbGluZSBiZWxvdyB0aGUgc3VwZXJ2aXNvciBob29rIHRpbWVvdXQgKGRlZmF1bHQ6IDEwMDAwKS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBnZW5lcmF0aW9uSWQsIHNvY2tldFBhdGgsIHJlcXVlc3RUaW1lb3V0TXMgPSBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9NU30pIHtcbiAgICBjb25zdCBnZW5lcmF0aW9uQ29uZmlnID0gY29uZmlndXJhdGlvbi5yZXNvbHZlQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uQ29uZmlnKHtcbiAgICAgIGdlbmVyYXRpb25JZCxcbiAgICAgIGxpZmVjeWNsZVNvY2tldFBhdGg6IHNvY2tldFBhdGgsXG4gICAgICBzb3VyY2VOYW1lOiBcIkJhY2tncm91bmRKb2JzTGlmZWN5Y2xlQ2xpZW50XCJcbiAgICB9KVxuICAgIHRoaXMuZ2VuZXJhdGlvbklkID0gZ2VuZXJhdGlvbkNvbmZpZy5nZW5lcmF0aW9uSWRcbiAgICB0aGlzLnNvY2tldFBhdGggPSBnZW5lcmF0aW9uQ29uZmlnLmxpZmVjeWNsZVNvY2tldFBhdGhcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocmVxdWVzdFRpbWVvdXRNcykgfHwgcmVxdWVzdFRpbWVvdXRNcyA8IDEgfHwgcmVxdWVzdFRpbWVvdXRNcyA+IE1BWF9MSUZFQ1lDTEVfUkVRVUVTVF9USU1FT1VUX01TKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGByZXF1ZXN0VGltZW91dE1zIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kICR7TUFYX0xJRkVDWUNMRV9SRVFVRVNUX1RJTUVPVVRfTVN9YClcbiAgICB9XG4gICAgdGhpcy5yZXF1ZXN0VGltZW91dE1zID0gcmVxdWVzdFRpbWVvdXRNc1xuICAgIGlmICghdGhpcy5nZW5lcmF0aW9uSWQpIHRocm93IG5ldyBFcnJvcihcIkJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgY2xpZW50IHJlcXVpcmVzIGdlbmVyYXRpb25JZFwiKVxuICAgIGlmICghdGhpcy5zb2NrZXRQYXRoKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIGNsaWVudCByZXF1aXJlcyBsaWZlY3ljbGVTb2NrZXRQYXRoXCIpXG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGVzIHRoZSBnZW5lcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JzR2VuZXJhdGlvbkxpZmVjeWNsZVN0YXRlPn0gLSBSZXN1bHRpbmcgc3RhdGUuXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZSgpIHsgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoXCJhY3RpdmF0ZVwiKSB9XG5cbiAgLyoqXG4gICAqIFJldGlyZXMgdGhlIGdlbmVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uTGlmZWN5Y2xlU3RhdGU+fSAtIFJlc3VsdGluZyBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIHJldGlyZSgpIHsgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoXCJyZXRpcmVcIikgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBleGFjdGx5IG9uZSBsaWZlY3ljbGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtcImFjdGl2YXRlXCIgfCBcInJldGlyZVwifSBhY3Rpb24gLSBMaWZlY3ljbGUgYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JzR2VuZXJhdGlvbkxpZmVjeWNsZVN0YXRlPn0gLSBSZXN1bHRpbmcgc3RhdGUuXG4gICAqL1xuICBhc3luYyBfcmVxdWVzdChhY3Rpb24pIHtcbiAgICByZXR1cm4gYXdhaXQgdGltZW91dCh7XG4gICAgICBlcnJvck1lc3NhZ2U6IGBCYWNrZ3JvdW5kIGpvYnMgJHthY3Rpb259IHJlcXVlc3QgZm9yICR7dGhpcy5nZW5lcmF0aW9uSWR9IHRpbWVkIG91dCBhZnRlciAke3RoaXMucmVxdWVzdFRpbWVvdXRNc31tcyBhdCAke3RoaXMuc29ja2V0UGF0aH1gLFxuICAgICAgdGltZW91dDogdGhpcy5yZXF1ZXN0VGltZW91dE1zXG4gICAgfSwgYXN5bmMgKHtjb250cm9sfSkgPT4gYXdhaXQgdGhpcy5fcnVuUmVxdWVzdCh7YWN0aW9uLCBzaWduYWw6IGNvbnRyb2wuc2lnbmFsfSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgdGhlIGxpZmVjeWNsZSByZXF1ZXN0IHVuZGVyIGl0cyBjYWxsZXItb3duZWQgZGVhZGxpbmUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVxdWVzdCBkZXRhaWxzLlxuICAgKiBAcGFyYW0ge1wiYWN0aXZhdGVcIiB8IFwicmV0aXJlXCJ9IGFyZ3MuYWN0aW9uIC0gTGlmZWN5Y2xlIGFjdGlvbi5cbiAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gYXJncy5zaWduYWwgLSBSZXF1ZXN0IGRlYWRsaW5lIHNpZ25hbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9ic0dlbmVyYXRpb25MaWZlY3ljbGVTdGF0ZT59IC0gUmVzdWx0aW5nIHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgX3J1blJlcXVlc3Qoe2FjdGlvbiwgc2lnbmFsfSkge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJhbmRvbVVVSUQoKVxuICAgIGNvbnN0IHNvY2tldCA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHRoaXMuc29ja2V0UGF0aClcbiAgICBjb25zdCBqc29uU29ja2V0ID0gbmV3IEpzb25Tb2NrZXQoc29ja2V0KVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlXG4gICAgICAvKipcbiAgICAgICAqIFNldHRsZXMgdGhlIHJlcXVlc3Qgb25jZS5cbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gVGVhcmRvd24gb3B0aW9ucy5cbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGVzdHJveV0gLSBEZXN0cm95IGluc3RlYWQgb2YgY2xvc2luZy5cbiAgICAgICAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gY2FsbGJhY2sgLSBTZXR0bGVtZW50IGNhbGxiYWNrLlxuICAgICAgICovXG4gICAgICBjb25zdCBmaW5pc2ggPSAoe2Rlc3Ryb3kgPSBmYWxzZX0sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuXG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZVxuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpXG4gICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcImNvbm5lY3RcIiwgb25Db25uZWN0KVxuICAgICAgICBqc29uU29ja2V0LnJlbW92ZUFsbExpc3RlbmVycygpXG4gICAgICAgIGlmIChkZXN0cm95KSBqc29uU29ja2V0LmRlc3Ryb3koKVxuICAgICAgICBlbHNlIGpzb25Tb2NrZXQuY2xvc2UoKVxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiBmaW5pc2goe2Rlc3Ryb3k6IHRydWV9LCAoKSA9PiByZWplY3Qoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcihcIkJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgcmVxdWVzdCBhYm9ydGVkXCIpKSlcbiAgICAgIGNvbnN0IG9uQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHtcbiAgICAgICAgICB0eXBlOiBcImJhY2tncm91bmQtam9icy1saWZlY3ljbGVcIixcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgZ2VuZXJhdGlvbklkOiB0aGlzLmdlbmVyYXRpb25JZCxcbiAgICAgICAgICByZXF1ZXN0SWRcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KVxuICAgICAganNvblNvY2tldC5vbihcImVycm9yXCIsIChlcnJvcikgPT4gZmluaXNoKHt9LCAoKSA9PiByZWplY3QoZXJyb3IpKSlcbiAgICAgIGpzb25Tb2NrZXQub24oXCJjbG9zZVwiLCAoKSA9PiBmaW5pc2goe2Rlc3Ryb3k6IHRydWV9LCAoKSA9PiByZWplY3QobmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2JzIGxpZmVjeWNsZSBzb2NrZXQgY2xvc2VkIGJlZm9yZSBhY2tub3dsZWRnZW1lbnRcIikpKSlcbiAgICAgIGpzb25Tb2NrZXQub24oXCJtZXNzYWdlXCIsIChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlPy5yZXF1ZXN0SWQgIT09IHJlcXVlc3RJZCB8fCBtZXNzYWdlLmFjdGlvbiAhPT0gYWN0aW9uKSB7XG4gICAgICAgICAgZmluaXNoKHt9LCAoKSA9PiByZWplY3QobmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2JzIGxpZmVjeWNsZSByZXNwb25zZSBkaWQgbm90IG1hdGNoIGl0cyByZXF1ZXN0XCIpKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImJhY2tncm91bmQtam9icy1saWZlY3ljbGUtZXJyb3JcIikge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UuZXJyb3I/Lm1lc3NhZ2UgfHwgXCJCYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIHJlcXVlc3QgZmFpbGVkXCIpXG4gICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLmVycm9yPy5uYW1lID09PSBcInN0cmluZ1wiKSBlcnJvci5uYW1lID0gbWVzc2FnZS5lcnJvci5uYW1lXG4gICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLmVycm9yPy5zdGFjayA9PT0gXCJzdHJpbmdcIikgZXJyb3Iuc3RhY2sgPSBtZXNzYWdlLmVycm9yLnN0YWNrXG4gICAgICAgICAgZmluaXNoKHt9LCAoKSA9PiByZWplY3QoZXJyb3IpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiYmFja2dyb3VuZC1qb2JzLWxpZmVjeWNsZS1hY2tcIiB8fCBtZXNzYWdlLmdlbmVyYXRpb25JZCAhPT0gdGhpcy5nZW5lcmF0aW9uSWQpIHtcbiAgICAgICAgICBmaW5pc2goe30sICgpID0+IHJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgYWNrbm93bGVkZ2VtZW50XCIpKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBmaW5pc2goe30sICgpID0+IHJlc29sdmUobWVzc2FnZS5saWZlY3ljbGVTdGF0ZSkpXG4gICAgICB9KVxuICAgICAgc29ja2V0Lm9uY2UoXCJjb25uZWN0XCIsIG9uQ29ubmVjdClcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgb25BYm9ydCgpXG4gICAgfSlcbiAgfVxufVxuIl19
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZ3JvdW5kLWpvYnMvbGlmZWN5Y2xlLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN4QyxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUE7QUFDMUIsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUE7QUFFekMsTUFBTSwwQkFBMEIsR0FBRyxLQUFLLENBQUE7QUFDeEMsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFBO0FBRXRELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsT0FBTyxPQUFPLDZCQUE2QjtJQUNoRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixHQUFHLDBCQUEwQixFQUFDO1FBQ2xHLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLHFDQUFxQyxDQUFDO1lBQzNFLFlBQVk7WUFDWixtQkFBbUIsRUFBRSxVQUFVO1lBQy9CLFVBQVUsRUFBRSwrQkFBK0I7U0FDNUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUE7UUFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQTtRQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLGdCQUFnQixHQUFHLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxnQ0FBZ0MsRUFBRSxDQUFDO1lBQ3ZILE1BQU0sSUFBSSxTQUFTLENBQUMscURBQXFELGdDQUFnQyxFQUFFLENBQUMsQ0FBQTtRQUM5RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdC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Q0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUE7b0JBQy9FLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7b0JBQy9CLE9BQU07Z0JBQ1IsQ0FBQztnQkFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssK0JBQStCLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ25HLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUMsQ0FBQyxDQUFBO29CQUN4RixPQUFNO2dCQUNSLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7WUFDbkQsQ0FBQyxDQUFDLENBQUE7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUNqQyxJQUFJLE1BQU0sQ0FBQyxPQUFPO2dCQUFFLE9BQU8sRUFBRSxDQUFBO1FBQy9CLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IG5ldCBmcm9tIFwibm9kZTpuZXRcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IEpzb25Tb2NrZXQgZnJvbSBcIi4vanNvbi1zb2NrZXQuanNcIlxuXG5jb25zdCBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9NUyA9IDEwMDAwXG5leHBvcnQgY29uc3QgTUFYX0xJRkVDWUNMRV9SRVFVRVNUX1RJTUVPVVRfTVMgPSAxMjAwMDBcblxuLyoqIE9uZS1yZXF1ZXN0IGFja25vd2xlZGdlZCBsaWZlY3ljbGUgY2xpZW50LiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFja2dyb3VuZEpvYnNMaWZlY3ljbGVDbGllbnQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGxpZmVjeWNsZSBjbGllbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQ2xpZW50IG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2VuZXJhdGlvbklkXSAtIEV4cGxpY2l0IGdlbmVyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zb2NrZXRQYXRoXSAtIEV4cGxpY2l0IGNvbnRyb2wgc29ja2V0IHBhdGguXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5yZXF1ZXN0VGltZW91dE1zXSAtIFJlcXVlc3QgZGVhZGxpbmUgYmVsb3cgdGhlIHN1cGVydmlzb3IgaG9vayB0aW1lb3V0IChkZWZhdWx0OiAxMDAwMCkuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZ2VuZXJhdGlvbklkLCBzb2NrZXRQYXRoLCByZXF1ZXN0VGltZW91dE1zID0gREVGQVVMVF9SRVFVRVNUX1RJTUVPVVRfTVN9KSB7XG4gICAgY29uc3QgZ2VuZXJhdGlvbkNvbmZpZyA9IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZUJhY2tncm91bmRKb2JzR2VuZXJhdGlvbkNvbmZpZyh7XG4gICAgICBnZW5lcmF0aW9uSWQsXG4gICAgICBsaWZlY3ljbGVTb2NrZXRQYXRoOiBzb2NrZXRQYXRoLFxuICAgICAgc291cmNlTmFtZTogXCJCYWNrZ3JvdW5kSm9ic0xpZmVjeWNsZUNsaWVudFwiXG4gICAgfSlcbiAgICB0aGlzLmdlbmVyYXRpb25JZCA9IGdlbmVyYXRpb25Db25maWcuZ2VuZXJhdGlvbklkXG4gICAgdGhpcy5zb2NrZXRQYXRoID0gZ2VuZXJhdGlvbkNvbmZpZy5saWZlY3ljbGVTb2NrZXRQYXRoXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHJlcXVlc3RUaW1lb3V0TXMpIHx8IHJlcXVlc3RUaW1lb3V0TXMgPCAxIHx8IHJlcXVlc3RUaW1lb3V0TXMgPiBNQVhfTElGRUNZQ0xFX1JFUVVFU1RfVElNRU9VVF9NUykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgcmVxdWVzdFRpbWVvdXRNcyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAke01BWF9MSUZFQ1lDTEVfUkVRVUVTVF9USU1FT1VUX01TfWApXG4gICAgfVxuICAgIHRoaXMucmVxdWVzdFRpbWVvdXRNcyA9IHJlcXVlc3RUaW1lb3V0TXNcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGlvbklkKSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIGNsaWVudCByZXF1aXJlcyBnZW5lcmF0aW9uSWRcIilcbiAgICBpZiAoIXRoaXMuc29ja2V0UGF0aCkgdGhyb3cgbmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2JzIGxpZmVjeWNsZSBjbGllbnQgcmVxdWlyZXMgbGlmZWN5Y2xlU29ja2V0UGF0aFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyB0aGUgZ2VuZXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9ic0dlbmVyYXRpb25MaWZlY3ljbGVTdGF0ZT59IC0gUmVzdWx0aW5nIHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgYWN0aXZhdGUoKSB7IHJldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KFwiYWN0aXZhdGVcIikgfVxuXG4gIC8qKlxuICAgKiBSZXRpcmVzIHRoZSBnZW5lcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JzR2VuZXJhdGlvbkxpZmVjeWNsZVN0YXRlPn0gLSBSZXN1bHRpbmcgc3RhdGUuXG4gICAqL1xuICBhc3luYyByZXRpcmUoKSB7IHJldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KFwicmV0aXJlXCIpIH1cblxuICAvKipcbiAgICogU2VuZHMgZXhhY3RseSBvbmUgbGlmZWN5Y2xlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7XCJhY3RpdmF0ZVwiIHwgXCJyZXRpcmVcIn0gYWN0aW9uIC0gTGlmZWN5Y2xlIGFjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9ic0dlbmVyYXRpb25MaWZlY3ljbGVTdGF0ZT59IC0gUmVzdWx0aW5nIHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgX3JlcXVlc3QoYWN0aW9uKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRpbWVvdXQoe1xuICAgICAgZXJyb3JNZXNzYWdlOiBgQmFja2dyb3VuZCBqb2JzICR7YWN0aW9ufSByZXF1ZXN0IGZvciAke3RoaXMuZ2VuZXJhdGlvbklkfSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aGlzLnJlcXVlc3RUaW1lb3V0TXN9bXMgYXQgJHt0aGlzLnNvY2tldFBhdGh9YCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMucmVxdWVzdFRpbWVvdXRNc1xuICAgIH0sIGFzeW5jICh7Y29udHJvbH0pID0+IGF3YWl0IHRoaXMuX3J1blJlcXVlc3Qoe2FjdGlvbiwgc2lnbmFsOiBjb250cm9sLnNpZ25hbH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBsaWZlY3ljbGUgcmVxdWVzdCB1bmRlciBpdHMgY2FsbGVyLW93bmVkIGRlYWRsaW5lLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlcXVlc3QgZGV0YWlscy5cbiAgICogQHBhcmFtIHtcImFjdGl2YXRlXCIgfCBcInJldGlyZVwifSBhcmdzLmFjdGlvbiAtIExpZmVjeWNsZSBhY3Rpb24uXG4gICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IGFyZ3Muc2lnbmFsIC0gUmVxdWVzdCBkZWFkbGluZSBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uTGlmZWN5Y2xlU3RhdGU+fSAtIFJlc3VsdGluZyBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIF9ydW5SZXF1ZXN0KHthY3Rpb24sIHNpZ25hbH0pIHtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSByYW5kb21VVUlEKClcbiAgICBjb25zdCBzb2NrZXQgPSBuZXQuY3JlYXRlQ29ubmVjdGlvbih0aGlzLnNvY2tldFBhdGgpXG4gICAgY29uc3QganNvblNvY2tldCA9IG5ldyBKc29uU29ja2V0KHNvY2tldClcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZVxuICAgICAgLyoqXG4gICAgICAgKiBTZXR0bGVzIHRoZSByZXF1ZXN0IG9uY2UuXG4gICAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFRlYXJkb3duIG9wdGlvbnMuXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRlc3Ryb3ldIC0gRGVzdHJveSBpbnN0ZWFkIG9mIGNsb3NpbmcuXG4gICAgICAgKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrIC0gU2V0dGxlbWVudCBjYWxsYmFjay5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZmluaXNoID0gKHtkZXN0cm95ID0gZmFsc2V9LCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBpZiAoZmluaXNoZWQpIHJldHVyblxuICAgICAgICBmaW5pc2hlZCA9IHRydWVcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KVxuICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoXCJjb25uZWN0XCIsIG9uQ29ubmVjdClcbiAgICAgICAganNvblNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICAgICAgICBpZiAoZGVzdHJveSkganNvblNvY2tldC5kZXN0cm95KClcbiAgICAgICAgZWxzZSBqc29uU29ja2V0LmNsb3NlKClcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4gZmluaXNoKHtkZXN0cm95OiB0cnVlfSwgKCkgPT4gcmVqZWN0KHNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHNpZ25hbC5yZWFzb24gOiBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIHJlcXVlc3QgYWJvcnRlZFwiKSkpXG4gICAgICBjb25zdCBvbkNvbm5lY3QgPSAoKSA9PiB7XG4gICAgICAgIGpzb25Tb2NrZXQuc2VuZCh7XG4gICAgICAgICAgdHlwZTogXCJiYWNrZ3JvdW5kLWpvYnMtbGlmZWN5Y2xlXCIsXG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGdlbmVyYXRpb25JZDogdGhpcy5nZW5lcmF0aW9uSWQsXG4gICAgICAgICAgcmVxdWVzdElkXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydClcbiAgICAgIGpzb25Tb2NrZXQub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IGZpbmlzaCh7fSwgKCkgPT4gcmVqZWN0KGVycm9yKSkpXG4gICAgICBqc29uU29ja2V0Lm9uKFwiY2xvc2VcIiwgKCkgPT4gZmluaXNoKHtkZXN0cm95OiB0cnVlfSwgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcIkJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgc29ja2V0IGNsb3NlZCBiZWZvcmUgYWNrbm93bGVkZ2VtZW50XCIpKSkpXG4gICAgICBqc29uU29ja2V0Lm9uKFwibWVzc2FnZVwiLCAobWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZT8ucmVxdWVzdElkICE9PSByZXF1ZXN0SWQgfHwgbWVzc2FnZS5hY3Rpb24gIT09IGFjdGlvbikge1xuICAgICAgICAgIGZpbmlzaCh7fSwgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcIkJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgcmVzcG9uc2UgZGlkIG5vdCBtYXRjaCBpdHMgcmVxdWVzdFwiKSkpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJiYWNrZ3JvdW5kLWpvYnMtbGlmZWN5Y2xlLWVycm9yXCIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlLmVycm9yPy5tZXNzYWdlIHx8IFwiQmFja2dyb3VuZCBqb2JzIGxpZmVjeWNsZSByZXF1ZXN0IGZhaWxlZFwiKVxuICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZS5lcnJvcj8ubmFtZSA9PT0gXCJzdHJpbmdcIikgZXJyb3IubmFtZSA9IG1lc3NhZ2UuZXJyb3IubmFtZVxuICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZS5lcnJvcj8uc3RhY2sgPT09IFwic3RyaW5nXCIpIGVycm9yLnN0YWNrID0gbWVzc2FnZS5lcnJvci5zdGFja1xuICAgICAgICAgIGZpbmlzaCh7fSwgKCkgPT4gcmVqZWN0KGVycm9yKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcImJhY2tncm91bmQtam9icy1saWZlY3ljbGUtYWNrXCIgfHwgbWVzc2FnZS5nZW5lcmF0aW9uSWQgIT09IHRoaXMuZ2VuZXJhdGlvbklkKSB7XG4gICAgICAgICAgZmluaXNoKHt9LCAoKSA9PiByZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBiYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIGFja25vd2xlZGdlbWVudFwiKSkpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoKHt9LCAoKSA9PiByZXNvbHZlKG1lc3NhZ2UubGlmZWN5Y2xlU3RhdGUpKVxuICAgICAgfSlcbiAgICAgIHNvY2tldC5vbmNlKFwiY29ubmVjdFwiLCBvbkNvbm5lY3QpXG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIG9uQWJvcnQoKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
@@ -240,7 +240,7 @@ export default class BackgroundJobsLifecycleControlServer {
240
240
  if (action === "activate")
241
241
  await this.main.activate();
242
242
  else
243
- await this.main.retire();
243
+ void this.main.retire();
244
244
  this._writeResponse(socket, {
245
245
  type: "background-jobs-lifecycle-ack",
246
246
  action,
@@ -304,4 +304,4 @@ export default class BackgroundJobsLifecycleControlServer {
304
304
  errorEvents.emit("all-error", { ...payload, errorType: "framework-error" });
305
305
  }
306
306
  }
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLWNvbnRyb2wtc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9saWZlY3ljbGUtY29udHJvbC1zZXJ2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDeEMsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFBO0FBQzFCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLFVBQVUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUUvRCxNQUFNLGtCQUFrQixHQUFHLDRFQUE0RSxDQUFBO0FBRXZHLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsT0FBTyxPQUFPLG9DQUFvQztJQUN2RDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQztRQUN6RCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ3RELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQTtRQUN2QixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQTtRQUNwQyw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsS0FBSztR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LFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtZQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUE7WUFDeEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ2QsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gscUJBQXFCLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQztRQUM5QyxNQUFNLE9BQU8sR0FBRztZQUNkLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLG1DQUFtQyxFQUFDO1lBQ3pHLEtBQUs7U0FDTixDQUFBO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN2RCxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzVDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUMsR0FBRyxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFDLENBQUMsQ0FBQTtJQUMzRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IG5ldCBmcm9tIFwibm9kZTpuZXRcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgSnNvblNvY2tldCBmcm9tIFwiLi9qc29uLXNvY2tldC5qc1wiXG5pbXBvcnQgeyB2YWxpZGF0ZUdlbmVyYXRpb25JZCB9IGZyb20gXCIuL2dlbmVyYXRpb24taWRlbnRpdHkuanNcIlxuXG5jb25zdCBSRVFVRVNUX0lEX1BBVFRFUk4gPSAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLThdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pXG5cbi8qKiBQYWNrYWdlLW93bmVkIGFja25vd2xlZGdlZCBsaWZlY3ljbGUgY29udHJvbCBzZXJ2ZXIuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrZ3JvdW5kSm9ic0xpZmVjeWNsZUNvbnRyb2xTZXJ2ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGxpZmVjeWNsZSBjb250cm9sIHNlcnZlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZXJ2ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdlbmVyYXRpb25JZCAtIEV4YWN0IGdlbmVyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9tYWluLmpzXCIpLmRlZmF1bHR9IGFyZ3MubWFpbiAtIE93bmVkIGpvYnMgbWFpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc29ja2V0UGF0aCAtIFJlbGVhc2UtbG9jYWwgVW5peCBzb2NrZXQgcGF0aC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBnZW5lcmF0aW9uSWQsIG1haW4sIHNvY2tldFBhdGh9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuZ2VuZXJhdGlvbklkID0gdmFsaWRhdGVHZW5lcmF0aW9uSWQoZ2VuZXJhdGlvbklkKVxuICAgIHRoaXMubWFpbiA9IG1haW5cbiAgICB0aGlzLnNvY2tldFBhdGggPSBzb2NrZXRQYXRoXG4gICAgLyoqIEB0eXBlIHtuZXQuU2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuc2VydmVyID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHt7ZGV2OiBudW1iZXIsIGlubzogbnVtYmVyfSB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLm93bmVkU29ja2V0SWRlbnRpdHkgPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1NldDxuZXQuU29ja2V0Pn0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gbmV3IFNldCgpXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBzZWN1cmUgbG9jYWwgbGlzdGVuZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHNlY3VyZSBsaXN0ZW4uXG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBhd2FpdCB0aGlzLl92YWxpZGF0ZVBhcmVudERpcmVjdG9yeSgpXG4gICAgYXdhaXQgdGhpcy5fcmVtb3ZlU3RhbGVPd25lZFNvY2tldCgpXG4gICAgY29uc3Qgc2VydmVyID0gbmV0LmNyZWF0ZVNlcnZlcigoc29ja2V0KSA9PiB0aGlzLl9oYW5kbGVDb25uZWN0aW9uKHNvY2tldCkpXG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXJcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNlcnZlci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KVxuICAgICAgICBzZXJ2ZXIubGlzdGVuKHRoaXMuc29ja2V0UGF0aCwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgfSlcbiAgICAgIGF3YWl0IGZzLmNobW9kKHRoaXMuc29ja2V0UGF0aCwgMG82MDApXG4gICAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMubHN0YXQodGhpcy5zb2NrZXRQYXRoKVxuICAgICAgdGhpcy5vd25lZFNvY2tldElkZW50aXR5ID0ge2Rldjogc3RhdC5kZXYsIGlubzogc3RhdC5pbm99XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvd25lZCBsaXN0ZW5lci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gQ2xvc2VzIGNvbm5lY3Rpb25zLCBsaXN0ZW5lciwgYW5kIG9ubHkgaXRzIG93bmVkIHBhdGguXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBmb3IgKGNvbnN0IHNvY2tldCBvZiB0aGlzLmNvbm5lY3Rpb25zKSBzb2NrZXQuZGVzdHJveSgpXG4gICAgdGhpcy5jb25uZWN0aW9ucy5jbGVhcigpXG5cbiAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnNlcnZlclxuICAgIHRoaXMuc2VydmVyID0gdW5kZWZpbmVkXG4gICAgY29uc3QgcHJvdGVjdGVkUmVwbGFjZW1lbnQgPSBhd2FpdCB0aGlzLl9wcm90ZWN0UmVwbGFjZW1lbnREdXJpbmdTZXJ2ZXJDbG9zZSgpXG4gICAgdHJ5IHtcbiAgICAgIGlmIChzZXJ2ZXI/Lmxpc3RlbmluZykgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZXN0b3JlUHJvdGVjdGVkUmVwbGFjZW1lbnQocHJvdGVjdGVkUmVwbGFjZW1lbnQpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuX3VubGlua093bmVkU29ja2V0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHJlcGxhY2VtZW50IGlub2RlIGFzaWRlIGJlY2F1c2UgTm9kZSB1bmxpbmtzIGl0cyBvcmlnaW5hbCBVbml4XG4gICAqIHNvY2tldCBwYXRobmFtZSBkdXJpbmcgYHNlcnZlci5jbG9zZSgpYCB3aXRob3V0IGNoZWNraW5nIHRoZSBpbm9kZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPn0gLSBQcm90ZWN0ZWQgc2libGluZyBwYXRoLlxuICAgKi9cbiAgYXN5bmMgX3Byb3RlY3RSZXBsYWNlbWVudER1cmluZ1NlcnZlckNsb3NlKCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5vd25lZFNvY2tldElkZW50aXR5XG4gICAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgbGV0IHN0YXRcbiAgICB0cnkge1xuICAgICAgc3RhdCA9IGF3YWl0IGZzLmxzdGF0KHRoaXMuc29ja2V0UGF0aClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgaWYgKHN0YXQuZGV2ID09PSBpZGVudGl0eS5kZXYgJiYgc3RhdC5pbm8gPT09IGlkZW50aXR5LmlubykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgY29uc3QgcHJvdGVjdGVkUGF0aCA9IGAke3RoaXMuc29ja2V0UGF0aH0udmVsb2Npb3VzLXByb3RlY3RlZC0ke3JhbmRvbVVVSUQoKX1gXG4gICAgYXdhaXQgZnMucmVuYW1lKHRoaXMuc29ja2V0UGF0aCwgcHJvdGVjdGVkUGF0aClcblxuICAgIHJldHVybiBwcm90ZWN0ZWRQYXRoXG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgYW4gaW5vZGUgcHJvdGVjdGVkIGFjcm9zcyBOb2RlJ3MgYXV0b21hdGljIFVuaXgtc29ja2V0IHVubGluay5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHByb3RlY3RlZFBhdGggLSBQcm90ZWN0ZWQgc2libGluZyBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciByZXN0b3JhdGlvbi5cbiAgICovXG4gIGFzeW5jIF9yZXN0b3JlUHJvdGVjdGVkUmVwbGFjZW1lbnQocHJvdGVjdGVkUGF0aCkge1xuICAgIGlmICghcHJvdGVjdGVkUGF0aCkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMubHN0YXQodGhpcy5zb2NrZXRQYXRoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIGF3YWl0IGZzLnJlbmFtZShwcm90ZWN0ZWRQYXRoLCB0aGlzLnNvY2tldFBhdGgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYExpZmVjeWNsZSBzb2NrZXQgcmVwbGFjZW1lbnQgcHJlc2VydmVkIGF0ICR7cHJvdGVjdGVkUGF0aH0gYmVjYXVzZSBpdHMgb3JpZ2luYWwgcGF0aCB3YXMgb2NjdXBpZWQgZHVyaW5nIGNsb3NlYClcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZXMgdGhhdCB0aGUgcGFyZW50IGlzIGEgcHJvY2Vzcy1vd25lZCByZWFsIGRpcmVjdG9yeSBpbnNpZGUgdGhlIHJlbGVhc2UuICovXG4gIGFzeW5jIF92YWxpZGF0ZVBhcmVudERpcmVjdG9yeSgpIHtcbiAgICBpZiAoIXBhdGguaXNBYnNvbHV0ZSh0aGlzLnNvY2tldFBhdGgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQmFja2dyb3VuZCBqb2JzIGxpZmVjeWNsZSBzb2NrZXQgcGF0aCBtdXN0IGJlIGFic29sdXRlXCIpXG5cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKHRoaXMuc29ja2V0UGF0aClcbiAgICBjb25zdCBwYXJlbnRTdGF0ID0gYXdhaXQgZnMubHN0YXQocGFyZW50UGF0aClcbiAgICBpZiAoIXBhcmVudFN0YXQuaXNEaXJlY3RvcnkoKSB8fCBwYXJlbnRTdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgc29ja2V0IHBhcmVudCBtdXN0IGJlIGEgcmVhbCBkaXJlY3RvcnlcIilcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzLmdldHVpZCA9PT0gXCJmdW5jdGlvblwiICYmIHBhcmVudFN0YXQudWlkICE9PSBwcm9jZXNzLmdldHVpZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIHNvY2tldCBwYXJlbnQgbXVzdCBiZSBvd25lZCBieSB0aGUgcHJvY2VzcyB1c2VyXCIpXG4gICAgfVxuXG4gICAgY29uc3QgW3JlbGVhc2VQYXRoLCByZWFsUGFyZW50UGF0aF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5yZWFscGF0aCh0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCkpLFxuICAgICAgZnMucmVhbHBhdGgocGFyZW50UGF0aClcbiAgICBdKVxuICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShyZWxlYXNlUGF0aCwgcmVhbFBhcmVudFBhdGgpXG4gICAgaWYgKHJlbGF0aXZlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIHNvY2tldCBwYXJlbnQgbXVzdCBiZSBpbnNpZGUgdGhlIHJlbGVhc2UgZGlyZWN0b3J5XCIpXG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbW92ZXMgb25seSBhIHNhbWUtb3duZXIsIHVuY2hhbmdlZCwgc3RhbGUgc29ja2V0IGlub2RlLiAqL1xuICBhc3luYyBfcmVtb3ZlU3RhbGVPd25lZFNvY2tldCgpIHtcbiAgICBsZXQgc3RhdFxuICAgIHRyeSB7XG4gICAgICBzdGF0ID0gYXdhaXQgZnMubHN0YXQodGhpcy5zb2NrZXRQYXRoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHN0YXQuaXNTeW1ib2xpY0xpbmsoKSkgdGhyb3cgbmV3IEVycm9yKFwiUmVmdXNpbmcgbGlmZWN5Y2xlIHNvY2tldCBzeW1saW5rIGNvbGxpc2lvblwiKVxuICAgIGlmICghc3RhdC5pc1NvY2tldCgpKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWZ1c2luZyBsaWZlY3ljbGUgc29ja2V0IG5vbi1zb2NrZXQgY29sbGlzaW9uXCIpXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzLmdldHVpZCA9PT0gXCJmdW5jdGlvblwiICYmIHN0YXQudWlkICE9PSBwcm9jZXNzLmdldHVpZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWZ1c2luZyBsaWZlY3ljbGUgc29ja2V0IG93bmVkIGJ5IGFub3RoZXIgdXNlclwiKVxuICAgIH1cbiAgICBpZiAoYXdhaXQgdGhpcy5fc29ja2V0QWNjZXB0c0Nvbm5lY3Rpb25zKCkpIHRocm93IG5ldyBFcnJvcihcIkJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgc29ja2V0IGlzIGFscmVhZHkgYWN0aXZlXCIpXG5cbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgZnMubHN0YXQodGhpcy5zb2NrZXRQYXRoKVxuICAgIGlmICghY3VycmVudC5pc1NvY2tldCgpIHx8IGN1cnJlbnQuZGV2ICE9PSBzdGF0LmRldiB8fCBjdXJyZW50LmlubyAhPT0gc3RhdC5pbm8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkxpZmVjeWNsZSBzb2NrZXQgY29sbGlzaW9uIGNoYW5nZWQgZHVyaW5nIHN0YWxlIGNsZWFudXBcIilcbiAgICB9XG4gICAgYXdhaXQgZnMudW5saW5rKHRoaXMuc29ja2V0UGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9iZXMgYSBzb2NrZXQgY29sbGlzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBleGlzdGluZyBzb2NrZXQgYWNjZXB0cyBhIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBfc29ja2V0QWNjZXB0c0Nvbm5lY3Rpb25zKCkge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBuZXQuY3JlYXRlQ29ubmVjdGlvbih0aGlzLnNvY2tldFBhdGgpXG4gICAgICBzb2NrZXQub25jZShcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBzb2NrZXQuZW5kKClcbiAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgfSlcbiAgICAgIHNvY2tldC5vbmNlKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChcImNvZGVcIiBpbiBlcnJvciAmJiAoZXJyb3IuY29kZSA9PT0gXCJFQ09OTlJFRlVTRURcIiB8fCBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSkge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKiogVW5saW5rcyB0aGUgcGF0aCBvbmx5IHdoaWxlIGl0IGlzIHN0aWxsIHRoZSBpbm9kZSBjcmVhdGVkIGJ5IHRoaXMgc2VydmVyLiAqL1xuICBhc3luYyBfdW5saW5rT3duZWRTb2NrZXQoKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLm93bmVkU29ja2V0SWRlbnRpdHlcbiAgICB0aGlzLm93bmVkU29ja2V0SWRlbnRpdHkgPSB1bmRlZmluZWRcbiAgICBpZiAoIWlkZW50aXR5KSByZXR1cm5cblxuICAgIGxldCBzdGF0XG4gICAgdHJ5IHtcbiAgICAgIHN0YXQgPSBhd2FpdCBmcy5sc3RhdCh0aGlzLnNvY2tldFBhdGgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVyblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgaWYgKCFzdGF0LmlzU29ja2V0KCkgfHwgc3RhdC5kZXYgIT09IGlkZW50aXR5LmRldiB8fCBzdGF0LmlubyAhPT0gaWRlbnRpdHkuaW5vKSByZXR1cm5cbiAgICBhd2FpdCBmcy51bmxpbmsodGhpcy5zb2NrZXRQYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBsb2NhbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge25ldC5Tb2NrZXR9IHNvY2tldCAtIEFjY2VwdGVkIGxvY2FsIGNvbm5lY3Rpb24uXG4gICAqL1xuICBfaGFuZGxlQ29ubmVjdGlvbihzb2NrZXQpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLmFkZChzb2NrZXQpXG4gICAgc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB0aGlzLmNvbm5lY3Rpb25zLmRlbGV0ZShzb2NrZXQpKVxuICAgIGNvbnN0IGpzb25Tb2NrZXQgPSBuZXcgSnNvblNvY2tldChzb2NrZXQpXG4gICAgbGV0IGhhbmRsZWQgPSBmYWxzZVxuXG4gICAganNvblNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKG1lc3NhZ2UpID0+IHtcbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIHNvY2tldC5kZXN0cm95KClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBoYW5kbGVkID0gdHJ1ZVxuICAgICAgdm9pZCB0aGlzLl9oYW5kbGVSZXF1ZXN0KHttZXNzYWdlLCBzb2NrZXR9KVxuICAgIH0pXG4gICAganNvblNvY2tldC5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5fZW1pdExpZmVjeWNsZUZhaWx1cmUoe2FjdGlvbjogXCJpbnZhbGlkXCIsIGVycm9yLCByZXF1ZXN0SWQ6IFwiaW52YWxpZFwifSlcbiAgICAgIHNvY2tldC5kZXN0cm95KClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgZXhhY3RseSBvbmUgcmVxdWVzdCBhbmQgaG9sZHMgcmV0aXJlbWVudCBvcGVuIHRocm91Z2ggcmVzcG9uc2UgZmx1c2guXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVxdWVzdCBjb250ZXh0LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLm1lc3NhZ2UgLSBQYXJzZWQgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtuZXQuU29ja2V0fSBhcmdzLnNvY2tldCAtIENvbnRyb2wgc29ja2V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0aGUgcmVzcG9uc2UgaXMgcXVldWVkLlxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZVJlcXVlc3Qoe21lc3NhZ2UsIHNvY2tldH0pIHtcbiAgICBjb25zdCBhY3Rpb24gPSBtZXNzYWdlPy5hY3Rpb25cbiAgICBjb25zdCByZXF1ZXN0SWQgPSBtZXNzYWdlPy5yZXF1ZXN0SWRcbiAgICB0aGlzLm1haW4uYWNxdWlyZUxpZmVjeWNsZVJlcXVlc3RMZWFzZSgpXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fdmFsaWRhdGVSZXF1ZXN0KG1lc3NhZ2UpXG4gICAgICBpZiAoYWN0aW9uID09PSBcImFjdGl2YXRlXCIpIGF3YWl0IHRoaXMubWFpbi5hY3RpdmF0ZSgpXG4gICAgICBlbHNlIGF3YWl0IHRoaXMubWFpbi5yZXRpcmUoKVxuXG4gICAgICB0aGlzLl93cml0ZVJlc3BvbnNlKHNvY2tldCwge1xuICAgICAgICB0eXBlOiBcImJhY2tncm91bmQtam9icy1saWZlY3ljbGUtYWNrXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgZ2VuZXJhdGlvbklkOiB0aGlzLmdlbmVyYXRpb25JZCxcbiAgICAgICAgbGlmZWN5Y2xlU3RhdGU6IHRoaXMubWFpbi5nZXRMaWZlY3ljbGVTdGF0ZSgpLFxuICAgICAgICByZXF1ZXN0SWRcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKVxuICAgICAgdGhpcy5fZW1pdExpZmVjeWNsZUZhaWx1cmUoe2FjdGlvbjogdHlwZW9mIGFjdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGFjdGlvbiA6IFwiaW52YWxpZFwiLCBlcnJvcjogbm9ybWFsaXplZEVycm9yLCByZXF1ZXN0SWQ6IHR5cGVvZiByZXF1ZXN0SWQgPT09IFwic3RyaW5nXCIgPyByZXF1ZXN0SWQgOiBcImludmFsaWRcIn0pXG4gICAgICB0aGlzLl93cml0ZVJlc3BvbnNlKHNvY2tldCwge1xuICAgICAgICB0eXBlOiBcImJhY2tncm91bmQtam9icy1saWZlY3ljbGUtZXJyb3JcIixcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBnZW5lcmF0aW9uSWQ6IHR5cGVvZiBtZXNzYWdlPy5nZW5lcmF0aW9uSWQgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlLmdlbmVyYXRpb25JZCA6IFwiaW52YWxpZFwiLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGVycm9yOiB7bmFtZTogbm9ybWFsaXplZEVycm9yLm5hbWUsIG1lc3NhZ2U6IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlLCBzdGFjazogbm9ybWFsaXplZEVycm9yLnN0YWNrfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIG9uZSBsaWZlY3ljbGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gbWVzc2FnZSAtIFJlcXVlc3QuXG4gICAqL1xuICBfdmFsaWRhdGVSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICBpZiAobWVzc2FnZT8udHlwZSAhPT0gXCJiYWNrZ3JvdW5kLWpvYnMtbGlmZWN5Y2xlXCIpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmFja2dyb3VuZCBqb2JzIGxpZmVjeWNsZSByZXF1ZXN0IHR5cGVcIilcbiAgICBpZiAobWVzc2FnZS5hY3Rpb24gIT09IFwiYWN0aXZhdGVcIiAmJiBtZXNzYWdlLmFjdGlvbiAhPT0gXCJyZXRpcmVcIikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIGFjdGlvblwiKVxuICAgIGlmIChtZXNzYWdlLmdlbmVyYXRpb25JZCAhPT0gdGhpcy5nZW5lcmF0aW9uSWQpIHRocm93IG5ldyBFcnJvcihcIkJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgZ2VuZXJhdGlvbiBtaXNtYXRjaFwiKVxuICAgIGlmICh0eXBlb2YgbWVzc2FnZS5yZXF1ZXN0SWQgIT09IFwic3RyaW5nXCIgfHwgIVJFUVVFU1RfSURfUEFUVEVSTi50ZXN0KG1lc3NhZ2UucmVxdWVzdElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIHJlcXVlc3RJZFwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgb25lIGxpZmVjeWNsZSByZXNwb25zZS5cbiAgICogQHBhcmFtIHtuZXQuU29ja2V0fSBzb2NrZXQgLSBSZXNwb25zZSBzb2NrZXQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlc3BvbnNlIC0gUmVzcG9uc2UuXG4gICAqL1xuICBfd3JpdGVSZXNwb25zZShzb2NrZXQsIHJlc3BvbnNlKSB7XG4gICAgc29ja2V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKX1cXG5gLCAoKSA9PiB7XG4gICAgICB0aGlzLm1haW4ucmVsZWFzZUxpZmVjeWNsZVJlcXVlc3RMZWFzZSgpXG4gICAgICBzb2NrZXQuZW5kKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgbGlmZWN5Y2xlIGZhaWx1cmUgd2hlcmUgaWdub3JlZCBob29rIHN0ZGlvIGNhbm5vdCBoaWRlIGl0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEZhaWx1cmUgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYWN0aW9uIC0gUmVxdWVzdGVkIGFjdGlvbi5cbiAgICogQHBhcmFtIHtFcnJvcn0gYXJncy5lcnJvciAtIE9yaWdpbmFsIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXF1ZXN0SWQgLSBSZXF1ZXN0IGlkLlxuICAgKi9cbiAgX2VtaXRMaWZlY3ljbGVGYWlsdXJlKHthY3Rpb24sIGVycm9yLCByZXF1ZXN0SWR9KSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGNvbnRleHQ6IHthY3Rpb24sIGdlbmVyYXRpb25JZDogdGhpcy5nZW5lcmF0aW9uSWQsIHJlcXVlc3RJZCwgc3RhZ2U6IFwiYmFja2dyb3VuZC1qb2JzLWxpZmVjeWNsZS1jb250cm9sXCJ9LFxuICAgICAgZXJyb3JcbiAgICB9XG4gICAgY29uc3QgZXJyb3JFdmVudHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKVxuICAgIGVycm9yRXZlbnRzLmVtaXQoXCJmcmFtZXdvcmstZXJyb3JcIiwgcGF5bG9hZClcbiAgICBlcnJvckV2ZW50cy5lbWl0KFwiYWxsLWVycm9yXCIsIHsuLi5wYXlsb2FkLCBlcnJvclR5cGU6IFwiZnJhbWV3b3JrLWVycm9yXCJ9KVxuICB9XG59XG4iXX0=
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLWNvbnRyb2wtc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9saWZlY3ljbGUtY29udHJvbC1zZXJ2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDeEMsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFBO0FBQzFCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLFVBQVUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUUvRCxNQUFNLGtCQUFrQixHQUFHLDRFQUE0RSxDQUFBO0FBRXZHLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsT0FBTyxPQUFPLG9DQUFvQztJQUN2RDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQztRQUN6RCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ3RELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQTtRQUN2QixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQTtRQUNwQyw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsS0FBSztR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LFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtZQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUE7WUFDeEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ2QsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gscUJBQXFCLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQztRQUM5QyxNQUFNLE9BQU8sR0FBRztZQUNkLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLG1DQUFtQyxFQUFDO1lBQ3pHLEtBQUs7U0FDTixDQUFBO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN2RCxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzVDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUMsR0FBRyxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFDLENBQUMsQ0FBQTtJQUMzRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IG5ldCBmcm9tIFwibm9kZTpuZXRcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgSnNvblNvY2tldCBmcm9tIFwiLi9qc29uLXNvY2tldC5qc1wiXG5pbXBvcnQgeyB2YWxpZGF0ZUdlbmVyYXRpb25JZCB9IGZyb20gXCIuL2dlbmVyYXRpb24taWRlbnRpdHkuanNcIlxuXG5jb25zdCBSRVFVRVNUX0lEX1BBVFRFUk4gPSAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLThdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pXG5cbi8qKiBQYWNrYWdlLW93bmVkIGFja25vd2xlZGdlZCBsaWZlY3ljbGUgY29udHJvbCBzZXJ2ZXIuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrZ3JvdW5kSm9ic0xpZmVjeWNsZUNvbnRyb2xTZXJ2ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGxpZmVjeWNsZSBjb250cm9sIHNlcnZlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZXJ2ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmdlbmVyYXRpb25JZCAtIEV4YWN0IGdlbmVyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9tYWluLmpzXCIpLmRlZmF1bHR9IGFyZ3MubWFpbiAtIE93bmVkIGpvYnMgbWFpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc29ja2V0UGF0aCAtIFJlbGVhc2UtbG9jYWwgVW5peCBzb2NrZXQgcGF0aC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBnZW5lcmF0aW9uSWQsIG1haW4sIHNvY2tldFBhdGh9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuZ2VuZXJhdGlvbklkID0gdmFsaWRhdGVHZW5lcmF0aW9uSWQoZ2VuZXJhdGlvbklkKVxuICAgIHRoaXMubWFpbiA9IG1haW5cbiAgICB0aGlzLnNvY2tldFBhdGggPSBzb2NrZXRQYXRoXG4gICAgLyoqIEB0eXBlIHtuZXQuU2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuc2VydmVyID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHt7ZGV2OiBudW1iZXIsIGlubzogbnVtYmVyfSB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLm93bmVkU29ja2V0SWRlbnRpdHkgPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1NldDxuZXQuU29ja2V0Pn0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gbmV3IFNldCgpXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBzZWN1cmUgbG9jYWwgbGlzdGVuZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHNlY3VyZSBsaXN0ZW4uXG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBhd2FpdCB0aGlzLl92YWxpZGF0ZVBhcmVudERpcmVjdG9yeSgpXG4gICAgYXdhaXQgdGhpcy5fcmVtb3ZlU3RhbGVPd25lZFNvY2tldCgpXG4gICAgY29uc3Qgc2VydmVyID0gbmV0LmNyZWF0ZVNlcnZlcigoc29ja2V0KSA9PiB0aGlzLl9oYW5kbGVDb25uZWN0aW9uKHNvY2tldCkpXG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXJcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNlcnZlci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KVxuICAgICAgICBzZXJ2ZXIubGlzdGVuKHRoaXMuc29ja2V0UGF0aCwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgfSlcbiAgICAgIGF3YWl0IGZzLmNobW9kKHRoaXMuc29ja2V0UGF0aCwgMG82MDApXG4gICAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMubHN0YXQodGhpcy5zb2NrZXRQYXRoKVxuICAgICAgdGhpcy5vd25lZFNvY2tldElkZW50aXR5ID0ge2Rldjogc3RhdC5kZXYsIGlubzogc3RhdC5pbm99XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvd25lZCBsaXN0ZW5lci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gQ2xvc2VzIGNvbm5lY3Rpb25zLCBsaXN0ZW5lciwgYW5kIG9ubHkgaXRzIG93bmVkIHBhdGguXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBmb3IgKGNvbnN0IHNvY2tldCBvZiB0aGlzLmNvbm5lY3Rpb25zKSBzb2NrZXQuZGVzdHJveSgpXG4gICAgdGhpcy5jb25uZWN0aW9ucy5jbGVhcigpXG5cbiAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnNlcnZlclxuICAgIHRoaXMuc2VydmVyID0gdW5kZWZpbmVkXG4gICAgY29uc3QgcHJvdGVjdGVkUmVwbGFjZW1lbnQgPSBhd2FpdCB0aGlzLl9wcm90ZWN0UmVwbGFjZW1lbnREdXJpbmdTZXJ2ZXJDbG9zZSgpXG4gICAgdHJ5IHtcbiAgICAgIGlmIChzZXJ2ZXI/Lmxpc3RlbmluZykgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZXN0b3JlUHJvdGVjdGVkUmVwbGFjZW1lbnQocHJvdGVjdGVkUmVwbGFjZW1lbnQpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuX3VubGlua093bmVkU29ja2V0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHJlcGxhY2VtZW50IGlub2RlIGFzaWRlIGJlY2F1c2UgTm9kZSB1bmxpbmtzIGl0cyBvcmlnaW5hbCBVbml4XG4gICAqIHNvY2tldCBwYXRobmFtZSBkdXJpbmcgYHNlcnZlci5jbG9zZSgpYCB3aXRob3V0IGNoZWNraW5nIHRoZSBpbm9kZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPn0gLSBQcm90ZWN0ZWQgc2libGluZyBwYXRoLlxuICAgKi9cbiAgYXN5bmMgX3Byb3RlY3RSZXBsYWNlbWVudER1cmluZ1NlcnZlckNsb3NlKCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5vd25lZFNvY2tldElkZW50aXR5XG4gICAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgbGV0IHN0YXRcbiAgICB0cnkge1xuICAgICAgc3RhdCA9IGF3YWl0IGZzLmxzdGF0KHRoaXMuc29ja2V0UGF0aClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgaWYgKHN0YXQuZGV2ID09PSBpZGVudGl0eS5kZXYgJiYgc3RhdC5pbm8gPT09IGlkZW50aXR5LmlubykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgY29uc3QgcHJvdGVjdGVkUGF0aCA9IGAke3RoaXMuc29ja2V0UGF0aH0udmVsb2Npb3VzLXByb3RlY3RlZC0ke3JhbmRvbVVVSUQoKX1gXG4gICAgYXdhaXQgZnMucmVuYW1lKHRoaXMuc29ja2V0UGF0aCwgcHJvdGVjdGVkUGF0aClcblxuICAgIHJldHVybiBwcm90ZWN0ZWRQYXRoXG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgYW4gaW5vZGUgcHJvdGVjdGVkIGFjcm9zcyBOb2RlJ3MgYXV0b21hdGljIFVuaXgtc29ja2V0IHVubGluay5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHByb3RlY3RlZFBhdGggLSBQcm90ZWN0ZWQgc2libGluZyBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciByZXN0b3JhdGlvbi5cbiAgICovXG4gIGFzeW5jIF9yZXN0b3JlUHJvdGVjdGVkUmVwbGFjZW1lbnQocHJvdGVjdGVkUGF0aCkge1xuICAgIGlmICghcHJvdGVjdGVkUGF0aCkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMubHN0YXQodGhpcy5zb2NrZXRQYXRoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIGF3YWl0IGZzLnJlbmFtZShwcm90ZWN0ZWRQYXRoLCB0aGlzLnNvY2tldFBhdGgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYExpZmVjeWNsZSBzb2NrZXQgcmVwbGFjZW1lbnQgcHJlc2VydmVkIGF0ICR7cHJvdGVjdGVkUGF0aH0gYmVjYXVzZSBpdHMgb3JpZ2luYWwgcGF0aCB3YXMgb2NjdXBpZWQgZHVyaW5nIGNsb3NlYClcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZXMgdGhhdCB0aGUgcGFyZW50IGlzIGEgcHJvY2Vzcy1vd25lZCByZWFsIGRpcmVjdG9yeSBpbnNpZGUgdGhlIHJlbGVhc2UuICovXG4gIGFzeW5jIF92YWxpZGF0ZVBhcmVudERpcmVjdG9yeSgpIHtcbiAgICBpZiAoIXBhdGguaXNBYnNvbHV0ZSh0aGlzLnNvY2tldFBhdGgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQmFja2dyb3VuZCBqb2JzIGxpZmVjeWNsZSBzb2NrZXQgcGF0aCBtdXN0IGJlIGFic29sdXRlXCIpXG5cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKHRoaXMuc29ja2V0UGF0aClcbiAgICBjb25zdCBwYXJlbnRTdGF0ID0gYXdhaXQgZnMubHN0YXQocGFyZW50UGF0aClcbiAgICBpZiAoIXBhcmVudFN0YXQuaXNEaXJlY3RvcnkoKSB8fCBwYXJlbnRTdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgc29ja2V0IHBhcmVudCBtdXN0IGJlIGEgcmVhbCBkaXJlY3RvcnlcIilcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzLmdldHVpZCA9PT0gXCJmdW5jdGlvblwiICYmIHBhcmVudFN0YXQudWlkICE9PSBwcm9jZXNzLmdldHVpZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIHNvY2tldCBwYXJlbnQgbXVzdCBiZSBvd25lZCBieSB0aGUgcHJvY2VzcyB1c2VyXCIpXG4gICAgfVxuXG4gICAgY29uc3QgW3JlbGVhc2VQYXRoLCByZWFsUGFyZW50UGF0aF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5yZWFscGF0aCh0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCkpLFxuICAgICAgZnMucmVhbHBhdGgocGFyZW50UGF0aClcbiAgICBdKVxuICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShyZWxlYXNlUGF0aCwgcmVhbFBhcmVudFBhdGgpXG4gICAgaWYgKHJlbGF0aXZlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIHNvY2tldCBwYXJlbnQgbXVzdCBiZSBpbnNpZGUgdGhlIHJlbGVhc2UgZGlyZWN0b3J5XCIpXG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbW92ZXMgb25seSBhIHNhbWUtb3duZXIsIHVuY2hhbmdlZCwgc3RhbGUgc29ja2V0IGlub2RlLiAqL1xuICBhc3luYyBfcmVtb3ZlU3RhbGVPd25lZFNvY2tldCgpIHtcbiAgICBsZXQgc3RhdFxuICAgIHRyeSB7XG4gICAgICBzdGF0ID0gYXdhaXQgZnMubHN0YXQodGhpcy5zb2NrZXRQYXRoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHN0YXQuaXNTeW1ib2xpY0xpbmsoKSkgdGhyb3cgbmV3IEVycm9yKFwiUmVmdXNpbmcgbGlmZWN5Y2xlIHNvY2tldCBzeW1saW5rIGNvbGxpc2lvblwiKVxuICAgIGlmICghc3RhdC5pc1NvY2tldCgpKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWZ1c2luZyBsaWZlY3ljbGUgc29ja2V0IG5vbi1zb2NrZXQgY29sbGlzaW9uXCIpXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzLmdldHVpZCA9PT0gXCJmdW5jdGlvblwiICYmIHN0YXQudWlkICE9PSBwcm9jZXNzLmdldHVpZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWZ1c2luZyBsaWZlY3ljbGUgc29ja2V0IG93bmVkIGJ5IGFub3RoZXIgdXNlclwiKVxuICAgIH1cbiAgICBpZiAoYXdhaXQgdGhpcy5fc29ja2V0QWNjZXB0c0Nvbm5lY3Rpb25zKCkpIHRocm93IG5ldyBFcnJvcihcIkJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgc29ja2V0IGlzIGFscmVhZHkgYWN0aXZlXCIpXG5cbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgZnMubHN0YXQodGhpcy5zb2NrZXRQYXRoKVxuICAgIGlmICghY3VycmVudC5pc1NvY2tldCgpIHx8IGN1cnJlbnQuZGV2ICE9PSBzdGF0LmRldiB8fCBjdXJyZW50LmlubyAhPT0gc3RhdC5pbm8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkxpZmVjeWNsZSBzb2NrZXQgY29sbGlzaW9uIGNoYW5nZWQgZHVyaW5nIHN0YWxlIGNsZWFudXBcIilcbiAgICB9XG4gICAgYXdhaXQgZnMudW5saW5rKHRoaXMuc29ja2V0UGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9iZXMgYSBzb2NrZXQgY29sbGlzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBleGlzdGluZyBzb2NrZXQgYWNjZXB0cyBhIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBfc29ja2V0QWNjZXB0c0Nvbm5lY3Rpb25zKCkge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBuZXQuY3JlYXRlQ29ubmVjdGlvbih0aGlzLnNvY2tldFBhdGgpXG4gICAgICBzb2NrZXQub25jZShcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBzb2NrZXQuZW5kKClcbiAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgfSlcbiAgICAgIHNvY2tldC5vbmNlKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChcImNvZGVcIiBpbiBlcnJvciAmJiAoZXJyb3IuY29kZSA9PT0gXCJFQ09OTlJFRlVTRURcIiB8fCBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSkge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKiogVW5saW5rcyB0aGUgcGF0aCBvbmx5IHdoaWxlIGl0IGlzIHN0aWxsIHRoZSBpbm9kZSBjcmVhdGVkIGJ5IHRoaXMgc2VydmVyLiAqL1xuICBhc3luYyBfdW5saW5rT3duZWRTb2NrZXQoKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLm93bmVkU29ja2V0SWRlbnRpdHlcbiAgICB0aGlzLm93bmVkU29ja2V0SWRlbnRpdHkgPSB1bmRlZmluZWRcbiAgICBpZiAoIWlkZW50aXR5KSByZXR1cm5cblxuICAgIGxldCBzdGF0XG4gICAgdHJ5IHtcbiAgICAgIHN0YXQgPSBhd2FpdCBmcy5sc3RhdCh0aGlzLnNvY2tldFBhdGgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVyblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgaWYgKCFzdGF0LmlzU29ja2V0KCkgfHwgc3RhdC5kZXYgIT09IGlkZW50aXR5LmRldiB8fCBzdGF0LmlubyAhPT0gaWRlbnRpdHkuaW5vKSByZXR1cm5cbiAgICBhd2FpdCBmcy51bmxpbmsodGhpcy5zb2NrZXRQYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBsb2NhbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge25ldC5Tb2NrZXR9IHNvY2tldCAtIEFjY2VwdGVkIGxvY2FsIGNvbm5lY3Rpb24uXG4gICAqL1xuICBfaGFuZGxlQ29ubmVjdGlvbihzb2NrZXQpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLmFkZChzb2NrZXQpXG4gICAgc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB0aGlzLmNvbm5lY3Rpb25zLmRlbGV0ZShzb2NrZXQpKVxuICAgIGNvbnN0IGpzb25Tb2NrZXQgPSBuZXcgSnNvblNvY2tldChzb2NrZXQpXG4gICAgbGV0IGhhbmRsZWQgPSBmYWxzZVxuXG4gICAganNvblNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKG1lc3NhZ2UpID0+IHtcbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIHNvY2tldC5kZXN0cm95KClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBoYW5kbGVkID0gdHJ1ZVxuICAgICAgdm9pZCB0aGlzLl9oYW5kbGVSZXF1ZXN0KHttZXNzYWdlLCBzb2NrZXR9KVxuICAgIH0pXG4gICAganNvblNvY2tldC5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5fZW1pdExpZmVjeWNsZUZhaWx1cmUoe2FjdGlvbjogXCJpbnZhbGlkXCIsIGVycm9yLCByZXF1ZXN0SWQ6IFwiaW52YWxpZFwifSlcbiAgICAgIHNvY2tldC5kZXN0cm95KClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgZXhhY3RseSBvbmUgcmVxdWVzdCBhbmQgaG9sZHMgcmV0aXJlbWVudCBvcGVuIHRocm91Z2ggcmVzcG9uc2UgZmx1c2guXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVxdWVzdCBjb250ZXh0LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLm1lc3NhZ2UgLSBQYXJzZWQgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtuZXQuU29ja2V0fSBhcmdzLnNvY2tldCAtIENvbnRyb2wgc29ja2V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0aGUgcmVzcG9uc2UgaXMgcXVldWVkLlxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZVJlcXVlc3Qoe21lc3NhZ2UsIHNvY2tldH0pIHtcbiAgICBjb25zdCBhY3Rpb24gPSBtZXNzYWdlPy5hY3Rpb25cbiAgICBjb25zdCByZXF1ZXN0SWQgPSBtZXNzYWdlPy5yZXF1ZXN0SWRcbiAgICB0aGlzLm1haW4uYWNxdWlyZUxpZmVjeWNsZVJlcXVlc3RMZWFzZSgpXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fdmFsaWRhdGVSZXF1ZXN0KG1lc3NhZ2UpXG4gICAgICBpZiAoYWN0aW9uID09PSBcImFjdGl2YXRlXCIpIGF3YWl0IHRoaXMubWFpbi5hY3RpdmF0ZSgpXG4gICAgICBlbHNlIHZvaWQgdGhpcy5tYWluLnJldGlyZSgpXG5cbiAgICAgIHRoaXMuX3dyaXRlUmVzcG9uc2Uoc29ja2V0LCB7XG4gICAgICAgIHR5cGU6IFwiYmFja2dyb3VuZC1qb2JzLWxpZmVjeWNsZS1hY2tcIixcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBnZW5lcmF0aW9uSWQ6IHRoaXMuZ2VuZXJhdGlvbklkLFxuICAgICAgICBsaWZlY3ljbGVTdGF0ZTogdGhpcy5tYWluLmdldExpZmVjeWNsZVN0YXRlKCksXG4gICAgICAgIHJlcXVlc3RJZFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpXG4gICAgICB0aGlzLl9lbWl0TGlmZWN5Y2xlRmFpbHVyZSh7YWN0aW9uOiB0eXBlb2YgYWN0aW9uID09PSBcInN0cmluZ1wiID8gYWN0aW9uIDogXCJpbnZhbGlkXCIsIGVycm9yOiBub3JtYWxpemVkRXJyb3IsIHJlcXVlc3RJZDogdHlwZW9mIHJlcXVlc3RJZCA9PT0gXCJzdHJpbmdcIiA/IHJlcXVlc3RJZCA6IFwiaW52YWxpZFwifSlcbiAgICAgIHRoaXMuX3dyaXRlUmVzcG9uc2Uoc29ja2V0LCB7XG4gICAgICAgIHR5cGU6IFwiYmFja2dyb3VuZC1qb2JzLWxpZmVjeWNsZS1lcnJvclwiLFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGdlbmVyYXRpb25JZDogdHlwZW9mIG1lc3NhZ2U/LmdlbmVyYXRpb25JZCA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UuZ2VuZXJhdGlvbklkIDogXCJpbnZhbGlkXCIsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgZXJyb3I6IHtuYW1lOiBub3JtYWxpemVkRXJyb3IubmFtZSwgbWVzc2FnZTogbm9ybWFsaXplZEVycm9yLm1lc3NhZ2UsIHN0YWNrOiBub3JtYWxpemVkRXJyb3Iuc3RhY2t9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgb25lIGxpZmVjeWNsZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBtZXNzYWdlIC0gUmVxdWVzdC5cbiAgICovXG4gIF92YWxpZGF0ZVJlcXVlc3QobWVzc2FnZSkge1xuICAgIGlmIChtZXNzYWdlPy50eXBlICE9PSBcImJhY2tncm91bmQtam9icy1saWZlY3ljbGVcIikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYWNrZ3JvdW5kIGpvYnMgbGlmZWN5Y2xlIHJlcXVlc3QgdHlwZVwiKVxuICAgIGlmIChtZXNzYWdlLmFjdGlvbiAhPT0gXCJhY3RpdmF0ZVwiICYmIG1lc3NhZ2UuYWN0aW9uICE9PSBcInJldGlyZVwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgYWN0aW9uXCIpXG4gICAgaWYgKG1lc3NhZ2UuZ2VuZXJhdGlvbklkICE9PSB0aGlzLmdlbmVyYXRpb25JZCkgdGhyb3cgbmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2JzIGxpZmVjeWNsZSBnZW5lcmF0aW9uIG1pc21hdGNoXCIpXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlLnJlcXVlc3RJZCAhPT0gXCJzdHJpbmdcIiB8fCAhUkVRVUVTVF9JRF9QQVRURVJOLnRlc3QobWVzc2FnZS5yZXF1ZXN0SWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhY2tncm91bmQgam9icyBsaWZlY3ljbGUgcmVxdWVzdElkXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBvbmUgbGlmZWN5Y2xlIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge25ldC5Tb2NrZXR9IHNvY2tldCAtIFJlc3BvbnNlIHNvY2tldC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVzcG9uc2UgLSBSZXNwb25zZS5cbiAgICovXG4gIF93cml0ZVJlc3BvbnNlKHNvY2tldCwgcmVzcG9uc2UpIHtcbiAgICBzb2NrZXQud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpfVxcbmAsICgpID0+IHtcbiAgICAgIHRoaXMubWFpbi5yZWxlYXNlTGlmZWN5Y2xlUmVxdWVzdExlYXNlKClcbiAgICAgIHNvY2tldC5lbmQoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBsaWZlY3ljbGUgZmFpbHVyZSB3aGVyZSBpZ25vcmVkIGhvb2sgc3RkaW8gY2Fubm90IGhpZGUgaXQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRmFpbHVyZSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb24gLSBSZXF1ZXN0ZWQgYWN0aW9uLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBhcmdzLmVycm9yIC0gT3JpZ2luYWwgZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlcXVlc3RJZCAtIFJlcXVlc3QgaWQuXG4gICAqL1xuICBfZW1pdExpZmVjeWNsZUZhaWx1cmUoe2FjdGlvbiwgZXJyb3IsIHJlcXVlc3RJZH0pIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgY29udGV4dDoge2FjdGlvbiwgZ2VuZXJhdGlvbklkOiB0aGlzLmdlbmVyYXRpb25JZCwgcmVxdWVzdElkLCBzdGFnZTogXCJiYWNrZ3JvdW5kLWpvYnMtbGlmZWN5Y2xlLWNvbnRyb2xcIn0sXG4gICAgICBlcnJvclxuICAgIH1cbiAgICBjb25zdCBlcnJvckV2ZW50cyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRFcnJvckV2ZW50cygpXG4gICAgZXJyb3JFdmVudHMuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBwYXlsb2FkKVxuICAgIGVycm9yRXZlbnRzLmVtaXQoXCJhbGwtZXJyb3JcIiwgey4uLnBheWxvYWQsIGVycm9yVHlwZTogXCJmcmFtZXdvcmstZXJyb3JcIn0pXG4gIH1cbn1cbiJdfQ==