@bitgo-beta/sdk-lib-mpc 8.2.0-beta.2093 → 8.2.0-beta.2095
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/tss/redpallas-mps/dsg.d.ts +34 -12
- package/dist/src/tss/redpallas-mps/dsg.d.ts.map +1 -1
- package/dist/src/tss/redpallas-mps/dsg.js +35 -14
- package/dist/src/tss/redpallas-mps/index.d.ts +2 -1
- package/dist/src/tss/redpallas-mps/index.d.ts.map +1 -1
- package/dist/src/tss/redpallas-mps/index.js +3 -2
- package/dist/src/tss/redpallas-mps/rerand.d.ts +110 -0
- package/dist/src/tss/redpallas-mps/rerand.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/rerand.js +330 -0
- package/dist/src/tss/redpallas-mps/types.d.ts +43 -8
- package/dist/src/tss/redpallas-mps/types.d.ts.map +1 -1
- package/dist/src/tss/redpallas-mps/types.js +25 -4
- package/dist/src/tss/redpallas-mps/util.d.ts +20 -7
- package/dist/src/tss/redpallas-mps/util.d.ts.map +1 -1
- package/dist/src/tss/redpallas-mps/util.js +34 -8
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -10,10 +10,18 @@ import { DeserializedMessage, DeserializedMessages, RedPallasDsgState, RedPallas
|
|
|
10
10
|
* (ask/nk/rivk/ivks) happens upstream, as part of DKG (`redpallas_dkg_round2_process` +
|
|
11
11
|
* the platform-side-only `redpallas_derivation_process`); DSG only ever operates on an
|
|
12
12
|
* already-derived (or root) opaque `Keyshare`.
|
|
13
|
+
* - DSG does not randomize the key it signs with: since `@bitgo/wasm-mps` 1.17.0, key
|
|
14
|
+
* re-randomization is a separate `rerand` protocol (see `./rerand.ts`, `RedPallasRerand`)
|
|
15
|
+
* that must run before every DSG, between the same 2 parties. The keyshare passed to
|
|
16
|
+
* `initDsg` must be the `keyShare` from that rerand result.
|
|
13
17
|
* - Round3 does not return a raw signature; it returns a `RedPallasSignature` bundle of
|
|
14
|
-
* `signature` (64 raw bytes)
|
|
15
|
-
* verifies against — NOT the DKG public key)
|
|
16
|
-
*
|
|
18
|
+
* `signature` (64 raw bytes) and `rk` (the rerandomized verification key the signature
|
|
19
|
+
* verifies against — NOT the DKG public key). `rk` equals the `pk` of the rerand result
|
|
20
|
+
* the DSG session was initialized with. See `RedPallasSignatureResult`.
|
|
21
|
+
*
|
|
22
|
+
* Signing a stored DKG keyshare directly (without rerand) still produces a valid
|
|
23
|
+
* signature — under the bare DKG public key, with the same `rk` every spend — but the
|
|
24
|
+
* supported, tested path is rerand → DSG.
|
|
17
25
|
*
|
|
18
26
|
* State is explicit: each WASM round function returns `{ msg, state }` bytes; the state
|
|
19
27
|
* bytes are stored between rounds and passed to the next round function (this is what a
|
|
@@ -25,13 +33,21 @@ import { DeserializedMessage, DeserializedMessages, RedPallasDsgState, RedPallas
|
|
|
25
33
|
*
|
|
26
34
|
* @example
|
|
27
35
|
* ```typescript
|
|
36
|
+
* // Rerand first — same 2 parties that will sign (see RedPallasRerand).
|
|
37
|
+
* const rerand = new RedPallasRerand(0);
|
|
38
|
+
* await rerand.initRerand(dkgKeyShare, 2);
|
|
39
|
+
* const rerandMsg1 = rerand.getFirstMessage();
|
|
40
|
+
* const rerandMsg2 = rerand.handleIncomingMessages([rerandMsg1, peerRerandMsg1]);
|
|
41
|
+
* rerand.handleIncomingMessages([rerandMsg2[0], peerRerandMsg2]);
|
|
42
|
+
* const { keyShare, pk, alpha } = rerand.getRerandomizedKeyShare();
|
|
43
|
+
*
|
|
28
44
|
* const dsg = new RedPallasDSG(0); // partyIdx 0
|
|
29
45
|
* await dsg.initDsg(keyShare, message, 2); // counterpart is party 2
|
|
30
46
|
* const msg1 = dsg.getFirstMessage();
|
|
31
47
|
* const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
|
|
32
48
|
* const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
|
|
33
49
|
* dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
|
|
34
|
-
* const { signature, rk
|
|
50
|
+
* const { signature, rk } = dsg.getSignature(); // verifies under rk == pk
|
|
35
51
|
* ```
|
|
36
52
|
*/
|
|
37
53
|
export declare class RedPallasDSG {
|
|
@@ -55,14 +71,19 @@ export declare class RedPallasDSG {
|
|
|
55
71
|
private loadWasmMps;
|
|
56
72
|
private getWasmMps;
|
|
57
73
|
/**
|
|
58
|
-
* Initialises the DSG session. The keyshare must
|
|
59
|
-
*
|
|
60
|
-
*
|
|
74
|
+
* Initialises the DSG session. The keyshare must be the rerandomized `keyShare` from
|
|
75
|
+
* a prior `RedPallasRerand` run with the same counterpart (which itself takes the
|
|
76
|
+
* opaque Keyshare from DKG — already derived, if applicable). Signing a bare DKG
|
|
77
|
+
* keyshare produces a valid but non-rerandomized signature under the DKG public key;
|
|
78
|
+
* use rerand → DSG instead. `otherPartyIdx` must be the single counterpart who ran
|
|
79
|
+
* that rerand session and will co-sign with this party.
|
|
61
80
|
*
|
|
62
|
-
* @param keyShare - Opaque bincode-serialised Keyshare bytes from
|
|
81
|
+
* @param keyShare - Opaque bincode-serialised rerandomized Keyshare bytes from
|
|
82
|
+
* `RedPallasRerand.getRerandomizedKeyShare().keyShare`.
|
|
63
83
|
* @param message - Raw message bytes to sign.
|
|
64
84
|
* @param otherPartyIdx - Party index of the single counterpart in this signing session.
|
|
65
|
-
* Must differ from this party's own `partyIdx` and be in `[0, 2]
|
|
85
|
+
* Must differ from this party's own `partyIdx` and be in `[0, 2]`, and match the
|
|
86
|
+
* counterpart of the preceding rerand session.
|
|
66
87
|
*/
|
|
67
88
|
initDsg(keyShare: Buffer, message: Buffer, otherPartyIdx: number): Promise<void>;
|
|
68
89
|
/**
|
|
@@ -88,9 +109,10 @@ export declare class RedPallasDSG {
|
|
|
88
109
|
handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
|
|
89
110
|
/**
|
|
90
111
|
* Returns the final signature bundle produced by round 3: the 64-byte raw RedPallas
|
|
91
|
-
* signature
|
|
92
|
-
* `redpallas_verify(rk, signature, message)` — NOT the DKG public key)
|
|
93
|
-
* `
|
|
112
|
+
* signature and the rerandomized verification key `rk` it must be verified against
|
|
113
|
+
* (via `redpallas_verify(rk, signature, message)` — NOT the DKG public key). `rk`
|
|
114
|
+
* equals the `pk` of the rerand result this session was initialized with; the
|
|
115
|
+
* corresponding `alpha` is available from `RedPallasRerand.getRerandomizedKeyShare()`.
|
|
94
116
|
*/
|
|
95
117
|
getSignature(): RedPallasSignatureResult;
|
|
96
118
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/dsg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAMjH
|
|
1
|
+
{"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/dsg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAMjH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBAAa,YAAY;IACvB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAuB;IACvC,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAuB;IAEtC,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,mEAAmE;IACnE,OAAO,CAAC,eAAe,CAAyC;IAChE,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAmC;gBAE5D,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,iBAAiB;IAI7B,WAAW,IAAI,MAAM;IAIrB,gBAAgB,IAAI,MAAM,GAAG,IAAI;YAInB,WAAW;IAoBzB,OAAO,CAAC,UAAU;IAOlB;;;;;;;;;;;;;;OAcG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtF;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAoBtC;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAyEvF;;;;;;OAMG;IACH,YAAY,IAAI,wBAAwB;IAOxC;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAoBpB;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAwDrD"}
|
|
@@ -50,10 +50,18 @@ const types_1 = require("./types");
|
|
|
50
50
|
* (ask/nk/rivk/ivks) happens upstream, as part of DKG (`redpallas_dkg_round2_process` +
|
|
51
51
|
* the platform-side-only `redpallas_derivation_process`); DSG only ever operates on an
|
|
52
52
|
* already-derived (or root) opaque `Keyshare`.
|
|
53
|
+
* - DSG does not randomize the key it signs with: since `@bitgo/wasm-mps` 1.17.0, key
|
|
54
|
+
* re-randomization is a separate `rerand` protocol (see `./rerand.ts`, `RedPallasRerand`)
|
|
55
|
+
* that must run before every DSG, between the same 2 parties. The keyshare passed to
|
|
56
|
+
* `initDsg` must be the `keyShare` from that rerand result.
|
|
53
57
|
* - Round3 does not return a raw signature; it returns a `RedPallasSignature` bundle of
|
|
54
|
-
* `signature` (64 raw bytes)
|
|
55
|
-
* verifies against — NOT the DKG public key)
|
|
56
|
-
*
|
|
58
|
+
* `signature` (64 raw bytes) and `rk` (the rerandomized verification key the signature
|
|
59
|
+
* verifies against — NOT the DKG public key). `rk` equals the `pk` of the rerand result
|
|
60
|
+
* the DSG session was initialized with. See `RedPallasSignatureResult`.
|
|
61
|
+
*
|
|
62
|
+
* Signing a stored DKG keyshare directly (without rerand) still produces a valid
|
|
63
|
+
* signature — under the bare DKG public key, with the same `rk` every spend — but the
|
|
64
|
+
* supported, tested path is rerand → DSG.
|
|
57
65
|
*
|
|
58
66
|
* State is explicit: each WASM round function returns `{ msg, state }` bytes; the state
|
|
59
67
|
* bytes are stored between rounds and passed to the next round function (this is what a
|
|
@@ -65,13 +73,21 @@ const types_1 = require("./types");
|
|
|
65
73
|
*
|
|
66
74
|
* @example
|
|
67
75
|
* ```typescript
|
|
76
|
+
* // Rerand first — same 2 parties that will sign (see RedPallasRerand).
|
|
77
|
+
* const rerand = new RedPallasRerand(0);
|
|
78
|
+
* await rerand.initRerand(dkgKeyShare, 2);
|
|
79
|
+
* const rerandMsg1 = rerand.getFirstMessage();
|
|
80
|
+
* const rerandMsg2 = rerand.handleIncomingMessages([rerandMsg1, peerRerandMsg1]);
|
|
81
|
+
* rerand.handleIncomingMessages([rerandMsg2[0], peerRerandMsg2]);
|
|
82
|
+
* const { keyShare, pk, alpha } = rerand.getRerandomizedKeyShare();
|
|
83
|
+
*
|
|
68
84
|
* const dsg = new RedPallasDSG(0); // partyIdx 0
|
|
69
85
|
* await dsg.initDsg(keyShare, message, 2); // counterpart is party 2
|
|
70
86
|
* const msg1 = dsg.getFirstMessage();
|
|
71
87
|
* const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
|
|
72
88
|
* const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
|
|
73
89
|
* dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
|
|
74
|
-
* const { signature, rk
|
|
90
|
+
* const { signature, rk } = dsg.getSignature(); // verifies under rk == pk
|
|
75
91
|
* ```
|
|
76
92
|
*/
|
|
77
93
|
class RedPallasDSG {
|
|
@@ -124,14 +140,19 @@ class RedPallasDSG {
|
|
|
124
140
|
return this.wasmMps;
|
|
125
141
|
}
|
|
126
142
|
/**
|
|
127
|
-
* Initialises the DSG session. The keyshare must
|
|
128
|
-
*
|
|
129
|
-
*
|
|
143
|
+
* Initialises the DSG session. The keyshare must be the rerandomized `keyShare` from
|
|
144
|
+
* a prior `RedPallasRerand` run with the same counterpart (which itself takes the
|
|
145
|
+
* opaque Keyshare from DKG — already derived, if applicable). Signing a bare DKG
|
|
146
|
+
* keyshare produces a valid but non-rerandomized signature under the DKG public key;
|
|
147
|
+
* use rerand → DSG instead. `otherPartyIdx` must be the single counterpart who ran
|
|
148
|
+
* that rerand session and will co-sign with this party.
|
|
130
149
|
*
|
|
131
|
-
* @param keyShare - Opaque bincode-serialised Keyshare bytes from
|
|
150
|
+
* @param keyShare - Opaque bincode-serialised rerandomized Keyshare bytes from
|
|
151
|
+
* `RedPallasRerand.getRerandomizedKeyShare().keyShare`.
|
|
132
152
|
* @param message - Raw message bytes to sign.
|
|
133
153
|
* @param otherPartyIdx - Party index of the single counterpart in this signing session.
|
|
134
|
-
* Must differ from this party's own `partyIdx` and be in `[0, 2]
|
|
154
|
+
* Must differ from this party's own `partyIdx` and be in `[0, 2]`, and match the
|
|
155
|
+
* counterpart of the preceding rerand session.
|
|
135
156
|
*/
|
|
136
157
|
async initDsg(keyShare, message, otherPartyIdx) {
|
|
137
158
|
await this.loadWasmMps();
|
|
@@ -250,7 +271,6 @@ class RedPallasDSG {
|
|
|
250
271
|
this.signatureResult = {
|
|
251
272
|
signature: Buffer.from(result.signature),
|
|
252
273
|
rk: Buffer.from(result.rk),
|
|
253
|
-
alpha: Buffer.from(result.alpha),
|
|
254
274
|
};
|
|
255
275
|
this.dsgStateBytes = null;
|
|
256
276
|
this.dsgState = types_1.RedPallasDsgState.Complete;
|
|
@@ -260,9 +280,10 @@ class RedPallasDSG {
|
|
|
260
280
|
}
|
|
261
281
|
/**
|
|
262
282
|
* Returns the final signature bundle produced by round 3: the 64-byte raw RedPallas
|
|
263
|
-
* signature
|
|
264
|
-
* `redpallas_verify(rk, signature, message)` — NOT the DKG public key)
|
|
265
|
-
* `
|
|
283
|
+
* signature and the rerandomized verification key `rk` it must be verified against
|
|
284
|
+
* (via `redpallas_verify(rk, signature, message)` — NOT the DKG public key). `rk`
|
|
285
|
+
* equals the `pk` of the rerand result this session was initialized with; the
|
|
286
|
+
* corresponding `alpha` is available from `RedPallasRerand.getRerandomizedKeyShare()`.
|
|
266
287
|
*/
|
|
267
288
|
getSignature() {
|
|
268
289
|
if (!this.signatureResult) {
|
|
@@ -352,4 +373,4 @@ class RedPallasDSG {
|
|
|
352
373
|
}
|
|
353
374
|
}
|
|
354
375
|
exports.RedPallasDSG = RedPallasDSG;
|
|
355
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9yZWRwYWxsYXMtbXBzL2RzZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsbUNBQWlIO0FBTWpIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBQ0gsTUFBYSxZQUFZO0lBa0J2QixZQUFZLFFBQWdCO1FBaEJsQixrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFFOUMsMkZBQTJGO1FBQ25GLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLGdDQUFnQztRQUN4QixZQUFPLEdBQWtCLElBQUksQ0FBQztRQUV0QywyRUFBMkU7UUFDbkUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLG1FQUFtRTtRQUMzRCxvQkFBZSxHQUFvQyxJQUFJLENBQUM7UUFDaEUsZ0NBQWdDO1FBQ3hCLFlBQU8sR0FBbUIsSUFBSSxDQUFDO1FBRTdCLGFBQVEsR0FBc0IseUJBQWlCLENBQUMsYUFBYSxDQUFDO1FBR3RFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFDRSxPQUFPLE1BQU0sS0FBSyxXQUFXO2dCQUM3QixtQ0FBbUM7Z0JBQ25DLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQ2YsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQ3pCLENBQUM7Z0JBQ0Qsd0VBQXdFO2dCQUN4RSx1SEFBdUg7Z0JBQ3ZILE1BQU0sT0FBTyxHQUFHLHdEQUFhLHFCQUFxQixHQUFDLENBQUM7Z0JBQ3BELE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN6QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04scUZBQXFGO2dCQUNyRixJQUFJLENBQUMsT0FBTyxHQUFHLHdEQUFhLGlCQUFpQixHQUFDLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFnQixFQUFFLE9BQWUsRUFBRSxhQUFxQjtRQUNwRSxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFFBQVEscUJBQXFCLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsSUFBSSxhQUFhLEdBQUcsQ0FBQyxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5RSxNQUFNLEtBQUssQ0FBQyx5QkFBeUIsYUFBYSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLHlCQUFpQixDQUFDLElBQUksQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUsseUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0MsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztRQUM1RCxJQUFBLGdCQUFNLEVBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1FBRTFELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLE1BQWdCLENBQUM7UUFDckIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELElBQUksQ0FBQyxRQUFRLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLHlCQUFpQixDQUFDLFFBQVEsQ0FBQztRQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsc0JBQXNCLENBQUMsbUJBQXlDO1FBQzlELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyx5QkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNqRCxNQUFNLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUsseUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEQsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLHlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQzdDLE1BQU0sS0FBSyxDQUNULDBHQUEwRyxDQUMzRyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUFDLGtHQUFrRyxDQUFDLENBQUM7UUFDbEgsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakYsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sS0FBSyxDQUFDLCtDQUErQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEMsTUFBTSxLQUFLLENBQUMsMkNBQTJDLE9BQU8sQ0FBQyxJQUFJLGNBQWMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUsseUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakQsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztZQUNwRSxJQUFJLE1BQWdCLENBQUM7WUFDckIsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM5RSxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxJQUFJLENBQUMsUUFBUSxXQUFXLElBQUksQ0FBQyxRQUFRLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMvRyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLHlCQUFpQixDQUFDLFFBQVEsQ0FBQztZQUMzQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLHlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pELElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7WUFDcEUsSUFBSSxNQUFnQixDQUFDO1lBQ3JCLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDOUUsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0csQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyx5QkFBaUIsQ0FBQyxRQUFRLENBQUM7WUFDM0MsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyx5QkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNqRCxJQUFBLGdCQUFNLEVBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksTUFBMEIsQ0FBQztZQUMvQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlFLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLElBQUksQ0FBQyxRQUFRLFdBQVcsSUFBSSxDQUFDLFFBQVEsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQy9HLENBQUM7WUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHO2dCQUNyQixTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUN4QyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMxQixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2pDLENBQUM7WUFDRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLHlCQUFpQixDQUFDLFFBQVEsQ0FBQztZQUMzQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFlBQVk7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLE1BQU0sS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUsseUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakQsTUFBTSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLHlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RELE1BQU0sS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyx5QkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUk7WUFDN0QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJO1lBQ25ELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJO1lBQ2pELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBZTtRQUNsQyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLHlCQUFpQixDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzlELE1BQU0sS0FBSyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLHlCQUFpQixDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLHlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xHLE1BQU0sS0FBSyxDQUFDLHVDQUF1QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLHlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pELE1BQU0sS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hGLE1BQU0sS0FBSyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFDRSxPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssUUFBUTtZQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUM7WUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFDcEMsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDLHFDQUFxQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFFBQVEsNEJBQTRCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUUsTUFBTSxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsUUFBUSx5QkFBeUIsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLHlCQUF5QixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBL1NELG9DQStTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB0eXBlIHsgTXNnU3RhdGUsIFJlZFBhbGxhc1NpZ25hdHVyZSB9IGZyb20gJ0BiaXRnby93YXNtLW1wcyc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZWRNZXNzYWdlLCBEZXNlcmlhbGl6ZWRNZXNzYWdlcywgUmVkUGFsbGFzRHNnU3RhdGUsIFJlZFBhbGxhc1NpZ25hdHVyZVJlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5vZGVXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbnR5cGUgV2ViV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzL3dlYicpO1xudHlwZSBXYXNtTXBzID0gTm9kZVdhc21lciB8IFdlYldhc21lcjtcblxuLyoqXG4gKiBSZWRQYWxsYXMgKFpjYXNoIElyb253b29kKSBEaXN0cmlidXRlZCBTaWduIEdlbmVyYXRpb24gKERTRykgaW1wbGVtZW50YXRpb24gdXNpbmdcbiAqIEBiaXRnby93YXNtLW1wcy5cbiAqXG4gKiBNaXJyb3JzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIEVkRFNBIE1QUyBgRFNHYCBjbGFzcyAoc2VlIGAuLi9lZGRzYS1tcHMvZHNnLnRzYCksIGJ1dCB3cmFwc1xuICogdGhlIGByZWRwYWxsYXNfZHNnXypgIFdBU00gYmluZGluZ3MuIFVubGlrZSB0aGUgRWREU0EgdmVyc2lvbjpcbiAqXG4gKiAtIGByZWRwYWxsYXNfZHNnX3JvdW5kMF9wcm9jZXNzYCBkb2VzIG5vdCB0YWtlIGEgZGVyaXZhdGlvbiBwYXRoOiBSZWRQYWxsYXMga2V5IGRlcml2YXRpb25cbiAqICAgKGFzay9uay9yaXZrL2l2a3MpIGhhcHBlbnMgdXBzdHJlYW0sIGFzIHBhcnQgb2YgREtHIChgcmVkcGFsbGFzX2RrZ19yb3VuZDJfcHJvY2Vzc2AgK1xuICogICB0aGUgcGxhdGZvcm0tc2lkZS1vbmx5IGByZWRwYWxsYXNfZGVyaXZhdGlvbl9wcm9jZXNzYCk7IERTRyBvbmx5IGV2ZXIgb3BlcmF0ZXMgb24gYW5cbiAqICAgYWxyZWFkeS1kZXJpdmVkIChvciByb290KSBvcGFxdWUgYEtleXNoYXJlYC5cbiAqIC0gUm91bmQzIGRvZXMgbm90IHJldHVybiBhIHJhdyBzaWduYXR1cmU7IGl0IHJldHVybnMgYSBgUmVkUGFsbGFzU2lnbmF0dXJlYCBidW5kbGUgb2ZcbiAqICAgYHNpZ25hdHVyZWAgKDY0IHJhdyBieXRlcyksIGBya2AgKHRoZSByYW5kb21pemVkIHZlcmlmaWNhdGlvbiBrZXkgdGhlIHNpZ25hdHVyZVxuICogICB2ZXJpZmllcyBhZ2FpbnN0IOKAlCBOT1QgdGhlIERLRyBwdWJsaWMga2V5KSBhbmQgYGFscGhhYCAodGhlIDMyLWJ5dGUgcmFuZG9taXplciBzY2FsYXJcbiAqICAgdXNlZCB0byByZS1yYW5kb21pemUgdGhlIERLRyBwdWJsaWMga2V5IGludG8gYHJrYCkuIFNlZSBgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0YC5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCBXQVNNIHJvdW5kIGZ1bmN0aW9uIHJldHVybnMgYHsgbXNnLCBzdGF0ZSB9YCBieXRlczsgdGhlIHN0YXRlXG4gKiBieXRlcyBhcmUgc3RvcmVkIGJldHdlZW4gcm91bmRzIGFuZCBwYXNzZWQgdG8gdGhlIG5leHQgcm91bmQgZnVuY3Rpb24gKHRoaXMgaXMgd2hhdCBhXG4gKiBzZXJ2ZXIgd291bGQgcGVyc2lzdCB0byBhIGRhdGFiYXNlIGJldHdlZW4gQVBJIHJvdW5kcykuXG4gKlxuICogVGhlIHByb3RvY29sIGlzIGhhcmQtY29kZWQgMi1vZi0zOiBlYWNoIHNpZ25pbmcgcGFydHkgY29tbXVuaWNhdGVzIHdpdGggZXhhY3RseSBvbmVcbiAqIGNvdW50ZXJwYXJ0LiBgaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AgYWNjZXB0cyBib3RoIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCksIGFuZFxuICogZmlsdGVycyBvd24gb3V0IGludGVybmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRzZyA9IG5ldyBSZWRQYWxsYXNEU0coMCk7ICAvLyBwYXJ0eUlkeCAwXG4gKiBhd2FpdCBkc2cuaW5pdERzZyhrZXlTaGFyZSwgbWVzc2FnZSwgMik7ICAvLyBjb3VudGVycGFydCBpcyBwYXJ0eSAyXG4gKiBjb25zdCBtc2cxID0gZHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuICogY29uc3QgbXNnMiA9IGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2cxLCBwZWVyTXNnMV0pOyAgLy8gZW1pdHMgU2lnbk1zZzJcbiAqIGNvbnN0IG1zZzMgPSBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnMlswXSwgcGVlck1zZzJdKTsgIC8vIGVtaXRzIFNpZ25Nc2czXG4gKiBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnM1swXSwgcGVlck1zZzNdKTsgIC8vIGNvbXBsZXRlcyBEU0dcbiAqIGNvbnN0IHsgc2lnbmF0dXJlLCByaywgYWxwaGEgfSA9IGRzZy5nZXRTaWduYXR1cmUoKTsgIC8vIDY0LWJ5dGUgUmVkUGFsbGFzIHNpZ25hdHVyZSArIHJrL2FscGhhXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZFBhbGxhc0RTRyB7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgb3RoZXJQYXJ0eUlkeDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgZnJvbSBhIHByaW9yIERLRyAoYWxyZWFkeSBkZXJpdmVkLCBpZiBhcHBsaWNhYmxlKSAqL1xuICBwcml2YXRlIGtleVNoYXJlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24gKi9cbiAgcHJpdmF0ZSBtZXNzYWdlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogU2VyaWFsaXNlZCByb3VuZCBzdGF0ZSBieXRlcyByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgcm91bmQgZnVuY3Rpb24gKi9cbiAgcHJpdmF0ZSBkc2dTdGF0ZUJ5dGVzOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEZpbmFsIHNpZ25hdHVyZSBidW5kbGUsIGF2YWlsYWJsZSBhZnRlciBXYWl0TXNnMyAtPiBDb21wbGV0ZSAqL1xuICBwcml2YXRlIHNpZ25hdHVyZVJlc3VsdDogUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXppbHkgbG9hZGVkIFdBU00gbW9kdWxlICovXG4gIHByaXZhdGUgd2FzbU1wczogV2FzbU1wcyB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBkc2dTdGF0ZTogUmVkUGFsbGFzRHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5VbmluaXRpYWxpemVkO1xuXG4gIGNvbnN0cnVjdG9yKHBhcnR5SWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gIH1cblxuICBnZXRTdGF0ZSgpOiBSZWRQYWxsYXNEc2dTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZHNnU3RhdGU7XG4gIH1cblxuICBnZXRQYXJ0eUlkeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0T3RoZXJQYXJ0eUlkeCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vdGhlclBhcnR5SWR4O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkV2FzbU1wcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMud2FzbU1wcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAvKiBjaGVja3MgZm9yIGVsZWN0cm9uIHByb2Nlc3NlcyAqL1xuICAgICAgICAhd2luZG93LnByb2Nlc3MgJiZcbiAgICAgICAgIXdpbmRvdy5wcm9jZXNzPy5bJ3R5cGUnXVxuICAgICAgKSB7XG4gICAgICAgIC8vIEJyb3dzZXI6IHdlYiBidWlsZCBoYXMgZXhwbGljaXQgaW5pdCgpIOKAlCBndWFyYW50ZWVkIHJlYWR5IGFmdGVyIGF3YWl0XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAtLSBAYml0Z28vd2FzbS1tcHMgZXhwb3NlcyBlbnZpcm9ubWVudC1zcGVjaWZpYyBzdWJwYXRoIGV4cG9ydHMuXG4gICAgICAgIGNvbnN0IHdlYldhc20gPSBhd2FpdCBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcy93ZWInKTtcbiAgICAgICAgYXdhaXQgd2ViV2FzbS5kZWZhdWx0KCk7XG4gICAgICAgIHRoaXMud2FzbU1wcyA9IHdlYldhc207XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb2RlLmpzOiBkeW5hbWljIGltcG9ydCgpIHJld3JpdHRlbiB0byByZXF1aXJlKCkgYnkgdHNjIOKGkiBDSlMgYnVpbGQg4oaSIHJlYWRGaWxlU3luY1xuICAgICAgICB0aGlzLndhc21NcHMgPSBhd2FpdCBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2FzbU1wcygpOiBXYXNtTXBzIHtcbiAgICBpZiAoIXRoaXMud2FzbU1wcykge1xuICAgICAgdGhyb3cgRXJyb3IoJ1dBU00gbW9kdWxlIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2FzbU1wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlcyB0aGUgRFNHIHNlc3Npb24uIFRoZSBrZXlzaGFyZSBtdXN0IGNvbWUgZnJvbSBhIHByaW9yIERLRyBydW4gKGFuZCwgaWYgYVxuICAgKiBkZXJpdmVkIGtleSBpcyBiZWluZyB1c2VkLCBmcm9tIHRoZSBzdWJzZXF1ZW50IHBsYXRmb3JtLXNpZGUgZGVyaXZhdGlvbiBwcm9jZXNzKSwgYW5kXG4gICAqIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHdpbGwgY28tc2lnbiB3aXRoIHRoaXMgcGFydHkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlTaGFyZSAtIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgYnl0ZXMgZnJvbSBgUmVkUGFsbGFzREtHLmdldEtleVNoYXJlKClgLlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24uXG4gICAqIEBwYXJhbSBvdGhlclBhcnR5SWR4IC0gUGFydHkgaW5kZXggb2YgdGhlIHNpbmdsZSBjb3VudGVycGFydCBpbiB0aGlzIHNpZ25pbmcgc2Vzc2lvbi5cbiAgICogICBNdXN0IGRpZmZlciBmcm9tIHRoaXMgcGFydHkncyBvd24gYHBhcnR5SWR4YCBhbmQgYmUgaW4gYFswLCAyXWAuXG4gICAqL1xuICBhc3luYyBpbml0RHNnKGtleVNoYXJlOiBCdWZmZXIsIG1lc3NhZ2U6IEJ1ZmZlciwgb3RoZXJQYXJ0eUlkeDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGlmICgha2V5U2hhcmUgfHwga2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4IDwgMCB8fCB0aGlzLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggJHt0aGlzLnBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl1gKTtcbiAgICB9XG4gICAgaWYgKG90aGVyUGFydHlJZHggPCAwIHx8IG90aGVyUGFydHlJZHggPiAyIHx8IG90aGVyUGFydHlJZHggPT09IHRoaXMucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggJHtvdGhlclBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl0gYW5kICE9IHBhcnR5SWR4YCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5vdGhlclBhcnR5SWR4ID0gb3RoZXJQYXJ0eUlkeDtcbiAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuSW5pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJvdW5kIDAgb2YgdGhlIERTRyBwcm90b2NvbC4gUmV0dXJucyB0aGlzIHBhcnR5J3MgYnJvYWRjYXN0IG1lc3NhZ2VcbiAgICogKGEgYFNpZ25Nc2cxYCBjb250YWluaW5nIHRoZSBjb21taXRtZW50IHRvIGBSX2lgKS4gU3RvcmVzIHRoZSByb3VuZCBzdGF0ZVxuICAgKiBieXRlcyBpbnRlcm5hbGx5IGZvciB0aGUgbmV4dCByb3VuZC5cbiAgICovXG4gIGdldEZpcnN0TWVzc2FnZSgpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlIHtcbiAgICBpZiAodGhpcy5kc2dTdGF0ZSAhPT0gUmVkUGFsbGFzRHNnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBhc3NlcnQodGhpcy5rZXlTaGFyZSwgJ2tleVNoYXJlIG11c3QgYmUgc2V0IGFmdGVyIGluaXREc2cnKTtcbiAgICBhc3NlcnQodGhpcy5tZXNzYWdlLCAnbWVzc2FnZSBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG5cbiAgICBjb25zdCB3YXNtID0gdGhpcy5nZXRXYXNtTXBzKCk7XG4gICAgbGV0IHJlc3VsdDogTXNnU3RhdGU7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHdhc20ucmVkcGFsbGFzX2RzZ19yb3VuZDBfcHJvY2Vzcyh0aGlzLmtleVNoYXJlLCB0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZmlyc3QgbWVzc2FnZSBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH06ICR7ZXJyfWApO1xuICAgIH1cblxuICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IFJlZFBhbGxhc0RzZ1N0YXRlLldhaXRNc2cxO1xuICAgIHJldHVybiB7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbmNvbWluZyBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgcm91bmQgYW5kIGFkdmFuY2VzIHRoZSBwcm90b2NvbC5cbiAgICpcbiAgICogLSBJbiBgV2FpdE1zZzFgOiBydW5zIHJvdW5kIDEsIHJldHVybnMgdGhpcyBwYXJ0eSdzIGBTaWduTXNnMmAgYnJvYWRjYXN0LlxuICAgKiAtIEluIGBXYWl0TXNnMmA6IHJ1bnMgcm91bmQgMiAod2hpY2ggaW50ZXJuYWxseSBmdXNlcyB0d28gU2lsZW5jZSBMYWJzIHRyYW5zaXRpb25zKSxcbiAgICogICByZXR1cm5zIHRoaXMgcGFydHkncyBgU2lnbk1zZzNgIGJyb2FkY2FzdCAocGFydGlhbCBzaWduYXR1cmUpLlxuICAgKiAtIEluIGBXYWl0TXNnM2A6IHJ1bnMgcm91bmQgMywgY29tcGxldGVzIERTRywgcmV0dXJucyBgW11gLlxuICAgKlxuICAgKiBUaGUgY2FsbGVyIHBhc3NlcyBib3RoIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCkgZm9yIHN5bW1ldHJ5IHdpdGhcbiAgICogYFJlZFBhbGxhc0RLRy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzYC4gT3duIG1lc3NhZ2UgaXMgZmlsdGVyZWQgb3V0IGludGVybmFsbHk7IG9ubHkgdGhlXG4gICAqIGNvdW50ZXJwYXJ0J3MgcGF5bG9hZCBpcyBmb3J3YXJkZWQgdG8gdGhlIFdBU00gcm91bmQgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlc0Zvckl0aFJvdW5kIC0gQm90aCBtZXNzYWdlcyBmb3IgdGhpcyByb3VuZCAob3duICsgY291bnRlcnBhcnQpLlxuICAgKi9cbiAgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhtZXNzYWdlc0Zvckl0aFJvdW5kOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBhbHJlYWR5IGNvbXBsZXRlZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICdEU0cgc2Vzc2lvbiBtdXN0IGNhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgYmVmb3JlIGhhbmRsaW5nIGluY29taW5nIG1lc3NhZ2VzLiBDYWxsIGdldEZpcnN0TWVzc2FnZSgpIGZpcnN0LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlc0Zvckl0aFJvdW5kLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgbnVtYmVyIG9mIG1lc3NhZ2VzIGZvciB0aGUgcm91bmQuIEV4cGVjdGVkIDIgbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSBmb3IgMi1vZi0zIERTRycpO1xuICAgIH1cblxuICAgIGNvbnN0IHBlZXJNZXNzYWdlcyA9IG1lc3NhZ2VzRm9ySXRoUm91bmQuZmlsdGVyKChtKSA9PiBtLmZyb20gIT09IHRoaXMucGFydHlJZHgpO1xuICAgIGlmIChwZWVyTWVzc2FnZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSAxIGNvdW50ZXJwYXJ0IG1lc3NhZ2U7IGdvdCAke3BlZXJNZXNzYWdlcy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IHBlZXJNc2cgPSBwZWVyTWVzc2FnZXNbMF07XG4gICAgaWYgKHBlZXJNc2cuZnJvbSAhPT0gdGhpcy5vdGhlclBhcnR5SWR4KSB7XG4gICAgICB0aHJvdyBFcnJvcihgVW5leHBlY3RlZCBjb3VudGVycGFydCBwYXJ0eSBpbmRleDogZ290ICR7cGVlck1zZy5mcm9tfSwgZXhwZWN0ZWQgJHt0aGlzLm90aGVyUGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGNvbnN0IHBlZXJQYXlsb2FkID0gQnVmZmVyLmZyb20ocGVlck1zZy5wYXlsb2FkKTtcbiAgICBjb25zdCB3YXNtID0gdGhpcy5nZXRXYXNtTXBzKCk7XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzEpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cxJyk7XG4gICAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IHdhc20ucmVkcGFsbGFzX2RzZ19yb3VuZDFfcHJvY2VzcyhwZWVyUGF5bG9hZCwgdGhpcy5kc2dTdGF0ZUJ5dGVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRzZ1N0YXRlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgICAgdGhpcy5kc2dTdGF0ZSA9IFJlZFBhbGxhc0RzZ1N0YXRlLldhaXRNc2cyO1xuICAgICAgcmV0dXJuIFt7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH1dO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5XYWl0TXNnMikge1xuICAgICAgYXNzZXJ0KHRoaXMuZHNnU3RhdGVCeXRlcywgJ2RzZ1N0YXRlQnl0ZXMgbXVzdCBiZSBzZXQgaW4gV2FpdE1zZzInKTtcbiAgICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kMl9wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzM7XG4gICAgICByZXR1cm4gW3sgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLldhaXRNc2czKSB7XG4gICAgICBhc3NlcnQodGhpcy5kc2dTdGF0ZUJ5dGVzLCAnZHNnU3RhdGVCeXRlcyBtdXN0IGJlIHNldCBpbiBXYWl0TXNnMycpO1xuICAgICAgbGV0IHJlc3VsdDogUmVkUGFsbGFzU2lnbmF0dXJlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kM19wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmF0dXJlUmVzdWx0ID0ge1xuICAgICAgICBzaWduYXR1cmU6IEJ1ZmZlci5mcm9tKHJlc3VsdC5zaWduYXR1cmUpLFxuICAgICAgICByazogQnVmZmVyLmZyb20ocmVzdWx0LnJrKSxcbiAgICAgICAgYWxwaGE6IEJ1ZmZlci5mcm9tKHJlc3VsdC5hbHBoYSksXG4gICAgICB9O1xuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gbnVsbDtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBEU0cgc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaW5hbCBzaWduYXR1cmUgYnVuZGxlIHByb2R1Y2VkIGJ5IHJvdW5kIDM6IHRoZSA2NC1ieXRlIHJhdyBSZWRQYWxsYXNcbiAgICogc2lnbmF0dXJlLCB0aGUgcmFuZG9taXplZCB2ZXJpZmljYXRpb24ga2V5IGBya2AgaXQgbXVzdCBiZSB2ZXJpZmllZCBhZ2FpbnN0ICh2aWFcbiAgICogYHJlZHBhbGxhc192ZXJpZnkocmssIHNpZ25hdHVyZSwgbWVzc2FnZSlgIOKAlCBOT1QgdGhlIERLRyBwdWJsaWMga2V5KSwgYW5kIHRoZVxuICAgKiBgYWxwaGFgIHJhbmRvbWl6ZXIgc2NhbGFyIHVzZWQgdG8gZGVyaXZlIGBya2AgZnJvbSB0aGUgREtHIHB1YmxpYyBrZXkuXG4gICAqL1xuICBnZXRTaWduYXR1cmUoKTogUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuc2lnbmF0dXJlUmVzdWx0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaGFzIG5vdCBwcm9kdWNlZCBhIHNpZ25hdHVyZSB5ZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSBhcyBhIEpTT04gc3RyaW5nIGZvciBwZXJzaXN0ZW5jZS5cbiAgICogSW5jbHVkZXMgdGhlIG9wYXF1ZSByb3VuZCBzdGF0ZSBieXRlcyBwbHVzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlLWVudGVyIHRoZVxuICAgKiBwcm90b2NvbCBhZnRlciBhIHJlc3RhcnQgKGtleXNoYXJlLCBtZXNzYWdlLCBjb3VudGVycGFydCkuXG4gICAqL1xuICBnZXRTZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaXMgY29tcGxldGUuIEV4cG9ydGluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBtdXN0IHByb2R1Y2UgaXRzIGZpcnN0IG1lc3NhZ2UgYmVmb3JlIGV4cG9ydGluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRzZ1N0YXRlQnl0ZXM6IHRoaXMuZHNnU3RhdGVCeXRlcz8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBkc2dSb3VuZDogdGhpcy5kc2dTdGF0ZSxcbiAgICAgIGtleVNoYXJlOiB0aGlzLmtleVNoYXJlPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBwYXJ0eUlkeDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIG90aGVyUGFydHlJZHg6IHRoaXMub3RoZXJQYXJ0eUlkeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZSBmcm9tXG4gICAqIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICBhc3luYyByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRXYXNtTXBzKCk7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvbik7XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKFJlZFBhbGxhc0RzZ1N0YXRlKS5pbmNsdWRlcyhkYXRhLmRzZ1JvdW5kKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZHNnUm91bmQgaW4gc2Vzc2lvbjogJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZCB8fCBkYXRhLmRzZ1JvdW5kID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IHJlc3RvcmUgRFNHIHNlc3Npb24gaW4gc3RhdGUgJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gUmVzdG9yaW5nIHRoZSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEucGFydHlJZHggIT09ICdudW1iZXInIHx8IGRhdGEucGFydHlJZHggPCAwIHx8IGRhdGEucGFydHlJZHggPiAyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBwYXJ0eUlkeCBpbiBzZXNzaW9uOiAke2RhdGEucGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBkYXRhLm90aGVyUGFydHlJZHggIT09ICdudW1iZXInIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPCAwIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPiAyIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPT09IGRhdGEucGFydHlJZHhcbiAgICApIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggaW4gc2Vzc2lvbjogJHtkYXRhLm90aGVyUGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4ICE9PSBkYXRhLnBhcnR5SWR4KSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2Vzc2lvbiBwYXJ0eUlkeCAke2RhdGEucGFydHlJZHh9IGRvZXMgbm90IG1hdGNoIGluc3RhbmNlICR7dGhpcy5wYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmRzZ1N0YXRlQnl0ZXMgIT09ICdzdHJpbmcnIHx8IGRhdGEuZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmtleVNoYXJlICE9PSAnc3RyaW5nJyB8fCBkYXRhLmtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEubWVzc2FnZSAhPT0gJ3N0cmluZycgfHwgZGF0YS5tZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBtZXNzYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEuZHNnU3RhdGVCeXRlcywgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGtleVNoYXJlID0gQnVmZmVyLmZyb20oZGF0YS5rZXlTaGFyZSwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuZnJvbShkYXRhLm1lc3NhZ2UsICdiYXNlNjQnKTtcbiAgICBpZiAoZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKGtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3NpbmcgbWVzc2FnZScpO1xuICAgIH1cblxuICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IGRzZ1N0YXRlQnl0ZXM7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IGRhdGEuZHNnUm91bmQ7XG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IGRhdGEucGFydHlJZHg7XG4gICAgdGhpcy5vdGhlclBhcnR5SWR4ID0gZGF0YS5vdGhlclBhcnR5SWR4O1xuICB9XG59XG4iXX0=
|
|
376
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9yZWRwYWxsYXMtbXBzL2RzZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsbUNBQWlIO0FBTWpIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUNILE1BQWEsWUFBWTtJQWtCdkIsWUFBWSxRQUFnQjtRQWhCbEIsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBRTlDLDJGQUEyRjtRQUNuRixhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2QyxnQ0FBZ0M7UUFDeEIsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFFdEMsMkVBQTJFO1FBQ25FLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUM1QyxtRUFBbUU7UUFDM0Qsb0JBQWUsR0FBb0MsSUFBSSxDQUFDO1FBQ2hFLGdDQUFnQztRQUN4QixZQUFPLEdBQW1CLElBQUksQ0FBQztRQUU3QixhQUFRLEdBQXNCLHlCQUFpQixDQUFDLGFBQWEsQ0FBQztRQUd0RSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQ0UsT0FBTyxNQUFNLEtBQUssV0FBVztnQkFDN0IsbUNBQW1DO2dCQUNuQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUNmLENBQUMsTUFB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bXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgdHlwZSB7IE1zZ1N0YXRlLCBSZWRQYWxsYXNTaWduYXR1cmUgfSBmcm9tICdAYml0Z28vd2FzbS1tcHMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIFJlZFBhbGxhc0RzZ1N0YXRlLCBSZWRQYWxsYXNTaWduYXR1cmVSZXN1bHQgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOb2RlV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzJyk7XG50eXBlIFdlYldhc21lciA9IHR5cGVvZiBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcy93ZWInKTtcbnR5cGUgV2FzbU1wcyA9IE5vZGVXYXNtZXIgfCBXZWJXYXNtZXI7XG5cbi8qKlxuICogUmVkUGFsbGFzIChaY2FzaCBJcm9ud29vZCkgRGlzdHJpYnV0ZWQgU2lnbiBHZW5lcmF0aW9uIChEU0cpIGltcGxlbWVudGF0aW9uIHVzaW5nXG4gKiBAYml0Z28vd2FzbS1tcHMuXG4gKlxuICogTWlycm9ycyB0aGUgc3RydWN0dXJlIG9mIHRoZSBFZERTQSBNUFMgYERTR2AgY2xhc3MgKHNlZSBgLi4vZWRkc2EtbXBzL2RzZy50c2ApLCBidXQgd3JhcHNcbiAqIHRoZSBgcmVkcGFsbGFzX2RzZ18qYCBXQVNNIGJpbmRpbmdzLiBVbmxpa2UgdGhlIEVkRFNBIHZlcnNpb246XG4gKlxuICogLSBgcmVkcGFsbGFzX2RzZ19yb3VuZDBfcHJvY2Vzc2AgZG9lcyBub3QgdGFrZSBhIGRlcml2YXRpb24gcGF0aDogUmVkUGFsbGFzIGtleSBkZXJpdmF0aW9uXG4gKiAgIChhc2svbmsvcml2ay9pdmtzKSBoYXBwZW5zIHVwc3RyZWFtLCBhcyBwYXJ0IG9mIERLRyAoYHJlZHBhbGxhc19ka2dfcm91bmQyX3Byb2Nlc3NgICtcbiAqICAgdGhlIHBsYXRmb3JtLXNpZGUtb25seSBgcmVkcGFsbGFzX2Rlcml2YXRpb25fcHJvY2Vzc2ApOyBEU0cgb25seSBldmVyIG9wZXJhdGVzIG9uIGFuXG4gKiAgIGFscmVhZHktZGVyaXZlZCAob3Igcm9vdCkgb3BhcXVlIGBLZXlzaGFyZWAuXG4gKiAtIERTRyBkb2VzIG5vdCByYW5kb21pemUgdGhlIGtleSBpdCBzaWducyB3aXRoOiBzaW5jZSBgQGJpdGdvL3dhc20tbXBzYCAxLjE3LjAsIGtleVxuICogICByZS1yYW5kb21pemF0aW9uIGlzIGEgc2VwYXJhdGUgYHJlcmFuZGAgcHJvdG9jb2wgKHNlZSBgLi9yZXJhbmQudHNgLCBgUmVkUGFsbGFzUmVyYW5kYClcbiAqICAgdGhhdCBtdXN0IHJ1biBiZWZvcmUgZXZlcnkgRFNHLCBiZXR3ZWVuIHRoZSBzYW1lIDIgcGFydGllcy4gVGhlIGtleXNoYXJlIHBhc3NlZCB0b1xuICogICBgaW5pdERzZ2AgbXVzdCBiZSB0aGUgYGtleVNoYXJlYCBmcm9tIHRoYXQgcmVyYW5kIHJlc3VsdC5cbiAqIC0gUm91bmQzIGRvZXMgbm90IHJldHVybiBhIHJhdyBzaWduYXR1cmU7IGl0IHJldHVybnMgYSBgUmVkUGFsbGFzU2lnbmF0dXJlYCBidW5kbGUgb2ZcbiAqICAgYHNpZ25hdHVyZWAgKDY0IHJhdyBieXRlcykgYW5kIGBya2AgKHRoZSByZXJhbmRvbWl6ZWQgdmVyaWZpY2F0aW9uIGtleSB0aGUgc2lnbmF0dXJlXG4gKiAgIHZlcmlmaWVzIGFnYWluc3Qg4oCUIE5PVCB0aGUgREtHIHB1YmxpYyBrZXkpLiBgcmtgIGVxdWFscyB0aGUgYHBrYCBvZiB0aGUgcmVyYW5kIHJlc3VsdFxuICogICB0aGUgRFNHIHNlc3Npb24gd2FzIGluaXRpYWxpemVkIHdpdGguIFNlZSBgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0YC5cbiAqXG4gKiBTaWduaW5nIGEgc3RvcmVkIERLRyBrZXlzaGFyZSBkaXJlY3RseSAod2l0aG91dCByZXJhbmQpIHN0aWxsIHByb2R1Y2VzIGEgdmFsaWRcbiAqIHNpZ25hdHVyZSDigJQgdW5kZXIgdGhlIGJhcmUgREtHIHB1YmxpYyBrZXksIHdpdGggdGhlIHNhbWUgYHJrYCBldmVyeSBzcGVuZCDigJQgYnV0IHRoZVxuICogc3VwcG9ydGVkLCB0ZXN0ZWQgcGF0aCBpcyByZXJhbmQg4oaSIERTRy5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCBXQVNNIHJvdW5kIGZ1bmN0aW9uIHJldHVybnMgYHsgbXNnLCBzdGF0ZSB9YCBieXRlczsgdGhlIHN0YXRlXG4gKiBieXRlcyBhcmUgc3RvcmVkIGJldHdlZW4gcm91bmRzIGFuZCBwYXNzZWQgdG8gdGhlIG5leHQgcm91bmQgZnVuY3Rpb24gKHRoaXMgaXMgd2hhdCBhXG4gKiBzZXJ2ZXIgd291bGQgcGVyc2lzdCB0byBhIGRhdGFiYXNlIGJldHdlZW4gQVBJIHJvdW5kcykuXG4gKlxuICogVGhlIHByb3RvY29sIGlzIGhhcmQtY29kZWQgMi1vZi0zOiBlYWNoIHNpZ25pbmcgcGFydHkgY29tbXVuaWNhdGVzIHdpdGggZXhhY3RseSBvbmVcbiAqIGNvdW50ZXJwYXJ0LiBgaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AgYWNjZXB0cyBib3RoIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCksIGFuZFxuICogZmlsdGVycyBvd24gb3V0IGludGVybmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFJlcmFuZCBmaXJzdCDigJQgc2FtZSAyIHBhcnRpZXMgdGhhdCB3aWxsIHNpZ24gKHNlZSBSZWRQYWxsYXNSZXJhbmQpLlxuICogY29uc3QgcmVyYW5kID0gbmV3IFJlZFBhbGxhc1JlcmFuZCgwKTtcbiAqIGF3YWl0IHJlcmFuZC5pbml0UmVyYW5kKGRrZ0tleVNoYXJlLCAyKTtcbiAqIGNvbnN0IHJlcmFuZE1zZzEgPSByZXJhbmQuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCByZXJhbmRNc2cyID0gcmVyYW5kLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3JlcmFuZE1zZzEsIHBlZXJSZXJhbmRNc2cxXSk7XG4gKiByZXJhbmQuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcmVyYW5kTXNnMlswXSwgcGVlclJlcmFuZE1zZzJdKTtcbiAqIGNvbnN0IHsga2V5U2hhcmUsIHBrLCBhbHBoYSB9ID0gcmVyYW5kLmdldFJlcmFuZG9taXplZEtleVNoYXJlKCk7XG4gKlxuICogY29uc3QgZHNnID0gbmV3IFJlZFBhbGxhc0RTRygwKTsgIC8vIHBhcnR5SWR4IDBcbiAqIGF3YWl0IGRzZy5pbml0RHNnKGtleVNoYXJlLCBtZXNzYWdlLCAyKTsgIC8vIGNvdW50ZXJwYXJ0IGlzIHBhcnR5IDJcbiAqIGNvbnN0IG1zZzEgPSBkc2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCBtc2cyID0gZHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW21zZzEsIHBlZXJNc2cxXSk7ICAvLyBlbWl0cyBTaWduTXNnMlxuICogY29uc3QgbXNnMyA9IGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2cyWzBdLCBwZWVyTXNnMl0pOyAgLy8gZW1pdHMgU2lnbk1zZzNcbiAqIGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2czWzBdLCBwZWVyTXNnM10pOyAgLy8gY29tcGxldGVzIERTR1xuICogY29uc3QgeyBzaWduYXR1cmUsIHJrIH0gPSBkc2cuZ2V0U2lnbmF0dXJlKCk7ICAvLyB2ZXJpZmllcyB1bmRlciByayA9PSBwa1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWRQYWxsYXNEU0cge1xuICBwcm90ZWN0ZWQgcGFydHlJZHg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIG90aGVyUGFydHlJZHg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBPcGFxdWUgYmluY29kZS1zZXJpYWxpc2VkIEtleXNoYXJlIGZyb20gYSBwcmlvciBES0cgKGFscmVhZHkgZGVyaXZlZCwgaWYgYXBwbGljYWJsZSkgKi9cbiAgcHJpdmF0ZSBrZXlTaGFyZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBSYXcgbWVzc2FnZSBieXRlcyB0byBzaWduICovXG4gIHByaXZhdGUgbWVzc2FnZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFNlcmlhbGlzZWQgcm91bmQgc3RhdGUgYnl0ZXMgcmV0dXJuZWQgYnkgdGhlIHByZXZpb3VzIHJvdW5kIGZ1bmN0aW9uICovXG4gIHByaXZhdGUgZHNnU3RhdGVCeXRlczogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGaW5hbCBzaWduYXR1cmUgYnVuZGxlLCBhdmFpbGFibGUgYWZ0ZXIgV2FpdE1zZzMgLT4gQ29tcGxldGUgKi9cbiAgcHJpdmF0ZSBzaWduYXR1cmVSZXN1bHQ6IFJlZFBhbGxhc1NpZ25hdHVyZVJlc3VsdCB8IG51bGwgPSBudWxsO1xuICAvKiogTGF6aWx5IGxvYWRlZCBXQVNNIG1vZHVsZSAqL1xuICBwcml2YXRlIHdhc21NcHM6IFdhc21NcHMgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZHNnU3RhdGU6IFJlZFBhbGxhc0RzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZDtcblxuICBjb25zdHJ1Y3RvcihwYXJ0eUlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogUmVkUGFsbGFzRHNnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmRzZ1N0YXRlO1xuICB9XG5cbiAgZ2V0UGFydHlJZHgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0eUlkeDtcbiAgfVxuXG4gIGdldE90aGVyUGFydHlJZHgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJQYXJ0eUlkeDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFdhc21NcHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgLyogY2hlY2tzIGZvciBlbGVjdHJvbiBwcm9jZXNzZXMgKi9cbiAgICAgICAgIXdpbmRvdy5wcm9jZXNzICYmXG4gICAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICAgICkge1xuICAgICAgICAvLyBCcm93c2VyOiB3ZWIgYnVpbGQgaGFzIGV4cGxpY2l0IGluaXQoKSDigJQgZ3VhcmFudGVlZCByZWFkeSBhZnRlciBhd2FpdFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgLS0gQGJpdGdvL3dhc20tbXBzIGV4cG9zZXMgZW52aXJvbm1lbnQtc3BlY2lmaWMgc3VicGF0aCBleHBvcnRzLlxuICAgICAgICBjb25zdCB3ZWJXYXNtID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMvd2ViJyk7XG4gICAgICAgIGF3YWl0IHdlYldhc20uZGVmYXVsdCgpO1xuICAgICAgICB0aGlzLndhc21NcHMgPSB3ZWJXYXNtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9kZS5qczogZHluYW1pYyBpbXBvcnQoKSByZXdyaXR0ZW4gdG8gcmVxdWlyZSgpIGJ5IHRzYyDihpIgQ0pTIGJ1aWxkIOKGkiByZWFkRmlsZVN5bmNcbiAgICAgICAgdGhpcy53YXNtTXBzID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFdhc21NcHMoKTogV2FzbU1wcyB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIHRocm93IEVycm9yKCdXQVNNIG1vZHVsZSBub3QgbG9hZGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndhc21NcHM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzZXMgdGhlIERTRyBzZXNzaW9uLiBUaGUga2V5c2hhcmUgbXVzdCBiZSB0aGUgcmVyYW5kb21pemVkIGBrZXlTaGFyZWAgZnJvbVxuICAgKiBhIHByaW9yIGBSZWRQYWxsYXNSZXJhbmRgIHJ1biB3aXRoIHRoZSBzYW1lIGNvdW50ZXJwYXJ0ICh3aGljaCBpdHNlbGYgdGFrZXMgdGhlXG4gICAqIG9wYXF1ZSBLZXlzaGFyZSBmcm9tIERLRyDigJQgYWxyZWFkeSBkZXJpdmVkLCBpZiBhcHBsaWNhYmxlKS4gU2lnbmluZyBhIGJhcmUgREtHXG4gICAqIGtleXNoYXJlIHByb2R1Y2VzIGEgdmFsaWQgYnV0IG5vbi1yZXJhbmRvbWl6ZWQgc2lnbmF0dXJlIHVuZGVyIHRoZSBES0cgcHVibGljIGtleTtcbiAgICogdXNlIHJlcmFuZCDihpIgRFNHIGluc3RlYWQuIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHJhblxuICAgKiB0aGF0IHJlcmFuZCBzZXNzaW9uIGFuZCB3aWxsIGNvLXNpZ24gd2l0aCB0aGlzIHBhcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5U2hhcmUgLSBPcGFxdWUgYmluY29kZS1zZXJpYWxpc2VkIHJlcmFuZG9taXplZCBLZXlzaGFyZSBieXRlcyBmcm9tXG4gICAqICAgYFJlZFBhbGxhc1JlcmFuZC5nZXRSZXJhbmRvbWl6ZWRLZXlTaGFyZSgpLmtleVNoYXJlYC5cbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBSYXcgbWVzc2FnZSBieXRlcyB0byBzaWduLlxuICAgKiBAcGFyYW0gb3RoZXJQYXJ0eUlkeCAtIFBhcnR5IGluZGV4IG9mIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgaW4gdGhpcyBzaWduaW5nIHNlc3Npb24uXG4gICAqICAgTXVzdCBkaWZmZXIgZnJvbSB0aGlzIHBhcnR5J3Mgb3duIGBwYXJ0eUlkeGAgYW5kIGJlIGluIGBbMCwgMl1gLCBhbmQgbWF0Y2ggdGhlXG4gICAqICAgY291bnRlcnBhcnQgb2YgdGhlIHByZWNlZGluZyByZXJhbmQgc2Vzc2lvbi5cbiAgICovXG4gIGFzeW5jIGluaXREc2coa2V5U2hhcmU6IEJ1ZmZlciwgbWVzc2FnZTogQnVmZmVyLCBvdGhlclBhcnR5SWR4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRXYXNtTXBzKCk7XG4gICAgaWYgKCFrZXlTaGFyZSB8fCBrZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQga2V5U2hhcmUnKTtcbiAgICB9XG4gICAgaWYgKCFtZXNzYWdlIHx8IG1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydHlJZHggPCAwIHx8IHRoaXMucGFydHlJZHggPiAyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBwYXJ0eUlkeCAke3RoaXMucGFydHlJZHh9OiBtdXN0IGJlIGluIFswLCAyXWApO1xuICAgIH1cbiAgICBpZiAob3RoZXJQYXJ0eUlkeCA8IDAgfHwgb3RoZXJQYXJ0eUlkeCA+IDIgfHwgb3RoZXJQYXJ0eUlkeCA9PT0gdGhpcy5wYXJ0eUlkeCkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgb3RoZXJQYXJ0eUlkeCAke290aGVyUGFydHlJZHh9OiBtdXN0IGJlIGluIFswLCAyXSBhbmQgIT0gcGFydHlJZHhgKTtcbiAgICB9XG5cbiAgICB0aGlzLmtleVNoYXJlID0ga2V5U2hhcmU7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLm90aGVyUGFydHlJZHggPSBvdGhlclBhcnR5SWR4O1xuICAgIHRoaXMuZHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcm91bmQgMCBvZiB0aGUgRFNHIHByb3RvY29sLiBSZXR1cm5zIHRoaXMgcGFydHkncyBicm9hZGNhc3QgbWVzc2FnZVxuICAgKiAoYSBgU2lnbk1zZzFgIGNvbnRhaW5pbmcgdGhlIGNvbW1pdG1lbnQgdG8gYFJfaWApLiBTdG9yZXMgdGhlIHJvdW5kIHN0YXRlXG4gICAqIGJ5dGVzIGludGVybmFsbHkgZm9yIHRoZSBuZXh0IHJvdW5kLlxuICAgKi9cbiAgZ2V0Rmlyc3RNZXNzYWdlKCk6IERlc2VyaWFsaXplZE1lc3NhZ2Uge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlICE9PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGFzc2VydCh0aGlzLmtleVNoYXJlLCAna2V5U2hhcmUgbXVzdCBiZSBzZXQgYWZ0ZXIgaW5pdERzZycpO1xuICAgIGFzc2VydCh0aGlzLm1lc3NhZ2UsICdtZXNzYWdlIG11c3QgYmUgc2V0IGFmdGVyIGluaXREc2cnKTtcblxuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcbiAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kMF9wcm9jZXNzKHRoaXMua2V5U2hhcmUsIHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fTogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzE7XG4gICAgcmV0dXJuIHsgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCByb3VuZCBhbmQgYWR2YW5jZXMgdGhlIHByb3RvY29sLlxuICAgKlxuICAgKiAtIEluIGBXYWl0TXNnMWA6IHJ1bnMgcm91bmQgMSwgcmV0dXJucyB0aGlzIHBhcnR5J3MgYFNpZ25Nc2cyYCBicm9hZGNhc3QuXG4gICAqIC0gSW4gYFdhaXRNc2cyYDogcnVucyByb3VuZCAyICh3aGljaCBpbnRlcm5hbGx5IGZ1c2VzIHR3byBTaWxlbmNlIExhYnMgdHJhbnNpdGlvbnMpLFxuICAgKiAgIHJldHVybnMgdGhpcyBwYXJ0eSdzIGBTaWduTXNnM2AgYnJvYWRjYXN0IChwYXJ0aWFsIHNpZ25hdHVyZSkuXG4gICAqIC0gSW4gYFdhaXRNc2czYDogcnVucyByb3VuZCAzLCBjb21wbGV0ZXMgRFNHLCByZXR1cm5zIGBbXWAuXG4gICAqXG4gICAqIFRoZSBjYWxsZXIgcGFzc2VzIGJvdGggbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSBmb3Igc3ltbWV0cnkgd2l0aFxuICAgKiBgUmVkUGFsbGFzREtHLmhhbmRsZUluY29taW5nTWVzc2FnZXNgLiBPd24gbWVzc2FnZSBpcyBmaWx0ZXJlZCBvdXQgaW50ZXJuYWxseTsgb25seSB0aGVcbiAgICogY291bnRlcnBhcnQncyBwYXlsb2FkIGlzIGZvcndhcmRlZCB0byB0aGUgV0FTTSByb3VuZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2VzRm9ySXRoUm91bmQgLSBCb3RoIG1lc3NhZ2VzIGZvciB0aGlzIHJvdW5kIChvd24gKyBjb3VudGVycGFydCkuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGFscmVhZHkgY29tcGxldGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0RTRyBzZXNzaW9uIG11c3QgY2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBiZWZvcmUgaGFuZGxpbmcgaW5jb21pbmcgbWVzc2FnZXMuIENhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgZmlyc3QuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VzRm9ySXRoUm91bmQubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBudW1iZXIgb2YgbWVzc2FnZXMgZm9yIHRoZSByb3VuZC4gRXhwZWN0ZWQgMiBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpIGZvciAyLW9mLTMgRFNHJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGVlck1lc3NhZ2VzID0gbWVzc2FnZXNGb3JJdGhSb3VuZC5maWx0ZXIoKG0pID0+IG0uZnJvbSAhPT0gdGhpcy5wYXJ0eUlkeCk7XG4gICAgaWYgKHBlZXJNZXNzYWdlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IDEgY291bnRlcnBhcnQgbWVzc2FnZTsgZ290ICR7cGVlck1lc3NhZ2VzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlck1zZyA9IHBlZXJNZXNzYWdlc1swXTtcbiAgICBpZiAocGVlck1zZy5mcm9tICE9PSB0aGlzLm90aGVyUGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBVbmV4cGVjdGVkIGNvdW50ZXJwYXJ0IHBhcnR5IGluZGV4OiBnb3QgJHtwZWVyTXNnLmZyb219LCBleHBlY3RlZCAke3RoaXMub3RoZXJQYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlclBheWxvYWQgPSBCdWZmZXIuZnJvbShwZWVyTXNnLnBheWxvYWQpO1xuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcblxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5XYWl0TXNnMSkge1xuICAgICAgYXNzZXJ0KHRoaXMuZHNnU3RhdGVCeXRlcywgJ2RzZ1N0YXRlQnl0ZXMgbXVzdCBiZSBzZXQgaW4gV2FpdE1zZzEnKTtcbiAgICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kMV9wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzI7XG4gICAgICByZXR1cm4gW3sgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLldhaXRNc2cyKSB7XG4gICAgICBhc3NlcnQodGhpcy5kc2dTdGF0ZUJ5dGVzLCAnZHNnU3RhdGVCeXRlcyBtdXN0IGJlIHNldCBpbiBXYWl0TXNnMicpO1xuICAgICAgbGV0IHJlc3VsdDogTXNnU3RhdGU7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB3YXNtLnJlZHBhbGxhc19kc2dfcm91bmQyX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5XYWl0TXNnMztcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzMpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2czJyk7XG4gICAgICBsZXQgcmVzdWx0OiBSZWRQYWxsYXNTaWduYXR1cmU7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB3YXNtLnJlZHBhbGxhc19kc2dfcm91bmQzX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5zaWduYXR1cmVSZXN1bHQgPSB7XG4gICAgICAgIHNpZ25hdHVyZTogQnVmZmVyLmZyb20ocmVzdWx0LnNpZ25hdHVyZSksXG4gICAgICAgIHJrOiBCdWZmZXIuZnJvbShyZXN1bHQucmspLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IG51bGw7XG4gICAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGU7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdGhyb3cgRXJyb3IoJ1VuZXhwZWN0ZWQgRFNHIHN0YXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmluYWwgc2lnbmF0dXJlIGJ1bmRsZSBwcm9kdWNlZCBieSByb3VuZCAzOiB0aGUgNjQtYnl0ZSByYXcgUmVkUGFsbGFzXG4gICAqIHNpZ25hdHVyZSBhbmQgdGhlIHJlcmFuZG9taXplZCB2ZXJpZmljYXRpb24ga2V5IGBya2AgaXQgbXVzdCBiZSB2ZXJpZmllZCBhZ2FpbnN0XG4gICAqICh2aWEgYHJlZHBhbGxhc192ZXJpZnkocmssIHNpZ25hdHVyZSwgbWVzc2FnZSlgIOKAlCBOT1QgdGhlIERLRyBwdWJsaWMga2V5KS4gYHJrYFxuICAgKiBlcXVhbHMgdGhlIGBwa2Agb2YgdGhlIHJlcmFuZCByZXN1bHQgdGhpcyBzZXNzaW9uIHdhcyBpbml0aWFsaXplZCB3aXRoOyB0aGVcbiAgICogY29ycmVzcG9uZGluZyBgYWxwaGFgIGlzIGF2YWlsYWJsZSBmcm9tIGBSZWRQYWxsYXNSZXJhbmQuZ2V0UmVyYW5kb21pemVkS2V5U2hhcmUoKWAuXG4gICAqL1xuICBnZXRTaWduYXR1cmUoKTogUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuc2lnbmF0dXJlUmVzdWx0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaGFzIG5vdCBwcm9kdWNlZCBhIHNpZ25hdHVyZSB5ZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSBhcyBhIEpTT04gc3RyaW5nIGZvciBwZXJzaXN0ZW5jZS5cbiAgICogSW5jbHVkZXMgdGhlIG9wYXF1ZSByb3VuZCBzdGF0ZSBieXRlcyBwbHVzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlLWVudGVyIHRoZVxuICAgKiBwcm90b2NvbCBhZnRlciBhIHJlc3RhcnQgKGtleXNoYXJlLCBtZXNzYWdlLCBjb3VudGVycGFydCkuXG4gICAqL1xuICBnZXRTZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaXMgY29tcGxldGUuIEV4cG9ydGluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBtdXN0IHByb2R1Y2UgaXRzIGZpcnN0IG1lc3NhZ2UgYmVmb3JlIGV4cG9ydGluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRzZ1N0YXRlQnl0ZXM6IHRoaXMuZHNnU3RhdGVCeXRlcz8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBkc2dSb3VuZDogdGhpcy5kc2dTdGF0ZSxcbiAgICAgIGtleVNoYXJlOiB0aGlzLmtleVNoYXJlPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBwYXJ0eUlkeDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIG90aGVyUGFydHlJZHg6IHRoaXMub3RoZXJQYXJ0eUlkeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZSBmcm9tXG4gICAqIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICBhc3luYyByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRXYXNtTXBzKCk7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvbik7XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKFJlZFBhbGxhc0RzZ1N0YXRlKS5pbmNsdWRlcyhkYXRhLmRzZ1JvdW5kKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZHNnUm91bmQgaW4gc2Vzc2lvbjogJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZCB8fCBkYXRhLmRzZ1JvdW5kID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IHJlc3RvcmUgRFNHIHNlc3Npb24gaW4gc3RhdGUgJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gUmVzdG9yaW5nIHRoZSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEucGFydHlJZHggIT09ICdudW1iZXInIHx8IGRhdGEucGFydHlJZHggPCAwIHx8IGRhdGEucGFydHlJZHggPiAyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBwYXJ0eUlkeCBpbiBzZXNzaW9uOiAke2RhdGEucGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBkYXRhLm90aGVyUGFydHlJZHggIT09ICdudW1iZXInIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPCAwIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPiAyIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPT09IGRhdGEucGFydHlJZHhcbiAgICApIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggaW4gc2Vzc2lvbjogJHtkYXRhLm90aGVyUGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4ICE9PSBkYXRhLnBhcnR5SWR4KSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2Vzc2lvbiBwYXJ0eUlkeCAke2RhdGEucGFydHlJZHh9IGRvZXMgbm90IG1hdGNoIGluc3RhbmNlICR7dGhpcy5wYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmRzZ1N0YXRlQnl0ZXMgIT09ICdzdHJpbmcnIHx8IGRhdGEuZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmtleVNoYXJlICE9PSAnc3RyaW5nJyB8fCBkYXRhLmtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEubWVzc2FnZSAhPT0gJ3N0cmluZycgfHwgZGF0YS5tZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBtZXNzYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEuZHNnU3RhdGVCeXRlcywgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGtleVNoYXJlID0gQnVmZmVyLmZyb20oZGF0YS5rZXlTaGFyZSwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuZnJvbShkYXRhLm1lc3NhZ2UsICdiYXNlNjQnKTtcbiAgICBpZiAoZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKGtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3NpbmcgbWVzc2FnZScpO1xuICAgIH1cblxuICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IGRzZ1N0YXRlQnl0ZXM7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IGRhdGEuZHNnUm91bmQ7XG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IGRhdGEucGFydHlJZHg7XG4gICAgdGhpcy5vdGhlclBhcnR5SWR4ID0gZGF0YS5vdGhlclBhcnR5SWR4O1xuICB9XG59XG4iXX0=
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export * as RedPallasMPSDkg from './dkg';
|
|
2
2
|
export * as RedPallasMPSDsg from './dsg';
|
|
3
|
+
export * as RedPallasMPSRerand from './rerand';
|
|
3
4
|
export * as RedPallasMPSUtil from './util';
|
|
4
5
|
export * as RedPallasMPSTypes from './types';
|
|
5
6
|
export * as RedPallasMPSComms from './commsLayer';
|
|
6
|
-
export type { RedPallasSignatureResult } from './types';
|
|
7
|
+
export type { RedPallasRerandResult, RedPallasSignatureResult } from './types';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,gBAAgB,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,iBAAiB,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,iBAAiB,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,kBAAkB,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,gBAAgB,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,iBAAiB,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,iBAAiB,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -33,10 +33,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.RedPallasMPSComms = exports.RedPallasMPSTypes = exports.RedPallasMPSUtil = exports.RedPallasMPSDsg = exports.RedPallasMPSDkg = void 0;
|
|
36
|
+
exports.RedPallasMPSComms = exports.RedPallasMPSTypes = exports.RedPallasMPSUtil = exports.RedPallasMPSRerand = exports.RedPallasMPSDsg = exports.RedPallasMPSDkg = void 0;
|
|
37
37
|
exports.RedPallasMPSDkg = __importStar(require("./dkg"));
|
|
38
38
|
exports.RedPallasMPSDsg = __importStar(require("./dsg"));
|
|
39
|
+
exports.RedPallasMPSRerand = __importStar(require("./rerand"));
|
|
39
40
|
exports.RedPallasMPSUtil = __importStar(require("./util"));
|
|
40
41
|
exports.RedPallasMPSTypes = __importStar(require("./types"));
|
|
41
42
|
exports.RedPallasMPSComms = __importStar(require("./commsLayer"));
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL3JlZHBhbGxhcy1tcHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQXlDO0FBQ3pDLHlEQUF5QztBQUN6QywrREFBK0M7QUFDL0MsMkRBQTJDO0FBQzNDLDZEQUE2QztBQUM3QyxrRUFBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNEa2cgZnJvbSAnLi9ka2cnO1xuZXhwb3J0ICogYXMgUmVkUGFsbGFzTVBTRHNnIGZyb20gJy4vZHNnJztcbmV4cG9ydCAqIGFzIFJlZFBhbGxhc01QU1JlcmFuZCBmcm9tICcuL3JlcmFuZCc7XG5leHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNVdGlsIGZyb20gJy4vdXRpbCc7XG5leHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNUeXBlcyBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGFzIFJlZFBhbGxhc01QU0NvbW1zIGZyb20gJy4vY29tbXNMYXllcic7XG5leHBvcnQgdHlwZSB7IFJlZFBhbGxhc1JlcmFuZFJlc3VsdCwgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IH0gZnJvbSAnLi90eXBlcyc7XG4iXX0=
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { DeserializedMessage, DeserializedMessages, RedPallasRerandResult, RedPallasRerandState } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* RedPallas (Zcash Ironwood) key re-randomization implementation using @bitgo/wasm-mps.
|
|
4
|
+
*
|
|
5
|
+
* As of `@bitgo/wasm-mps` 1.17.0, key re-randomization has moved out of DSG and into
|
|
6
|
+
* this separate `rerand` protocol: DSG no longer randomizes the key it signs with.
|
|
7
|
+
* A rerand session MUST run before every RedPallas DSG, between the same 2 parties
|
|
8
|
+
* that will then sign:
|
|
9
|
+
*
|
|
10
|
+
* - Round 0 (local): each party commits to a fresh random randomizer.
|
|
11
|
+
* - Round 1 (commit): each party broadcasts its commitment.
|
|
12
|
+
* - Round 2 (open): each party broadcasts its randomizer and blind, bound to the
|
|
13
|
+
* session id. Both parties then locally verify the openings and apply the same
|
|
14
|
+
* tweak `alpha = hash(Σ randomizers)`: `d_i += alpha`, `pk += G·alpha`.
|
|
15
|
+
*
|
|
16
|
+
* The output `RedPallasRerandShare` is a rerandomized keyshare (`share`), the
|
|
17
|
+
* rerandomized public key (`pk`) and the tweak scalar (`alpha`). `share` is what
|
|
18
|
+
* goes into `RedPallasDSG.initDsg`; the resulting DSG signature verifies under
|
|
19
|
+
* `rk == pk`, and `alpha` is only available here — not from the DSG result.
|
|
20
|
+
*
|
|
21
|
+
* Signing a stored DKG keyshare directly (without rerand) still yields a valid
|
|
22
|
+
* signature, but under the bare DKG public key with the same `rk` every time; the
|
|
23
|
+
* rerand → DSG sequence is the supported path.
|
|
24
|
+
*
|
|
25
|
+
* Mirrors the structure of `RedPallasDSG` (see `./dsg.ts`): lazy web/node WASM
|
|
26
|
+
* loading, explicit round state bytes persisted between rounds, hard-coded 2-of-3
|
|
27
|
+
* with a single counterpart, and the same 2-message `handleIncomingMessages`
|
|
28
|
+
* contract (own + counterpart; own is filtered out internally).
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const rerand = new RedPallasRerand(0); // partyIdx 0
|
|
33
|
+
* await rerand.initRerand(keyShare, 2); // counterpart is party 2
|
|
34
|
+
* const msg1 = rerand.getFirstMessage();
|
|
35
|
+
* const msg2 = rerand.handleIncomingMessages([msg1, peerMsg1]); // emits rerand msg2
|
|
36
|
+
* rerand.handleIncomingMessages([msg2[0], peerMsg2]); // completes rerand
|
|
37
|
+
* const { keyShare, pk, alpha } = rerand.getRerandomizedKeyShare();
|
|
38
|
+
* const dsg = new RedPallasDSG(0);
|
|
39
|
+
* await dsg.initDsg(keyShare, message, 2); // DSG verifies under rk == pk
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare class RedPallasRerand {
|
|
43
|
+
protected partyIdx: number;
|
|
44
|
+
protected otherPartyIdx: number | null;
|
|
45
|
+
/** Opaque bincode-serialised Keyshare from a prior DKG (already derived, if applicable) */
|
|
46
|
+
private keyShare;
|
|
47
|
+
/** Serialised round state bytes returned by the previous round function */
|
|
48
|
+
private rerandStateBytes;
|
|
49
|
+
/** Final rerandomized share bundle, available after WaitMsg2 -> Complete */
|
|
50
|
+
private rerandResult;
|
|
51
|
+
/** Lazily loaded WASM module */
|
|
52
|
+
private wasmMps;
|
|
53
|
+
protected rerandState: RedPallasRerandState;
|
|
54
|
+
constructor(partyIdx: number);
|
|
55
|
+
getState(): RedPallasRerandState;
|
|
56
|
+
getPartyIdx(): number;
|
|
57
|
+
getOtherPartyIdx(): number | null;
|
|
58
|
+
private loadWasmMps;
|
|
59
|
+
private getWasmMps;
|
|
60
|
+
/**
|
|
61
|
+
* Initialises the rerand session. The keyshare must come from a prior DKG run (and,
|
|
62
|
+
* if a derived key is being used, from the subsequent platform-side derivation
|
|
63
|
+
* process), and `otherPartyIdx` must be the single counterpart who will then co-sign
|
|
64
|
+
* (via DSG) with this party. Rerand and DSG must use the same 2 parties.
|
|
65
|
+
*
|
|
66
|
+
* @param keyShare - Opaque bincode-serialised Keyshare bytes from `RedPallasDKG.getKeyShare()`.
|
|
67
|
+
* @param otherPartyIdx - Party index of the single counterpart in this rerand session.
|
|
68
|
+
* Must differ from this party's own `partyIdx` and be in `[0, 2]`.
|
|
69
|
+
*/
|
|
70
|
+
initRerand(keyShare: Buffer, otherPartyIdx: number): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Runs round 0 of the rerand protocol (local). Returns this party's broadcast
|
|
73
|
+
* message (a commitment to a fresh random randomizer). Stores the round state
|
|
74
|
+
* bytes internally for the next round.
|
|
75
|
+
*/
|
|
76
|
+
getFirstMessage(): DeserializedMessage;
|
|
77
|
+
/**
|
|
78
|
+
* Handles incoming messages for the current round and advances the protocol.
|
|
79
|
+
*
|
|
80
|
+
* - In `WaitMsg1`: runs round 1 (commit), returns this party's round 2 broadcast
|
|
81
|
+
* (its randomizer and blind).
|
|
82
|
+
* - In `WaitMsg2`: runs round 2 (open + local tweak), completes rerand, returns `[]`.
|
|
83
|
+
*
|
|
84
|
+
* The caller passes both messages (own + counterpart) for symmetry with
|
|
85
|
+
* `RedPallasDSG.handleIncomingMessages`. Own message is filtered out internally;
|
|
86
|
+
* only the counterpart's payload is forwarded to the WASM round function.
|
|
87
|
+
*
|
|
88
|
+
* @param messagesForIthRound - Both messages for this round (own + counterpart).
|
|
89
|
+
*/
|
|
90
|
+
handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
|
|
91
|
+
/**
|
|
92
|
+
* Returns the rerandomized share bundle produced by round 2: the rerandomized
|
|
93
|
+
* keyshare `keyShare` (to be passed to `RedPallasDSG.initDsg`), the rerandomized
|
|
94
|
+
* public key `pk` (the DSG result's `rk` equals it), and the 32-byte tweak scalar
|
|
95
|
+
* `alpha` (fresh per rerand session, identical on both parties).
|
|
96
|
+
*/
|
|
97
|
+
getRerandomizedKeyShare(): RedPallasRerandResult;
|
|
98
|
+
/**
|
|
99
|
+
* Exports the current session state as a JSON string for persistence.
|
|
100
|
+
* Includes the opaque round state bytes plus everything needed to re-enter the
|
|
101
|
+
* protocol after a restart (keyshare, counterpart).
|
|
102
|
+
*/
|
|
103
|
+
getSession(): string;
|
|
104
|
+
/**
|
|
105
|
+
* Restores a previously exported session. Allows the protocol to continue from
|
|
106
|
+
* where it left off, as if the round state was loaded from a database.
|
|
107
|
+
*/
|
|
108
|
+
restoreSession(session: string): Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=rerand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rerand.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/rerand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAMjH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBAAa,eAAe;IAC1B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAuB;IAEvC,2EAA2E;IAC3E,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,4EAA4E;IAC5E,OAAO,CAAC,YAAY,CAAsC;IAC1D,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,WAAW,EAAE,oBAAoB,CAAsC;gBAErE,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,oBAAoB;IAIhC,WAAW,IAAI,MAAM;IAIrB,gBAAgB,IAAI,MAAM,GAAG,IAAI;YAInB,WAAW;IAoBzB,OAAO,CAAC,UAAU;IAOlB;;;;;;;;;OASG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxE;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAmBtC;;;;;;;;;;;;OAYG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IA+DvF;;;;;OAKG;IACH,uBAAuB,IAAI,qBAAqB;IAOhD;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAmBpB;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgDrD"}
|