@bitgo/sdk-coin-tempo 1.4.0 → 1.5.1

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.
@@ -37,13 +37,30 @@ export declare class Tempo extends AbstractEthLikeNewCoins {
37
37
  */
38
38
  getMPCAlgorithm(): MPCAlgorithm;
39
39
  /**
40
- * Check if message signing is supported
40
+ * Evaluates whether an address string is valid for Tempo
41
+ * Supports addresses with optional memoId query parameter (e.g., 0x...?memoId=123)
42
+ * @param address - The address to validate
43
+ * @returns true if address is valid
41
44
  */
42
- supportsMessageSigning(): boolean;
45
+ isValidAddress(address: string): boolean;
43
46
  /**
44
- * Check if typed data signing is supported (EIP-712)
47
+ * Parse address into base address and optional memoId
48
+ * Throws InvalidAddressError for invalid address formats
49
+ * @param address - Address string, potentially with ?memoId=X suffix
50
+ * @returns Object containing address, baseAddress, and memoId (null if not present)
51
+ * @throws InvalidAddressError if address format is invalid
45
52
  */
46
- supportsSigningTypedData(): boolean;
53
+ getAddressDetails(address: string): {
54
+ address: string;
55
+ baseAddress: string;
56
+ memoId: string | null;
57
+ };
58
+ /**
59
+ * Validate that a memoId is a valid non-negative integer string
60
+ * @param memoId - The memoId to validate
61
+ * @returns true if valid
62
+ */
63
+ isValidMemoId(memoId: string): boolean;
47
64
  /**
48
65
  * Build unsigned sweep transaction for TSS
49
66
  * TODO: Implement sweep transaction logic
@@ -1 +1 @@
1
- {"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/tempo.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,gBAAgB,CAAC;AAGpE,qBAAa,KAAM,SAAQ,uBAAuB;IAChD,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAI/E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,wBAAwB,IAAI,OAAO;IAInC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;OAEG;IACH,wBAAwB,IAAI,OAAO;IAInC;;;OAGG;cACa,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;IAMpH;;;OAGG;IACG,+BAA+B,CACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMnC;;;;;OAKG;IACH,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,OAAO,GAAG,kBAAkB;CAGpF"}
1
+ {"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/tempo.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAA2C,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7G,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,gBAAgB,CAAC;AAKpE,qBAAa,KAAM,SAAQ,uBAAuB;IAChD,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAI/E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,wBAAwB,IAAI,OAAO;IAInC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAaxC;;;;;;OAMG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAsDnG;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAWtC;;;OAGG;cACa,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;IAMpH;;;OAGG;IACG,+BAA+B,CACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMnC;;;;;OAKG;IACH,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,OAAO,GAAG,kBAAkB;CAGpF"}
package/dist/src/tempo.js CHANGED
@@ -1,12 +1,48 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.Tempo = void 0;
4
37
  /**
5
38
  * @prettier
6
39
  */
7
40
  const abstract_eth_1 = require("@bitgo/abstract-eth");
41
+ const sdk_core_1 = require("@bitgo/sdk-core");
8
42
  const statics_1 = require("@bitgo/statics");
9
43
  const lib_1 = require("./lib");
44
+ const url = __importStar(require("url"));
45
+ const querystring = __importStar(require("querystring"));
10
46
  class Tempo extends abstract_eth_1.AbstractEthLikeNewCoins {
11
47
  constructor(bitgo, staticsCoin) {
12
48
  super(bitgo, staticsCoin);
@@ -55,15 +91,85 @@ class Tempo extends abstract_eth_1.AbstractEthLikeNewCoins {
55
91
  return 'ecdsa';
56
92
  }
57
93
  /**
58
- * Check if message signing is supported
94
+ * Evaluates whether an address string is valid for Tempo
95
+ * Supports addresses with optional memoId query parameter (e.g., 0x...?memoId=123)
96
+ * @param address - The address to validate
97
+ * @returns true if address is valid
59
98
  */
60
- supportsMessageSigning() {
61
- return true;
99
+ isValidAddress(address) {
100
+ if (typeof address !== 'string') {
101
+ return false;
102
+ }
103
+ try {
104
+ const { baseAddress } = this.getAddressDetails(address);
105
+ return abstract_eth_1.optionalDeps.ethUtil.isValidAddress(abstract_eth_1.optionalDeps.ethUtil.addHexPrefix(baseAddress));
106
+ }
107
+ catch (e) {
108
+ return false;
109
+ }
110
+ }
111
+ /**
112
+ * Parse address into base address and optional memoId
113
+ * Throws InvalidAddressError for invalid address formats
114
+ * @param address - Address string, potentially with ?memoId=X suffix
115
+ * @returns Object containing address, baseAddress, and memoId (null if not present)
116
+ * @throws InvalidAddressError if address format is invalid
117
+ */
118
+ getAddressDetails(address) {
119
+ if (typeof address !== 'string') {
120
+ throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}`);
121
+ }
122
+ const destinationDetails = url.parse(address);
123
+ const baseAddress = destinationDetails.pathname || '';
124
+ // No query string - just a plain address
125
+ if (destinationDetails.pathname === address) {
126
+ return {
127
+ address,
128
+ baseAddress: address,
129
+ memoId: null,
130
+ };
131
+ }
132
+ // Has query string - must contain memoId
133
+ if (!destinationDetails.query) {
134
+ throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}`);
135
+ }
136
+ const queryDetails = querystring.parse(destinationDetails.query);
137
+ // Query string must contain memoId
138
+ if (!queryDetails.memoId) {
139
+ throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}, unknown query parameters`);
140
+ }
141
+ // Only one memoId allowed
142
+ if (Array.isArray(queryDetails.memoId)) {
143
+ throw new sdk_core_1.InvalidAddressError(`memoId may only be given at most once, but found ${queryDetails.memoId.length} instances in address ${address}`);
144
+ }
145
+ // Reject if there are other query parameters besides memoId
146
+ const queryKeys = Object.keys(queryDetails);
147
+ if (queryKeys.length !== 1) {
148
+ throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}, only memoId query parameter is allowed`);
149
+ }
150
+ // Validate memoId format
151
+ if (!this.isValidMemoId(queryDetails.memoId)) {
152
+ throw new sdk_core_1.InvalidMemoIdError(`invalid address: '${address}', memoId is not valid`);
153
+ }
154
+ return {
155
+ address,
156
+ baseAddress,
157
+ memoId: queryDetails.memoId,
158
+ };
62
159
  }
63
160
  /**
64
- * Check if typed data signing is supported (EIP-712)
161
+ * Validate that a memoId is a valid non-negative integer string
162
+ * @param memoId - The memoId to validate
163
+ * @returns true if valid
65
164
  */
66
- supportsSigningTypedData() {
165
+ isValidMemoId(memoId) {
166
+ if (typeof memoId !== 'string' || memoId === '') {
167
+ return false;
168
+ }
169
+ // Must be a non-negative integer (no decimals, no negative, no leading zeros except for "0")
170
+ if (!/^(0|[1-9]\d*)$/.test(memoId)) {
171
+ return false;
172
+ }
67
173
  return true;
68
174
  }
69
175
  /**
@@ -95,4 +201,4 @@ class Tempo extends abstract_eth_1.AbstractEthLikeNewCoins {
95
201
  }
96
202
  }
97
203
  exports.Tempo = Tempo;
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxzREFNNkI7QUFHN0IsNENBQW9FO0FBQ3BFLCtCQUFnRDtBQUVoRCxNQUFhLEtBQU0sU0FBUSxzQ0FBdUI7SUFDaEQsWUFBc0IsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxLQUFLLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0I7UUFDdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxNQUFzQjtRQUM3RCxnREFBZ0Q7UUFDaEQsa0VBQWtFO1FBQ2xFLE9BQU8sRUFBd0IsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLCtCQUErQixDQUNuQyxLQUE2QixFQUM3QixNQUFlO1FBRWYsZ0RBQWdEO1FBQ2hELG1FQUFtRTtRQUNuRSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLHFCQUFxQixDQUFDLE1BQThCO1FBQzVELE9BQU8sSUFBSSw2QkFBdUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFrQyxDQUFDO0lBQ3RHLENBQUM7Q0FDRjtBQXJHRCxzQkFxR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQge1xuICBBYnN0cmFjdEV0aExpa2VOZXdDb2lucyxcbiAgUmVjb3Zlck9wdGlvbnMsXG4gIE9mZmxpbmVWYXVsdFR4SW5mbyxcbiAgVW5zaWduZWRTd2VlcFR4TVBDdjIsXG4gIFRyYW5zYWN0aW9uQnVpbGRlcixcbn0gZnJvbSAnQGJpdGdvL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgdHlwZSAqIGFzIEV0aExpa2VDb21tb24gZnJvbSAnQGV0aGVyZXVtanMvY29tbW9uJztcbmltcG9ydCB7IEJhc2VDb2luLCBCaXRHb0Jhc2UsIE1QQ0FsZ29yaXRobSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2xpYic7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbyBleHRlbmRzIEFic3RyYWN0RXRoTGlrZU5ld0NvaW5zIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIFRlbXBvIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgVGVtcG8oYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYWluIGlkZW50aWZpZXJcbiAgICovXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luPy5uYW1lIHx8ICd0ZW1wbyc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmdWxsIGNoYWluIG5hbWVcbiAgICovXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdUZW1wbyc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBiYXNlIGZhY3RvciAoMSBURU1QTyA9IDFlMTggd2VpLCBsaWtlIEV0aGVyZXVtKVxuICAgKi9cbiAgZ2V0QmFzZUZhY3RvcigpOiBudW1iZXIge1xuICAgIHJldHVybiAxZTE4O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhbHVlLWxlc3MgdHJhbnNmZXJzIGFyZSBhbGxvd2VkXG4gICAqIFRPRE86IFVwZGF0ZSBiYXNlZCBvbiBUZW1wbyByZXF1aXJlbWVudHNcbiAgICovXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgVFNTIGlzIHN1cHBvcnRlZFxuICAgKi9cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBNUEMgYWxnb3JpdGhtIChFQ0RTQSBmb3IgRVZNIGNoYWlucylcbiAgICovXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWNkc2EnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG1lc3NhZ2Ugc2lnbmluZyBpcyBzdXBwb3J0ZWRcbiAgICovXG4gIHN1cHBvcnRzTWVzc2FnZVNpZ25pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdHlwZWQgZGF0YSBzaWduaW5nIGlzIHN1cHBvcnRlZCAoRUlQLTcxMilcbiAgICovXG4gIHN1cHBvcnRzU2lnbmluZ1R5cGVkRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB1bnNpZ25lZCBzd2VlcCB0cmFuc2FjdGlvbiBmb3IgVFNTXG4gICAqIFRPRE86IEltcGxlbWVudCBzd2VlcCB0cmFuc2FjdGlvbiBsb2dpY1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkVW5zaWduZWRTd2VlcFR4blRTUyhwYXJhbXM6IFJlY292ZXJPcHRpb25zKTogUHJvbWlzZTxPZmZsaW5lVmF1bHRUeEluZm8gfCBVbnNpZ25lZFN3ZWVwVHhNUEN2Mj4ge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCB3aGVuIHJlY292ZXJ5IGxvZ2ljIGlzIG5lZWRlZFxuICAgIC8vIFJldHVybiBkdW1teSB2YWx1ZSB0byBwcmV2ZW50IGRvd25zdHJlYW0gc2VydmljZXMgZnJvbSBicmVha2luZ1xuICAgIHJldHVybiB7fSBhcyBPZmZsaW5lVmF1bHRUeEluZm87XG4gIH1cblxuICAvKipcbiAgICogUXVlcnkgYmxvY2sgZXhwbG9yZXIgZm9yIHJlY292ZXJ5IGluZm9ybWF0aW9uXG4gICAqIFRPRE86IEltcGxlbWVudCB3aGVuIFRlbXBvIGJsb2NrIGV4cGxvcmVyIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeShcbiAgICBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBhcGlLZXk/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCB3aXRoIFRlbXBvIGJsb2NrIGV4cGxvcmVyIEFQSVxuICAgIC8vIFJldHVybiBlbXB0eSBvYmplY3QgdG8gcHJldmVudCBkb3duc3RyZWFtIHNlcnZpY2VzIGZyb20gYnJlYWtpbmdcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zYWN0aW9uIGJ1aWxkZXIgZm9yIFRlbXBvXG4gICAqIFJldHVybnMgYSBUSVAtMjAgdHJhbnNhY3Rpb24gYnVpbGRlciBmb3IgVGVtcG8tc3BlY2lmaWMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gY29tbW9uIC0gT3B0aW9uYWwgY29tbW9uIGNoYWluIGNvbmZpZ3VyYXRpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFRyYW5zYWN0aW9uQnVpbGRlcihjb21tb24/OiBFdGhMaWtlQ29tbW9uLmRlZmF1bHQpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KHRoaXMuZ2V0QmFzZUNoYWluKCkpKSBhcyB1bmtub3duIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgfVxufVxuIl19
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxzREFPNkI7QUFFN0IsOENBQTZHO0FBQzdHLDRDQUFvRTtBQUNwRSwrQkFBZ0Q7QUFDaEQseUNBQTJCO0FBQzNCLHlEQUEyQztBQUUzQyxNQUFhLEtBQU0sU0FBUSxzQ0FBdUI7SUFDaEQsWUFBc0IsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxLQUFLLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0I7UUFDdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7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RUQ7OztPQUdHO0lBQ08sS0FBSyxDQUFDLHdCQUF3QixDQUFDLE1BQXNCO1FBQzdELGdEQUFnRDtRQUNoRCxrRUFBa0U7UUFDbEUsT0FBTyxFQUF3QixDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsK0JBQStCLENBQ25DLEtBQTZCLEVBQzdCLE1BQWU7UUFFZixnREFBZ0Q7UUFDaEQsbUVBQW1FO1FBQ25FLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08scUJBQXFCLENBQUMsTUFBOEI7UUFDNUQsT0FBTyxJQUFJLDZCQUF1QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQWtDLENBQUM7SUFDdEcsQ0FBQztDQUNGO0FBdkxELHNCQXVMQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7XG4gIEFic3RyYWN0RXRoTGlrZU5ld0NvaW5zLFxuICBSZWNvdmVyT3B0aW9ucyxcbiAgT2ZmbGluZVZhdWx0VHhJbmZvLFxuICBVbnNpZ25lZFN3ZWVwVHhNUEN2MixcbiAgVHJhbnNhY3Rpb25CdWlsZGVyLFxuICBvcHRpb25hbERlcHMsXG59IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1ldGgnO1xuaW1wb3J0IHR5cGUgKiBhcyBFdGhMaWtlQ29tbW9uIGZyb20gJ0BldGhlcmV1bWpzL2NvbW1vbic7XG5pbXBvcnQgeyBCYXNlQ29pbiwgQml0R29CYXNlLCBJbnZhbGlkQWRkcmVzc0Vycm9yLCBJbnZhbGlkTWVtb0lkRXJyb3IsIE1QQ0FsZ29yaXRobSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAndXJsJztcbmltcG9ydCAqIGFzIHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5c3RyaW5nJztcblxuZXhwb3J0IGNsYXNzIFRlbXBvIGV4dGVuZHMgQWJzdHJhY3RFdGhMaWtlTmV3Q29pbnMge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgVGVtcG8gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBUZW1wbyhiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY2hhaW4gaWRlbnRpZmllclxuICAgKi9cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4/Lm5hbWUgfHwgJ3RlbXBvJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZ1bGwgY2hhaW4gbmFtZVxuICAgKi9cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1RlbXBvJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJhc2UgZmFjdG9yICgxIFRFTVBPID0gMWUxOCB3ZWksIGxpa2UgRXRoZXJldW0pXG4gICAqL1xuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDFlMTg7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdmFsdWUtbGVzcyB0cmFuc2ZlcnMgYXJlIGFsbG93ZWRcbiAgICogVE9ETzogVXBkYXRlIGJhc2VkIG9uIFRlbXBvIHJlcXVpcmVtZW50c1xuICAgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBUU1MgaXMgc3VwcG9ydGVkXG4gICAqL1xuICBzdXBwb3J0c1RzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIE1QQyBhbGdvcml0aG0gKEVDRFNBIGZvciBFVk0gY2hhaW5zKVxuICAgKi9cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuICdlY2RzYSc7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHdoZXRoZXIgYW4gYWRkcmVzcyBzdHJpbmcgaXMgdmFsaWQgZm9yIFRlbXBvXG4gICAqIFN1cHBvcnRzIGFkZHJlc3NlcyB3aXRoIG9wdGlvbmFsIG1lbW9JZCBxdWVyeSBwYXJhbWV0ZXIgKGUuZy4sIDB4Li4uP21lbW9JZD0xMjMpXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGFkZHJlc3MgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYmFzZUFkZHJlc3MgfSA9IHRoaXMuZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzcyk7XG4gICAgICByZXR1cm4gb3B0aW9uYWxEZXBzLmV0aFV0aWwuaXNWYWxpZEFkZHJlc3Mob3B0aW9uYWxEZXBzLmV0aFV0aWwuYWRkSGV4UHJlZml4KGJhc2VBZGRyZXNzKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhZGRyZXNzIGludG8gYmFzZSBhZGRyZXNzIGFuZCBvcHRpb25hbCBtZW1vSWRcbiAgICogVGhyb3dzIEludmFsaWRBZGRyZXNzRXJyb3IgZm9yIGludmFsaWQgYWRkcmVzcyBmb3JtYXRzXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gQWRkcmVzcyBzdHJpbmcsIHBvdGVudGlhbGx5IHdpdGggP21lbW9JZD1YIHN1ZmZpeFxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBhZGRyZXNzLCBiYXNlQWRkcmVzcywgYW5kIG1lbW9JZCAobnVsbCBpZiBub3QgcHJlc2VudClcbiAgICogQHRocm93cyBJbnZhbGlkQWRkcmVzc0Vycm9yIGlmIGFkZHJlc3MgZm9ybWF0IGlzIGludmFsaWRcbiAgICovXG4gIGdldEFkZHJlc3NEZXRhaWxzKGFkZHJlc3M6IHN0cmluZyk6IHsgYWRkcmVzczogc3RyaW5nOyBiYXNlQWRkcmVzczogc3RyaW5nOyBtZW1vSWQ6IHN0cmluZyB8IG51bGwgfSB7XG4gICAgaWYgKHR5cGVvZiBhZGRyZXNzICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc3RpbmF0aW9uRGV0YWlscyA9IHVybC5wYXJzZShhZGRyZXNzKTtcbiAgICBjb25zdCBiYXNlQWRkcmVzcyA9IGRlc3RpbmF0aW9uRGV0YWlscy5wYXRobmFtZSB8fCAnJztcblxuICAgIC8vIE5vIHF1ZXJ5IHN0cmluZyAtIGp1c3QgYSBwbGFpbiBhZGRyZXNzXG4gICAgaWYgKGRlc3RpbmF0aW9uRGV0YWlscy5wYXRobmFtZSA9PT0gYWRkcmVzcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgYmFzZUFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICAgIG1lbW9JZDogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFzIHF1ZXJ5IHN0cmluZyAtIG11c3QgY29udGFpbiBtZW1vSWRcbiAgICBpZiAoIWRlc3RpbmF0aW9uRGV0YWlscy5xdWVyeSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5RGV0YWlscyA9IHF1ZXJ5c3RyaW5nLnBhcnNlKGRlc3RpbmF0aW9uRGV0YWlscy5xdWVyeSk7XG5cbiAgICAvLyBRdWVyeSBzdHJpbmcgbXVzdCBjb250YWluIG1lbW9JZFxuICAgIGlmICghcXVlcnlEZXRhaWxzLm1lbW9JZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzfSwgdW5rbm93biBxdWVyeSBwYXJhbWV0ZXJzYCk7XG4gICAgfVxuXG4gICAgLy8gT25seSBvbmUgbWVtb0lkIGFsbG93ZWRcbiAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVyeURldGFpbHMubWVtb0lkKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoXG4gICAgICAgIGBtZW1vSWQgbWF5IG9ubHkgYmUgZ2l2ZW4gYXQgbW9zdCBvbmNlLCBidXQgZm91bmQgJHtxdWVyeURldGFpbHMubWVtb0lkLmxlbmd0aH0gaW5zdGFuY2VzIGluIGFkZHJlc3MgJHthZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVqZWN0IGlmIHRoZXJlIGFyZSBvdGhlciBxdWVyeSBwYXJhbWV0ZXJzIGJlc2lkZXMgbWVtb0lkXG4gICAgY29uc3QgcXVlcnlLZXlzID0gT2JqZWN0LmtleXMocXVlcnlEZXRhaWxzKTtcbiAgICBpZiAocXVlcnlLZXlzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzfSwgb25seSBtZW1vSWQgcXVlcnkgcGFyYW1ldGVyIGlzIGFsbG93ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZW1vSWQgZm9ybWF0XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRNZW1vSWQocXVlcnlEZXRhaWxzLm1lbW9JZCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkTWVtb0lkRXJyb3IoYGludmFsaWQgYWRkcmVzczogJyR7YWRkcmVzc30nLCBtZW1vSWQgaXMgbm90IHZhbGlkYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3MsXG4gICAgICBiYXNlQWRkcmVzcyxcbiAgICAgIG1lbW9JZDogcXVlcnlEZXRhaWxzLm1lbW9JZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgYSBtZW1vSWQgaXMgYSB2YWxpZCBub24tbmVnYXRpdmUgaW50ZWdlciBzdHJpbmdcbiAgICogQHBhcmFtIG1lbW9JZCAtIFRoZSBtZW1vSWQgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZE1lbW9JZChtZW1vSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgbWVtb0lkICE9PSAnc3RyaW5nJyB8fCBtZW1vSWQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciAobm8gZGVjaW1hbHMsIG5vIG5lZ2F0aXZlLCBubyBsZWFkaW5nIHplcm9zIGV4Y2VwdCBmb3IgXCIwXCIpXG4gICAgaWYgKCEvXigwfFsxLTldXFxkKikkLy50ZXN0KG1lbW9JZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdW5zaWduZWQgc3dlZXAgdHJhbnNhY3Rpb24gZm9yIFRTU1xuICAgKiBUT0RPOiBJbXBsZW1lbnQgc3dlZXAgdHJhbnNhY3Rpb24gbG9naWNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZFVuc2lnbmVkU3dlZXBUeG5UU1MocGFyYW1zOiBSZWNvdmVyT3B0aW9ucyk6IFByb21pc2U8T2ZmbGluZVZhdWx0VHhJbmZvIHwgVW5zaWduZWRTd2VlcFR4TVBDdjI+IHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgd2hlbiByZWNvdmVyeSBsb2dpYyBpcyBuZWVkZWRcbiAgICAvLyBSZXR1cm4gZHVtbXkgdmFsdWUgdG8gcHJldmVudCBkb3duc3RyZWFtIHNlcnZpY2VzIGZyb20gYnJlYWtpbmdcbiAgICByZXR1cm4ge30gYXMgT2ZmbGluZVZhdWx0VHhJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IGJsb2NrIGV4cGxvcmVyIGZvciByZWNvdmVyeSBpbmZvcm1hdGlvblxuICAgKiBUT0RPOiBJbXBsZW1lbnQgd2hlbiBUZW1wbyBibG9jayBleHBsb3JlciBpcyBhdmFpbGFibGVcbiAgICovXG4gIGFzeW5jIHJlY292ZXJ5QmxvY2tjaGFpbkV4cGxvcmVyUXVlcnkoXG4gICAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgYXBpS2V5Pzogc3RyaW5nXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgd2l0aCBUZW1wbyBibG9jayBleHBsb3JlciBBUElcbiAgICAvLyBSZXR1cm4gZW1wdHkgb2JqZWN0IHRvIHByZXZlbnQgZG93bnN0cmVhbSBzZXJ2aWNlcyBmcm9tIGJyZWFraW5nXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFuc2FjdGlvbiBidWlsZGVyIGZvciBUZW1wb1xuICAgKiBSZXR1cm5zIGEgVElQLTIwIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZm9yIFRlbXBvLXNwZWNpZmljIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGNvbW1vbiAtIE9wdGlvbmFsIGNvbW1vbiBjaGFpbiBjb25maWd1cmF0aW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXRUcmFuc2FjdGlvbkJ1aWxkZXIoY29tbW9uPzogRXRoTGlrZUNvbW1vbi5kZWZhdWx0KTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCh0aGlzLmdldEJhc2VDaGFpbigpKSkgYXMgdW5rbm93biBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gIH1cbn1cbiJdfQ==
@@ -1,9 +1,44 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  const tempo_1 = require("../../src/tempo");
4
37
  const ttempo_1 = require("../../src/ttempo");
5
38
  const sdk_api_1 = require("@bitgo/sdk-api");
6
39
  const sdk_test_1 = require("@bitgo/sdk-test");
40
+ const sdk_core_1 = require("@bitgo/sdk-core");
41
+ const should = __importStar(require("should"));
7
42
  describe('Tempo Coin', function () {
8
43
  let bitgo;
9
44
  let basecoin;
@@ -36,6 +71,84 @@ describe('Tempo Coin', function () {
36
71
  basecoin.getFullName().should.equal('Tempo');
37
72
  basecoin.getBaseFactor().should.equal(1e18);
38
73
  });
74
+ describe('Address Validation', function () {
75
+ it('should validate plain EVM address', function () {
76
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f').should.equal(true);
77
+ basecoin.isValidAddress('0x0000000000000000000000000000000000000000').should.equal(true);
78
+ });
79
+ it('should validate address with memoId', function () {
80
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8').should.equal(true);
81
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=0').should.equal(true);
82
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=12345').should.equal(true);
83
+ });
84
+ it('should reject invalid addresses', function () {
85
+ basecoin.isValidAddress('invalid').should.equal(false);
86
+ basecoin.isValidAddress('').should.equal(false);
87
+ basecoin.isValidAddress('0x123').should.equal(false); // Too short
88
+ });
89
+ it('should reject address with invalid memoId', function () {
90
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=abc').should.equal(false);
91
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=-1').should.equal(false);
92
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1.5').should.equal(false);
93
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=01').should.equal(false); // Leading zero
94
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=').should.equal(false); // Empty memoId
95
+ });
96
+ it('should reject address with unknown query parameters', function () {
97
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?invalid=123').should.equal(false);
98
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?foo=bar').should.equal(false);
99
+ });
100
+ it('should reject address with multiple memoId parameters', function () {
101
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&memoId=2').should.equal(false);
102
+ });
103
+ it('should reject address with extra query parameters besides memoId', function () {
104
+ basecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&foo=bar').should.equal(false);
105
+ });
106
+ });
107
+ describe('getAddressDetails', function () {
108
+ it('should get address details without memoId', function () {
109
+ const addressDetails = basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f');
110
+ addressDetails.address.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f');
111
+ addressDetails.baseAddress.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f');
112
+ should.not.exist(addressDetails.memoId);
113
+ });
114
+ it('should get address details with memoId', function () {
115
+ const addressDetails = basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8');
116
+ addressDetails.address.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8');
117
+ addressDetails.baseAddress.should.equal('0x2476602c78e9a5e0563320c78878faa3952b256f');
118
+ addressDetails.memoId.should.equal('8');
119
+ });
120
+ it('should throw on invalid memoId address', function () {
121
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=abc')).should.throw(sdk_core_1.InvalidMemoIdError);
122
+ });
123
+ it('should throw on multiple memoId address', function () {
124
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&memoId=2')).should.throw(sdk_core_1.InvalidAddressError);
125
+ });
126
+ it('should throw on unknown query parameters', function () {
127
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?invalid=8')).should.throw(sdk_core_1.InvalidAddressError);
128
+ });
129
+ it('should throw on empty memoId', function () {
130
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=')).should.throw(sdk_core_1.InvalidAddressError);
131
+ });
132
+ it('should throw on extra query parameters besides memoId', function () {
133
+ (() => basecoin.getAddressDetails('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=1&foo=bar')).should.throw(sdk_core_1.InvalidAddressError);
134
+ });
135
+ });
136
+ describe('isValidMemoId', function () {
137
+ it('should validate correct memoIds', function () {
138
+ basecoin.isValidMemoId('0').should.equal(true);
139
+ basecoin.isValidMemoId('1').should.equal(true);
140
+ basecoin.isValidMemoId('12345').should.equal(true);
141
+ basecoin.isValidMemoId('999999999999').should.equal(true);
142
+ });
143
+ it('should reject invalid memoIds', function () {
144
+ basecoin.isValidMemoId('').should.equal(false);
145
+ basecoin.isValidMemoId('-1').should.equal(false);
146
+ basecoin.isValidMemoId('1.5').should.equal(false);
147
+ basecoin.isValidMemoId('abc').should.equal(false);
148
+ basecoin.isValidMemoId('01').should.equal(false); // Leading zero
149
+ basecoin.isValidMemoId('00').should.equal(false);
150
+ });
151
+ });
39
152
  describe('Testnet', function () {
40
153
  let testnetBasecoin;
41
154
  before(function () {
@@ -50,6 +163,9 @@ describe('Tempo Coin', function () {
50
163
  testnetBasecoin.getFullName().should.equal('Testnet Tempo');
51
164
  testnetBasecoin.getBaseFactor().should.equal(1e18);
52
165
  });
166
+ it('should validate address with memoId on testnet', function () {
167
+ testnetBasecoin.isValidAddress('0x2476602c78e9a5e0563320c78878faa3952b256f?memoId=8').should.equal(true);
168
+ });
53
169
  });
54
170
  });
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQ0FBd0M7QUFDeEMsNkNBQTBDO0FBQzFDLDRDQUEwQztBQUMxQyw4Q0FBMEQ7QUFJMUQsUUFBUSxDQUFDLFlBQVksRUFBRTtJQUNyQixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFFYixNQUFNLFlBQVksR0FBRyxDQUFDLElBQVksRUFBRSxTQUF1QyxFQUFRLEVBQUU7UUFDbkYsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDNUMsNkJBQTZCO1lBQzdCLE1BQU0sZUFBZSxHQUE4QjtnQkFDakQsSUFBSTtnQkFDSixRQUFRLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlO2dCQUN0RCxPQUFPLEVBQUU7b0JBQ1AsSUFBSSxFQUFFLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztpQkFDeEM7Z0JBQ1IsUUFBUSxFQUFFLEVBQUU7YUFDTixDQUFDO1lBQ1QsT0FBTyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFLLENBQUMsQ0FBQztRQUM3QixLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7UUFDeEMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2xCLElBQUksZUFBZSxDQUFDO1FBRXBCLE1BQU0sQ0FBQztZQUNMLFlBQVksQ0FBQyxRQUFRLEVBQUUsZUFBTSxDQUFDLENBQUM7WUFDL0IsZUFBZSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7WUFDeEMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFNLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RCxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbyB9IGZyb20gJy4uLy4uL3NyYy90ZW1wbyc7XG5pbXBvcnQgeyBUdGVtcG8gfSBmcm9tICcuLi8uLi9zcmMvdHRlbXBvJztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcblxuZGVzY3JpYmUoJ1RlbXBvIENvaW4nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYmFzZWNvaW47XG5cbiAgY29uc3QgcmVnaXN0ZXJDb2luID0gKG5hbWU6IHN0cmluZywgY29pbkNsYXNzOiB0eXBlb2YgVGVtcG8gfCB0eXBlb2YgVHRlbXBvKTogdm9pZCA9PiB7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKG5hbWUsIChiaXRnbzogQml0R29CYXNlKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBtb2NrIHN0YXRpY3MgY29pblxuICAgICAgY29uc3QgbW9ja1N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+ID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBmdWxsTmFtZTogbmFtZSA9PT0gJ3RlbXBvJyA/ICdUZW1wbycgOiAnVGVzdG5ldCBUZW1wbycsXG4gICAgICAgIG5ldHdvcms6IHtcbiAgICAgICAgICB0eXBlOiBuYW1lID09PSAndGVtcG8nID8gJ21haW5uZXQnIDogJ3Rlc3RuZXQnLFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgfSBhcyBhbnk7XG4gICAgICByZXR1cm4gY29pbkNsYXNzLmNyZWF0ZUluc3RhbmNlKGJpdGdvLCBtb2NrU3RhdGljc0NvaW4pO1xuICAgIH0pO1xuICB9O1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgcmVnaXN0ZXJDb2luKCd0ZW1wbycsIFRlbXBvKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RlbXBvJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgdGhlIGNvaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmFzZWNvaW4gPSBiaXRnby5jb2luKCd0ZW1wbycpO1xuICAgIGJhc2Vjb2luLnNob3VsZC5iZS5hbi5pbnN0YW5jZW9mKFRlbXBvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgY29pbiBuYW1lJywgZnVuY3Rpb24gKCkge1xuICAgIGJhc2Vjb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCd0ZW1wbycpO1xuICAgIGJhc2Vjb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZW1wbycpO1xuICAgIGJhc2Vjb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWUxOCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUZXN0bmV0JywgZnVuY3Rpb24gKCkge1xuICAgIGxldCB0ZXN0bmV0QmFzZWNvaW47XG5cbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgcmVnaXN0ZXJDb2luKCd0dGVtcG8nLCBUdGVtcG8pO1xuICAgICAgdGVzdG5ldEJhc2Vjb2luID0gYml0Z28uY29pbigndHRlbXBvJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluc3RhbnRpYXRlIHRoZSB0ZXN0bmV0IGNvaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoVHRlbXBvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IHRlc3RuZXQgY29pbiBuYW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgdGVzdG5ldEJhc2Vjb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCd0dGVtcG8nKTtcbiAgICAgIHRlc3RuZXRCYXNlY29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdG5ldCBUZW1wbycpO1xuICAgICAgdGVzdG5ldEJhc2Vjb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoMWUxOCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBd0M7QUFDeEMsNkNBQTBDO0FBQzFDLDRDQUEwQztBQUMxQyw4Q0FBMEQ7QUFDMUQsOENBQXFGO0FBRXJGLCtDQUFpQztBQUVqQyxRQUFRLENBQUMsWUFBWSxFQUFFO0lBQ3JCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQVEsQ0FBQztJQUViLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBWSxFQUFFLFNBQXVDLEVBQVEsRUFBRTtRQUNuRixLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQWdCLEVBQUUsRUFBRTtZQUM1Qyw2QkFBNkI7WUFDN0IsTUFBTSxlQUFlLEdBQThCO2dCQUNqRCxJQUFJO2dCQUNKLFFBQVEsRUFBRSxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWU7Z0JBQ3RELE9BQU8sRUFBRTtvQkFDUCxJQUFJLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUN4QztnQkFDUixRQUFRLEVBQUUsRUFBRTthQUNOLENBQUM7WUFDVCxPQUFPLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxZQUFZLENBQUMsT0FBTyxFQUFFLGFBQUssQ0FBQyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxrQkFBa0IsRUFB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QUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFNBQVMsRUFBRTtRQUNsQixJQUFJLGVBQWUsQ0FBQztRQUVwQixNQUFNLENBQUM7WUFDTCxZQUFZLENBQUMsUUFBUSxFQUFFLGVBQU0sQ0FBQyxDQUFDO1lBQy9CLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFDQUFxQyxFQUFFO1lBQ3hDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBTSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUU7WUFDaEQsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUQsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsZUFBZSxDQUFDLGNBQWMsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0csQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcG8gfSBmcm9tICcuLi8uLi9zcmMvdGVtcG8nO1xuaW1wb3J0IHsgVHRlbXBvIH0gZnJvbSAnLi4vLi4vc3JjL3R0ZW1wbyc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQmFzZSwgSW52YWxpZEFkZHJlc3NFcnJvciwgSW52YWxpZE1lbW9JZEVycm9yIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5kZXNjcmliZSgnVGVtcG8gQ29pbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjtcblxuICBjb25zdCByZWdpc3RlckNvaW4gPSAobmFtZTogc3RyaW5nLCBjb2luQ2xhc3M6IHR5cGVvZiBUZW1wbyB8IHR5cGVvZiBUdGVtcG8pOiB2b2lkID0+IHtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIobmFtZSwgKGJpdGdvOiBCaXRHb0Jhc2UpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIG1vY2sgc3RhdGljcyBjb2luXG4gICAgICBjb25zdCBtb2NrU3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4gPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZ1bGxOYW1lOiBuYW1lID09PSAndGVtcG8nID8gJ1RlbXBvJyA6ICdUZXN0bmV0IFRlbXBvJyxcbiAgICAgICAgbmV0d29yazoge1xuICAgICAgICAgIHR5cGU6IG5hbWUgPT09ICd0ZW1wbycgPyAnbWFpbm5ldCcgOiAndGVzdG5ldCcsXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICB9IGFzIGFueTtcbiAgICAgIHJldHVybiBjb2luQ2xhc3MuY3JlYXRlSW5zdGFuY2UoYml0Z28sIG1vY2tTdGF0aWNzQ29pbik7XG4gICAgfSk7XG4gIH07XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICByZWdpc3RlckNvaW4oJ3RlbXBvJywgVGVtcG8pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVtcG8nKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSB0aGUgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RlbXBvJyk7XG4gICAgYmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoVGVtcG8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBjb2luIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3RlbXBvJyk7XG4gICAgYmFzZWNvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1RlbXBvJyk7XG4gICAgYmFzZWNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0FkZHJlc3MgVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHBsYWluIEVWTSBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2ZicpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFkZHJlc3Mgd2l0aCBtZW1vSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD04Jykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9MCcpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTEyMzQ1Jykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnaW52YWxpZCcpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDEyMycpLnNob3VsZC5lcXVhbChmYWxzZSk7IC8vIFRvbyBzaG9ydFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzcyB3aXRoIGludmFsaWQgbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9YWJjJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPS0xJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTEuNScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0wMScpLnNob3VsZC5lcXVhbChmYWxzZSk7IC8vIExlYWRpbmcgemVyb1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9Jykuc2hvdWxkLmVxdWFsKGZhbHNlKTsgLy8gRW1wdHkgbWVtb0lkXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhZGRyZXNzIHdpdGggdW5rbm93biBxdWVyeSBwYXJhbWV0ZXJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9pbnZhbGlkPTEyMycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP2Zvbz1iYXInKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzcyB3aXRoIG11bHRpcGxlIG1lbW9JZCBwYXJhbWV0ZXJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9MSZtZW1vSWQ9MicpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhZGRyZXNzIHdpdGggZXh0cmEgcXVlcnkgcGFyYW1ldGVycyBiZXNpZGVzIG1lbW9JZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTEmZm9vPWJhcicpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzRGV0YWlscycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGdldCBhZGRyZXNzIGRldGFpbHMgd2l0aG91dCBtZW1vSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IGJhc2Vjb2luLmdldEFkZHJlc3NEZXRhaWxzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmYnKTtcbiAgICAgIGFkZHJlc3NEZXRhaWxzLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmYnKTtcbiAgICAgIGFkZHJlc3NEZXRhaWxzLmJhc2VBZGRyZXNzLnNob3VsZC5lcXVhbCgnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmJyk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KGFkZHJlc3NEZXRhaWxzLm1lbW9JZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhZGRyZXNzIGRldGFpbHMgd2l0aCBtZW1vSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IGJhc2Vjb2luLmdldEFkZHJlc3NEZXRhaWxzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTgnKTtcbiAgICAgIGFkZHJlc3NEZXRhaWxzLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTgnKTtcbiAgICAgIGFkZHJlc3NEZXRhaWxzLmJhc2VBZGRyZXNzLnNob3VsZC5lcXVhbCgnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmJyk7XG4gICAgICBhZGRyZXNzRGV0YWlscy5tZW1vSWQuc2hvdWxkLmVxdWFsKCc4Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGludmFsaWQgbWVtb0lkIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAoKCkgPT4gYmFzZWNvaW4uZ2V0QWRkcmVzc0RldGFpbHMoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9YWJjJykpLnNob3VsZC50aHJvdyhcbiAgICAgICAgSW52YWxpZE1lbW9JZEVycm9yXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBtdWx0aXBsZSBtZW1vSWQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiBiYXNlY29pbi5nZXRBZGRyZXNzRGV0YWlscygnMHgyNDc2NjAyYzc4ZTlhNWUwNTYzMzIwYzc4ODc4ZmFhMzk1MmIyNTZmP21lbW9JZD0xJm1lbW9JZD0yJykpLnNob3VsZC50aHJvdyhcbiAgICAgICAgSW52YWxpZEFkZHJlc3NFcnJvclxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgb24gdW5rbm93biBxdWVyeSBwYXJhbWV0ZXJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+IGJhc2Vjb2luLmdldEFkZHJlc3NEZXRhaWxzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/aW52YWxpZD04JykpLnNob3VsZC50aHJvdyhcbiAgICAgICAgSW52YWxpZEFkZHJlc3NFcnJvclxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgb24gZW1wdHkgbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+IGJhc2Vjb2luLmdldEFkZHJlc3NEZXRhaWxzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPScpKS5zaG91bGQudGhyb3coXG4gICAgICAgIEludmFsaWRBZGRyZXNzRXJyb3JcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGV4dHJhIHF1ZXJ5IHBhcmFtZXRlcnMgYmVzaWRlcyBtZW1vSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAoKCkgPT4gYmFzZWNvaW4uZ2V0QWRkcmVzc0RldGFpbHMoJzB4MjQ3NjYwMmM3OGU5YTVlMDU2MzMyMGM3ODg3OGZhYTM5NTJiMjU2Zj9tZW1vSWQ9MSZmb289YmFyJykpLnNob3VsZC50aHJvdyhcbiAgICAgICAgSW52YWxpZEFkZHJlc3NFcnJvclxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRNZW1vSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IG1lbW9JZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCcwJykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnMScpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJzEyMzQ1Jykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnOTk5OTk5OTk5OTk5Jykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCBtZW1vSWRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJy0xJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJzEuNScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkTWVtb0lkKCdhYmMnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZE1lbW9JZCgnMDEnKS5zaG91bGQuZXF1YWwoZmFsc2UpOyAvLyBMZWFkaW5nIHplcm9cbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRNZW1vSWQoJzAwJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Rlc3RuZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRlc3RuZXRCYXNlY29pbjtcblxuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICByZWdpc3RlckNvaW4oJ3R0ZW1wbycsIFR0ZW1wbyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4gPSBiaXRnby5jb2luKCd0dGVtcG8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgdGhlIHRlc3RuZXQgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRlc3RuZXRCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUdGVtcG8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgdGVzdG5ldCBjb2luIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R0ZW1wbycpO1xuICAgICAgdGVzdG5ldEJhc2Vjb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0bmV0IFRlbXBvJyk7XG4gICAgICB0ZXN0bmV0QmFzZWNvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzcyB3aXRoIG1lbW9JZCBvbiB0ZXN0bmV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdGVzdG5ldEJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcweDI0NzY2MDJjNzhlOWE1ZTA1NjMzMjBjNzg4NzhmYWEzOTUyYjI1NmY/bWVtb0lkPTgnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=