@bitgo/sdk-lib-mpc 10.11.0 → 10.12.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.
@@ -10,7 +10,7 @@ import { DeserializedMessage, DeserializedMessages, DkgState } from './types';
10
10
  * ```typescript
11
11
  * const dkg = new DKG(3, 2, 0);
12
12
  * // X25519 keys come from GPG encryption subkeys (extracted by the orchestrator)
13
- * dkg.initDkg(myX25519PrivKey, [otherParty1X25519PubKey, otherParty2X25519PubKey]);
13
+ * await dkg.initDkg(myX25519PrivKey, [otherParty1X25519PubKey, otherParty2X25519PubKey]);
14
14
  * const msg1 = dkg.getFirstMessage();
15
15
  * const msg2s = dkg.handleIncomingMessages(allThreeMsg1s);
16
16
  * dkg.handleIncomingMessages(allThreeMsg2s); // completes DKG
@@ -31,8 +31,14 @@ export declare class DKG {
31
31
  private keyShare;
32
32
  /** 32-byte Ed25519 public key from round2 */
33
33
  private sharePk;
34
+ /** 32-byte chain code from round2 */
35
+ private shareChaincode;
36
+ /** Lazily loaded WASM module */
37
+ private wasmMps;
34
38
  protected dkgState: DkgState;
35
39
  constructor(n: number, t: number, partyIdx: number);
40
+ private loadWasmMps;
41
+ private getWasmMps;
36
42
  getState(): DkgState;
37
43
  /**
38
44
  * Initialises the DKG session with this party's X25519 private key and the other parties'
@@ -42,7 +48,7 @@ export declare class DKG {
42
48
  * @param otherEncPublicKeys - Other parties' 32-byte X25519 public keys, sorted by ascending
43
49
  * party index (excluding own). For a 3-party setup, this is [party_A_pub, party_B_pub].
44
50
  */
45
- initDkg(decryptionKey: Buffer, otherEncPublicKeys: Buffer[]): void;
51
+ initDkg(decryptionKey: Buffer, otherEncPublicKeys: Buffer[]): Promise<void>;
46
52
  /**
47
53
  * Runs round0 of the DKG protocol. Returns this party's broadcast message.
48
54
  * Stores the round state bytes internally for the next round.
@@ -72,10 +78,13 @@ export declare class DKG {
72
78
  * Returns the 32-byte Ed25519 public key agreed by all parties during DKG.
73
79
  */
74
80
  getSharePublicKey(): Buffer;
81
+ /**
82
+ * Returns the 128-char hex common keychain: 64-char public key + 64-char chain code.
83
+ * This matches the format expected by address derivation (Eddsa.deriveUnhardened).
84
+ */
85
+ getCommonKeychain(): string;
75
86
  /**
76
87
  * Returns a CBOR-encoded reduced representation containing the public key.
77
- * Note: private key material and chain code are not separately accessible
78
- * from @bitgo/wasm-mps; the full keyshare is available via getKeyShare().
79
88
  */
80
89
  getReducedKeyShare(): Buffer;
81
90
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"dkg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dkg.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAwB,MAAM,SAAS,CAAC;AAEpG;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE3B,sDAAsD;IACtD,OAAO,CAAC,aAAa,CAAuB;IAC5C,mGAAmG;IACnG,OAAO,CAAC,YAAY,CAAyB;IAC7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAuB;IACvC,6CAA6C;IAC7C,OAAO,CAAC,OAAO,CAAuB;IAEtC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMlD,QAAQ,IAAI,QAAQ;IAIpB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,IAAI;IAgBlE;;;;;OAKG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAkBtD;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAoDvF;;;OAGG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;;;OAIG;IACH,kBAAkB,IAAI,MAAM;IAU5B;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAepB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAOtC"}
1
+ {"version":3,"file":"dkg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dkg.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAwB,MAAM,SAAS,CAAC;AAMpG;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE3B,sDAAsD;IACtD,OAAO,CAAC,aAAa,CAAuB;IAC5C,mGAAmG;IACnG,OAAO,CAAC,YAAY,CAAyB;IAC7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAuB;IACvC,6CAA6C;IAC7C,OAAO,CAAC,OAAO,CAAuB;IACtC,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAAuB;IAC7C,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;YAMpC,WAAW;IAoBzB,OAAO,CAAC,UAAU;IAOlB,QAAQ,IAAI,QAAQ;IAIpB;;;;;;;OAOG;IACG,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjF;;;;;OAKG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAmBtD;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAuDvF;;;OAGG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAU5B;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAepB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAOtC"}
@@ -1,10 +1,42 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
5
38
  Object.defineProperty(exports, "__esModule", { value: true });
6
39
  exports.DKG = void 0;
7
- const wasm_mps_1 = require("@bitgo/wasm-mps");
8
40
  const cbor_x_1 = require("cbor-x");
9
41
  const crypto_1 = __importDefault(require("crypto"));
10
42
  const types_1 = require("./types");
@@ -19,7 +51,7 @@ const types_1 = require("./types");
19
51
  * ```typescript
20
52
  * const dkg = new DKG(3, 2, 0);
21
53
  * // X25519 keys come from GPG encryption subkeys (extracted by the orchestrator)
22
- * dkg.initDkg(myX25519PrivKey, [otherParty1X25519PubKey, otherParty2X25519PubKey]);
54
+ * await dkg.initDkg(myX25519PrivKey, [otherParty1X25519PubKey, otherParty2X25519PubKey]);
23
55
  * const msg1 = dkg.getFirstMessage();
24
56
  * const msg2s = dkg.handleIncomingMessages(allThreeMsg1s);
25
57
  * dkg.handleIncomingMessages(allThreeMsg2s); // completes DKG
@@ -38,11 +70,39 @@ class DKG {
38
70
  this.keyShare = null;
39
71
  /** 32-byte Ed25519 public key from round2 */
40
72
  this.sharePk = null;
73
+ /** 32-byte chain code from round2 */
74
+ this.shareChaincode = null;
75
+ /** Lazily loaded WASM module */
76
+ this.wasmMps = null;
41
77
  this.dkgState = types_1.DkgState.Uninitialized;
42
78
  this.n = n;
43
79
  this.t = t;
44
80
  this.partyIdx = partyIdx;
45
81
  }
82
+ async loadWasmMps() {
83
+ if (!this.wasmMps) {
84
+ if (typeof window !== 'undefined' &&
85
+ /* checks for electron processes */
86
+ !window.process &&
87
+ !window.process?.['type']) {
88
+ // Browser: web build has explicit init() — guaranteed ready after await
89
+ // eslint-disable-next-line import/no-internal-modules -- @bitgo/wasm-mps exposes environment-specific subpath exports.
90
+ const webWasm = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps/web')));
91
+ await webWasm.default();
92
+ this.wasmMps = webWasm;
93
+ }
94
+ else {
95
+ // Node.js: dynamic import() rewritten to require() by tsc → CJS build → readFileSync
96
+ this.wasmMps = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps')));
97
+ }
98
+ }
99
+ }
100
+ getWasmMps() {
101
+ if (!this.wasmMps) {
102
+ throw Error('WASM module not loaded');
103
+ }
104
+ return this.wasmMps;
105
+ }
46
106
  getState() {
47
107
  return this.dkgState;
48
108
  }
@@ -54,7 +114,8 @@ class DKG {
54
114
  * @param otherEncPublicKeys - Other parties' 32-byte X25519 public keys, sorted by ascending
55
115
  * party index (excluding own). For a 3-party setup, this is [party_A_pub, party_B_pub].
56
116
  */
57
- initDkg(decryptionKey, otherEncPublicKeys) {
117
+ async initDkg(decryptionKey, otherEncPublicKeys) {
118
+ await this.loadWasmMps();
58
119
  if (!decryptionKey || decryptionKey.length !== 32) {
59
120
  throw Error('Missing or invalid decryption key: must be 32 bytes');
60
121
  }
@@ -79,9 +140,10 @@ class DKG {
79
140
  throw Error('DKG session not initialized');
80
141
  }
81
142
  const seed = dkgSeed ?? crypto_1.default.randomBytes(32);
143
+ const wasm = this.getWasmMps();
82
144
  let result;
83
145
  try {
84
- result = (0, wasm_mps_1.ed25519_dkg_round0_process)(this.partyIdx, this.decryptionKey, this.otherPubKeys, seed);
146
+ result = wasm.ed25519_dkg_round0_process(this.partyIdx, this.decryptionKey, this.otherPubKeys, seed);
85
147
  }
86
148
  catch (err) {
87
149
  throw new Error(`Error while creating the first message from party ${this.partyIdx}: ${err}`);
@@ -120,10 +182,11 @@ class DKG {
120
182
  .filter((m) => m.from !== this.partyIdx)
121
183
  .sort((a, b) => a.from - b.from)
122
184
  .map((m) => m.payload);
185
+ const wasm = this.getWasmMps();
123
186
  if (this.dkgState === types_1.DkgState.WaitMsg1) {
124
187
  let result;
125
188
  try {
126
- result = (0, wasm_mps_1.ed25519_dkg_round1_process)(otherMsgs, this.dkgStateBytes);
189
+ result = wasm.ed25519_dkg_round1_process(otherMsgs, this.dkgStateBytes);
127
190
  }
128
191
  catch (err) {
129
192
  throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dkgState}: ${err}`);
@@ -136,13 +199,14 @@ class DKG {
136
199
  if (this.dkgState === types_1.DkgState.WaitMsg2) {
137
200
  let share;
138
201
  try {
139
- share = (0, wasm_mps_1.ed25519_dkg_round2_process)(otherMsgs, this.dkgStateBytes);
202
+ share = wasm.ed25519_dkg_round2_process(otherMsgs, this.dkgStateBytes);
140
203
  }
141
204
  catch (err) {
142
205
  throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dkgState}: ${err}`);
143
206
  }
144
207
  this.keyShare = Buffer.from(share.share);
145
208
  this.sharePk = Buffer.from(share.pk);
209
+ this.shareChaincode = Buffer.from(share.chaincode);
146
210
  this.dkgStateBytes = null;
147
211
  this.dkgState = types_1.DkgState.Complete;
148
212
  return [];
@@ -168,10 +232,18 @@ class DKG {
168
232
  }
169
233
  return this.sharePk;
170
234
  }
235
+ /**
236
+ * Returns the 128-char hex common keychain: 64-char public key + 64-char chain code.
237
+ * This matches the format expected by address derivation (Eddsa.deriveUnhardened).
238
+ */
239
+ getCommonKeychain() {
240
+ if (!this.sharePk || !this.shareChaincode) {
241
+ throw Error('DKG session not initialized');
242
+ }
243
+ return this.sharePk.toString('hex') + this.shareChaincode.toString('hex');
244
+ }
171
245
  /**
172
246
  * Returns a CBOR-encoded reduced representation containing the public key.
173
- * Note: private key material and chain code are not separately accessible
174
- * from @bitgo/wasm-mps; the full keyshare is available via getKeyShare().
175
247
  */
176
248
  getReducedKeyShare() {
177
249
  if (!this.sharePk) {
@@ -214,4 +286,4 @@ class DKG {
214
286
  }
215
287
  }
216
288
  exports.DKG = DKG;
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZGtnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhDQUFxSDtBQUNySCxtQ0FBZ0M7QUFDaEMsb0RBQTRCO0FBQzVCLG1DQUFvRztBQUVwRzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFhLEdBQUc7SUFrQmQsWUFBWSxDQUFTLEVBQUUsQ0FBUyxFQUFFLFFBQWdCO1FBYmxELHNEQUFzRDtRQUM5QyxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFDNUMsbUdBQW1HO1FBQzNGLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUM3QywyRUFBMkU7UUFDbkUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLHFEQUFxRDtRQUM3QyxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2Qyw2Q0FBNkM7UUFDckMsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFFNUIsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE9BQU8sQ0FBQyxhQUFxQixFQUFFLGtCQUE0QjtRQUN6RCxJQUFJLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFB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SSxDQUFDO1FBQzNGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLFlBQXlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEgsQ0FBQztDQUNGO0FBL01ELGtCQStNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVkMjU1MTlfZGtnX3JvdW5kMF9wcm9jZXNzLCBlZDI1NTE5X2RrZ19yb3VuZDFfcHJvY2VzcywgZWQyNTUxOV9ka2dfcm91bmQyX3Byb2Nlc3MgfSBmcm9tICdAYml0Z28vd2FzbS1tcHMnO1xuaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnY2Jvci14JztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IERlc2VyaWFsaXplZE1lc3NhZ2UsIERlc2VyaWFsaXplZE1lc3NhZ2VzLCBEa2dTdGF0ZSwgRWRkc2FSZWR1Y2VkS2V5U2hhcmUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBFZERTQSBEaXN0cmlidXRlZCBLZXkgR2VuZXJhdGlvbiAoREtHKSBpbXBsZW1lbnRhdGlvbiB1c2luZyBAYml0Z28vd2FzbS1tcHMuXG4gKlxuICogU3RhdGUgaXMgZXhwbGljaXQ6IGVhY2ggcm91bmQgZnVuY3Rpb24gcmV0dXJucyBgeyBtc2csIHN0YXRlIH1gIGJ5dGVzLlxuICogVGhlIHN0YXRlIGJ5dGVzIGFyZSBzdG9yZWQgYmV0d2VlbiByb3VuZHMgYW5kIHBhc3NlZCB0byB0aGUgbmV4dCByb3VuZCBmdW5jdGlvbixcbiAqIG1pcnJvcmluZyB0aGUgc2VydmVyLXNpZGUgcGVyc2lzdGVuY2UgcGF0dGVybiAoc3RhdGUgd291bGQgYmUgc2VyaWFsaXNlZCB0byBEQikuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRrZyA9IG5ldyBES0coMywgMiwgMCk7XG4gKiAvLyBYMjU1MTkga2V5cyBjb21lIGZyb20gR1BHIGVuY3J5cHRpb24gc3Via2V5cyAoZXh0cmFjdGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IpXG4gKiBka2cuaW5pdERrZyhteVgyNTUxOVByaXZLZXksIFtvdGhlclBhcnR5MVgyNTUxOVB1YktleSwgb3RoZXJQYXJ0eTJYMjU1MTlQdWJLZXldKTtcbiAqIGNvbnN0IG1zZzEgPSBka2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCBtc2cycyA9IGRrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKGFsbFRocmVlTXNnMXMpO1xuICogZGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoYWxsVGhyZWVNc2cycyk7ICAvLyBjb21wbGV0ZXMgREtHXG4gKiBjb25zdCBrZXlTaGFyZSA9IGRrZy5nZXRLZXlTaGFyZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBES0cge1xuICBwcm90ZWN0ZWQgbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgdDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgcGFydHlJZHg6IG51bWJlcjtcblxuICAvKiogUHJpdmF0ZSBYMjU1MTkga2V5IChmcm9tIEdQRyBlbmNyeXB0aW9uIHN1YmtleSkgKi9cbiAgcHJpdmF0ZSBkZWNyeXB0aW9uS2V5OiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE90aGVyIHBhcnRpZXMnIFgyNTUxOSBwdWJsaWMga2V5cyAoZnJvbSB0aGVpciBHUEcgZW5jcnlwdGlvbiBzdWJrZXlzKSwgc29ydGVkIGJ5IHBhcnR5IGluZGV4ICovXG4gIHByaXZhdGUgb3RoZXJQdWJLZXlzOiBCdWZmZXJbXSB8IG51bGwgPSBudWxsO1xuICAvKiogU2VyaWFsaXNlZCByb3VuZCBzdGF0ZSBieXRlcyByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgcm91bmQgZnVuY3Rpb24gKi9cbiAgcHJpdmF0ZSBka2dTdGF0ZUJ5dGVzOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQga2V5c2hhcmUgZnJvbSByb3VuZDIgKi9cbiAgcHJpdmF0ZSBrZXlTaGFyZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiAzMi1ieXRlIEVkMjU1MTkgcHVibGljIGtleSBmcm9tIHJvdW5kMiAqL1xuICBwcml2YXRlIHNoYXJlUGs6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBka2dTdGF0ZTogRGtnU3RhdGUgPSBEa2dTdGF0ZS5VbmluaXRpYWxpemVkO1xuXG4gIGNvbnN0cnVjdG9yKG46IG51bWJlciwgdDogbnVtYmVyLCBwYXJ0eUlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLnQgPSB0O1xuICAgIHRoaXMucGFydHlJZHggPSBwYXJ0eUlkeDtcbiAgfVxuXG4gIGdldFN0YXRlKCk6IERrZ1N0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5ka2dTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlcyB0aGUgREtHIHNlc3Npb24gd2l0aCB0aGlzIHBhcnR5J3MgWDI1NTE5IHByaXZhdGUga2V5IGFuZCB0aGUgb3RoZXIgcGFydGllcydcbiAgICogWDI1NTE5IHB1YmxpYyBrZXlzLiBLZXlzIGFyZSBleHRyYWN0ZWQgZnJvbSBHUEcgZW5jcnlwdGlvbiBzdWJrZXlzIGJ5IHRoZSBvcmNoZXN0cmF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBkZWNyeXB0aW9uS2V5IC0gVGhpcyBwYXJ0eSdzIDMyLWJ5dGUgWDI1NTE5IHByaXZhdGUga2V5IChHUEcgZW5jIHN1YmtleSBwcml2YXRlIHBhcnQpLlxuICAgKiBAcGFyYW0gb3RoZXJFbmNQdWJsaWNLZXlzIC0gT3RoZXIgcGFydGllcycgMzItYnl0ZSBYMjU1MTkgcHVibGljIGtleXMsIHNvcnRlZCBieSBhc2NlbmRpbmdcbiAgICogICBwYXJ0eSBpbmRleCAoZXhjbHVkaW5nIG93bikuIEZvciBhIDMtcGFydHkgc2V0dXAsIHRoaXMgaXMgW3BhcnR5X0FfcHViLCBwYXJ0eV9CX3B1Yl0uXG4gICAqL1xuICBpbml0RGtnKGRlY3J5cHRpb25LZXk6IEJ1ZmZlciwgb3RoZXJFbmNQdWJsaWNLZXlzOiBCdWZmZXJbXSk6IHZvaWQge1xuICAgIGlmICghZGVjcnlwdGlvbktleSB8fCBkZWNyeXB0aW9uS2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgZGVjcnlwdGlvbiBrZXk6IG11c3QgYmUgMzIgYnl0ZXMnKTtcbiAgICB9XG4gICAgaWYgKCFvdGhlckVuY1B1YmxpY0tleXMgfHwgb3RoZXJFbmNQdWJsaWNLZXlzLmxlbmd0aCAhPT0gdGhpcy5uIC0gMSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEV4cGVjdGVkICR7dGhpcy5uIC0gMX0gb3RoZXIgcGFydGllcycgcHVibGljIGtleXNgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudCA+IHRoaXMubiB8fCB0aGlzLnBhcnR5SWR4ID49IHRoaXMubikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgcGFyYW1ldGVycyBmb3IgREtHJyk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWNyeXB0aW9uS2V5ID0gZGVjcnlwdGlvbktleTtcbiAgICB0aGlzLm90aGVyUHViS2V5cyA9IG90aGVyRW5jUHVibGljS2V5cztcbiAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuSW5pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJvdW5kMCBvZiB0aGUgREtHIHByb3RvY29sLiBSZXR1cm5zIHRoaXMgcGFydHkncyBicm9hZGNhc3QgbWVzc2FnZS5cbiAgICogU3RvcmVzIHRoZSByb3VuZCBzdGF0ZSBieXRlcyBpbnRlcm5hbGx5IGZvciB0aGUgbmV4dCByb3VuZC5cbiAgICpcbiAgICogQHBhcmFtIGRrZ1NlZWQgLSBPcHRpb25hbCAzMi1ieXRlIHNlZWQgZm9yIGRldGVybWluaXN0aWMgREtHIG91dHB1dCAodGVzdGluZyBvbmx5KS5cbiAgICovXG4gIGdldEZpcnN0TWVzc2FnZShka2dTZWVkPzogQnVmZmVyKTogRGVzZXJpYWxpemVkTWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgIT09IERrZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWVkID0gZGtnU2VlZCA/PyBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGVkMjU1MTlfZGtnX3JvdW5kMF9wcm9jZXNzKHRoaXMucGFydHlJZHgsIHRoaXMuZGVjcnlwdGlvbktleSEsIHRoaXMub3RoZXJQdWJLZXlzISwgc2VlZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fTogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5ka2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuV2FpdE1zZzE7XG4gICAgcmV0dXJuIHsgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIG1lc3NhZ2VzIGZyb20gYWxsIHBhcnRpZXMgYW5kIGFkdmFuY2VzIHRoZSBwcm90b2NvbC5cbiAgICpcbiAgICogLSBJbiBXYWl0TXNnMTogcnVucyByb3VuZDEsIHJldHVybnMgdGhpcyBwYXJ0eSdzIHJvdW5kMSBicm9hZGNhc3QgbWVzc2FnZS5cbiAgICogLSBJbiBXYWl0TXNnMjogcnVucyByb3VuZDIsIGNvbXBsZXRlcyBES0csIHJldHVybnMgW10uXG4gICAqXG4gICAqIFRoZSBjYWxsZXIgcGFzc2VzIGFsbCBuIG1lc3NhZ2VzIChpbmNsdWRpbmcgb3duKTsgb3duIG1lc3NhZ2UgaXMgZmlsdGVyZWRcbiAgICogb3V0IGludGVybmFsbHkuIE90aGVyIHBhcnRpZXMnIG1lc3NhZ2VzIGFyZSBzb3J0ZWQgYnkgYXNjZW5kaW5nIHBhcnR5IGluZGV4LFxuICAgKiBtYXRjaGluZyB0aGUgb3JkZXJpbmcgZXhwZWN0ZWQgYnkgQGJpdGdvL3dhc20tbXBzLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZXNGb3JJdGhSb3VuZCAtIEFsbCBuIG1lc3NhZ2VzIGZvciB0aGlzIHJvdW5kIChpbmNsdWRpbmcgb3duKS5cbiAgICovXG4gIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnREtHIHNlc3Npb24gbXVzdCBjYWxsIGdldEZpcnN0TWVzc2FnZSgpIGJlZm9yZSBoYW5kbGluZyBpbmNvbWluZyBtZXNzYWdlcy4gQ2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBmaXJzdC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZXNGb3JJdGhSb3VuZC5sZW5ndGggIT09IHRoaXMubikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgbnVtYmVyIG9mIG1lc3NhZ2VzIGZvciB0aGUgcm91bmQuIE51bWJlciBvZiBtZXNzYWdlcyBzaG91bGQgYmUgZXF1YWwgdG8gTicpO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3Qgb3RoZXIgcGFydGllcycgbWVzc2FnZXMsIHNvcnRlZCBieSBwYXJ0eSBpbmRleCAoYXNjZW5kaW5nKVxuICAgIGNvbnN0IG90aGVyTXNncyA9IG1lc3NhZ2VzRm9ySXRoUm91bmRcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0uZnJvbSAhPT0gdGhpcy5wYXJ0eUlkeClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pXG4gICAgICAubWFwKChtKSA9PiBtLnBheWxvYWQpO1xuXG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLldhaXRNc2cxKSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZWQyNTUxOV9ka2dfcm91bmQxX3Byb2Nlc3Mob3RoZXJNc2dzLCB0aGlzLmRrZ1N0YXRlQnl0ZXMhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRrZ1N0YXRlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgICAvLyBTdG9yZSBuZXcgc3RhdGU7IHRoaXMgaXMgd2hhdCB3b3VsZCBiZSBwZXJzaXN0ZWQgdG8gREIgYmV0d2VlbiBBUEkgcm91bmRzXG4gICAgICB0aGlzLmRrZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLldhaXRNc2cyO1xuICAgICAgcmV0dXJuIFt7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH1dO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5XYWl0TXNnMikge1xuICAgICAgbGV0IHNoYXJlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2hhcmUgPSBlZDI1NTE5X2RrZ19yb3VuZDJfcHJvY2VzcyhvdGhlck1zZ3MsIHRoaXMuZGtnU3RhdGVCeXRlcyEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZGtnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5U2hhcmUgPSBCdWZmZXIuZnJvbShzaGFyZS5zaGFyZSk7XG4gICAgICB0aGlzLnNoYXJlUGsgPSBCdWZmZXIuZnJvbShzaGFyZS5wayk7XG4gICAgICB0aGlzLmRrZ1N0YXRlQnl0ZXMgPSBudWxsO1xuICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHRocm93IEVycm9yKCdVbmV4cGVjdGVkIERLRyBzdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQga2V5c2hhcmUgcHJvZHVjZWQgYnkgcm91bmQyLlxuICAgKiBUaGlzIGlzIHVzZWQgYXMgaW5wdXQgdG8gdGhlIHNpZ25pbmcgcHJvdG9jb2wuXG4gICAqL1xuICBnZXRLZXlTaGFyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5rZXlTaGFyZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXlTaGFyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSAzMi1ieXRlIEVkMjU1MTkgcHVibGljIGtleSBhZ3JlZWQgYnkgYWxsIHBhcnRpZXMgZHVyaW5nIERLRy5cbiAgICovXG4gIGdldFNoYXJlUHVibGljS2V5KCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLnNoYXJlUGspIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVQaztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQ0JPUi1lbmNvZGVkIHJlZHVjZWQgcmVwcmVzZW50YXRpb24gY29udGFpbmluZyB0aGUgcHVibGljIGtleS5cbiAgICogTm90ZTogcHJpdmF0ZSBrZXkgbWF0ZXJpYWwgYW5kIGNoYWluIGNvZGUgYXJlIG5vdCBzZXBhcmF0ZWx5IGFjY2Vzc2libGVcbiAgICogZnJvbSBAYml0Z28vd2FzbS1tcHM7IHRoZSBmdWxsIGtleXNoYXJlIGlzIGF2YWlsYWJsZSB2aWEgZ2V0S2V5U2hhcmUoKS5cbiAgICovXG4gIGdldFJlZHVjZWRLZXlTaGFyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5zaGFyZVBrKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlZHVjZWRLZXlTaGFyZTogRWRkc2FSZWR1Y2VkS2V5U2hhcmUgPSB7XG4gICAgICBwdWI6IEFycmF5LmZyb20odGhpcy5zaGFyZVBrKSxcbiAgICB9O1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShlbmNvZGUocmVkdWNlZEtleVNoYXJlKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3VycmVudCBzZXNzaW9uIHN0YXRlIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHBlcnNpc3RlbmNlLlxuICAgKiBJbmNsdWRlczogcm91bmQgc3RhdGUgYnl0ZXMsIGN1cnJlbnQgREtHIHJvdW5kLCBkZWNyeXB0aW9uIGtleSwgb3RoZXIgcGFydGllcycgcHViIGtleXMuXG4gICAqIFRoaXMgbWlycm9ycyB3aGF0IGEgc2VydmVyIHdvdWxkIHN0b3JlIGluIGEgZGF0YWJhc2UgYmV0d2VlbiBBUEkgcm91bmRzLlxuICAgKi9cbiAgZ2V0U2Vzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIGlzIGNvbXBsZXRlLiBFeHBvcnRpbmcgdGhlIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBka2dTdGF0ZUJ5dGVzOiB0aGlzLmRrZ1N0YXRlQnl0ZXM/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgZGtnUm91bmQ6IHRoaXMuZGtnU3RhdGUsXG4gICAgICBkZWNyeXB0aW9uS2V5OiB0aGlzLmRlY3J5cHRpb25LZXk/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgb3RoZXJQdWJLZXlzOiB0aGlzLm90aGVyUHViS2V5cz8ubWFwKChrKSA9PiBrLnRvU3RyaW5nKCdiYXNlNjQnKSkgPz8gbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZVxuICAgKiBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShzZXNzaW9uKTtcbiAgICB0aGlzLmRrZ1N0YXRlQnl0ZXMgPSBkYXRhLmRrZ1N0YXRlQnl0ZXMgPyBCdWZmZXIuZnJvbShkYXRhLmRrZ1N0YXRlQnl0ZXMsICdiYXNlNjQnKSA6IG51bGw7XG4gICAgdGhpcy5ka2dTdGF0ZSA9IGRhdGEuZGtnUm91bmQ7XG4gICAgdGhpcy5kZWNyeXB0aW9uS2V5ID0gZGF0YS5kZWNyeXB0aW9uS2V5ID8gQnVmZmVyLmZyb20oZGF0YS5kZWNyeXB0aW9uS2V5LCAnYmFzZTY0JykgOiBudWxsO1xuICAgIHRoaXMub3RoZXJQdWJLZXlzID0gZGF0YS5vdGhlclB1YktleXMgPyAoZGF0YS5vdGhlclB1YktleXMgYXMgc3RyaW5nW10pLm1hcCgoaykgPT4gQnVmZmVyLmZyb20oaywgJ2Jhc2U2NCcpKSA6IG51bGw7XG4gIH1cbn1cbiJdfQ==
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZGtnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLG1DQUFnQztBQUNoQyxvREFBNEI7QUFDNUIsbUNBQW9HO0FBTXBHOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQWEsR0FBRztJQXNCZCxZQUFZLENBQVMsRUFBRSxDQUFTLEVBQUUsUUFBZ0I7UUFqQmxELHNEQUFzRDtRQUM5QyxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFDNUMsbUdBQW1HO1FBQzNGLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUM3QywyRUFBMkU7UUFDbkUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLHFEQUFxRDtRQUM3QyxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2Qyw2Q0FBNkM7UUFDckMsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFDdEMscUNBQXFDO1FBQzdCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QyxnQ0FBZ0M7UUFDeEIsWUFBTyxHQUFtQixJQUFJLENBQUM7UUFFN0IsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVc7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUNFLE9BQU8sTUFBTSxLQUFLLFdBQVc7Z0JBQzdCLG1DQUFtQztnQkFDbkMsQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDZixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFDekIsQ0FBQztnQkFDRCx3RUFBd0U7Z0JBQ3hFLHVIQUF1SDtnQkFDdkgsTUFBTSxPQUFPLEdBQUcsd0RBQWEscUJBQXFCLEdBQUMsQ0FBQztnQkFDcEQsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3pCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixxRkFBcUY7Z0JBQ3JGLElBQUksQ0FBQyxPQUFPLEdBQUcsd0RBQWEsaUJBQWlCLEdBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFxQixFQUFFLGtCQUE0QjtRQUMvRCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sS0FBSyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBUSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsT0FBZ0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEMsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLGdCQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLE1BQWdCLENBQUM7UUFDckIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFjLEVBQUUsSUFBSSxDQUFDLFlBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELElBQUksQ0FBQyxRQUFRLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFRLENBQUMsUUFBUSxDQUFDO1FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsc0JBQXNCLENBQUMsbUJBQXlDO1FBQzlELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BDLE1BQU0sS0FBSyxDQUNULDBHQUEwRyxDQUMzRyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssQ0FBQyxtRkFBbUYsQ0FBQyxDQUFDO1FBQ25HLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsTUFBTSxTQUFTLEdBQUcsbUJBQW1CO2FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3ZDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFL0IsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsSUFBSSxNQUFnQixDQUFDO1lBQ3JCLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYyxDQUFDLENBQUM7WUFDM0UsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0csQ0FBQztZQUNELDRFQUE0RTtZQUM1RSxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQVEsQ0FBQyxRQUFRLENBQUM7WUFDbEMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLElBQUksS0FBWSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYyxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0csQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQVEsQ0FBQyxRQUFRLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUF5QjtZQUM1QyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQzlCLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBQSxlQUFNLEVBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUk7WUFDN0QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJO1lBQzdELFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUk7U0FDMUUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxPQUFlO1FBQzVCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxZQUF5QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RILENBQUM7Q0FDRjtBQTVQRCxrQkE0UEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1zZ1N0YXRlLCBTaGFyZSB9IGZyb20gJ0BiaXRnby93YXNtLW1wcyc7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIERrZ1N0YXRlLCBFZGRzYVJlZHVjZWRLZXlTaGFyZSB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5vZGVXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbnR5cGUgV2ViV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzL3dlYicpO1xudHlwZSBXYXNtTXBzID0gTm9kZVdhc21lciB8IFdlYldhc21lcjtcblxuLyoqXG4gKiBFZERTQSBEaXN0cmlidXRlZCBLZXkgR2VuZXJhdGlvbiAoREtHKSBpbXBsZW1lbnRhdGlvbiB1c2luZyBAYml0Z28vd2FzbS1tcHMuXG4gKlxuICogU3RhdGUgaXMgZXhwbGljaXQ6IGVhY2ggcm91bmQgZnVuY3Rpb24gcmV0dXJucyBgeyBtc2csIHN0YXRlIH1gIGJ5dGVzLlxuICogVGhlIHN0YXRlIGJ5dGVzIGFyZSBzdG9yZWQgYmV0d2VlbiByb3VuZHMgYW5kIHBhc3NlZCB0byB0aGUgbmV4dCByb3VuZCBmdW5jdGlvbixcbiAqIG1pcnJvcmluZyB0aGUgc2VydmVyLXNpZGUgcGVyc2lzdGVuY2UgcGF0dGVybiAoc3RhdGUgd291bGQgYmUgc2VyaWFsaXNlZCB0byBEQikuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRrZyA9IG5ldyBES0coMywgMiwgMCk7XG4gKiAvLyBYMjU1MTkga2V5cyBjb21lIGZyb20gR1BHIGVuY3J5cHRpb24gc3Via2V5cyAoZXh0cmFjdGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IpXG4gKiBhd2FpdCBka2cuaW5pdERrZyhteVgyNTUxOVByaXZLZXksIFtvdGhlclBhcnR5MVgyNTUxOVB1YktleSwgb3RoZXJQYXJ0eTJYMjU1MTlQdWJLZXldKTtcbiAqIGNvbnN0IG1zZzEgPSBka2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCBtc2cycyA9IGRrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKGFsbFRocmVlTXNnMXMpO1xuICogZGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoYWxsVGhyZWVNc2cycyk7ICAvLyBjb21wbGV0ZXMgREtHXG4gKiBjb25zdCBrZXlTaGFyZSA9IGRrZy5nZXRLZXlTaGFyZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBES0cge1xuICBwcm90ZWN0ZWQgbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgdDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgcGFydHlJZHg6IG51bWJlcjtcblxuICAvKiogUHJpdmF0ZSBYMjU1MTkga2V5IChmcm9tIEdQRyBlbmNyeXB0aW9uIHN1YmtleSkgKi9cbiAgcHJpdmF0ZSBkZWNyeXB0aW9uS2V5OiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE90aGVyIHBhcnRpZXMnIFgyNTUxOSBwdWJsaWMga2V5cyAoZnJvbSB0aGVpciBHUEcgZW5jcnlwdGlvbiBzdWJrZXlzKSwgc29ydGVkIGJ5IHBhcnR5IGluZGV4ICovXG4gIHByaXZhdGUgb3RoZXJQdWJLZXlzOiBCdWZmZXJbXSB8IG51bGwgPSBudWxsO1xuICAvKiogU2VyaWFsaXNlZCByb3VuZCBzdGF0ZSBieXRlcyByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgcm91bmQgZnVuY3Rpb24gKi9cbiAgcHJpdmF0ZSBka2dTdGF0ZUJ5dGVzOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQga2V5c2hhcmUgZnJvbSByb3VuZDIgKi9cbiAgcHJpdmF0ZSBrZXlTaGFyZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiAzMi1ieXRlIEVkMjU1MTkgcHVibGljIGtleSBmcm9tIHJvdW5kMiAqL1xuICBwcml2YXRlIHNoYXJlUGs6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogMzItYnl0ZSBjaGFpbiBjb2RlIGZyb20gcm91bmQyICovXG4gIHByaXZhdGUgc2hhcmVDaGFpbmNvZGU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogTGF6aWx5IGxvYWRlZCBXQVNNIG1vZHVsZSAqL1xuICBwcml2YXRlIHdhc21NcHM6IFdhc21NcHMgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZGtnU3RhdGU6IERrZ1N0YXRlID0gRGtnU3RhdGUuVW5pbml0aWFsaXplZDtcblxuICBjb25zdHJ1Y3RvcihuOiBudW1iZXIsIHQ6IG51bWJlciwgcGFydHlJZHg6IG51bWJlcikge1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy50ID0gdDtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRXYXNtTXBzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy53YXNtTXBzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIC8qIGNoZWNrcyBmb3IgZWxlY3Ryb24gcHJvY2Vzc2VzICovXG4gICAgICAgICF3aW5kb3cucHJvY2VzcyAmJlxuICAgICAgICAhd2luZG93LnByb2Nlc3M/LlsndHlwZSddXG4gICAgICApIHtcbiAgICAgICAgLy8gQnJvd3Nlcjogd2ViIGJ1aWxkIGhhcyBleHBsaWNpdCBpbml0KCkg4oCUIGd1YXJhbnRlZWQgcmVhZHkgYWZ0ZXIgYXdhaXRcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzIC0tIEBiaXRnby93YXNtLW1wcyBleHBvc2VzIGVudmlyb25tZW50LXNwZWNpZmljIHN1YnBhdGggZXhwb3J0cy5cbiAgICAgICAgY29uc3Qgd2ViV2FzbSA9IGF3YWl0IGltcG9ydCgnQGJpdGdvL3dhc20tbXBzL3dlYicpO1xuICAgICAgICBhd2FpdCB3ZWJXYXNtLmRlZmF1bHQoKTtcbiAgICAgICAgdGhpcy53YXNtTXBzID0gd2ViV2FzbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vZGUuanM6IGR5bmFtaWMgaW1wb3J0KCkgcmV3cml0dGVuIHRvIHJlcXVpcmUoKSBieSB0c2Mg4oaSIENKUyBidWlsZCDihpIgcmVhZEZpbGVTeW5jXG4gICAgICAgIHRoaXMud2FzbU1wcyA9IGF3YWl0IGltcG9ydCgnQGJpdGdvL3dhc20tbXBzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYXNtTXBzKCk6IFdhc21NcHMge1xuICAgIGlmICghdGhpcy53YXNtTXBzKSB7XG4gICAgICB0aHJvdyBFcnJvcignV0FTTSBtb2R1bGUgbm90IGxvYWRlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53YXNtTXBzO1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogRGtnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmRrZ1N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2VzIHRoZSBES0cgc2Vzc2lvbiB3aXRoIHRoaXMgcGFydHkncyBYMjU1MTkgcHJpdmF0ZSBrZXkgYW5kIHRoZSBvdGhlciBwYXJ0aWVzJ1xuICAgKiBYMjU1MTkgcHVibGljIGtleXMuIEtleXMgYXJlIGV4dHJhY3RlZCBmcm9tIEdQRyBlbmNyeXB0aW9uIHN1YmtleXMgYnkgdGhlIG9yY2hlc3RyYXRvci5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRpb25LZXkgLSBUaGlzIHBhcnR5J3MgMzItYnl0ZSBYMjU1MTkgcHJpdmF0ZSBrZXkgKEdQRyBlbmMgc3Via2V5IHByaXZhdGUgcGFydCkuXG4gICAqIEBwYXJhbSBvdGhlckVuY1B1YmxpY0tleXMgLSBPdGhlciBwYXJ0aWVzJyAzMi1ieXRlIFgyNTUxOSBwdWJsaWMga2V5cywgc29ydGVkIGJ5IGFzY2VuZGluZ1xuICAgKiAgIHBhcnR5IGluZGV4IChleGNsdWRpbmcgb3duKS4gRm9yIGEgMy1wYXJ0eSBzZXR1cCwgdGhpcyBpcyBbcGFydHlfQV9wdWIsIHBhcnR5X0JfcHViXS5cbiAgICovXG4gIGFzeW5jIGluaXREa2coZGVjcnlwdGlvbktleTogQnVmZmVyLCBvdGhlckVuY1B1YmxpY0tleXM6IEJ1ZmZlcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGlmICghZGVjcnlwdGlvbktleSB8fCBkZWNyeXB0aW9uS2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgZGVjcnlwdGlvbiBrZXk6IG11c3QgYmUgMzIgYnl0ZXMnKTtcbiAgICB9XG4gICAgaWYgKCFvdGhlckVuY1B1YmxpY0tleXMgfHwgb3RoZXJFbmNQdWJsaWNLZXlzLmxlbmd0aCAhPT0gdGhpcy5uIC0gMSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEV4cGVjdGVkICR7dGhpcy5uIC0gMX0gb3RoZXIgcGFydGllcycgcHVibGljIGtleXNgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudCA+IHRoaXMubiB8fCB0aGlzLnBhcnR5SWR4ID49IHRoaXMubikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgcGFyYW1ldGVycyBmb3IgREtHJyk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWNyeXB0aW9uS2V5ID0gZGVjcnlwdGlvbktleTtcbiAgICB0aGlzLm90aGVyUHViS2V5cyA9IG90aGVyRW5jUHVibGljS2V5cztcbiAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuSW5pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJvdW5kMCBvZiB0aGUgREtHIHByb3RvY29sLiBSZXR1cm5zIHRoaXMgcGFydHkncyBicm9hZGNhc3QgbWVzc2FnZS5cbiAgICogU3RvcmVzIHRoZSByb3VuZCBzdGF0ZSBieXRlcyBpbnRlcm5hbGx5IGZvciB0aGUgbmV4dCByb3VuZC5cbiAgICpcbiAgICogQHBhcmFtIGRrZ1NlZWQgLSBPcHRpb25hbCAzMi1ieXRlIHNlZWQgZm9yIGRldGVybWluaXN0aWMgREtHIG91dHB1dCAodGVzdGluZyBvbmx5KS5cbiAgICovXG4gIGdldEZpcnN0TWVzc2FnZShka2dTZWVkPzogQnVmZmVyKTogRGVzZXJpYWxpemVkTWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgIT09IERrZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWVkID0gZGtnU2VlZCA/PyBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpO1xuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcbiAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gd2FzbS5lZDI1NTE5X2RrZ19yb3VuZDBfcHJvY2Vzcyh0aGlzLnBhcnR5SWR4LCB0aGlzLmRlY3J5cHRpb25LZXkhLCB0aGlzLm90aGVyUHViS2V5cyEsIHNlZWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZmlyc3QgbWVzc2FnZSBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH06ICR7ZXJyfWApO1xuICAgIH1cblxuICAgIHRoaXMuZGtnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLldhaXRNc2cxO1xuICAgIHJldHVybiB7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbmNvbWluZyBtZXNzYWdlcyBmcm9tIGFsbCBwYXJ0aWVzIGFuZCBhZHZhbmNlcyB0aGUgcHJvdG9jb2wuXG4gICAqXG4gICAqIC0gSW4gV2FpdE1zZzE6IHJ1bnMgcm91bmQxLCByZXR1cm5zIHRoaXMgcGFydHkncyByb3VuZDEgYnJvYWRjYXN0IG1lc3NhZ2UuXG4gICAqIC0gSW4gV2FpdE1zZzI6IHJ1bnMgcm91bmQyLCBjb21wbGV0ZXMgREtHLCByZXR1cm5zIFtdLlxuICAgKlxuICAgKiBUaGUgY2FsbGVyIHBhc3NlcyBhbGwgbiBtZXNzYWdlcyAoaW5jbHVkaW5nIG93bik7IG93biBtZXNzYWdlIGlzIGZpbHRlcmVkXG4gICAqIG91dCBpbnRlcm5hbGx5LiBPdGhlciBwYXJ0aWVzJyBtZXNzYWdlcyBhcmUgc29ydGVkIGJ5IGFzY2VuZGluZyBwYXJ0eSBpbmRleCxcbiAgICogbWF0Y2hpbmcgdGhlIG9yZGVyaW5nIGV4cGVjdGVkIGJ5IEBiaXRnby93YXNtLW1wcy5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2VzRm9ySXRoUm91bmQgLSBBbGwgbiBtZXNzYWdlcyBmb3IgdGhpcyByb3VuZCAoaW5jbHVkaW5nIG93bikuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIGFscmVhZHkgY29tcGxldGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0RLRyBzZXNzaW9uIG11c3QgY2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBiZWZvcmUgaGFuZGxpbmcgaW5jb21pbmcgbWVzc2FnZXMuIENhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgZmlyc3QuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VzRm9ySXRoUm91bmQubGVuZ3RoICE9PSB0aGlzLm4pIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIG51bWJlciBvZiBtZXNzYWdlcyBmb3IgdGhlIHJvdW5kLiBOdW1iZXIgb2YgbWVzc2FnZXMgc2hvdWxkIGJlIGVxdWFsIHRvIE4nKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IG90aGVyIHBhcnRpZXMnIG1lc3NhZ2VzLCBzb3J0ZWQgYnkgcGFydHkgaW5kZXggKGFzY2VuZGluZylcbiAgICBjb25zdCBvdGhlck1zZ3MgPSBtZXNzYWdlc0Zvckl0aFJvdW5kXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLmZyb20gIT09IHRoaXMucGFydHlJZHgpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKVxuICAgICAgLm1hcCgobSkgPT4gbS5wYXlsb2FkKTtcblxuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcblxuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5XYWl0TXNnMSkge1xuICAgICAgbGV0IHJlc3VsdDogTXNnU3RhdGU7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB3YXNtLmVkMjU1MTlfZGtnX3JvdW5kMV9wcm9jZXNzKG90aGVyTXNncywgdGhpcy5ka2dTdGF0ZUJ5dGVzISk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5ka2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgbmV3IHN0YXRlOyB0aGlzIGlzIHdoYXQgd291bGQgYmUgcGVyc2lzdGVkIHRvIERCIGJldHdlZW4gQVBJIHJvdW5kc1xuICAgICAgdGhpcy5ka2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5XYWl0TXNnMjtcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuV2FpdE1zZzIpIHtcbiAgICAgIGxldCBzaGFyZTogU2hhcmU7XG4gICAgICB0cnkge1xuICAgICAgICBzaGFyZSA9IHdhc20uZWQyNTUxOV9ka2dfcm91bmQyX3Byb2Nlc3Mob3RoZXJNc2dzLCB0aGlzLmRrZ1N0YXRlQnl0ZXMhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRrZ1N0YXRlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleVNoYXJlID0gQnVmZmVyLmZyb20oc2hhcmUuc2hhcmUpO1xuICAgICAgdGhpcy5zaGFyZVBrID0gQnVmZmVyLmZyb20oc2hhcmUucGspO1xuICAgICAgdGhpcy5zaGFyZUNoYWluY29kZSA9IEJ1ZmZlci5mcm9tKHNoYXJlLmNoYWluY29kZSk7XG4gICAgICB0aGlzLmRrZ1N0YXRlQnl0ZXMgPSBudWxsO1xuICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHRocm93IEVycm9yKCdVbmV4cGVjdGVkIERLRyBzdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQga2V5c2hhcmUgcHJvZHVjZWQgYnkgcm91bmQyLlxuICAgKiBUaGlzIGlzIHVzZWQgYXMgaW5wdXQgdG8gdGhlIHNpZ25pbmcgcHJvdG9jb2wuXG4gICAqL1xuICBnZXRLZXlTaGFyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5rZXlTaGFyZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXlTaGFyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSAzMi1ieXRlIEVkMjU1MTkgcHVibGljIGtleSBhZ3JlZWQgYnkgYWxsIHBhcnRpZXMgZHVyaW5nIERLRy5cbiAgICovXG4gIGdldFNoYXJlUHVibGljS2V5KCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLnNoYXJlUGspIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVQaztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSAxMjgtY2hhciBoZXggY29tbW9uIGtleWNoYWluOiA2NC1jaGFyIHB1YmxpYyBrZXkgKyA2NC1jaGFyIGNoYWluIGNvZGUuXG4gICAqIFRoaXMgbWF0Y2hlcyB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IGFkZHJlc3MgZGVyaXZhdGlvbiAoRWRkc2EuZGVyaXZlVW5oYXJkZW5lZCkuXG4gICAqL1xuICBnZXRDb21tb25LZXljaGFpbigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5zaGFyZVBrIHx8ICF0aGlzLnNoYXJlQ2hhaW5jb2RlKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoYXJlUGsudG9TdHJpbmcoJ2hleCcpICsgdGhpcy5zaGFyZUNoYWluY29kZS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIENCT1ItZW5jb2RlZCByZWR1Y2VkIHJlcHJlc2VudGF0aW9uIGNvbnRhaW5pbmcgdGhlIHB1YmxpYyBrZXkuXG4gICAqL1xuICBnZXRSZWR1Y2VkS2V5U2hhcmUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVQaykge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBjb25zdCByZWR1Y2VkS2V5U2hhcmU6IEVkZHNhUmVkdWNlZEtleVNoYXJlID0ge1xuICAgICAgcHViOiBBcnJheS5mcm9tKHRoaXMuc2hhcmVQayksXG4gICAgfTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZW5jb2RlKHJlZHVjZWRLZXlTaGFyZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSBhcyBhIEpTT04gc3RyaW5nIGZvciBwZXJzaXN0ZW5jZS5cbiAgICogSW5jbHVkZXM6IHJvdW5kIHN0YXRlIGJ5dGVzLCBjdXJyZW50IERLRyByb3VuZCwgZGVjcnlwdGlvbiBrZXksIG90aGVyIHBhcnRpZXMnIHB1YiBrZXlzLlxuICAgKiBUaGlzIG1pcnJvcnMgd2hhdCBhIHNlcnZlciB3b3VsZCBzdG9yZSBpbiBhIGRhdGFiYXNlIGJldHdlZW4gQVBJIHJvdW5kcy5cbiAgICovXG4gIGdldFNlc3Npb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gRXhwb3J0aW5nIHRoZSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGtnU3RhdGVCeXRlczogdGhpcy5ka2dTdGF0ZUJ5dGVzPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIGRrZ1JvdW5kOiB0aGlzLmRrZ1N0YXRlLFxuICAgICAgZGVjcnlwdGlvbktleTogdGhpcy5kZWNyeXB0aW9uS2V5Py50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIG90aGVyUHViS2V5czogdGhpcy5vdGhlclB1YktleXM/Lm1hcCgoaykgPT4gay50b1N0cmluZygnYmFzZTY0JykpID8/IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgYSBwcmV2aW91c2x5IGV4cG9ydGVkIHNlc3Npb24uIEFsbG93cyB0aGUgcHJvdG9jb2wgdG8gY29udGludWVcbiAgICogZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZiwgYXMgaWYgdGhlIHJvdW5kIHN0YXRlIHdhcyBsb2FkZWQgZnJvbSBhIGRhdGFiYXNlLlxuICAgKi9cbiAgcmVzdG9yZVNlc3Npb24oc2Vzc2lvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvbik7XG4gICAgdGhpcy5ka2dTdGF0ZUJ5dGVzID0gZGF0YS5ka2dTdGF0ZUJ5dGVzID8gQnVmZmVyLmZyb20oZGF0YS5ka2dTdGF0ZUJ5dGVzLCAnYmFzZTY0JykgOiBudWxsO1xuICAgIHRoaXMuZGtnU3RhdGUgPSBkYXRhLmRrZ1JvdW5kO1xuICAgIHRoaXMuZGVjcnlwdGlvbktleSA9IGRhdGEuZGVjcnlwdGlvbktleSA/IEJ1ZmZlci5mcm9tKGRhdGEuZGVjcnlwdGlvbktleSwgJ2Jhc2U2NCcpIDogbnVsbDtcbiAgICB0aGlzLm90aGVyUHViS2V5cyA9IGRhdGEub3RoZXJQdWJLZXlzID8gKGRhdGEub3RoZXJQdWJLZXlzIGFzIHN0cmluZ1tdKS5tYXAoKGspID0+IEJ1ZmZlci5mcm9tKGssICdiYXNlNjQnKSkgOiBudWxsO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,90 @@
1
+ import { DeserializedMessage, DeserializedMessages, DsgState } from './types';
2
+ /**
3
+ * EdDSA Distributed Sign Generation (DSG) implementation using @bitgo/wasm-mps.
4
+ *
5
+ * State is explicit: each WASM round function returns
6
+ * `{ msg, state }` bytes; the state bytes are stored between rounds and passed to the
7
+ * next round function (this is what a server would persist to a database between API
8
+ * rounds).
9
+ *
10
+ * The protocol is hard-coded 2-of-3: each signing party communicates with exactly one
11
+ * counterpart. `handleIncomingMessages` accepts both messages (own + counterpart), and
12
+ * filters own out internally.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const dsg = new DSG(0); // partyIdx 0
17
+ * dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
18
+ * const msg1 = dsg.getFirstMessage();
19
+ * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
20
+ * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
21
+ * dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
22
+ * const signature = dsg.getSignature(); // 64-byte Ed25519 signature
23
+ * ```
24
+ */
25
+ export declare class DSG {
26
+ protected partyIdx: number;
27
+ protected otherPartyIdx: number | null;
28
+ /** Opaque bincode-serialised Keyshare from a prior DKG */
29
+ private keyShare;
30
+ /** Raw message bytes to sign (Ed25519 hashes internally; no prehashing required) */
31
+ private message;
32
+ /** BIP-32-style derivation path, e.g. "m" or "m/0/1". Folded in via Keyshare::derive_with_offset */
33
+ private derivationPath;
34
+ /** Serialised round state bytes returned by the previous round function */
35
+ private dsgStateBytes;
36
+ /** Final 64-byte Ed25519 signature, available after WaitMsg3 -> Complete */
37
+ private signature;
38
+ protected dsgState: DsgState;
39
+ constructor(partyIdx: number);
40
+ getState(): DsgState;
41
+ /**
42
+ * Initialises the DSG session. The keyshare must come from a prior DKG run, and
43
+ * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
44
+ *
45
+ * @param keyShare - Opaque bincode-serialised Keyshare bytes from `DKG.getKeyShare()`.
46
+ * @param message - Raw message bytes to sign (no prehashing).
47
+ * @param derivationPath - BIP-32-style derivation path. Use `"m"` for the root key.
48
+ * @param otherPartyIdx - Party index of the single counterpart in this signing session.
49
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
50
+ */
51
+ initDsg(keyShare: Buffer, message: Buffer, derivationPath: string, otherPartyIdx: number): void;
52
+ /**
53
+ * Runs round 0 of the DSG protocol. Returns this party's broadcast message
54
+ * (a `SignMsg1` containing the commitment to `R_i`). Stores the round state
55
+ * bytes internally for the next round.
56
+ */
57
+ getFirstMessage(): DeserializedMessage;
58
+ /**
59
+ * Handles incoming messages for the current round and advances the protocol.
60
+ *
61
+ * - In `WaitMsg1`: runs round 1, returns this party's `SignMsg2` broadcast.
62
+ * - In `WaitMsg2`: runs round 2 (which internally fuses two Silence Labs transitions),
63
+ * returns this party's `SignMsg3` broadcast (partial signature).
64
+ * - In `WaitMsg3`: runs round 3, completes DSG, returns `[]`.
65
+ *
66
+ * The caller passes both messages (own + counterpart) for symmetry with
67
+ * `DKG.handleIncomingMessages`. Own message is filtered out internally; only the
68
+ * counterpart's payload is forwarded to the WASM round function.
69
+ *
70
+ * @param messagesForIthRound - Both messages for this round (own + counterpart).
71
+ */
72
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
73
+ /**
74
+ * Returns the final 64-byte Ed25519 signature produced by round 3.
75
+ * Only available once the protocol reaches `Complete`.
76
+ */
77
+ getSignature(): Buffer;
78
+ /**
79
+ * Exports the current session state as a JSON string for persistence.
80
+ * Includes the opaque round state bytes plus everything needed to re-enter the
81
+ * protocol after a restart (keyshare, message, derivation path, counterpart).
82
+ */
83
+ getSession(): string;
84
+ /**
85
+ * Restores a previously exported session. Allows the protocol to continue from
86
+ * where it left off, as if the round state was loaded from a database.
87
+ */
88
+ restoreSession(session: string): void;
89
+ }
90
+ //# sourceMappingURL=dsg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dsg.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAuB;IACvC,oFAAoF;IACpF,OAAO,CAAC,OAAO,CAAuB;IACtC,oGAAoG;IACpG,OAAO,CAAC,cAAc,CAAuB;IAE7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,4EAA4E;IAC5E,OAAO,CAAC,SAAS,CAAuB;IAExC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,QAAQ;IAIpB;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAqB/F;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAoBtC;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAqEvF;;;OAGG;IACH,YAAY,IAAI,MAAM;IAOtB;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAqBpB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA2DtC"}