@bitgo/sdk-lib-safes 1.3.0 → 1.5.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.
@@ -7,6 +7,5 @@ export * from './ed25519KeyDeriver';
7
7
  export * from './ed25519Pub';
8
8
  export * from './keycardCodec';
9
9
  export * from './safeDerivation';
10
- export * from './safeRecovery';
11
10
  export * from './safeSlot';
12
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,gBAAgB,CAAC;AAC/B,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
@@ -23,6 +23,5 @@ __exportStar(require("./ed25519KeyDeriver"), exports);
23
23
  __exportStar(require("./ed25519Pub"), exports);
24
24
  __exportStar(require("./keycardCodec"), exports);
25
25
  __exportStar(require("./safeDerivation"), exports);
26
- __exportStar(require("./safeRecovery"), exports);
27
26
  __exportStar(require("./safeSlot"), exports);
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0dBSUc7QUFDSCxzREFBb0M7QUFDcEMsK0NBQTZCO0FBQzdCLGlEQUErQjtBQUMvQixtREFBaUM7QUFDakMsaURBQStCO0FBQy9CLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBQdXJlIFNhZmUgZGVyaXZhdGlvbiBhbmQga2V5Y2FyZCBib3ggY29kZWMgbGVhZi4gTmV2ZXIgaW1wb3J0cyBzZGstY29yZS9CYXNlQ29pbi9XYWxsZXQvU2FmZS9rZXktY2FyZC5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9lZDI1NTE5S2V5RGVyaXZlcic7XG5leHBvcnQgKiBmcm9tICcuL2VkMjU1MTlQdWInO1xuZXhwb3J0ICogZnJvbSAnLi9rZXljYXJkQ29kZWMnO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlRGVyaXZhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3NhZmVSZWNvdmVyeSc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmVTbG90JztcbiJdfQ==
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0dBSUc7QUFDSCxzREFBb0M7QUFDcEMsK0NBQTZCO0FBQzdCLGlEQUErQjtBQUMvQixtREFBaUM7QUFDakMsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFB1cmUgU2FmZSBkZXJpdmF0aW9uIGFuZCBrZXljYXJkIGJveCBjb2RlYyBsZWFmLiBOZXZlciBpbXBvcnRzIHNkay1jb3JlL0Jhc2VDb2luL1dhbGxldC9TYWZlL2tleS1jYXJkLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2VkMjU1MTlLZXlEZXJpdmVyJztcbmV4cG9ydCAqIGZyb20gJy4vZWQyNTUxOVB1Yic7XG5leHBvcnQgKiBmcm9tICcuL2tleWNhcmRDb2RlYyc7XG5leHBvcnQgKiBmcm9tICcuL3NhZmVEZXJpdmF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vc2FmZVNsb3QnO1xuIl19
@@ -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
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FmZURlcml2YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUNBLDREQWFDO0FBRUQsc0VBRUM7QUEwQkQsd0ZBT0M7QUFtQkQsMEVBSUM7QUFHRCxrRkFPQztBQXdCRCxnRkFnQkM7QUFjRCx3RUFZQztBQXhMRDs7Ozs7Ozs7OztHQVVHO0FBQ0gseUNBQTJCO0FBQzNCLGdEQUFrQztBQUNsQyw4Q0FBd0Q7QUFDeEQsNENBQWlEO0FBQ2pELDJEQUF3RDtBQUN4RCxxQ0FBMkM7QUFDM0MsNkNBQTJGO0FBRTlFLFFBQUEsc0NBQXNDLEdBQUcsYUFBYSxDQUFDO0FBZ0JwRSxTQUFnQix3QkFBd0IsQ0FBQyxLQUFzQjtJQUM3RCxJQUFJLEdBQVcsQ0FBQztJQUNoQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDZCxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEtBQUssb0NBQW9DLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcseUJBQWUsRUFBRSxDQUFDO1FBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEtBQUssb0NBQW9DLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBZ0IsNkJBQTZCLENB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QUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUN0QyxLQUFLLEVBQUUsYUFBYTtLQUNyQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsOEJBQThCLENBQUMsT0FBZSxFQUFFLEtBQXNCO0lBQ3BGLE1BQU0sR0FBRyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFELE1BQU0sVUFBVSxHQUFHLElBQUEsMENBQTZCLEVBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFFLE1BQU0sU0FBUyxHQUFHLHFDQUFpQixDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQy9FLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxHQUFHLEdBQUcsSUFBQSx5Q0FBNEIsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLE9BQU87UUFDTCxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzNDLEdBQUc7UUFDSCxjQUFjO0tBQ2YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgU2hhcmVkIHNhZmUgY2hpbGQgZGVyaXZhdGlvbiBmb3IgbWludCwgc2lnbiwgYW5kIHJlY292ZXJ5LlxuICpcbiAqIFVzZXIgY2hpbGQ6IGhhcmRlbmVkIGBtLzxpbmRleD4nYCBmcm9tIHRoZSBzZXF1ZW50aWFsIGBzYWZlLmRlcml2YXRpb25JbmRleFtzbG90XWAuXG4gKiBCYWNrdXAgLyBCaXRHbyBjaGlsZHJlbiBhcmUgc29mdC1kZXJpdmVkIGF0IGBtLzxpbmRleD5gIGNsaWVudC1zaWRlIGZvciByZWNvdmVyeS5cbiAqXG4gKiBEbyBub3QgdXNlIGBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkYCAvIGBkZXJpdmVLZXlXaXRoU2VlZGAgKGBtLzk5OTk5OS9hL2JgKSDigJRcbiAqIHRoYXQgaXMgdGhlIGN1c3RvZHkgaGFzaGVkIHBhdGggYW5kIGNhbm5vdCByZXByb2R1Y2UgYSBzYWZlIGNoaWxkLlxuICovXG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCAqIGFzIG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7IGJpcDMyLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBNQVhfQklQMzJfSU5ERVggfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBFZDI1NTE5S2V5RGVyaXZlciB9IGZyb20gJy4vZWQyNTUxOUtleURlcml2ZXInO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi9jb2RlY3MnO1xuaW1wb3J0IHsgZGVjb2RlRWQyNTUxOVN0cktleVNlY3JldFNlZWQsIGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkgfSBmcm9tICcuL2VkMjU1MTlQdWInO1xuXG5leHBvcnQgY29uc3QgREVSSVZFRF9GUk9NX1BBUkVOVF9XSVRIX0hBUkRFTkVEX1BBVEggPSAvXm1cXC8oXFxkKyknJC87XG5cbmV4cG9ydCB0eXBlIFNhZmVDaGlsZEtleU5hbWUgPSAndXNlcicgfCAnYmFja3VwJyB8ICdiaXRnbyc7XG5cbnR5cGUgQ2hpbGRLZXlTaGFwZTxLIGV4dGVuZHMgU2FmZUNoaWxkS2V5TmFtZT4gPSBLIGV4dGVuZHMgJ2JpdGdvJyA/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==