@bitgo/sdk-lib-safes 1.2.1 → 1.4.0

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.
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * @prettier
3
3
  *
4
- * @experimental Pure Safe derivation leaf. Never imports sdk-core/BaseCoin/Wallet/Safe/key-card.
4
+ * @experimental Pure Safe derivation and keycard box codec leaf. Never imports sdk-core/BaseCoin/Wallet/Safe/key-card.
5
5
  */
6
6
  export * from './ed25519KeyDeriver';
7
7
  export * from './ed25519Pub';
8
+ export * from './keycardCodec';
8
9
  export * from './safeDerivation';
9
- export * from './safeRecovery';
10
10
  export * from './safeSlot';
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
package/dist/src/index.js CHANGED
@@ -17,11 +17,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  /**
18
18
  * @prettier
19
19
  *
20
- * @experimental Pure Safe derivation leaf. Never imports sdk-core/BaseCoin/Wallet/Safe/key-card.
20
+ * @experimental Pure Safe derivation and keycard box codec leaf. Never imports sdk-core/BaseCoin/Wallet/Safe/key-card.
21
21
  */
22
22
  __exportStar(require("./ed25519KeyDeriver"), exports);
23
23
  __exportStar(require("./ed25519Pub"), exports);
24
+ __exportStar(require("./keycardCodec"), exports);
24
25
  __exportStar(require("./safeDerivation"), exports);
25
- __exportStar(require("./safeRecovery"), exports);
26
26
  __exportStar(require("./safeSlot"), exports);
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0dBSUc7QUFDSCxzREFBb0M7QUFDcEMsK0NBQTZCO0FBQzdCLG1EQUFpQztBQUNqQyxpREFBK0I7QUFDL0IsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFB1cmUgU2FmZSBkZXJpdmF0aW9uIGxlYWYuIE5ldmVyIGltcG9ydHMgc2RrLWNvcmUvQmFzZUNvaW4vV2FsbGV0L1NhZmUva2V5LWNhcmQuXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vZWQyNTUxOUtleURlcml2ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9lZDI1NTE5UHViJztcbmV4cG9ydCAqIGZyb20gJy4vc2FmZURlcml2YXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlUmVjb3ZlcnknO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlU2xvdCc7XG4iXX0=
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0dBSUc7QUFDSCxzREFBb0M7QUFDcEMsK0NBQTZCO0FBQzdCLGlEQUErQjtBQUMvQixtREFBaUM7QUFDakMsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFB1cmUgU2FmZSBkZXJpdmF0aW9uIGFuZCBrZXljYXJkIGJveCBjb2RlYyBsZWFmLiBOZXZlciBpbXBvcnRzIHNkay1jb3JlL0Jhc2VDb2luL1dhbGxldC9TYWZlL2tleS1jYXJkLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2VkMjU1MTlLZXlEZXJpdmVyJztcbmV4cG9ydCAqIGZyb20gJy4vZWQyNTUxOVB1Yic7XG5leHBvcnQgKiBmcm9tICcuL2tleWNhcmRDb2RlYyc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmVEZXJpdmF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vc2FmZVNsb3QnO1xuIl19
@@ -0,0 +1,24 @@
1
+ import type { RootKeyType } from '@bitgo/public-types';
2
+ /**
3
+ * Identifier for one of a safe's four roots (one per signing scheme). Each value is the
4
+ * root's `rootKeyType`, which is also the key used in the keycard's per-box JSON.
5
+ */
6
+ export type SafeRootKeyType = RootKeyType;
7
+ /**
8
+ * The JSON object encoded in a safe keycard box (A/B/C): the four roots keyed by
9
+ * {@link SafeRootKeyType}. Values are per-root ciphertext for A/B (encryptedPrv or
10
+ * reducedEncryptedPrv; safe MPC ciphertext decrypts to a versioned signing+VRF envelope) or
11
+ * public keys for C. The root-key-type keys are self-identifying, so a
12
+ * consumer parses by key rather than by size/offset.
13
+ */
14
+ export type SafeKeycardRoots = Record<SafeRootKeyType, string>;
15
+ /**
16
+ * Parses a safe keycard box value — the JSON packed by key-card's `generateSafeQrData`, e.g.
17
+ * `{"secp256k1Multisig":"…","ecdsaMpc":"…",…}` — into its four roots. Throws if the value is
18
+ * not valid JSON or any root is missing/non-string. Recovery tooling calls this on the A/B/C
19
+ * box value, then decrypts each root value with the safe password. An MPC root value is an
20
+ * opaque versioned envelope; recovery must unwrap its `prvKeyShare` and `vrf` fields instead
21
+ * of treating the decrypted bytes as a bare share.
22
+ */
23
+ export declare function parseSafeKeycardBox(data: string): SafeKeycardRoots;
24
+ //# sourceMappingURL=keycardCodec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keycardCodec.d.ts","sourceRoot":"","sources":["../../src/keycardCodec.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAa/D;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAOlE"}
@@ -0,0 +1,75 @@
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
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseSafeKeycardBox = parseSafeKeycardBox;
37
+ /**
38
+ * @prettier
39
+ *
40
+ * @experimental Safe keycard box codec.
41
+ *
42
+ * Each of Boxes A/B/C on a Safe keycard is a JSON object mapping a root slot name to that slot's key
43
+ * string. It lives in this leaf so sdk-core and WRW can parse a box without depending on key-card,
44
+ * which pulls in PDF/QR libraries and itself depends on sdk-core.
45
+ */
46
+ const t = __importStar(require("io-ts"));
47
+ const E = __importStar(require("fp-ts/Either"));
48
+ const PathReporter_1 = require("io-ts/lib/PathReporter");
49
+ const io_ts_types_1 = require("io-ts-types");
50
+ // Annotating with SafeKeycardRoots makes the compiler reject a key added to or removed from one side only.
51
+ const SafeKeycardRootsCodec = t.type({
52
+ secp256k1Multisig: t.string,
53
+ ecdsaMpc: t.string,
54
+ eddsaMpc: t.string,
55
+ ed25519Multisig: t.string,
56
+ });
57
+ // Decodes a box's JSON string straight into the validated roots record.
58
+ const SafeKeycardBoxFromString = io_ts_types_1.JsonFromString.pipe(SafeKeycardRootsCodec);
59
+ /**
60
+ * Parses a safe keycard box value — the JSON packed by key-card's `generateSafeQrData`, e.g.
61
+ * `{"secp256k1Multisig":"…","ecdsaMpc":"…",…}` — into its four roots. Throws if the value is
62
+ * not valid JSON or any root is missing/non-string. Recovery tooling calls this on the A/B/C
63
+ * box value, then decrypts each root value with the safe password. An MPC root value is an
64
+ * opaque versioned envelope; recovery must unwrap its `prvKeyShare` and `vrf` fields instead
65
+ * of treating the decrypted bytes as a bare share.
66
+ */
67
+ function parseSafeKeycardBox(data) {
68
+ const decoded = SafeKeycardBoxFromString.decode(data);
69
+ if (E.isLeft(decoded)) {
70
+ // PathReporter, not decodeWithCodec: io-ts errors carry no message, so decodeWithCodec would report only "unknown".
71
+ throw new Error(`parseSafeKeycardBox: ${PathReporter_1.PathReporter.report(decoded).join('; ')}`);
72
+ }
73
+ return decoded.right;
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2FyZENvZGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2tleWNhcmRDb2RlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlEQSxrREFPQztBQXhERDs7Ozs7Ozs7R0FRRztBQUNILHlDQUEyQjtBQUMzQixnREFBa0M7QUFDbEMseURBQXNEO0FBQ3RELDZDQUE2QztBQWtCN0MsMkdBQTJHO0FBQzNHLE1BQU0scUJBQXFCLEdBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0QsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDM0IsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQ2xCLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUNsQixlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU07Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsd0VBQXdFO0FBQ3hFLE1BQU0sd0JBQXdCLEdBQUcsNEJBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUU1RTs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsSUFBWTtJQUM5QyxNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEIsb0hBQW9IO1FBQ3BILE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLDJCQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFNhZmUga2V5Y2FyZCBib3ggY29kZWMuXG4gKlxuICogRWFjaCBvZiBCb3hlcyBBL0IvQyBvbiBhIFNhZmUga2V5Y2FyZCBpcyBhIEpTT04gb2JqZWN0IG1hcHBpbmcgYSByb290IHNsb3QgbmFtZSB0byB0aGF0IHNsb3QncyBrZXlcbiAqIHN0cmluZy4gSXQgbGl2ZXMgaW4gdGhpcyBsZWFmIHNvIHNkay1jb3JlIGFuZCBXUlcgY2FuIHBhcnNlIGEgYm94IHdpdGhvdXQgZGVwZW5kaW5nIG9uIGtleS1jYXJkLFxuICogd2hpY2ggcHVsbHMgaW4gUERGL1FSIGxpYnJhcmllcyBhbmQgaXRzZWxmIGRlcGVuZHMgb24gc2RrLWNvcmUuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0ICogYXMgRSBmcm9tICdmcC10cy9FaXRoZXInO1xuaW1wb3J0IHsgUGF0aFJlcG9ydGVyIH0gZnJvbSAnaW8tdHMvbGliL1BhdGhSZXBvcnRlcic7XG5pbXBvcnQgeyBKc29uRnJvbVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUm9vdEtleVR5cGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxuLyoqXG4gKiBJZGVudGlmaWVyIGZvciBvbmUgb2YgYSBzYWZlJ3MgZm91ciByb290cyAob25lIHBlciBzaWduaW5nIHNjaGVtZSkuIEVhY2ggdmFsdWUgaXMgdGhlXG4gKiByb290J3MgYHJvb3RLZXlUeXBlYCwgd2hpY2ggaXMgYWxzbyB0aGUga2V5IHVzZWQgaW4gdGhlIGtleWNhcmQncyBwZXItYm94IEpTT04uXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVSb290S2V5VHlwZSA9IFJvb3RLZXlUeXBlO1xuXG4vKipcbiAqIFRoZSBKU09OIG9iamVjdCBlbmNvZGVkIGluIGEgc2FmZSBrZXljYXJkIGJveCAoQS9CL0MpOiB0aGUgZm91ciByb290cyBrZXllZCBieVxuICoge0BsaW5rIFNhZmVSb290S2V5VHlwZX0uIFZhbHVlcyBhcmUgcGVyLXJvb3QgY2lwaGVydGV4dCBmb3IgQS9CIChlbmNyeXB0ZWRQcnYgb3JcbiAqIHJlZHVjZWRFbmNyeXB0ZWRQcnY7IHNhZmUgTVBDIGNpcGhlcnRleHQgZGVjcnlwdHMgdG8gYSB2ZXJzaW9uZWQgc2lnbmluZytWUkYgZW52ZWxvcGUpIG9yXG4gKiBwdWJsaWMga2V5cyBmb3IgQy4gVGhlIHJvb3Qta2V5LXR5cGUga2V5cyBhcmUgc2VsZi1pZGVudGlmeWluZywgc28gYVxuICogY29uc3VtZXIgcGFyc2VzIGJ5IGtleSByYXRoZXIgdGhhbiBieSBzaXplL29mZnNldC5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUtleWNhcmRSb290cyA9IFJlY29yZDxTYWZlUm9vdEtleVR5cGUsIHN0cmluZz47XG5cbi8vIEFubm90YXRpbmcgd2l0aCBTYWZlS2V5Y2FyZFJvb3RzIG1ha2VzIHRoZSBjb21waWxlciByZWplY3QgYSBrZXkgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIG9uZSBzaWRlIG9ubHkuXG5jb25zdCBTYWZlS2V5Y2FyZFJvb3RzQ29kZWM6IHQuVHlwZTxTYWZlS2V5Y2FyZFJvb3RzPiA9IHQudHlwZSh7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiB0LnN0cmluZyxcbiAgZWNkc2FNcGM6IHQuc3RyaW5nLFxuICBlZGRzYU1wYzogdC5zdHJpbmcsXG4gIGVkMjU1MTlNdWx0aXNpZzogdC5zdHJpbmcsXG59KTtcblxuLy8gRGVjb2RlcyBhIGJveCdzIEpTT04gc3RyaW5nIHN0cmFpZ2h0IGludG8gdGhlIHZhbGlkYXRlZCByb290cyByZWNvcmQuXG5jb25zdCBTYWZlS2V5Y2FyZEJveEZyb21TdHJpbmcgPSBKc29uRnJvbVN0cmluZy5waXBlKFNhZmVLZXljYXJkUm9vdHNDb2RlYyk7XG5cbi8qKlxuICogUGFyc2VzIGEgc2FmZSBrZXljYXJkIGJveCB2YWx1ZSDigJQgdGhlIEpTT04gcGFja2VkIGJ5IGtleS1jYXJkJ3MgYGdlbmVyYXRlU2FmZVFyRGF0YWAsIGUuZy5cbiAqIGB7XCJzZWNwMjU2azFNdWx0aXNpZ1wiOlwi4oCmXCIsXCJlY2RzYU1wY1wiOlwi4oCmXCIs4oCmfWAg4oCUIGludG8gaXRzIGZvdXIgcm9vdHMuIFRocm93cyBpZiB0aGUgdmFsdWUgaXNcbiAqIG5vdCB2YWxpZCBKU09OIG9yIGFueSByb290IGlzIG1pc3Npbmcvbm9uLXN0cmluZy4gUmVjb3ZlcnkgdG9vbGluZyBjYWxscyB0aGlzIG9uIHRoZSBBL0IvQ1xuICogYm94IHZhbHVlLCB0aGVuIGRlY3J5cHRzIGVhY2ggcm9vdCB2YWx1ZSB3aXRoIHRoZSBzYWZlIHBhc3N3b3JkLiBBbiBNUEMgcm9vdCB2YWx1ZSBpcyBhblxuICogb3BhcXVlIHZlcnNpb25lZCBlbnZlbG9wZTsgcmVjb3ZlcnkgbXVzdCB1bndyYXAgaXRzIGBwcnZLZXlTaGFyZWAgYW5kIGB2cmZgIGZpZWxkcyBpbnN0ZWFkXG4gKiBvZiB0cmVhdGluZyB0aGUgZGVjcnlwdGVkIGJ5dGVzIGFzIGEgYmFyZSBzaGFyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZUtleWNhcmRCb3goZGF0YTogc3RyaW5nKTogU2FmZUtleWNhcmRSb290cyB7XG4gIGNvbnN0IGRlY29kZWQgPSBTYWZlS2V5Y2FyZEJveEZyb21TdHJpbmcuZGVjb2RlKGRhdGEpO1xuICBpZiAoRS5pc0xlZnQoZGVjb2RlZCkpIHtcbiAgICAvLyBQYXRoUmVwb3J0ZXIsIG5vdCBkZWNvZGVXaXRoQ29kZWM6IGlvLXRzIGVycm9ycyBjYXJyeSBubyBtZXNzYWdlLCBzbyBkZWNvZGVXaXRoQ29kZWMgd291bGQgcmVwb3J0IG9ubHkgXCJ1bmtub3duXCIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBwYXJzZVNhZmVLZXljYXJkQm94OiAke1BhdGhSZXBvcnRlci5yZXBvcnQoZGVjb2RlZCkuam9pbignOyAnKX1gKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlZC5yaWdodDtcbn1cbiJdfQ==
@@ -11,23 +11,6 @@
11
11
  */
12
12
  import * as t from 'io-ts';
13
13
  export declare const DERIVED_FROM_PARENT_WITH_HARDENED_PATH: RegExp;
14
- export type SafeChildKeyName = 'user' | 'backup' | 'bitgo';
15
- type ChildKeyShape<K extends SafeChildKeyName> = K extends 'bitgo' ? {
16
- pub: string;
17
- } : {
18
- prv: string;
19
- pub: string;
20
- };
21
- export type SafeChildTriplet = {
22
- index: number;
23
- } & {
24
- [K in SafeChildKeyName]: ChildKeyShape<K>;
25
- };
26
- export type SafeChildTripletPubs = {
27
- [K in SafeChildKeyName]: {
28
- pub: string;
29
- };
30
- };
31
14
  export declare function parseSafeDerivationIndex(index: string | number): number;
32
15
  export declare function getSafeHardenedDerivationPath(index: string | number): string;
33
16
  export interface DerivedFromParentWithHardenedPathBrand {
@@ -44,18 +27,6 @@ export interface SafeHardenedChildKey {
44
27
  export declare function deriveSafeChildHardenedFromXprv(rootXprv: string, index: string | number): SafeHardenedChildKey;
45
28
  /** Re-derive and assert both results match before the child is registered. */
46
29
  export declare function deriveAndSelfCheckSafeChildHardened(rootXprv: string, index: string | number): SafeHardenedChildKey;
47
- /**
48
- * Derives slot-1 child key material for a caller-supplied Safe index.
49
- *
50
- * Index discovery belongs to the outer recovery scan (WCN-2741/WCN-2742).
51
- * This pure function reproduces the triplet for one candidate index.
52
- */
53
- export declare function deriveSafeSecp256k1MultisigTriplet(params: {
54
- userRootXprv: string;
55
- backupRootXprv: string;
56
- bitgoRootXpub: string;
57
- index: string | number;
58
- }): SafeChildTriplet;
59
30
  /**
60
31
  * SLIP-0010 hardened derivation of a safe user child from an ed25519 root secret seed.
61
32
  *
@@ -69,5 +40,4 @@ export declare function deriveSafeSecp256k1MultisigTriplet(params: {
69
40
  * `pub‖chainCode` form is only for SOFT co-signer derivation and is not used here.
70
41
  */
71
42
  export declare function deriveSafeChildEd25519Hardened(rootPrv: string, index: string | number): SafeHardenedChildKey;
72
- export {};
73
43
  //# sourceMappingURL=safeDerivation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../src/safeDerivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAQ3B,eAAO,MAAM,sCAAsC,QAAgB,CAAC;AAEpE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,KAAK,aAAa,CAAC,CAAC,SAAS,gBAAgB,IAAI,CAAC,SAAS,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf,GAAG;KACD,CAAC,IAAI,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;KAChC,CAAC,IAAI,gBAAgB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;CACzC,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAavE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,iCAAiC,EAAE,OAAO,MAAM,CAAC;CAC3D;AAED,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAE1G,eAAO,MAAM,iCAAiC,6DAI7C,CAAC;AAcF,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAI9G;AAED,8EAA8E;AAC9E,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAOlH;AAkBD;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB,GAAG,gBAAgB,CAWnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAY5G"}
1
+ {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../src/safeDerivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAQ3B,eAAO,MAAM,sCAAsC,QAAgB,CAAC;AAEpE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAavE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,iCAAiC,EAAE,OAAO,MAAM,CAAC;CAC3D;AAED,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAE1G,eAAO,MAAM,iCAAiC,6DAI7C,CAAC;AAcF,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAI9G;AAED,8EAA8E;AAC9E,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAOlH;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAY5G"}
@@ -39,7 +39,6 @@ exports.getSafeHardenedDerivationPath = getSafeHardenedDerivationPath;
39
39
  exports.parseDerivedFromParentWithHardenedPath = parseDerivedFromParentWithHardenedPath;
40
40
  exports.deriveSafeChildHardenedFromXprv = deriveSafeChildHardenedFromXprv;
41
41
  exports.deriveAndSelfCheckSafeChildHardened = deriveAndSelfCheckSafeChildHardened;
42
- exports.deriveSafeSecp256k1MultisigTriplet = deriveSafeSecp256k1MultisigTriplet;
43
42
  exports.deriveSafeChildEd25519Hardened = deriveSafeChildEd25519Hardened;
44
43
  /**
45
44
  * @prettier
@@ -55,10 +54,10 @@ exports.deriveSafeChildEd25519Hardened = deriveSafeChildEd25519Hardened;
55
54
  const t = __importStar(require("io-ts"));
56
55
  const nacl = __importStar(require("tweetnacl"));
57
56
  const utxo_lib_1 = require("@bitgo/utxo-lib");
57
+ const statics_1 = require("@bitgo/statics");
58
58
  const ed25519KeyDeriver_1 = require("./ed25519KeyDeriver");
59
59
  const codecs_1 = require("./codecs");
60
60
  const ed25519Pub_1 = require("./ed25519Pub");
61
- const MAX_BIP32_INDEX = 0x7fffffff;
62
61
  exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH = /^m\/(\d+)'$/;
63
62
  function parseSafeDerivationIndex(index) {
64
63
  let idx;
@@ -71,7 +70,7 @@ function parseSafeDerivationIndex(index) {
71
70
  else {
72
71
  throw new Error(`Invalid safe derivation index '${index}': expected a non-negative integer`);
73
72
  }
74
- if (!Number.isInteger(idx) || idx < 0 || idx > MAX_BIP32_INDEX) {
73
+ if (!Number.isInteger(idx) || idx < 0 || idx > statics_1.MAX_BIP32_INDEX) {
75
74
  throw new Error(`Invalid safe derivation index '${index}': expected a non-negative integer`);
76
75
  }
77
76
  return idx;
@@ -124,38 +123,6 @@ function deriveAndSelfCheckSafeChildHardened(rootXprv, index) {
124
123
  }
125
124
  return first;
126
125
  }
127
- function deriveSafeChildSoftFromXprv(rootXprv, index) {
128
- const child = utxo_lib_1.bip32.fromBase58(rootXprv).derive(index);
129
- if (!child.privateKey) {
130
- throw new Error(`Failed to soft-derive safe child at m/${index}: root has no private key`);
131
- }
132
- return { prv: child.toBase58(), pub: child.neutered().toBase58() };
133
- }
134
- function deriveSafeChildSoftFromXpub(rootXpub, index) {
135
- const child = utxo_lib_1.bip32.fromBase58(rootXpub).derive(index);
136
- if (child.privateKey) {
137
- throw new Error(`Failed to soft-derive safe child at m/${index}: root has a private key`);
138
- }
139
- return { pub: child.neutered().toBase58() };
140
- }
141
- /**
142
- * Derives slot-1 child key material for a caller-supplied Safe index.
143
- *
144
- * Index discovery belongs to the outer recovery scan (WCN-2741/WCN-2742).
145
- * This pure function reproduces the triplet for one candidate index.
146
- */
147
- function deriveSafeSecp256k1MultisigTriplet(params) {
148
- const derivationIdx = parseSafeDerivationIndex(params.index);
149
- const user = deriveSafeChildHardenedFromXprv(params.userRootXprv, derivationIdx);
150
- const backup = deriveSafeChildSoftFromXprv(params.backupRootXprv, derivationIdx);
151
- const bitgo = deriveSafeChildSoftFromXpub(params.bitgoRootXpub, derivationIdx);
152
- return {
153
- backup,
154
- bitgo,
155
- user: { prv: user.prv, pub: user.pub },
156
- index: derivationIdx,
157
- };
158
- }
159
126
  /**
160
127
  * SLIP-0010 hardened derivation of a safe user child from an ed25519 root secret seed.
161
128
  *
@@ -181,4 +148,4 @@ function deriveSafeChildEd25519Hardened(rootPrv, index) {
181
148
  derivationPath,
182
149
  };
183
150
  }
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FmZURlcml2YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUNBLDREQWFDO0FBRUQsc0VBRUM7QUEwQkQsd0ZBT0M7QUFtQkQsMEVBSUM7QUFHRCxrRkFPQztBQXdCRCxnRkFnQkM7QUFjRCx3RUFZQztBQXhMRDs7Ozs7Ozs7OztHQVVHO0FBQ0gseUNBQTJCO0FBQzNCLGdEQUFrQztBQUNsQyw4Q0FBd0Q7QUFDeEQsMkRBQXdEO0FBQ3hELHFDQUEyQztBQUMzQyw2Q0FBMkY7QUFFM0YsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDO0FBQ3RCLFFBQUEsc0NBQXNDLEdBQUcsYUFBYSxDQUFDO0FBZ0JwRSxTQUFnQix3QkFBd0IsQ0FBQyxLQUFzQjtJQUM3RCxJQUFJLEdBQVcsQ0FBQztJQUNoQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDZCxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEtBQUssb0NBQW9DLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsS0FBSyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFF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R0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ3RDLEtBQUssRUFBRSxhQUFhO0tBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQiw4QkFBOEIsQ0FBQyxPQUFlLEVBQUUsS0FBc0I7SUFDcEYsTUFBTSxHQUFHLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsTUFBTSxjQUFjLEdBQUcsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUQsTUFBTSxVQUFVLEdBQUcsSUFBQSwwQ0FBNkIsRUFBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUUsTUFBTSxTQUFTLEdBQUcscUNBQWlCLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDL0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN2RSxNQUFNLEdBQUcsR0FBRyxJQUFBLHlDQUE0QixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekUsT0FBTztRQUNMLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDM0MsR0FBRztRQUNILGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBTaGFyZWQgc2FmZSBjaGlsZCBkZXJpdmF0aW9uIGZvciBtaW50LCBzaWduLCBhbmQgcmVjb3ZlcnkuXG4gKlxuICogVXNlciBjaGlsZDogaGFyZGVuZWQgYG0vPGluZGV4PidgIGZyb20gdGhlIHNlcXVlbnRpYWwgYHNhZmUuZGVyaXZhdGlvbkluZGV4W3Nsb3RdYC5cbiAqIEJhY2t1cCAvIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgYXQgYG0vPGluZGV4PmAgY2xpZW50LXNpZGUgZm9yIHJlY292ZXJ5LlxuICpcbiAqIERvIG5vdCB1c2UgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIC8gYGRlcml2ZUtleVdpdGhTZWVkYCAoYG0vOTk5OTk5L2EvYmApIOKAlFxuICogdGhhdCBpcyB0aGUgY3VzdG9keSBoYXNoZWQgcGF0aCBhbmQgY2Fubm90IHJlcHJvZHVjZSBhIHNhZmUgY2hpbGQuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0ICogYXMgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgYmlwMzIsIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IEVkMjU1MTlLZXlEZXJpdmVyIH0gZnJvbSAnLi9lZDI1NTE5S2V5RGVyaXZlcic7XG5pbXBvcnQgeyBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuL2NvZGVjcyc7XG5pbXBvcnQgeyBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZCwgZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSB9IGZyb20gJy4vZWQyNTUxOVB1Yic7XG5cbmNvbnN0IE1BWF9CSVAzMl9JTkRFWCA9IDB4N2ZmZmZmZmY7XG5leHBvcnQgY29uc3QgREVSSVZFRF9GUk9NX1BBUkVOVF9XSVRIX0hBUkRFTkVEX1BBVEggPSAvXm1cXC8oXFxkKyknJC87XG5cbmV4cG9ydCB0eXBlIFNhZmVDaGlsZEtleU5hbWUgPSAndXNlcicgfCAnYmFja3VwJyB8ICdiaXRnbyc7XG5cbnR5cGUgQ2hpbGRLZXlTaGFwZTxLIGV4dGVuZHMgU2FmZUNoaWxkS2V5TmFtZT4gPSBLIGV4dGVuZHMgJ2JpdGdvJyA/IHsgcHViOiBzdHJpbmcgfSA6IHsgcHJ2OiBzdHJpbmc7IHB1Yjogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFNhZmVDaGlsZFRyaXBsZXQgPSB7XG4gIGluZGV4OiBudW1iZXI7XG59ICYge1xuICBbSyBpbiBTYWZlQ2hpbGRLZXlOYW1lXTogQ2hpbGRLZXlTaGFwZTxLPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNhZmVDaGlsZFRyaXBsZXRQdWJzID0ge1xuICBbSyBpbiBTYWZlQ2hpbGRLZXlOYW1lXTogeyBwdWI6IHN0cmluZyB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGlkeDogbnVtYmVyO1xuICBpZiAodHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJykge1xuICAgIGlkeCA9IGluZGV4O1xuICB9IGVsc2UgaWYgKC9eXFxkKyQvLnRlc3QoaW5kZXgpKSB7XG4gICAgaWR4ID0gTnVtYmVyKGluZGV4KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2FmZSBkZXJpdmF0aW9uIGluZGV4ICcke2luZGV4fSc6IGV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoaWR4KSB8fCBpZHggPCAwIHx8IGlkeCA+IE1BWF9CSVAzMl9JTkRFWCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXggJyR7aW5kZXh9JzogZXhwZWN0ZWQgYSBub24tbmVnYXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIHJldHVybiBpZHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aChpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBtLyR7cGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KGluZGV4KX0nYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhCcmFuZCB7XG4gIHJlYWRvbmx5IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aDogdW5pcXVlIHN5bWJvbDtcbn1cblxuZXhwb3J0IHR5cGUgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gdC5CcmFuZGVkPHN0cmluZywgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoQnJhbmQ+O1xuXG5leHBvcnQgY29uc3QgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gdC5icmFuZChcbiAgdC5zdHJpbmcsXG4gIChzKTogcyBpcyBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggPT4gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhJbmRleChzKSAhPT0gdW5kZWZpbmVkLFxuICAnRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoJ1xuKTtcblxuZnVuY3Rpb24gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhJbmRleChwYXRoOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IERFUklWRURfRlJPTV9QQVJFTlRfV0lUSF9IQVJERU5FRF9QQVRILmV4ZWMocGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlU2FmZURlcml2YXRpb25JbmRleChtYXRjaFsxXSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoKHBhdGg6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHZhbGlkYXRlZCA9IGRlY29kZVdpdGhDb2RlYyhEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsIHBhdGgsICdkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnKTtcbiAgY29uc3QgaW5kZXggPSBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEluZGV4KHZhbGlkYXRlZCk7XG4gIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCAnJHtwYXRofSc6IGV4cGVjdGVkIG0vPG4+J2ApO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIHBydjogc3RyaW5nO1xuICBwdWI6IHN0cmluZztcbiAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gY2hpbGRGcm9tTm9kZShjaGlsZDogQklQMzJJbnRlcmZhY2UsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGlmICghY2hpbGQucHJpdmF0ZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlcml2ZSBoYXJkZW5lZCBzYWZlIGNoaWxkIGF0ICR7ZGVyaXZhdGlvblBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcnY6IGNoaWxkLnRvQmFzZTU4KCksXG4gICAgcHViOiBjaGlsZC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgZGVyaXZhdGlvblBhdGgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KHJvb3RYcHJ2OiBzdHJpbmcsIGluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGNvbnN0IGlkeCA9IHBhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleCk7XG4gIGNvbnN0IGRlcml2YXRpb25QYXRoID0gZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaWR4KTtcbiAgcmV0dXJuIGNoaWxkRnJvbU5vZGUoYmlwMzIuZnJvbUJhc2U1OChyb290WHBydikuZGVyaXZlSGFyZGVuZWQoaWR4KSwgZGVyaXZhdGlvblBhdGgpO1xufVxuXG4vKiogUmUtZGVyaXZlIGFuZCBhc3NlcnQgYm90aCByZXN1bHRzIG1hdGNoIGJlZm9yZSB0aGUgY2hpbGQgaXMgcmVnaXN0ZXJlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChyb290WHBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBmaXJzdCA9IGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYocm9vdFhwcnYsIGluZGV4KTtcbiAgY29uc3Qgc2Vjb25kID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihyb290WHBydiwgaW5kZXgpO1xuICBpZiAoZmlyc3QucHViICE9PSBzZWNvbmQucHViIHx8IGZpcnN0LnBydiAhPT0gc2Vjb25kLnBydikge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSBjaGlsZCBzZWxmLWNoZWNrIGZhaWxlZCBhdCAke2ZpcnN0LmRlcml2YXRpb25QYXRofTogZGVyaXZhdGlvbiB3YXMgbm90IGRldGVybWluaXN0aWNgKTtcbiAgfVxuICByZXR1cm4gZmlyc3Q7XG59XG5cbmZ1bmN0aW9uIGRlcml2ZVNhZmVDaGlsZFNvZnRGcm9tWHBydihyb290WHBydjogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogeyBwcnY6IHN0cmluZzsgcHViOiBzdHJpbmcgfSB7XG4gIGNvbnN0IGNoaWxkID0gYmlwMzIuZnJvbUJhc2U1OChyb290WHBydikuZGVyaXZlKGluZGV4KTtcbiAgaWYgKCFjaGlsZC5wcml2YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc29mdC1kZXJpdmUgc2FmZSBjaGlsZCBhdCBtLyR7aW5kZXh9OiByb290IGhhcyBubyBwcml2YXRlIGtleWApO1xuICB9XG4gIHJldHVybiB7IHBydjogY2hpbGQudG9CYXNlNTgoKSwgcHViOiBjaGlsZC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfTtcbn1cblxuZnVuY3Rpb24gZGVyaXZlU2FmZUNoaWxkU29mdEZyb21YcHViKHJvb3RYcHViOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB7IHB1Yjogc3RyaW5nIH0ge1xuICBjb25zdCBjaGlsZCA9IGJpcDMyLmZyb21CYXNlNTgocm9vdFhwdWIpLmRlcml2ZShpbmRleCk7XG4gIGlmIChjaGlsZC5wcml2YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc29mdC1kZXJpdmUgc2FmZSBjaGlsZCBhdCBtLyR7aW5kZXh9OiByb290IGhhcyBhIHByaXZhdGUga2V5YCk7XG4gIH1cbiAgcmV0dXJuIHsgcHViOiBjaGlsZC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfTtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIHNsb3QtMSBjaGlsZCBrZXkgbWF0ZXJpYWwgZm9yIGEgY2FsbGVyLXN1cHBsaWVkIFNhZmUgaW5kZXguXG4gKlxuICogSW5kZXggZGlzY292ZXJ5IGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJlY292ZXJ5IHNjYW4gKFdDTi0yNzQxL1dDTi0yNzQyKS5cbiAqIFRoaXMgcHVyZSBmdW5jdGlvbiByZXByb2R1Y2VzIHRoZSB0cmlwbGV0IGZvciBvbmUgY2FuZGlkYXRlIGluZGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlU2FmZVNlY3AyNTZrMU11bHRpc2lnVHJpcGxldChwYXJhbXM6IHtcbiAgdXNlclJvb3RYcHJ2OiBzdHJpbmc7XG4gIGJhY2t1cFJvb3RYcHJ2OiBzdHJpbmc7XG4gIGJpdGdvUm9vdFhwdWI6IHN0cmluZztcbiAgaW5kZXg6IHN0cmluZyB8IG51bWJlcjtcbn0pOiBTYWZlQ2hpbGRUcmlwbGV0IHtcbiAgY29uc3QgZGVyaXZhdGlvbklkeCA9IHBhcnNlU2FmZURlcml2YXRpb25JbmRleChwYXJhbXMuaW5kZXgpO1xuICBjb25zdCB1c2VyID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihwYXJhbXMudXNlclJvb3RYcHJ2LCBkZXJpdmF0aW9uSWR4KTtcbiAgY29uc3QgYmFja3VwID0gZGVyaXZlU2FmZUNoaWxkU29mdEZyb21YcHJ2KHBhcmFtcy5iYWNrdXBSb290WHBydiwgZGVyaXZhdGlvbklkeCk7XG4gIGNvbnN0IGJpdGdvID0gZGVyaXZlU2FmZUNoaWxkU29mdEZyb21YcHViKHBhcmFtcy5iaXRnb1Jvb3RYcHViLCBkZXJpdmF0aW9uSWR4KTtcbiAgcmV0dXJuIHtcbiAgICBiYWNrdXAsXG4gICAgYml0Z28sXG4gICAgdXNlcjogeyBwcnY6IHVzZXIucHJ2LCBwdWI6IHVzZXIucHViIH0sXG4gICAgaW5kZXg6IGRlcml2YXRpb25JZHgsXG4gIH07XG59XG5cbi8qKlxuICogU0xJUC0wMDEwIGhhcmRlbmVkIGRlcml2YXRpb24gb2YgYSBzYWZlIHVzZXIgY2hpbGQgZnJvbSBhbiBlZDI1NTE5IHJvb3Qgc2VjcmV0IHNlZWQuXG4gKlxuICogYHJvb3RQcnZgIGlzIGEgU3RlbGxhciBTdHJLZXkgYFPigKZgIHNlY3JldCBzZWVkICh3aGF0IHNsb3Qt4pGjIGBlZDI1NTE5TXVsdGlzaWdgIHVzZXIgcm9vdHMgc3RvcmUpLlxuICogVGhlIGRlcml2YXRpb24gcmV1c2VzIHRoZSBleGlzdGluZyBTTElQLTAwMTAgaW1wbGVtZW50YXRpb24ge0BsaW5rIEVkMjU1MTlLZXlEZXJpdmVyLmRlcml2ZVBhdGh9XG4gKiAoaGFyZGVuZWQtb25seSBDS0RQcml2IG92ZXIgdGhlIGBlZDI1NTE5IHNlZWRgIEhNQUMgbWFzdGVyKSwgdGhlbiBleHBhbmRzIHRoZSByZXN1bHRpbmcgMzItYnl0ZVxuICogY2hpbGQgc2VlZCBpbnRvIGEga2V5cGFpciB3aXRoIGBuYWNsYC4gVGhlIGNoaWxkIGBwdWJgIGlzIGEgYmFyZSBTdHJLZXkgYEfigKZgOyB0aGUgYHBydmAgaXMgdGhlXG4gKiByYXcgMzItYnl0ZSBjaGlsZCBzZWVkIGFzIGhleCAodGhlIHNlZWQgaW5wdXQgYSBzaWduZXIgbmVlZHMpLlxuICpcbiAqIFVubGlrZSB0aGUgc2VjcDI1NmsxIHBhdGgsIGVkMjU1MTkgaGFyZGVuZWQgZGVyaXZhdGlvbiBuZWVkcyBubyBjaGFpbiBjb2RlIOKAlCB0aGUgY29tcG9zaXRlXG4gKiBgcHVi4oCWY2hhaW5Db2RlYCBmb3JtIGlzIG9ubHkgZm9yIFNPRlQgY28tc2lnbmVyIGRlcml2YXRpb24gYW5kIGlzIG5vdCB1c2VkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQocm9vdFBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBpZHggPSBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXgpO1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKGlkeCk7XG4gIGNvbnN0IHJhd1NlZWRIZXggPSBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZChyb290UHJ2KS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGNoaWxkU2VlZCA9IEVkMjU1MTlLZXlEZXJpdmVyLmRlcml2ZVBhdGgoZGVyaXZhdGlvblBhdGgsIHJhd1NlZWRIZXgpLmtleTtcbiAgY29uc3Qga2V5UGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKFVpbnQ4QXJyYXkuZnJvbShjaGlsZFNlZWQpKTtcbiAgY29uc3QgcHViID0gZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShCdWZmZXIuZnJvbShrZXlQYWlyLnB1YmxpY0tleSkpO1xuICByZXR1cm4ge1xuICAgIHBydjogQnVmZmVyLmZyb20oY2hpbGRTZWVkKS50b1N0cmluZygnaGV4JyksXG4gICAgcHViLFxuICAgIGRlcml2YXRpb25QYXRoLFxuICB9O1xufVxuIl19
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FmZURlcml2YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLDREQWFDO0FBRUQsc0VBRUM7QUEwQkQsd0ZBT0M7QUFtQkQsMEVBSUM7QUFHRCxrRkFPQztBQWNELHdFQVlDO0FBbElEOzs7Ozs7Ozs7O0dBVUc7QUFDSCx5Q0FBMkI7QUFDM0IsZ0RBQWtDO0FBQ2xDLDhDQUF3RDtBQUN4RCw0Q0FBaUQ7QUFDakQsMkRBQXdEO0FBQ3hELHFDQUEyQztBQUMzQyw2Q0FBMkY7QUFFOUUsUUFBQSxzQ0FBc0MsR0FBRyxhQUFhLENBQUM7QUFFcEUsU0FBZ0Isd0JBQXdCLENBQUMsS0FBc0I7SUFDN0QsSUFBSSxHQUFXLENBQUM7SUFDaEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ2QsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxLQUFLLG9DQUFvQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLHlCQUFlLEVBQUUsQ0FBQztRQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxLQUFLLG9DQUFvQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQWdCLDZCQUE2QixDQUFDLEtBQXNCO0lBQ2xF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QUM7SUFDMUQsTUFBTSxVQUFVLEdBQUcsSUFBQSwwQ0FBNkIsRUFBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUUsTUFBTSxTQUFTLEdBQUcscUNBQWlCLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDL0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN2RSxNQUFNLEdBQUcsR0FBRyxJQUFBLHlDQUE0QixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekUsT0FBTztRQUNMLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDM0MsR0FBRztRQUNILGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBTaGFyZWQgc2FmZSBjaGlsZCBkZXJpdmF0aW9uIGZvciBtaW50LCBzaWduLCBhbmQgcmVjb3ZlcnkuXG4gKlxuICogVXNlciBjaGlsZDogaGFyZGVuZWQgYG0vPGluZGV4PidgIGZyb20gdGhlIHNlcXVlbnRpYWwgYHNhZmUuZGVyaXZhdGlvbkluZGV4W3Nsb3RdYC5cbiAqIEJhY2t1cCAvIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgYXQgYG0vPGluZGV4PmAgY2xpZW50LXNpZGUgZm9yIHJlY292ZXJ5LlxuICpcbiAqIERvIG5vdCB1c2UgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIC8gYGRlcml2ZUtleVdpdGhTZWVkYCAoYG0vOTk5OTk5L2EvYmApIOKAlFxuICogdGhhdCBpcyB0aGUgY3VzdG9keSBoYXNoZWQgcGF0aCBhbmQgY2Fubm90IHJlcHJvZHVjZSBhIHNhZmUgY2hpbGQuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0ICogYXMgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHsgYmlwMzIsIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IE1BWF9CSVAzMl9JTkRFWCB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEVkMjU1MTlLZXlEZXJpdmVyIH0gZnJvbSAnLi9lZDI1NTE5S2V5RGVyaXZlcic7XG5pbXBvcnQgeyBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuL2NvZGVjcyc7XG5pbXBvcnQgeyBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZCwgZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSB9IGZyb20gJy4vZWQyNTUxOVB1Yic7XG5cbmV4cG9ydCBjb25zdCBERVJJVkVEX0ZST01fUEFSRU5UX1dJVEhfSEFSREVORURfUEFUSCA9IC9ebVxcLyhcXGQrKSckLztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGlkeDogbnVtYmVyO1xuICBpZiAodHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJykge1xuICAgIGlkeCA9IGluZGV4O1xuICB9IGVsc2UgaWYgKC9eXFxkKyQvLnRlc3QoaW5kZXgpKSB7XG4gICAgaWR4ID0gTnVtYmVyKGluZGV4KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2FmZSBkZXJpdmF0aW9uIGluZGV4ICcke2luZGV4fSc6IGV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoaWR4KSB8fCBpZHggPCAwIHx8IGlkeCA+IE1BWF9CSVAzMl9JTkRFWCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXggJyR7aW5kZXh9JzogZXhwZWN0ZWQgYSBub24tbmVnYXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIHJldHVybiBpZHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aChpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBtLyR7cGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KGluZGV4KX0nYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhCcmFuZCB7XG4gIHJlYWRvbmx5IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aDogdW5pcXVlIHN5bWJvbDtcbn1cblxuZXhwb3J0IHR5cGUgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gdC5CcmFuZGVkPHN0cmluZywgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoQnJhbmQ+O1xuXG5leHBvcnQgY29uc3QgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gdC5icmFuZChcbiAgdC5zdHJpbmcsXG4gIChzKTogcyBpcyBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggPT4gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhJbmRleChzKSAhPT0gdW5kZWZpbmVkLFxuICAnRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoJ1xuKTtcblxuZnVuY3Rpb24gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhJbmRleChwYXRoOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IERFUklWRURfRlJPTV9QQVJFTlRfV0lUSF9IQVJERU5FRF9QQVRILmV4ZWMocGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlU2FmZURlcml2YXRpb25JbmRleChtYXRjaFsxXSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoKHBhdGg6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHZhbGlkYXRlZCA9IGRlY29kZVdpdGhDb2RlYyhEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsIHBhdGgsICdkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnKTtcbiAgY29uc3QgaW5kZXggPSBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEluZGV4KHZhbGlkYXRlZCk7XG4gIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCAnJHtwYXRofSc6IGV4cGVjdGVkIG0vPG4+J2ApO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIHBydjogc3RyaW5nO1xuICBwdWI6IHN0cmluZztcbiAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gY2hpbGRGcm9tTm9kZShjaGlsZDogQklQMzJJbnRlcmZhY2UsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGlmICghY2hpbGQucHJpdmF0ZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlcml2ZSBoYXJkZW5lZCBzYWZlIGNoaWxkIGF0ICR7ZGVyaXZhdGlvblBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcnY6IGNoaWxkLnRvQmFzZTU4KCksXG4gICAgcHViOiBjaGlsZC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgZGVyaXZhdGlvblBhdGgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KHJvb3RYcHJ2OiBzdHJpbmcsIGluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGNvbnN0IGlkeCA9IHBhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleCk7XG4gIGNvbnN0IGRlcml2YXRpb25QYXRoID0gZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaWR4KTtcbiAgcmV0dXJuIGNoaWxkRnJvbU5vZGUoYmlwMzIuZnJvbUJhc2U1OChyb290WHBydikuZGVyaXZlSGFyZGVuZWQoaWR4KSwgZGVyaXZhdGlvblBhdGgpO1xufVxuXG4vKiogUmUtZGVyaXZlIGFuZCBhc3NlcnQgYm90aCByZXN1bHRzIG1hdGNoIGJlZm9yZSB0aGUgY2hpbGQgaXMgcmVnaXN0ZXJlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChyb290WHBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBmaXJzdCA9IGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYocm9vdFhwcnYsIGluZGV4KTtcbiAgY29uc3Qgc2Vjb25kID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihyb290WHBydiwgaW5kZXgpO1xuICBpZiAoZmlyc3QucHViICE9PSBzZWNvbmQucHViIHx8IGZpcnN0LnBydiAhPT0gc2Vjb25kLnBydikge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSBjaGlsZCBzZWxmLWNoZWNrIGZhaWxlZCBhdCAke2ZpcnN0LmRlcml2YXRpb25QYXRofTogZGVyaXZhdGlvbiB3YXMgbm90IGRldGVybWluaXN0aWNgKTtcbiAgfVxuICByZXR1cm4gZmlyc3Q7XG59XG5cbi8qKlxuICogU0xJUC0wMDEwIGhhcmRlbmVkIGRlcml2YXRpb24gb2YgYSBzYWZlIHVzZXIgY2hpbGQgZnJvbSBhbiBlZDI1NTE5IHJvb3Qgc2VjcmV0IHNlZWQuXG4gKlxuICogYHJvb3RQcnZgIGlzIGEgU3RlbGxhciBTdHJLZXkgYFPigKZgIHNlY3JldCBzZWVkICh3aGF0IHNsb3Qt4pGjIGBlZDI1NTE5TXVsdGlzaWdgIHVzZXIgcm9vdHMgc3RvcmUpLlxuICogVGhlIGRlcml2YXRpb24gcmV1c2VzIHRoZSBleGlzdGluZyBTTElQLTAwMTAgaW1wbGVtZW50YXRpb24ge0BsaW5rIEVkMjU1MTlLZXlEZXJpdmVyLmRlcml2ZVBhdGh9XG4gKiAoaGFyZGVuZWQtb25seSBDS0RQcml2IG92ZXIgdGhlIGBlZDI1NTE5IHNlZWRgIEhNQUMgbWFzdGVyKSwgdGhlbiBleHBhbmRzIHRoZSByZXN1bHRpbmcgMzItYnl0ZVxuICogY2hpbGQgc2VlZCBpbnRvIGEga2V5cGFpciB3aXRoIGBuYWNsYC4gVGhlIGNoaWxkIGBwdWJgIGlzIGEgYmFyZSBTdHJLZXkgYEfigKZgOyB0aGUgYHBydmAgaXMgdGhlXG4gKiByYXcgMzItYnl0ZSBjaGlsZCBzZWVkIGFzIGhleCAodGhlIHNlZWQgaW5wdXQgYSBzaWduZXIgbmVlZHMpLlxuICpcbiAqIFVubGlrZSB0aGUgc2VjcDI1NmsxIHBhdGgsIGVkMjU1MTkgaGFyZGVuZWQgZGVyaXZhdGlvbiBuZWVkcyBubyBjaGFpbiBjb2RlIOKAlCB0aGUgY29tcG9zaXRlXG4gKiBgcHVi4oCWY2hhaW5Db2RlYCBmb3JtIGlzIG9ubHkgZm9yIFNPRlQgY28tc2lnbmVyIGRlcml2YXRpb24gYW5kIGlzIG5vdCB1c2VkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQocm9vdFBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBpZHggPSBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXgpO1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKGlkeCk7XG4gIGNvbnN0IHJhd1NlZWRIZXggPSBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZChyb290UHJ2KS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGNoaWxkU2VlZCA9IEVkMjU1MTlLZXlEZXJpdmVyLmRlcml2ZVBhdGgoZGVyaXZhdGlvblBhdGgsIHJhd1NlZWRIZXgpLmtleTtcbiAgY29uc3Qga2V5UGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKFVpbnQ4QXJyYXkuZnJvbShjaGlsZFNlZWQpKTtcbiAgY29uc3QgcHViID0gZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShCdWZmZXIuZnJvbShrZXlQYWlyLnB1YmxpY0tleSkpO1xuICByZXR1cm4ge1xuICAgIHBydjogQnVmZmVyLmZyb20oY2hpbGRTZWVkKS50b1N0cmluZygnaGV4JyksXG4gICAgcHViLFxuICAgIGRlcml2YXRpb25QYXRoLFxuICB9O1xufVxuIl19
@@ -3,5 +3,12 @@ type OnchainSafeRootKeySlot = Extract<RootKeyType, 'secp256k1Multisig' | 'ed2551
3
3
  type TssSafeRootKeySlot = Extract<RootKeyType, 'ecdsaMpc' | 'eddsaMpc'>;
4
4
  export declare function onchainSlotForCoin(chain: string): OnchainSafeRootKeySlot;
5
5
  export declare function tssSlotForCoin(chain: string): TssSafeRootKeySlot;
6
+ /**
7
+ * Every safe root slot a coin can be minted under, in deterministic order (onchain first,
8
+ * then tss). Mirrors wallet-platform's mint truth: the onchain slot is included iff the coin
9
+ * carries {@link CoinFeature.MULTISIG}, the tss slot iff it carries {@link CoinFeature.TSS}.
10
+ * A coin that mints under neither (e.g. a Pallas coin) yields `[]`.
11
+ */
12
+ export declare function safeSlotsForCoin(chain: string): RootKeyType[];
6
13
  export {};
7
14
  //# sourceMappingURL=safeSlot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safeSlot.d.ts","sourceRoot":"","sources":["../../src/safeSlot.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,KAAK,sBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,mBAAmB,GAAG,iBAAiB,CAAC,CAAC;AAC5F,KAAK,kBAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;AAExE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,CASxE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAShE"}
1
+ {"version":3,"file":"safeSlot.d.ts","sourceRoot":"","sources":["../../src/safeSlot.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,KAAK,sBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,mBAAmB,GAAG,iBAAiB,CAAC,CAAC;AAC5F,KAAK,kBAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;AAYxE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,CAMxE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAMhE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAW7D"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.onchainSlotForCoin = onchainSlotForCoin;
4
4
  exports.tssSlotForCoin = tssSlotForCoin;
5
+ exports.safeSlotsForCoin = safeSlotsForCoin;
5
6
  /**
6
7
  * @prettier
7
8
  *
@@ -9,30 +10,51 @@ exports.tssSlotForCoin = tssSlotForCoin;
9
10
  *
10
11
  * Maps a coin chain + minting model to the safe root slot that derives it. The slot
11
12
  * is a signing scheme, not a coin: slot ① secp256k1Multisig serves UTXO + XRP + TRX + …,
12
- * slot ④ ed25519Multisig serves ALGO/XLM/HBAR, and the MPC slots serve TSS coins.
13
+ * slot ② ed25519Multisig serves ALGO/XLM/HBAR, and the MPC slots serve TSS coins.
13
14
  *
14
15
  * The multisigType-vs-coin validation stays in sdk-core (it needs IBaseCoin); these
15
16
  * functions take only the chain so this leaf never imports sdk-core.
16
17
  */
17
18
  const statics_1 = require("@bitgo/statics");
19
+ /**
20
+ * Exhaustive curve → slot registry. Pallas maps to nothing: a Pallas coin has no safe
21
+ * root slot. The compiler guarantees every {@link KeyCurve} member is present.
22
+ */
23
+ const CURVE_TO_SLOTS = {
24
+ [statics_1.KeyCurve.Secp256k1]: { onchain: 'secp256k1Multisig', tss: 'ecdsaMpc' },
25
+ [statics_1.KeyCurve.Ed25519]: { onchain: 'ed25519Multisig', tss: 'eddsaMpc' },
26
+ [statics_1.KeyCurve.Pallas]: {},
27
+ };
18
28
  function onchainSlotForCoin(chain) {
19
- const curve = statics_1.coins.get(chain).primaryKeyCurve;
20
- if (curve === statics_1.KeyCurve.Secp256k1) {
21
- return 'secp256k1Multisig';
29
+ const slot = CURVE_TO_SLOTS[statics_1.coins.get(chain).primaryKeyCurve].onchain;
30
+ if (!slot) {
31
+ throw new Error(`Coin '${chain}' is not supported for safe wallet minting`);
22
32
  }
23
- if (curve === statics_1.KeyCurve.Ed25519) {
24
- return 'ed25519Multisig';
25
- }
26
- throw new Error(`Coin '${chain}' is not supported for safe wallet minting`);
33
+ return slot;
27
34
  }
28
35
  function tssSlotForCoin(chain) {
29
- const curve = statics_1.coins.get(chain).primaryKeyCurve;
30
- if (curve === statics_1.KeyCurve.Secp256k1) {
31
- return 'ecdsaMpc';
36
+ const slot = CURVE_TO_SLOTS[statics_1.coins.get(chain).primaryKeyCurve].tss;
37
+ if (!slot) {
38
+ throw new Error(`Coin '${chain}' is not supported for safe wallet minting`);
39
+ }
40
+ return slot;
41
+ }
42
+ /**
43
+ * Every safe root slot a coin can be minted under, in deterministic order (onchain first,
44
+ * then tss). Mirrors wallet-platform's mint truth: the onchain slot is included iff the coin
45
+ * carries {@link CoinFeature.MULTISIG}, the tss slot iff it carries {@link CoinFeature.TSS}.
46
+ * A coin that mints under neither (e.g. a Pallas coin) yields `[]`.
47
+ */
48
+ function safeSlotsForCoin(chain) {
49
+ const coin = statics_1.coins.get(chain);
50
+ const { onchain, tss } = CURVE_TO_SLOTS[coin.primaryKeyCurve];
51
+ const slots = [];
52
+ if (onchain && coin.features.includes(statics_1.CoinFeature.MULTISIG)) {
53
+ slots.push(onchain);
32
54
  }
33
- if (curve === statics_1.KeyCurve.Ed25519) {
34
- return 'eddsaMpc';
55
+ if (tss && coin.features.includes(statics_1.CoinFeature.TSS)) {
56
+ slots.push(tss);
35
57
  }
36
- throw new Error(`Coin '${chain}' is not supported for safe wallet minting`);
58
+ return slots;
37
59
  }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZVNsb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FmZVNsb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFrQkEsZ0RBU0M7QUFFRCx3Q0FTQztBQXRDRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILDRDQUFpRDtBQU1qRCxTQUFnQixrQkFBa0IsQ0FBQyxLQUFhO0lBQzlDLE1BQU0sS0FBSyxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDO0lBQy9DLElBQUksS0FBSyxLQUFLLGtCQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakMsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxLQUFLLEtBQUssa0JBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyw0Q0FBNEMsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsS0FBYTtJQUMxQyxNQUFNLEtBQUssR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQztJQUMvQyxJQUFJLEtBQUssS0FBSyxrQkFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLEtBQUssS0FBSyxrQkFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyw0Q0FBNEMsQ0FBQyxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgU2hhcmVkIHNhZmUgc2xvdC1mb3ItY29pbiBtYXBwaW5nLlxuICpcbiAqIE1hcHMgYSBjb2luIGNoYWluICsgbWludGluZyBtb2RlbCB0byB0aGUgc2FmZSByb290IHNsb3QgdGhhdCBkZXJpdmVzIGl0LiBUaGUgc2xvdFxuICogaXMgYSBzaWduaW5nIHNjaGVtZSwgbm90IGEgY29pbjogc2xvdCDikaAgc2VjcDI1NmsxTXVsdGlzaWcgc2VydmVzIFVUWE8gKyBYUlAgKyBUUlggKyDigKYsXG4gKiBzbG90IOKRoyBlZDI1NTE5TXVsdGlzaWcgc2VydmVzIEFMR08vWExNL0hCQVIsIGFuZCB0aGUgTVBDIHNsb3RzIHNlcnZlIFRTUyBjb2lucy5cbiAqXG4gKiBUaGUgbXVsdGlzaWdUeXBlLXZzLWNvaW4gdmFsaWRhdGlvbiBzdGF5cyBpbiBzZGstY29yZSAoaXQgbmVlZHMgSUJhc2VDb2luKTsgdGhlc2VcbiAqIGZ1bmN0aW9ucyB0YWtlIG9ubHkgdGhlIGNoYWluIHNvIHRoaXMgbGVhZiBuZXZlciBpbXBvcnRzIHNkay1jb3JlLlxuICovXG5pbXBvcnQgeyBjb2lucywgS2V5Q3VydmUgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgdHlwZSB7IFJvb3RLZXlUeXBlIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbnR5cGUgT25jaGFpblNhZmVSb290S2V5U2xvdCA9IEV4dHJhY3Q8Um9vdEtleVR5cGUsICdzZWNwMjU2azFNdWx0aXNpZycgfCAnZWQyNTUxOU11bHRpc2lnJz47XG50eXBlIFRzc1NhZmVSb290S2V5U2xvdCA9IEV4dHJhY3Q8Um9vdEtleVR5cGUsICdlY2RzYU1wYycgfCAnZWRkc2FNcGMnPjtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uY2hhaW5TbG90Rm9yQ29pbihjaGFpbjogc3RyaW5nKTogT25jaGFpblNhZmVSb290S2V5U2xvdCB7XG4gIGNvbnN0IGN1cnZlID0gY29pbnMuZ2V0KGNoYWluKS5wcmltYXJ5S2V5Q3VydmU7XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuU2VjcDI1NmsxKSB7XG4gICAgcmV0dXJuICdzZWNwMjU2azFNdWx0aXNpZyc7XG4gIH1cbiAgaWYgKGN1cnZlID09PSBLZXlDdXJ2ZS5FZDI1NTE5KSB7XG4gICAgcmV0dXJuICdlZDI1NTE5TXVsdGlzaWcnO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ29pbiAnJHtjaGFpbn0nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHNhZmUgd2FsbGV0IG1pbnRpbmdgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRzc1Nsb3RGb3JDb2luKGNoYWluOiBzdHJpbmcpOiBUc3NTYWZlUm9vdEtleVNsb3Qge1xuICBjb25zdCBjdXJ2ZSA9IGNvaW5zLmdldChjaGFpbikucHJpbWFyeUtleUN1cnZlO1xuICBpZiAoY3VydmUgPT09IEtleUN1cnZlLlNlY3AyNTZrMSkge1xuICAgIHJldHVybiAnZWNkc2FNcGMnO1xuICB9XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuRWQyNTUxOSkge1xuICAgIHJldHVybiAnZWRkc2FNcGMnO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ29pbiAnJHtjaGFpbn0nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHNhZmUgd2FsbGV0IG1pbnRpbmdgKTtcbn1cbiJdfQ==
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZVNsb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FmZVNsb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0QkEsZ0RBTUM7QUFFRCx3Q0FNQztBQVFELDRDQVdDO0FBN0REOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsNENBQThEO0FBTTlEOzs7R0FHRztBQUNILE1BQU0sY0FBYyxHQUFxRjtJQUN2RyxDQUFDLGtCQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRTtJQUN2RSxDQUFDLGtCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRTtJQUNuRSxDQUFDLGtCQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRTtDQUN0QixDQUFDO0FBRUYsU0FBZ0Isa0JBQWtCLENBQUMsS0FBYTtJQUM5QyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDdEUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssNENBQTRDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLEtBQWE7SUFDMUMsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2xFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLDRDQUE0QyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsS0FBYTtJQUM1QyxNQUFNLElBQUksR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5RCxNQUFNLEtBQUssR0FBa0IsRUFBRSxDQUFDO0lBQ2hDLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM1RCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxxQkFBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkQsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFNoYXJlZCBzYWZlIHNsb3QtZm9yLWNvaW4gbWFwcGluZy5cbiAqXG4gKiBNYXBzIGEgY29pbiBjaGFpbiArIG1pbnRpbmcgbW9kZWwgdG8gdGhlIHNhZmUgcm9vdCBzbG90IHRoYXQgZGVyaXZlcyBpdC4gVGhlIHNsb3RcbiAqIGlzIGEgc2lnbmluZyBzY2hlbWUsIG5vdCBhIGNvaW46IHNsb3Qg4pGgIHNlY3AyNTZrMU11bHRpc2lnIHNlcnZlcyBVVFhPICsgWFJQICsgVFJYICsg4oCmLFxuICogc2xvdCDikaEgZWQyNTUxOU11bHRpc2lnIHNlcnZlcyBBTEdPL1hMTS9IQkFSLCBhbmQgdGhlIE1QQyBzbG90cyBzZXJ2ZSBUU1MgY29pbnMuXG4gKlxuICogVGhlIG11bHRpc2lnVHlwZS12cy1jb2luIHZhbGlkYXRpb24gc3RheXMgaW4gc2RrLWNvcmUgKGl0IG5lZWRzIElCYXNlQ29pbik7IHRoZXNlXG4gKiBmdW5jdGlvbnMgdGFrZSBvbmx5IHRoZSBjaGFpbiBzbyB0aGlzIGxlYWYgbmV2ZXIgaW1wb3J0cyBzZGstY29yZS5cbiAqL1xuaW1wb3J0IHsgY29pbnMsIENvaW5GZWF0dXJlLCBLZXlDdXJ2ZSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB0eXBlIHsgUm9vdEtleVR5cGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxudHlwZSBPbmNoYWluU2FmZVJvb3RLZXlTbG90ID0gRXh0cmFjdDxSb290S2V5VHlwZSwgJ3NlY3AyNTZrMU11bHRpc2lnJyB8ICdlZDI1NTE5TXVsdGlzaWcnPjtcbnR5cGUgVHNzU2FmZVJvb3RLZXlTbG90ID0gRXh0cmFjdDxSb290S2V5VHlwZSwgJ2VjZHNhTXBjJyB8ICdlZGRzYU1wYyc+O1xuXG4vKipcbiAqIEV4aGF1c3RpdmUgY3VydmUg4oaSIHNsb3QgcmVnaXN0cnkuIFBhbGxhcyBtYXBzIHRvIG5vdGhpbmc6IGEgUGFsbGFzIGNvaW4gaGFzIG5vIHNhZmVcbiAqIHJvb3Qgc2xvdC4gVGhlIGNvbXBpbGVyIGd1YXJhbnRlZXMgZXZlcnkge0BsaW5rIEtleUN1cnZlfSBtZW1iZXIgaXMgcHJlc2VudC5cbiAqL1xuY29uc3QgQ1VSVkVfVE9fU0xPVFM6IFJlY29yZDxLZXlDdXJ2ZSwgeyBvbmNoYWluPzogT25jaGFpblNhZmVSb290S2V5U2xvdDsgdHNzPzogVHNzU2FmZVJvb3RLZXlTbG90IH0+ID0ge1xuICBbS2V5Q3VydmUuU2VjcDI1NmsxXTogeyBvbmNoYWluOiAnc2VjcDI1NmsxTXVsdGlzaWcnLCB0c3M6ICdlY2RzYU1wYycgfSxcbiAgW0tleUN1cnZlLkVkMjU1MTldOiB7IG9uY2hhaW46ICdlZDI1NTE5TXVsdGlzaWcnLCB0c3M6ICdlZGRzYU1wYycgfSxcbiAgW0tleUN1cnZlLlBhbGxhc106IHt9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uY2hhaW5TbG90Rm9yQ29pbihjaGFpbjogc3RyaW5nKTogT25jaGFpblNhZmVSb290S2V5U2xvdCB7XG4gIGNvbnN0IHNsb3QgPSBDVVJWRV9UT19TTE9UU1tjb2lucy5nZXQoY2hhaW4pLnByaW1hcnlLZXlDdXJ2ZV0ub25jaGFpbjtcbiAgaWYgKCFzbG90KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb2luICcke2NoYWlufScgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2FmZSB3YWxsZXQgbWludGluZ2ApO1xuICB9XG4gIHJldHVybiBzbG90O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHNzU2xvdEZvckNvaW4oY2hhaW46IHN0cmluZyk6IFRzc1NhZmVSb290S2V5U2xvdCB7XG4gIGNvbnN0IHNsb3QgPSBDVVJWRV9UT19TTE9UU1tjb2lucy5nZXQoY2hhaW4pLnByaW1hcnlLZXlDdXJ2ZV0udHNzO1xuICBpZiAoIXNsb3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvaW4gJyR7Y2hhaW59JyBpcyBub3Qgc3VwcG9ydGVkIGZvciBzYWZlIHdhbGxldCBtaW50aW5nYCk7XG4gIH1cbiAgcmV0dXJuIHNsb3Q7XG59XG5cbi8qKlxuICogRXZlcnkgc2FmZSByb290IHNsb3QgYSBjb2luIGNhbiBiZSBtaW50ZWQgdW5kZXIsIGluIGRldGVybWluaXN0aWMgb3JkZXIgKG9uY2hhaW4gZmlyc3QsXG4gKiB0aGVuIHRzcykuIE1pcnJvcnMgd2FsbGV0LXBsYXRmb3JtJ3MgbWludCB0cnV0aDogdGhlIG9uY2hhaW4gc2xvdCBpcyBpbmNsdWRlZCBpZmYgdGhlIGNvaW5cbiAqIGNhcnJpZXMge0BsaW5rIENvaW5GZWF0dXJlLk1VTFRJU0lHfSwgdGhlIHRzcyBzbG90IGlmZiBpdCBjYXJyaWVzIHtAbGluayBDb2luRmVhdHVyZS5UU1N9LlxuICogQSBjb2luIHRoYXQgbWludHMgdW5kZXIgbmVpdGhlciAoZS5nLiBhIFBhbGxhcyBjb2luKSB5aWVsZHMgYFtdYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVTbG90c0ZvckNvaW4oY2hhaW46IHN0cmluZyk6IFJvb3RLZXlUeXBlW10ge1xuICBjb25zdCBjb2luID0gY29pbnMuZ2V0KGNoYWluKTtcbiAgY29uc3QgeyBvbmNoYWluLCB0c3MgfSA9IENVUlZFX1RPX1NMT1RTW2NvaW4ucHJpbWFyeUtleUN1cnZlXTtcbiAgY29uc3Qgc2xvdHM6IFJvb3RLZXlUeXBlW10gPSBbXTtcbiAgaWYgKG9uY2hhaW4gJiYgY29pbi5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5NVUxUSVNJRykpIHtcbiAgICBzbG90cy5wdXNoKG9uY2hhaW4pO1xuICB9XG4gIGlmICh0c3MgJiYgY29pbi5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5UU1MpKSB7XG4gICAgc2xvdHMucHVzaCh0c3MpO1xuICB9XG4gIHJldHVybiBzbG90cztcbn1cbiJdfQ==