@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.
- package/dist/src/bitgo/environments.d.ts +1 -0
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +3 -1
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +99 -45
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +144 -73
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +223 -102
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
|
@@ -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
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
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
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
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
|
|
49
|
-
* wraps
|
|
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(
|
|
52
|
-
|
|
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:
|
|
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
|
|
65
|
-
*
|
|
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
|
|
69
|
-
|
|
70
|
-
|
|
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(
|
|
78
|
-
|
|
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:
|
|
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
|
|
91
|
-
*
|
|
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
|
|
95
|
-
|
|
96
|
-
|
|
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
|
|
102
|
-
*
|
|
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
|
|
106
|
-
|
|
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
|
|
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
|
|
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(
|
|
116
|
-
|
|
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:
|
|
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
|
|
131
|
-
*
|
|
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(
|
|
134
|
-
|
|
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:
|
|
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
|
|
147
|
-
*
|
|
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
|
|
151
|
-
|
|
152
|
-
|
|
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
|
|
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(
|
|
160
|
-
|
|
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:
|
|
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
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
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
|
|
179
|
-
|
|
180
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkcGFsbGFzTVBDdjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHNzL3JlZHBhbGxhcy9yZWRwYWxsYXNNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXVGQSw4REFtQkM7QUFRRCw4REFXQztBQVFELDhEQW1CQztBQVFELDhEQVdDO0FBUUQsa0VBV0M7QUFZRCxrRUFtQkM7QUFXRCx3REFtQkM7QUFTRCwwRUFXQztBQVFELHdEQW1CQztBQVdELDBFQVdDO0FBaFVELG9EQUE0QjtBQUU1Qix5REFBK0U7QUFhL0UseURBQXFGO0FBQ3JGLGlFQUFvRTtBQUlwRSxTQUFTLDJCQUEyQixDQUFDLE9BQXlCO0lBQzVELFFBQVEsT0FBTyxFQUFFLENBQUM7UUFDaEIsS0FBSyw2QkFBZ0IsQ0FBQyxJQUFJO1lBQ3hCLE9BQU8sOEJBQWtCLENBQUMsSUFBSSxDQUFDO1FBQ2pDLEtBQUssNkJBQWdCLENBQUMsTUFBTTtZQUMxQixPQUFPLDhCQUFrQixDQUFDLE1BQU0sQ0FBQztRQUNuQyxLQUFLLDZCQUFnQixDQUFDLEtBQUs7WUFDekIsT0FBTyw4QkFBa0IsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQ0c7QUFFSDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUseUJBQXlCLENBQzdDLFNBQWtELEVBQ2xELGNBQWtDLEVBQ2xDLFVBQXlCLDZCQUFnQixDQUFDLElBQUksRUFDOUMscUJBQXVDLDZCQUFnQixDQUFDLEtBQUs7SUFFN0QsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLDhEQUE4RCxDQUFDLENBQUM7SUFDOUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNuQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQywrQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUNuSCxDQUFDO0lBQ0YsTUFBTSxLQUFLLEdBQTRDO1FBQ3JELElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7S0FDNUIsQ0FBQztJQUNGLE9BQU87UUFDTCxJQUFJLEVBQUUsMkJBQTJCLENBQUMsT0FBTyxDQUFDO1FBQzFDLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQztRQUNuRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0Msa0JBQTRELEVBQzVELFVBQXVCLEVBQ3ZCLGNBQWdDLDZCQUFnQixDQUFDLEtBQUs7SUFFdEQsTUFBTSxZQUFZLEdBQTRDLEVBQUUsQ0FBQztJQUNqRSxLQUFLLE1BQU0sVUFBVSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLCtCQUFpQixDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRixZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUseUJBQXlCLENBQzdDLFNBQWtELEVBQ2xELGNBQWtDLEVBQ2xDLFVBQXlCLDZCQUFnQixDQUFDLElBQUksRUFDOUMscUJBQXVDLDZCQUFnQixDQUFDLEtBQUs7SUFFN0QsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLDhEQUE4RCxDQUFDLENBQUM7SUFDOUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNuQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQywrQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUNuSCxDQUFDO0lBQ0YsTUFBTSxLQUFLLEdBQTRDO1FBQ3JELElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7S0FDNUIsQ0FBQztJQUNGLE9BQU87UUFDTCxJQUFJLEVBQUUsMkJBQTJCLENBQUMsT0FBTyxDQUFDO1FBQzFDLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQztRQUNuRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0Msa0JBQTRELEVBQzVELFVBQXVCLEVBQ3ZCLGNBQWdDLDZCQUFnQixDQUFDLEtBQUs7SUFFdEQsTUFBTSxZQUFZLEdBQTRDLEVBQUUsQ0FBQztJQUNqRSxLQUFLLE1BQU0sVUFBVSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLCtCQUFpQixDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRixZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsMkJBQTJCLENBQy9DLGtCQUE0RCxFQUM1RCxVQUF1QixFQUN2QixjQUFnQyw2QkFBZ0IsQ0FBQyxLQUFLO0lBRXRELE1BQU0sWUFBWSxHQUE0QyxFQUFFLENBQUM7SUFDakUsS0FBSyxNQUFNLFVBQVUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQUcsTUFBTSwrQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEYsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNJLEtBQUssVUFBVSwyQkFBMkIsQ0FDL0MsU0FBa0QsRUFDbEQsY0FBa0MsRUFDbEMsVUFBeUIsNkJBQWdCLENBQUMsSUFBSSxFQUM5QyxxQkFBdUMsNkJBQWdCLENBQUMsS0FBSztJQUU3RCxJQUFBLGdCQUFNLEVBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsOERBQThELENBQUMsQ0FBQztJQUM5RixNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ25DLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLCtCQUFpQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQ25ILENBQUM7SUFDRixNQUFNLEtBQUssR0FBNEM7UUFDckQsSUFBSSxFQUFFLGFBQWE7UUFDbkIsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtLQUM1QixDQUFDO0lBQ0YsT0FBTztRQUNMLElBQUksRUFBRSwyQkFBMkIsQ0FBQyxPQUFPLENBQUM7UUFDMUMsRUFBRSxFQUFFLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDO1FBQ25ELEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztLQUM3QixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxTQUFrRCxFQUNsRCxjQUFrQyxFQUNsQyxVQUF5Qiw2QkFBZ0IsQ0FBQyxJQUFJLEVBQzlDLHFCQUF1Qyw2QkFBZ0IsQ0FBQyxLQUFLO0lBRTdELElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxxRUFBcUUsQ0FBQyxDQUFDO0lBQ3JHLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDbkMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsK0JBQWlCLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FDbkgsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUF5QztRQUNsRCxJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO0tBQzVCLENBQUM7SUFDRixPQUFPO1FBQ0wsSUFBSSxFQUFFLDJCQUEyQixDQUFDLE9BQU8sQ0FBQztRQUMxQyxFQUFFLEVBQUUsMkJBQTJCLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0ksS0FBSyxVQUFVLCtCQUErQixDQUNuRCxrQkFBeUQsRUFDekQsVUFBdUIsRUFDdkIsY0FBZ0MsNkJBQWdCLENBQUMsS0FBSztJQUV0RCxNQUFNLFlBQVksR0FBNEMsRUFBRSxDQUFDO0lBQ2pFLEtBQUssTUFBTSxVQUFVLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLE1BQU0sK0JBQWlCLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsU0FBa0QsRUFDbEQsY0FBa0MsRUFDbEMsVUFBeUIsNkJBQWdCLENBQUMsSUFBSSxFQUM5QyxxQkFBdUMsNkJBQWdCLENBQUMsS0FBSztJQUU3RCxJQUFBLGdCQUFNLEVBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUscUVBQXFFLENBQUMsQ0FBQztJQUNyRyxNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ25DLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLCtCQUFpQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQ25ILENBQUM7SUFDRixNQUFNLEtBQUssR0FBeUM7UUFDbEQsSUFBSSxFQUFFLGFBQWE7UUFDbkIsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtLQUM1QixDQUFDO0lBQ0YsT0FBTztRQUNMLElBQUksRUFBRSwyQkFBMkIsQ0FBQyxPQUFPLENBQUM7UUFDMUMsRUFBRSxFQUFFLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDO1FBQ25ELEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztLQUM3QixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLCtCQUErQixDQUNuRCxrQkFBeUQsRUFDekQsVUFBdUIsRUFDdkIsY0FBZ0MsNkJBQWdCLENBQUMsS0FBSztJQUV0RCxNQUFNLFlBQVksR0FBNEMsRUFBRSxDQUFDO0lBQ2pFLEtBQUssTUFBTSxVQUFVLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLE1BQU0sK0JBQWlCLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBvcGVucGdwIGZyb20gJ29wZW5wZ3AnO1xuaW1wb3J0IHsgUmVkUGFsbGFzTVBTQ29tbXMsIFJlZFBhbGxhc01QU1R5cGVzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHtcbiAgUmVkcGFsbGFzTVBDdjJSZXJhbmRTaGFyZVJvdW5kMUlucHV0LFxuICBSZWRwYWxsYXNNUEN2MlJlcmFuZFNoYXJlUm91bmQxT3V0cHV0LFxuICBSZWRwYWxsYXNNUEN2MlJlcmFuZFNoYXJlUm91bmQySW5wdXQsXG4gIFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDJPdXRwdXQsXG4gIFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFJbnB1dCxcbiAgUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMklucHV0LFxuICBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxuICBSZWRwYWxsYXNNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQzSW5wdXQsXG4gIFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDNPdXRwdXQsXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgU2lnbmF0dXJlU2hhcmVSZWNvcmQsIFNpZ25hdHVyZVNoYXJlVHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL3Rzcy9iYXNlVHlwZXMnO1xuaW1wb3J0IHsgTVBDdjJQYXJ0aWVzRW51bSB9IGZyb20gJy4uLy4uL3V0aWxzL3Rzcy9lY2RzYS90eXBlc01QQ3YyJztcblxudHlwZSBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSIHwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA7XG5cbmZ1bmN0aW9uIHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtKTogU2lnbmF0dXJlU2hhcmVUeXBlIHtcbiAgc3dpdGNoIChwYXJ0eUlkKSB7XG4gICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLlVTRVI6XG4gICAgICByZXR1cm4gU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVI7XG4gICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUDpcbiAgICAgIHJldHVybiBTaWduYXR1cmVTaGFyZVR5cGUuQkFDS1VQO1xuICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTzpcbiAgICAgIHJldHVybiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR087XG4gIH1cbn1cblxuLyoqXG4gKiBSZWRQYWxsYXMgTVBTIERTRyBhbmQgcmVyYW5kIHNpZ25hdHVyZS1zaGFyZSBoZWxwZXJzIChtdWx0aS1zcGVuZCwgV0NJLTE5NDkpLlxuICpcbiAqIEEgc2hpZWxkZWQgWkVDIHRyYW5zYWN0aW9uIGNhbiBzcGVuZCBzZXZlcmFsIE9yY2hhcmQgbm90ZXM7IGV2ZXJ5IHBlci1zcGVuZFxuICogdmFsdWUgb24gdGhlIC9zaWduIHdpcmUgaXMgYW4gQVJSQVkgb2YgbGVuZ3RoIE4gb3JkZXJlZCBieSBzcGVuZCBpbmRleCwgd2hlcmVcbiAqIE4gaXMgdGhlIG51bWJlciBvZiBPcmNoYXJkIHNwZW5kc1xuICogKGB0eFJlcXVlc3QudHJhbnNhY3Rpb25zW2ldLnVuc2lnbmVkVHgucGFyc2VkVHguaW5wdXRzLmxlbmd0aGApLCBkZXJpdmVkIG9uXG4gKiB0aGUgY2xpZW50IGFuZCBuZXZlciBhIHdpcmUgZmllbGQuIEVhY2ggc3BlbmQgcnVucyBpdHMgb3duIHJlcmFuZCBzZXNzaW9uIGFuZFxuICogaXRzIG93biBEU0cgc2Vzc2lvbiAoTiBpbnN0YW5jZXMgb2YgYFJlZFBhbGxhc1JlcmFuZGAgLyBgUmVkUGFsbGFzRFNHYCDigJQgdGhleVxuICogYXJlIHNpbmdsZS1zZXNzaW9uIGJ5IGRlc2lnbjsgdGhlIHBlci1zcGVuZCBmYW4tb3V0IGxpdmVzIGluIHRoZSBjYWxsZXIsIHNlZVxuICogT1ZDJ3MgYE1wY1NpZ25lclJlZFBhbGxhc2ApLCBidXQgZWFjaCByb3VuZCBzdGlsbCBwcm9kdWNlcyBleGFjdGx5IE9ORVxuICogYFNpZ25hdHVyZVNoYXJlUmVjb3JkYCBwZXIgdHJhbnNhY3Rpb246IHRoZSBidWlsZGVycyBiZWxvdyB0YWtlIE5cbiAqIFBHUC1zaWduZWQgbWVzc2FnZXMgaW4gYW5kIGVtaXQgb25lIHJlY29yZCB3aG9zZSBgbXNnTmAgaXMgdGhlIHNwZW5kLW9yZGVyZWRcbiAqIGFycmF5OyB0aGUgdmVyaWZpZXJzIHRha2UgYSBwYXJzZWQgcGVlciBgcm91bmROT3V0cHV0YCAobXNnTiBhcnJheSkgYW5kXG4gKiByZXR1cm4gTiB2ZXJpZmllZCBtZXNzYWdlcyBvdXQsIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIEJ1aWxkZXJzOlxuICogLSBhc3NlcnQgYSBub24tZW1wdHkgaW5wdXQgYXJyYXkgKE4gPj0gMTsgYW4gT3JjaGFyZCBzcGVuZCB0cmFuc2FjdGlvbiBoYXMgYXRcbiAqICAgbGVhc3Qgb25lIGlucHV0KSBhbmQgcHJlc2VydmUgc3BlbmQgb3JkZXIg4oCUIFdhbGxldCBQbGF0Zm9ybSBpbmRleC1wYWlyc1xuICogICBgbXNnTltpXWAgd2l0aCBzcGVuZCBpJ3MgSFNNIHN0YXRlLCBzbyBhIG1pc29yZGVyZWQgYXJyYXkgc2lsZW50bHkgbWlzcGFpcnNcbiAqICAgc3BlbmRzLlxuICogLSBlbWl0IGV4YWN0bHkgT05FIHNoYXJlIHJlY29yZCBwZXIgcm91bmQg4oCUIFdQIHJlYWRzIG9ubHkgdGhlIExBU1Qgc2hhcmUgaW5cbiAqICAgYHNpZ25hdHVyZVNoYXJlc2A7IG11bHRpcGxlIHBhcnRpYWwgcmVjb3JkcyB3b3VsZCBiZSBzaWxlbnRseSBkcm9wcGVkLlxuICpcbiAqIFZlcmlmaWVyczpcbiAqIC0gcmV0dXJuIG9uZSB2ZXJpZmllZCBtZXNzYWdlIHBlciBhcnJheSBlbnRyeSwgc2FtZSBvcmRlciwgYWxsIHNpZ25lZCBieSB0aGVcbiAqICAgQml0R28gUmVkUGFsbGFzIEdQRyBrZXk7IGEgc2luZ2xlIGZhaWxlZCB2ZXJpZmljYXRpb24gZmFpbHMgdGhlIHdob2xlIHJvdW5kXG4gKiAgIChhbGwtb3Itbm90aGluZywgbWlycm9yaW5nIFdQJ3MgcGVyLXJvdW5kIHNoYXJlIGhhbmRsaW5nKS5cbiAqXG4gKiBDb25zdW1lZCBieSB0aGUgY3VzdG9kaWFsL2NvbGQgKFNNQy9PVkMpIHNpZ25pbmcgZmxvdzogT1ZDIGJ1aWxkcyBpdHMgcmVyYW5kXG4gKiBhbmQgRFNHIHNoYXJlcyB3aXRoIHRoZXNlIGFuZCBzdWJtaXRzIHRoZW0gdmlhIHRoZSAvc2lnbiB0eFJlcXVlc3Qgcm91dGUgKHNlZVxuICogYHNlbmRTaWduYXR1cmVTaGFyZVYyYCwgYm9keSB0eXBlcyBgcmVkUGFsbGFzUmVyYW5kYCAvIGByZWRQYWxsYXNNcGNWMmApLiBOb1xuICogY2FsbGVyIGluc2lkZSB0aGlzIFNESyB5ZXQuIE1pcnJvcnMgYC4uL2VkZHNhL2VkZHNhTVBDdjIudHNgIChzYW1lIHJvdW5kXG4gKiBzaGFwZSwgc2FtZSBQR1Atc2lnbmVkLW1lc3NhZ2UgZW52ZWxvcGUpLCBidXQga2VwdCBhcyBhbiBpbmRlcGVuZGVudCBjb3B5IC1cbiAqIGJ1aWx0IG9uIGBSZWRQYWxsYXNNUFNDb21tc2AgLSBzbyBSZWRQYWxsYXMgTVBTIG5ldmVyIGRlcGVuZHMgb24gdGhlIEVkRFNBIE1QU1xuICogbW9kdWxlLCBhbmQgdmljZSB2ZXJzYS4gVGhlIEVkRFNBIGhlbHBlcnMgdGhlbXNlbHZlcyByZW1haW4gc2NhbGFyXG4gKiAoc2luZ2xlLXNpZ25hYmxlKTogRWREU0EgaXMgbm90IHBhcnQgb2YgdGhlIG11bHRpLXNwZW5kIGN1dG92ZXIuXG4gKlxuICogU2luY2UgYEBiaXRnby93YXNtLW1wc2AgMS4xNy4wLCBrZXkgcmUtcmFuZG9taXphdGlvbiBpcyBhIHNlcGFyYXRlIDItcm91bmRcbiAqIHJlcmFuZCBwcm90b2NvbCB0aGF0IG11c3QgcnVuIGJlZm9yZSBldmVyeSBSZWRQYWxsYXMgRFNHLCBiZXR3ZWVuIHRoZSBzYW1lIDJcbiAqIHBhcnRpZXMgdGhhdCB3aWxsIHRoZW4gc2lnbjogYGdldFJlcmFuZFNoYXJlUm91bmRPbmUvVHdvYCBidWlsZCB0aG9zZSBzaGFyZVxuICogcmVjb3JkcyBhbmQgYHZlcmlmeVBlZXJSZXJhbmRNZXNzYWdlUm91bmRPbmUvVHdvYCB1bndyYXAgdGhlIHBlZXIncyByZXJhbmRcbiAqIG1lc3NhZ2VzIChzZWUgYFJlZFBhbGxhc1JlcmFuZGAgaW4gYEBiaXRnby1iZXRhL3Nkay1saWItbXBjYCkuIFJlcmFuZCBSMSBzZWVkc1xuICogZXZlcnkgc3BlbmQncyBzZXNzaW9uIGZyb20gdGhlIFNBTUUgREtHIGtleXNoYXJlOyBhZnRlciBSMiBlYWNoIHNwZW5kIGhhcyBpdHNcbiAqIG93biByZXJhbmQgcmVzdWx0IGB7a2V5U2hhcmUsIHBrLCBhbHBoYX1gLiBUaGUgcGVyLXNwZW5kIGBrZXlTaGFyZWAgLSBuZXZlclxuICogdGhlIGJhcmUgREtHIGtleXNoYXJlIC0gaW5pdGlhbGl6ZXMgdGhhdCBzcGVuZCdzIERTRyBzZXNzaW9uLCBhbmQgdGhlIERTR1xuICogc2lnbmF0dXJlIHZlcmlmaWVzIHVuZGVyIGByayA9PSBwa2Agb2YgdGhlIHNhbWUgc3BlbmQuXG4gKi9cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHJvdW5kLTEgc2lnbmF0dXJlIHNoYXJlIHJlY29yZC5cbiAqXG4gKiBQR1Atc2lnbnMgZWFjaCBzcGVuZCdzIFdBU00gcm91bmQtMCBicm9hZGNhc3QgbWVzc2FnZSB3aXRoIHRoZSBzaWduZXInc1xuICogZXBoZW1lcmFsIGtleSBhbmQgd3JhcHMgYWxsIE4gb2YgdGhlbSwgaW4gc3BlbmQgb3JkZXIsIGludG8gT05FXG4gKiBTaWduYXR1cmVTaGFyZVJlY29yZCAoYG1zZzFgIGFycmF5KSByZWFkeSBmb3IgYHNlbmRTaWduYXR1cmVTaGFyZVYyYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUoXG4gIHVzZXJNc2cxczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdLFxuICB1c2VyR3BnUHJpdktleTogb3BlbnBncC5Qcml2YXRlS2V5LFxuICBwYXJ0eUlkOiBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGFzc2VydCh1c2VyTXNnMXMubGVuZ3RoID49IDEsICdFeHBlY3RlZCBhdCBsZWFzdCAxIHJvdW5kLTEgbWVzc2FnZSAob25lIHBlciBzaGllbGRlZCBzcGVuZCknKTtcbiAgY29uc3Qgc2lnbmVkTXNnMXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB1c2VyTXNnMXMubWFwKCh1c2VyTXNnMSkgPT4gUmVkUGFsbGFzTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzEucGF5bG9hZCksIHVzZXJHcGdQcml2S2V5KSlcbiAgKTtcbiAgY29uc3Qgc2hhcmU6IFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFJbnB1dCA9IHtcbiAgICB0eXBlOiAncm91bmQxSW5wdXQnLFxuICAgIGRhdGE6IHsgbXNnMTogc2lnbmVkTXNnMXMgfSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUocGFydHlJZCksXG4gICAgdG86IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShvdGhlclNpZ25lclBhcnR5SWQpLFxuICAgIHNoYXJlOiBKU09OLnN0cmluZ2lmeShzaGFyZSksXG4gIH07XG59XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHBlZXIncyByb3VuZC0xIFBHUCBzaWduYXR1cmVzIGFuZCByZXR1cm5zIHRoZSByYXcgZGVzZXJpYWxpemVkXG4gKiBtZXNzYWdlcywgb25lIHBlciBzaGllbGRlZCBzcGVuZCBpbiB0aGUgcGVlcidzIGFycmF5IG9yZGVyLCByZWFkeSBmb3JcbiAqIGBSZWRQYWxsYXNEU0cuaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AgKGZlZWQgYG1zZzFbaV1gIGludG8gc3BlbmQgaSdzIHNlc3Npb24pLlxuICogQWxsLW9yLW5vdGhpbmc6IGEgc2luZ2xlIGZhaWxlZCB2ZXJpZmljYXRpb24gcmVqZWN0cyB0aGUgd2hvbGUgcm91bmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lKFxuICBwYXJzZWRSb3VuZDFPdXRwdXQ6IFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gIHBlZXJHcGdLZXk6IG9wZW5wZ3AuS2V5LFxuICBwZWVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8UmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdPiB7XG4gIGNvbnN0IHZlcmlmaWVkTXNnczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2lnbmVkTXNnMSBvZiBwYXJzZWRSb3VuZDFPdXRwdXQuZGF0YS5tc2cxKSB7XG4gICAgY29uc3QgcmF3Qnl0ZXMgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHNpZ25lZE1zZzEsIHBlZXJHcGdLZXkpO1xuICAgIHZlcmlmaWVkTXNncy5wdXNoKHsgZnJvbTogcGVlclBhcnR5SWQsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJhd0J5dGVzKSB9KTtcbiAgfVxuICByZXR1cm4gdmVyaWZpZWRNc2dzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcm91bmQtMiBzaWduYXR1cmUgc2hhcmUgcmVjb3JkLlxuICpcbiAqIFBHUC1zaWducyBlYWNoIHNwZW5kJ3Mgcm91bmQtMiBtZXNzYWdlIGFuZCB3cmFwcyBhbGwgTiBvZiB0aGVtLCBpbiBzcGVuZFxuICogb3JkZXIsIGludG8gT05FIFNpZ25hdHVyZVNoYXJlUmVjb3JkIChgbXNnMmAgYXJyYXkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byhcbiAgdXNlck1zZzJzOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10sXG4gIHVzZXJHcGdQcml2S2V5OiBvcGVucGdwLlByaXZhdGVLZXksXG4gIHBhcnR5SWQ6IFNpZ25lclBhcnR5SWQgPSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gIG90aGVyU2lnbmVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8U2lnbmF0dXJlU2hhcmVSZWNvcmQ+IHtcbiAgYXNzZXJ0KHVzZXJNc2cycy5sZW5ndGggPj0gMSwgJ0V4cGVjdGVkIGF0IGxlYXN0IDEgcm91bmQtMiBtZXNzYWdlIChvbmUgcGVyIHNoaWVsZGVkIHNwZW5kKScpO1xuICBjb25zdCBzaWduZWRNc2cycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHVzZXJNc2cycy5tYXAoKHVzZXJNc2cyKSA9PiBSZWRQYWxsYXNNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMi5wYXlsb2FkKSwgdXNlckdwZ1ByaXZLZXkpKVxuICApO1xuICBjb25zdCBzaGFyZTogUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMklucHV0ID0ge1xuICAgIHR5cGU6ICdyb3VuZDJJbnB1dCcsXG4gICAgZGF0YTogeyBtc2cyOiBzaWduZWRNc2cycyB9LFxuICB9O1xuICByZXR1cm4ge1xuICAgIGZyb206IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShwYXJ0eUlkKSxcbiAgICB0bzogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKG90aGVyU2lnbmVyUGFydHlJZCksXG4gICAgc2hhcmU6IEpTT04uc3RyaW5naWZ5KHNoYXJlKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGUgcGVlcidzIHJvdW5kLTIgUEdQIHNpZ25hdHVyZXMgYW5kIHJldHVybnMgdGhlIHJhdyBkZXNlcmlhbGl6ZWRcbiAqIG1lc3NhZ2VzLCBvbmUgcGVyIHNoaWVsZGVkIHNwZW5kIGluIHRoZSBwZWVyJ3MgYXJyYXkgb3JkZXIsIHJlYWR5IGZvclxuICogYFJlZFBhbGxhc0RTRy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzYCAoZmVlZCBgbXNnMltpXWAgaW50byBzcGVuZCBpJ3Mgc2Vzc2lvbikuXG4gKiBBbGwtb3Itbm90aGluZzogYSBzaW5nbGUgZmFpbGVkIHZlcmlmaWNhdGlvbiByZWplY3RzIHRoZSB3aG9sZSByb3VuZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBlZXJNZXNzYWdlUm91bmRUd28oXG4gIHBhcnNlZFJvdW5kMk91dHB1dDogUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbiAgcGVlckdwZ0tleTogb3BlbnBncC5LZXksXG4gIHBlZXJQYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtID0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuKTogUHJvbWlzZTxSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10+IHtcbiAgY29uc3QgdmVyaWZpZWRNc2dzOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzaWduZWRNc2cyIG9mIHBhcnNlZFJvdW5kMk91dHB1dC5kYXRhLm1zZzIpIHtcbiAgICBjb25zdCByYXdCeXRlcyA9IGF3YWl0IFJlZFBhbGxhc01QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2Uoc2lnbmVkTXNnMiwgcGVlckdwZ0tleSk7XG4gICAgdmVyaWZpZWRNc2dzLnB1c2goeyBmcm9tOiBwZWVyUGFydHlJZCwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmF3Qnl0ZXMpIH0pO1xuICB9XG4gIHJldHVybiB2ZXJpZmllZE1zZ3M7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHBlZXIncyByb3VuZC0zIFBHUCBzaWduYXR1cmVzIGFuZCByZXR1cm5zIHRoZSByYXcgZGVzZXJpYWxpemVkXG4gKiBtZXNzYWdlcywgb25lIHBlciBzaGllbGRlZCBzcGVuZCBpbiB0aGUgcGVlcidzIGFycmF5IG9yZGVyLCByZWFkeSBmb3JcbiAqIGBSZWRQYWxsYXNEU0cuaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AgKGZlZWQgYG1zZzNbaV1gIGludG8gc3BlbmQgaSdzIHNlc3Npb24pLlxuICogQWxsLW9yLW5vdGhpbmc6IGEgc2luZ2xlIGZhaWxlZCB2ZXJpZmljYXRpb24gcmVqZWN0cyB0aGUgd2hvbGUgcm91bmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kVGhyZWUoXG4gIHBhcnNlZFJvdW5kM091dHB1dDogUmVkcGFsbGFzTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kM091dHB1dCxcbiAgcGVlckdwZ0tleTogb3BlbnBncC5LZXksXG4gIHBlZXJQYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtID0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuKTogUHJvbWlzZTxSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10+IHtcbiAgY29uc3QgdmVyaWZpZWRNc2dzOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzaWduZWRNc2czIG9mIHBhcnNlZFJvdW5kM091dHB1dC5kYXRhLm1zZzMpIHtcbiAgICBjb25zdCByYXdCeXRlcyA9IGF3YWl0IFJlZFBhbGxhc01QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2Uoc2lnbmVkTXNnMywgcGVlckdwZ0tleSk7XG4gICAgdmVyaWZpZWRNc2dzLnB1c2goeyBmcm9tOiBwZWVyUGFydHlJZCwgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmF3Qnl0ZXMpIH0pO1xuICB9XG4gIHJldHVybiB2ZXJpZmllZE1zZ3M7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSByb3VuZC0zIHNpZ25hdHVyZSBzaGFyZSByZWNvcmQgKGZpbmFsIHNpZ25lciBtZXNzYWdlcykuXG4gKlxuICogUEdQLXNpZ25zIGVhY2ggc3BlbmQncyByb3VuZC0zIG1lc3NhZ2UgYW5kIHdyYXBzIGFsbCBOIG9mIHRoZW0sIGluIHNwZW5kXG4gKiBvcmRlciwgaW50byBPTkUgU2lnbmF0dXJlU2hhcmVSZWNvcmQgKGBtc2czYCBhcnJheSkuXG4gKlxuICogVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBgdmVyaWZ5Qml0R29NZXNzYWdlUm91bmRUaHJlZWAgYmVjYXVzZSBXYWxsZXQgUGxhdGZvcm1cbiAqIGZpbmFsaXNlcyB0aGUgc2lnbmluZyBzZXJ2ZXItc2lkZSBhZnRlciByZWNlaXZpbmcgcm91bmQgMzsgdGhlIGNsaWVudCBvYnRhaW5zXG4gKiB0aGUgc2lnbmVkIHRyYW5zYWN0aW9uIHZpYSBgc2VuZFR4UmVxdWVzdGAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUoXG4gIHVzZXJNc2czczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdLFxuICB1c2VyR3BnUHJpdktleTogb3BlbnBncC5Qcml2YXRlS2V5LFxuICBwYXJ0eUlkOiBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGFzc2VydCh1c2VyTXNnM3MubGVuZ3RoID49IDEsICdFeHBlY3RlZCBhdCBsZWFzdCAxIHJvdW5kLTMgbWVzc2FnZSAob25lIHBlciBzaGllbGRlZCBzcGVuZCknKTtcbiAgY29uc3Qgc2lnbmVkTXNnM3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB1c2VyTXNnM3MubWFwKCh1c2VyTXNnMykgPT4gUmVkUGFsbGFzTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzMucGF5bG9hZCksIHVzZXJHcGdQcml2S2V5KSlcbiAgKTtcbiAgY29uc3Qgc2hhcmU6IFJlZHBhbGxhc01QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDNJbnB1dCA9IHtcbiAgICB0eXBlOiAncm91bmQzSW5wdXQnLFxuICAgIGRhdGE6IHsgbXNnMzogc2lnbmVkTXNnM3MgfSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUocGFydHlJZCksXG4gICAgdG86IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShvdGhlclNpZ25lclBhcnR5SWQpLFxuICAgIHNoYXJlOiBKU09OLnN0cmluZ2lmeShzaGFyZSksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSByZXJhbmQgcm91bmQtMSBzaWduYXR1cmUgc2hhcmUgcmVjb3JkLlxuICpcbiAqIFJlcmFuZCBtdXN0IHJ1biBiZWZvcmUgZXZlcnkgUmVkUGFsbGFzIERTRywgd2l0aCB0aGUgc2FtZSBjb3VudGVycGFydCwgb25jZVxuICogcGVyIHNoaWVsZGVkIHNwZW5kOiB0aGUgY2FsbGVyIGluaXRpYWxpemVzIE4gYFJlZFBhbGxhc1JlcmFuZGAgc2Vzc2lvbnMgb24gdGhlXG4gKiBTQU1FIERLRyBrZXlzaGFyZSBhbmQgcGFzc2VzIGVhY2ggc2Vzc2lvbidzIGBnZXRGaXJzdE1lc3NhZ2UoKWAsIGluIHNwZW5kXG4gKiBvcmRlci4gUm91bmQgMSBjYXJyaWVzIHRoZSBQR1Atc2lnbmVkIFdBU00gY29tbWl0bWVudHM7IGFsbCBOIGFyZSB3cmFwcGVkXG4gKiBpbnRvIE9ORSBTaWduYXR1cmVTaGFyZVJlY29yZCAoYG1zZzFgIGFycmF5KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlcmFuZFNoYXJlUm91bmRPbmUoXG4gIHVzZXJNc2cxczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdLFxuICB1c2VyR3BnUHJpdktleTogb3BlbnBncC5Qcml2YXRlS2V5LFxuICBwYXJ0eUlkOiBTaWduZXJQYXJ0eUlkID0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGFzc2VydCh1c2VyTXNnMXMubGVuZ3RoID49IDEsICdFeHBlY3RlZCBhdCBsZWFzdCAxIHJlcmFuZCByb3VuZC0xIG1lc3NhZ2UgKG9uZSBwZXIgc2hpZWxkZWQgc3BlbmQpJyk7XG4gIGNvbnN0IHNpZ25lZE1zZzFzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgdXNlck1zZzFzLm1hcCgodXNlck1zZzEpID0+IFJlZFBhbGxhc01QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKHVzZXJNc2cxLnBheWxvYWQpLCB1c2VyR3BnUHJpdktleSkpXG4gICk7XG4gIGNvbnN0IHNoYXJlOiBSZWRwYWxsYXNNUEN2MlJlcmFuZFNoYXJlUm91bmQxSW5wdXQgPSB7XG4gICAgdHlwZTogJ3JvdW5kMUlucHV0JyxcbiAgICBkYXRhOiB7IG1zZzE6IHNpZ25lZE1zZzFzIH0sXG4gIH07XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQpLFxuICAgIHRvOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUob3RoZXJTaWduZXJQYXJ0eUlkKSxcbiAgICBzaGFyZTogSlNPTi5zdHJpbmdpZnkoc2hhcmUpLFxuICB9O1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBwZWVyJ3MgcmVyYW5kIHJvdW5kLTEgUEdQIHNpZ25hdHVyZXMgYW5kIHJldHVybnMgdGhlIHJhd1xuICogZGVzZXJpYWxpemVkIG1lc3NhZ2VzLCBvbmUgcGVyIHNoaWVsZGVkIHNwZW5kIGluIHRoZSBwZWVyJ3MgYXJyYXkgb3JkZXIsXG4gKiByZWFkeSBmb3IgYFJlZFBhbGxhc1JlcmFuZC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzYCAoZmVlZCBgbXNnMVtpXWAgaW50b1xuICogc3BlbmQgaSdzIHNlc3Npb24pLiBBbGwtb3Itbm90aGluZzogYSBzaW5nbGUgZmFpbGVkIHZlcmlmaWNhdGlvbiByZWplY3RzIHRoZVxuICogd2hvbGUgcm91bmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlQZWVyUmVyYW5kTWVzc2FnZVJvdW5kT25lKFxuICBwYXJzZWRSb3VuZDFPdXRwdXQ6IFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDFPdXRwdXQsXG4gIHBlZXJHcGdLZXk6IG9wZW5wZ3AuS2V5LFxuICBwZWVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8UmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdPiB7XG4gIGNvbnN0IHZlcmlmaWVkTXNnczogUmVkUGFsbGFzTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2lnbmVkTXNnMSBvZiBwYXJzZWRSb3VuZDFPdXRwdXQuZGF0YS5tc2cxKSB7XG4gICAgY29uc3QgcmF3Qnl0ZXMgPSBhd2FpdCBSZWRQYWxsYXNNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKHNpZ25lZE1zZzEsIHBlZXJHcGdLZXkpO1xuICAgIHZlcmlmaWVkTXNncy5wdXNoKHsgZnJvbTogcGVlclBhcnR5SWQsIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJhd0J5dGVzKSB9KTtcbiAgfVxuICByZXR1cm4gdmVyaWZpZWRNc2dzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcmVyYW5kIHJvdW5kLTIgc2lnbmF0dXJlIHNoYXJlIHJlY29yZCAob3BlbmluZyBtZXNzYWdlcykuXG4gKlxuICogUEdQLXNpZ25zIGVhY2ggc3BlbmQncyByZXJhbmQgcm91bmQtMiBtZXNzYWdlIGFuZCB3cmFwcyBhbGwgTiBvZiB0aGVtLCBpblxuICogc3BlbmQgb3JkZXIsIGludG8gT05FIFNpZ25hdHVyZVNoYXJlUmVjb3JkIChgbXNnMmAgYXJyYXkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVyYW5kU2hhcmVSb3VuZFR3byhcbiAgdXNlck1zZzJzOiBSZWRQYWxsYXNNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlW10sXG4gIHVzZXJHcGdQcml2S2V5OiBvcGVucGdwLlByaXZhdGVLZXksXG4gIHBhcnR5SWQ6IFNpZ25lclBhcnR5SWQgPSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gIG90aGVyU2lnbmVyUGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bSA9IE1QQ3YyUGFydGllc0VudW0uQklUR09cbik6IFByb21pc2U8U2lnbmF0dXJlU2hhcmVSZWNvcmQ+IHtcbiAgYXNzZXJ0KHVzZXJNc2cycy5sZW5ndGggPj0gMSwgJ0V4cGVjdGVkIGF0IGxlYXN0IDEgcmVyYW5kIHJvdW5kLTIgbWVzc2FnZSAob25lIHBlciBzaGllbGRlZCBzcGVuZCknKTtcbiAgY29uc3Qgc2lnbmVkTXNnMnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICB1c2VyTXNnMnMubWFwKCh1c2VyTXNnMikgPT4gUmVkUGFsbGFzTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzIucGF5bG9hZCksIHVzZXJHcGdQcml2S2V5KSlcbiAgKTtcbiAgY29uc3Qgc2hhcmU6IFJlZHBhbGxhc01QQ3YyUmVyYW5kU2hhcmVSb3VuZDJJbnB1dCA9IHtcbiAgICB0eXBlOiAncm91bmQySW5wdXQnLFxuICAgIGRhdGE6IHsgbXNnMjogc2lnbmVkTXNnMnMgfSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUocGFydHlJZCksXG4gICAgdG86IHBhcnR5SWRUb1NpZ25hdHVyZVNoYXJlVHlwZShvdGhlclNpZ25lclBhcnR5SWQpLFxuICAgIHNoYXJlOiBKU09OLnN0cmluZ2lmeShzaGFyZSksXG4gIH07XG59XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHBlZXIncyByZXJhbmQgcm91bmQtMiBQR1Agc2lnbmF0dXJlcyBhbmQgcmV0dXJucyB0aGUgcmF3XG4gKiBkZXNlcmlhbGl6ZWQgbWVzc2FnZXMsIG9uZSBwZXIgc2hpZWxkZWQgc3BlbmQgaW4gdGhlIHBlZXIncyBhcnJheSBvcmRlcixcbiAqIHJlYWR5IGZvciBgUmVkUGFsbGFzUmVyYW5kLmhhbmRsZUluY29taW5nTWVzc2FnZXNgIChmZWVkIGBtc2cyW2ldYCBpbnRvXG4gKiBzcGVuZCBpJ3Mgc2Vzc2lvbikuIEFsbC1vci1ub3RoaW5nOiBhIHNpbmdsZSBmYWlsZWQgdmVyaWZpY2F0aW9uIHJlamVjdHMgdGhlXG4gKiB3aG9sZSByb3VuZC4gQWZ0ZXIgdGhpcyBleGNoYW5nZSBib3RoIHBhcnRpZXMgcmVhZCBlYWNoIHNwZW5kJ3NcbiAqIHJlcmFuZG9taXplZCBrZXlzaGFyZSB2aWEgYGdldFJlcmFuZG9taXplZEtleVNoYXJlKClgIGFuZCBmZWVkIGl0IGludG8gdGhhdFxuICogc3BlbmQncyBgUmVkUGFsbGFzRFNHLmluaXREc2dgIC0gbmV2ZXIgdGhlIGJhcmUgREtHIGtleXNoYXJlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGVlclJlcmFuZE1lc3NhZ2VSb3VuZFR3byhcbiAgcGFyc2VkUm91bmQyT3V0cHV0OiBSZWRwYWxsYXNNUEN2MlJlcmFuZFNoYXJlUm91bmQyT3V0cHV0LFxuICBwZWVyR3BnS2V5OiBvcGVucGdwLktleSxcbiAgcGVlclBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0gPSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4pOiBQcm9taXNlPFJlZFBhbGxhc01QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VbXT4ge1xuICBjb25zdCB2ZXJpZmllZE1zZ3M6IFJlZFBhbGxhc01QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNpZ25lZE1zZzIgb2YgcGFyc2VkUm91bmQyT3V0cHV0LmRhdGEubXNnMikge1xuICAgIGNvbnN0IHJhd0J5dGVzID0gYXdhaXQgUmVkUGFsbGFzTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShzaWduZWRNc2cyLCBwZWVyR3BnS2V5KTtcbiAgICB2ZXJpZmllZE1zZ3MucHVzaCh7IGZyb206IHBlZXJQYXJ0eUlkLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyYXdCeXRlcykgfSk7XG4gIH1cbiAgcmV0dXJuIHZlcmlmaWVkTXNncztcbn1cbiJdfQ==
|