@bitgo-beta/sdk-core 8.2.1-beta.2121 → 8.2.1-beta.2123

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.getSignatureShareRoundOne = getSignatureShareRoundOne;
4
7
  exports.verifyPeerMessageRoundOne = verifyPeerMessageRoundOne;
@@ -10,6 +13,7 @@ exports.getRerandShareRoundOne = getRerandShareRoundOne;
10
13
  exports.verifyPeerRerandMessageRoundOne = verifyPeerRerandMessageRoundOne;
11
14
  exports.getRerandShareRoundTwo = getRerandShareRoundTwo;
12
15
  exports.verifyPeerRerandMessageRoundTwo = verifyPeerRerandMessageRoundTwo;
16
+ const assert_1 = __importDefault(require("assert"));
13
17
  const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
14
18
  const baseTypes_1 = require("../../utils/tss/baseTypes");
15
19
  const typesMPCv2_1 = require("../../utils/tss/ecdsa/typesMPCv2");
@@ -24,35 +28,66 @@ function partyIdToSignatureShareType(partyId) {
24
28
  }
25
29
  }
26
30
  /**
27
- * RedPallas MPS DSG and rerand signature-share helpers.
31
+ * RedPallas MPS DSG and rerand signature-share helpers (multi-spend, WCI-1949).
28
32
  *
29
- * Consumed by the custodial/cold (SMC/OVC) signing flow: OVC builds its rerand and DSG
30
- * shares with these and submits them via the /sign txRequest route (see
31
- * `sendSignatureShareV2`, body types `redPallasRerand` / `redPallasMpcV2`). No caller
32
- * inside this SDK yet. Mirrors `../eddsa/eddsaMPCv2.ts` (same round shape, same
33
- * PGP-signed-message envelope), but kept as an independent copy - built on
34
- * `RedPallasMPSComms` - so RedPallas MPS never depends on the EdDSA MPS module, and
35
- * vice versa.
33
+ * A shielded ZEC transaction can spend several Orchard notes; every per-spend
34
+ * value on the /sign wire is an ARRAY of length N ordered by spend index, where
35
+ * N is the number of Orchard spends
36
+ * (`txRequest.transactions[i].unsignedTx.parsedTx.inputs.length`), derived on
37
+ * the client and never a wire field. Each spend runs its own rerand session and
38
+ * its own DSG session (N instances of `RedPallasRerand` / `RedPallasDSG` — they
39
+ * are single-session by design; the per-spend fan-out lives in the caller, see
40
+ * OVC's `MpcSignerRedPallas`), but each round still produces exactly ONE
41
+ * `SignatureShareRecord` per transaction: the builders below take N
42
+ * PGP-signed messages in and emit one record whose `msgN` is the spend-ordered
43
+ * array; the verifiers take a parsed peer `roundNOutput` (msgN array) and
44
+ * return N verified messages out, in the same order.
36
45
  *
37
- * Since `@bitgo/wasm-mps` 1.17.0, key re-randomization is a separate 2-round rerand
38
- * protocol that must run before every RedPallas DSG, between the same 2 parties that
39
- * will then sign: `getRerandShareRoundOne/Two` build those share records and
40
- * `verifyPeerRerandMessageRoundOne/Two` unwrap the peer's rerand messages (see
41
- * `RedPallasRerand` in `@bitgo-beta/sdk-lib-mpc`). The rerand result exposes
42
- * `{keyShare, pk, alpha}`; `pk` is the `rk` the DSG signature verifies under, and the
43
- * DSG keyshare is the rerandomized `keyShare` - never the bare DKG keyshare.
46
+ * Builders:
47
+ * - assert a non-empty input array (N >= 1; an Orchard spend transaction has at
48
+ * least one input) and preserve spend order — Wallet Platform index-pairs
49
+ * `msgN[i]` with spend i's HSM state, so a misordered array silently mispairs
50
+ * spends.
51
+ * - emit exactly ONE share record per round — WP reads only the LAST share in
52
+ * `signatureShares`; multiple partial records would be silently dropped.
53
+ *
54
+ * Verifiers:
55
+ * - return one verified message per array entry, same order, all signed by the
56
+ * BitGo RedPallas GPG key; a single failed verification fails the whole round
57
+ * (all-or-nothing, mirroring WP's per-round share handling).
58
+ *
59
+ * Consumed by the custodial/cold (SMC/OVC) signing flow: OVC builds its rerand
60
+ * and DSG shares with these and submits them via the /sign txRequest route (see
61
+ * `sendSignatureShareV2`, body types `redPallasRerand` / `redPallasMpcV2`). No
62
+ * caller inside this SDK yet. Mirrors `../eddsa/eddsaMPCv2.ts` (same round
63
+ * shape, same PGP-signed-message envelope), but kept as an independent copy -
64
+ * built on `RedPallasMPSComms` - so RedPallas MPS never depends on the EdDSA MPS
65
+ * module, and vice versa. The EdDSA helpers themselves remain scalar
66
+ * (single-signable): EdDSA is not part of the multi-spend cutover.
67
+ *
68
+ * Since `@bitgo/wasm-mps` 1.17.0, key re-randomization is a separate 2-round
69
+ * rerand protocol that must run before every RedPallas DSG, between the same 2
70
+ * parties that will then sign: `getRerandShareRoundOne/Two` build those share
71
+ * records and `verifyPeerRerandMessageRoundOne/Two` unwrap the peer's rerand
72
+ * messages (see `RedPallasRerand` in `@bitgo-beta/sdk-lib-mpc`). Rerand R1 seeds
73
+ * every spend's session from the SAME DKG keyshare; after R2 each spend has its
74
+ * own rerand result `{keyShare, pk, alpha}`. The per-spend `keyShare` - never
75
+ * the bare DKG keyshare - initializes that spend's DSG session, and the DSG
76
+ * signature verifies under `rk == pk` of the same spend.
44
77
  */
45
78
  /**
46
79
  * Builds the round-1 signature share record.
47
80
  *
48
- * PGP-signs the WASM round-0 broadcast message with the signer's ephemeral key and
49
- * wraps it into a SignatureShareRecord ready for `sendSignatureShareV2`.
81
+ * PGP-signs each spend's WASM round-0 broadcast message with the signer's
82
+ * ephemeral key and wraps all N of them, in spend order, into ONE
83
+ * SignatureShareRecord (`msg1` array) ready for `sendSignatureShareV2`.
50
84
  */
51
- async function getSignatureShareRoundOne(userMsg1, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
52
- const signedMsg1 = await sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg1.payload), userGpgPrivKey);
85
+ async function getSignatureShareRoundOne(userMsg1s, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
86
+ (0, assert_1.default)(userMsg1s.length >= 1, 'Expected at least 1 round-1 message (one per shielded spend)');
87
+ const signedMsg1s = await Promise.all(userMsg1s.map((userMsg1) => sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg1.payload), userGpgPrivKey)));
53
88
  const share = {
54
89
  type: 'round1Input',
55
- data: { msg1: signedMsg1 },
90
+ data: { msg1: signedMsg1s },
56
91
  };
57
92
  return {
58
93
  from: partyIdToSignatureShareType(partyId),
@@ -61,24 +96,31 @@ async function getSignatureShareRoundOne(userMsg1, userGpgPrivKey, partyId = typ
61
96
  };
62
97
  }
63
98
  /**
64
- * Verifies the peer's round-1 PGP signature and returns the raw deserialized
65
- * message ready for `RedPallasDSG.handleIncomingMessages`.
99
+ * Verifies the peer's round-1 PGP signatures and returns the raw deserialized
100
+ * messages, one per shielded spend in the peer's array order, ready for
101
+ * `RedPallasDSG.handleIncomingMessages` (feed `msg1[i]` into spend i's session).
102
+ * All-or-nothing: a single failed verification rejects the whole round.
66
103
  */
67
104
  async function verifyPeerMessageRoundOne(parsedRound1Output, peerGpgKey, peerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
68
- const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(parsedRound1Output.data.msg1, peerGpgKey);
69
- return {
70
- from: peerPartyId,
71
- payload: new Uint8Array(rawBytes),
72
- };
105
+ const verifiedMsgs = [];
106
+ for (const signedMsg1 of parsedRound1Output.data.msg1) {
107
+ const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(signedMsg1, peerGpgKey);
108
+ verifiedMsgs.push({ from: peerPartyId, payload: new Uint8Array(rawBytes) });
109
+ }
110
+ return verifiedMsgs;
73
111
  }
74
112
  /**
75
113
  * Builds the round-2 signature share record.
114
+ *
115
+ * PGP-signs each spend's round-2 message and wraps all N of them, in spend
116
+ * order, into ONE SignatureShareRecord (`msg2` array).
76
117
  */
77
- async function getSignatureShareRoundTwo(userMsg2, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
78
- const signedMsg2 = await sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg2.payload), userGpgPrivKey);
118
+ async function getSignatureShareRoundTwo(userMsg2s, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
119
+ (0, assert_1.default)(userMsg2s.length >= 1, 'Expected at least 1 round-2 message (one per shielded spend)');
120
+ const signedMsg2s = await Promise.all(userMsg2s.map((userMsg2) => sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg2.payload), userGpgPrivKey)));
79
121
  const share = {
80
122
  type: 'round2Input',
81
- data: { msg2: signedMsg2 },
123
+ data: { msg2: signedMsg2s },
82
124
  };
83
125
  return {
84
126
  from: partyIdToSignatureShareType(partyId),
@@ -87,36 +129,49 @@ async function getSignatureShareRoundTwo(userMsg2, userGpgPrivKey, partyId = typ
87
129
  };
88
130
  }
89
131
  /**
90
- * Verifies the peer's round-2 PGP signature and returns the raw deserialized
91
- * message ready for `RedPallasDSG.handleIncomingMessages`.
132
+ * Verifies the peer's round-2 PGP signatures and returns the raw deserialized
133
+ * messages, one per shielded spend in the peer's array order, ready for
134
+ * `RedPallasDSG.handleIncomingMessages` (feed `msg2[i]` into spend i's session).
135
+ * All-or-nothing: a single failed verification rejects the whole round.
92
136
  */
93
137
  async function verifyPeerMessageRoundTwo(parsedRound2Output, peerGpgKey, peerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
94
- const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(parsedRound2Output.data.msg2, peerGpgKey);
95
- return {
96
- from: peerPartyId,
97
- payload: new Uint8Array(rawBytes),
98
- };
138
+ const verifiedMsgs = [];
139
+ for (const signedMsg2 of parsedRound2Output.data.msg2) {
140
+ const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(signedMsg2, peerGpgKey);
141
+ verifiedMsgs.push({ from: peerPartyId, payload: new Uint8Array(rawBytes) });
142
+ }
143
+ return verifiedMsgs;
99
144
  }
100
145
  /**
101
- * Verifies the peer's round-3 PGP signature and returns the raw deserialized
102
- * message ready for `RedPallasDSG.handleIncomingMessages`.
146
+ * Verifies the peer's round-3 PGP signatures and returns the raw deserialized
147
+ * messages, one per shielded spend in the peer's array order, ready for
148
+ * `RedPallasDSG.handleIncomingMessages` (feed `msg3[i]` into spend i's session).
149
+ * All-or-nothing: a single failed verification rejects the whole round.
103
150
  */
104
151
  async function verifyPeerMessageRoundThree(parsedRound3Output, peerGpgKey, peerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
105
- const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(parsedRound3Output.data.msg3, peerGpgKey);
106
- return { from: peerPartyId, payload: new Uint8Array(rawBytes) };
152
+ const verifiedMsgs = [];
153
+ for (const signedMsg3 of parsedRound3Output.data.msg3) {
154
+ const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(signedMsg3, peerGpgKey);
155
+ verifiedMsgs.push({ from: peerPartyId, payload: new Uint8Array(rawBytes) });
156
+ }
157
+ return verifiedMsgs;
107
158
  }
108
159
  /**
109
- * Builds the round-3 signature share record (final signer message).
160
+ * Builds the round-3 signature share record (final signer messages).
161
+ *
162
+ * PGP-signs each spend's round-3 message and wraps all N of them, in spend
163
+ * order, into ONE SignatureShareRecord (`msg3` array).
110
164
  *
111
165
  * There is no corresponding `verifyBitGoMessageRoundThree` because Wallet Platform
112
- * finalises the signing server-side after receiving round 3; the client obtains the
113
- * signed transaction via `sendTxRequest`.
166
+ * finalises the signing server-side after receiving round 3; the client obtains
167
+ * the signed transaction via `sendTxRequest`.
114
168
  */
115
- async function getSignatureShareRoundThree(userMsg3, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
116
- const signedMsg3 = await sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg3.payload), userGpgPrivKey);
169
+ async function getSignatureShareRoundThree(userMsg3s, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
170
+ (0, assert_1.default)(userMsg3s.length >= 1, 'Expected at least 1 round-3 message (one per shielded spend)');
171
+ const signedMsg3s = await Promise.all(userMsg3s.map((userMsg3) => sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg3.payload), userGpgPrivKey)));
117
172
  const share = {
118
173
  type: 'round3Input',
119
- data: { msg3: signedMsg3 },
174
+ data: { msg3: signedMsg3s },
120
175
  };
121
176
  return {
122
177
  from: partyIdToSignatureShareType(partyId),
@@ -127,14 +182,18 @@ async function getSignatureShareRoundThree(userMsg3, userGpgPrivKey, partyId = t
127
182
  /**
128
183
  * Builds the rerand round-1 signature share record.
129
184
  *
130
- * Rerand must run before every RedPallas DSG, with the same counterpart. Round 1
131
- * carries the PGP-signed WASM commitment broadcast (`RedPallasRerand.getFirstMessage()`).
185
+ * Rerand must run before every RedPallas DSG, with the same counterpart, once
186
+ * per shielded spend: the caller initializes N `RedPallasRerand` sessions on the
187
+ * SAME DKG keyshare and passes each session's `getFirstMessage()`, in spend
188
+ * order. Round 1 carries the PGP-signed WASM commitments; all N are wrapped
189
+ * into ONE SignatureShareRecord (`msg1` array).
132
190
  */
133
- async function getRerandShareRoundOne(userMsg1, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
134
- const signedMsg1 = await sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg1.payload), userGpgPrivKey);
191
+ async function getRerandShareRoundOne(userMsg1s, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
192
+ (0, assert_1.default)(userMsg1s.length >= 1, 'Expected at least 1 rerand round-1 message (one per shielded spend)');
193
+ const signedMsg1s = await Promise.all(userMsg1s.map((userMsg1) => sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg1.payload), userGpgPrivKey)));
135
194
  const share = {
136
195
  type: 'round1Input',
137
- data: { msg1: signedMsg1 },
196
+ data: { msg1: signedMsg1s },
138
197
  };
139
198
  return {
140
199
  from: partyIdToSignatureShareType(partyId),
@@ -143,24 +202,32 @@ async function getRerandShareRoundOne(userMsg1, userGpgPrivKey, partyId = typesM
143
202
  };
144
203
  }
145
204
  /**
146
- * Verifies the peer's rerand round-1 PGP signature and returns the raw deserialized
147
- * message ready for `RedPallasRerand.handleIncomingMessages`.
205
+ * Verifies the peer's rerand round-1 PGP signatures and returns the raw
206
+ * deserialized messages, one per shielded spend in the peer's array order,
207
+ * ready for `RedPallasRerand.handleIncomingMessages` (feed `msg1[i]` into
208
+ * spend i's session). All-or-nothing: a single failed verification rejects the
209
+ * whole round.
148
210
  */
149
211
  async function verifyPeerRerandMessageRoundOne(parsedRound1Output, peerGpgKey, peerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
150
- const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(parsedRound1Output.data.msg1, peerGpgKey);
151
- return {
152
- from: peerPartyId,
153
- payload: new Uint8Array(rawBytes),
154
- };
212
+ const verifiedMsgs = [];
213
+ for (const signedMsg1 of parsedRound1Output.data.msg1) {
214
+ const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(signedMsg1, peerGpgKey);
215
+ verifiedMsgs.push({ from: peerPartyId, payload: new Uint8Array(rawBytes) });
216
+ }
217
+ return verifiedMsgs;
155
218
  }
156
219
  /**
157
- * Builds the rerand round-2 signature share record (opening message).
220
+ * Builds the rerand round-2 signature share record (opening messages).
221
+ *
222
+ * PGP-signs each spend's rerand round-2 message and wraps all N of them, in
223
+ * spend order, into ONE SignatureShareRecord (`msg2` array).
158
224
  */
159
- async function getRerandShareRoundTwo(userMsg2, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
160
- const signedMsg2 = await sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg2.payload), userGpgPrivKey);
225
+ async function getRerandShareRoundTwo(userMsg2s, userGpgPrivKey, partyId = typesMPCv2_1.MPCv2PartiesEnum.USER, otherSignerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
226
+ (0, assert_1.default)(userMsg2s.length >= 1, 'Expected at least 1 rerand round-2 message (one per shielded spend)');
227
+ const signedMsg2s = await Promise.all(userMsg2s.map((userMsg2) => sdk_lib_mpc_1.RedPallasMPSComms.detachSignMpsMessage(Buffer.from(userMsg2.payload), userGpgPrivKey)));
161
228
  const share = {
162
229
  type: 'round2Input',
163
- data: { msg2: signedMsg2 },
230
+ data: { msg2: signedMsg2s },
164
231
  };
165
232
  return {
166
233
  from: partyIdToSignatureShareType(partyId),
@@ -169,16 +236,20 @@ async function getRerandShareRoundTwo(userMsg2, userGpgPrivKey, partyId = typesM
169
236
  };
170
237
  }
171
238
  /**
172
- * Verifies the peer's rerand round-2 PGP signature and returns the raw deserialized
173
- * message ready for `RedPallasRerand.handleIncomingMessages`. After this exchange
174
- * both parties read the rerandomized keyshare via `getRerandomizedKeyShare()` and
175
- * feed it into `RedPallasDSG.initDsg`.
239
+ * Verifies the peer's rerand round-2 PGP signatures and returns the raw
240
+ * deserialized messages, one per shielded spend in the peer's array order,
241
+ * ready for `RedPallasRerand.handleIncomingMessages` (feed `msg2[i]` into
242
+ * spend i's session). All-or-nothing: a single failed verification rejects the
243
+ * whole round. After this exchange both parties read each spend's
244
+ * rerandomized keyshare via `getRerandomizedKeyShare()` and feed it into that
245
+ * spend's `RedPallasDSG.initDsg` - never the bare DKG keyshare.
176
246
  */
177
247
  async function verifyPeerRerandMessageRoundTwo(parsedRound2Output, peerGpgKey, peerPartyId = typesMPCv2_1.MPCv2PartiesEnum.BITGO) {
178
- const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(parsedRound2Output.data.msg2, peerGpgKey);
179
- return {
180
- from: peerPartyId,
181
- payload: new Uint8Array(rawBytes),
182
- };
248
+ const verifiedMsgs = [];
249
+ for (const signedMsg2 of parsedRound2Output.data.msg2) {
250
+ const rawBytes = await sdk_lib_mpc_1.RedPallasMPSComms.verifyMpsMessage(signedMsg2, peerGpgKey);
251
+ verifiedMsgs.push({ from: peerPartyId, payload: new Uint8Array(rawBytes) });
252
+ }
253
+ return verifiedMsgs;
183
254
  }
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkcGFsbGFzTVBDdjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHNzL3JlZHBhbGxhcy9yZWRwYWxsYXNNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXdEQSw4REFnQkM7QUFNRCw4REFVQztBQUtELDhEQWdCQztBQU1ELDhEQVVDO0FBTUQsa0VBT0M7QUFTRCxrRUFnQkM7QUFRRCx3REFnQkM7QUFNRCwwRUFVQztBQUtELHdEQWdCQztBQVFELDBFQVVDO0FBalBELHlEQUErRTtBQWEvRSx5REFBcUY7QUFDckYsaUVBQW9FO0FBSXBFLFNBQVMsMkJBQTJCLENBQUMsT0FBeUI7SUFDNUQsUUFBUSxPQUFPLEVBQUUsQ0FBQztRQUNoQixLQUFLLDZCQUFnQixDQUFDLElBQUk7WUFDeEIsT0FBTyw4QkFBa0IsQ0FBQyxJQUFJLENBQUM7UUFDakMsS0FBSyw2QkFBZ0IsQ0FBQyxNQUFNO1lBQzFCLE9BQU8sOEJBQWtCLENBQUMsTUFBTSxDQUFDO1FBQ25DLEtBQUssNkJBQWdCLENBQUMsS0FBSztZQUN6QixPQUFPLDhCQUFrQixDQUFDLEtBQUssQ0FBQztJQUNwQyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsUUFBK0MsRUFDL0MsY0FBa0MsRUFDbEMsVUFBeUIsNkJBQWdCLENBQUMsSUFBSSxFQUM5QyxxQkFBdUMsNkJBQWdCLENBQUMsS0FBSztJQUU3RCxNQUFNLFVBQVUsR0FBRyxNQUFNLCtCQUFpQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQy9HLE1BQU0sS0FBSyxHQUE0QztRQUNyRCxJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFB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Q0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNJLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsUUFBK0MsRUFDL0MsY0FBa0MsRUFDbEMsVUFBeUIsNkJBQWdCLENBQUMsSUFBSSxFQUM5QyxxQkFBdUMsNkJBQWdCLENBQUMsS0FBSztJQUU3RCxNQUFNLFVBQVUsR0FBRyxNQUFNLCtCQUFpQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQy9HLE1BQU0sS0FBSyxHQUF5QztRQUNsRCxJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO0tBQzNCLENBQUM7SUFDRixPQUFPO1FBQ0wsSUFBSSxFQUFFLDJCQUEyQixDQUFDLE9BQU8sQ0FBQztRQUMxQyxFQUFFLEVBQUUsMkJBQTJCLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsK0JBQStCLENBQ25ELGtCQUF5RCxFQUN6RCxVQUF1QixFQUN2QixjQUFnQyw2QkFBZ0IsQ0FBQyxLQUFLO0lBRXRELE1BQU0sUUFBUSxHQUFHLE1BQU0sK0JBQWlCLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwRyxPQUFPO1FBQ0wsSUFBSSxFQUFFLFdBQVc7UUFDakIsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQztLQUNsQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBSZWRQYWxsYXNNUFNDb21tcywgUmVkUGFsbGFzTVBTVHlwZXMgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQge1xuICBSZWRwYWxsYXNNUEN2MlJlcmFuZFNoYXJlUm91bmQxSW5wdXQsXG4gIFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDFPdXRwdXQsXG4gIFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDJJbnB1dCxcbiAgUmVkcGFsbGFzTVBDdjJSZXJhbmRTaGFyZVJvdW5kMk91dHB1dCxcbiAgUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMUlucHV0LFxuICBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQySW5wdXQsXG4gIFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gIFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDNJbnB1dCxcbiAgUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kM091dHB1dCxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBTaWduYXR1cmVTaGFyZVJlY29yZCwgU2lnbmF0dXJlU2hhcmVUeXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdHNzL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBNUEN2MlBhcnRpZXNFbnVtIH0gZnJvbSAnLi4vLi4vdXRpbHMvdHNzL2VjZHNhL3R5cGVzTVBDdjInO1xuXG50eXBlIFNpZ25lclBhcnR5SWQgPSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgfCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUDtcblxuZnVuY3Rpb24gcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0pOiBTaWduYXR1cmVTaGFyZVR5cGUge1xuICBzd2l0Y2ggKHBhcnR5SWQpIHtcbiAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uVVNFUjpcbiAgICAgIHJldHVybiBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUjtcbiAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQOlxuICAgICAgcmV0dXJuIFNpZ25hdHVyZVNoYXJlVHlwZS5CQUNLVVA7XG4gICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPOlxuICAgICAgcmV0dXJuIFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTztcbiAgfVxufVxuXG4vKipcbiAqIFJlZFBhbGxhcyBNUFMgRFNHIGFuZCByZXJhbmQgc2lnbmF0dXJlLXNoYXJlIGhlbHBlcnMuXG4gKlxuICogQ29uc3VtZWQgYnkgdGhlIGN1c3RvZGlhbC9jb2xkIChTTUMvT1ZDKSBzaWduaW5nIGZsb3c6IE9WQyBidWlsZHMgaXRzIHJlcmFuZCBhbmQgRFNHXG4gKiBzaGFyZXMgd2l0aCB0aGVzZSBhbmQgc3VibWl0cyB0aGVtIHZpYSB0aGUgL3NpZ24gdHhSZXF1ZXN0IHJvdXRlIChzZWVcbiAqIGBzZW5kU2lnbmF0dXJlU2hhcmVWMmAsIGJvZHkgdHlwZXMgYHJlZFBhbGxhc1JlcmFuZGAgLyBgcmVkUGFsbGFzTXBjVjJgKS4gTm8gY2FsbGVyXG4gKiBpbnNpZGUgdGhpcyBTREsgeWV0LiBNaXJyb3JzIGAuLi9lZGRzYS9lZGRzYU1QQ3YyLnRzYCAoc2FtZSByb3VuZCBzaGFwZSwgc2FtZVxuICogUEdQLXNpZ25lZC1tZXNzYWdlIGVudmVsb3BlKSwgYnV0IGtlcHQgYXMgYW4gaW5kZXBlbmRlbnQgY29weSAtIGJ1aWx0IG9uXG4gKiBgUmVkUGFsbGFzTVBTQ29tbXNgIC0gc28gUmVkUGFsbGFzIE1QUyBuZXZlciBkZXBlbmRzIG9uIHRoZSBFZERTQSBNUFMgbW9kdWxlLCBhbmRcbiAqIHZpY2UgdmVyc2EuXG4gKlxuICogU2luY2UgYEBiaXRnby93YXNtLW1wc2AgMS4xNy4wLCBrZXkgcmUtcmFuZG9taXphdGlvbiBpcyBhIHNlcGFyYXRlIDItcm91bmQgcmVyYW5kXG4gKiBwcm90b2NvbCB0aGF0IG11c3QgcnVuIGJlZm9yZSBldmVyeSBSZWRQYWxsYXMgRFNHLCBiZXR3ZWVuIHRoZSBzYW1lIDIgcGFydGllcyB0aGF0XG4gKiB3aWxsIHRoZW4gc2lnbjogYGdldFJlcmFuZFNoYXJlUm91bmRPbmUvVHdvYCBidWlsZCB0aG9zZSBzaGFyZSByZWNvcmRzIGFuZFxuICogYHZlcmlmeVBlZXJSZXJhbmRNZXNzYWdlUm91bmRPbmUvVHdvYCB1bndyYXAgdGhlIHBlZXIncyByZXJhbmQgbWVzc2FnZXMgKHNlZVxuICogYFJlZFBhbGxhc1JlcmFuZGAgaW4gYEBiaXRnby1iZXRhL3Nkay1saWItbXBjYCkuIFRoZSByZXJhbmQgcmVzdWx0IGV4cG9zZXNcbiAqIGB7a2V5U2hhcmUsIHBrLCBhbHBoYX1gOyBgcGtgIGlzIHRoZSBgcmtgIHRoZSBEU0cgc2lnbmF0dXJlIHZlcmlmaWVzIHVuZGVyLCBhbmQgdGhlXG4gKiBEU0cga2V5c2hhcmUgaXMgdGhlIHJlcmFuZG9taXplZCBga2V5U2hhcmVgIC0gbmV2ZXIgdGhlIGJhcmUgREtHIGtleXNoYXJlLlxuICovXG5cbi8qKlxuICogQnVpbGRzIHRoZSByb3VuZC0xIHNpZ25hdHVyZSBzaGFyZSByZWNvcmQuXG4gKlxuICogUEdQLXNpZ25zIHRoZSBXQVNNIHJvdW5kLTAgYnJvYWRjYXN0IG1lc3NhZ2Ugd2l0aCB0aGUgc2lnbmVyJ3MgZXBoZW1lcmFsIGtleSBhbmRcbiAqIHdyYXBzIGl0IGludG8gYSBTaWduYXR1cmVTaGFyZVJlY29yZCByZWFkeSBmb3IgYHNlbmRTaWduYXR1cmVTaGFyZVYyYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUoXG4gIHVzZXJNc2cxOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlLFxuICB1c2VyR3BnUHJpdktleTogb3BlbnBncC5Qcml2YXRlS2V5LFxuICBwYXJ0eUlkOiBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGNvbnN0IHNpZ25lZE1zZzEgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMS5wYXlsb2FkKSwgdXNlckdwZ1ByaXZLZXkpO1xuICBjb25zdCBzaGFyZTogUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMUlucHV0ID0ge1xuICAgIHR5cGU6ICdyb3VuZDFJbnB1dCcsXG4gICAgZGF0YTogeyBtc2cxOiBzaWduZWRNc2cxIH0sXG4gIH07XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQpLFxuICAgIHRvOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUob3RoZXJTaWduZXJQYXJ0eUlkKSxcbiAgICBzaGFyZTogSlNPTi5zdHJpbmdpZnkoc2hhcmUpLFxuICB9O1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBwZWVyJ3Mgcm91bmQtMSBQR1Agc2lnbmF0dXJlIGFuZCByZXR1cm5zIHRoZSByYXcgZGVzZXJpYWxpemVkXG4gKiBtZXNzYWdlIHJlYWR5IGZvciBgUmVkUGFsbGFzRFNHLmhhbmRsZUluY29taW5nTWVzc2FnZXNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZE9uZShcbiAgcGFyc2VkUm91bmQxT3V0cHV0OiBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICBwZWVyR3BnS2V5OiBvcGVucGdwLktleSxcbiAgcGVlclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFJlZFBhbGxhc01QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2U+IHtcbiAgY29uc3QgcmF3Qnl0ZXMgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBhcnNlZFJvdW5kMU91dHB1dC5kYXRhLm1zZzEsIHBlZXJHcGdLZXkpO1xuICByZXR1cm4ge1xuICAgIGZyb206IHBlZXJQYXJ0eUlkLFxuICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJhd0J5dGVzKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHJvdW5kLTIgc2lnbmF0dXJlIHNoYXJlIHJlY29yZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28oXG4gIHVzZXJNc2cyOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlLFxuICB1c2VyR3BnUHJpdktleTogb3BlbnBncC5Qcml2YXRlS2V5LFxuICBwYXJ0eUlkOiBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGNvbnN0IHNpZ25lZE1zZzIgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMi5wYXlsb2FkKSwgdXNlckdwZ1ByaXZLZXkpO1xuICBjb25zdCBzaGFyZTogUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMklucHV0ID0ge1xuICAgIHR5cGU6ICdyb3VuZDJJbnB1dCcsXG4gICAgZGF0YTogeyBtc2cyOiBzaWduZWRNc2cyIH0sXG4gIH07XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQpLFxuICAgIHRvOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUob3RoZXJTaWduZXJQYXJ0eUlkKSxcbiAgICBzaGFyZTogSlNPTi5zdHJpbmdpZnkoc2hhcmUpLFxuICB9O1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBwZWVyJ3Mgcm91bmQtMiBQR1Agc2lnbmF0dXJlIGFuZCByZXR1cm5zIHRoZSByYXcgZGVzZXJpYWxpemVkXG4gKiBtZXNzYWdlIHJlYWR5IGZvciBgUmVkUGFsbGFzRFNHLmhhbmRsZUluY29taW5nTWVzc2FnZXNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byhcbiAgcGFyc2VkUm91bmQyT3V0cHV0OiBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxuICBwZWVyR3BnS2V5OiBvcGVucGdwLktleSxcbiAgcGVlclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFJlZFBhbGxhc01QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2U+IHtcbiAgY29uc3QgcmF3Qnl0ZXMgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBhcnNlZFJvdW5kMk91dHB1dC5kYXRhLm1zZzIsIHBlZXJHcGdLZXkpO1xuICByZXR1cm4ge1xuICAgIGZyb206IHBlZXJQYXJ0eUlkLFxuICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJhd0J5dGVzKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGUgcGVlcidzIHJvdW5kLTMgUEdQIHNpZ25hdHVyZSBhbmQgcmV0dXJucyB0aGUgcmF3IGRlc2VyaWFsaXplZFxuICogbWVzc2FnZSByZWFkeSBmb3IgYFJlZFBhbGxhc0RTRy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBlZXJNZXNzYWdlUm91bmRUaHJlZShcbiAgcGFyc2VkUm91bmQzT3V0cHV0OiBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQzT3V0cHV0LFxuICBwZWVyR3BnS2V5OiBvcGVucGdwLktleSxcbiAgcGVlclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFJlZFBhbGxhc01QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2U+IHtcbiAgY29uc3QgcmF3Qnl0ZXMgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHBhcnNlZFJvdW5kM091dHB1dC5kYXRhLm1zZzMsIHBlZXJHcGdLZXkpO1xuICByZXR1cm4geyBmcm9tOiBwZWVyUGFydHlJZCwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmF3Qnl0ZXMpIH07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSByb3VuZC0zIHNpZ25hdHVyZSBzaGFyZSByZWNvcmQgKGZpbmFsIHNpZ25lciBtZXNzYWdlKS5cbiAqXG4gKiBUaGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGB2ZXJpZnlCaXRHb01lc3NhZ2VSb3VuZFRocmVlYCBiZWNhdXNlIFdhbGxldCBQbGF0Zm9ybVxuICogZmluYWxpc2VzIHRoZSBzaWduaW5nIHNlcnZlci1zaWRlIGFmdGVyIHJlY2VpdmluZyByb3VuZCAzOyB0aGUgY2xpZW50IG9idGFpbnMgdGhlXG4gKiBzaWduZWQgdHJhbnNhY3Rpb24gdmlhIGBzZW5kVHhSZXF1ZXN0YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZShcbiAgdXNlck1zZzM6IFJlZFBhbGxhc01QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UsXG4gIHVzZXJHcGdQcml2S2V5OiBvcGVucGdwLlByaXZhdGVLZXksXG4gIHBhcnR5SWQ6IFNpZ25lclBhcnR5SWQgPSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gIG90aGVyU2lnbmVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8U2lnbmF0dXJlU2hhcmVSZWNvcmQ+IHtcbiAgY29uc3Qgc2lnbmVkTXNnMyA9IGF3YWl0IFJlZFBhbGxhc01QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKHVzZXJNc2czLnBheWxvYWQpLCB1c2VyR3BnUHJpdktleSk7XG4gIGNvbnN0IHNoYXJlOiBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQzSW5wdXQgPSB7XG4gICAgdHlwZTogJ3JvdW5kM0lucHV0JyxcbiAgICBkYXRhOiB7IG1zZzM6IHNpZ25lZE1zZzMgfSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUocGFydHlJZCksXG4gICAgdG86IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShvdGhlclNpZ25lclBhcnR5SWQpLFxuICAgIHNoYXJlOiBKU09OLnN0cmluZ2lmeShzaGFyZSksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSByZXJhbmQgcm91bmQtMSBzaWduYXR1cmUgc2hhcmUgcmVjb3JkLlxuICpcbiAqIFJlcmFuZCBtdXN0IHJ1biBiZWZvcmUgZXZlcnkgUmVkUGFsbGFzIERTRywgd2l0aCB0aGUgc2FtZSBjb3VudGVycGFydC4gUm91bmQgMVxuICogY2FycmllcyB0aGUgUEdQLXNpZ25lZCBXQVNNIGNvbW1pdG1lbnQgYnJvYWRjYXN0IChgUmVkUGFsbGFzUmVyYW5kLmdldEZpcnN0TWVzc2FnZSgpYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZXJhbmRTaGFyZVJvdW5kT25lKFxuICB1c2VyTXNnMTogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSxcbiAgdXNlckdwZ1ByaXZLZXk6IG9wZW5wZ3AuUHJpdmF0ZUtleSxcbiAgcGFydHlJZDogU2lnbmVyUGFydHlJZCA9IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgb3RoZXJTaWduZXJQYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtID0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuKTogUHJvbWlzZTxTaWduYXR1cmVTaGFyZVJlY29yZD4ge1xuICBjb25zdCBzaWduZWRNc2cxID0gYXdhaXQgUmVkUGFsbGFzTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzEucGF5bG9hZCksIHVzZXJHcGdQcml2S2V5KTtcbiAgY29uc3Qgc2hhcmU6IFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDFJbnB1dCA9IHtcbiAgICB0eXBlOiAncm91bmQxSW5wdXQnLFxuICAgIGRhdGE6IHsgbXNnMTogc2lnbmVkTXNnMSB9LFxuICB9O1xuICByZXR1cm4ge1xuICAgIGZyb206IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShwYXJ0eUlkKSxcbiAgICB0bzogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKG90aGVyU2lnbmVyUGFydHlJZCksXG4gICAgc2hhcmU6IEpTT04uc3RyaW5naWZ5KHNoYXJlKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGUgcGVlcidzIHJlcmFuZCByb3VuZC0xIFBHUCBzaWduYXR1cmUgYW5kIHJldHVybnMgdGhlIHJhdyBkZXNlcmlhbGl6ZWRcbiAqIG1lc3NhZ2UgcmVhZHkgZm9yIGBSZWRQYWxsYXNSZXJhbmQuaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlQZWVyUmVyYW5kTWVzc2FnZVJvdW5kT25lKFxuICBwYXJzZWRSb3VuZDFPdXRwdXQ6IFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDFPdXRwdXQsXG4gIHBlZXJHcGdLZXk6IG9wZW5wZ3AuS2V5LFxuICBwZWVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8UmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZT4ge1xuICBjb25zdCByYXdCeXRlcyA9IGF3YWl0IFJlZFBhbGxhc01QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UocGFyc2VkUm91bmQxT3V0cHV0LmRhdGEubXNnMSwgcGVlckdwZ0tleSk7XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGVlclBhcnR5SWQsXG4gICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmF3Qnl0ZXMpLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcmVyYW5kIHJvdW5kLTIgc2lnbmF0dXJlIHNoYXJlIHJlY29yZCAob3BlbmluZyBtZXNzYWdlKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlcmFuZFNoYXJlUm91bmRUd28oXG4gIHVzZXJNc2cyOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlLFxuICB1c2VyR3BnUHJpdktleTogb3BlbnBncC5Qcml2YXRlS2V5LFxuICBwYXJ0eUlkOiBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGNvbnN0IHNpZ25lZE1zZzIgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMi5wYXlsb2FkKSwgdXNlckdwZ1ByaXZLZXkpO1xuICBjb25zdCBzaGFyZTogUmVkcGFsbGFzTVBDdjJSZXJhbmRTaGFyZVJvdW5kMklucHV0ID0ge1xuICAgIHR5cGU6ICdyb3VuZDJJbnB1dCcsXG4gICAgZGF0YTogeyBtc2cyOiBzaWduZWRNc2cyIH0sXG4gIH07XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQpLFxuICAgIHRvOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUob3RoZXJTaWduZXJQYXJ0eUlkKSxcbiAgICBzaGFyZTogSlNPTi5zdHJpbmdpZnkoc2hhcmUpLFxuICB9O1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBwZWVyJ3MgcmVyYW5kIHJvdW5kLTIgUEdQIHNpZ25hdHVyZSBhbmQgcmV0dXJucyB0aGUgcmF3IGRlc2VyaWFsaXplZFxuICogbWVzc2FnZSByZWFkeSBmb3IgYFJlZFBhbGxhc1JlcmFuZC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzYC4gQWZ0ZXIgdGhpcyBleGNoYW5nZVxuICogYm90aCBwYXJ0aWVzIHJlYWQgdGhlIHJlcmFuZG9taXplZCBrZXlzaGFyZSB2aWEgYGdldFJlcmFuZG9taXplZEtleVNoYXJlKClgIGFuZFxuICogZmVlZCBpdCBpbnRvIGBSZWRQYWxsYXNEU0cuaW5pdERzZ2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlQZWVyUmVyYW5kTWVzc2FnZVJvdW5kVHdvKFxuICBwYXJzZWRSb3VuZDJPdXRwdXQ6IFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDJPdXRwdXQsXG4gIHBlZXJHcGdLZXk6IG9wZW5wZ3AuS2V5LFxuICBwZWVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8UmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZT4ge1xuICBjb25zdCByYXdCeXRlcyA9IGF3YWl0IFJlZFBhbGxhc01QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UocGFyc2VkUm91bmQyT3V0cHV0LmRhdGEubXNnMiwgcGVlckdwZ0tleSk7XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGVlclBhcnR5SWQsXG4gICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmF3Qnl0ZXMpLFxuICB9O1xufVxuIl19
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkcGFsbGFzTVBDdjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHNzL3JlZHBhbGxhcy9yZWRwYWxsYXNNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVGQSw4REFtQkM7QUFRRCw4REFXQztBQVFELDhEQW1CQztBQVFELDhEQVdDO0FBUUQsa0VBV0M7QUFZRCxrRUFtQkM7QUFXRCx3REFtQkM7QUFTRCwwRUFXQztBQVFELHdEQW1CQztBQVdELDBFQVdDO0FBaFVELG9EQUE0QjtBQUU1Qix5REFBK0U7QUFhL0UseURBQXFGO0FBQ3JGLGlFQUFvRTtBQUlwRSxTQUFTLDJCQUEyQixDQUFDLE9BQXlCO0lBQzVELFFBQVEsT0FBTyxFQUFFLENBQUM7UUFDaEIsS0FBSyw2QkFBZ0IsQ0FBQyxJQUFJO1lBQ3hCLE9BQU8sOEJBQWtCLENBQUMsSUFBSSxDQUFDO1FBQ2pDLEtBQUssNkJBQWdCLENBQUMsTUFBTTtZQUMxQixPQUFPLDhCQUFrQixDQUFDLE1BQU0sQ0FBQztRQUNuQyxLQUFLLDZCQUFnQixDQUFDLEtBQUs7WUFDekIsT0FBTyw4QkFBa0IsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQ0c7QUFFSDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUseUJBQXlCLENBQzdDLFNBQWtELEVBQ2xELGNBQWtDLEVBQ2xDLFVBQXlCLDZCQUFnQixDQUFDLElBQUksRUFDOUMscUJBQXVDLDZCQUFnQixDQUFDLEtBQUs7SUFFN0QsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLDhEQUE4RCxDQUFDLENBQUM7SUFDOUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNuQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMs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SyxVQUFVLCtCQUErQixDQUNuRCxrQkFBeUQsRUFDekQsVUFBdUIsRUFDdkIsY0FBZ0MsNkJBQWdCLENBQUMsS0FBSztJQUV0RCxNQUFNLFlBQVksR0FBNEMsRUFBRSxDQUFDO0lBQ2pFLEtBQUssTUFBTSxVQUFVLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLE1BQU0sK0JBQWlCLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBvcGVucGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgUmVkUGFsbGFzTVBTQ29tbXMsIFJlZFBhbGxhc01QU1R5cGVzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHtcbiAgUmVkcGFsbGFzTVBDdjJSZXJhbmRTaGFyZVJvdW5kMUlucHV0LFxuICBSZWRwYWxsYXNNUEN2MlJlcmFuZFNoYXJlUm91bmQxT3V0cHV0LFxuICBSZWRwYWxsYXNNUEN2MlJlcmFuZFNoYXJlUm91bmQySW5wdXQsXG4gIFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDJPdXRwdXQsXG4gIFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFJbnB1dCxcbiAgUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMklucHV0LFxuICBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxuICBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQzSW5wdXQsXG4gIFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDNPdXRwdXQsXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgU2lnbmF0dXJlU2hhcmVSZWNvcmQsIFNpZ25hdHVyZVNoYXJlVHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL3Rzcy9iYXNlVHlwZXMnO1xuaW1wb3J0IHsgTVBDdjJQYXJ0aWVzRW51bSB9IGZyb20gJy4uLy4uL3V0aWxzL3Rzcy9lY2RzYS90eXBlc01QQ3YyJztcblxudHlwZSBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSIHwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA7XG5cbmZ1bmN0aW9uIHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtKTogU2lnbmF0dXJlU2hhcmVUeXBlIHtcbiAgc3dpdGNoIChwYXJ0eUlkKSB7XG4gICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLlVTRVI6XG4gICAgICByZXR1cm4gU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVI7XG4gICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUDpcbiAgICAgIHJldHVybiBTaWduYXR1cmVTaGFyZVR5cGUuQkFDS1VQO1xuICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTzpcbiAgICAgIHJldHVybiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR087XG4gIH1cbn1cblxuLyoqXG4gKiBSZWRQYWxsYXMgTVBTIERTRyBhbmQgcmVyYW5kIHNpZ25hdHVyZS1zaGFyZSBoZWxwZXJzIChtdWx0aS1zcGVuZCwgV0NJLTE5NDkpLlxuICpcbiAqIEEgc2hpZWxkZWQgWkVDIHRyYW5zYWN0aW9uIGNhbiBzcGVuZCBzZXZlcmFsIE9yY2hhcmQgbm90ZXM7IGV2ZXJ5IHBlci1zcGVuZFxuICogdmFsdWUgb24gdGhlIC9zaWduIHdpcmUgaXMgYW4gQVJSQVkgb2YgbGVuZ3RoIE4gb3JkZXJlZCBieSBzcGVuZCBpbmRleCwgd2hlcmVcbiAqIE4gaXMgdGhlIG51bWJlciBvZiBPcmNoYXJkIHNwZW5kc1xuICogKGB0eFJlcXVlc3QudHJhbnNhY3Rpb25zW2ldLnVuc2lnbmVkVHgucGFyc2VkVHguaW5wdXRzLmxlbmd0aGApLCBkZXJpdmVkIG9uXG4gKiB0aGUgY2xpZW50IGFuZCBuZXZlciBhIHdpcmUgZmllbGQuIEVhY2ggc3BlbmQgcnVucyBpdHMgb3duIHJlcmFuZCBzZXNzaW9uIGFuZFxuICogaXRzIG93biBEU0cgc2Vzc2lvbiAoTiBpbnN0YW5jZXMgb2YgYFJlZFBhbGxhc1JlcmFuZGAgLyBgUmVkUGFsbGFzRFNHYCDigJQgdGhleVxuICogYXJlIHNpbmdsZS1zZXNzaW9uIGJ5IGRlc2lnbjsgdGhlIHBlci1zcGVuZCBmYW4tb3V0IGxpdmVzIGluIHRoZSBjYWxsZXIsIHNlZVxuICogT1ZDJ3MgYE1wY1NpZ25lclJlZFBhbGxhc2ApLCBidXQgZWFjaCByb3VuZCBzdGlsbCBwcm9kdWNlcyBleGFjdGx5IE9ORVxuICogYFNpZ25hdHVyZVNoYXJlUmVjb3JkYCBwZXIgdHJhbnNhY3Rpb246IHRoZSBidWlsZGVycyBiZWxvdyB0YWtlIE5cbiAqIFBHUC1zaWduZWQgbWVzc2FnZXMgaW4gYW5kIGVtaXQgb25lIHJlY29yZCB3aG9zZSBgbXNnTmAgaXMgdGhlIHNwZW5kLW9yZGVyZWRcbiAqIGFycmF5OyB0aGUgdmVyaWZpZXJzIHRha2UgYSBwYXJzZWQgcGVlciBgcm91bmROT3V0cHV0YCAobXNnTiBhcnJheSkgYW5kXG4gKiByZXR1cm4gTiB2ZXJpZmllZCBtZXNzYWdlcyBvdXQsIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIEJ1aWxkZXJzOlxuICogLSBhc3NlcnQgYSBub24tZW1wdHkgaW5wdXQgYXJyYXkgKE4gPj0gMTsgYW4gT3JjaGFyZCBzcGVuZCB0cmFuc2FjdGlvbiBoYXMgYXRcbiAqICAgbGVhc3Qgb25lIGlucHV0KSBhbmQgcHJlc2VydmUgc3BlbmQgb3JkZXIg4oCUIFdhbGxldCBQbGF0Zm9ybSBpbmRleC1wYWlyc1xuICogICBgbXNnTltpXWAgd2l0aCBzcGVuZCBpJ3MgSFNNIHN0YXRlLCBzbyBhIG1pc29yZGVyZWQgYXJyYXkgc2lsZW50bHkgbWlzcGFpcnNcbiAqICAgc3BlbmRzLlxuICogLSBlbWl0IGV4YWN0bHkgT05FIHNoYXJlIHJlY29yZCBwZXIgcm91bmQg4oCUIFdQIHJlYWRzIG9ubHkgdGhlIExBU1Qgc2hhcmUgaW5cbiAqICAgYHNpZ25hdHVyZVNoYXJlc2A7IG11bHRpcGxlIHBhcnRpYWwgcmVjb3JkcyB3b3VsZCBiZSBzaWxlbnRseSBkcm9wcGVkLlxuICpcbiAqIFZlcmlmaWVyczpcbiAqIC0gcmV0dXJuIG9uZSB2ZXJpZmllZCBtZXNzYWdlIHBlciBhcnJheSBlbnRyeSwgc2FtZSBvcmRlciwgYWxsIHNpZ25lZCBieSB0aGVcbiAqICAgQml0R28gUmVkUGFsbGFzIEdQRyBrZXk7IGEgc2luZ2xlIGZhaWxlZCB2ZXJpZmljYXRpb24gZmFpbHMgdGhlIHdob2xlIHJvdW5kXG4gKiAgIChhbGwtb3Itbm90aGluZywgbWlycm9yaW5nIFdQJ3MgcGVyLXJvdW5kIHNoYXJlIGhhbmRsaW5nKS5cbiAqXG4gKiBDb25zdW1lZCBieSB0aGUgY3VzdG9kaWFsL2NvbGQgKFNNQy9PVkMpIHNpZ25pbmcgZmxvdzogT1ZDIGJ1aWxkcyBpdHMgcmVyYW5kXG4gKiBhbmQgRFNHIHNoYXJlcyB3aXRoIHRoZXNlIGFuZCBzdWJtaXRzIHRoZW0gdmlhIHRoZSAvc2lnbiB0eFJlcXVlc3Qgcm91dGUgKHNlZVxuICogYHNlbmRTaWduYXR1cmVTaGFyZVYyYCwgYm9keSB0eXBlcyBgcmVkUGFsbGFzUmVyYW5kYCAvIGByZWRQYWxsYXNNcGNWMmApLiBOb1xuICogY2FsbGVyIGluc2lkZSB0aGlzIFNESyB5ZXQuIE1pcnJvcnMgYC4uL2VkZHNhL2VkZHNhTVBDdjIudHNgIChzYW1lIHJvdW5kXG4gKiBzaGFwZSwgc2FtZSBQR1Atc2lnbmVkLW1lc3NhZ2UgZW52ZWxvcGUpLCBidXQga2VwdCBhcyBhbiBpbmRlcGVuZGVudCBjb3B5IC1cbiAqIGJ1aWx0IG9uIGBSZWRQYWxsYXNNUFNDb21tc2AgLSBzbyBSZWRQYWxsYXMgTVBTIG5ldmVyIGRlcGVuZHMgb24gdGhlIEVkRFNBIE1QU1xuICogbW9kdWxlLCBhbmQgdmljZSB2ZXJzYS4gVGhlIEVkRFNBIGhlbHBlcnMgdGhlbXNlbHZlcyByZW1haW4gc2NhbGFyXG4gKiAoc2luZ2xlLXNpZ25hYmxlKTogRWREU0EgaXMgbm90IHBhcnQgb2YgdGhlIG11bHRpLXNwZW5kIGN1dG92ZXIuXG4gKlxuICogU2luY2UgYEBiaXRnby93YXNtLW1wc2AgMS4xNy4wLCBrZXkgcmUtcmFuZG9taXphdGlvbiBpcyBhIHNlcGFyYXRlIDItcm91bmRcbiAqIHJlcmFuZCBwcm90b2NvbCB0aGF0IG11c3QgcnVuIGJlZm9yZSBldmVyeSBSZWRQYWxsYXMgRFNHLCBiZXR3ZWVuIHRoZSBzYW1lIDJcbiAqIHBhcnRpZXMgdGhhdCB3aWxsIHRoZW4gc2lnbjogYGdldFJlcmFuZFNoYXJlUm91bmRPbmUvVHdvYCBidWlsZCB0aG9zZSBzaGFyZVxuICogcmVjb3JkcyBhbmQgYHZlcmlmeVBlZXJSZXJhbmRNZXNzYWdlUm91bmRPbmUvVHdvYCB1bndyYXAgdGhlIHBlZXIncyByZXJhbmRcbiAqIG1lc3NhZ2VzIChzZWUgYFJlZFBhbGxhc1JlcmFuZGAgaW4gYEBiaXRnby1iZXRhL3Nkay1saWItbXBjYCkuIFJlcmFuZCBSMSBzZWVkc1xuICogZXZlcnkgc3BlbmQncyBzZXNzaW9uIGZyb20gdGhlIFNBTUUgREtHIGtleXNoYXJlOyBhZnRlciBSMiBlYWNoIHNwZW5kIGhhcyBpdHNcbiAqIG93biByZXJhbmQgcmVzdWx0IGB7a2V5U2hhcmUsIHBrLCBhbHBoYX1gLiBUaGUgcGVyLXNwZW5kIGBrZXlTaGFyZWAgLSBuZXZlclxuICogdGhlIGJhcmUgREtHIGtleXNoYXJlIC0gaW5pdGlhbGl6ZXMgdGhhdCBzcGVuZCdzIERTRyBzZXNzaW9uLCBhbmQgdGhlIERTR1xuICogc2lnbmF0dXJlIHZlcmlmaWVzIHVuZGVyIGByayA9PSBwa2Agb2YgdGhlIHNhbWUgc3BlbmQuXG4gKi9cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHJvdW5kLTEgc2lnbmF0dXJlIHNoYXJlIHJlY29yZC5cbiAqXG4gKiBQR1Atc2lnbnMgZWFjaCBzcGVuZCdzIFdBU00gcm91bmQtMCBicm9hZGNhc3QgbWVzc2FnZSB3aXRoIHRoZSBzaWduZXInc1xuICogZXBoZW1lcmFsIGtleSBhbmQgd3JhcHMgYWxsIE4gb2YgdGhlbSwgaW4gc3BlbmQgb3JkZXIsIGludG8gT05FXG4gKiBTaWduYXR1cmVTaGFyZVJlY29yZCAoYG1zZzFgIGFycmF5KSByZWFkeSBmb3IgYHNlbmRTaWduYXR1cmVTaGFyZVYyYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUoXG4gIHVzZXJNc2cxczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdLFxuICB1c2VyR3BnUHJpdktleTogb3BlbnBncC5Qcml2YXRlS2V5LFxuICBwYXJ0eUlkOiBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGFzc2VydCh1c2VyTXNnMXMubGVuZ3RoID49IDEsICdFeHBlY3RlZCBhdCBsZWFzdCAxIHJvdW5kLTEgbWVzc2FnZSAob25lIHBlciBzaGllbGRlZCBzcGVuZCknKTtcbiAgY29uc3Qgc2lnbmVkTXNnMXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB1c2VyTXNnMXMubWFwKCh1c2VyTXNnMSkgPT4gUmVkUGFsbGFzTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzEucGF5bG9hZCksIHVzZXJHcGdQcml2S2V5KSlcbiAgKTtcbiAgY29uc3Qgc2hhcmU6IFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFJbnB1dCA9IHtcbiAgICB0eXBlOiAncm91bmQxSW5wdXQnLFxuICAgIGRhdGE6IHsgbXNnMTogc2lnbmVkTXNnMXMgfSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUocGFydHlJZCksXG4gICAgdG86IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShvdGhlclNpZ25lclBhcnR5SWQpLFxuICAgIHNoYXJlOiBKU09OLnN0cmluZ2lmeShzaGFyZSksXG4gIH07XG59XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHBlZXIncyByb3VuZC0xIFBHUCBzaWduYXR1cmVzIGFuZCByZXR1cm5zIHRoZSByYXcgZGVzZXJpYWxpemVkXG4gKiBtZXNzYWdlcywgb25lIHBlciBzaGllbGRlZCBzcGVuZCBpbiB0aGUgcGVlcidzIGFycmF5IG9yZGVyLCByZWFkeSBmb3JcbiAqIGBSZWRQYWxsYXNEU0cuaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AgKGZlZWQgYG1zZzFbaV1gIGludG8gc3BlbmQgaSdzIHNlc3Npb24pLlxuICogQWxsLW9yLW5vdGhpbmc6IGEgc2luZ2xlIGZhaWxlZCB2ZXJpZmljYXRpb24gcmVqZWN0cyB0aGUgd2hvbGUgcm91bmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lKFxuICBwYXJzZWRSb3VuZDFPdXRwdXQ6IFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gIHBlZXJHcGdLZXk6IG9wZW5wZ3AuS2V5LFxuICBwZWVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8UmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdPiB7XG4gIGNvbnN0IHZlcmlmaWVkTXNnczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2lnbmVkTXNnMSBvZiBwYXJzZWRSb3VuZDFPdXRwdXQuZGF0YS5tc2cxKSB7XG4gICAgY29uc3QgcmF3Qnl0ZXMgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHNpZ25lZE1zZzEsIHBlZXJHcGdLZXkpO1xuICAgIHZlcmlmaWVkTXNncy5wdXNoKHsgZnJvbTogcGVlclBhcnR5SWQsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJhd0J5dGVzKSB9KTtcbiAgfVxuICByZXR1cm4gdmVyaWZpZWRNc2dzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcm91bmQtMiBzaWduYXR1cmUgc2hhcmUgcmVjb3JkLlxuICpcbiAqIFBHUC1zaWducyBlYWNoIHNwZW5kJ3Mgcm91bmQtMiBtZXNzYWdlIGFuZCB3cmFwcyBhbGwgTiBvZiB0aGVtLCBpbiBzcGVuZFxuICogb3JkZXIsIGludG8gT05FIFNpZ25hdHVyZVNoYXJlUmVjb3JkIChgbXNnMmAgYXJyYXkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byhcbiAgdXNlck1zZzJzOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10sXG4gIHVzZXJHcGdQcml2S2V5OiBvcGVucGdwLlByaXZhdGVLZXksXG4gIHBhcnR5SWQ6IFNpZ25lclBhcnR5SWQgPSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gIG90aGVyU2lnbmVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8U2lnbmF0dXJlU2hhcmVSZWNvcmQ+IHtcbiAgYXNzZXJ0KHVzZXJNc2cycy5sZW5ndGggPj0gMSwgJ0V4cGVjdGVkIGF0IGxlYXN0IDEgcm91bmQtMiBtZXNzYWdlIChvbmUgcGVyIHNoaWVsZGVkIHNwZW5kKScpO1xuICBjb25zdCBzaWduZWRNc2cycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHVzZXJNc2cycy5tYXAoKHVzZXJNc2cyKSA9PiBSZWRQYWxsYXNNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMi5wYXlsb2FkKSwgdXNlckdwZ1ByaXZLZXkpKVxuICApO1xuICBjb25zdCBzaGFyZTogUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMklucHV0ID0ge1xuICAgIHR5cGU6ICdyb3VuZDJJbnB1dCcsXG4gICAgZGF0YTogeyBtc2cyOiBzaWduZWRNc2cycyB9LFxuICB9O1xuICByZXR1cm4ge1xuICAgIGZyb206IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShwYXJ0eUlkKSxcbiAgICB0bzogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKG90aGVyU2lnbmVyUGFydHlJZCksXG4gICAgc2hhcmU6IEpTT04uc3RyaW5naWZ5KHNoYXJlKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGUgcGVlcidzIHJvdW5kLTIgUEdQIHNpZ25hdHVyZXMgYW5kIHJldHVybnMgdGhlIHJhdyBkZXNlcmlhbGl6ZWRcbiAqIG1lc3NhZ2VzLCBvbmUgcGVyIHNoaWVsZGVkIHNwZW5kIGluIHRoZSBwZWVyJ3MgYXJyYXkgb3JkZXIsIHJlYWR5IGZvclxuICogYFJlZFBhbGxhc0RTRy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzYCAoZmVlZCBgbXNnMltpXWAgaW50byBzcGVuZCBpJ3Mgc2Vzc2lvbikuXG4gKiBBbGwtb3Itbm90aGluZzogYSBzaW5nbGUgZmFpbGVkIHZlcmlmaWNhdGlvbiByZWplY3RzIHRoZSB3aG9sZSByb3VuZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBlZXJNZXNzYWdlUm91bmRUd28oXG4gIHBhcnNlZFJvdW5kMk91dHB1dDogUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbiAgcGVlckdwZ0tleTogb3BlbnBncC5LZXksXG4gIHBlZXJQYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtID0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuKTogUHJvbWlzZTxSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10+IHtcbiAgY29uc3QgdmVyaWZpZWRNc2dzOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzaWduZWRNc2cyIG9mIHBhcnNlZFJvdW5kMk91dHB1dC5kYXRhLm1zZzIpIHtcbiAgICBjb25zdCByYXdCeXRlcyA9IGF3YWl0IFJlZFBhbGxhc01QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2Uoc2lnbmVkTXNnMiwgcGVlckdwZ0tleSk7XG4gICAgdmVyaWZpZWRNc2dzLnB1c2goeyBmcm9tOiBwZWVyUGFydHlJZCwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmF3Qnl0ZXMpIH0pO1xuICB9XG4gIHJldHVybiB2ZXJpZmllZE1zZ3M7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHBlZXIncyByb3VuZC0zIFBHUCBzaWduYXR1cmVzIGFuZCByZXR1cm5zIHRoZSByYXcgZGVzZXJpYWxpemVkXG4gKiBtZXNzYWdlcywgb25lIHBlciBzaGllbGRlZCBzcGVuZCBpbiB0aGUgcGVlcidzIGFycmF5IG9yZGVyLCByZWFkeSBmb3JcbiAqIGBSZWRQYWxsYXNEU0cuaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AgKGZlZWQgYG1zZzNbaV1gIGludG8gc3BlbmQgaSdzIHNlc3Npb24pLlxuICogQWxsLW9yLW5vdGhpbmc6IGEgc2luZ2xlIGZhaWxlZCB2ZXJpZmljYXRpb24gcmVqZWN0cyB0aGUgd2hvbGUgcm91bmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kVGhyZWUoXG4gIHBhcnNlZFJvdW5kM091dHB1dDogUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kM091dHB1dCxcbiAgcGVlckdwZ0tleTogb3BlbnBncC5LZXksXG4gIHBlZXJQYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtID0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuKTogUHJvbWlzZTxSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10+IHtcbiAgY29uc3QgdmVyaWZpZWRNc2dzOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzaWduZWRNc2czIG9mIHBhcnNlZFJvdW5kM091dHB1dC5kYXRhLm1zZzMpIHtcbiAgICBjb25zdCByYXdCeXRlcyA9IGF3YWl0IFJlZFBhbGxhc01QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2Uoc2lnbmVkTXNnMywgcGVlckdwZ0tleSk7XG4gICAgdmVyaWZpZWRNc2dzLnB1c2goeyBmcm9tOiBwZWVyUGFydHlJZCwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmF3Qnl0ZXMpIH0pO1xuICB9XG4gIHJldHVybiB2ZXJpZmllZE1zZ3M7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSByb3VuZC0zIHNpZ25hdHVyZSBzaGFyZSByZWNvcmQgKGZpbmFsIHNpZ25lciBtZXNzYWdlcykuXG4gKlxuICogUEdQLXNpZ25zIGVhY2ggc3BlbmQncyByb3VuZC0zIG1lc3NhZ2UgYW5kIHdyYXBzIGFsbCBOIG9mIHRoZW0sIGluIHNwZW5kXG4gKiBvcmRlciwgaW50byBPTkUgU2lnbmF0dXJlU2hhcmVSZWNvcmQgKGBtc2czYCBhcnJheSkuXG4gKlxuICogVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBgdmVyaWZ5Qml0R29NZXNzYWdlUm91bmRUaHJlZWAgYmVjYXVzZSBXYWxsZXQgUGxhdGZvcm1cbiAqIGZpbmFsaXNlcyB0aGUgc2lnbmluZyBzZXJ2ZXItc2lkZSBhZnRlciByZWNlaXZpbmcgcm91bmQgMzsgdGhlIGNsaWVudCBvYnRhaW5zXG4gKiB0aGUgc2lnbmVkIHRyYW5zYWN0aW9uIHZpYSBgc2VuZFR4UmVxdWVzdGAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUoXG4gIHVzZXJNc2czczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdLFxuICB1c2VyR3BnUHJpdktleTogb3BlbnBncC5Qcml2YXRlS2V5LFxuICBwYXJ0eUlkOiBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGFzc2VydCh1c2VyTXNnM3MubGVuZ3RoID49IDEsICdFeHBlY3RlZCBhdCBsZWFzdCAxIHJvdW5kLTMgbWVzc2FnZSAob25lIHBlciBzaGllbGRlZCBzcGVuZCknKTtcbiAgY29uc3Qgc2lnbmVkTXNnM3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB1c2VyTXNnM3MubWFwKCh1c2VyTXNnMykgPT4gUmVkUGFsbGFzTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzMucGF5bG9hZCksIHVzZXJHcGdQcml2S2V5KSlcbiAgKTtcbiAgY29uc3Qgc2hhcmU6IFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDNJbnB1dCA9IHtcbiAgICB0eXBlOiAncm91bmQzSW5wdXQnLFxuICAgIGRhdGE6IHsgbXNnMzogc2lnbmVkTXNnM3MgfSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUocGFydHlJZCksXG4gICAgdG86IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShvdGhlclNpZ25lclBhcnR5SWQpLFxuICAgIHNoYXJlOiBKU09OLnN0cmluZ2lmeShzaGFyZSksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSByZXJhbmQgcm91bmQtMSBzaWduYXR1cmUgc2hhcmUgcmVjb3JkLlxuICpcbiAqIFJlcmFuZCBtdXN0IHJ1biBiZWZvcmUgZXZlcnkgUmVkUGFsbGFzIERTRywgd2l0aCB0aGUgc2FtZSBjb3VudGVycGFydCwgb25jZVxuICogcGVyIHNoaWVsZGVkIHNwZW5kOiB0aGUgY2FsbGVyIGluaXRpYWxpemVzIE4gYFJlZFBhbGxhc1JlcmFuZGAgc2Vzc2lvbnMgb24gdGhlXG4gKiBTQU1FIERLRyBrZXlzaGFyZSBhbmQgcGFzc2VzIGVhY2ggc2Vzc2lvbidzIGBnZXRGaXJzdE1lc3NhZ2UoKWAsIGluIHNwZW5kXG4gKiBvcmRlci4gUm91bmQgMSBjYXJyaWVzIHRoZSBQR1Atc2lnbmVkIFdBU00gY29tbWl0bWVudHM7IGFsbCBOIGFyZSB3cmFwcGVkXG4gKiBpbnRvIE9ORSBTaWduYXR1cmVTaGFyZVJlY29yZCAoYG1zZzFgIGFycmF5KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlcmFuZFNoYXJlUm91bmRPbmUoXG4gIHVzZXJNc2cxczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdLFxuICB1c2VyR3BnUHJpdktleTogb3BlbnBncC5Qcml2YXRlS2V5LFxuICBwYXJ0eUlkOiBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGFzc2VydCh1c2VyTXNnMXMubGVuZ3RoID49IDEsICdFeHBlY3RlZCBhdCBsZWFzdCAxIHJlcmFuZCByb3VuZC0xIG1lc3NhZ2UgKG9uZSBwZXIgc2hpZWxkZWQgc3BlbmQpJyk7XG4gIGNvbnN0IHNpZ25lZE1zZzFzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgdXNlck1zZzFzLm1hcCgodXNlck1zZzEpID0+IFJlZFBhbGxhc01QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKHVzZXJNc2cxLnBheWxvYWQpLCB1c2VyR3BnUHJpdktleSkpXG4gICk7XG4gIGNvbnN0IHNoYXJlOiBSZWRwYWxsYXNNUEN2MlJlcmFuZFNoYXJlUm91bmQxSW5wdXQgPSB7XG4gICAgdHlwZTogJ3JvdW5kMUlucHV0JyxcbiAgICBkYXRhOiB7IG1zZzE6IHNpZ25lZE1zZzFzIH0sXG4gIH07XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQpLFxuICAgIHRvOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUob3RoZXJTaWduZXJQYXJ0eUlkKSxcbiAgICBzaGFyZTogSlNPTi5zdHJpbmdpZnkoc2hhcmUpLFxuICB9O1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBwZWVyJ3MgcmVyYW5kIHJvdW5kLTEgUEdQIHNpZ25hdHVyZXMgYW5kIHJldHVybnMgdGhlIHJhd1xuICogZGVzZXJpYWxpemVkIG1lc3NhZ2VzLCBvbmUgcGVyIHNoaWVsZGVkIHNwZW5kIGluIHRoZSBwZWVyJ3MgYXJyYXkgb3JkZXIsXG4gKiByZWFkeSBmb3IgYFJlZFBhbGxhc1JlcmFuZC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzYCAoZmVlZCBgbXNnMVtpXWAgaW50b1xuICogc3BlbmQgaSdzIHNlc3Npb24pLiBBbGwtb3Itbm90aGluZzogYSBzaW5nbGUgZmFpbGVkIHZlcmlmaWNhdGlvbiByZWplY3RzIHRoZVxuICogd2hvbGUgcm91bmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlQZWVyUmVyYW5kTWVzc2FnZVJvdW5kT25lKFxuICBwYXJzZWRSb3VuZDFPdXRwdXQ6IFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDFPdXRwdXQsXG4gIHBlZXJHcGdLZXk6IG9wZW5wZ3AuS2V5LFxuICBwZWVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8UmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdPiB7XG4gIGNvbnN0IHZlcmlmaWVkTXNnczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2lnbmVkTXNnMSBvZiBwYXJzZWRSb3VuZDFPdXRwdXQuZGF0YS5tc2cxKSB7XG4gICAgY29uc3QgcmF3Qnl0ZXMgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHNpZ25lZE1zZzEsIHBlZXJHcGdLZXkpO1xuICAgIHZlcmlmaWVkTXNncy5wdXNoKHsgZnJvbTogcGVlclBhcnR5SWQsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJhd0J5dGVzKSB9KTtcbiAgfVxuICByZXR1cm4gdmVyaWZpZWRNc2dzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcmVyYW5kIHJvdW5kLTIgc2lnbmF0dXJlIHNoYXJlIHJlY29yZCAob3BlbmluZyBtZXNzYWdlcykuXG4gKlxuICogUEdQLXNpZ25zIGVhY2ggc3BlbmQncyByZXJhbmQgcm91bmQtMiBtZXNzYWdlIGFuZCB3cmFwcyBhbGwgTiBvZiB0aGVtLCBpblxuICogc3BlbmQgb3JkZXIsIGludG8gT05FIFNpZ25hdHVyZVNoYXJlUmVjb3JkIChgbXNnMmAgYXJyYXkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVyYW5kU2hhcmVSb3VuZFR3byhcbiAgdXNlck1zZzJzOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10sXG4gIHVzZXJHcGdQcml2S2V5OiBvcGVucGdwLlByaXZhdGVLZXksXG4gIHBhcnR5SWQ6IFNpZ25lclBhcnR5SWQgPSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gIG90aGVyU2lnbmVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8U2lnbmF0dXJlU2hhcmVSZWNvcmQ+IHtcbiAgYXNzZXJ0KHVzZXJNc2cycy5sZW5ndGggPj0gMSwgJ0V4cGVjdGVkIGF0IGxlYXN0IDEgcmVyYW5kIHJvdW5kLTIgbWVzc2FnZSAob25lIHBlciBzaGllbGRlZCBzcGVuZCknKTtcbiAgY29uc3Qgc2lnbmVkTXNnMnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB1c2VyTXNnMnMubWFwKCh1c2VyTXNnMikgPT4gUmVkUGFsbGFzTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzIucGF5bG9hZCksIHVzZXJHcGdQcml2S2V5KSlcbiAgKTtcbiAgY29uc3Qgc2hhcmU6IFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDJJbnB1dCA9IHtcbiAgICB0eXBlOiAncm91bmQySW5wdXQnLFxuICAgIGRhdGE6IHsgbXNnMjogc2lnbmVkTXNnMnMgfSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUocGFydHlJZCksXG4gICAgdG86IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShvdGhlclNpZ25lclBhcnR5SWQpLFxuICAgIHNoYXJlOiBKU09OLnN0cmluZ2lmeShzaGFyZSksXG4gIH07XG59XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHBlZXIncyByZXJhbmQgcm91bmQtMiBQR1Agc2lnbmF0dXJlcyBhbmQgcmV0dXJucyB0aGUgcmF3XG4gKiBkZXNlcmlhbGl6ZWQgbWVzc2FnZXMsIG9uZSBwZXIgc2hpZWxkZWQgc3BlbmQgaW4gdGhlIHBlZXIncyBhcnJheSBvcmRlcixcbiAqIHJlYWR5IGZvciBgUmVkUGFsbGFzUmVyYW5kLmhhbmRsZUluY29taW5nTWVzc2FnZXNgIChmZWVkIGBtc2cyW2ldYCBpbnRvXG4gKiBzcGVuZCBpJ3Mgc2Vzc2lvbikuIEFsbC1vci1ub3RoaW5nOiBhIHNpbmdsZSBmYWlsZWQgdmVyaWZpY2F0aW9uIHJlamVjdHMgdGhlXG4gKiB3aG9sZSByb3VuZC4gQWZ0ZXIgdGhpcyBleGNoYW5nZSBib3RoIHBhcnRpZXMgcmVhZCBlYWNoIHNwZW5kJ3NcbiAqIHJlcmFuZG9taXplZCBrZXlzaGFyZSB2aWEgYGdldFJlcmFuZG9taXplZEtleVNoYXJlKClgIGFuZCBmZWVkIGl0IGludG8gdGhhdFxuICogc3BlbmQncyBgUmVkUGFsbGFzRFNHLmluaXREc2dgIC0gbmV2ZXIgdGhlIGJhcmUgREtHIGtleXNoYXJlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGVlclJlcmFuZE1lc3NhZ2VSb3VuZFR3byhcbiAgcGFyc2VkUm91bmQyT3V0cHV0OiBSZWRwYWxsYXNNUEN2MlJlcmFuZFNoYXJlUm91bmQyT3V0cHV0LFxuICBwZWVyR3BnS2V5OiBvcGVucGdwLktleSxcbiAgcGVlclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFJlZFBhbGxhc01QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VbXT4ge1xuICBjb25zdCB2ZXJpZmllZE1zZ3M6IFJlZFBhbGxhc01QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNpZ25lZE1zZzIgb2YgcGFyc2VkUm91bmQyT3V0cHV0LmRhdGEubXNnMikge1xuICAgIGNvbnN0IHJhd0J5dGVzID0gYXdhaXQgUmVkUGFsbGFzTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShzaWduZWRNc2cyLCBwZWVyR3BnS2V5KTtcbiAgICB2ZXJpZmllZE1zZ3MucHVzaCh7IGZyb206IHBlZXJQYXJ0eUlkLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyYXdCeXRlcykgfSk7XG4gIH1cbiAgcmV0dXJuIHZlcmlmaWVkTXNncztcbn1cbiJdfQ==