@dbx-tools/postgres 0.9.153 → 0.9.157

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.
package/index.ts CHANGED
@@ -3,16 +3,20 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
6
- export const PACKAGE_VERSION = "0.9.153";
6
+ export const PACKAGE_VERSION = "0.9.157";
7
7
  export * as advisoryLock from "./src/advisory-lock.ts";
8
8
  export * as bindings from "./src/bindings.ts";
9
+ export * from "./src/bindings.ts";
9
10
  export * as identity from "./src/identity.ts";
10
11
  export * as persistence from "./src/persistence.ts";
11
12
  export * as session from "./src/session.ts";
12
13
  export * as topicBus from "./src/topic-bus.ts";
14
+ export { withAdvisoryLock, withAdvisoryTransactionLock } from "./src/advisory-lock.ts";
13
15
  export type { AdvisoryLockKey, PgPoolLike, PgQueryable } from "./src/advisory-lock.ts";
14
- export { POINTER_VERSION } from "./src/persistence.ts";
15
- export type { DurationInput, ResolvedTopicBusPersistenceOptions } from "./src/persistence.ts";
16
+ export { advisoryLockId, channelName, parseAddress, parseResourcePath, parseSslMode } from "./src/identity.ts";
17
+ export { POINTER_VERSION, resolvePersistenceOptions, provisionMessageBusSchema, messageBusGrantStatements, ttlMilliseconds, cleanupExpired, history, persistedNotify, pointerPayload, decodePointer, readPointer } from "./src/persistence.ts";
18
+ export type { TopicPersistenceScope, DurationInput, TopicBusPersistenceOptions, ResolvedTopicBusPersistenceOptions, StoredTopicMessage, TopicHistoryPage, TopicPointer } from "./src/persistence.ts";
19
+ export { resolvePostgresRole, quotePostgresIdentifier, postgresRoleStatement, postgresServerSettings, postgresConnectionOptions } from "./src/session.ts";
20
+ export type { PostgresConnectionOptions } from "./src/session.ts";
16
21
  export { PostgresTopicBus } from "./src/topic-bus.ts";
17
22
  export type { TopicMetadata, TopicMessage, TopicPublishInput, TopicListener, TopicMetadataProvider, PostgresTopicBusOptions } from "./src/topic-bus.ts";
18
- export * from "./exports.ts";
package/lib/index.d.ts CHANGED
@@ -1,14 +1,18 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
2
- export declare const PACKAGE_VERSION = "0.9.153";
2
+ export declare const PACKAGE_VERSION = "0.9.157";
3
3
  export * as advisoryLock from "./src/advisory-lock.ts";
4
4
  export * as bindings from "./src/bindings.ts";
5
+ export * from "./src/bindings.ts";
5
6
  export * as identity from "./src/identity.ts";
6
7
  export * as persistence from "./src/persistence.ts";
7
8
  export * as session from "./src/session.ts";
8
9
  export * as topicBus from "./src/topic-bus.ts";
10
+ export { withAdvisoryLock, withAdvisoryTransactionLock } from "./src/advisory-lock.ts";
9
11
  export type { AdvisoryLockKey, PgPoolLike, PgQueryable } from "./src/advisory-lock.ts";
10
- export { POINTER_VERSION } from "./src/persistence.ts";
11
- export type { DurationInput, ResolvedTopicBusPersistenceOptions } from "./src/persistence.ts";
12
+ export { advisoryLockId, channelName, parseAddress, parseResourcePath, parseSslMode } from "./src/identity.ts";
13
+ export { POINTER_VERSION, resolvePersistenceOptions, provisionMessageBusSchema, messageBusGrantStatements, ttlMilliseconds, cleanupExpired, history, persistedNotify, pointerPayload, decodePointer, readPointer } from "./src/persistence.ts";
14
+ export type { TopicPersistenceScope, DurationInput, TopicBusPersistenceOptions, ResolvedTopicBusPersistenceOptions, StoredTopicMessage, TopicHistoryPage, TopicPointer } from "./src/persistence.ts";
15
+ export { resolvePostgresRole, quotePostgresIdentifier, postgresRoleStatement, postgresServerSettings, postgresConnectionOptions } from "./src/session.ts";
16
+ export type { PostgresConnectionOptions } from "./src/session.ts";
12
17
  export { PostgresTopicBus } from "./src/topic-bus.ts";
13
18
  export type { TopicMetadata, TopicMessage, TopicPublishInput, TopicListener, TopicMetadataProvider, PostgresTopicBusOptions } from "./src/topic-bus.ts";
14
- export * from "./exports.ts";
package/lib/index.js CHANGED
@@ -2,14 +2,17 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
5
- export const PACKAGE_VERSION = "0.9.153";
5
+ export const PACKAGE_VERSION = "0.9.157";
6
6
  export * as advisoryLock from "./src/advisory-lock.js";
7
7
  export * as bindings from "./src/bindings.js";
8
+ export * from "./src/bindings.js";
8
9
  export * as identity from "./src/identity.js";
9
10
  export * as persistence from "./src/persistence.js";
10
11
  export * as session from "./src/session.js";
11
12
  export * as topicBus from "./src/topic-bus.js";
12
- export { POINTER_VERSION } from "./src/persistence.js";
13
+ export { withAdvisoryLock, withAdvisoryTransactionLock } from "./src/advisory-lock.js";
14
+ export { advisoryLockId, channelName, parseAddress, parseResourcePath, parseSslMode } from "./src/identity.js";
15
+ export { POINTER_VERSION, resolvePersistenceOptions, provisionMessageBusSchema, messageBusGrantStatements, ttlMilliseconds, cleanupExpired, history, persistedNotify, pointerPayload, decodePointer, readPointer } from "./src/persistence.js";
16
+ export { resolvePostgresRole, quotePostgresIdentifier, postgresRoleStatement, postgresServerSettings, postgresConnectionOptions } from "./src/session.js";
13
17
  export { PostgresTopicBus } from "./src/topic-bus.js";
14
- export * from "./exports.js";
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xNTNcIjtcbmV4cG9ydCAqIGFzIGFkdmlzb3J5TG9jayBmcm9tIFwiLi9zcmMvYWR2aXNvcnktbG9jay50c1wiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBlcnNpc3RlbmNlIGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0ICogYXMgc2Vzc2lvbiBmcm9tIFwiLi9zcmMvc2Vzc2lvbi50c1wiO1xuZXhwb3J0ICogYXMgdG9waWNCdXMgZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZHZpc29yeUxvY2tLZXksIFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCB7IFBPSU5URVJfVkVSU0lPTiB9IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBEdXJhdGlvbklucHV0LCBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgeyBQb3N0Z3Jlc1RvcGljQnVzIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb3BpY01ldGFkYXRhLCBUb3BpY01lc3NhZ2UsIFRvcGljUHVibGlzaElucHV0LCBUb3BpY0xpc3RlbmVyLCBUb3BpY01ldGFkYXRhUHJvdmlkZXIsIFBvc3RncmVzVG9waWNCdXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0cy50c1wiO1xuIl19
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxRQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9HLE9BQU8sRUFBRSxlQUFlLEVBQUUseUJBQXlCLEVBQUUseUJBQXlCLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFL08sT0FBTyxFQUFFLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFMUosT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3Bvc3RncmVzXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTU3XCI7XG5leHBvcnQgKiBhcyBhZHZpc29yeUxvY2sgZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBlcnNpc3RlbmNlIGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0ICogYXMgc2Vzc2lvbiBmcm9tIFwiLi9zcmMvc2Vzc2lvbi50c1wiO1xuZXhwb3J0ICogYXMgdG9waWNCdXMgZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHsgd2l0aEFkdmlzb3J5TG9jaywgd2l0aEFkdmlzb3J5VHJhbnNhY3Rpb25Mb2NrIH0gZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWR2aXNvcnlMb2NrS2V5LCBQZ1Bvb2xMaWtlLCBQZ1F1ZXJ5YWJsZSB9IGZyb20gXCIuL3NyYy9hZHZpc29yeS1sb2NrLnRzXCI7XG5leHBvcnQgeyBhZHZpc29yeUxvY2tJZCwgY2hhbm5lbE5hbWUsIHBhcnNlQWRkcmVzcywgcGFyc2VSZXNvdXJjZVBhdGgsIHBhcnNlU3NsTW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHsgUE9JTlRFUl9WRVJTSU9OLCByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zLCBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hLCBtZXNzYWdlQnVzR3JhbnRTdGF0ZW1lbnRzLCB0dGxNaWxsaXNlY29uZHMsIGNsZWFudXBFeHBpcmVkLCBoaXN0b3J5LCBwZXJzaXN0ZWROb3RpZnksIHBvaW50ZXJQYXlsb2FkLCBkZWNvZGVQb2ludGVyLCByZWFkUG9pbnRlciB9IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb3BpY1BlcnNpc3RlbmNlU2NvcGUsIER1cmF0aW9uSW5wdXQsIFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLCBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLCBTdG9yZWRUb3BpY01lc3NhZ2UsIFRvcGljSGlzdG9yeVBhZ2UsIFRvcGljUG9pbnRlciB9IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0IHsgcmVzb2x2ZVBvc3RncmVzUm9sZSwgcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIsIHBvc3RncmVzUm9sZVN0YXRlbWVudCwgcG9zdGdyZXNTZXJ2ZXJTZXR0aW5ncywgcG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zZXNzaW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2Vzc2lvbi50c1wiO1xuZXhwb3J0IHsgUG9zdGdyZXNUb3BpY0J1cyB9IGZyb20gXCIuL3NyYy90b3BpYy1idXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgVG9waWNNZXRhZGF0YSwgVG9waWNNZXNzYWdlLCBUb3BpY1B1Ymxpc2hJbnB1dCwgVG9waWNMaXN0ZW5lciwgVG9waWNNZXRhZGF0YVByb3ZpZGVyLCBQb3N0Z3Jlc1RvcGljQnVzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy90b3BpYy1idXMudHNcIjtcbiJdfQ==
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { LakebaseConnectionInputs, SslMode } from "@dbx-tools/lakebase/address";
6
+ import { type LakebaseConnectionInputs, type SslMode } from "@dbx-tools/lakebase";
7
7
  /** Convert a structured key into a JSON-safe signed 64-bit lock identifier. */
8
8
  export declare function advisoryLockId(key: unknown, explicit?: boolean): string;
9
9
  /** Derive a legal deterministic Postgres channel name from structured input. */
@@ -4,10 +4,8 @@
4
4
  * @module
5
5
  */
6
6
  import { createHash } from "node:crypto";
7
- import { parseAddress as parseLakebaseAddress, parseResourcePath as parseLakebaseResourcePath, parseSslMode as parseLakebaseSslMode, } from "@dbx-tools/lakebase/address";
8
- import * as hash from "@dbx-tools/shared-core/hash";
9
- import * as object from "@dbx-tools/shared-core/object";
10
- import * as stringUtils from "@dbx-tools/shared-core/string-utils";
7
+ import { parseAddress as parseLakebaseAddress, parseResourcePath as parseLakebaseResourcePath, parseSslMode as parseLakebaseSslMode, } from "@dbx-tools/lakebase";
8
+ import { fnvHashWithOptions, toOneOrMany, toStableKey, toIdentifierWithOptions, } from "@dbx-tools/shared-core";
11
9
  const SIGNED_BIGINT_BITS = 64;
12
10
  const MAX_CHANNEL_LENGTH = 63;
13
11
  const CHANNEL_HASH_LENGTH = 6;
@@ -19,25 +17,24 @@ export function advisoryLockId(key, explicit = false) {
19
17
  function resolveAdvisoryLockId(key) {
20
18
  if (typeof key === "bigint")
21
19
  return BigInt.asIntN(SIGNED_BIGINT_BITS, key);
22
- const parts = object.toOneOrMany(key);
20
+ const parts = toOneOrMany(key);
23
21
  const digest = createHash("sha256");
24
22
  parts.forEach((part, index) => {
25
23
  if (index > 0)
26
24
  digest.update(Buffer.from([0]));
27
- digest.update(object.toStableKey(part), "utf8");
25
+ digest.update(toStableKey(part), "utf8");
28
26
  });
29
27
  return digest.digest().readBigInt64BE(0);
30
28
  }
31
29
  /** Derive a legal deterministic Postgres channel name from structured input. */
32
30
  export function channelName(value) {
33
- const parts = object.toOneOrMany(value);
34
- const suffix = hash.fnvHashWithOptions({ length: CHANNEL_HASH_LENGTH }, parts.map((part) => object.toStableKey(part)).join("\u0000"));
31
+ const parts = toOneOrMany(value);
32
+ const suffix = fnvHashWithOptions({ length: CHANNEL_HASH_LENGTH }, parts.map((part) => toStableKey(part)).join("\u0000"));
35
33
  const labelled = parts.filter((part) => {
36
34
  const type = typeof part;
37
35
  return type === "string" || type === "number" || type === "boolean" || type === "bigint";
38
36
  });
39
- const body = stringUtils
40
- .toIdentifierWithOptions({ delimiter: "_" }, ...labelled)
37
+ const body = toIdentifierWithOptions({ delimiter: "_" }, ...labelled)
41
38
  .slice(0, MAX_CHANNEL_LENGTH - suffix.length - 1)
42
39
  .replace(/_+$/, "");
43
40
  const prefix = /^[A-Za-z_]/.test(body) ? body : `${CHANNEL_FALLBACK}_${body}`;
@@ -55,4 +52,4 @@ export function parseResourcePath(input) {
55
52
  export function parseSslMode(input) {
56
53
  return parseLakebaseSslMode(input);
57
54
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekMsT0FBTyxFQUVMLFlBQVksSUFBSSxvQkFBb0IsRUFDcEMsaUJBQWlCLElBQUkseUJBQXlCLEVBQzlDLFlBQVksSUFBSSxvQkFBb0IsR0FFckMsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssSUFBSSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BELE9BQU8sS0FBSyxNQUFNLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFdBQVcsTUFBTSxxQ0FBcUMsQ0FBQztBQUVuRSxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUUvQiwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFZLEVBQUUsUUFBUSxHQUFHLEtBQUs7SUFDM0QsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDaEYsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsR0FBWTtJQUN6QyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM1QixJQUFJLEtBQUssR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYztJQUN4QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDcEMsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsRUFDL0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDN0QsQ0FBQztJQUNGLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNyQyxNQUFNLElBQUksR0FBRyxPQUFPLElBQUksQ0FBQztRQUN6QixPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxRQUFRLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksR0FBRyxXQUFXO1NBQ3JCLHVCQUF1QixDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDO1NBQ3hELEtBQUssQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDaEQsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7SUFDOUUsT0FBTyxHQUFHLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFnQztJQUMzRCxPQUFPLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWdDO0lBQ2hFLE9BQU8seUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWdDO0lBQzNELE9BQU8sb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3Jvc3MtcnVudGltZSBQb3N0Z3JlcyBsb2NrIGFuZCBjaGFubmVsIGlkZW50aXR5IHBvbGljeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5pbXBvcnQge1xuICBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMsXG4gIHBhcnNlQWRkcmVzcyBhcyBwYXJzZUxha2ViYXNlQWRkcmVzcyxcbiAgcGFyc2VSZXNvdXJjZVBhdGggYXMgcGFyc2VMYWtlYmFzZVJlc291cmNlUGF0aCxcbiAgcGFyc2VTc2xNb2RlIGFzIHBhcnNlTGFrZWJhc2VTc2xNb2RlLFxuICBTc2xNb2RlLFxufSBmcm9tIFwiQGRieC10b29scy9sYWtlYmFzZS9hZGRyZXNzXCI7XG5pbXBvcnQgKiBhcyBoYXNoIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2hhc2hcIjtcbmltcG9ydCAqIGFzIG9iamVjdCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL3N0cmluZy11dGlsc1wiO1xuXG5jb25zdCBTSUdORURfQklHSU5UX0JJVFMgPSA2NDtcbmNvbnN0IE1BWF9DSEFOTkVMX0xFTkdUSCA9IDYzO1xuY29uc3QgQ0hBTk5FTF9IQVNIX0xFTkdUSCA9IDY7XG5jb25zdCBDSEFOTkVMX0ZBTExCQUNLID0gXCJidXNcIjtcblxuLyoqIENvbnZlcnQgYSBzdHJ1Y3R1cmVkIGtleSBpbnRvIGEgSlNPTi1zYWZlIHNpZ25lZCA2NC1iaXQgbG9jayBpZGVudGlmaWVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkdmlzb3J5TG9ja0lkKGtleTogdW5rbm93biwgZXhwbGljaXQgPSBmYWxzZSk6IHN0cmluZyB7XG4gIHJldHVybiByZXNvbHZlQWR2aXNvcnlMb2NrSWQoZXhwbGljaXQgPyBCaWdJbnQoU3RyaW5nKGtleSkpIDoga2V5KS50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQWR2aXNvcnlMb2NrSWQoa2V5OiB1bmtub3duKTogYmlnaW50IHtcbiAgaWYgKHR5cGVvZiBrZXkgPT09IFwiYmlnaW50XCIpIHJldHVybiBCaWdJbnQuYXNJbnROKFNJR05FRF9CSUdJTlRfQklUUywga2V5KTtcbiAgY29uc3QgcGFydHMgPSBvYmplY3QudG9PbmVPck1hbnkoa2V5KTtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKTtcbiAgcGFydHMuZm9yRWFjaCgocGFydCwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXggPiAwKSBkaWdlc3QudXBkYXRlKEJ1ZmZlci5mcm9tKFswXSkpO1xuICAgIGRpZ2VzdC51cGRhdGUob2JqZWN0LnRvU3RhYmxlS2V5KHBhcnQpLCBcInV0ZjhcIik7XG4gIH0pO1xuICByZXR1cm4gZGlnZXN0LmRpZ2VzdCgpLnJlYWRCaWdJbnQ2NEJFKDApO1xufVxuXG4vKiogRGVyaXZlIGEgbGVnYWwgZGV0ZXJtaW5pc3RpYyBQb3N0Z3JlcyBjaGFubmVsIG5hbWUgZnJvbSBzdHJ1Y3R1cmVkIGlucHV0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5uZWxOYW1lKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHMgPSBvYmplY3QudG9PbmVPck1hbnkodmFsdWUpO1xuICBjb25zdCBzdWZmaXggPSBoYXNoLmZudkhhc2hXaXRoT3B0aW9ucyhcbiAgICB7IGxlbmd0aDogQ0hBTk5FTF9IQVNIX0xFTkdUSCB9LFxuICAgIHBhcnRzLm1hcCgocGFydCkgPT4gb2JqZWN0LnRvU3RhYmxlS2V5KHBhcnQpKS5qb2luKFwiXFx1MDAwMFwiKSxcbiAgKTtcbiAgY29uc3QgbGFiZWxsZWQgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpID0+IHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHBhcnQ7XG4gICAgcmV0dXJuIHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcImJpZ2ludFwiO1xuICB9KTtcbiAgY29uc3QgYm9keSA9IHN0cmluZ1V0aWxzXG4gICAgLnRvSWRlbnRpZmllcldpdGhPcHRpb25zKHsgZGVsaW1pdGVyOiBcIl9cIiB9LCAuLi5sYWJlbGxlZClcbiAgICAuc2xpY2UoMCwgTUFYX0NIQU5ORUxfTEVOR1RIIC0gc3VmZml4Lmxlbmd0aCAtIDEpXG4gICAgLnJlcGxhY2UoL18rJC8sIFwiXCIpO1xuICBjb25zdCBwcmVmaXggPSAvXltBLVphLXpfXS8udGVzdChib2R5KSA/IGJvZHkgOiBgJHtDSEFOTkVMX0ZBTExCQUNLfV8ke2JvZHl9YDtcbiAgcmV0dXJuIGAke3ByZWZpeH1fJHtzdWZmaXh9YC5yZXBsYWNlKC9fKy9nLCBcIl9cIik7XG59XG5cbi8qKiBQYXJzZSBhIFBvc3RncmVTUUwgVVJMLCBMYWtlYmFzZSByZXNvdXJjZSBwYXRoLCBob3N0bmFtZSwgb3IgcHJvamVjdCBJRC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFkZHJlc3MoaW5wdXQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMge1xuICByZXR1cm4gcGFyc2VMYWtlYmFzZUFkZHJlc3MoaW5wdXQpO1xufVxuXG4vKiogUGFyc2UgYSBjYW5vbmljYWwgTGFrZWJhc2UgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludCwgb3IgZGF0YWJhc2UgcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlc291cmNlUGF0aChpbnB1dDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IExha2ViYXNlQ29ubmVjdGlvbklucHV0cyB7XG4gIHJldHVybiBwYXJzZUxha2ViYXNlUmVzb3VyY2VQYXRoKGlucHV0KTtcbn1cblxuLyoqIFBhcnNlIGEgc3VwcG9ydGVkIFBvc3RncmVTUUwgU1NMIG1vZGUuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTc2xNb2RlKGlucHV0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogU3NsTW9kZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBwYXJzZUxha2ViYXNlU3NsTW9kZShpbnB1dCk7XG59XG4iXX0=
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekMsT0FBTyxFQUNMLFlBQVksSUFBSSxvQkFBb0IsRUFDcEMsaUJBQWlCLElBQUkseUJBQXlCLEVBQzlDLFlBQVksSUFBSSxvQkFBb0IsR0FHckMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsdUJBQXVCLEdBQ3hCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0IsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBWSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQzNELE9BQU8scUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ2hGLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEdBQVk7SUFDekMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM1QixJQUFJLEtBQUssR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFjO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FDL0IsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsRUFDL0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUN0RCxDQUFDO0lBQ0YsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLFFBQVEsQ0FBQztJQUMzRixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sSUFBSSxHQUFHLHVCQUF1QixDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDO1NBQ2xFLEtBQUssQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDaEQsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7SUFDOUUsT0FBTyxHQUFHLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFnQztJQUMzRCxPQUFPLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWdDO0lBQ2hFLE9BQU8seUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWdDO0lBQzNELE9BQU8sb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3Jvc3MtcnVudGltZSBQb3N0Z3JlcyBsb2NrIGFuZCBjaGFubmVsIGlkZW50aXR5IHBvbGljeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5pbXBvcnQge1xuICBwYXJzZUFkZHJlc3MgYXMgcGFyc2VMYWtlYmFzZUFkZHJlc3MsXG4gIHBhcnNlUmVzb3VyY2VQYXRoIGFzIHBhcnNlTGFrZWJhc2VSZXNvdXJjZVBhdGgsXG4gIHBhcnNlU3NsTW9kZSBhcyBwYXJzZUxha2ViYXNlU3NsTW9kZSxcbiAgdHlwZSBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMsXG4gIHR5cGUgU3NsTW9kZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvbGFrZWJhc2VcIjtcbmltcG9ydCB7XG4gIGZudkhhc2hXaXRoT3B0aW9ucyxcbiAgdG9PbmVPck1hbnksXG4gIHRvU3RhYmxlS2V5LFxuICB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuY29uc3QgU0lHTkVEX0JJR0lOVF9CSVRTID0gNjQ7XG5jb25zdCBNQVhfQ0hBTk5FTF9MRU5HVEggPSA2MztcbmNvbnN0IENIQU5ORUxfSEFTSF9MRU5HVEggPSA2O1xuY29uc3QgQ0hBTk5FTF9GQUxMQkFDSyA9IFwiYnVzXCI7XG5cbi8qKiBDb252ZXJ0IGEgc3RydWN0dXJlZCBrZXkgaW50byBhIEpTT04tc2FmZSBzaWduZWQgNjQtYml0IGxvY2sgaWRlbnRpZmllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZpc29yeUxvY2tJZChrZXk6IHVua25vd24sIGV4cGxpY2l0ID0gZmFsc2UpOiBzdHJpbmcge1xuICByZXR1cm4gcmVzb2x2ZUFkdmlzb3J5TG9ja0lkKGV4cGxpY2l0ID8gQmlnSW50KFN0cmluZyhrZXkpKSA6IGtleSkudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFkdmlzb3J5TG9ja0lkKGtleTogdW5rbm93bik6IGJpZ2ludCB7XG4gIGlmICh0eXBlb2Yga2V5ID09PSBcImJpZ2ludFwiKSByZXR1cm4gQmlnSW50LmFzSW50TihTSUdORURfQklHSU5UX0JJVFMsIGtleSk7XG4gIGNvbnN0IHBhcnRzID0gdG9PbmVPck1hbnkoa2V5KTtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKTtcbiAgcGFydHMuZm9yRWFjaCgocGFydCwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXggPiAwKSBkaWdlc3QudXBkYXRlKEJ1ZmZlci5mcm9tKFswXSkpO1xuICAgIGRpZ2VzdC51cGRhdGUodG9TdGFibGVLZXkocGFydCksIFwidXRmOFwiKTtcbiAgfSk7XG4gIHJldHVybiBkaWdlc3QuZGlnZXN0KCkucmVhZEJpZ0ludDY0QkUoMCk7XG59XG5cbi8qKiBEZXJpdmUgYSBsZWdhbCBkZXRlcm1pbmlzdGljIFBvc3RncmVzIGNoYW5uZWwgbmFtZSBmcm9tIHN0cnVjdHVyZWQgaW5wdXQuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbE5hbWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHRvT25lT3JNYW55KHZhbHVlKTtcbiAgY29uc3Qgc3VmZml4ID0gZm52SGFzaFdpdGhPcHRpb25zKFxuICAgIHsgbGVuZ3RoOiBDSEFOTkVMX0hBU0hfTEVOR1RIIH0sXG4gICAgcGFydHMubWFwKChwYXJ0KSA9PiB0b1N0YWJsZUtleShwYXJ0KSkuam9pbihcIlxcdTAwMDBcIiksXG4gICk7XG4gIGNvbnN0IGxhYmVsbGVkID0gcGFydHMuZmlsdGVyKChwYXJ0KSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBwYXJ0O1xuICAgIHJldHVybiB0eXBlID09PSBcInN0cmluZ1wiIHx8IHR5cGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgfHwgdHlwZSA9PT0gXCJiaWdpbnRcIjtcbiAgfSk7XG4gIGNvbnN0IGJvZHkgPSB0b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IGRlbGltaXRlcjogXCJfXCIgfSwgLi4ubGFiZWxsZWQpXG4gICAgLnNsaWNlKDAsIE1BWF9DSEFOTkVMX0xFTkdUSCAtIHN1ZmZpeC5sZW5ndGggLSAxKVxuICAgIC5yZXBsYWNlKC9fKyQvLCBcIlwiKTtcbiAgY29uc3QgcHJlZml4ID0gL15bQS1aYS16X10vLnRlc3QoYm9keSkgPyBib2R5IDogYCR7Q0hBTk5FTF9GQUxMQkFDS31fJHtib2R5fWA7XG4gIHJldHVybiBgJHtwcmVmaXh9XyR7c3VmZml4fWAucmVwbGFjZSgvXysvZywgXCJfXCIpO1xufVxuXG4vKiogUGFyc2UgYSBQb3N0Z3JlU1FMIFVSTCwgTGFrZWJhc2UgcmVzb3VyY2UgcGF0aCwgaG9zdG5hbWUsIG9yIHByb2plY3QgSUQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBZGRyZXNzKGlucHV0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgcmV0dXJuIHBhcnNlTGFrZWJhc2VBZGRyZXNzKGlucHV0KTtcbn1cblxuLyoqIFBhcnNlIGEgY2Fub25pY2FsIExha2ViYXNlIHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIG9yIGRhdGFiYXNlIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXNvdXJjZVBhdGgoaW5wdXQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMge1xuICByZXR1cm4gcGFyc2VMYWtlYmFzZVJlc291cmNlUGF0aChpbnB1dCk7XG59XG5cbi8qKiBQYXJzZSBhIHN1cHBvcnRlZCBQb3N0Z3JlU1FMIFNTTCBtb2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3NsTW9kZShpbnB1dDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFNzbE1vZGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcGFyc2VMYWtlYmFzZVNzbE1vZGUoaW5wdXQpO1xufVxuIl19
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import { object } from "@dbx-tools/shared-core";
10
+ import { type SerializableValue } from "@dbx-tools/shared-core";
11
11
  import type { PgPoolLike, PgQueryable } from "./advisory-lock.ts";
12
12
  import type { TopicMessage } from "./topic-bus.ts";
13
13
  /** Storage and grant tier for persisted topic messages. */
@@ -35,14 +35,14 @@ export interface ResolvedTopicBusPersistenceOptions {
35
35
  provision: boolean;
36
36
  }
37
37
  /** Persisted topic message plus replay cursor, scope, and expiry metadata. */
38
- export interface StoredTopicMessage<TBody extends object.SerializableValue = object.SerializableValue> {
38
+ export interface StoredTopicMessage<TBody extends SerializableValue = SerializableValue> {
39
39
  cursor: string;
40
40
  expiresAt: string | null;
41
41
  scope: TopicPersistenceScope;
42
42
  message: TopicMessage<TBody>;
43
43
  }
44
44
  /** Ordered replay page and optional cursor for the next page. */
45
- export interface TopicHistoryPage<TBody extends object.SerializableValue = object.SerializableValue> {
45
+ export interface TopicHistoryPage<TBody extends SerializableValue = SerializableValue> {
46
46
  messages: StoredTopicMessage<TBody>[];
47
47
  nextCursor?: string;
48
48
  }
@@ -62,7 +62,7 @@ export declare function ttlMilliseconds(value: DurationInput | false): number |
62
62
  /** Delete one bounded batch of expired persisted topic messages. */
63
63
  export declare function cleanupExpired(queryable: PgQueryable, options: ResolvedTopicBusPersistenceOptions, scope: TopicPersistenceScope, limit?: number): Promise<number>;
64
64
  /** Read a cursor-paginated page of persisted topic history. */
65
- export declare function history<TBody extends object.SerializableValue>(queryable: PgQueryable, channel: string, topic: string, options: ResolvedTopicBusPersistenceOptions, input?: {
65
+ export declare function history<TBody extends SerializableValue>(queryable: PgQueryable, channel: string, topic: string, options: ResolvedTopicBusPersistenceOptions, input?: {
66
66
  after?: string;
67
67
  limit?: number;
68
68
  scope?: TopicPersistenceScope;
@@ -92,4 +92,4 @@ export declare function decodePointer(value: string | undefined): TopicPointer |
92
92
  * is gone (TTL cleanup won the race) or the reader lacks the table's grant, both
93
93
  * of which are expected on the `restricted` tier rather than errors.
94
94
  */
95
- export declare function readPointer<TBody extends object.SerializableValue>(queryable: PgQueryable, channel: string, pointer: TopicPointer, options: ResolvedTopicBusPersistenceOptions): Promise<TopicMessage<TBody> | undefined>;
95
+ export declare function readPointer<TBody extends SerializableValue>(queryable: PgQueryable, channel: string, pointer: TopicPointer, options: ResolvedTopicBusPersistenceOptions): Promise<TopicMessage<TBody> | undefined>;
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import { object } from "@dbx-tools/shared-core";
10
+ import { toDuration } from "@dbx-tools/shared-core";
11
11
  import { withAdvisoryTransactionLock } from "./advisory-lock.js";
12
12
  import { quotePostgresIdentifier } from "./session.js";
13
13
  const DEFAULT_TTL = "24 hours";
@@ -85,7 +85,7 @@ function after(value, scope) {
85
85
  export function ttlMilliseconds(value) {
86
86
  if (value === false)
87
87
  return null;
88
- const milliseconds = object.toDuration(value);
88
+ const milliseconds = toDuration(value);
89
89
  if (milliseconds === undefined || milliseconds <= 0) {
90
90
  throw new TypeError(`Invalid persistence TTL: ${String(value)}`);
91
91
  }
@@ -169,4 +169,4 @@ export async function readPointer(queryable, channel, pointer, options) {
169
169
  const result = await queryable.query(`SELECT envelope FROM ${table(options, pointer.scope)} WHERE channel = $1 AND message_id = $2 AND (expires_at IS NULL OR expires_at > clock_timestamp())`, [channel, pointer.id]);
170
170
  return result.rows[0]?.envelope;
171
171
  }
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBNEN2RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFDL0I7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQTJDLEVBQUUsS0FBNEIsRUFBVSxFQUFFLENBQ2xHLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBSWpHLG9GQUFvRjtBQUNwRixLQUFLLFVBQVUsZ0NBQWdDLENBQzdDLFNBQXNCLEVBQ3RCLE9BQTJDO0lBRTNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FDbEMsaVRBQWlULEVBQ2pULENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNoRCxDQUFDO0lBQ0YsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsS0FBSyxLQUFLLENBQUM7QUFDOUMsQ0FBQztBQUVELDRGQUE0RjtBQUM1RixNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLEtBQXdDO0lBRXhDLE1BQU0sVUFBVSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMs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O0lBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyRixNQUFNLFNBQVMsR0FBRyxNQUFpQyxDQUFDO0lBQ3BELElBQUksU0FBUyxDQUFDLENBQUMsS0FBSyxlQUFlO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDdEQsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUNqRCxJQUFJLEtBQUssS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLLFlBQVk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNqRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixTQUFzQixFQUN0QixPQUFlLEVBQ2YsT0FBcUIsRUFDckIsT0FBMkM7SUFFM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUNsQyx3QkFBd0IsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLG9HQUFvRyxFQUN6SixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQ3RCLENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBMkMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEdXJhYmxlIHJlcGxheSBhbmQgcG9pbnRlciBwYXlsb2FkcyBmb3Ige0BsaW5rIFBvc3RncmVzVG9waWNCdXN9LlxuICpcbiAqIFRoaXMgbW9kdWxlIG93bnMgc2NoZW1hIHByb3Zpc2lvbmluZywgZ3JhbnRzLCBUVEwgY2xlYW51cCwgcmVwbGF5IGN1cnNvcnMsXG4gKiBhbmQgb3Blbi9yZXN0cmljdGVkIHBlcnNpc3RlbmNlIHNjb3Blcy4gUmV1c2UgaXQgd2hlbiBhIHRvcGljLWJ1cyBjb25zdW1lclxuICogbmVlZHMgaGlzdG9yeSBvciBsYXJnZXIgcGF5bG9hZHMgaW5zdGVhZCBvZiBjcmVhdGluZyBhIHBhcmFsbGVsIG1lc3NhZ2UgdGFibGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5UmVzdWx0Um93IH0gZnJvbSBcInBnXCI7XG5pbXBvcnQgdHlwZSB7IFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay50c1wiO1xuaW1wb3J0IHsgd2l0aEFkdmlzb3J5VHJhbnNhY3Rpb25Mb2NrIH0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay50c1wiO1xuaW1wb3J0IHsgcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIgfSBmcm9tIFwiLi9zZXNzaW9uLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFRvcGljTWVzc2FnZSB9IGZyb20gXCIuL3RvcGljLWJ1cy50c1wiO1xuXG4vKiogU3RvcmFnZSBhbmQgZ3JhbnQgdGllciBmb3IgcGVyc2lzdGVkIHRvcGljIG1lc3NhZ2VzLiAqL1xuZXhwb3J0IHR5cGUgVG9waWNQZXJzaXN0ZW5jZVNjb3BlID0gXCJvcGVuXCIgfCBcInJlc3RyaWN0ZWRcIjtcbi8qKiBQb3N0Z3JlU1FMIGludGVydmFsIHRleHQgb3IgbWlsbGlzZWNvbmQgZHVyYXRpb24gYWNjZXB0ZWQgZm9yIG1lc3NhZ2UgZXhwaXJ5LiAqL1xuZXhwb3J0IHR5cGUgRHVyYXRpb25JbnB1dCA9IHN0cmluZyB8IG51bWJlcjtcbi8qKiBPcHRpb25hbCBzY2hlbWEsIHRhYmxlLCBleHBpcnksIHBheWxvYWQsIGFuZCBwcm92aXNpb25pbmcgc2V0dGluZ3MgZm9yIHRvcGljIHBlcnNpc3RlbmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyB7XG4gIHNjaGVtYT86IHN0cmluZztcbiAgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHRhYmxlcz86IFBhcnRpYWw8UmVjb3JkPFRvcGljUGVyc2lzdGVuY2VTY29wZSwgc3RyaW5nPj47XG4gIHR0bD86IER1cmF0aW9uSW5wdXQgfCBmYWxzZTtcbiAgcGF5bG9hZD86IFwiZW52ZWxvcGVcIiB8IFwicG9pbnRlclwiO1xuICBjbGVhbnVwQmF0Y2hTaXplPzogbnVtYmVyO1xuICBwcm92aXNpb24/OiBib29sZWFuO1xufVxuLyoqIENvbXBsZXRlIHBlcnNpc3RlbmNlIHNldHRpbmdzIGFmdGVyIGRlZmF1bHRzIGFyZSBhcHBsaWVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIHtcbiAgc2NoZW1hOiBzdHJpbmc7XG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHRhYmxlczogUmVjb3JkPFRvcGljUGVyc2lzdGVuY2VTY29wZSwgc3RyaW5nPjtcbiAgdHRsOiBEdXJhdGlvbklucHV0IHwgZmFsc2U7XG4gIHBheWxvYWQ6IFwiZW52ZWxvcGVcIiB8IFwicG9pbnRlclwiO1xuICBjbGVhbnVwQmF0Y2hTaXplOiBudW1iZXI7XG4gIHByb3Zpc2lvbjogYm9vbGVhbjtcbn1cbi8qKiBQZXJzaXN0ZWQgdG9waWMgbWVzc2FnZSBwbHVzIHJlcGxheSBjdXJzb3IsIHNjb3BlLCBhbmQgZXhwaXJ5IG1ldGFkYXRhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yZWRUb3BpY01lc3NhZ2U8XG4gIFRCb2R5IGV4dGVuZHMgb2JqZWN0LlNlcmlhbGl6YWJsZVZhbHVlID0gb2JqZWN0LlNlcmlhbGl6YWJsZVZhbHVlLFxuPiB7XG4gIGN1cnNvcjogc3RyaW5nO1xuICBleHBpcmVzQXQ6IHN0cmluZyB8IG51bGw7XG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT47XG59XG4vKiogT3JkZXJlZCByZXBsYXkgcGFnZSBhbmQgb3B0aW9uYWwgY3Vyc29yIGZvciB0aGUgbmV4dCBwYWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY0hpc3RvcnlQYWdlPFxuICBUQm9keSBleHRlbmRzIG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZSxcbj4ge1xuICBtZXNzYWdlczogU3RvcmVkVG9waWNNZXNzYWdlPFRCb2R5PltdO1xuICBuZXh0Q3Vyc29yPzogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX1RUTCA9IFwiMjQgaG91cnNcIjtcbi8qKlxuICogUG9pbnRlci1wYXlsb2FkIHZlcnNpb24uIEEgbGlzdGVuZXIgdGhhdCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIHZlcnNpb24gdHJlYXRzXG4gKiB0aGUgbm90aWZpY2F0aW9uIGFzIGZvcmVpZ24gdHJhZmZpYyByYXRoZXIgdGhhbiBndWVzc2luZyBhdCBpdHMgc2hhcGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQT0lOVEVSX1ZFUlNJT04gPSAxO1xuY29uc3QgdGFibGUgPSAob3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucywgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSk6IHN0cmluZyA9PlxuICBgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy50YWJsZXNbc2NvcGVdKX1gO1xuXG50eXBlIFRhYmxlT3duZXJzaGlwUm93ID0gUXVlcnlSZXN1bHRSb3cgJiB7IGNhbl9tYW5hZ2U6IGJvb2xlYW4gfTtcblxuLyoqIFdoZXRoZXIgdGhlIHNlbGVjdGVkIHBlcnNpc3RlbmNlIHRhYmxlIGV4aXN0cyBidXQgaXMgbWFuYWdlZCBieSBhbm90aGVyIHJvbGUuICovXG5hc3luYyBmdW5jdGlvbiBzZWxlY3RlZFRhYmxlSXNFeHRlcm5hbGx5TWFuYWdlZChcbiAgcXVlcnlhYmxlOiBQZ1F1ZXJ5YWJsZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnk8VGFibGVPd25lcnNoaXBSb3c+KFxuICAgIGBTRUxFQ1QgcGdfaGFzX3JvbGUoY3VycmVudF91c2VyLCBwZ19nZXRfdXNlcmJ5aWQodGFibGVfY2xhc3MucmVsb3duZXIpLCAnVVNBR0UnKSBBUyBjYW5fbWFuYWdlIEZST00gcGdfY2xhc3MgQVMgdGFibGVfY2xhc3MgSk9JTiBwZ19uYW1lc3BhY2UgQVMgdGFibGVfc2NoZW1hIE9OIHRhYmxlX3NjaGVtYS5vaWQgPSB0YWJsZV9jbGFzcy5yZWxuYW1lc3BhY2UgV0hFUkUgdGFibGVfc2NoZW1hLm5zcG5hbWUgPSAkMSBBTkQgdGFibGVfY2xhc3MucmVsbmFtZSA9ICQyIEFORCB0YWJsZV9jbGFzcy5yZWxraW5kIElOICgncicsICdwJylgLFxuICAgIFtvcHRpb25zLnNjaGVtYSwgb3B0aW9ucy50YWJsZXNbb3B0aW9ucy5zY29wZV1dLFxuICApO1xuICByZXR1cm4gcmVzdWx0LnJvd3NbMF0/LmNhbl9tYW5hZ2UgPT09IGZhbHNlO1xufVxuXG4vKiogVmFsaWRhdGUgcGVyc2lzdGVuY2Ugc2NvcGUgYW5kIGFwcGx5IHN0YWJsZSBzY2hlbWEsIHRhYmxlLCBUVEwsIGFuZCBjbGVhbnVwIGRlZmF1bHRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQZXJzaXN0ZW5jZU9wdGlvbnMoXG4gIHZhbHVlOiB0cnVlIHwgVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4pOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IHZhbHVlID09PSB0cnVlID8ge30gOiB2YWx1ZTtcbiAgY29uc3Qgc2NvcGUgPSBjb25maWd1cmVkLnNjb3BlID8/IFwib3BlblwiO1xuICBpZiAoc2NvcGUgIT09IFwib3BlblwiICYmIHNjb3BlICE9PSBcInJlc3RyaWN0ZWRcIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gcGVyc2lzdGVuY2Ugc2NvcGU6ICR7U3RyaW5nKHNjb3BlKX1gKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtYTogY29uZmlndXJlZC5zY2hlbWEgPz8gXCJkYnhfbWVzc2FnZV9idXNcIixcbiAgICBzY29wZSxcbiAgICB0YWJsZXM6IHtcbiAgICAgIG9wZW46IGNvbmZpZ3VyZWQudGFibGVzPy5vcGVuID8/IFwib3Blbl9tZXNzYWdlc1wiLFxuICAgICAgcmVzdHJpY3RlZDogY29uZmlndXJlZC50YWJsZXM/LnJlc3RyaWN0ZWQgPz8gXCJyZXN0cmljdGVkX21lc3NhZ2VzXCIsXG4gICAgfSxcbiAgICB0dGw6IGNvbmZpZ3VyZWQudHRsID8/IERFRkFVTFRfVFRMLFxuICAgIHBheWxvYWQ6IGNvbmZpZ3VyZWQucGF5bG9hZCA/PyBcImVudmVsb3BlXCIsXG4gICAgY2xlYW51cEJhdGNoU2l6ZTogY29uZmlndXJlZC5jbGVhbnVwQmF0Y2hTaXplID8/IDEwMDAsXG4gICAgcHJvdmlzaW9uOiBjb25maWd1cmVkLnByb3Zpc2lvbiA/PyB0cnVlLFxuICB9O1xufVxuXG4vKiogQ3JlYXRlIHRoZSBwZXJzaXN0ZW5jZSBzY2hlbWEsIG9wZW4gYW5kIHJlc3RyaWN0ZWQgdGFibGVzLCBhbmQgcmVwbGF5IGluZGV4ZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlzaW9uTWVzc2FnZUJ1c1NjaGVtYShcbiAgcG9vbDogUGdQb29sTGlrZSAmIFBnUXVlcnlhYmxlLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChhd2FpdCBzZWxlY3RlZFRhYmxlSXNFeHRlcm5hbGx5TWFuYWdlZChwb29sLCBvcHRpb25zKSkgcmV0dXJuO1xuICBhd2FpdCB3aXRoQWR2aXNvcnlUcmFuc2FjdGlvbkxvY2socG9vbCwgW1wiZGJ4X21lc3NhZ2VfYnVzXCIsIFwic2NoZW1hXCJdLCBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgaWYgKGF3YWl0IHNlbGVjdGVkVGFibGVJc0V4dGVybmFsbHlNYW5hZ2VkKGNsaWVudCwgb3B0aW9ucykpIHJldHVybjtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYENSRUFURSBTQ0hFTUEgSUYgTk9UIEVYSVNUUyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX1gKTtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICBgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoXCJzY2hlbWFfdmVyc2lvblwiKX0gKHZlcnNpb24gSU5URUdFUiBQUklNQVJZIEtFWSlgLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBzY29wZSBvZiBbXCJvcGVuXCIsIFwicmVzdHJpY3RlZFwiXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgbmFtZSA9IHRhYmxlKG9wdGlvbnMsIHNjb3BlKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7bmFtZX0gKHNlcXVlbmNlIEJJR0lOVCBHRU5FUkFURUQgQUxXQVlTIEFTIElERU5USVRZIFBSSU1BUlkgS0VZLCBjaGFubmVsIFRFWFQgTk9UIE5VTEwsIHRvcGljIFRFWFQgTk9UIE5VTEwsIG1lc3NhZ2VfaWQgVEVYVCBOT1QgTlVMTCwgcHVibGlzaGVkX2F0IFRJTUVTVEFNUFRaIE5PVCBOVUxMLCBleHBpcmVzX2F0IFRJTUVTVEFNUFRaLCB4YWN0X2lkIFhJRDggTk9UIE5VTEwgREVGQVVMVCBwZ19jdXJyZW50X3hhY3RfaWQoKSwgZW52ZWxvcGUgSlNPTkIgTk9UIE5VTEwsIFVOSVFVRSAoY2hhbm5lbCwgbWVzc2FnZV9pZCksIENIRUNLIChqc29uYl90eXBlb2YoZW52ZWxvcGUpID0gJ29iamVjdCcpKWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihgJHtvcHRpb25zLnRhYmxlc1tzY29wZV19X3JlcGxheV9pZHhgKX0gT04gJHtuYW1lfSAoY2hhbm5lbCwgdG9waWMsIHNlcXVlbmNlKWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihgJHtvcHRpb25zLnRhYmxlc1tzY29wZV19X2V4cGlyeV9pZHhgKX0gT04gJHtuYW1lfSAoZXhwaXJlc19hdCkgV0hFUkUgZXhwaXJlc19hdCBJUyBOT1QgTlVMTGAsXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICBgSU5TRVJUIElOVE8gJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoXCJzY2hlbWFfdmVyc2lvblwiKX0gKHZlcnNpb24pIFZBTFVFUyAoMSkgT04gQ09ORkxJQ1QgKHZlcnNpb24pIERPIE5PVEhJTkdgLFxuICAgICk7XG4gIH0pO1xufVxuXG4vKiogQnVpbGQgU1FMIGdyYW50cyBmb3Igcm9sZXMgdGhhdCBtYXkgcmVhZCBhbmQgd3JpdGUgb25lIHBlcnNpc3RlbmNlIHNjb3BlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lc3NhZ2VCdXNHcmFudFN0YXRlbWVudHMoXG4gIHJvbGVzOiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXSxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSB0YWJsZShvcHRpb25zLCBzY29wZSk7XG4gIHJldHVybiAodHlwZW9mIHJvbGVzID09PSBcInN0cmluZ1wiID8gW3JvbGVzXSA6IHJvbGVzKS5mbGF0TWFwKChyb2xlKSA9PiBbXG4gICAgYEdSQU5UIFVTQUdFIE9OIFNDSEVNQSAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMuc2NoZW1hKX0gVE8gJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihyb2xlKX07YCxcbiAgICBgR1JBTlQgU0VMRUNULCBJTlNFUlQsIERFTEVURSBPTiBUQUJMRSAke3NlbGVjdGVkfSBUTyAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHJvbGUpfTtgLFxuICAgIGBHUkFOVCBTRUxFQ1QgT04gVEFCTEUgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9LiR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoXCJzY2hlbWFfdmVyc2lvblwiKX0gVE8gJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihyb2xlKX07YCxcbiAgXSk7XG59XG5cbmZ1bmN0aW9uIGN1cnNvcihzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLCBzZXF1ZW5jZTogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KFtzY29wZSwgU3RyaW5nKHNlcXVlbmNlKV0pKS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbn1cbmZ1bmN0aW9uIGFmdGVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCIwXCI7XG4gIGNvbnN0IGRlY29kZWQgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKHZhbHVlLCBcImJhc2U2NHVybFwiKS50b1N0cmluZygpKSBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoZGVjb2RlZFswXSAhPT0gc2NvcGUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSGlzdG9yeSBjdXJzb3IgYmVsb25ncyB0byBhbm90aGVyIHBlcnNpc3RlbmNlIHNjb3BlXCIpO1xuICB9XG4gIHJldHVybiBkZWNvZGVkWzFdO1xufVxuXG4vKiogQ29udmVydCBhIHBlcnNpc3RlbmNlIFRUTCB0byBtaWxsaXNlY29uZHMsIHByZXNlcnZpbmcgZGlzYWJsZWQgcmV0ZW50aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR0bE1pbGxpc2Vjb25kcyh2YWx1ZTogRHVyYXRpb25JbnB1dCB8IGZhbHNlKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICBjb25zdCBtaWxsaXNlY29uZHMgPSBvYmplY3QudG9EdXJhdGlvbih2YWx1ZSk7XG4gIGlmIChtaWxsaXNlY29uZHMgPT09IHVuZGVmaW5lZCB8fCBtaWxsaXNlY29uZHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgcGVyc2lzdGVuY2UgVFRMOiAke1N0cmluZyh2YWx1ZSl9YCk7XG4gIH1cbiAgcmV0dXJuIG1pbGxpc2Vjb25kcztcbn1cblxuLyoqIERlbGV0ZSBvbmUgYm91bmRlZCBiYXRjaCBvZiBleHBpcmVkIHBlcnNpc3RlZCB0b3BpYyBtZXNzYWdlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwRXhwaXJlZChcbiAgcXVlcnlhYmxlOiBQZ1F1ZXJ5YWJsZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgbGltaXQgPSBvcHRpb25zLmNsZWFudXBCYXRjaFNpemUsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnkoXG4gICAgYFdJVEggZXhwaXJlZCBBUyAoU0VMRUNUIGN0aWQgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gV0hFUkUgZXhwaXJlc19hdCBJUyBOT1QgTlVMTCBBTkQgZXhwaXJlc19hdCA8PSBjbG9ja190aW1lc3RhbXAoKSBPUkRFUiBCWSBleHBpcmVzX2F0IExJTUlUICQxKSBERUxFVEUgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gQVMgbWVzc2FnZXMgVVNJTkcgZXhwaXJlZCBXSEVSRSBtZXNzYWdlcy5jdGlkID0gZXhwaXJlZC5jdGlkYCxcbiAgICBbbGltaXRdLFxuICApO1xuICByZXR1cm4gcmVzdWx0LnJvd0NvdW50ID8/IDA7XG59XG5cbnR5cGUgSGlzdG9yeVJvdyA9IFF1ZXJ5UmVzdWx0Um93ICYge1xuICBzZXF1ZW5jZTogc3RyaW5nO1xuICBleHBpcmVzX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgZW52ZWxvcGU6IFRvcGljTWVzc2FnZTtcbn07XG5cbi8qKiBSZWFkIGEgY3Vyc29yLXBhZ2luYXRlZCBwYWdlIG9mIHBlcnNpc3RlZCB0b3BpYyBoaXN0b3J5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhpc3Rvcnk8VEJvZHkgZXh0ZW5kcyBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWU+KFxuICBxdWVyeWFibGU6IFBnUXVlcnlhYmxlLFxuICBjaGFubmVsOiBzdHJpbmcsXG4gIHRvcGljOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIGlucHV0OiB7IGFmdGVyPzogc3RyaW5nOyBsaW1pdD86IG51bWJlcjsgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUgfSA9IHt9LFxuKTogUHJvbWlzZTxUb3BpY0hpc3RvcnlQYWdlPFRCb2R5Pj4ge1xuICBjb25zdCBzY29wZSA9IGlucHV0LnNjb3BlID8/IG9wdGlvbnMuc2NvcGU7XG4gIGNvbnN0IGxpbWl0ID0gaW5wdXQubGltaXQgPz8gMTAwO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnk8SGlzdG9yeVJvdz4oXG4gICAgYFNFTEVDVCBzZXF1ZW5jZSwgZXhwaXJlc19hdCwgZW52ZWxvcGUgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gV0hFUkUgY2hhbm5lbCA9ICQxIEFORCB0b3BpYyA9ICQyIEFORCBzZXF1ZW5jZSA+ICQzOjpiaWdpbnQgQU5EIChleHBpcmVzX2F0IElTIE5VTEwgT1IgZXhwaXJlc19hdCA+IGNsb2NrX3RpbWVzdGFtcCgpKSBPUkRFUiBCWSBzZXF1ZW5jZSBMSU1JVCAkNGAsXG4gICAgW2NoYW5uZWwsIHRvcGljLCBhZnRlcihpbnB1dC5hZnRlciwgc2NvcGUpLCBsaW1pdF0sXG4gICk7XG4gIGNvbnN0IG1lc3NhZ2VzID0gcmVzdWx0LnJvd3MubWFwKChyb3cpID0+ICh7XG4gICAgY3Vyc29yOiBjdXJzb3Ioc2NvcGUsIHJvdy5zZXF1ZW5jZSksXG4gICAgZXhwaXJlc0F0OiByb3cuZXhwaXJlc19hdCA9PT0gbnVsbCA/IG51bGwgOiBuZXcgRGF0ZShyb3cuZXhwaXJlc19hdCkudG9JU09TdHJpbmcoKSxcbiAgICBzY29wZSxcbiAgICBtZXNzYWdlOiByb3cuZW52ZWxvcGUgYXMgVG9waWNNZXNzYWdlPFRCb2R5PixcbiAgfSkpO1xuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIC4uLihtZXNzYWdlcy5sZW5ndGggPT09IGxpbWl0ID8geyBuZXh0Q3Vyc29yOiBtZXNzYWdlcy5hdCgtMSkhLmN1cnNvciB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUGVyc2lzdCBhIHRvcGljIG1lc3NhZ2UgYW5kIG5vdGlmeSBsaXN0ZW5lcnMgaW4gb25lIHRyYW5zYWN0aW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RlZE5vdGlmeShcbiAgY2xpZW50OiBQZ1F1ZXJ5YWJsZSxcbiAgY2hhbm5lbDogc3RyaW5nLFxuICB0b3BpYzogc3RyaW5nLFxuICBtZXNzYWdlOiBUb3BpY01lc3NhZ2UsXG4gIGVuY29kZWQ6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgdHRsOiBEdXJhdGlvbklucHV0IHwgZmFsc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xlYW51cEV4cGlyZWQoY2xpZW50LCBvcHRpb25zLCBzY29wZSk7XG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IHR0bE1pbGxpc2Vjb25kcyh0dGwpO1xuICBjb25zdCBpbnNlcnRlZCA9IGF3YWl0IGNsaWVudC5xdWVyeTxRdWVyeVJlc3VsdFJvdyAmIHsgc2VxdWVuY2U6IHN0cmluZyB9PihcbiAgICBgSU5TRVJUIElOVE8gJHt0YWJsZShvcHRpb25zLCBzY29wZSl9IChjaGFubmVsLCB0b3BpYywgbWVzc2FnZV9pZCwgcHVibGlzaGVkX2F0LCBleHBpcmVzX2F0LCBlbnZlbG9wZSkgVkFMVUVTICgkMSwgJDIsICQzLCAkNCwgQ0FTRSBXSEVOICQ1OjpiaWdpbnQgSVMgTlVMTCBUSEVOIE5VTEwgRUxTRSBjbG9ja190aW1lc3RhbXAoKSArICgkNTo6YmlnaW50ICogaW50ZXJ2YWwgJzEgbWlsbGlzZWNvbmQnKSBFTkQsICQ2Ojpqc29uYikgUkVUVVJOSU5HIHNlcXVlbmNlYCxcbiAgICBbY2hhbm5lbCwgdG9waWMsIG1lc3NhZ2UuaWQsIG1lc3NhZ2UucHVibGlzaGVkQXQsIG1pbGxpc2Vjb25kcywgZW5jb2RlZF0sXG4gICk7XG4gIC8vIFRoZSByb3cgYW5kIHRoZSBub3RpZmljYXRpb24gY29tbWl0IHRvZ2V0aGVyLCBzbyBhIHBvaW50ZXIgaXMgbmV2ZXIgZGVsaXZlcmVkXG4gIC8vIGJlZm9yZSB0aGUgcm93IGl0IG5hbWVzIGlzIHJlYWRhYmxlIC0gYE5PVElGWWAgaXMgZGVsaXZlcmVkIGF0IENPTU1JVCwgbm90IGF0XG4gIC8vIHN0YXRlbWVudCB0aW1lLlxuICBjb25zdCBwYXlsb2FkID1cbiAgICBvcHRpb25zLnBheWxvYWQgPT09IFwicG9pbnRlclwiXG4gICAgICA/IHBvaW50ZXJQYXlsb2FkKHNjb3BlLCB0b3BpYywgbWVzc2FnZS5pZCwgaW5zZXJ0ZWQucm93c1swXT8uc2VxdWVuY2UgPz8gXCIwXCIpXG4gICAgICA6IGVuY29kZWQ7XG4gIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFTEVDVCBwZ19ub3RpZnkoJDEsICQyKVwiLCBbY2hhbm5lbCwgcGF5bG9hZF0pO1xufVxuXG4vKipcbiAqIFRoZSBgcGF5bG9hZDogXCJwb2ludGVyXCJgIG5vdGlmaWNhdGlvbiBib2R5OiByb3V0aW5nIGFuZCBpZGVudGl0eSBvbmx5LCBzbyB0aGVcbiAqIHNpemUgbGltaXQgZG9lcyBub3QgYXBwbHkgYW5kIGEgbGlzdGVuZXIgd2l0aG91dCB0aGUgdGFibGUgZ3JhbnQgbGVhcm5zIHRoYXRcbiAqIHNvbWV0aGluZyBoYXBwZW5lZCB3aXRob3V0IGxlYXJuaW5nIHdoYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2ludGVyUGF5bG9hZChcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgdG9waWM6IHN0cmluZyxcbiAgaWQ6IHN0cmluZyxcbiAgc2VxdWVuY2U6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHY6IFBPSU5URVJfVkVSU0lPTiwgc2NvcGUsIHRvcGljLCBpZCwgc2VxdWVuY2U6IFN0cmluZyhzZXF1ZW5jZSkgfSk7XG59XG5cbi8qKiBBIGRlY29kZWQgcG9pbnRlciBub3RpZmljYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljUG9pbnRlciB7XG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHRvcGljOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG4gIHNlcXVlbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVhZCBhIG5vdGlmaWNhdGlvbiBhcyBhIHBvaW50ZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgbm90IG9uZS4gVGhlIGNoYW5uZWxcbiAqIGlzIHNoYXJlZCwgc28gYW4gdW5yZWNvZ25pemVkIHBheWxvYWQgaXMgb3JkaW5hcnkgdHJhZmZpYyByYXRoZXIgdGhhbiBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBvaW50ZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRvcGljUG9pbnRlciB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCByZWNvcmQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmVjb3JkID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKCFyZWNvcmQgfHwgdHlwZW9mIHJlY29yZCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJlY29yZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHJlY29yZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGNhbmRpZGF0ZS52ICE9PSBQT0lOVEVSX1ZFUlNJT04pIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgc2NvcGUsIHRvcGljLCBpZCwgc2VxdWVuY2UgfSA9IGNhbmRpZGF0ZTtcbiAgaWYgKHNjb3BlICE9PSBcIm9wZW5cIiAmJiBzY29wZSAhPT0gXCJyZXN0cmljdGVkXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdG9waWMgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGlkICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBzZXF1ZW5jZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc2NvcGUsIHRvcGljLCBpZCwgc2VxdWVuY2UgfTtcbn1cblxuLyoqXG4gKiBGZXRjaCB0aGUgb25lIHN0b3JlZCBlbnZlbG9wZSBhIHBvaW50ZXIgbmFtZXMuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcm93XG4gKiBpcyBnb25lIChUVEwgY2xlYW51cCB3b24gdGhlIHJhY2UpIG9yIHRoZSByZWFkZXIgbGFja3MgdGhlIHRhYmxlJ3MgZ3JhbnQsIGJvdGhcbiAqIG9mIHdoaWNoIGFyZSBleHBlY3RlZCBvbiB0aGUgYHJlc3RyaWN0ZWRgIHRpZXIgcmF0aGVyIHRoYW4gZXJyb3JzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBvaW50ZXI8VEJvZHkgZXh0ZW5kcyBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWU+KFxuICBxdWVyeWFibGU6IFBnUXVlcnlhYmxlLFxuICBjaGFubmVsOiBzdHJpbmcsXG4gIHBvaW50ZXI6IFRvcGljUG9pbnRlcixcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IFByb21pc2U8VG9waWNNZXNzYWdlPFRCb2R5PiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnk8UXVlcnlSZXN1bHRSb3cgJiB7IGVudmVsb3BlOiBUb3BpY01lc3NhZ2UgfT4oXG4gICAgYFNFTEVDVCBlbnZlbG9wZSBGUk9NICR7dGFibGUob3B0aW9ucywgcG9pbnRlci5zY29wZSl9IFdIRVJFIGNoYW5uZWwgPSAkMSBBTkQgbWVzc2FnZV9pZCA9ICQyIEFORCAoZXhwaXJlc19hdCBJUyBOVUxMIE9SIGV4cGlyZXNfYXQgPiBjbG9ja190aW1lc3RhbXAoKSlgLFxuICAgIFtjaGFubmVsLCBwb2ludGVyLmlkXSxcbiAgKTtcbiAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdPy5lbnZlbG9wZSBhcyBUb3BpY01lc3NhZ2U8VEJvZHk+IHwgdW5kZWZpbmVkO1xufVxuIl19
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzVFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQXdDdkQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBQy9COzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDakMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUEyQyxFQUFFLEtBQTRCLEVBQVUsRUFBRSxDQUNsRyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUlqRyxvRkFBb0Y7QUFDcEYsS0FBSyxVQUFVLGdDQUFnQyxDQUM3QyxTQUFzQixFQUN0QixPQUEyQztJQUUzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQ2xDLGlUQUFpVCxFQUNqVCxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDaEQsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEtBQUssS0FBSyxDQUFDO0FBQzlDLENBQUM7QUFFRCw0RkFBNEY7QUFDNUYsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxLQUF3QztJQUV4QyxNQUFNLFVBQVUsR0FBRyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFD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SSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyRixNQUFNLFNBQVMsR0FBRyxNQUFpQyxDQUFDO0lBQ3BELElBQUksU0FBUyxDQUFDLENBQUMsS0FBSyxlQUFlO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDdEQsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUNqRCxJQUFJLEtBQUssS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLLFlBQVk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNqRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixTQUFzQixFQUN0QixPQUFlLEVBQ2YsT0FBcUIsRUFDckIsT0FBMkM7SUFFM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUNsQyx3QkFBd0IsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLG9HQUFvRyxFQUN6SixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQ3RCLENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBMkMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEdXJhYmxlIHJlcGxheSBhbmQgcG9pbnRlciBwYXlsb2FkcyBmb3Ige0BsaW5rIFBvc3RncmVzVG9waWNCdXN9LlxuICpcbiAqIFRoaXMgbW9kdWxlIG93bnMgc2NoZW1hIHByb3Zpc2lvbmluZywgZ3JhbnRzLCBUVEwgY2xlYW51cCwgcmVwbGF5IGN1cnNvcnMsXG4gKiBhbmQgb3Blbi9yZXN0cmljdGVkIHBlcnNpc3RlbmNlIHNjb3Blcy4gUmV1c2UgaXQgd2hlbiBhIHRvcGljLWJ1cyBjb25zdW1lclxuICogbmVlZHMgaGlzdG9yeSBvciBsYXJnZXIgcGF5bG9hZHMgaW5zdGVhZCBvZiBjcmVhdGluZyBhIHBhcmFsbGVsIG1lc3NhZ2UgdGFibGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHR5cGUgU2VyaWFsaXphYmxlVmFsdWUsIHRvRHVyYXRpb24gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdFJvdyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBQZ1Bvb2xMaWtlLCBQZ1F1ZXJ5YWJsZSB9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmltcG9ydCB7IHdpdGhBZHZpc29yeVRyYW5zYWN0aW9uTG9jayB9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmltcG9ydCB7IHF1b3RlUG9zdGdyZXNJZGVudGlmaWVyIH0gZnJvbSBcIi4vc2Vzc2lvbi50c1wiO1xuaW1wb3J0IHR5cGUgeyBUb3BpY01lc3NhZ2UgfSBmcm9tIFwiLi90b3BpYy1idXMudHNcIjtcblxuLyoqIFN0b3JhZ2UgYW5kIGdyYW50IHRpZXIgZm9yIHBlcnNpc3RlZCB0b3BpYyBtZXNzYWdlcy4gKi9cbmV4cG9ydCB0eXBlIFRvcGljUGVyc2lzdGVuY2VTY29wZSA9IFwib3BlblwiIHwgXCJyZXN0cmljdGVkXCI7XG4vKiogUG9zdGdyZVNRTCBpbnRlcnZhbCB0ZXh0IG9yIG1pbGxpc2Vjb25kIGR1cmF0aW9uIGFjY2VwdGVkIGZvciBtZXNzYWdlIGV4cGlyeS4gKi9cbmV4cG9ydCB0eXBlIER1cmF0aW9uSW5wdXQgPSBzdHJpbmcgfCBudW1iZXI7XG4vKiogT3B0aW9uYWwgc2NoZW1hLCB0YWJsZSwgZXhwaXJ5LCBwYXlsb2FkLCBhbmQgcHJvdmlzaW9uaW5nIHNldHRpbmdzIGZvciB0b3BpYyBwZXJzaXN0ZW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMge1xuICBzY2hlbWE/OiBzdHJpbmc7XG4gIHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlO1xuICB0YWJsZXM/OiBQYXJ0aWFsPFJlY29yZDxUb3BpY1BlcnNpc3RlbmNlU2NvcGUsIHN0cmluZz4+O1xuICB0dGw/OiBEdXJhdGlvbklucHV0IHwgZmFsc2U7XG4gIHBheWxvYWQ/OiBcImVudmVsb3BlXCIgfCBcInBvaW50ZXJcIjtcbiAgY2xlYW51cEJhdGNoU2l6ZT86IG51bWJlcjtcbiAgcHJvdmlzaW9uPzogYm9vbGVhbjtcbn1cbi8qKiBDb21wbGV0ZSBwZXJzaXN0ZW5jZSBzZXR0aW5ncyBhZnRlciBkZWZhdWx0cyBhcmUgYXBwbGllZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyB7XG4gIHNjaGVtYTogc3RyaW5nO1xuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlO1xuICB0YWJsZXM6IFJlY29yZDxUb3BpY1BlcnNpc3RlbmNlU2NvcGUsIHN0cmluZz47XG4gIHR0bDogRHVyYXRpb25JbnB1dCB8IGZhbHNlO1xuICBwYXlsb2FkOiBcImVudmVsb3BlXCIgfCBcInBvaW50ZXJcIjtcbiAgY2xlYW51cEJhdGNoU2l6ZTogbnVtYmVyO1xuICBwcm92aXNpb246IGJvb2xlYW47XG59XG4vKiogUGVyc2lzdGVkIHRvcGljIG1lc3NhZ2UgcGx1cyByZXBsYXkgY3Vyc29yLCBzY29wZSwgYW5kIGV4cGlyeSBtZXRhZGF0YS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkVG9waWNNZXNzYWdlPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4ge1xuICBjdXJzb3I6IHN0cmluZztcbiAgZXhwaXJlc0F0OiBzdHJpbmcgfCBudWxsO1xuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlO1xuICBtZXNzYWdlOiBUb3BpY01lc3NhZ2U8VEJvZHk+O1xufVxuLyoqIE9yZGVyZWQgcmVwbGF5IHBhZ2UgYW5kIG9wdGlvbmFsIGN1cnNvciBmb3IgdGhlIG5leHQgcGFnZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNIaXN0b3J5UGFnZTxUQm9keSBleHRlbmRzIFNlcmlhbGl6YWJsZVZhbHVlID0gU2VyaWFsaXphYmxlVmFsdWU+IHtcbiAgbWVzc2FnZXM6IFN0b3JlZFRvcGljTWVzc2FnZTxUQm9keT5bXTtcbiAgbmV4dEN1cnNvcj86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9UVEwgPSBcIjI0IGhvdXJzXCI7XG4vKipcbiAqIFBvaW50ZXItcGF5bG9hZCB2ZXJzaW9uLiBBIGxpc3RlbmVyIHRoYXQgZG9lcyBub3QgcmVjb2duaXplIHRoZSB2ZXJzaW9uIHRyZWF0c1xuICogdGhlIG5vdGlmaWNhdGlvbiBhcyBmb3JlaWduIHRyYWZmaWMgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXQgaXRzIHNoYXBlLlxuICovXG5leHBvcnQgY29uc3QgUE9JTlRFUl9WRVJTSU9OID0gMTtcbmNvbnN0IHRhYmxlID0gKG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUpOiBzdHJpbmcgPT5cbiAgYCR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfS4ke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKG9wdGlvbnMudGFibGVzW3Njb3BlXSl9YDtcblxudHlwZSBUYWJsZU93bmVyc2hpcFJvdyA9IFF1ZXJ5UmVzdWx0Um93ICYgeyBjYW5fbWFuYWdlOiBib29sZWFuIH07XG5cbi8qKiBXaGV0aGVyIHRoZSBzZWxlY3RlZCBwZXJzaXN0ZW5jZSB0YWJsZSBleGlzdHMgYnV0IGlzIG1hbmFnZWQgYnkgYW5vdGhlciByb2xlLiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VsZWN0ZWRUYWJsZUlzRXh0ZXJuYWxseU1hbmFnZWQoXG4gIHF1ZXJ5YWJsZTogUGdRdWVyeWFibGUsXG4gIG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcXVlcnlhYmxlLnF1ZXJ5PFRhYmxlT3duZXJzaGlwUm93PihcbiAgICBgU0VMRUNUIHBnX2hhc19yb2xlKGN1cnJlbnRfdXNlciwgcGdfZ2V0X3VzZXJieWlkKHRhYmxlX2NsYXNzLnJlbG93bmVyKSwgJ1VTQUdFJykgQVMgY2FuX21hbmFnZSBGUk9NIHBnX2NsYXNzIEFTIHRhYmxlX2NsYXNzIEpPSU4gcGdfbmFtZXNwYWNlIEFTIHRhYmxlX3NjaGVtYSBPTiB0YWJsZV9zY2hlbWEub2lkID0gdGFibGVfY2xhc3MucmVsbmFtZXNwYWNlIFdIRVJFIHRhYmxlX3NjaGVtYS5uc3BuYW1lID0gJDEgQU5EIHRhYmxlX2NsYXNzLnJlbG5hbWUgPSAkMiBBTkQgdGFibGVfY2xhc3MucmVsa2luZCBJTiAoJ3InLCAncCcpYCxcbiAgICBbb3B0aW9ucy5zY2hlbWEsIG9wdGlvbnMudGFibGVzW29wdGlvbnMuc2NvcGVdXSxcbiAgKTtcbiAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdPy5jYW5fbWFuYWdlID09PSBmYWxzZTtcbn1cblxuLyoqIFZhbGlkYXRlIHBlcnNpc3RlbmNlIHNjb3BlIGFuZCBhcHBseSBzdGFibGUgc2NoZW1hLCB0YWJsZSwgVFRMLCBhbmQgY2xlYW51cCBkZWZhdWx0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zKFxuICB2YWx1ZTogdHJ1ZSB8IFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuKTogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSB2YWx1ZSA9PT0gdHJ1ZSA/IHt9IDogdmFsdWU7XG4gIGNvbnN0IHNjb3BlID0gY29uZmlndXJlZC5zY29wZSA/PyBcIm9wZW5cIjtcbiAgaWYgKHNjb3BlICE9PSBcIm9wZW5cIiAmJiBzY29wZSAhPT0gXCJyZXN0cmljdGVkXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmtub3duIHBlcnNpc3RlbmNlIHNjb3BlOiAke1N0cmluZyhzY29wZSl9YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY2hlbWE6IGNvbmZpZ3VyZWQuc2NoZW1hID8/IFwiZGJ4X21lc3NhZ2VfYnVzXCIsXG4gICAgc2NvcGUsXG4gICAgdGFibGVzOiB7XG4gICAgICBvcGVuOiBjb25maWd1cmVkLnRhYmxlcz8ub3BlbiA/PyBcIm9wZW5fbWVzc2FnZXNcIixcbiAgICAgIHJlc3RyaWN0ZWQ6IGNvbmZpZ3VyZWQudGFibGVzPy5yZXN0cmljdGVkID8/IFwicmVzdHJpY3RlZF9tZXNzYWdlc1wiLFxuICAgIH0sXG4gICAgdHRsOiBjb25maWd1cmVkLnR0bCA/PyBERUZBVUxUX1RUTCxcbiAgICBwYXlsb2FkOiBjb25maWd1cmVkLnBheWxvYWQgPz8gXCJlbnZlbG9wZVwiLFxuICAgIGNsZWFudXBCYXRjaFNpemU6IGNvbmZpZ3VyZWQuY2xlYW51cEJhdGNoU2l6ZSA/PyAxMDAwLFxuICAgIHByb3Zpc2lvbjogY29uZmlndXJlZC5wcm92aXNpb24gPz8gdHJ1ZSxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZSB0aGUgcGVyc2lzdGVuY2Ugc2NoZW1hLCBvcGVuIGFuZCByZXN0cmljdGVkIHRhYmxlcywgYW5kIHJlcGxheSBpbmRleGVzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEoXG4gIHBvb2w6IFBnUG9vbExpa2UgJiBQZ1F1ZXJ5YWJsZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoYXdhaXQgc2VsZWN0ZWRUYWJsZUlzRXh0ZXJuYWxseU1hbmFnZWQocG9vbCwgb3B0aW9ucykpIHJldHVybjtcbiAgYXdhaXQgd2l0aEFkdmlzb3J5VHJhbnNhY3Rpb25Mb2NrKHBvb2wsIFtcImRieF9tZXNzYWdlX2J1c1wiLCBcInNjaGVtYVwiXSwgYXN5bmMgKGNsaWVudCkgPT4ge1xuICAgIGlmIChhd2FpdCBzZWxlY3RlZFRhYmxlSXNFeHRlcm5hbGx5TWFuYWdlZChjbGllbnQsIG9wdGlvbnMpKSByZXR1cm47XG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9YCk7XG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgYENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfS4ke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKFwic2NoZW1hX3ZlcnNpb25cIil9ICh2ZXJzaW9uIElOVEVHRVIgUFJJTUFSWSBLRVkpYCxcbiAgICApO1xuICAgIGZvciAoY29uc3Qgc2NvcGUgb2YgW1wib3BlblwiLCBcInJlc3RyaWN0ZWRcIl0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0YWJsZShvcHRpb25zLCBzY29wZSk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAke25hbWV9IChzZXF1ZW5jZSBCSUdJTlQgR0VORVJBVEVEIEFMV0FZUyBBUyBJREVOVElUWSBQUklNQVJZIEtFWSwgY2hhbm5lbCBURVhUIE5PVCBOVUxMLCB0b3BpYyBURVhUIE5PVCBOVUxMLCBtZXNzYWdlX2lkIFRFWFQgTk9UIE5VTEwsIHB1Ymxpc2hlZF9hdCBUSU1FU1RBTVBUWiBOT1QgTlVMTCwgZXhwaXJlc19hdCBUSU1FU1RBTVBUWiwgeGFjdF9pZCBYSUQ4IE5PVCBOVUxMIERFRkFVTFQgcGdfY3VycmVudF94YWN0X2lkKCksIGVudmVsb3BlIEpTT05CIE5PVCBOVUxMLCBVTklRVUUgKGNoYW5uZWwsIG1lc3NhZ2VfaWQpLCBDSEVDSyAoanNvbmJfdHlwZW9mKGVudmVsb3BlKSA9ICdvYmplY3QnKSlgLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoYCR7b3B0aW9ucy50YWJsZXNbc2NvcGVdfV9yZXBsYXlfaWR4YCl9IE9OICR7bmFtZX0gKGNoYW5uZWwsIHRvcGljLCBzZXF1ZW5jZSlgLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIoYCR7b3B0aW9ucy50YWJsZXNbc2NvcGVdfV9leHBpcnlfaWR4YCl9IE9OICR7bmFtZX0gKGV4cGlyZXNfYXQpIFdIRVJFIGV4cGlyZXNfYXQgSVMgTk9UIE5VTExgLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgYElOU0VSVCBJTlRPICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfS4ke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKFwic2NoZW1hX3ZlcnNpb25cIil9ICh2ZXJzaW9uKSBWQUxVRVMgKDEpIE9OIENPTkZMSUNUICh2ZXJzaW9uKSBETyBOT1RISU5HYCxcbiAgICApO1xuICB9KTtcbn1cblxuLyoqIEJ1aWxkIFNRTCBncmFudHMgZm9yIHJvbGVzIHRoYXQgbWF5IHJlYWQgYW5kIHdyaXRlIG9uZSBwZXJzaXN0ZW5jZSBzY29wZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXNzYWdlQnVzR3JhbnRTdGF0ZW1lbnRzKFxuICByb2xlczogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10sXG4gIHNjb3BlOiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUsXG4gIG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlbGVjdGVkID0gdGFibGUob3B0aW9ucywgc2NvcGUpO1xuICByZXR1cm4gKHR5cGVvZiByb2xlcyA9PT0gXCJzdHJpbmdcIiA/IFtyb2xlc10gOiByb2xlcykuZmxhdE1hcCgocm9sZSkgPT4gW1xuICAgIGBHUkFOVCBVU0FHRSBPTiBTQ0hFTUEgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihvcHRpb25zLnNjaGVtYSl9IFRPICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIocm9sZSl9O2AsXG4gICAgYEdSQU5UIFNFTEVDVCwgSU5TRVJULCBERUxFVEUgT04gVEFCTEUgJHtzZWxlY3RlZH0gVE8gJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihyb2xlKX07YCxcbiAgICBgR1JBTlQgU0VMRUNUIE9OIFRBQkxFICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIob3B0aW9ucy5zY2hlbWEpfS4ke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKFwic2NoZW1hX3ZlcnNpb25cIil9IFRPICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIocm9sZSl9O2AsXG4gIF0pO1xufVxuXG5mdW5jdGlvbiBjdXJzb3Ioc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSwgc2VxdWVuY2U6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShbc2NvcGUsIFN0cmluZyhzZXF1ZW5jZSldKSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG59XG5mdW5jdGlvbiBhZnRlcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiMFwiO1xuICBjb25zdCBkZWNvZGVkID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbSh2YWx1ZSwgXCJiYXNlNjR1cmxcIikudG9TdHJpbmcoKSkgYXMgW3N0cmluZywgc3RyaW5nXTtcbiAgaWYgKGRlY29kZWRbMF0gIT09IHNjb3BlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkhpc3RvcnkgY3Vyc29yIGJlbG9uZ3MgdG8gYW5vdGhlciBwZXJzaXN0ZW5jZSBzY29wZVwiKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlZFsxXTtcbn1cblxuLyoqIENvbnZlcnQgYSBwZXJzaXN0ZW5jZSBUVEwgdG8gbWlsbGlzZWNvbmRzLCBwcmVzZXJ2aW5nIGRpc2FibGVkIHJldGVudGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0dGxNaWxsaXNlY29uZHModmFsdWU6IER1cmF0aW9uSW5wdXQgfCBmYWxzZSk6IG51bWJlciB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbWlsbGlzZWNvbmRzID0gdG9EdXJhdGlvbih2YWx1ZSk7XG4gIGlmIChtaWxsaXNlY29uZHMgPT09IHVuZGVmaW5lZCB8fCBtaWxsaXNlY29uZHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgcGVyc2lzdGVuY2UgVFRMOiAke1N0cmluZyh2YWx1ZSl9YCk7XG4gIH1cbiAgcmV0dXJuIG1pbGxpc2Vjb25kcztcbn1cblxuLyoqIERlbGV0ZSBvbmUgYm91bmRlZCBiYXRjaCBvZiBleHBpcmVkIHBlcnNpc3RlZCB0b3BpYyBtZXNzYWdlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwRXhwaXJlZChcbiAgcXVlcnlhYmxlOiBQZ1F1ZXJ5YWJsZSxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZSxcbiAgbGltaXQgPSBvcHRpb25zLmNsZWFudXBCYXRjaFNpemUsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeWFibGUucXVlcnkoXG4gICAgYFdJVEggZXhwaXJlZCBBUyAoU0VMRUNUIGN0aWQgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gV0hFUkUgZXhwaXJlc19hdCBJUyBOT1QgTlVMTCBBTkQgZXhwaXJlc19hdCA8PSBjbG9ja190aW1lc3RhbXAoKSBPUkRFUiBCWSBleHBpcmVzX2F0IExJTUlUICQxKSBERUxFVEUgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gQVMgbWVzc2FnZXMgVVNJTkcgZXhwaXJlZCBXSEVSRSBtZXNzYWdlcy5jdGlkID0gZXhwaXJlZC5jdGlkYCxcbiAgICBbbGltaXRdLFxuICApO1xuICByZXR1cm4gcmVzdWx0LnJvd0NvdW50ID8/IDA7XG59XG5cbnR5cGUgSGlzdG9yeVJvdyA9IFF1ZXJ5UmVzdWx0Um93ICYge1xuICBzZXF1ZW5jZTogc3RyaW5nO1xuICBleHBpcmVzX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgZW52ZWxvcGU6IFRvcGljTWVzc2FnZTtcbn07XG5cbi8qKiBSZWFkIGEgY3Vyc29yLXBhZ2luYXRlZCBwYWdlIG9mIHBlcnNpc3RlZCB0b3BpYyBoaXN0b3J5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhpc3Rvcnk8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gIHF1ZXJ5YWJsZTogUGdRdWVyeWFibGUsXG4gIGNoYW5uZWw6IHN0cmluZyxcbiAgdG9waWM6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZWRUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgaW5wdXQ6IHsgYWZ0ZXI/OiBzdHJpbmc7IGxpbWl0PzogbnVtYmVyOyBzY29wZT86IFRvcGljUGVyc2lzdGVuY2VTY29wZSB9ID0ge30sXG4pOiBQcm9taXNlPFRvcGljSGlzdG9yeVBhZ2U8VEJvZHk+PiB7XG4gIGNvbnN0IHNjb3BlID0gaW5wdXQuc2NvcGUgPz8gb3B0aW9ucy5zY29wZTtcbiAgY29uc3QgbGltaXQgPSBpbnB1dC5saW1pdCA/PyAxMDA7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5YWJsZS5xdWVyeTxIaXN0b3J5Um93PihcbiAgICBgU0VMRUNUIHNlcXVlbmNlLCBleHBpcmVzX2F0LCBlbnZlbG9wZSBGUk9NICR7dGFibGUob3B0aW9ucywgc2NvcGUpfSBXSEVSRSBjaGFubmVsID0gJDEgQU5EIHRvcGljID0gJDIgQU5EIHNlcXVlbmNlID4gJDM6OmJpZ2ludCBBTkQgKGV4cGlyZXNfYXQgSVMgTlVMTCBPUiBleHBpcmVzX2F0ID4gY2xvY2tfdGltZXN0YW1wKCkpIE9SREVSIEJZIHNlcXVlbmNlIExJTUlUICQ0YCxcbiAgICBbY2hhbm5lbCwgdG9waWMsIGFmdGVyKGlucHV0LmFmdGVyLCBzY29wZSksIGxpbWl0XSxcbiAgKTtcbiAgY29uc3QgbWVzc2FnZXMgPSByZXN1bHQucm93cy5tYXAoKHJvdykgPT4gKHtcbiAgICBjdXJzb3I6IGN1cnNvcihzY29wZSwgcm93LnNlcXVlbmNlKSxcbiAgICBleHBpcmVzQXQ6IHJvdy5leHBpcmVzX2F0ID09PSBudWxsID8gbnVsbCA6IG5ldyBEYXRlKHJvdy5leHBpcmVzX2F0KS50b0lTT1N0cmluZygpLFxuICAgIHNjb3BlLFxuICAgIG1lc3NhZ2U6IHJvdy5lbnZlbG9wZSBhcyBUb3BpY01lc3NhZ2U8VEJvZHk+LFxuICB9KSk7XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXMsXG4gICAgLi4uKG1lc3NhZ2VzLmxlbmd0aCA9PT0gbGltaXQgPyB7IG5leHRDdXJzb3I6IG1lc3NhZ2VzLmF0KC0xKSEuY3Vyc29yIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBQZXJzaXN0IGEgdG9waWMgbWVzc2FnZSBhbmQgbm90aWZ5IGxpc3RlbmVycyBpbiBvbmUgdHJhbnNhY3Rpb24uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyc2lzdGVkTm90aWZ5KFxuICBjbGllbnQ6IFBnUXVlcnlhYmxlLFxuICBjaGFubmVsOiBzdHJpbmcsXG4gIHRvcGljOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZSxcbiAgZW5jb2RlZDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICB0dGw6IER1cmF0aW9uSW5wdXQgfCBmYWxzZSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBjbGVhbnVwRXhwaXJlZChjbGllbnQsIG9wdGlvbnMsIHNjb3BlKTtcbiAgY29uc3QgbWlsbGlzZWNvbmRzID0gdHRsTWlsbGlzZWNvbmRzKHR0bCk7XG4gIGNvbnN0IGluc2VydGVkID0gYXdhaXQgY2xpZW50LnF1ZXJ5PFF1ZXJ5UmVzdWx0Um93ICYgeyBzZXF1ZW5jZTogc3RyaW5nIH0+KFxuICAgIGBJTlNFUlQgSU5UTyAke3RhYmxlKG9wdGlvbnMsIHNjb3BlKX0gKGNoYW5uZWwsIHRvcGljLCBtZXNzYWdlX2lkLCBwdWJsaXNoZWRfYXQsIGV4cGlyZXNfYXQsIGVudmVsb3BlKSBWQUxVRVMgKCQxLCAkMiwgJDMsICQ0LCBDQVNFIFdIRU4gJDU6OmJpZ2ludCBJUyBOVUxMIFRIRU4gTlVMTCBFTFNFIGNsb2NrX3RpbWVzdGFtcCgpICsgKCQ1OjpiaWdpbnQgKiBpbnRlcnZhbCAnMSBtaWxsaXNlY29uZCcpIEVORCwgJDY6Ompzb25iKSBSRVRVUk5JTkcgc2VxdWVuY2VgLFxuICAgIFtjaGFubmVsLCB0b3BpYywgbWVzc2FnZS5pZCwgbWVzc2FnZS5wdWJsaXNoZWRBdCwgbWlsbGlzZWNvbmRzLCBlbmNvZGVkXSxcbiAgKTtcbiAgLy8gVGhlIHJvdyBhbmQgdGhlIG5vdGlmaWNhdGlvbiBjb21taXQgdG9nZXRoZXIsIHNvIGEgcG9pbnRlciBpcyBuZXZlciBkZWxpdmVyZWRcbiAgLy8gYmVmb3JlIHRoZSByb3cgaXQgbmFtZXMgaXMgcmVhZGFibGUgLSBgTk9USUZZYCBpcyBkZWxpdmVyZWQgYXQgQ09NTUlULCBub3QgYXRcbiAgLy8gc3RhdGVtZW50IHRpbWUuXG4gIGNvbnN0IHBheWxvYWQgPVxuICAgIG9wdGlvbnMucGF5bG9hZCA9PT0gXCJwb2ludGVyXCJcbiAgICAgID8gcG9pbnRlclBheWxvYWQoc2NvcGUsIHRvcGljLCBtZXNzYWdlLmlkLCBpbnNlcnRlZC5yb3dzWzBdPy5zZXF1ZW5jZSA/PyBcIjBcIilcbiAgICAgIDogZW5jb2RlZDtcbiAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VMRUNUIHBnX25vdGlmeSgkMSwgJDIpXCIsIFtjaGFubmVsLCBwYXlsb2FkXSk7XG59XG5cbi8qKlxuICogVGhlIGBwYXlsb2FkOiBcInBvaW50ZXJcImAgbm90aWZpY2F0aW9uIGJvZHk6IHJvdXRpbmcgYW5kIGlkZW50aXR5IG9ubHksIHNvIHRoZVxuICogc2l6ZSBsaW1pdCBkb2VzIG5vdCBhcHBseSBhbmQgYSBsaXN0ZW5lciB3aXRob3V0IHRoZSB0YWJsZSBncmFudCBsZWFybnMgdGhhdFxuICogc29tZXRoaW5nIGhhcHBlbmVkIHdpdGhvdXQgbGVhcm5pbmcgd2hhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50ZXJQYXlsb2FkKFxuICBzY29wZTogVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICB0b3BpYzogc3RyaW5nLFxuICBpZDogc3RyaW5nLFxuICBzZXF1ZW5jZTogc3RyaW5nIHwgbnVtYmVyLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdjogUE9JTlRFUl9WRVJTSU9OLCBzY29wZSwgdG9waWMsIGlkLCBzZXF1ZW5jZTogU3RyaW5nKHNlcXVlbmNlKSB9KTtcbn1cblxuLyoqIEEgZGVjb2RlZCBwb2ludGVyIG5vdGlmaWNhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNQb2ludGVyIHtcbiAgc2NvcGU6IFRvcGljUGVyc2lzdGVuY2VTY29wZTtcbiAgdG9waWM6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgc2VxdWVuY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWFkIGEgbm90aWZpY2F0aW9uIGFzIGEgcG9pbnRlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBub3Qgb25lLiBUaGUgY2hhbm5lbFxuICogaXMgc2hhcmVkLCBzbyBhbiB1bnJlY29nbml6ZWQgcGF5bG9hZCBpcyBvcmRpbmFyeSB0cmFmZmljIHJhdGhlciB0aGFuIGFuIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUG9pbnRlcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVG9waWNQb2ludGVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IHJlY29yZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByZWNvcmQgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoIXJlY29yZCB8fCB0eXBlb2YgcmVjb3JkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmVjb3JkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgY2FuZGlkYXRlID0gcmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAoY2FuZGlkYXRlLnYgIT09IFBPSU5URVJfVkVSU0lPTikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgeyBzY29wZSwgdG9waWMsIGlkLCBzZXF1ZW5jZSB9ID0gY2FuZGlkYXRlO1xuICBpZiAoc2NvcGUgIT09IFwib3BlblwiICYmIHNjb3BlICE9PSBcInJlc3RyaWN0ZWRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiB0b3BpYyAhPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHNlcXVlbmNlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyBzY29wZSwgdG9waWMsIGlkLCBzZXF1ZW5jZSB9O1xufVxuXG4vKipcbiAqIEZldGNoIHRoZSBvbmUgc3RvcmVkIGVudmVsb3BlIGEgcG9pbnRlciBuYW1lcy4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSByb3dcbiAqIGlzIGdvbmUgKFRUTCBjbGVhbnVwIHdvbiB0aGUgcmFjZSkgb3IgdGhlIHJlYWRlciBsYWNrcyB0aGUgdGFibGUncyBncmFudCwgYm90aFxuICogb2Ygd2hpY2ggYXJlIGV4cGVjdGVkIG9uIHRoZSBgcmVzdHJpY3RlZGAgdGllciByYXRoZXIgdGhhbiBlcnJvcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUG9pbnRlcjxUQm9keSBleHRlbmRzIFNlcmlhbGl6YWJsZVZhbHVlPihcbiAgcXVlcnlhYmxlOiBQZ1F1ZXJ5YWJsZSxcbiAgY2hhbm5lbDogc3RyaW5nLFxuICBwb2ludGVyOiBUb3BpY1BvaW50ZXIsXG4gIG9wdGlvbnM6IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnMsXG4pOiBQcm9taXNlPFRvcGljTWVzc2FnZTxUQm9keT4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcXVlcnlhYmxlLnF1ZXJ5PFF1ZXJ5UmVzdWx0Um93ICYgeyBlbnZlbG9wZTogVG9waWNNZXNzYWdlIH0+KFxuICAgIGBTRUxFQ1QgZW52ZWxvcGUgRlJPTSAke3RhYmxlKG9wdGlvbnMsIHBvaW50ZXIuc2NvcGUpfSBXSEVSRSBjaGFubmVsID0gJDEgQU5EIG1lc3NhZ2VfaWQgPSAkMiBBTkQgKGV4cGlyZXNfYXQgSVMgTlVMTCBPUiBleHBpcmVzX2F0ID4gY2xvY2tfdGltZXN0YW1wKCkpYCxcbiAgICBbY2hhbm5lbCwgcG9pbnRlci5pZF0sXG4gICk7XG4gIHJldHVybiByZXN1bHQucm93c1swXT8uZW52ZWxvcGUgYXMgVG9waWNNZXNzYWdlPFRCb2R5PiB8IHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { postgresEnvironmentNames, postgresRoleSchema } from "@dbx-tools/shared-core/options";
6
+ import { postgresEnvironmentNames, postgresRoleSchema } from "@dbx-tools/shared-core";
7
7
  /** Resolve and validate an explicit or environment-provided PostgreSQL role. */
8
8
  export function resolvePostgresRole(role, environment = process.env) {
9
9
  return postgresRoleSchema
@@ -39,4 +39,4 @@ export function postgresConnectionOptions(options, role) {
39
39
  options: configured ? `${configured} ${roleOption}` : roleOption,
40
40
  };
41
41
  }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU85RixnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxJQUFhLEVBQ2IsY0FBaUMsT0FBTyxDQUFDLEdBQUc7SUFFNUMsT0FBTyxrQkFBa0I7U0FDdEIsUUFBUSxFQUFFO1NBQ1YsS0FBSyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsd0JBQXdCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsdUNBQXVDO0FBQ3ZDLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFhO0lBQ25ELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDM0YsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBYTtJQUNqRCxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEYsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLElBQWEsRUFDYixXQUE2QyxFQUFFO0lBRS9DLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO0FBQ3RFLENBQUM7QUFFRCwyREFBMkQ7QUFDM0QsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxPQUFVLEVBQ1YsSUFBYTtJQUViLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxPQUF3QyxDQUFDO0lBQ25FLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNyRCxNQUFNLFVBQVUsR0FBRyxXQUFXLFFBQVEsRUFBRSxDQUFDO0lBQ3pDLE9BQU87UUFDTCxHQUFHLE9BQU87UUFDVixPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVTtLQUNqRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIFBvc3RncmVTUUwgc2Vzc2lvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgcG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzLCBwb3N0Z3Jlc1JvbGVTY2hlbWEgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vcHRpb25zXCI7XG5cbi8qKiBQb29sL2NsaWVudCBvcHRpb25zIHJlcXVpcmVkIHRvIHNldCBQb3N0Z3JlU1FMIHN0YXJ0dXAgcGFyYW1ldGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyB7XG4gIG9wdGlvbnM/OiBzdHJpbmc7XG59XG5cbi8qKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSBhbiBleHBsaWNpdCBvciBlbnZpcm9ubWVudC1wcm92aWRlZCBQb3N0Z3JlU1FMIHJvbGUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBvc3RncmVzUm9sZShcbiAgcm9sZT86IHN0cmluZyxcbiAgZW52aXJvbm1lbnQ6IE5vZGVKUy5Qcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnYsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcG9zdGdyZXNSb2xlU2NoZW1hXG4gICAgLm9wdGlvbmFsKClcbiAgICAucGFyc2Uocm9sZSA/PyBlbnZpcm9ubWVudFtwb3N0Z3Jlc0Vudmlyb25tZW50TmFtZXMucG9zdGdyZXNSb2xlXSk7XG59XG5cbi8qKiBRdW90ZSBvbmUgUG9zdGdyZVNRTCBpZGVudGlmaWVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQb3N0Z3JlU1FMIGlkZW50aWZpZXJzIGNhbm5vdCBjb250YWluIE5VTFwiKTtcbiAgcmV0dXJuIGBcIiR7dmFsdWUucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYDtcbn1cblxuLyoqIEJ1aWxkIGEgYFNFVCBST0xFYCBzdGF0ZW1lbnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gcm9sZSBpcyBjb25maWd1cmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc3RncmVzUm9sZVN0YXRlbWVudChyb2xlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlUG9zdGdyZXNSb2xlKHJvbGUpO1xuICByZXR1cm4gcmVzb2x2ZWQgPyBgU0VUIFJPTEUgJHtxdW90ZVBvc3RncmVzSWRlbnRpZmllcihyZXNvbHZlZCl9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIE1lcmdlIHRoZSBjb25maWd1cmVkIHJvbGUgaW50byBhc3luY3BnLWNvbXBhdGlibGUgc2VydmVyIHNldHRpbmdzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc3RncmVzU2VydmVyU2V0dGluZ3MoXG4gIHJvbGU/OiBzdHJpbmcsXG4gIHNldHRpbmdzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVBvc3RncmVzUm9sZShyb2xlKTtcbiAgcmV0dXJuIHJlc29sdmVkID8geyAuLi5zZXR0aW5ncywgcm9sZTogcmVzb2x2ZWQgfSA6IHsgLi4uc2V0dGluZ3MgfTtcbn1cblxuLyoqIE1lcmdlIHRoZSBjb25maWd1cmVkIHJvbGUgaW50byBgcGdgIHN0YXJ0dXAgb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvcHRpb25zOiBULFxuICByb2xlPzogc3RyaW5nLFxuKTogVCAmIFBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnMge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVQb3N0Z3Jlc1JvbGUocm9sZSk7XG4gIGlmICghcmVzb2x2ZWQpIHJldHVybiBvcHRpb25zO1xuICBjb25zdCBjb25uZWN0aW9uT3B0aW9ucyA9IG9wdGlvbnMgYXMgVCAmIFBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnM7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBjb25uZWN0aW9uT3B0aW9ucy5vcHRpb25zPy50cmltKCk7XG4gIGNvbnN0IHJvbGVPcHRpb24gPSBgLWMgcm9sZT0ke3Jlc29sdmVkfWA7XG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBvcHRpb25zOiBjb25maWd1cmVkID8gYCR7Y29uZmlndXJlZH0gJHtyb2xlT3B0aW9ufWAgOiByb2xlT3B0aW9uLFxuICB9O1xufVxuIl19
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU90RixnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxJQUFhLEVBQ2IsY0FBaUMsT0FBTyxDQUFDLEdBQUc7SUFFNUMsT0FBTyxrQkFBa0I7U0FDdEIsUUFBUSxFQUFFO1NBQ1YsS0FBSyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsd0JBQXdCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsdUNBQXVDO0FBQ3ZDLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFhO0lBQ25ELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDM0YsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBYTtJQUNqRCxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEYsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLElBQWEsRUFDYixXQUE2QyxFQUFFO0lBRS9DLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO0FBQ3RFLENBQUM7QUFFRCwyREFBMkQ7QUFDM0QsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxPQUFVLEVBQ1YsSUFBYTtJQUViLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxPQUF3QyxDQUFDO0lBQ25FLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNyRCxNQUFNLFVBQVUsR0FBRyxXQUFXLFFBQVEsRUFBRSxDQUFDO0lBQ3pDLE9BQU87UUFDTCxHQUFHLE9BQU87UUFDVixPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVTtLQUNqRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIFBvc3RncmVTUUwgc2Vzc2lvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgcG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzLCBwb3N0Z3Jlc1JvbGVTY2hlbWEgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogUG9vbC9jbGllbnQgb3B0aW9ucyByZXF1aXJlZCB0byBzZXQgUG9zdGdyZVNRTCBzdGFydHVwIHBhcmFtZXRlcnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnMge1xuICBvcHRpb25zPzogc3RyaW5nO1xufVxuXG4vKiogUmVzb2x2ZSBhbmQgdmFsaWRhdGUgYW4gZXhwbGljaXQgb3IgZW52aXJvbm1lbnQtcHJvdmlkZWQgUG9zdGdyZVNRTCByb2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQb3N0Z3Jlc1JvbGUoXG4gIHJvbGU/OiBzdHJpbmcsXG4gIGVudmlyb25tZW50OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHByb2Nlc3MuZW52LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHBvc3RncmVzUm9sZVNjaGVtYVxuICAgIC5vcHRpb25hbCgpXG4gICAgLnBhcnNlKHJvbGUgPz8gZW52aXJvbm1lbnRbcG9zdGdyZXNFbnZpcm9ubWVudE5hbWVzLnBvc3RncmVzUm9sZV0pO1xufVxuXG4vKiogUXVvdGUgb25lIFBvc3RncmVTUUwgaWRlbnRpZmllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZVBvc3RncmVzSWRlbnRpZmllcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUG9zdGdyZVNRTCBpZGVudGlmaWVycyBjYW5ub3QgY29udGFpbiBOVUxcIik7XG4gIHJldHVybiBgXCIke3ZhbHVlLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImA7XG59XG5cbi8qKiBCdWlsZCBhIGBTRVQgUk9MRWAgc3RhdGVtZW50LCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIHJvbGUgaXMgY29uZmlndXJlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0Z3Jlc1JvbGVTdGF0ZW1lbnQocm9sZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVBvc3RncmVzUm9sZShyb2xlKTtcbiAgcmV0dXJuIHJlc29sdmVkID8gYFNFVCBST0xFICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIocmVzb2x2ZWQpfWAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBNZXJnZSB0aGUgY29uZmlndXJlZCByb2xlIGludG8gYXN5bmNwZy1jb21wYXRpYmxlIHNlcnZlciBzZXR0aW5ncy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0Z3Jlc1NlcnZlclNldHRpbmdzKFxuICByb2xlPzogc3RyaW5nLFxuICBzZXR0aW5nczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7fSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVQb3N0Z3Jlc1JvbGUocm9sZSk7XG4gIHJldHVybiByZXNvbHZlZCA/IHsgLi4uc2V0dGluZ3MsIHJvbGU6IHJlc29sdmVkIH0gOiB7IC4uLnNldHRpbmdzIH07XG59XG5cbi8qKiBNZXJnZSB0aGUgY29uZmlndXJlZCByb2xlIGludG8gYHBnYCBzdGFydHVwIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zdGdyZXNDb25uZWN0aW9uT3B0aW9uczxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb3B0aW9uczogVCxcbiAgcm9sZT86IHN0cmluZyxcbik6IFQgJiBQb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlUG9zdGdyZXNSb2xlKHJvbGUpO1xuICBpZiAoIXJlc29sdmVkKSByZXR1cm4gb3B0aW9ucztcbiAgY29uc3QgY29ubmVjdGlvbk9wdGlvbnMgPSBvcHRpb25zIGFzIFQgJiBQb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zO1xuICBjb25zdCBjb25maWd1cmVkID0gY29ubmVjdGlvbk9wdGlvbnMub3B0aW9ucz8udHJpbSgpO1xuICBjb25zdCByb2xlT3B0aW9uID0gYC1jIHJvbGU9JHtyZXNvbHZlZH1gO1xuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb3B0aW9uczogY29uZmlndXJlZCA/IGAke2NvbmZpZ3VyZWR9ICR7cm9sZU9wdGlvbn1gIDogcm9sZU9wdGlvbixcbiAgfTtcbn1cbiJdfQ==
@@ -24,7 +24,7 @@
24
24
  * @module
25
25
  */
26
26
  import { hostname } from "node:os";
27
- import { asyncUtils, errorUtils, hash, json, object, stringUtils } from "@dbx-tools/shared-core";
27
+ import { sleep, errorMessage, toError, id, parseRecord, isSerializableValue, firstNonEmpty, trimToNull, } from "@dbx-tools/shared-core";
28
28
  import { channelName } from "./identity.js";
29
29
  import { cleanupExpired, decodePointer, history, persistedNotify, provisionMessageBusSchema, readPointer, resolvePersistenceOptions, } from "./persistence.js";
30
30
  import { quotePostgresIdentifier } from "./session.js";
@@ -70,7 +70,7 @@ function definedMetadata(values) {
70
70
  */
71
71
  function machineMetadata() {
72
72
  return definedMetadata({
73
- project: stringUtils.firstNonEmpty([
73
+ project: firstNonEmpty([
74
74
  process.env.DATABRICKS_APP_NAME,
75
75
  process.env.DATABRICKS_BUNDLE_NAME,
76
76
  process.env.PROJECT_NAME,
@@ -78,10 +78,10 @@ function machineMetadata() {
78
78
  ]) ?? undefined,
79
79
  hostname: hostname(),
80
80
  platform: process.platform,
81
- environment: stringUtils.trimToNull(process.env.NODE_ENV) ?? undefined,
82
- appName: stringUtils.trimToNull(process.env.DATABRICKS_APP_NAME) ?? undefined,
83
- deploymentId: stringUtils.trimToNull(process.env.DATABRICKS_APP_DEPLOYMENT_ID) ?? undefined,
84
- databricksHost: stringUtils.trimToNull(process.env.DATABRICKS_HOST) ?? undefined,
81
+ environment: trimToNull(process.env.NODE_ENV) ?? undefined,
82
+ appName: trimToNull(process.env.DATABRICKS_APP_NAME) ?? undefined,
83
+ deploymentId: trimToNull(process.env.DATABRICKS_APP_DEPLOYMENT_ID) ?? undefined,
84
+ databricksHost: trimToNull(process.env.DATABRICKS_HOST) ?? undefined,
85
85
  });
86
86
  }
87
87
  /**
@@ -104,9 +104,9 @@ async function senderMetadata() {
104
104
  try {
105
105
  const context = appkit.getExecutionContext();
106
106
  return definedMetadata({
107
- senderId: stringUtils.trimToNull(context.userId) ?? undefined,
108
- senderName: stringUtils.trimToNull(context.userName) ?? undefined,
109
- senderEmail: stringUtils.trimToNull(context.userEmail) ?? undefined,
107
+ senderId: trimToNull(context.userId) ?? undefined,
108
+ senderName: trimToNull(context.userName) ?? undefined,
109
+ senderEmail: trimToNull(context.userEmail) ?? undefined,
110
110
  });
111
111
  }
112
112
  catch {
@@ -125,7 +125,7 @@ async function senderMetadata() {
125
125
  function decode(value) {
126
126
  if (!value)
127
127
  return undefined;
128
- const record = json.parseRecord(value);
128
+ const record = parseRecord(value);
129
129
  if (!record ||
130
130
  typeof record.id !== "string" ||
131
131
  typeof record.topic !== "string" ||
@@ -135,8 +135,8 @@ function decode(value) {
135
135
  typeof record.metadata !== "object" ||
136
136
  Array.isArray(record.metadata) ||
137
137
  !("body" in record) ||
138
- !object.isSerializableValue(record.metadata) ||
139
- !object.isSerializableValue(record.body)) {
138
+ !isSerializableValue(record.metadata) ||
139
+ !isSerializableValue(record.body)) {
140
140
  return undefined;
141
141
  }
142
142
  return {
@@ -239,15 +239,14 @@ export class PostgresTopicBus {
239
239
  throw new TypeError("Topic must not be empty");
240
240
  if (!input.type.trim())
241
241
  throw new TypeError("Message type must not be empty");
242
- if (!object.isSerializableValue(input.metadata ?? {}) ||
243
- !object.isSerializableValue(input.body)) {
242
+ if (!isSerializableValue(input.metadata ?? {}) || !isSerializableValue(input.body)) {
244
243
  throw new TypeError("Message metadata and body must be JSON serializable without coercion");
245
244
  }
246
245
  if (this.closed)
247
246
  throw new Error("Postgres topic bus is closed");
248
247
  const automatic = await this.resolveMetadata();
249
248
  const message = {
250
- id: hash.id(),
249
+ id: id(),
251
250
  topic,
252
251
  type: input.type,
253
252
  metadata: { ...automatic, ...input.metadata },
@@ -259,7 +258,7 @@ export class PostgresTopicBus {
259
258
  encoded = JSON.stringify(message);
260
259
  }
261
260
  catch (cause) {
262
- throw new TypeError(`Message must be JSON serializable: ${errorUtils.errorMessage(cause)}`);
261
+ throw new TypeError(`Message must be JSON serializable: ${errorMessage(cause)}`);
263
262
  }
264
263
  if (!decode(encoded)) {
265
264
  throw new TypeError("Message type, metadata, and body must be JSON serializable");
@@ -374,7 +373,7 @@ export class PostgresTopicBus {
374
373
  await client.query(`UNLISTEN ${quotePostgresIdentifier(this.channelName)}`);
375
374
  }
376
375
  catch (cause) {
377
- releaseError = errorUtils.toError(cause);
376
+ releaseError = toError(cause);
378
377
  }
379
378
  client.release(releaseError);
380
379
  }
@@ -400,7 +399,7 @@ export class PostgresTopicBus {
400
399
  catch (cause) {
401
400
  client.removeListener("notification", this.handleNotification);
402
401
  client.removeListener("error", this.handleClientError);
403
- client.release(errorUtils.toError(cause));
402
+ client.release(toError(cause));
404
403
  throw cause;
405
404
  }
406
405
  }
@@ -481,7 +480,7 @@ export class PostgresTopicBus {
481
480
  while (!this.closed && this.listeners.size > 0) {
482
481
  if (delay > 0) {
483
482
  try {
484
- await asyncUtils.sleep(delay, this.reconnectAbort.signal);
483
+ await sleep(delay, this.reconnectAbort.signal);
485
484
  }
486
485
  catch {
487
486
  return;
@@ -500,4 +499,4 @@ export class PostgresTopicBus {
500
499
  }
501
500
  }
502
501
  }
503
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvcGljLWJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUlqRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsYUFBYSxFQUNiLE9BQU8sRUFDUCxlQUFlLEVBQ2YseUJBQXlCLEVBQ3pCLFdBQVcsRUFDWCx5QkFBeUIsR0FNMUIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFRdkQsb0VBQW9FO0FBQ3BFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBQzlDOzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQWtCckM7Ozs7R0FJRztBQUNILElBQUksWUFBMkQsQ0FBQztBQWdIaEU7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQXFEO0lBQzVFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQXdDLEVBQUU7UUFDNUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7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KipcbiAqIFRvcGljIGZhbi1vdXQgb3ZlciBQb3N0Z3JlU1FMIGBMSVNURU5gL2BOT1RJRllgLCBmb3IgdGVsbGluZyBldmVyeSBydW5uaW5nXG4gKiBpbnN0YW5jZSBvZiBhbiBhcHAgdGhhdCBzb21ldGhpbmcgaGFwcGVuZWQuXG4gKlxuICogVGhlIHNpYmxpbmcgYGFkdmlzb3J5LWxvY2tgIG1vZHVsZSBpcyBhYm91dCBtYWtpbmcgc3VyZSBvbmx5IE9ORSBjb25uZWN0aW9uXG4gKiBkb2VzIGEgdGhpbmc7IHRoaXMgb25lIGlzIHRoZSBvcHBvc2l0ZSAtIEVWRVJZIGxpc3RlbmluZyBzZXNzaW9uIGdldHMgZXZlcnlcbiAqIG5vdGlmaWNhdGlvbi4gVGhhdCBtYWtlcyBpdCB0aGUgcmlnaHQgcHJpbWl0aXZlIGZvciBsaXZlIFVJIHVwZGF0ZXNcbiAqIChhbiBTU0Ugc3RyZWFtIHBlciBicm93c2VyIHRhYiwgYSBjYWNoZSBpbnZhbGlkYXRpb24sIGEgcHJlc2VuY2UgcGluZykgYW5kIHRoZVxuICogd3Jvbmcgb25lIGZvciB3b3JrIGRpc3RyaWJ1dGlvbjogdGhlcmUgYXJlIG5vIGNvbXBldGluZyBjb25zdW1lcnMsIG5vIGFja3MsIGFuZFxuICogbm8gcmVwbGF5LlxuICpcbiAqIERlbGl2ZXJ5IGlzIGJlc3QtZWZmb3J0IGFuZCBsaXZlLiBgTk9USUZZYCByZWFjaGVzIHNlc3Npb25zIHRoYXQgYXJlIGxpc3RlbmluZ1xuICogYXQgdGhlIG1vbWVudCBpdCBjb21taXRzLCBzbyBhIGxpc3RlbmVyIHRoYXQgY29ubmVjdHMgYSBzZWNvbmQgbGF0ZXIgbmV2ZXIgc2Vlc1xuICogaXQsIGFuZCBhIGxpc3RlbmVyIHdob3NlIGNvbm5lY3Rpb24gZHJvcHMgbWlzc2VzIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIGJ1c1xuICogcmVjb25uZWN0cy4gVXNlIGEgdGFibGUgb3IgYSBxdWV1ZSB3aGVuIGEgc3Vic2NyaWJlciBuZWVkcyBkdXJhYmlsaXR5LlxuICpcbiAqIE9ORSBDSEFOTkVMLCBNQU5ZIFRPUElDUy4gRXZlcnkgYnVzIGluc3RhbmNlIGxpc3RlbnMgb24gYSBzaW5nbGUgUG9zdGdyZXNcbiAqIGNoYW5uZWwgKGBjaGFubmVsYCwgZGVmYXVsdCBgZGJ4X3Rvb2xzX3RvcGljX2J1c2ApIGFuZCBmaWx0ZXJzIGJ5IHRoZVxuICogZW52ZWxvcGUncyBgdG9waWNgIGluLXByb2Nlc3MsIHNvIGFkZGluZyBhIHRvcGljIGNvc3RzIG5vIGNvbm5lY3Rpb24gYW5kIG5vXG4gKiBgTElTVEVOYC4gVGhlIHRyYWRlb2ZmIGlzIHRoYXQgZXZlcnkgbGlzdGVuaW5nIHNlc3Npb24gZGVjb2RlcyBldmVyeSBtZXNzYWdlIG9uXG4gKiB0aGUgY2hhbm5lbDsgZ2l2ZSBhIGdlbnVpbmVseSBoaWdoLXZvbHVtZSwgdW5yZWxhdGVkIHN0cmVhbSBpdHMgb3duIGBjaGFubmVsYFxuICogcmF0aGVyIHRoYW4gYSB0b3BpYy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaG9zdG5hbWUgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywgZXJyb3JVdGlscywgaGFzaCwganNvbiwgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IE5vdGlmaWNhdGlvbiwgUG9vbENsaWVudCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay50c1wiO1xuaW1wb3J0IHsgY2hhbm5lbE5hbWUgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHtcbiAgY2xlYW51cEV4cGlyZWQsXG4gIGRlY29kZVBvaW50ZXIsXG4gIGhpc3RvcnksXG4gIHBlcnNpc3RlZE5vdGlmeSxcbiAgcHJvdmlzaW9uTWVzc2FnZUJ1c1NjaGVtYSxcbiAgcmVhZFBvaW50ZXIsXG4gIHJlc29sdmVQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIHR5cGUgRHVyYXRpb25JbnB1dCxcbiAgdHlwZSBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICB0eXBlIFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICB0eXBlIFRvcGljSGlzdG9yeVBhZ2UsXG4gIHR5cGUgVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxufSBmcm9tIFwiLi9wZXJzaXN0ZW5jZS50c1wiO1xuaW1wb3J0IHsgcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIgfSBmcm9tIFwiLi9zZXNzaW9uLnRzXCI7XG5cbi8qKlxuICogYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgIG93bnMgdGhlIEpTT04tcm91bmQtdHJpcCBydWxlOyB0aGlzIGFsaWFzIGp1c3Qga2VlcHMgdGhlXG4gKiBnZW5lcmljIHNpZ25hdHVyZXMgYmVsb3cgcmVhZGFibGUuIENvbnN1bWVycyBpbXBvcnQgdGhlIHR5cGUgZnJvbSBzaGFyZWQtY29yZS5cbiAqL1xudHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZTtcblxuLyoqIENoYW5uZWwgcGFydHMgdXNlZCB3aGVuIGEgY2FsbGVyIG5hbWVzIG5vIGNoYW5uZWwgb2YgaXRzIG93bi4gKi9cbmNvbnN0IERFRkFVTFRfQ0hBTk5FTCA9IFwiZGJ4X3Rvb2xzX3RvcGljX2J1c1wiO1xuLyoqXG4gKiBFbmNvZGVkLWVudmVsb3BlIGNlaWxpbmcuIFBvc3RncmVTUUwgY2FwcyBhIGBOT1RJRllgIHBheWxvYWQgYXQgODAwMCBieXRlcyBhbmRcbiAqIGZhaWxzIHRoZSBzdGF0ZW1lbnQgcGFzdCB0aGF0LCBzbyB0aGUgYnVzIHJlamVjdHMgdGhlIG1lc3NhZ2UgZmlyc3Qgd2l0aCBhIHNpemVcbiAqIGl0IGNhbiBuYW1lLiBUaGUgbWFyZ2luIGJlbG93IDgwMDAgY292ZXJzIHRoZSBzZXJ2ZXIncyBvd24gYWNjb3VudGluZy5cbiAqL1xuY29uc3QgTUFYX05PVElGWV9CWVRFUyA9IDdfOTAwO1xuY29uc3QgTUlOX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDI1MDtcbmNvbnN0IE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMgPSA1XzAwMDtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIEFwcEtpdCdzIHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHRoZSBidXMgcmVhZHMgZm9yIHNlbmRlclxuICogaWRlbnRpdHkuIEZpZWxkcyBhcmUgYHVua25vd25gIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgdmlldyBvZiBhbiBPUFRJT05BTFxuICogcGVlcjogdGhlIHZhbHVlcyBhcmUgdHJpbW1lZCBhbmQgdmFsaWRhdGVkIHJhdGhlciB0aGFuIHRydXN0ZWQuXG4gKi9cbnR5cGUgQXBwS2l0RXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgdXNlckVtYWlsPzogdW5rbm93bjtcbiAgdXNlcklkPzogdW5rbm93bjtcbiAgdXNlck5hbWU/OiB1bmtub3duO1xufTtcblxuLyoqIFN0cnVjdHVyYWwgdmlldyBvZiBgQGRhdGFicmlja3MvYXBwa2l0YCwgaW1wb3J0ZWQgbGF6aWx5IGFuZCBuZXZlciByZXF1aXJlZC4gKi9cbnR5cGUgQXBwS2l0TW9kdWxlID0ge1xuICBnZXRFeGVjdXRpb25Db250ZXh0KCk6IEFwcEtpdEV4ZWN1dGlvbkNvbnRleHQ7XG59O1xuXG4vKipcbiAqIENhY2hlZCByZXN1bHQgb2YgdGhlIG9uZSBvcHRpb25hbC1wZWVyIGltcG9ydCwgcmVzb2x2ZWQgdG8gYHVuZGVmaW5lZGAgd2hlblxuICogQXBwS2l0IGlzIG5vdCBpbnN0YWxsZWQuIE1lbW9pemVkIHNvIGEgYnVzIGluIGEgcGxhaW4gUG9zdGdyZXMgcHJvY2VzcyBwYXlzIGZvclxuICogdGhlIGZhaWxlZCByZXNvbHV0aW9uIG9uY2UgaW5zdGVhZCBvZiBwZXIgYnJvYWRjYXN0LlxuICovXG5sZXQgYXBwS2l0TW9kdWxlOiBQcm9taXNlPEFwcEtpdE1vZHVsZSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRmxhdC1rZXllZCBjb250ZXh0IHRyYXZlbGxpbmcgYWxvbmdzaWRlIGEgbWVzc2FnZSBib2R5OiB3aG8gc2VudCBpdCwgZnJvbVxuICogd2hlcmUsIGluIHdoaWNoIGRlcGxveW1lbnQuIFZhbHVlcyBtYXkgbmVzdCwgYnV0IHRoZSBrZXlzIGFyZSB0aGUgYWRkcmVzc2FibGVcbiAqIHBhcnQgLSBhIGxpc3RlbmVyIGZpbHRlcmluZyBvciBsYWJlbGxpbmcgbWVzc2FnZXMgcmVhZHMgYG1ldGFkYXRhLnVzZXJgLCBub3QgYVxuICogcGF0aCBpbnRvIHRoZSBib2R5LlxuICovXG5leHBvcnQgdHlwZSBUb3BpY01ldGFkYXRhID0gUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWU+O1xuXG4vKipcbiAqIFRoZSB3aXJlIGVudmVsb3BlIGV2ZXJ5IHN1YnNjcmliZXIgcmVjZWl2ZXMsIGFuZCB3aGF0IHtAbGlua1xuICogUG9zdGdyZXNUb3BpY0J1cy5icm9hZGNhc3R9IHJldHVybnMgdG8gdGhlIHB1Ymxpc2hlci5cbiAqXG4gKiBgaWRgLCBgdG9waWNgLCBhbmQgYHB1Ymxpc2hlZEF0YCBhcmUgYXNzaWduZWQgYnkgdGhlIGJ1czsgYHR5cGVgLCBgbWV0YWRhdGFgLFxuICogYW5kIGBib2R5YCBjb21lIGZyb20gdGhlIGNhbGxlciAod2l0aCBhdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgdW5kZXJcbiAqIGBtZXRhZGF0YWApLiBUaGUgc2hhcGUgaXMgc3RhYmxlIGVub3VnaCB0byBoYW5kIHN0cmFpZ2h0IHRvIGFuIFNTRSBgZGF0YTpgXG4gKiBmcmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY01lc3NhZ2U8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZSA9IFNlcmlhbGl6YWJsZVZhbHVlPiB7XG4gIC8qKlxuICAgKiBQZXItbWVzc2FnZSBpZGVudGl0eSBnZW5lcmF0ZWQgYnkgdGhlIHB1Ymxpc2hlciwgdW5pcXVlIGFjcm9zcyBpbnN0YW5jZXMuXG4gICAqIFN1aXRhYmxlIGZvciBkZWR1cGUgd2hlbiBhIGNsaWVudCByZWNvbm5lY3RzIGFuZCBmb3IgYW4gU1NFIGBpZDpgIGZpZWxkLiBOb3RcbiAgICogb3JkZXJlZCwgYW5kIG5vdCBhIGRhdGFiYXNlIGtleS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdG9waWMgdGhpcyB3YXMgYnJvYWRjYXN0IG9uOyBsaXN0ZW5lcnMgb24gb3RoZXIgdG9waWNzIG5ldmVyIHNlZSBpdC4gKi9cbiAgdG9waWM6IHN0cmluZztcbiAgLyoqIENhbGxlci1jaG9zZW4gZXZlbnQgbmFtZSwgZS5nLiBgb3JkZXIudXBkYXRlZGAuIE5ldmVyIGVtcHR5LiAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBBdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgd2l0aCBjYWxsZXIgbWV0YWRhdGEuIFNlZSB7QGxpbmsgVG9waWNNZXRhZGF0YX0uICovXG4gIG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIGNhbGxlcidzIHBheWxvYWQsIHVuY2hhbmdlZC4gKi9cbiAgYm9keTogVEJvZHk7XG4gIC8qKlxuICAgKiBJU08tODYwMSBwdWJsaXNoIHRpbWUgZnJvbSB0aGUgUFVCTElTSElORyBwcm9jZXNzJ3MgY2xvY2ssIG5vdCB0aGUgZGF0YWJhc2Uncy5cbiAgICogRmluZSBmb3IgZGlzcGxheTsgZG8gbm90IG9yZGVyIG1lc3NhZ2VzIGZyb20gZGlmZmVyZW50IGluc3RhbmNlcyBieSBpdC5cbiAgICovXG4gIHB1Ymxpc2hlZEF0OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IGEgY2FsbGVyIHN1cHBsaWVzIHRvIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzLmJyb2FkY2FzdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljUHVibGlzaElucHV0PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4ge1xuICAvKiogRXZlbnQgbmFtZSwgZS5nLiBgY2hhdC5tZXNzYWdlYC4gTXVzdCBiZSBub24tYmxhbmsuICovXG4gIHR5cGU6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRleHQgdG8gYXR0YWNoLiBXaW5zIG92ZXIgYW55IGF1dG9tYXRpYyBrZXkgb2YgdGhlIHNhbWUgbmFtZSwgc28gYSBjYWxsZXJcbiAgICogY2FuIG92ZXJyaWRlIGEgbWFjaGluZSBkZWZhdWx0IChgcHJvamVjdGApIG9yIGFkZCBpdHMgb3duIChgdHJhY2VJZGApLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIHBheWxvYWQuIE11c3Qgc2F0aXNmeSBgb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWVgLiAqL1xuICBib2R5OiBUQm9keTtcbiAgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHR0bD86IER1cmF0aW9uSW5wdXQgfCBmYWxzZTtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVyIGNhbGxiYWNrLiBJbnZva2VkIG9uY2UgcGVyIG1hdGNoaW5nIG1lc3NhZ2Ugb24gdGhlIG5vdGlmaWNhdGlvblxuICogY29ubmVjdGlvbidzIGNhbGxiYWNrLCBzbyBpdCBzaG91bGQgbm90IGJsb2NrOiBhIHJldHVybmVkIHByb21pc2UgaXMgYXdhaXRlZFxuICogb25seSB0byByb3V0ZSBhIHJlamVjdGlvbiB0byBgb25FcnJvcmAsIGFuZCBsaXN0ZW5lcnMgZm9yIG9uZSBtZXNzYWdlIHJ1blxuICogY29uY3VycmVudGx5IHJhdGhlciB0aGFuIGluIHJlZ2lzdHJhdGlvbiBvcmRlci5cbiAqXG4gKiBgVEJvZHlgIGlzIHVuY2hlY2tlZCBhdCBydW50aW1lLiBUaGUgYnVzIGd1YXJhbnRlZXMgdGhlIGJvZHkgaXMgc2VyaWFsaXphYmxlLFxuICogbm90IHRoYXQgaXQgbWF0Y2hlcyB0aGUgdHlwZSBwYXJhbWV0ZXIsIHNvIHZhbGlkYXRlIGFueXRoaW5nIGEgbGlzdGVuZXJcbiAqIGJyYW5jaGVzIG9uLlxuICovXG5leHBvcnQgdHlwZSBUb3BpY0xpc3RlbmVyPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4gPSAoXG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4sXG4pID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuLyoqXG4gKiBSZXNvbHZlcyBtZXRhZGF0YSBhdCBwdWJsaXNoIHRpbWUgaW5zdGVhZCBvZiBjb25zdHJ1Y3Rpb24gdGltZSwgZm9yIGNvbnRleHQgYVxuICogcHJvY2VzcyBsZWFybnMgbGF0ZSBvciBhc3luY2hyb25vdXNseSAtIGFuIGluc3RhbmNlIGlkIGZyb20gYSBjb250cm9sIHBsYW5lLCBhXG4gKiBkaXNjb3ZlcmVkIGFkZHJlc3MgYSBjYWxsZXIgY2hvb3NlcyB0byBhdHRhY2guIENhbGxlZCBvbiBldmVyeSBicm9hZGNhc3QsIHNvXG4gKiBtZW1vaXplIGFueXRoaW5nIGV4cGVuc2l2ZTsgYSByZWplY3Rpb24gZmFpbHMgdGhlIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9waWNNZXRhZGF0YVByb3ZpZGVyID0gKCkgPT4gVG9waWNNZXRhZGF0YSB8IFByb21pc2VMaWtlPFRvcGljTWV0YWRhdGE+O1xuXG4vKiogQ29uc3RydWN0aW9uIG9wdGlvbnMgZm9yIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMge1xuICAvKipcbiAgICogV2hhdCBpZGVudGlmaWVzIHRoaXMgY2hhbm5lbCAtIGFueXRoaW5nLCBub3QganVzdCBhbiBpZGVudGlmaWVyOiBhIG5hbWUsIGFuXG4gICAqIGlkLCBhIGBbZW52LCBmZWF0dXJlXWAgcGFpciwgYSBjb25maWcgb2JqZWN0LiBUaGUgcGFydHMgYXJlIHRva2VuaXplZCBpbnRvIGFcbiAgICogbGVnYWwgUG9zdGdyZXMgY2hhbm5lbCBuYW1lIHdpdGggYSBzaG9ydCBoYXNoIG9mIHRoZSBvcmlnaW5hbHMgYXBwZW5kZWQsIHNvXG4gICAqIHRoZSBkZXJpdmF0aW9uIGlzIGRldGVybWluaXN0aWMgYW5kIG5vIGNhbGwgc2l0ZSBoYXMgdG8gc2FuaXRpemUuIFNlZVxuICAgKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0gZm9yIHRoZSByZXNvbHZlZCBuYW1lLlxuICAgKlxuICAgKiBPbmUgdmFsdWUgb3IgbWFueTogYW4gYXJyYXkgaXMgcmVhZCBhcyBtdWx0aXBsZSBwYXJ0c1xuICAgKiAoe0BsaW5rIG9iamVjdC5PbmVPck1hbnl9KSwgYW55dGhpbmcgZWxzZSBhcyBhIHNpbmdsZSBwYXJ0LiBTb1xuICAgKiBgW1wiYmlsbGluZ1wiLCBcInByb2RcIl1gIGFuZCBgXCJiaWxsaW5nX3Byb2RcImAgYXJlIGRpZmZlcmVudCBjaGFubmVscywgc2luY2UgdGhlXG4gICAqIGhhc2ggc2VlcyBkaWZmZXJlbnQgc3RydWN0dXJlLlxuICAgKlxuICAgKiBFdmVyeSBwYXJ0aWNpcGF0aW5nIHByb2Nlc3MgbXVzdCBwYXNzIEVRVUlWQUxFTlQgcGFydHMsIHNpbmNlIGEgZGlmZmVyZW50XG4gICAqIHNwZWxsaW5nIGhhc2hlcyB0byBhIGRpZmZlcmVudCBjaGFubmVsLiBEZWZhdWx0cyB0byBhIHNoYXJlZFxuICAgKiBgZGJ4X3Rvb2xzX3RvcGljX2J1c2AgY2hhbm5lbC5cbiAgICovXG4gIGNoYW5uZWw/OiB1bmtub3duO1xuICAvKipcbiAgICogRXh0cmEgY29udGV4dCBhZGRlZCB0byBldmVyeSBtZXNzYWdlIHRoaXMgYnVzIHB1Ymxpc2hlcywgZWl0aGVyIGEgZml4ZWRcbiAgICogcmVjb3JkIG9yIGEge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gY2FsbGVkIHBlciBicm9hZGNhc3QuIE92ZXJyaWRlc1xuICAgKiBhdXRvbWF0aWMgbWFjaGluZSBrZXlzOyBwZXItY2FsbCBgbWV0YWRhdGFgIG92ZXJyaWRlcyB0aGlzLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyO1xuICAvKipcbiAgICogU2luayBmb3IgZmFpbHVyZXMgdGhhdCBoYXZlIG5vIGNhbGxlciB0byB0aHJvdyB0bzogYSBsaXN0ZW5lciB0aGF0IHJlamVjdGVkLFxuICAgKiBhIGRyb3BwZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24sIGEgZmFpbGVkIHJlY29ubmVjdCBhdHRlbXB0LiBEZWZhdWx0cyB0b1xuICAgKiBzd2FsbG93aW5nIHRoZW0sIHNvIHdpcmUgdGhpcyB0byBhIGxvZ2dlciBpbiBhbnl0aGluZyBsb25nLXJ1bm5pbmcuXG4gICAqL1xuICBvbkVycm9yPzogKGNhdXNlOiB1bmtub3duKSA9PiB2b2lkO1xuICBwZXJzaXN0PzogYm9vbGVhbiB8IFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zO1xufVxuXG4vKipcbiAqIERyb3Aga2V5cyB3aG9zZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgc28gYW4gdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgbGVhdmVzXG4gKiB0aGUga2V5IEFCU0VOVCByYXRoZXIgdGhhbiBwcmVzZW50LWFuZC1udWxsLiBBYnNlbmNlIGlzIHdoYXQgbGV0cyBjYWxsZXJcbiAqIG1ldGFkYXRhIGFuZCBsYXRlciBtZXJnZSBsYXllcnMgc3VwcGx5IHRoZSBrZXkgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lZE1ldGFkYXRhKHZhbHVlczogUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWUgfCB1bmRlZmluZWQ+KTogVG9waWNNZXRhZGF0YSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgW3N0cmluZywgU2VyaWFsaXphYmxlVmFsdWVdID0+IHtcbiAgICAgIHJldHVybiBlbnRyeVsxXSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIENvbnRleHQgZXZlcnkgbWVzc2FnZSBnZXRzIGZvciBmcmVlOiB3aGljaCBwcm9qZWN0LCBob3N0LCBhbmQgZGVwbG95bWVudFxuICogcHVibGlzaGVkIGl0LlxuICpcbiAqIFJlYWQgZnJlc2ggcGVyIGJyb2FkY2FzdCByYXRoZXIgdGhhbiBjYWNoZWQsIGJlY2F1c2UgYSBsb25nLWxpdmVkIHByb2Nlc3MgY2FuXG4gKiBiZSByZS1wYXJlbnRlZCAoYSBkZXBsb3ltZW50IGlkIGFwcGVhcmluZyBhZnRlciBib290KS4gS2V5cyB0aGF0IHJlc29sdmUgdG9cbiAqIG5vdGhpbmcgYXJlIG9taXR0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBpbmNsdWRlZDogcHVibGljL2NsaWVudCBJUCwgcHJvY2VzcyBpZCwgQ1BVIGFyY2hpdGVjdHVyZSxcbiAqIHJ1bnRpbWUgbmFtZSwgYW5kIHJ1bnRpbWUgdmVyc2lvbi4gSVBzIGFuZCBwaWRzIGFyZSBub2lzeSwgb2Z0ZW4gc2Vuc2l0aXZlLFxuICogYW5kIGJ1cm4gYE5PVElGWWAgcGF5bG9hZCBidWRnZXQ7IGFyY2hpdGVjdHVyZS9ydW50aW1lIGFyZSBjb25zdGFudCBwZXJcbiAqIGRlcGxveW1lbnQgYW5kIHBheSB0aGUgc2FtZSBjb3N0LiBBIHByb2Nlc3MgdGhhdCB3YW50cyBhbnkgb2YgdGhlbSBwYXNzZXMgYVxuICoge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gb3IgcGVyLW1lc3NhZ2UgYG1ldGFkYXRhYC5cbiAqL1xuZnVuY3Rpb24gbWFjaGluZU1ldGFkYXRhKCk6IFRvcGljTWV0YWRhdGEge1xuICByZXR1cm4gZGVmaW5lZE1ldGFkYXRhKHtcbiAgICBwcm9qZWN0OlxuICAgICAgc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShbXG4gICAgICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQlVORExFX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSxcbiAgICAgICAgcHJvY2Vzcy5lbnYubnBtX3BhY2thZ2VfbmFtZSxcbiAgICAgIF0pID8/IHVuZGVmaW5lZCxcbiAgICBob3N0bmFtZTogaG9zdG5hbWUoKSxcbiAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICBlbnZpcm9ubWVudDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudi5OT0RFX0VOVikgPz8gdW5kZWZpbmVkLFxuICAgIGFwcE5hbWU6IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfTkFNRSkgPz8gdW5kZWZpbmVkLFxuICAgIGRlcGxveW1lbnRJZDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0FQUF9ERVBMT1lNRU5UX0lEKSA/PyB1bmRlZmluZWQsXG4gICAgZGF0YWJyaWNrc0hvc3Q6IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUKSA/PyB1bmRlZmluZWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIElkZW50aXR5IG9mIHRoZSBzaWduZWQtaW4gdXNlciBvbiB3aG9zZSBiZWhhbGYgdGhpcyBicm9hZGNhc3QgaGFwcGVucywgd2hlbiB0aGVcbiAqIHByb2Nlc3MgY2FuIHRlbGwuXG4gKlxuICogYEBkYXRhYnJpY2tzL2FwcGtpdGAgaXMgYW4gT1BUSU9OQUwgcGVlciwgc28gdGhlIGltcG9ydCBpcyBsYXp5IGFuZCBhIG1pc3NpbmdcbiAqIG1vZHVsZSBpcyBub3QgYW4gZXJyb3IgLSB0aGlzIGlzIGEgcGxhaW4gUG9zdGdyZXMgcGFja2FnZSB0aGF0IGFkZHMgc2VuZGVyXG4gKiBpZGVudGl0eSB3aGVuIGl0IGhhcHBlbnMgdG8gcnVuIGluc2lkZSBhbiBBcHBLaXQgYXBwLiBPdXRzaWRlIGFuIGFjdGl2ZVxuICogcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgQXBwS2l0IHRocm93cywgd2hpY2ggbWVhbnMgXCJubyB1c2VyIGhlcmVcIiwgc28gdGhlXG4gKiByZXN1bHQgaXMgZW1wdHkgbWV0YWRhdGEgcmF0aGVyIHRoYW4gYSBmYWlsZWQgYnJvYWRjYXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzZW5kZXJNZXRhZGF0YSgpOiBQcm9taXNlPFRvcGljTWV0YWRhdGE+IHtcbiAgYXBwS2l0TW9kdWxlID8/PSBpbXBvcnQoXCJAZGF0YWJyaWNrcy9hcHBraXRcIilcbiAgICAudGhlbigobW9kdWxlKSA9PiBtb2R1bGUgYXMgQXBwS2l0TW9kdWxlKVxuICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICBjb25zdCBhcHBraXQgPSBhd2FpdCBhcHBLaXRNb2R1bGU7XG4gIGlmICghYXBwa2l0KSByZXR1cm4ge307XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IGFwcGtpdC5nZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgcmV0dXJuIGRlZmluZWRNZXRhZGF0YSh7XG4gICAgICBzZW5kZXJJZDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0LnVzZXJJZCkgPz8gdW5kZWZpbmVkLFxuICAgICAgc2VuZGVyTmFtZTogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0LnVzZXJOYW1lKSA/PyB1bmRlZmluZWQsXG4gICAgICBzZW5kZXJFbWFpbDogc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0LnVzZXJFbWFpbCkgPz8gdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhIGBOT1RJRllgIHBheWxvYWQgaW50byBhbiBlbnZlbG9wZSwgcmV0dXJuaW5nIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogdGhhdCBpcyBub3Qgb25lLlxuICpcbiAqIFRoZSBjaGFubmVsIGlzIHNoYXJlZCBhbmQgYW55IFBvc3RncmVzIHNlc3Npb24gY2FuIGBwZ19ub3RpZnlgIG9uIGl0LCBzbyBhblxuICogdW5yZWNvZ25pemVkIHBheWxvYWQgaXMgZXhwZWN0ZWQgaW5wdXQsIG5vdCBhbiBleGNlcHRpb24uIFB1Ymxpc2hlcnMgcnVuIHRoaXNcbiAqIG92ZXIgdGhlaXIgb3duIGVuY29kZWQgbWVzc2FnZSB0b28sIHdoaWNoIGlzIGhvdyBhIGJvZHkgdGhhdCBzdHJpbmdpZmllcyBidXRcbiAqIGRvZXMgbm90IHJvdW5kLXRyaXAgaXMgY2F1Z2h0IGJlZm9yZSBpdCBzaGlwcy5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUb3BpY01lc3NhZ2UgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZWNvcmQgPSBqc29uLnBhcnNlUmVjb3JkKHZhbHVlKTtcbiAgaWYgKFxuICAgICFyZWNvcmQgfHxcbiAgICB0eXBlb2YgcmVjb3JkLmlkICE9PSBcInN0cmluZ1wiIHx8XG4gICAgdHlwZW9mIHJlY29yZC50b3BpYyAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQudHlwZSAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQucHVibGlzaGVkQXQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAhcmVjb3JkLm1ldGFkYXRhIHx8XG4gICAgdHlwZW9mIHJlY29yZC5tZXRhZGF0YSAhPT0gXCJvYmplY3RcIiB8fFxuICAgIEFycmF5LmlzQXJyYXkocmVjb3JkLm1ldGFkYXRhKSB8fFxuICAgICEoXCJib2R5XCIgaW4gcmVjb3JkKSB8fFxuICAgICFvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZShyZWNvcmQubWV0YWRhdGEpIHx8XG4gICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKHJlY29yZC5ib2R5KVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7XG4gICAgaWQ6IHJlY29yZC5pZCxcbiAgICB0b3BpYzogcmVjb3JkLnRvcGljLFxuICAgIHR5cGU6IHJlY29yZC50eXBlLFxuICAgIG1ldGFkYXRhOiByZWNvcmQubWV0YWRhdGEgYXMgVG9waWNNZXRhZGF0YSxcbiAgICBib2R5OiByZWNvcmQuYm9keSBhcyBTZXJpYWxpemFibGVWYWx1ZSxcbiAgICBwdWJsaXNoZWRBdDogcmVjb3JkLnB1Ymxpc2hlZEF0LFxuICB9O1xufVxuXG4vKipcbiAqIEJyb2FkY2FzdHMgc3RydWN0dXJlZCBtZXNzYWdlcyBieSB0b3BpYyBhbmQgZGVsaXZlcnMgdGhlbSB0byBldmVyeSBwcm9jZXNzXG4gKiBsaXN0ZW5pbmcgb24gdGhlIHNhbWUgY2hhbm5lbC5cbiAqXG4gKiBDT05ORUNUSU9OIFNIQVBFLiBQdWJsaXNoaW5nIGJvcnJvd3MgYSBwb29sZWQgY29ubmVjdGlvbiBwZXIgY2FsbCwgbGlrZSBhbnlcbiAqIG90aGVyIHF1ZXJ5LiBMaXN0ZW5pbmcgY2Fubm90OiBgTElTVEVOYCBpcyBzZXNzaW9uIHN0YXRlLCBzbyB0aGUgYnVzIGhvbGRzIE9ORVxuICogZGVkaWNhdGVkIGNsaWVudCBvdXQgb2YgdGhlIHBvb2wgZm9yIGFzIGxvbmcgYXMgaXQgaGFzIHN1YnNjcmliZXJzLCBubyBtYXR0ZXJcbiAqIGhvdyBtYW55IHRvcGljcyBvciBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuIFNpemUgdGhlIHBvb2wgd2l0aCB0aGF0IG9uZVxuICogbG9uZy1saXZlZCBjaGVja291dCBpbiBtaW5kLlxuICpcbiAqIExJRkVDWUNMRS4gQ29uc3RydWN0aW9uIGlzIGluZXJ0IC0gbm90aGluZyBjb25uZWN0cyB1bnRpbCB0aGUgZmlyc3RcbiAqIHtAbGluayBsaXN0ZW59IChvciBhbiBleHBsaWNpdCB7QGxpbmsgc3RhcnR9KS4ge0BsaW5rIGNsb3NlfSBpcyByZXF1aXJlZCB0byBnaXZlXG4gKiB0aGUgY29ubmVjdGlvbiBiYWNrOyBhIGNsb3NlZCBidXMgc3RheXMgY2xvc2VkIGFuZCB0aHJvd3Mgb24gZnVydGhlciB1c2UgcmF0aGVyXG4gKiB0aGFuIHNpbGVudGx5IHJlY29ubmVjdGluZy4gUmVnaXN0ZXIgaXQgd2l0aCB0aGUgaG9zdCdzIHNodXRkb3duIGhvb2suXG4gKlxuICogRkFJTFVSRSBIQU5ETElORy4gQSBsb3N0IG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIHJlY29ubmVjdHMgb24gaXRzIG93biB3aXRoXG4gKiBib3VuZGVkIGJhY2tvZmYgd2hpbGUgc3Vic2NyaWJlcnMgcmVtYWluLCByZXBvcnRpbmcgZWFjaCBmYWlsZWQgYXR0ZW1wdCB0aHJvdWdoXG4gKiBgb25FcnJvcmAuIE1lc3NhZ2VzIHB1Ymxpc2hlZCBkdXJpbmcgdGhlIGdhcCBhcmUgbG9zdCAtIGBOT1RJRllgIGhhcyBubyByZXBsYXkuXG4gKiBBIHRocm93aW5nIG9yIHJlamVjdGluZyBsaXN0ZW5lciBuZXZlciBhZmZlY3RzIHRoZSBwdWJsaXNoZXIgb3IgdGhlIG90aGVyXG4gKiBsaXN0ZW5lcnM7IGl0cyBmYWlsdXJlIGdvZXMgdG8gYG9uRXJyb3JgLlxuICpcbiAqIE5vdCBzYWZlIHRvIHNoYXJlIG9uZSBpbnN0YW5jZSBhY3Jvc3MgdW5yZWxhdGVkIGNoYW5uZWxzIC0gY29uc3RydWN0IG9uZSBidXNcbiAqIHBlciBjaGFubmVsLiBUaGUgY2hhbm5lbCBpdHNlbGYgaXMgREVSSVZFRCBmcm9tIHRoZSBgY2hhbm5lbGAgb3B0aW9uIHJhdGhlclxuICogdGhhbiB0YWtlbiBsaXRlcmFsbHk7IHNlZSB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMuY2hhbm5lbH0gYW5kXG4gKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0Z3Jlc1RvcGljQnVzIHtcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBQb3N0Z3JlcyBjaGFubmVsIHRoaXMgYnVzIGxpc3RlbnMgYW5kIHB1Ymxpc2hlcyBvbiwgZGVyaXZlZCBmcm9tXG4gICAqIHRoZSBgY2hhbm5lbGAgb3B0aW9uLiBSZWFkIGl0IHRvIGNvbmZpcm0gdHdvIHByb2Nlc3NlcyBhZ3JlZSwgb3IgdG8gbG9nIHdoYXQgYVxuICAgKiBzZXQgb2YgcGFydHMgYWN0dWFsbHkgcmVzb2x2ZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRXJyb3I6IChjYXVzZTogdW5rbm93bikgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PFRvcGljTGlzdGVuZXI+PigpO1xuICBwcml2YXRlIGNsaWVudDogUG9vbENsaWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdGFydGluZzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWNvbm5lY3Rpbmc6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb25uZWN0QWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc2lzdGVuY2U/OiBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zO1xuICBwcml2YXRlIHByb3Zpc2lvbmluZz86IFByb21pc2U8dm9pZD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb29sOiBQZ1Bvb2xMaWtlICYgUGdRdWVyeWFibGUsXG4gICAgb3B0aW9uczogUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lKFxuICAgICAgb3B0aW9ucy5jaGFubmVsID09PSB1bmRlZmluZWQgPyBERUZBVUxUX0NIQU5ORUwgOiBvcHRpb25zLmNoYW5uZWwsXG4gICAgKTtcbiAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICB0aGlzLm9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3IgPz8gKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZSA9IG9wdGlvbnMucGVyc2lzdFxuICAgICAgPyByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zKG9wdGlvbnMucGVyc2lzdCA9PT0gdHJ1ZSA/IHRydWUgOiBvcHRpb25zLnBlcnNpc3QpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBkZWRpY2F0ZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gYW5kIGBMSVNURU5gLlxuICAgKlxuICAgKiBJZGVtcG90ZW50LCBhbmQgc2FmZSB0byBjYWxsIGNvbmN1cnJlbnRseSAtIG92ZXJsYXBwaW5nIGNhbGxzIGF3YWl0IHRoZSBzYW1lXG4gICAqIGluLWZsaWdodCBjb25uZWN0LiB7QGxpbmsgbGlzdGVufSBjYWxscyB0aGlzLCBzbyBpdCBpcyBvbmx5IG5lZWRlZCB0byBzdXJmYWNlXG4gICAqIGEgY29ubmVjdGlvbiBwcm9ibGVtIGF0IHN0YXJ0dXAgcmF0aGVyIHRoYW4gb24gZmlyc3Qgc3Vic2NyaWJlLiBUaHJvd3MgaWYgdGhlXG4gICAqIGJ1cyBpcyBjbG9zZWQsIG9yIGlmIHRoZSBwb29sIGNhbm5vdCBoYW5kIG91dCBhIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbGllbnQpIHJldHVybjtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgdGhpcy5zdGFydGluZyA/Pz0gdGhpcy5jb25uZWN0KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0aW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIG1lc3NhZ2UgdG8gYHRvcGljYCwgcmV0dXJuaW5nIHRoZSBlbnZlbG9wZSB0aGF0IHdhcyBzZW50LlxuICAgKlxuICAgKiBSZXNvbHZlcyBvbmNlIFBvc3RncmVzIGhhcyBhY2NlcHRlZCB0aGUgYE5PVElGWWAsIHdoaWNoIHNheXMgbm90aGluZyBhYm91dFxuICAgKiBhbnlvbmUgcmVjZWl2aW5nIGl0OiBzZXNzaW9ucyBub3QgbGlzdGVuaW5nIGF0IHRoYXQgbW9tZW50IG1pc3MgaXQuIFB1Ymxpc2hpbmdcbiAgICogbmVlZHMgbm8ge0BsaW5rIHN0YXJ0fSBhbmQgbm8gc3Vic2NyaWJlcnMuXG4gICAqXG4gICAqIFZhbGlkYXRpb24gaXMgZGVsaWJlcmF0ZWx5IGZyb250LWxvYWRlZCwgc2luY2UgYSBtZXNzYWdlIHRoYXQgZmFpbHMgb24gdGhlXG4gICAqIHdpcmUgaXMgZmFyIGhhcmRlciB0byBkaWFnbm9zZSB0aGFuIG9uZSByZWplY3RlZCBhdCB0aGUgY2FsbDogYFR5cGVFcnJvcmAgZm9yIGFcbiAgICogYmxhbmsgdG9waWMgb3IgdHlwZSwgb3IgYSBib2R5L21ldGFkYXRhIHRoYXQgd291bGQgbm90IHJvdW5kLXRyaXAgdGhyb3VnaCBKU09OXG4gICAqIHVuY2hhbmdlZCAoYG9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlYCk7IGBSYW5nZUVycm9yYCB3aGVuIHRoZSBlbmNvZGVkXG4gICAqIGVudmVsb3BlIGV4Y2VlZHMgdGhlIGBOT1RJRllgIHBheWxvYWQgbGltaXQsIHdoaWNoIHRoZSBhdXRvbWF0aWMgbWV0YWRhdGFcbiAgICogY291bnRzIGFnYWluc3QgLSBzZW5kIGEgcmVmZXJlbmNlIGFuZCBsZXQgdGhlIHJlY2VpdmVyIGZldGNoIHRoZSBwYXlsb2FkLlxuICAgKiBUaHJvd3MgaWYgdGhlIGJ1cyBpcyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBicm9hZGNhc3Q8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBpbnB1dDogVG9waWNQdWJsaXNoSW5wdXQ8VEJvZHk+LFxuICApOiBQcm9taXNlPFRvcGljTWVzc2FnZTxUQm9keT4+IHtcbiAgICBpZiAoIXRvcGljLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvcGljIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIGlmICghaW5wdXQudHlwZS50cmltKCkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXNzYWdlIHR5cGUgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgaWYgKFxuICAgICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKGlucHV0Lm1ldGFkYXRhID8/IHt9KSB8fFxuICAgICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKGlucHV0LmJvZHkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSBtZXRhZGF0YSBhbmQgYm9keSBtdXN0IGJlIEpTT04gc2VyaWFsaXphYmxlIHdpdGhvdXQgY29lcmNpb25cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKTtcbiAgICBjb25zdCBhdXRvbWF0aWMgPSBhd2FpdCB0aGlzLnJlc29sdmVNZXRhZGF0YSgpO1xuICAgIGNvbnN0IG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4gPSB7XG4gICAgICBpZDogaGFzaC5pZCgpLFxuICAgICAgdG9waWMsXG4gICAgICB0eXBlOiBpbnB1dC50eXBlLFxuICAgICAgbWV0YWRhdGE6IHsgLi4uYXV0b21hdGljLCAuLi5pbnB1dC5tZXRhZGF0YSB9LFxuICAgICAgYm9keTogaW5wdXQuYm9keSxcbiAgICAgIHB1Ymxpc2hlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgICBsZXQgZW5jb2RlZDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBlbmNvZGVkID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE1lc3NhZ2UgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZTogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVzZSl9YCk7XG4gICAgfVxuICAgIGlmICghZGVjb2RlKGVuY29kZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSB0eXBlLCBtZXRhZGF0YSwgYW5kIGJvZHkgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZVwiKTtcbiAgICB9XG4gICAgLy8gT25seSB0aGUgZW52ZWxvcGUgcGF5bG9hZCBpcyBib3VuZGVkIGJ5IHRoZSBgTk9USUZZYCBsaW1pdC4gQSBwb2ludGVyXG4gICAgLy8gbm90aWZpY2F0aW9uIGlzIGEgZml4ZWQgaGFuZGZ1bCBvZiBieXRlcywgc28gcGVyc2lzdGVuY2Ugd2l0aFxuICAgIC8vIGBwYXlsb2FkOiBcInBvaW50ZXJcImAgbGlmdHMgdGhlIGNhcCBlbnRpcmVseS5cbiAgICBpZiAoXG4gICAgICBCdWZmZXIuYnl0ZUxlbmd0aChlbmNvZGVkLCBcInV0ZjhcIikgPiBNQVhfTk9USUZZX0JZVEVTICYmXG4gICAgICB0aGlzLnBlcnNpc3RlbmNlPy5wYXlsb2FkICE9PSBcInBvaW50ZXJcIlxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBvc3RncmVzIG5vdGlmaWNhdGlvbiBleGNlZWRzICR7TUFYX05PVElGWV9CWVRFU30gYnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnBvb2wucXVlcnkoXCJTRUxFQ1QgcGdfbm90aWZ5KCQxLCAkMilcIiwgW3RoaXMuY2hhbm5lbE5hbWUsIGVuY29kZWRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucGVyc2lzdGVuY2UucHJvdmlzaW9uKSB7XG4gICAgICAgIHRoaXMucHJvdmlzaW9uaW5nID8/PSBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hKHRoaXMucG9vbCwgdGhpcy5wZXJzaXN0ZW5jZSk7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvdmlzaW9uaW5nO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkJFR0lOXCIpO1xuICAgICAgICBhd2FpdCBwZXJzaXN0ZWROb3RpZnkoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHRoaXMuY2hhbm5lbE5hbWUsXG4gICAgICAgICAgdG9waWMsXG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICBlbmNvZGVkLFxuICAgICAgICAgIHRoaXMucGVyc2lzdGVuY2UsXG4gICAgICAgICAgaW5wdXQuc2NvcGUgPz8gdGhpcy5wZXJzaXN0ZW5jZS5zY29wZSxcbiAgICAgICAgICBpbnB1dC50dGwgPz8gdGhpcy5wZXJzaXN0ZW5jZS50dGwsXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIkNPTU1JVFwiKTtcbiAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlJPTExCQUNLXCIpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIHRocm93IGNhdXNlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY2xpZW50LnJlbGVhc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBhc3luYyBoaXN0b3J5PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWU+KFxuICAgIHRvcGljOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBhZnRlcj86IHN0cmluZzsgbGltaXQ/OiBudW1iZXI7IHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxUb3BpY0hpc3RvcnlQYWdlPFRCb2R5Pj4ge1xuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZSkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIHBlcnNpc3RlbmNlIGlzIGRpc2FibGVkXCIpO1xuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlLnByb3Zpc2lvbikge1xuICAgICAgdGhpcy5wcm92aXNpb25pbmcgPz89IHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEodGhpcy5wb29sLCB0aGlzLnBlcnNpc3RlbmNlKTtcbiAgICAgIGF3YWl0IHRoaXMucHJvdmlzaW9uaW5nO1xuICAgIH1cbiAgICByZXR1cm4gaGlzdG9yeTxUQm9keT4odGhpcy5wb29sLCB0aGlzLmNoYW5uZWxOYW1lLCB0b3BpYywgdGhpcy5wZXJzaXN0ZW5jZSwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwRXhwaXJlZChcbiAgICBvcHRpb25zOiB7IHNjb3BlPzogVG9waWNQZXJzaXN0ZW5jZVNjb3BlOyBsaW1pdD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcIik7XG4gICAgcmV0dXJuIGNsZWFudXBFeHBpcmVkKFxuICAgICAgdGhpcy5wb29sLFxuICAgICAgdGhpcy5wZXJzaXN0ZW5jZSxcbiAgICAgIG9wdGlvbnMuc2NvcGUgPz8gdGhpcy5wZXJzaXN0ZW5jZS5zY29wZSxcbiAgICAgIG9wdGlvbnMubGltaXQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYHRvcGljYCwgcmV0dXJuaW5nIHRoZSBmdW5jdGlvbiB0aGF0IHVuc3Vic2NyaWJlcy5cbiAgICpcbiAgICogQ29ubmVjdHMgb24gZmlyc3QgdXNlLiBTZXZlcmFsIGxpc3RlbmVycyBtYXkgc2hhcmUgYSB0b3BpYzsgZWFjaCBpcyBjYWxsZWRcbiAgICogb25jZSBwZXIgbWVzc2FnZS4gT25seSBtZXNzYWdlcyBwdWJsaXNoZWQgQUZURVIgdGhpcyByZXNvbHZlcyBhcnJpdmUsIHNvXG4gICAqIHN1YnNjcmliZSBiZWZvcmUgdHJpZ2dlcmluZyB3aGF0ZXZlciB5b3UgZXhwZWN0IHRvIG9ic2VydmUuXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiByZW1vdmVzIGp1c3QgdGhpcyBsaXN0ZW5lciBhbmQgaXMgc2FmZSB0byBjYWxsIHR3aWNlLlxuICAgKiBUaGUgY29ubmVjdGlvbiBzdGF5cyBvcGVuIG9uY2UgdGhlIGxhc3QgbGlzdGVuZXIgbGVhdmVzIC0ge0BsaW5rIGNsb3NlfVxuICAgKiByZWxlYXNlcyBpdCAtIHNvIGEgYnVzIHRoYXQgc3Vic2NyaWJlcyBhbmQgdW5zdWJzY3JpYmVzIHBlciByZXF1ZXN0IGRvZXMgbm90XG4gICAqIGNodXJuIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgYXN5bmMgbGlzdGVuPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWU+KFxuICAgIHRvcGljOiBzdHJpbmcsXG4gICAgbGlzdGVuZXI6IFRvcGljTGlzdGVuZXI8VEJvZHk+LFxuICApOiBQcm9taXNlPCgpID0+IFByb21pc2U8dm9pZD4+IHtcbiAgICBpZiAoIXRvcGljLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRvcGljIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5nZXQodG9waWMpID8/IG5ldyBTZXQ8VG9waWNMaXN0ZW5lcj4oKTtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyIGFzIFRvcGljTGlzdGVuZXIpO1xuICAgIHRoaXMubGlzdGVuZXJzLnNldCh0b3BpYywgbGlzdGVuZXJzKTtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lciBhcyBUb3BpY0xpc3RlbmVyKTtcbiAgICAgIGlmIChsaXN0ZW5lcnMuc2l6ZSA9PT0gMCkgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKHRvcGljKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBhdXRvbWF0aWMgaGFsZiBvZiBhIG1lc3NhZ2UncyBtZXRhZGF0YS5cbiAgICpcbiAgICogUHJlY2VkZW5jZSwgd2Vha2VzdCBmaXJzdDogbWFjaGluZS9wcm9jZXNzIGNvbnRleHQsIHRoZW4gQXBwS2l0IHNlbmRlclxuICAgKiBpZGVudGl0eSwgdGhlbiB0aGlzIGJ1cydzIGNvbmZpZ3VyZWQgbWV0YWRhdGEuIFRoZSBjYWxsZXIncyBwZXItbWVzc2FnZVxuICAgKiBtZXRhZGF0YSBpcyBsYXllcmVkIG92ZXIgdGhlIHJlc3VsdCBpbiB7QGxpbmsgYnJvYWRjYXN0fSwgc28gdGhlIG1vc3Qgc3BlY2lmaWNcbiAgICogc291cmNlIGFsd2F5cyB3aW5zIGFuZCBub3RoaW5nIGhlcmUgY2FuIG92ZXJ3cml0ZSBhbiBleHBsaWNpdCBrZXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVNZXRhZGF0YSgpOiBQcm9taXNlPFRvcGljTWV0YWRhdGE+IHtcbiAgICBjb25zdCBzZW5kZXIgPSBhd2FpdCBzZW5kZXJNZXRhZGF0YSgpO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWQgPVxuICAgICAgdHlwZW9mIHRoaXMubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IHRoaXMubWV0YWRhdGEoKSA6ICh0aGlzLm1ldGFkYXRhID8/IHt9KTtcbiAgICByZXR1cm4geyAuLi5tYWNoaW5lTWV0YWRhdGEoKSwgLi4uc2VuZGVyLCAuLi5jb25maWd1cmVkIH07XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gYW5kIHN0b3AgZGVsaXZlcmluZyBtZXNzYWdlcy4gSWRlbXBvdGVudC5cbiAgICpcbiAgICogQ2FuY2VscyBhbnkgcGVuZGluZyByZWNvbm5lY3QsIGRyb3BzIGFsbCBsaXN0ZW5lcnMsIHRoZW4gYFVOTElTVEVOYHMgYW5kXG4gICAqIHJldHVybnMgdGhlIGNsaWVudCB0byB0aGUgcG9vbC4gQSBmYWlsZWQgYFVOTElTVEVOYCBpcyByZXBvcnRlZCB0byB0aGUgcG9vbCBhc1xuICAgKiBhIHJlbGVhc2UgZXJyb3Igc28gdGhlIGNvbm5lY3Rpb24gaXMgRElTQ0FSREVEIHJhdGhlciB0aGFuIGhhbmRlZCB0byB0aGUgbmV4dFxuICAgKiBjYWxsZXIgc3RpbGwgc3Vic2NyaWJlZCB0byB0aGUgY2hhbm5lbC4gRG9lcyBub3QgdGhyb3c7IHRoZSBidXMgc3RheXMgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjb25uZWN0QWJvcnQuYWJvcnQobmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKSk7XG4gICAgYXdhaXQgdGhpcy5zdGFydGluZz8uY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBhd2FpdCB0aGlzLnJlY29ubmVjdGluZz8uY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICB0aGlzLmNsaWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxpc3RlbmVycy5jbGVhcigpO1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICBsZXQgcmVsZWFzZUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBVTkxJU1RFTiAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHRoaXMuY2hhbm5lbE5hbWUpfWApO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICByZWxlYXNlRXJyb3IgPSBlcnJvclV0aWxzLnRvRXJyb3IoY2F1c2UpO1xuICAgIH1cbiAgICBjbGllbnQucmVsZWFzZShyZWxlYXNlRXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIG91dCBvbmUgY2xpZW50LCBhdHRhY2ggdGhlIGhhbmRsZXJzLCBhbmQgYExJU1RFTmAuXG4gICAqXG4gICAqIFRoZSBoYW5kbGVycyBhcmUgYXR0YWNoZWQgQkVGT1JFIHRoZSBgTElTVEVOYCByb3VuZCB0cmlwIHNvIGEgbm90aWZpY2F0aW9uIG9yXG4gICAqIGVycm9yIGFycml2aW5nIG1pZC1zZXR1cCBpcyBub3QgbWlzc2VkLiBBbnkgZmFpbHVyZSAtIGluY2x1ZGluZyB0aGUgYnVzIGJlaW5nXG4gICAqIGNsb3NlZCB3aGlsZSB0aGUgY29ubmVjdCB3YXMgaW4gZmxpZ2h0IC0gZGV0YWNoZXMgdGhlIGhhbmRsZXJzIGFuZCByZWxlYXNlc1xuICAgKiB0aGUgY2xpZW50IGFzIGVycm9yZWQsIHNvIGEgaGFsZi1jb25maWd1cmVkIGNvbm5lY3Rpb24gbmV2ZXIgcmV0dXJucyB0byB0aGVcbiAgICogcG9vbC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLnBvb2wuY29ubmVjdCgpO1xuICAgIHRyeSB7XG4gICAgICBjbGllbnQub24oXCJub3RpZmljYXRpb25cIiwgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24pO1xuICAgICAgY2xpZW50Lm9uKFwiZXJyb3JcIiwgdGhpcy5oYW5kbGVDbGllbnRFcnJvcik7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYExJU1RFTiAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHRoaXMuY2hhbm5lbE5hbWUpfWApO1xuICAgICAgaWYgKHRoaXMuY2xvc2VkKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpO1xuICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcIm5vdGlmaWNhdGlvblwiLCB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbik7XG4gICAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICAgIGNsaWVudC5yZWxlYXNlKGVycm9yVXRpbHMudG9FcnJvcihjYXVzZSkpO1xuICAgICAgdGhyb3cgY2F1c2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIG9uZSBpbmJvdW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgdG9waWMncyBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIElnbm9yZXMgb3RoZXIgY2hhbm5lbHMgYW5kIHVuZGVjb2RhYmxlIHBheWxvYWRzIC0gdGhlIGNoYW5uZWwgaXMgc2hhcmVkLCBzb1xuICAgKiBib3RoIGFyZSBvcmRpbmFyeSB0cmFmZmljLiBMaXN0ZW5lcnMgYXJlIGludm9rZWQgY29uY3VycmVudGx5IGFuZCB0aGVpclxuICAgKiByZWplY3Rpb25zIGdvIHRvIGBvbkVycm9yYCwga2VlcGluZyBvbmUgc2xvdyBvciBicm9rZW4gc3Vic2NyaWJlciBmcm9tXG4gICAqIHN0YWxsaW5nIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5jaGFubmVsICE9PSB0aGlzLmNoYW5uZWxOYW1lKSByZXR1cm47XG4gICAgY29uc3QgbWVzc2FnZSA9IGRlY29kZShub3RpZmljYXRpb24ucGF5bG9hZCk7XG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuZGVsaXZlcihtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYHBheWxvYWQ6IFwicG9pbnRlclwiYCBjYXJyaWVzIG9ubHkgcm91dGluZyBhbmQgaWRlbnRpdHksIHNvIHRoZSBlbnZlbG9wZSBoYXNcbiAgICAvLyB0byBiZSByZWFkIGJhY2sgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBkZWxpdmVyZWQuIE9ubHkgYXR0ZW1wdGVkIHdoZW4gdGhpc1xuICAgIC8vIGJ1cyBpcyBjb25maWd1cmVkIGZvciBwZXJzaXN0ZW5jZTsgb3RoZXJ3aXNlIHRoZSBwYXlsb2FkIGlzIGZvcmVpZ24gdHJhZmZpY1xuICAgIC8vIG9uIGEgc2hhcmVkIGNoYW5uZWwgYW5kIGlnbm9yZWQgYXMgYmVmb3JlLlxuICAgIGNvbnN0IHBvaW50ZXIgPSB0aGlzLnBlcnNpc3RlbmNlID8gZGVjb2RlUG9pbnRlcihub3RpZmljYXRpb24ucGF5bG9hZCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb2ludGVyKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMocG9pbnRlci50b3BpYykpIHJldHVybjtcbiAgICByZWFkUG9pbnRlcih0aGlzLnBvb2wsIHRoaXMuY2hhbm5lbE5hbWUsIHBvaW50ZXIsIHRoaXMucGVyc2lzdGVuY2UhKVxuICAgICAgLnRoZW4oKHN0b3JlZCkgPT4ge1xuICAgICAgICBpZiAoc3RvcmVkKSB0aGlzLmRlbGl2ZXIoc3RvcmVkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICAvKiogSGFuZCBvbmUgZGVjb2RlZCBtZXNzYWdlIHRvIHRoZSB0b3BpYydzIGxpc3RlbmVycy4gKi9cbiAgcHJpdmF0ZSBkZWxpdmVyKG1lc3NhZ2U6IFRvcGljTWVzc2FnZSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMuZ2V0KG1lc3NhZ2UudG9waWMpID8/IFtdKSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUobGlzdGVuZXIobWVzc2FnZSkpLmNhdGNoKHRoaXMub25FcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gZHlpbmcsIHdoaWNoIGBwZ2AgcmVwb3J0cyBhcyBhbiBgZXJyb3JgXG4gICAqIGV2ZW50IHJhdGhlciB0aGFuIGEgcmVqZWN0ZWQgcXVlcnkuXG4gICAqXG4gICAqIFRoZSBjbGllbnQgaXMgdW51c2FibGUgYXQgdGhpcyBwb2ludCwgc28gaXQgaXMgZGV0YWNoZWQgYW5kIHJlbGVhc2VkIGFzXG4gICAqIGVycm9yZWQgKHdoaWNoIGRpc2NhcmRzIGl0KSBiZWZvcmUgYW55dGhpbmcgZWxzZS4gUmVjb25uZWN0aW9uIG9ubHkgc3RhcnRzXG4gICAqIHdoZW4gdGhlcmUgaXMgc3RpbGwgc29tZW9uZSB0byBkZWxpdmVyIHRvLCBzbyBhbiBpZGxlIG9yIGNsb3NpbmcgYnVzIGRvZXMgbm90XG4gICAqIGhvbGQgYSBjb25uZWN0aW9uIG9wZW4gY2hhc2luZyBhIGNoYW5uZWwgbm9ib2R5IHJlYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDbGllbnRFcnJvciA9IChjYXVzZTogRXJyb3IpOiB2b2lkID0+IHtcbiAgICB0aGlzLm9uRXJyb3IoY2F1c2UpO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgdGhpcy5jbGllbnQgPSB1bmRlZmluZWQ7XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICBjbGllbnQucmVsZWFzZShjYXVzZSk7XG4gICAgaWYgKHRoaXMuY2xvc2VkIHx8IHRoaXMubGlzdGVuZXJzLnNpemUgPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlY29ubmVjdGluZyA/Pz0gdGhpcy5yZWNvbm5lY3QoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25uZWN0aW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZS1lc3RhYmxpc2ggdGhlIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIHdpdGggYm91bmRlZCBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgKlxuICAgKiBUaGUgZmlyc3QgYXR0ZW1wdCBpcyBpbW1lZGlhdGUsIHNpbmNlIHRoZSBjb21tb24gY2FzZSBpcyBhIHNpbmdsZSBkcm9wcGVkXG4gICAqIGNvbm5lY3Rpb24gdGhhdCByZWNvbm5lY3RzIGF0IG9uY2U7IHN1YnNlcXVlbnQgZGVsYXlzIGRvdWJsZSBmcm9tIDI1MG1zIHVwIHRvXG4gICAqIDVzIGFuZCBzdGF5IHRoZXJlLiBSZXRyaWVzIGluZGVmaW5pdGVseSByYXRoZXIgdGhhbiBnaXZpbmcgdXAsIGJlY2F1c2UgYSBQb3N0Z3JlcyByZXN0YXJ0XG4gICAqIG9yIGEgcm90YXRlZCBMYWtlYmFzZSBjcmVkZW50aWFsIGlzIGEgcmVjb3ZlcmFibGUgb3V0YWdlIGFuZCBhIHNpbGVudGx5IGRlYWRcbiAgICogbGlzdGVuZXIgaXMgd29yc2UgdGhhbiBhIG5vaXN5IG9uZS4gU3RvcHMgd2hlbiB0aGUgYnVzIGNsb3NlcyBvciB0aGUgbGFzdFxuICAgKiBsaXN0ZW5lciBsZWF2ZXMsIGFuZCByZXBvcnRzIGV2ZXJ5IGZhaWxlZCBhdHRlbXB0IHRocm91Z2ggYG9uRXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGRlbGF5ID0gMDtcbiAgICB3aGlsZSAoIXRoaXMuY2xvc2VkICYmIHRoaXMubGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYXN5bmNVdGlscy5zbGVlcChkZWxheSwgdGhpcy5yZWNvbm5lY3RBYm9ydC5zaWduYWwpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47XG4gICAgICAgIHRoaXMub25FcnJvcihjYXVzZSk7XG4gICAgICAgIGRlbGF5ID0gZGVsYXkgPT09IDAgPyBNSU5fUkVDT05ORUNUX0RFTEFZX01TIDogTWF0aC5taW4oZGVsYXkgKiAyLCBNQVhfUkVDT05ORUNUX0RFTEFZX01TKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
502
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvcGljLWJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBRUwsS0FBSyxFQUNMLFlBQVksRUFDWixPQUFPLEVBQ1AsRUFBRSxFQUNGLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLFVBQVUsR0FDWCxNQUFNLHdCQUF3QixDQUFDO0FBSWhDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxhQUFhLEVBQ2IsT0FBTyxFQUNQLGVBQWUsRUFDZix5QkFBeUIsRUFDekIsV0FBVyxFQUNYLHlCQUF5QixHQU0xQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVF2RCxvRUFBb0U7QUFDcEUsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUM7QUFDOUM7Ozs7R0FJRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBQ25DLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0FBa0JyQzs7OztHQUlHO0FBQ0gsSUFBSSxZQUEyRCxDQUFDO0FBZ0hoRTs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsTUFBcUQ7SUFDNUUsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBd0MsRUFBRTtRQUM1RSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztB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QVksR0FBRyxTQUFTLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7O09BU0c7SUFDSyxLQUFLLENBQUMsU0FBUztRQUNyQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLE9BQU87Z0JBQ1QsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25CLE9BQU87WUFDVCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLElBQUksQ0FBQyxNQUFNO29CQUFFLE9BQU87Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BCLEtBQUssR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDN0YsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvcGljIGZhbi1vdXQgb3ZlciBQb3N0Z3JlU1FMIGBMSVNURU5gL2BOT1RJRllgLCBmb3IgdGVsbGluZyBldmVyeSBydW5uaW5nXG4gKiBpbnN0YW5jZSBvZiBhbiBhcHAgdGhhdCBzb21ldGhpbmcgaGFwcGVuZWQuXG4gKlxuICogVGhlIHNpYmxpbmcgYGFkdmlzb3J5LWxvY2tgIG1vZHVsZSBpcyBhYm91dCBtYWtpbmcgc3VyZSBvbmx5IE9ORSBjb25uZWN0aW9uXG4gKiBkb2VzIGEgdGhpbmc7IHRoaXMgb25lIGlzIHRoZSBvcHBvc2l0ZSAtIEVWRVJZIGxpc3RlbmluZyBzZXNzaW9uIGdldHMgZXZlcnlcbiAqIG5vdGlmaWNhdGlvbi4gVGhhdCBtYWtlcyBpdCB0aGUgcmlnaHQgcHJpbWl0aXZlIGZvciBsaXZlIFVJIHVwZGF0ZXNcbiAqIChhbiBTU0Ugc3RyZWFtIHBlciBicm93c2VyIHRhYiwgYSBjYWNoZSBpbnZhbGlkYXRpb24sIGEgcHJlc2VuY2UgcGluZykgYW5kIHRoZVxuICogd3Jvbmcgb25lIGZvciB3b3JrIGRpc3RyaWJ1dGlvbjogdGhlcmUgYXJlIG5vIGNvbXBldGluZyBjb25zdW1lcnMsIG5vIGFja3MsIGFuZFxuICogbm8gcmVwbGF5LlxuICpcbiAqIERlbGl2ZXJ5IGlzIGJlc3QtZWZmb3J0IGFuZCBsaXZlLiBgTk9USUZZYCByZWFjaGVzIHNlc3Npb25zIHRoYXQgYXJlIGxpc3RlbmluZ1xuICogYXQgdGhlIG1vbWVudCBpdCBjb21taXRzLCBzbyBhIGxpc3RlbmVyIHRoYXQgY29ubmVjdHMgYSBzZWNvbmQgbGF0ZXIgbmV2ZXIgc2Vlc1xuICogaXQsIGFuZCBhIGxpc3RlbmVyIHdob3NlIGNvbm5lY3Rpb24gZHJvcHMgbWlzc2VzIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIGJ1c1xuICogcmVjb25uZWN0cy4gVXNlIGEgdGFibGUgb3IgYSBxdWV1ZSB3aGVuIGEgc3Vic2NyaWJlciBuZWVkcyBkdXJhYmlsaXR5LlxuICpcbiAqIE9ORSBDSEFOTkVMLCBNQU5ZIFRPUElDUy4gRXZlcnkgYnVzIGluc3RhbmNlIGxpc3RlbnMgb24gYSBzaW5nbGUgUG9zdGdyZXNcbiAqIGNoYW5uZWwgKGBjaGFubmVsYCwgZGVmYXVsdCBgZGJ4X3Rvb2xzX3RvcGljX2J1c2ApIGFuZCBmaWx0ZXJzIGJ5IHRoZVxuICogZW52ZWxvcGUncyBgdG9waWNgIGluLXByb2Nlc3MsIHNvIGFkZGluZyBhIHRvcGljIGNvc3RzIG5vIGNvbm5lY3Rpb24gYW5kIG5vXG4gKiBgTElTVEVOYC4gVGhlIHRyYWRlb2ZmIGlzIHRoYXQgZXZlcnkgbGlzdGVuaW5nIHNlc3Npb24gZGVjb2RlcyBldmVyeSBtZXNzYWdlIG9uXG4gKiB0aGUgY2hhbm5lbDsgZ2l2ZSBhIGdlbnVpbmVseSBoaWdoLXZvbHVtZSwgdW5yZWxhdGVkIHN0cmVhbSBpdHMgb3duIGBjaGFubmVsYFxuICogcmF0aGVyIHRoYW4gYSB0b3BpYy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaG9zdG5hbWUgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHtcbiAgb2JqZWN0LFxuICBzbGVlcCxcbiAgZXJyb3JNZXNzYWdlLFxuICB0b0Vycm9yLFxuICBpZCxcbiAgcGFyc2VSZWNvcmQsXG4gIGlzU2VyaWFsaXphYmxlVmFsdWUsXG4gIGZpcnN0Tm9uRW1wdHksXG4gIHRyaW1Ub051bGwsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IE5vdGlmaWNhdGlvbiwgUG9vbENsaWVudCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay50c1wiO1xuaW1wb3J0IHsgY2hhbm5lbE5hbWUgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHtcbiAgY2xlYW51cEV4cGlyZWQsXG4gIGRlY29kZVBvaW50ZXIsXG4gIGhpc3RvcnksXG4gIHBlcnNpc3RlZE5vdGlmeSxcbiAgcHJvdmlzaW9uTWVzc2FnZUJ1c1NjaGVtYSxcbiAgcmVhZFBvaW50ZXIsXG4gIHJlc29sdmVQZXJzaXN0ZW5jZU9wdGlvbnMsXG4gIHR5cGUgRHVyYXRpb25JbnB1dCxcbiAgdHlwZSBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICB0eXBlIFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zLFxuICB0eXBlIFRvcGljSGlzdG9yeVBhZ2UsXG4gIHR5cGUgVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxufSBmcm9tIFwiLi9wZXJzaXN0ZW5jZS50c1wiO1xuaW1wb3J0IHsgcXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIgfSBmcm9tIFwiLi9zZXNzaW9uLnRzXCI7XG5cbi8qKlxuICogYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgIG93bnMgdGhlIEpTT04tcm91bmQtdHJpcCBydWxlOyB0aGlzIGFsaWFzIGp1c3Qga2VlcHMgdGhlXG4gKiBnZW5lcmljIHNpZ25hdHVyZXMgYmVsb3cgcmVhZGFibGUuIENvbnN1bWVycyBpbXBvcnQgdGhlIHR5cGUgZnJvbSBzaGFyZWQtY29yZS5cbiAqL1xudHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZTtcblxuLyoqIENoYW5uZWwgcGFydHMgdXNlZCB3aGVuIGEgY2FsbGVyIG5hbWVzIG5vIGNoYW5uZWwgb2YgaXRzIG93bi4gKi9cbmNvbnN0IERFRkFVTFRfQ0hBTk5FTCA9IFwiZGJ4X3Rvb2xzX3RvcGljX2J1c1wiO1xuLyoqXG4gKiBFbmNvZGVkLWVudmVsb3BlIGNlaWxpbmcuIFBvc3RncmVTUUwgY2FwcyBhIGBOT1RJRllgIHBheWxvYWQgYXQgODAwMCBieXRlcyBhbmRcbiAqIGZhaWxzIHRoZSBzdGF0ZW1lbnQgcGFzdCB0aGF0LCBzbyB0aGUgYnVzIHJlamVjdHMgdGhlIG1lc3NhZ2UgZmlyc3Qgd2l0aCBhIHNpemVcbiAqIGl0IGNhbiBuYW1lLiBUaGUgbWFyZ2luIGJlbG93IDgwMDAgY292ZXJzIHRoZSBzZXJ2ZXIncyBvd24gYWNjb3VudGluZy5cbiAqL1xuY29uc3QgTUFYX05PVElGWV9CWVRFUyA9IDdfOTAwO1xuY29uc3QgTUlOX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDI1MDtcbmNvbnN0IE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMgPSA1XzAwMDtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIEFwcEtpdCdzIHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHRoZSBidXMgcmVhZHMgZm9yIHNlbmRlclxuICogaWRlbnRpdHkuIEZpZWxkcyBhcmUgYHVua25vd25gIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgdmlldyBvZiBhbiBPUFRJT05BTFxuICogcGVlcjogdGhlIHZhbHVlcyBhcmUgdHJpbW1lZCBhbmQgdmFsaWRhdGVkIHJhdGhlciB0aGFuIHRydXN0ZWQuXG4gKi9cbnR5cGUgQXBwS2l0RXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgdXNlckVtYWlsPzogdW5rbm93bjtcbiAgdXNlcklkPzogdW5rbm93bjtcbiAgdXNlck5hbWU/OiB1bmtub3duO1xufTtcblxuLyoqIFN0cnVjdHVyYWwgdmlldyBvZiBgQGRhdGFicmlja3MvYXBwa2l0YCwgaW1wb3J0ZWQgbGF6aWx5IGFuZCBuZXZlciByZXF1aXJlZC4gKi9cbnR5cGUgQXBwS2l0TW9kdWxlID0ge1xuICBnZXRFeGVjdXRpb25Db250ZXh0KCk6IEFwcEtpdEV4ZWN1dGlvbkNvbnRleHQ7XG59O1xuXG4vKipcbiAqIENhY2hlZCByZXN1bHQgb2YgdGhlIG9uZSBvcHRpb25hbC1wZWVyIGltcG9ydCwgcmVzb2x2ZWQgdG8gYHVuZGVmaW5lZGAgd2hlblxuICogQXBwS2l0IGlzIG5vdCBpbnN0YWxsZWQuIE1lbW9pemVkIHNvIGEgYnVzIGluIGEgcGxhaW4gUG9zdGdyZXMgcHJvY2VzcyBwYXlzIGZvclxuICogdGhlIGZhaWxlZCByZXNvbHV0aW9uIG9uY2UgaW5zdGVhZCBvZiBwZXIgYnJvYWRjYXN0LlxuICovXG5sZXQgYXBwS2l0TW9kdWxlOiBQcm9taXNlPEFwcEtpdE1vZHVsZSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRmxhdC1rZXllZCBjb250ZXh0IHRyYXZlbGxpbmcgYWxvbmdzaWRlIGEgbWVzc2FnZSBib2R5OiB3aG8gc2VudCBpdCwgZnJvbVxuICogd2hlcmUsIGluIHdoaWNoIGRlcGxveW1lbnQuIFZhbHVlcyBtYXkgbmVzdCwgYnV0IHRoZSBrZXlzIGFyZSB0aGUgYWRkcmVzc2FibGVcbiAqIHBhcnQgLSBhIGxpc3RlbmVyIGZpbHRlcmluZyBvciBsYWJlbGxpbmcgbWVzc2FnZXMgcmVhZHMgYG1ldGFkYXRhLnVzZXJgLCBub3QgYVxuICogcGF0aCBpbnRvIHRoZSBib2R5LlxuICovXG5leHBvcnQgdHlwZSBUb3BpY01ldGFkYXRhID0gUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWU+O1xuXG4vKipcbiAqIFRoZSB3aXJlIGVudmVsb3BlIGV2ZXJ5IHN1YnNjcmliZXIgcmVjZWl2ZXMsIGFuZCB3aGF0IHtAbGlua1xuICogUG9zdGdyZXNUb3BpY0J1cy5icm9hZGNhc3R9IHJldHVybnMgdG8gdGhlIHB1Ymxpc2hlci5cbiAqXG4gKiBgaWRgLCBgdG9waWNgLCBhbmQgYHB1Ymxpc2hlZEF0YCBhcmUgYXNzaWduZWQgYnkgdGhlIGJ1czsgYHR5cGVgLCBgbWV0YWRhdGFgLFxuICogYW5kIGBib2R5YCBjb21lIGZyb20gdGhlIGNhbGxlciAod2l0aCBhdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgdW5kZXJcbiAqIGBtZXRhZGF0YWApLiBUaGUgc2hhcGUgaXMgc3RhYmxlIGVub3VnaCB0byBoYW5kIHN0cmFpZ2h0IHRvIGFuIFNTRSBgZGF0YTpgXG4gKiBmcmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY01lc3NhZ2U8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZSA9IFNlcmlhbGl6YWJsZVZhbHVlPiB7XG4gIC8qKlxuICAgKiBQZXItbWVzc2FnZSBpZGVudGl0eSBnZW5lcmF0ZWQgYnkgdGhlIHB1Ymxpc2hlciwgdW5pcXVlIGFjcm9zcyBpbnN0YW5jZXMuXG4gICAqIFN1aXRhYmxlIGZvciBkZWR1cGUgd2hlbiBhIGNsaWVudCByZWNvbm5lY3RzIGFuZCBmb3IgYW4gU1NFIGBpZDpgIGZpZWxkLiBOb3RcbiAgICogb3JkZXJlZCwgYW5kIG5vdCBhIGRhdGFiYXNlIGtleS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdG9waWMgdGhpcyB3YXMgYnJvYWRjYXN0IG9uOyBsaXN0ZW5lcnMgb24gb3RoZXIgdG9waWNzIG5ldmVyIHNlZSBpdC4gKi9cbiAgdG9waWM6IHN0cmluZztcbiAgLyoqIENhbGxlci1jaG9zZW4gZXZlbnQgbmFtZSwgZS5nLiBgb3JkZXIudXBkYXRlZGAuIE5ldmVyIGVtcHR5LiAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBBdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgd2l0aCBjYWxsZXIgbWV0YWRhdGEuIFNlZSB7QGxpbmsgVG9waWNNZXRhZGF0YX0uICovXG4gIG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIGNhbGxlcidzIHBheWxvYWQsIHVuY2hhbmdlZC4gKi9cbiAgYm9keTogVEJvZHk7XG4gIC8qKlxuICAgKiBJU08tODYwMSBwdWJsaXNoIHRpbWUgZnJvbSB0aGUgUFVCTElTSElORyBwcm9jZXNzJ3MgY2xvY2ssIG5vdCB0aGUgZGF0YWJhc2Uncy5cbiAgICogRmluZSBmb3IgZGlzcGxheTsgZG8gbm90IG9yZGVyIG1lc3NhZ2VzIGZyb20gZGlmZmVyZW50IGluc3RhbmNlcyBieSBpdC5cbiAgICovXG4gIHB1Ymxpc2hlZEF0OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IGEgY2FsbGVyIHN1cHBsaWVzIHRvIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzLmJyb2FkY2FzdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljUHVibGlzaElucHV0PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4ge1xuICAvKiogRXZlbnQgbmFtZSwgZS5nLiBgY2hhdC5tZXNzYWdlYC4gTXVzdCBiZSBub24tYmxhbmsuICovXG4gIHR5cGU6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRleHQgdG8gYXR0YWNoLiBXaW5zIG92ZXIgYW55IGF1dG9tYXRpYyBrZXkgb2YgdGhlIHNhbWUgbmFtZSwgc28gYSBjYWxsZXJcbiAgICogY2FuIG92ZXJyaWRlIGEgbWFjaGluZSBkZWZhdWx0IChgcHJvamVjdGApIG9yIGFkZCBpdHMgb3duIChgdHJhY2VJZGApLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIHBheWxvYWQuIE11c3Qgc2F0aXNmeSBgb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWVgLiAqL1xuICBib2R5OiBUQm9keTtcbiAgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7XG4gIHR0bD86IER1cmF0aW9uSW5wdXQgfCBmYWxzZTtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVyIGNhbGxiYWNrLiBJbnZva2VkIG9uY2UgcGVyIG1hdGNoaW5nIG1lc3NhZ2Ugb24gdGhlIG5vdGlmaWNhdGlvblxuICogY29ubmVjdGlvbidzIGNhbGxiYWNrLCBzbyBpdCBzaG91bGQgbm90IGJsb2NrOiBhIHJldHVybmVkIHByb21pc2UgaXMgYXdhaXRlZFxuICogb25seSB0byByb3V0ZSBhIHJlamVjdGlvbiB0byBgb25FcnJvcmAsIGFuZCBsaXN0ZW5lcnMgZm9yIG9uZSBtZXNzYWdlIHJ1blxuICogY29uY3VycmVudGx5IHJhdGhlciB0aGFuIGluIHJlZ2lzdHJhdGlvbiBvcmRlci5cbiAqXG4gKiBgVEJvZHlgIGlzIHVuY2hlY2tlZCBhdCBydW50aW1lLiBUaGUgYnVzIGd1YXJhbnRlZXMgdGhlIGJvZHkgaXMgc2VyaWFsaXphYmxlLFxuICogbm90IHRoYXQgaXQgbWF0Y2hlcyB0aGUgdHlwZSBwYXJhbWV0ZXIsIHNvIHZhbGlkYXRlIGFueXRoaW5nIGEgbGlzdGVuZXJcbiAqIGJyYW5jaGVzIG9uLlxuICovXG5leHBvcnQgdHlwZSBUb3BpY0xpc3RlbmVyPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4gPSAoXG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4sXG4pID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuLyoqXG4gKiBSZXNvbHZlcyBtZXRhZGF0YSBhdCBwdWJsaXNoIHRpbWUgaW5zdGVhZCBvZiBjb25zdHJ1Y3Rpb24gdGltZSwgZm9yIGNvbnRleHQgYVxuICogcHJvY2VzcyBsZWFybnMgbGF0ZSBvciBhc3luY2hyb25vdXNseSAtIGFuIGluc3RhbmNlIGlkIGZyb20gYSBjb250cm9sIHBsYW5lLCBhXG4gKiBkaXNjb3ZlcmVkIGFkZHJlc3MgYSBjYWxsZXIgY2hvb3NlcyB0byBhdHRhY2guIENhbGxlZCBvbiBldmVyeSBicm9hZGNhc3QsIHNvXG4gKiBtZW1vaXplIGFueXRoaW5nIGV4cGVuc2l2ZTsgYSByZWplY3Rpb24gZmFpbHMgdGhlIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9waWNNZXRhZGF0YVByb3ZpZGVyID0gKCkgPT4gVG9waWNNZXRhZGF0YSB8IFByb21pc2VMaWtlPFRvcGljTWV0YWRhdGE+O1xuXG4vKiogQ29uc3RydWN0aW9uIG9wdGlvbnMgZm9yIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMge1xuICAvKipcbiAgICogV2hhdCBpZGVudGlmaWVzIHRoaXMgY2hhbm5lbCAtIGFueXRoaW5nLCBub3QganVzdCBhbiBpZGVudGlmaWVyOiBhIG5hbWUsIGFuXG4gICAqIGlkLCBhIGBbZW52LCBmZWF0dXJlXWAgcGFpciwgYSBjb25maWcgb2JqZWN0LiBUaGUgcGFydHMgYXJlIHRva2VuaXplZCBpbnRvIGFcbiAgICogbGVnYWwgUG9zdGdyZXMgY2hhbm5lbCBuYW1lIHdpdGggYSBzaG9ydCBoYXNoIG9mIHRoZSBvcmlnaW5hbHMgYXBwZW5kZWQsIHNvXG4gICAqIHRoZSBkZXJpdmF0aW9uIGlzIGRldGVybWluaXN0aWMgYW5kIG5vIGNhbGwgc2l0ZSBoYXMgdG8gc2FuaXRpemUuIFNlZVxuICAgKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0gZm9yIHRoZSByZXNvbHZlZCBuYW1lLlxuICAgKlxuICAgKiBPbmUgdmFsdWUgb3IgbWFueTogYW4gYXJyYXkgaXMgcmVhZCBhcyBtdWx0aXBsZSBwYXJ0c1xuICAgKiAoe0BsaW5rIG9iamVjdC5PbmVPck1hbnl9KSwgYW55dGhpbmcgZWxzZSBhcyBhIHNpbmdsZSBwYXJ0LiBTb1xuICAgKiBgW1wiYmlsbGluZ1wiLCBcInByb2RcIl1gIGFuZCBgXCJiaWxsaW5nX3Byb2RcImAgYXJlIGRpZmZlcmVudCBjaGFubmVscywgc2luY2UgdGhlXG4gICAqIGhhc2ggc2VlcyBkaWZmZXJlbnQgc3RydWN0dXJlLlxuICAgKlxuICAgKiBFdmVyeSBwYXJ0aWNpcGF0aW5nIHByb2Nlc3MgbXVzdCBwYXNzIEVRVUlWQUxFTlQgcGFydHMsIHNpbmNlIGEgZGlmZmVyZW50XG4gICAqIHNwZWxsaW5nIGhhc2hlcyB0byBhIGRpZmZlcmVudCBjaGFubmVsLiBEZWZhdWx0cyB0byBhIHNoYXJlZFxuICAgKiBgZGJ4X3Rvb2xzX3RvcGljX2J1c2AgY2hhbm5lbC5cbiAgICovXG4gIGNoYW5uZWw/OiB1bmtub3duO1xuICAvKipcbiAgICogRXh0cmEgY29udGV4dCBhZGRlZCB0byBldmVyeSBtZXNzYWdlIHRoaXMgYnVzIHB1Ymxpc2hlcywgZWl0aGVyIGEgZml4ZWRcbiAgICogcmVjb3JkIG9yIGEge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gY2FsbGVkIHBlciBicm9hZGNhc3QuIE92ZXJyaWRlc1xuICAgKiBhdXRvbWF0aWMgbWFjaGluZSBrZXlzOyBwZXItY2FsbCBgbWV0YWRhdGFgIG92ZXJyaWRlcyB0aGlzLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyO1xuICAvKipcbiAgICogU2luayBmb3IgZmFpbHVyZXMgdGhhdCBoYXZlIG5vIGNhbGxlciB0byB0aHJvdyB0bzogYSBsaXN0ZW5lciB0aGF0IHJlamVjdGVkLFxuICAgKiBhIGRyb3BwZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24sIGEgZmFpbGVkIHJlY29ubmVjdCBhdHRlbXB0LiBEZWZhdWx0cyB0b1xuICAgKiBzd2FsbG93aW5nIHRoZW0sIHNvIHdpcmUgdGhpcyB0byBhIGxvZ2dlciBpbiBhbnl0aGluZyBsb25nLXJ1bm5pbmcuXG4gICAqL1xuICBvbkVycm9yPzogKGNhdXNlOiB1bmtub3duKSA9PiB2b2lkO1xuICBwZXJzaXN0PzogYm9vbGVhbiB8IFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zO1xufVxuXG4vKipcbiAqIERyb3Aga2V5cyB3aG9zZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgc28gYW4gdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgbGVhdmVzXG4gKiB0aGUga2V5IEFCU0VOVCByYXRoZXIgdGhhbiBwcmVzZW50LWFuZC1udWxsLiBBYnNlbmNlIGlzIHdoYXQgbGV0cyBjYWxsZXJcbiAqIG1ldGFkYXRhIGFuZCBsYXRlciBtZXJnZSBsYXllcnMgc3VwcGx5IHRoZSBrZXkgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lZE1ldGFkYXRhKHZhbHVlczogUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWUgfCB1bmRlZmluZWQ+KTogVG9waWNNZXRhZGF0YSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgW3N0cmluZywgU2VyaWFsaXphYmxlVmFsdWVdID0+IHtcbiAgICAgIHJldHVybiBlbnRyeVsxXSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIENvbnRleHQgZXZlcnkgbWVzc2FnZSBnZXRzIGZvciBmcmVlOiB3aGljaCBwcm9qZWN0LCBob3N0LCBhbmQgZGVwbG95bWVudFxuICogcHVibGlzaGVkIGl0LlxuICpcbiAqIFJlYWQgZnJlc2ggcGVyIGJyb2FkY2FzdCByYXRoZXIgdGhhbiBjYWNoZWQsIGJlY2F1c2UgYSBsb25nLWxpdmVkIHByb2Nlc3MgY2FuXG4gKiBiZSByZS1wYXJlbnRlZCAoYSBkZXBsb3ltZW50IGlkIGFwcGVhcmluZyBhZnRlciBib290KS4gS2V5cyB0aGF0IHJlc29sdmUgdG9cbiAqIG5vdGhpbmcgYXJlIG9taXR0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBpbmNsdWRlZDogcHVibGljL2NsaWVudCBJUCwgcHJvY2VzcyBpZCwgQ1BVIGFyY2hpdGVjdHVyZSxcbiAqIHJ1bnRpbWUgbmFtZSwgYW5kIHJ1bnRpbWUgdmVyc2lvbi4gSVBzIGFuZCBwaWRzIGFyZSBub2lzeSwgb2Z0ZW4gc2Vuc2l0aXZlLFxuICogYW5kIGJ1cm4gYE5PVElGWWAgcGF5bG9hZCBidWRnZXQ7IGFyY2hpdGVjdHVyZS9ydW50aW1lIGFyZSBjb25zdGFudCBwZXJcbiAqIGRlcGxveW1lbnQgYW5kIHBheSB0aGUgc2FtZSBjb3N0LiBBIHByb2Nlc3MgdGhhdCB3YW50cyBhbnkgb2YgdGhlbSBwYXNzZXMgYVxuICoge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gb3IgcGVyLW1lc3NhZ2UgYG1ldGFkYXRhYC5cbiAqL1xuZnVuY3Rpb24gbWFjaGluZU1ldGFkYXRhKCk6IFRvcGljTWV0YWRhdGEge1xuICByZXR1cm4gZGVmaW5lZE1ldGFkYXRhKHtcbiAgICBwcm9qZWN0OlxuICAgICAgZmlyc3ROb25FbXB0eShbXG4gICAgICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQlVORExFX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSxcbiAgICAgICAgcHJvY2Vzcy5lbnYubnBtX3BhY2thZ2VfbmFtZSxcbiAgICAgIF0pID8/IHVuZGVmaW5lZCxcbiAgICBob3N0bmFtZTogaG9zdG5hbWUoKSxcbiAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICBlbnZpcm9ubWVudDogdHJpbVRvTnVsbChwcm9jZXNzLmVudi5OT0RFX0VOVikgPz8gdW5kZWZpbmVkLFxuICAgIGFwcE5hbWU6IHRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfTkFNRSkgPz8gdW5kZWZpbmVkLFxuICAgIGRlcGxveW1lbnRJZDogdHJpbVRvTnVsbChwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0FQUF9ERVBMT1lNRU5UX0lEKSA/PyB1bmRlZmluZWQsXG4gICAgZGF0YWJyaWNrc0hvc3Q6IHRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUKSA/PyB1bmRlZmluZWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIElkZW50aXR5IG9mIHRoZSBzaWduZWQtaW4gdXNlciBvbiB3aG9zZSBiZWhhbGYgdGhpcyBicm9hZGNhc3QgaGFwcGVucywgd2hlbiB0aGVcbiAqIHByb2Nlc3MgY2FuIHRlbGwuXG4gKlxuICogYEBkYXRhYnJpY2tzL2FwcGtpdGAgaXMgYW4gT1BUSU9OQUwgcGVlciwgc28gdGhlIGltcG9ydCBpcyBsYXp5IGFuZCBhIG1pc3NpbmdcbiAqIG1vZHVsZSBpcyBub3QgYW4gZXJyb3IgLSB0aGlzIGlzIGEgcGxhaW4gUG9zdGdyZXMgcGFja2FnZSB0aGF0IGFkZHMgc2VuZGVyXG4gKiBpZGVudGl0eSB3aGVuIGl0IGhhcHBlbnMgdG8gcnVuIGluc2lkZSBhbiBBcHBLaXQgYXBwLiBPdXRzaWRlIGFuIGFjdGl2ZVxuICogcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgQXBwS2l0IHRocm93cywgd2hpY2ggbWVhbnMgXCJubyB1c2VyIGhlcmVcIiwgc28gdGhlXG4gKiByZXN1bHQgaXMgZW1wdHkgbWV0YWRhdGEgcmF0aGVyIHRoYW4gYSBmYWlsZWQgYnJvYWRjYXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzZW5kZXJNZXRhZGF0YSgpOiBQcm9taXNlPFRvcGljTWV0YWRhdGE+IHtcbiAgYXBwS2l0TW9kdWxlID8/PSBpbXBvcnQoXCJAZGF0YWJyaWNrcy9hcHBraXRcIilcbiAgICAudGhlbigobW9kdWxlKSA9PiBtb2R1bGUgYXMgQXBwS2l0TW9kdWxlKVxuICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICBjb25zdCBhcHBraXQgPSBhd2FpdCBhcHBLaXRNb2R1bGU7XG4gIGlmICghYXBwa2l0KSByZXR1cm4ge307XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IGFwcGtpdC5nZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgcmV0dXJuIGRlZmluZWRNZXRhZGF0YSh7XG4gICAgICBzZW5kZXJJZDogdHJpbVRvTnVsbChjb250ZXh0LnVzZXJJZCkgPz8gdW5kZWZpbmVkLFxuICAgICAgc2VuZGVyTmFtZTogdHJpbVRvTnVsbChjb250ZXh0LnVzZXJOYW1lKSA/PyB1bmRlZmluZWQsXG4gICAgICBzZW5kZXJFbWFpbDogdHJpbVRvTnVsbChjb250ZXh0LnVzZXJFbWFpbCkgPz8gdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhIGBOT1RJRllgIHBheWxvYWQgaW50byBhbiBlbnZlbG9wZSwgcmV0dXJuaW5nIGB1bmRlZmluZWRgIGZvciBhbnl0aGluZ1xuICogdGhhdCBpcyBub3Qgb25lLlxuICpcbiAqIFRoZSBjaGFubmVsIGlzIHNoYXJlZCBhbmQgYW55IFBvc3RncmVzIHNlc3Npb24gY2FuIGBwZ19ub3RpZnlgIG9uIGl0LCBzbyBhblxuICogdW5yZWNvZ25pemVkIHBheWxvYWQgaXMgZXhwZWN0ZWQgaW5wdXQsIG5vdCBhbiBleGNlcHRpb24uIFB1Ymxpc2hlcnMgcnVuIHRoaXNcbiAqIG92ZXIgdGhlaXIgb3duIGVuY29kZWQgbWVzc2FnZSB0b28sIHdoaWNoIGlzIGhvdyBhIGJvZHkgdGhhdCBzdHJpbmdpZmllcyBidXRcbiAqIGRvZXMgbm90IHJvdW5kLXRyaXAgaXMgY2F1Z2h0IGJlZm9yZSBpdCBzaGlwcy5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUb3BpY01lc3NhZ2UgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZWNvcmQgPSBwYXJzZVJlY29yZCh2YWx1ZSk7XG4gIGlmIChcbiAgICAhcmVjb3JkIHx8XG4gICAgdHlwZW9mIHJlY29yZC5pZCAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQudG9waWMgIT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgcmVjb3JkLnR5cGUgIT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgcmVjb3JkLnB1Ymxpc2hlZEF0ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgIXJlY29yZC5tZXRhZGF0YSB8fFxuICAgIHR5cGVvZiByZWNvcmQubWV0YWRhdGEgIT09IFwib2JqZWN0XCIgfHxcbiAgICBBcnJheS5pc0FycmF5KHJlY29yZC5tZXRhZGF0YSkgfHxcbiAgICAhKFwiYm9keVwiIGluIHJlY29yZCkgfHxcbiAgICAhaXNTZXJpYWxpemFibGVWYWx1ZShyZWNvcmQubWV0YWRhdGEpIHx8XG4gICAgIWlzU2VyaWFsaXphYmxlVmFsdWUocmVjb3JkLmJvZHkpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpZDogcmVjb3JkLmlkLFxuICAgIHRvcGljOiByZWNvcmQudG9waWMsXG4gICAgdHlwZTogcmVjb3JkLnR5cGUsXG4gICAgbWV0YWRhdGE6IHJlY29yZC5tZXRhZGF0YSBhcyBUb3BpY01ldGFkYXRhLFxuICAgIGJvZHk6IHJlY29yZC5ib2R5IGFzIFNlcmlhbGl6YWJsZVZhbHVlLFxuICAgIHB1Ymxpc2hlZEF0OiByZWNvcmQucHVibGlzaGVkQXQsXG4gIH07XG59XG5cbi8qKlxuICogQnJvYWRjYXN0cyBzdHJ1Y3R1cmVkIG1lc3NhZ2VzIGJ5IHRvcGljIGFuZCBkZWxpdmVycyB0aGVtIHRvIGV2ZXJ5IHByb2Nlc3NcbiAqIGxpc3RlbmluZyBvbiB0aGUgc2FtZSBjaGFubmVsLlxuICpcbiAqIENPTk5FQ1RJT04gU0hBUEUuIFB1Ymxpc2hpbmcgYm9ycm93cyBhIHBvb2xlZCBjb25uZWN0aW9uIHBlciBjYWxsLCBsaWtlIGFueVxuICogb3RoZXIgcXVlcnkuIExpc3RlbmluZyBjYW5ub3Q6IGBMSVNURU5gIGlzIHNlc3Npb24gc3RhdGUsIHNvIHRoZSBidXMgaG9sZHMgT05FXG4gKiBkZWRpY2F0ZWQgY2xpZW50IG91dCBvZiB0aGUgcG9vbCBmb3IgYXMgbG9uZyBhcyBpdCBoYXMgc3Vic2NyaWJlcnMsIG5vIG1hdHRlclxuICogaG93IG1hbnkgdG9waWNzIG9yIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZC4gU2l6ZSB0aGUgcG9vbCB3aXRoIHRoYXQgb25lXG4gKiBsb25nLWxpdmVkIGNoZWNrb3V0IGluIG1pbmQuXG4gKlxuICogTElGRUNZQ0xFLiBDb25zdHJ1Y3Rpb24gaXMgaW5lcnQgLSBub3RoaW5nIGNvbm5lY3RzIHVudGlsIHRoZSBmaXJzdFxuICoge0BsaW5rIGxpc3Rlbn0gKG9yIGFuIGV4cGxpY2l0IHtAbGluayBzdGFydH0pLiB7QGxpbmsgY2xvc2V9IGlzIHJlcXVpcmVkIHRvIGdpdmVcbiAqIHRoZSBjb25uZWN0aW9uIGJhY2s7IGEgY2xvc2VkIGJ1cyBzdGF5cyBjbG9zZWQgYW5kIHRocm93cyBvbiBmdXJ0aGVyIHVzZSByYXRoZXJcbiAqIHRoYW4gc2lsZW50bHkgcmVjb25uZWN0aW5nLiBSZWdpc3RlciBpdCB3aXRoIHRoZSBob3N0J3Mgc2h1dGRvd24gaG9vay5cbiAqXG4gKiBGQUlMVVJFIEhBTkRMSU5HLiBBIGxvc3Qgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gcmVjb25uZWN0cyBvbiBpdHMgb3duIHdpdGhcbiAqIGJvdW5kZWQgYmFja29mZiB3aGlsZSBzdWJzY3JpYmVycyByZW1haW4sIHJlcG9ydGluZyBlYWNoIGZhaWxlZCBhdHRlbXB0IHRocm91Z2hcbiAqIGBvbkVycm9yYC4gTWVzc2FnZXMgcHVibGlzaGVkIGR1cmluZyB0aGUgZ2FwIGFyZSBsb3N0IC0gYE5PVElGWWAgaGFzIG5vIHJlcGxheS5cbiAqIEEgdGhyb3dpbmcgb3IgcmVqZWN0aW5nIGxpc3RlbmVyIG5ldmVyIGFmZmVjdHMgdGhlIHB1Ymxpc2hlciBvciB0aGUgb3RoZXJcbiAqIGxpc3RlbmVyczsgaXRzIGZhaWx1cmUgZ29lcyB0byBgb25FcnJvcmAuXG4gKlxuICogTm90IHNhZmUgdG8gc2hhcmUgb25lIGluc3RhbmNlIGFjcm9zcyB1bnJlbGF0ZWQgY2hhbm5lbHMgLSBjb25zdHJ1Y3Qgb25lIGJ1c1xuICogcGVyIGNoYW5uZWwuIFRoZSBjaGFubmVsIGl0c2VsZiBpcyBERVJJVkVEIGZyb20gdGhlIGBjaGFubmVsYCBvcHRpb24gcmF0aGVyXG4gKiB0aGFuIHRha2VuIGxpdGVyYWxseTsgc2VlIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzT3B0aW9ucy5jaGFubmVsfSBhbmRcbiAqIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzLmNoYW5uZWxOYW1lfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3RncmVzVG9waWNCdXMge1xuICAvKipcbiAgICogVGhlIHJlc29sdmVkIFBvc3RncmVzIGNoYW5uZWwgdGhpcyBidXMgbGlzdGVucyBhbmQgcHVibGlzaGVzIG9uLCBkZXJpdmVkIGZyb21cbiAgICogdGhlIGBjaGFubmVsYCBvcHRpb24uIFJlYWQgaXQgdG8gY29uZmlybSB0d28gcHJvY2Vzc2VzIGFncmVlLCBvciB0byBsb2cgd2hhdCBhXG4gICAqIHNldCBvZiBwYXJ0cyBhY3R1YWxseSByZXNvbHZlZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGE6IFRvcGljTWV0YWRhdGEgfCBUb3BpY01ldGFkYXRhUHJvdmlkZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25FcnJvcjogKGNhdXNlOiB1bmtub3duKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8VG9waWNMaXN0ZW5lcj4+KCk7XG4gIHByaXZhdGUgY2xpZW50OiBQb29sQ2xpZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN0YXJ0aW5nOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlY29ubmVjdGluZzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSByZWNvbm5lY3RBYm9ydCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJzaXN0ZW5jZT86IFJlc29sdmVkVG9waWNCdXNQZXJzaXN0ZW5jZU9wdGlvbnM7XG4gIHByaXZhdGUgcHJvdmlzaW9uaW5nPzogUHJvbWlzZTx2b2lkPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvb2w6IFBnUG9vbExpa2UgJiBQZ1F1ZXJ5YWJsZSxcbiAgICBvcHRpb25zOiBQb3N0Z3Jlc1RvcGljQnVzT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICB0aGlzLmNoYW5uZWxOYW1lID0gY2hhbm5lbE5hbWUoXG4gICAgICBvcHRpb25zLmNoYW5uZWwgPT09IHVuZGVmaW5lZCA/IERFRkFVTFRfQ0hBTk5FTCA6IG9wdGlvbnMuY2hhbm5lbCxcbiAgICApO1xuICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuICAgIHRoaXMub25FcnJvciA9IG9wdGlvbnMub25FcnJvciA/PyAoKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0aGlzLnBlcnNpc3RlbmNlID0gb3B0aW9ucy5wZXJzaXN0XG4gICAgICA/IHJlc29sdmVQZXJzaXN0ZW5jZU9wdGlvbnMob3B0aW9ucy5wZXJzaXN0ID09PSB0cnVlID8gdHJ1ZSA6IG9wdGlvbnMucGVyc2lzdClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGRlZGljYXRlZCBub3RpZmljYXRpb24gY29ubmVjdGlvbiBhbmQgYExJU1RFTmAuXG4gICAqXG4gICAqIElkZW1wb3RlbnQsIGFuZCBzYWZlIHRvIGNhbGwgY29uY3VycmVudGx5IC0gb3ZlcmxhcHBpbmcgY2FsbHMgYXdhaXQgdGhlIHNhbWVcbiAgICogaW4tZmxpZ2h0IGNvbm5lY3QuIHtAbGluayBsaXN0ZW59IGNhbGxzIHRoaXMsIHNvIGl0IGlzIG9ubHkgbmVlZGVkIHRvIHN1cmZhY2VcbiAgICogYSBjb25uZWN0aW9uIHByb2JsZW0gYXQgc3RhcnR1cCByYXRoZXIgdGhhbiBvbiBmaXJzdCBzdWJzY3JpYmUuIFRocm93cyBpZiB0aGVcbiAgICogYnVzIGlzIGNsb3NlZCwgb3IgaWYgdGhlIHBvb2wgY2Fubm90IGhhbmQgb3V0IGEgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKTtcbiAgICB0aGlzLnN0YXJ0aW5nID8/PSB0aGlzLmNvbm5lY3QoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMuc3RhcnRpbmcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5zdGFydGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGEgbWVzc2FnZSB0byBgdG9waWNgLCByZXR1cm5pbmcgdGhlIGVudmVsb3BlIHRoYXQgd2FzIHNlbnQuXG4gICAqXG4gICAqIFJlc29sdmVzIG9uY2UgUG9zdGdyZXMgaGFzIGFjY2VwdGVkIHRoZSBgTk9USUZZYCwgd2hpY2ggc2F5cyBub3RoaW5nIGFib3V0XG4gICAqIGFueW9uZSByZWNlaXZpbmcgaXQ6IHNlc3Npb25zIG5vdCBsaXN0ZW5pbmcgYXQgdGhhdCBtb21lbnQgbWlzcyBpdC4gUHVibGlzaGluZ1xuICAgKiBuZWVkcyBubyB7QGxpbmsgc3RhcnR9IGFuZCBubyBzdWJzY3JpYmVycy5cbiAgICpcbiAgICogVmFsaWRhdGlvbiBpcyBkZWxpYmVyYXRlbHkgZnJvbnQtbG9hZGVkLCBzaW5jZSBhIG1lc3NhZ2UgdGhhdCBmYWlscyBvbiB0aGVcbiAgICogd2lyZSBpcyBmYXIgaGFyZGVyIHRvIGRpYWdub3NlIHRoYW4gb25lIHJlamVjdGVkIGF0IHRoZSBjYWxsOiBgVHlwZUVycm9yYCBmb3IgYVxuICAgKiBibGFuayB0b3BpYyBvciB0eXBlLCBvciBhIGJvZHkvbWV0YWRhdGEgdGhhdCB3b3VsZCBub3Qgcm91bmQtdHJpcCB0aHJvdWdoIEpTT05cbiAgICogdW5jaGFuZ2VkIChgb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWVgKTsgYFJhbmdlRXJyb3JgIHdoZW4gdGhlIGVuY29kZWRcbiAgICogZW52ZWxvcGUgZXhjZWVkcyB0aGUgYE5PVElGWWAgcGF5bG9hZCBsaW1pdCwgd2hpY2ggdGhlIGF1dG9tYXRpYyBtZXRhZGF0YVxuICAgKiBjb3VudHMgYWdhaW5zdCAtIHNlbmQgYSByZWZlcmVuY2UgYW5kIGxldCB0aGUgcmVjZWl2ZXIgZmV0Y2ggdGhlIHBheWxvYWQuXG4gICAqIFRocm93cyBpZiB0aGUgYnVzIGlzIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGJyb2FkY2FzdDxUQm9keSBleHRlbmRzIFNlcmlhbGl6YWJsZVZhbHVlPihcbiAgICB0b3BpYzogc3RyaW5nLFxuICAgIGlucHV0OiBUb3BpY1B1Ymxpc2hJbnB1dDxUQm9keT4sXG4gICk6IFByb21pc2U8VG9waWNNZXNzYWdlPFRCb2R5Pj4ge1xuICAgIGlmICghdG9waWMudHJpbSgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9waWMgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgaWYgKCFpbnB1dC50eXBlLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1lc3NhZ2UgdHlwZSBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcbiAgICBpZiAoIWlzU2VyaWFsaXphYmxlVmFsdWUoaW5wdXQubWV0YWRhdGEgPz8ge30pIHx8ICFpc1NlcmlhbGl6YWJsZVZhbHVlKGlucHV0LmJvZHkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSBtZXRhZGF0YSBhbmQgYm9keSBtdXN0IGJlIEpTT04gc2VyaWFsaXphYmxlIHdpdGhvdXQgY29lcmNpb25cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKTtcbiAgICBjb25zdCBhdXRvbWF0aWMgPSBhd2FpdCB0aGlzLnJlc29sdmVNZXRhZGF0YSgpO1xuICAgIGNvbnN0IG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4gPSB7XG4gICAgICBpZDogaWQoKSxcbiAgICAgIHRvcGljLFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIG1ldGFkYXRhOiB7IC4uLmF1dG9tYXRpYywgLi4uaW5wdXQubWV0YWRhdGEgfSxcbiAgICAgIGJvZHk6IGlucHV0LmJvZHksXG4gICAgICBwdWJsaXNoZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgbGV0IGVuY29kZWQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgZW5jb2RlZCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBNZXNzYWdlIG11c3QgYmUgSlNPTiBzZXJpYWxpemFibGU6ICR7ZXJyb3JNZXNzYWdlKGNhdXNlKX1gKTtcbiAgICB9XG4gICAgaWYgKCFkZWNvZGUoZW5jb2RlZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXNzYWdlIHR5cGUsIG1ldGFkYXRhLCBhbmQgYm9keSBtdXN0IGJlIEpTT04gc2VyaWFsaXphYmxlXCIpO1xuICAgIH1cbiAgICAvLyBPbmx5IHRoZSBlbnZlbG9wZSBwYXlsb2FkIGlzIGJvdW5kZWQgYnkgdGhlIGBOT1RJRllgIGxpbWl0LiBBIHBvaW50ZXJcbiAgICAvLyBub3RpZmljYXRpb24gaXMgYSBmaXhlZCBoYW5kZnVsIG9mIGJ5dGVzLCBzbyBwZXJzaXN0ZW5jZSB3aXRoXG4gICAgLy8gYHBheWxvYWQ6IFwicG9pbnRlclwiYCBsaWZ0cyB0aGUgY2FwIGVudGlyZWx5LlxuICAgIGlmIChcbiAgICAgIEJ1ZmZlci5ieXRlTGVuZ3RoKGVuY29kZWQsIFwidXRmOFwiKSA+IE1BWF9OT1RJRllfQllURVMgJiZcbiAgICAgIHRoaXMucGVyc2lzdGVuY2U/LnBheWxvYWQgIT09IFwicG9pbnRlclwiXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUG9zdGdyZXMgbm90aWZpY2F0aW9uIGV4Y2VlZHMgJHtNQVhfTk9USUZZX0JZVEVTfSBieXRlc2ApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucGVyc2lzdGVuY2UpIHtcbiAgICAgIGF3YWl0IHRoaXMucG9vbC5xdWVyeShcIlNFTEVDVCBwZ19ub3RpZnkoJDEsICQyKVwiLCBbdGhpcy5jaGFubmVsTmFtZSwgZW5jb2RlZF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZS5wcm92aXNpb24pIHtcbiAgICAgICAgdGhpcy5wcm92aXNpb25pbmcgPz89IHByb3Zpc2lvbk1lc3NhZ2VCdXNTY2hlbWEodGhpcy5wb29sLCB0aGlzLnBlcnNpc3RlbmNlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm92aXNpb25pbmc7XG4gICAgICB9XG4gICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLnBvb2wuY29ubmVjdCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiQkVHSU5cIik7XG4gICAgICAgIGF3YWl0IHBlcnNpc3RlZE5vdGlmeShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgdGhpcy5jaGFubmVsTmFtZSxcbiAgICAgICAgICB0b3BpYyxcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIGVuY29kZWQsXG4gICAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSxcbiAgICAgICAgICBpbnB1dC5zY29wZSA/PyB0aGlzLnBlcnNpc3RlbmNlLnNjb3BlLFxuICAgICAgICAgIGlucHV0LnR0bCA/PyB0aGlzLnBlcnNpc3RlbmNlLnR0bCxcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiQ09NTUlUXCIpO1xuICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiUk9MTEJBQ0tcIikuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhyb3cgY2F1c2U7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjbGllbnQucmVsZWFzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGFzeW5jIGhpc3Rvcnk8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGFmdGVyPzogc3RyaW5nOyBsaW1pdD86IG51bWJlcjsgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGUgfSA9IHt9LFxuICApOiBQcm9taXNlPFRvcGljSGlzdG9yeVBhZ2U8VEJvZHk+PiB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcIik7XG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2UucHJvdmlzaW9uKSB7XG4gICAgICB0aGlzLnByb3Zpc2lvbmluZyA/Pz0gcHJvdmlzaW9uTWVzc2FnZUJ1c1NjaGVtYSh0aGlzLnBvb2wsIHRoaXMucGVyc2lzdGVuY2UpO1xuICAgICAgYXdhaXQgdGhpcy5wcm92aXNpb25pbmc7XG4gICAgfVxuICAgIHJldHVybiBoaXN0b3J5PFRCb2R5Pih0aGlzLnBvb2wsIHRoaXMuY2hhbm5lbE5hbWUsIHRvcGljLCB0aGlzLnBlcnNpc3RlbmNlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBFeHBpcmVkKFxuICAgIG9wdGlvbnM6IHsgc2NvcGU/OiBUb3BpY1BlcnNpc3RlbmNlU2NvcGU7IGxpbWl0PzogbnVtYmVyIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMucGVyc2lzdGVuY2UpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBwZXJzaXN0ZW5jZSBpcyBkaXNhYmxlZFwiKTtcbiAgICByZXR1cm4gY2xlYW51cEV4cGlyZWQoXG4gICAgICB0aGlzLnBvb2wsXG4gICAgICB0aGlzLnBlcnNpc3RlbmNlLFxuICAgICAgb3B0aW9ucy5zY29wZSA/PyB0aGlzLnBlcnNpc3RlbmNlLnNjb3BlLFxuICAgICAgb3B0aW9ucy5saW1pdCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBgdG9waWNgLCByZXR1cm5pbmcgdGhlIGZ1bmN0aW9uIHRoYXQgdW5zdWJzY3JpYmVzLlxuICAgKlxuICAgKiBDb25uZWN0cyBvbiBmaXJzdCB1c2UuIFNldmVyYWwgbGlzdGVuZXJzIG1heSBzaGFyZSBhIHRvcGljOyBlYWNoIGlzIGNhbGxlZFxuICAgKiBvbmNlIHBlciBtZXNzYWdlLiBPbmx5IG1lc3NhZ2VzIHB1Ymxpc2hlZCBBRlRFUiB0aGlzIHJlc29sdmVzIGFycml2ZSwgc29cbiAgICogc3Vic2NyaWJlIGJlZm9yZSB0cmlnZ2VyaW5nIHdoYXRldmVyIHlvdSBleHBlY3QgdG8gb2JzZXJ2ZS5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHJlbW92ZXMganVzdCB0aGlzIGxpc3RlbmVyIGFuZCBpcyBzYWZlIHRvIGNhbGwgdHdpY2UuXG4gICAqIFRoZSBjb25uZWN0aW9uIHN0YXlzIG9wZW4gb25jZSB0aGUgbGFzdCBsaXN0ZW5lciBsZWF2ZXMgLSB7QGxpbmsgY2xvc2V9XG4gICAqIHJlbGVhc2VzIGl0IC0gc28gYSBidXMgdGhhdCBzdWJzY3JpYmVzIGFuZCB1bnN1YnNjcmliZXMgcGVyIHJlcXVlc3QgZG9lcyBub3RcbiAgICogY2h1cm4gY29ubmVjdGlvbnMuXG4gICAqL1xuICBhc3luYyBsaXN0ZW48VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBsaXN0ZW5lcjogVG9waWNMaXN0ZW5lcjxUQm9keT4sXG4gICk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICAgIGlmICghdG9waWMudHJpbSgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9waWMgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmdldCh0b3BpYykgPz8gbmV3IFNldDxUb3BpY0xpc3RlbmVyPigpO1xuICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIgYXMgVG9waWNMaXN0ZW5lcik7XG4gICAgdGhpcy5saXN0ZW5lcnMuc2V0KHRvcGljLCBsaXN0ZW5lcnMpO1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyIGFzIFRvcGljTGlzdGVuZXIpO1xuICAgICAgaWYgKGxpc3RlbmVycy5zaXplID09PSAwKSB0aGlzLmxpc3RlbmVycy5kZWxldGUodG9waWMpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGF1dG9tYXRpYyBoYWxmIG9mIGEgbWVzc2FnZSdzIG1ldGFkYXRhLlxuICAgKlxuICAgKiBQcmVjZWRlbmNlLCB3ZWFrZXN0IGZpcnN0OiBtYWNoaW5lL3Byb2Nlc3MgY29udGV4dCwgdGhlbiBBcHBLaXQgc2VuZGVyXG4gICAqIGlkZW50aXR5LCB0aGVuIHRoaXMgYnVzJ3MgY29uZmlndXJlZCBtZXRhZGF0YS4gVGhlIGNhbGxlcidzIHBlci1tZXNzYWdlXG4gICAqIG1ldGFkYXRhIGlzIGxheWVyZWQgb3ZlciB0aGUgcmVzdWx0IGluIHtAbGluayBicm9hZGNhc3R9LCBzbyB0aGUgbW9zdCBzcGVjaWZpY1xuICAgKiBzb3VyY2UgYWx3YXlzIHdpbnMgYW5kIG5vdGhpbmcgaGVyZSBjYW4gb3ZlcndyaXRlIGFuIGV4cGxpY2l0IGtleS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZU1ldGFkYXRhKCk6IFByb21pc2U8VG9waWNNZXRhZGF0YT4ge1xuICAgIGNvbnN0IHNlbmRlciA9IGF3YWl0IHNlbmRlck1ldGFkYXRhKCk7XG4gICAgY29uc3QgY29uZmlndXJlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgdGhpcy5tZXRhZGF0YSgpIDogKHRoaXMubWV0YWRhdGEgPz8ge30pO1xuICAgIHJldHVybiB7IC4uLm1hY2hpbmVNZXRhZGF0YSgpLCAuLi5zZW5kZXIsIC4uLmNvbmZpZ3VyZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbiBhbmQgc3RvcCBkZWxpdmVyaW5nIG1lc3NhZ2VzLiBJZGVtcG90ZW50LlxuICAgKlxuICAgKiBDYW5jZWxzIGFueSBwZW5kaW5nIHJlY29ubmVjdCwgZHJvcHMgYWxsIGxpc3RlbmVycywgdGhlbiBgVU5MSVNURU5gcyBhbmRcbiAgICogcmV0dXJucyB0aGUgY2xpZW50IHRvIHRoZSBwb29sLiBBIGZhaWxlZCBgVU5MSVNURU5gIGlzIHJlcG9ydGVkIHRvIHRoZSBwb29sIGFzXG4gICAqIGEgcmVsZWFzZSBlcnJvciBzbyB0aGUgY29ubmVjdGlvbiBpcyBESVNDQVJERUQgcmF0aGVyIHRoYW4gaGFuZGVkIHRvIHRoZSBuZXh0XG4gICAqIGNhbGxlciBzdGlsbCBzdWJzY3JpYmVkIHRvIHRoZSBjaGFubmVsLiBEb2VzIG5vdCB0aHJvdzsgdGhlIGJ1cyBzdGF5cyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgdGhpcy5yZWNvbm5lY3RBYm9ydC5hYm9ydChuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0aW5nPy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGF3YWl0IHRoaXMucmVjb25uZWN0aW5nPy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIHRoaXMuY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJub3RpZmljYXRpb25cIiwgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24pO1xuICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgIGxldCByZWxlYXNlRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFVOTElTVEVOICR7cXVvdGVQb3N0Z3Jlc0lkZW50aWZpZXIodGhpcy5jaGFubmVsTmFtZSl9YCk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHJlbGVhc2VFcnJvciA9IHRvRXJyb3IoY2F1c2UpO1xuICAgIH1cbiAgICBjbGllbnQucmVsZWFzZShyZWxlYXNlRXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIG91dCBvbmUgY2xpZW50LCBhdHRhY2ggdGhlIGhhbmRsZXJzLCBhbmQgYExJU1RFTmAuXG4gICAqXG4gICAqIFRoZSBoYW5kbGVycyBhcmUgYXR0YWNoZWQgQkVGT1JFIHRoZSBgTElTVEVOYCByb3VuZCB0cmlwIHNvIGEgbm90aWZpY2F0aW9uIG9yXG4gICAqIGVycm9yIGFycml2aW5nIG1pZC1zZXR1cCBpcyBub3QgbWlzc2VkLiBBbnkgZmFpbHVyZSAtIGluY2x1ZGluZyB0aGUgYnVzIGJlaW5nXG4gICAqIGNsb3NlZCB3aGlsZSB0aGUgY29ubmVjdCB3YXMgaW4gZmxpZ2h0IC0gZGV0YWNoZXMgdGhlIGhhbmRsZXJzIGFuZCByZWxlYXNlc1xuICAgKiB0aGUgY2xpZW50IGFzIGVycm9yZWQsIHNvIGEgaGFsZi1jb25maWd1cmVkIGNvbm5lY3Rpb24gbmV2ZXIgcmV0dXJucyB0byB0aGVcbiAgICogcG9vbC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLnBvb2wuY29ubmVjdCgpO1xuICAgIHRyeSB7XG4gICAgICBjbGllbnQub24oXCJub3RpZmljYXRpb25cIiwgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24pO1xuICAgICAgY2xpZW50Lm9uKFwiZXJyb3JcIiwgdGhpcy5oYW5kbGVDbGllbnRFcnJvcik7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYExJU1RFTiAke3F1b3RlUG9zdGdyZXNJZGVudGlmaWVyKHRoaXMuY2hhbm5lbE5hbWUpfWApO1xuICAgICAgaWYgKHRoaXMuY2xvc2VkKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpO1xuICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcIm5vdGlmaWNhdGlvblwiLCB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbik7XG4gICAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICAgIGNsaWVudC5yZWxlYXNlKHRvRXJyb3IoY2F1c2UpKTtcbiAgICAgIHRocm93IGNhdXNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZSBvbmUgaW5ib3VuZCBub3RpZmljYXRpb24gdG8gdGhlIHRvcGljJ3MgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBJZ25vcmVzIG90aGVyIGNoYW5uZWxzIGFuZCB1bmRlY29kYWJsZSBwYXlsb2FkcyAtIHRoZSBjaGFubmVsIGlzIHNoYXJlZCwgc29cbiAgICogYm90aCBhcmUgb3JkaW5hcnkgdHJhZmZpYy4gTGlzdGVuZXJzIGFyZSBpbnZva2VkIGNvbmN1cnJlbnRseSBhbmQgdGhlaXJcbiAgICogcmVqZWN0aW9ucyBnbyB0byBgb25FcnJvcmAsIGtlZXBpbmcgb25lIHNsb3cgb3IgYnJva2VuIHN1YnNjcmliZXIgZnJvbVxuICAgKiBzdGFsbGluZyB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZU5vdGlmaWNhdGlvbiA9IChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmIChub3RpZmljYXRpb24uY2hhbm5lbCAhPT0gdGhpcy5jaGFubmVsTmFtZSkgcmV0dXJuO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBkZWNvZGUobm90aWZpY2F0aW9uLnBheWxvYWQpO1xuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICB0aGlzLmRlbGl2ZXIobWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGBwYXlsb2FkOiBcInBvaW50ZXJcImAgY2FycmllcyBvbmx5IHJvdXRpbmcgYW5kIGlkZW50aXR5LCBzbyB0aGUgZW52ZWxvcGUgaGFzXG4gICAgLy8gdG8gYmUgcmVhZCBiYWNrIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgZGVsaXZlcmVkLiBPbmx5IGF0dGVtcHRlZCB3aGVuIHRoaXNcbiAgICAvLyBidXMgaXMgY29uZmlndXJlZCBmb3IgcGVyc2lzdGVuY2U7IG90aGVyd2lzZSB0aGUgcGF5bG9hZCBpcyBmb3JlaWduIHRyYWZmaWNcbiAgICAvLyBvbiBhIHNoYXJlZCBjaGFubmVsIGFuZCBpZ25vcmVkIGFzIGJlZm9yZS5cbiAgICBjb25zdCBwb2ludGVyID0gdGhpcy5wZXJzaXN0ZW5jZSA/IGRlY29kZVBvaW50ZXIobm90aWZpY2F0aW9uLnBheWxvYWQpIDogdW5kZWZpbmVkO1xuICAgIGlmICghcG9pbnRlcikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5saXN0ZW5lcnMuaGFzKHBvaW50ZXIudG9waWMpKSByZXR1cm47XG4gICAgcmVhZFBvaW50ZXIodGhpcy5wb29sLCB0aGlzLmNoYW5uZWxOYW1lLCBwb2ludGVyLCB0aGlzLnBlcnNpc3RlbmNlISlcbiAgICAgIC50aGVuKChzdG9yZWQpID0+IHtcbiAgICAgICAgaWYgKHN0b3JlZCkgdGhpcy5kZWxpdmVyKHN0b3JlZCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKHRoaXMub25FcnJvcik7XG4gIH07XG5cbiAgLyoqIEhhbmQgb25lIGRlY29kZWQgbWVzc2FnZSB0byB0aGUgdG9waWMncyBsaXN0ZW5lcnMuICovXG4gIHByaXZhdGUgZGVsaXZlcihtZXNzYWdlOiBUb3BpY01lc3NhZ2UpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMubGlzdGVuZXJzLmdldChtZXNzYWdlLnRvcGljKSA/PyBbXSkge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKGxpc3RlbmVyKG1lc3NhZ2UpKS5jYXRjaCh0aGlzLm9uRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGhlIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIGR5aW5nLCB3aGljaCBgcGdgIHJlcG9ydHMgYXMgYW4gYGVycm9yYFxuICAgKiBldmVudCByYXRoZXIgdGhhbiBhIHJlamVjdGVkIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGUgY2xpZW50IGlzIHVudXNhYmxlIGF0IHRoaXMgcG9pbnQsIHNvIGl0IGlzIGRldGFjaGVkIGFuZCByZWxlYXNlZCBhc1xuICAgKiBlcnJvcmVkICh3aGljaCBkaXNjYXJkcyBpdCkgYmVmb3JlIGFueXRoaW5nIGVsc2UuIFJlY29ubmVjdGlvbiBvbmx5IHN0YXJ0c1xuICAgKiB3aGVuIHRoZXJlIGlzIHN0aWxsIHNvbWVvbmUgdG8gZGVsaXZlciB0bywgc28gYW4gaWRsZSBvciBjbG9zaW5nIGJ1cyBkb2VzIG5vdFxuICAgKiBob2xkIGEgY29ubmVjdGlvbiBvcGVuIGNoYXNpbmcgYSBjaGFubmVsIG5vYm9keSByZWFkcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2xpZW50RXJyb3IgPSAoY2F1c2U6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgdGhpcy5vbkVycm9yKGNhdXNlKTtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuO1xuICAgIHRoaXMuY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcIm5vdGlmaWNhdGlvblwiLCB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbik7XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgdGhpcy5oYW5kbGVDbGllbnRFcnJvcik7XG4gICAgY2xpZW50LnJlbGVhc2UoY2F1c2UpO1xuICAgIGlmICh0aGlzLmNsb3NlZCB8fCB0aGlzLmxpc3RlbmVycy5zaXplID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5yZWNvbm5lY3RpbmcgPz89IHRoaXMucmVjb25uZWN0KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdGluZyA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmUtZXN0YWJsaXNoIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbiB3aXRoIGJvdW5kZWQgZXhwb25lbnRpYWwgYmFja29mZi5cbiAgICpcbiAgICogVGhlIGZpcnN0IGF0dGVtcHQgaXMgaW1tZWRpYXRlLCBzaW5jZSB0aGUgY29tbW9uIGNhc2UgaXMgYSBzaW5nbGUgZHJvcHBlZFxuICAgKiBjb25uZWN0aW9uIHRoYXQgcmVjb25uZWN0cyBhdCBvbmNlOyBzdWJzZXF1ZW50IGRlbGF5cyBkb3VibGUgZnJvbSAyNTBtcyB1cCB0b1xuICAgKiA1cyBhbmQgc3RheSB0aGVyZS4gUmV0cmllcyBpbmRlZmluaXRlbHkgcmF0aGVyIHRoYW4gZ2l2aW5nIHVwLCBiZWNhdXNlIGEgUG9zdGdyZXMgcmVzdGFydFxuICAgKiBvciBhIHJvdGF0ZWQgTGFrZWJhc2UgY3JlZGVudGlhbCBpcyBhIHJlY292ZXJhYmxlIG91dGFnZSBhbmQgYSBzaWxlbnRseSBkZWFkXG4gICAqIGxpc3RlbmVyIGlzIHdvcnNlIHRoYW4gYSBub2lzeSBvbmUuIFN0b3BzIHdoZW4gdGhlIGJ1cyBjbG9zZXMgb3IgdGhlIGxhc3RcbiAgICogbGlzdGVuZXIgbGVhdmVzLCBhbmQgcmVwb3J0cyBldmVyeSBmYWlsZWQgYXR0ZW1wdCB0aHJvdWdoIGBvbkVycm9yYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBkZWxheSA9IDA7XG4gICAgd2hpbGUgKCF0aGlzLmNsb3NlZCAmJiB0aGlzLmxpc3RlbmVycy5zaXplID4gMCkge1xuICAgICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHNsZWVwKGRlbGF5LCB0aGlzLnJlY29ubmVjdEFib3J0LnNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5vbkVycm9yKGNhdXNlKTtcbiAgICAgICAgZGVsYXkgPSBkZWxheSA9PT0gMCA/IE1JTl9SRUNPTk5FQ1RfREVMQVlfTVMgOiBNYXRoLm1pbihkZWxheSAqIDIsIE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -28,8 +28,8 @@
28
28
  "@databricks/appkit": "0.81.0"
29
29
  },
30
30
  "dependencies": {
31
- "@dbx-tools/lakebase": "^0.9.153",
32
- "@dbx-tools/shared-core": "^0.9.153",
31
+ "@dbx-tools/lakebase": "^0.9.157",
32
+ "@dbx-tools/shared-core": "^0.9.157",
33
33
  "pg": "^8.22.0"
34
34
  },
35
35
  "main": "./lib/index.js",
@@ -43,38 +43,10 @@
43
43
  "types": "./lib/index.d.ts",
44
44
  "default": "./lib/index.js"
45
45
  },
46
- "./advisory-lock": {
47
- "types": "./lib/src/advisory-lock.d.ts",
48
- "default": "./lib/src/advisory-lock.js"
49
- },
50
- "./bindings": {
51
- "types": "./lib/src/bindings.d.ts",
52
- "default": "./lib/src/bindings.js"
53
- },
54
- "./identity": {
55
- "types": "./lib/src/identity.d.ts",
56
- "default": "./lib/src/identity.js"
57
- },
58
- "./persistence": {
59
- "types": "./lib/src/persistence.d.ts",
60
- "default": "./lib/src/persistence.js"
61
- },
62
- "./session": {
63
- "types": "./lib/src/session.d.ts",
64
- "default": "./lib/src/session.js"
65
- },
66
- "./topic-bus": {
67
- "types": "./lib/src/topic-bus.d.ts",
68
- "default": "./lib/src/topic-bus.js"
69
- },
70
- "./*": {
71
- "types": "./lib/src/*/index.d.ts",
72
- "default": "./lib/src/*/index.js"
73
- },
74
46
  "./package.json": "./package.json"
75
47
  }
76
48
  },
77
- "version": "0.9.153",
49
+ "version": "0.9.157",
78
50
  "types": "./lib/index.d.ts",
79
51
  "dbxToolsConfig": {
80
52
  "tags": [
@@ -87,40 +59,11 @@
87
59
  "types": "./lib/index.d.ts",
88
60
  "default": "./lib/index.js"
89
61
  },
90
- "./advisory-lock": {
91
- "types": "./lib/src/advisory-lock.d.ts",
92
- "default": "./lib/src/advisory-lock.js"
93
- },
94
- "./bindings": {
95
- "types": "./lib/src/bindings.d.ts",
96
- "default": "./lib/src/bindings.js"
97
- },
98
- "./identity": {
99
- "types": "./lib/src/identity.d.ts",
100
- "default": "./lib/src/identity.js"
101
- },
102
- "./persistence": {
103
- "types": "./lib/src/persistence.d.ts",
104
- "default": "./lib/src/persistence.js"
105
- },
106
- "./session": {
107
- "types": "./lib/src/session.d.ts",
108
- "default": "./lib/src/session.js"
109
- },
110
- "./topic-bus": {
111
- "types": "./lib/src/topic-bus.d.ts",
112
- "default": "./lib/src/topic-bus.js"
113
- },
114
- "./*": {
115
- "types": "./lib/src/*/index.d.ts",
116
- "default": "./lib/src/*/index.js"
117
- },
118
62
  "./package.json": "./package.json"
119
63
  },
120
64
  "files": [
121
- "index.ts",
65
+ "index*.ts",
122
66
  "src",
123
- "exports.ts",
124
67
  "lib"
125
68
  ],
126
69
  "peerDependenciesMeta": {
package/src/identity.ts CHANGED
@@ -7,15 +7,18 @@
7
7
  import { createHash } from "node:crypto";
8
8
 
9
9
  import {
10
- LakebaseConnectionInputs,
11
10
  parseAddress as parseLakebaseAddress,
12
11
  parseResourcePath as parseLakebaseResourcePath,
13
12
  parseSslMode as parseLakebaseSslMode,
14
- SslMode,
15
- } from "@dbx-tools/lakebase/address";
16
- import * as hash from "@dbx-tools/shared-core/hash";
17
- import * as object from "@dbx-tools/shared-core/object";
18
- import * as stringUtils from "@dbx-tools/shared-core/string-utils";
13
+ type LakebaseConnectionInputs,
14
+ type SslMode,
15
+ } from "@dbx-tools/lakebase";
16
+ import {
17
+ fnvHashWithOptions,
18
+ toOneOrMany,
19
+ toStableKey,
20
+ toIdentifierWithOptions,
21
+ } from "@dbx-tools/shared-core";
19
22
 
20
23
  const SIGNED_BIGINT_BITS = 64;
21
24
  const MAX_CHANNEL_LENGTH = 63;
@@ -29,28 +32,27 @@ export function advisoryLockId(key: unknown, explicit = false): string {
29
32
 
30
33
  function resolveAdvisoryLockId(key: unknown): bigint {
31
34
  if (typeof key === "bigint") return BigInt.asIntN(SIGNED_BIGINT_BITS, key);
32
- const parts = object.toOneOrMany(key);
35
+ const parts = toOneOrMany(key);
33
36
  const digest = createHash("sha256");
34
37
  parts.forEach((part, index) => {
35
38
  if (index > 0) digest.update(Buffer.from([0]));
36
- digest.update(object.toStableKey(part), "utf8");
39
+ digest.update(toStableKey(part), "utf8");
37
40
  });
38
41
  return digest.digest().readBigInt64BE(0);
39
42
  }
40
43
 
41
44
  /** Derive a legal deterministic Postgres channel name from structured input. */
42
45
  export function channelName(value: unknown): string {
43
- const parts = object.toOneOrMany(value);
44
- const suffix = hash.fnvHashWithOptions(
46
+ const parts = toOneOrMany(value);
47
+ const suffix = fnvHashWithOptions(
45
48
  { length: CHANNEL_HASH_LENGTH },
46
- parts.map((part) => object.toStableKey(part)).join("\u0000"),
49
+ parts.map((part) => toStableKey(part)).join("\u0000"),
47
50
  );
48
51
  const labelled = parts.filter((part) => {
49
52
  const type = typeof part;
50
53
  return type === "string" || type === "number" || type === "boolean" || type === "bigint";
51
54
  });
52
- const body = stringUtils
53
- .toIdentifierWithOptions({ delimiter: "_" }, ...labelled)
55
+ const body = toIdentifierWithOptions({ delimiter: "_" }, ...labelled)
54
56
  .slice(0, MAX_CHANNEL_LENGTH - suffix.length - 1)
55
57
  .replace(/_+$/, "");
56
58
  const prefix = /^[A-Za-z_]/.test(body) ? body : `${CHANNEL_FALLBACK}_${body}`;
@@ -8,7 +8,7 @@
8
8
  * @module
9
9
  */
10
10
 
11
- import { object } from "@dbx-tools/shared-core";
11
+ import { type SerializableValue, toDuration } from "@dbx-tools/shared-core";
12
12
  import type { QueryResultRow } from "pg";
13
13
  import type { PgPoolLike, PgQueryable } from "./advisory-lock.ts";
14
14
  import { withAdvisoryTransactionLock } from "./advisory-lock.ts";
@@ -40,18 +40,14 @@ export interface ResolvedTopicBusPersistenceOptions {
40
40
  provision: boolean;
41
41
  }
42
42
  /** Persisted topic message plus replay cursor, scope, and expiry metadata. */
43
- export interface StoredTopicMessage<
44
- TBody extends object.SerializableValue = object.SerializableValue,
45
- > {
43
+ export interface StoredTopicMessage<TBody extends SerializableValue = SerializableValue> {
46
44
  cursor: string;
47
45
  expiresAt: string | null;
48
46
  scope: TopicPersistenceScope;
49
47
  message: TopicMessage<TBody>;
50
48
  }
51
49
  /** Ordered replay page and optional cursor for the next page. */
52
- export interface TopicHistoryPage<
53
- TBody extends object.SerializableValue = object.SerializableValue,
54
- > {
50
+ export interface TopicHistoryPage<TBody extends SerializableValue = SerializableValue> {
55
51
  messages: StoredTopicMessage<TBody>[];
56
52
  nextCursor?: string;
57
53
  }
@@ -161,7 +157,7 @@ function after(value: string | undefined, scope: TopicPersistenceScope): string
161
157
  /** Convert a persistence TTL to milliseconds, preserving disabled retention. */
162
158
  export function ttlMilliseconds(value: DurationInput | false): number | null {
163
159
  if (value === false) return null;
164
- const milliseconds = object.toDuration(value);
160
+ const milliseconds = toDuration(value);
165
161
  if (milliseconds === undefined || milliseconds <= 0) {
166
162
  throw new TypeError(`Invalid persistence TTL: ${String(value)}`);
167
163
  }
@@ -189,7 +185,7 @@ type HistoryRow = QueryResultRow & {
189
185
  };
190
186
 
191
187
  /** Read a cursor-paginated page of persisted topic history. */
192
- export async function history<TBody extends object.SerializableValue>(
188
+ export async function history<TBody extends SerializableValue>(
193
189
  queryable: PgQueryable,
194
190
  channel: string,
195
191
  topic: string,
@@ -291,7 +287,7 @@ export function decodePointer(value: string | undefined): TopicPointer | undefin
291
287
  * is gone (TTL cleanup won the race) or the reader lacks the table's grant, both
292
288
  * of which are expected on the `restricted` tier rather than errors.
293
289
  */
294
- export async function readPointer<TBody extends object.SerializableValue>(
290
+ export async function readPointer<TBody extends SerializableValue>(
295
291
  queryable: PgQueryable,
296
292
  channel: string,
297
293
  pointer: TopicPointer,
package/src/session.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { postgresEnvironmentNames, postgresRoleSchema } from "@dbx-tools/shared-core/options";
6
+ import { postgresEnvironmentNames, postgresRoleSchema } from "@dbx-tools/shared-core";
7
7
 
8
8
  /** Pool/client options required to set PostgreSQL startup parameters. */
9
9
  export interface PostgresConnectionOptions {
package/src/topic-bus.ts CHANGED
@@ -25,7 +25,17 @@
25
25
  */
26
26
 
27
27
  import { hostname } from "node:os";
28
- import { asyncUtils, errorUtils, hash, json, object, stringUtils } from "@dbx-tools/shared-core";
28
+ import {
29
+ object,
30
+ sleep,
31
+ errorMessage,
32
+ toError,
33
+ id,
34
+ parseRecord,
35
+ isSerializableValue,
36
+ firstNonEmpty,
37
+ trimToNull,
38
+ } from "@dbx-tools/shared-core";
29
39
  import type { Notification, PoolClient } from "pg";
30
40
 
31
41
  import type { PgPoolLike, PgQueryable } from "./advisory-lock.ts";
@@ -226,7 +236,7 @@ function definedMetadata(values: Record<string, SerializableValue | undefined>):
226
236
  function machineMetadata(): TopicMetadata {
227
237
  return definedMetadata({
228
238
  project:
229
- stringUtils.firstNonEmpty([
239
+ firstNonEmpty([
230
240
  process.env.DATABRICKS_APP_NAME,
231
241
  process.env.DATABRICKS_BUNDLE_NAME,
232
242
  process.env.PROJECT_NAME,
@@ -234,10 +244,10 @@ function machineMetadata(): TopicMetadata {
234
244
  ]) ?? undefined,
235
245
  hostname: hostname(),
236
246
  platform: process.platform,
237
- environment: stringUtils.trimToNull(process.env.NODE_ENV) ?? undefined,
238
- appName: stringUtils.trimToNull(process.env.DATABRICKS_APP_NAME) ?? undefined,
239
- deploymentId: stringUtils.trimToNull(process.env.DATABRICKS_APP_DEPLOYMENT_ID) ?? undefined,
240
- databricksHost: stringUtils.trimToNull(process.env.DATABRICKS_HOST) ?? undefined,
247
+ environment: trimToNull(process.env.NODE_ENV) ?? undefined,
248
+ appName: trimToNull(process.env.DATABRICKS_APP_NAME) ?? undefined,
249
+ deploymentId: trimToNull(process.env.DATABRICKS_APP_DEPLOYMENT_ID) ?? undefined,
250
+ databricksHost: trimToNull(process.env.DATABRICKS_HOST) ?? undefined,
241
251
  });
242
252
  }
243
253
 
@@ -260,9 +270,9 @@ async function senderMetadata(): Promise<TopicMetadata> {
260
270
  try {
261
271
  const context = appkit.getExecutionContext();
262
272
  return definedMetadata({
263
- senderId: stringUtils.trimToNull(context.userId) ?? undefined,
264
- senderName: stringUtils.trimToNull(context.userName) ?? undefined,
265
- senderEmail: stringUtils.trimToNull(context.userEmail) ?? undefined,
273
+ senderId: trimToNull(context.userId) ?? undefined,
274
+ senderName: trimToNull(context.userName) ?? undefined,
275
+ senderEmail: trimToNull(context.userEmail) ?? undefined,
266
276
  });
267
277
  } catch {
268
278
  return {};
@@ -280,7 +290,7 @@ async function senderMetadata(): Promise<TopicMetadata> {
280
290
  */
281
291
  function decode(value: string | undefined): TopicMessage | undefined {
282
292
  if (!value) return undefined;
283
- const record = json.parseRecord(value);
293
+ const record = parseRecord(value);
284
294
  if (
285
295
  !record ||
286
296
  typeof record.id !== "string" ||
@@ -291,8 +301,8 @@ function decode(value: string | undefined): TopicMessage | undefined {
291
301
  typeof record.metadata !== "object" ||
292
302
  Array.isArray(record.metadata) ||
293
303
  !("body" in record) ||
294
- !object.isSerializableValue(record.metadata) ||
295
- !object.isSerializableValue(record.body)
304
+ !isSerializableValue(record.metadata) ||
305
+ !isSerializableValue(record.body)
296
306
  ) {
297
307
  return undefined;
298
308
  }
@@ -402,16 +412,13 @@ export class PostgresTopicBus {
402
412
  ): Promise<TopicMessage<TBody>> {
403
413
  if (!topic.trim()) throw new TypeError("Topic must not be empty");
404
414
  if (!input.type.trim()) throw new TypeError("Message type must not be empty");
405
- if (
406
- !object.isSerializableValue(input.metadata ?? {}) ||
407
- !object.isSerializableValue(input.body)
408
- ) {
415
+ if (!isSerializableValue(input.metadata ?? {}) || !isSerializableValue(input.body)) {
409
416
  throw new TypeError("Message metadata and body must be JSON serializable without coercion");
410
417
  }
411
418
  if (this.closed) throw new Error("Postgres topic bus is closed");
412
419
  const automatic = await this.resolveMetadata();
413
420
  const message: TopicMessage<TBody> = {
414
- id: hash.id(),
421
+ id: id(),
415
422
  topic,
416
423
  type: input.type,
417
424
  metadata: { ...automatic, ...input.metadata },
@@ -422,7 +429,7 @@ export class PostgresTopicBus {
422
429
  try {
423
430
  encoded = JSON.stringify(message);
424
431
  } catch (cause) {
425
- throw new TypeError(`Message must be JSON serializable: ${errorUtils.errorMessage(cause)}`);
432
+ throw new TypeError(`Message must be JSON serializable: ${errorMessage(cause)}`);
426
433
  }
427
434
  if (!decode(encoded)) {
428
435
  throw new TypeError("Message type, metadata, and body must be JSON serializable");
@@ -557,7 +564,7 @@ export class PostgresTopicBus {
557
564
  try {
558
565
  await client.query(`UNLISTEN ${quotePostgresIdentifier(this.channelName)}`);
559
566
  } catch (cause) {
560
- releaseError = errorUtils.toError(cause);
567
+ releaseError = toError(cause);
561
568
  }
562
569
  client.release(releaseError);
563
570
  }
@@ -582,7 +589,7 @@ export class PostgresTopicBus {
582
589
  } catch (cause) {
583
590
  client.removeListener("notification", this.handleNotification);
584
591
  client.removeListener("error", this.handleClientError);
585
- client.release(errorUtils.toError(cause));
592
+ client.release(toError(cause));
586
593
  throw cause;
587
594
  }
588
595
  }
@@ -661,7 +668,7 @@ export class PostgresTopicBus {
661
668
  while (!this.closed && this.listeners.size > 0) {
662
669
  if (delay > 0) {
663
670
  try {
664
- await asyncUtils.sleep(delay, this.reconnectAbort.signal);
671
+ await sleep(delay, this.reconnectAbort.signal);
665
672
  } catch {
666
673
  return;
667
674
  }
package/exports.ts DELETED
@@ -1,26 +0,0 @@
1
- // Flat re-exports layered onto the generated `index.ts` barrel, which publishes
2
- // each module as a namespace (`advisoryLock`, `topicBus`) and does not lift
3
- // functions to the package root. These are the call-site names, so they are
4
- // importable directly from `@dbx-tools/postgres`.
5
- export { withAdvisoryLock, withAdvisoryTransactionLock } from "./src/advisory-lock.ts";
6
- export {
7
- postgresConnectionOptions,
8
- postgresRoleStatement,
9
- postgresServerSettings,
10
- quotePostgresIdentifier,
11
- resolvePostgresRole,
12
- } from "./src/session.ts";
13
- export type { PostgresConnectionOptions } from "./src/session.ts";
14
- export {
15
- decodePointer,
16
- messageBusGrantStatements,
17
- provisionMessageBusSchema,
18
- resolvePersistenceOptions,
19
- } from "./src/persistence.ts";
20
- export type {
21
- TopicPersistenceScope,
22
- TopicBusPersistenceOptions,
23
- StoredTopicMessage,
24
- TopicHistoryPage,
25
- TopicPointer,
26
- } from "./src/persistence.ts";
package/lib/exports.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export { withAdvisoryLock, withAdvisoryTransactionLock } from "./src/advisory-lock.ts";
2
- export { postgresConnectionOptions, postgresRoleStatement, postgresServerSettings, quotePostgresIdentifier, resolvePostgresRole, } from "./src/session.ts";
3
- export type { PostgresConnectionOptions } from "./src/session.ts";
4
- export { decodePointer, messageBusGrantStatements, provisionMessageBusSchema, resolvePersistenceOptions, } from "./src/persistence.ts";
5
- export type { TopicPersistenceScope, TopicBusPersistenceOptions, StoredTopicMessage, TopicHistoryPage, TopicPointer, } from "./src/persistence.ts";
package/lib/exports.js DELETED
@@ -1,8 +0,0 @@
1
- // Flat re-exports layered onto the generated `index.ts` barrel, which publishes
2
- // each module as a namespace (`advisoryLock`, `topicBus`) and does not lift
3
- // functions to the package root. These are the call-site names, so they are
4
- // importable directly from `@dbx-tools/postgres`.
5
- export { withAdvisoryLock, withAdvisoryTransactionLock } from "./src/advisory-lock.js";
6
- export { postgresConnectionOptions, postgresRoleStatement, postgresServerSettings, quotePostgresIdentifier, resolvePostgresRole, } from "./src/session.js";
7
- export { decodePointer, messageBusGrantStatements, provisionMessageBusSchema, resolvePersistenceOptions, } from "./src/persistence.js";
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4cG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsa0RBQWtEO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZGLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsbUJBQW1CLEdBQ3BCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUNMLGFBQWEsRUFDYix5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLHlCQUF5QixHQUMxQixNQUFNLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRmxhdCByZS1leHBvcnRzIGxheWVyZWQgb250byB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2AgYmFycmVsLCB3aGljaCBwdWJsaXNoZXNcbi8vIGVhY2ggbW9kdWxlIGFzIGEgbmFtZXNwYWNlIChgYWR2aXNvcnlMb2NrYCwgYHRvcGljQnVzYCkgYW5kIGRvZXMgbm90IGxpZnRcbi8vIGZ1bmN0aW9ucyB0byB0aGUgcGFja2FnZSByb290LiBUaGVzZSBhcmUgdGhlIGNhbGwtc2l0ZSBuYW1lcywgc28gdGhleSBhcmVcbi8vIGltcG9ydGFibGUgZGlyZWN0bHkgZnJvbSBgQGRieC10b29scy9wb3N0Z3Jlc2AuXG5leHBvcnQgeyB3aXRoQWR2aXNvcnlMb2NrLCB3aXRoQWR2aXNvcnlUcmFuc2FjdGlvbkxvY2sgfSBmcm9tIFwiLi9zcmMvYWR2aXNvcnktbG9jay50c1wiO1xuZXhwb3J0IHtcbiAgcG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyxcbiAgcG9zdGdyZXNSb2xlU3RhdGVtZW50LFxuICBwb3N0Z3Jlc1NlcnZlclNldHRpbmdzLFxuICBxdW90ZVBvc3RncmVzSWRlbnRpZmllcixcbiAgcmVzb2x2ZVBvc3RncmVzUm9sZSxcbn0gZnJvbSBcIi4vc3JjL3Nlc3Npb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgUG9zdGdyZXNDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zZXNzaW9uLnRzXCI7XG5leHBvcnQge1xuICBkZWNvZGVQb2ludGVyLFxuICBtZXNzYWdlQnVzR3JhbnRTdGF0ZW1lbnRzLFxuICBwcm92aXNpb25NZXNzYWdlQnVzU2NoZW1hLFxuICByZXNvbHZlUGVyc2lzdGVuY2VPcHRpb25zLFxufSBmcm9tIFwiLi9zcmMvcGVyc2lzdGVuY2UudHNcIjtcbmV4cG9ydCB0eXBlIHtcbiAgVG9waWNQZXJzaXN0ZW5jZVNjb3BlLFxuICBUb3BpY0J1c1BlcnNpc3RlbmNlT3B0aW9ucyxcbiAgU3RvcmVkVG9waWNNZXNzYWdlLFxuICBUb3BpY0hpc3RvcnlQYWdlLFxuICBUb3BpY1BvaW50ZXIsXG59IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuIl19