@bitgo-beta/sdk-core 8.2.1-beta.2129 → 8.2.1-beta.2130
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/LICENSE +191 -0
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +24 -3
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
- package/dist/src/bitgo/safe/derivableEd25519Pub.js +71 -4
- package/dist/src/bitgo/safe/recovery.d.ts +66 -9
- package/dist/src/bitgo/safe/recovery.d.ts.map +1 -1
- package/dist/src/bitgo/safe/recovery.js +89 -20
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +52 -1
- package/dist/test/unit/bitgo/safe/recovery.js +134 -6
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -9
|
@@ -3,6 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.decryptSafeKeycard = decryptSafeKeycard;
|
|
4
4
|
exports.deriveSafeWalletKeys = deriveSafeWalletKeys;
|
|
5
5
|
exports.buildSafeRecoverKeyParams = buildSafeRecoverKeyParams;
|
|
6
|
+
/**
|
|
7
|
+
* @prettier
|
|
8
|
+
*
|
|
9
|
+
* @experimental WRW-facing safe recovery entry points.
|
|
10
|
+
*/
|
|
11
|
+
const buffer_1 = require("buffer");
|
|
6
12
|
const crypto_1 = require("crypto");
|
|
7
13
|
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
8
14
|
const statics_1 = require("@bitgo-beta/statics");
|
|
@@ -140,37 +146,100 @@ async function deriveSafeWalletKeys(params) {
|
|
|
140
146
|
throw new Error(`deriveSafeWalletKeys: slot '${params.slot}' is not supported yet`);
|
|
141
147
|
}
|
|
142
148
|
/**
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
149
|
+
* Per-coin encoders for the `ed25519Multisig` slot: each slot-2 coin re-encodes the same 32-byte
|
|
150
|
+
* children into its own address/seed string formats. A coin absent from the registry is not yet
|
|
151
|
+
* supported for slot-2 recovery (xlm/hbar are future arms).
|
|
146
152
|
*/
|
|
153
|
+
const ED25519_MULTISIG_COIN_ENCODERS = {
|
|
154
|
+
algo: { encodePub: sdk_lib_safes_1.encodeAlgoKey, encodeSeed: sdk_lib_safes_1.encodeAlgoKey },
|
|
155
|
+
talgo: { encodePub: sdk_lib_safes_1.encodeAlgoKey, encodeSeed: sdk_lib_safes_1.encodeAlgoKey },
|
|
156
|
+
};
|
|
147
157
|
async function buildSafeRecoverKeyParams(params) {
|
|
148
|
-
|
|
149
|
-
|
|
158
|
+
const { bitgo, mode } = params;
|
|
159
|
+
if (params.slot === 'ed25519Multisig') {
|
|
160
|
+
return buildEd25519MultisigRecoverKeyParams(bitgo, params.coin, params.keys, mode);
|
|
150
161
|
}
|
|
151
|
-
|
|
152
|
-
|
|
162
|
+
if (params.slot === 'secp256k1Multisig') {
|
|
163
|
+
const keys = params.keys;
|
|
164
|
+
if (mode === 'unsigned') {
|
|
165
|
+
return {
|
|
166
|
+
slot: 'secp256k1Multisig',
|
|
167
|
+
userKey: keys.user.pub,
|
|
168
|
+
backupKey: keys.backup.pub,
|
|
169
|
+
bitgoKey: keys.bitgo.pub,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const userPrv = utxo_lib_1.bip32.fromBase58(keys.user.prv);
|
|
173
|
+
const backupPrv = utxo_lib_1.bip32.fromBase58(keys.backup.prv);
|
|
174
|
+
if (!userPrv.privateKey || !backupPrv.privateKey) {
|
|
175
|
+
throw new Error('buildSafeRecoverKeyParams: keys.user.prv and keys.backup.prv must be private xprvs');
|
|
176
|
+
}
|
|
177
|
+
const walletPassphrase = (0, crypto_1.randomBytes)(32).toString('hex');
|
|
178
|
+
const [userKey, backupKey] = await Promise.all([
|
|
179
|
+
bitgo.encrypt({ input: keys.user.prv, password: walletPassphrase, encryptionVersion: 1 }),
|
|
180
|
+
bitgo.encrypt({ input: keys.backup.prv, password: walletPassphrase, encryptionVersion: 1 }),
|
|
181
|
+
]);
|
|
153
182
|
return {
|
|
154
|
-
|
|
155
|
-
|
|
183
|
+
slot: 'secp256k1Multisig',
|
|
184
|
+
userKey,
|
|
185
|
+
backupKey,
|
|
156
186
|
bitgoKey: keys.bitgo.pub,
|
|
187
|
+
walletPassphrase,
|
|
157
188
|
};
|
|
158
189
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
190
|
+
throw new Error(`buildSafeRecoverKeyParams: slot '${params.slot}' is not supported yet`);
|
|
191
|
+
}
|
|
192
|
+
async function buildEd25519MultisigRecoverKeyParams(bitgo, coin, keys, mode) {
|
|
193
|
+
const encoders = ED25519_MULTISIG_COIN_ENCODERS[coin];
|
|
194
|
+
if (!encoders) {
|
|
195
|
+
throw new Error(`buildSafeRecoverKeyParams: coin '${coin}' ed25519Multisig is not supported yet`);
|
|
196
|
+
}
|
|
197
|
+
for (const pub of [keys.user.pub, keys.backup.pub, keys.bitgo.pub]) {
|
|
198
|
+
// strict hex, not length-only: Buffer.from(pub, 'hex') truncates at the first bad pair, so a
|
|
199
|
+
// length check alone would accept trailing garbage
|
|
200
|
+
if (!/^[0-9a-f]{64}$/i.test(pub)) {
|
|
201
|
+
throw new Error('buildSafeRecoverKeyParams: ed25519 child public keys must be 32 bytes');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const userPub = buffer_1.Buffer.from(keys.user.pub, 'hex');
|
|
205
|
+
const backupPub = buffer_1.Buffer.from(keys.backup.pub, 'hex');
|
|
206
|
+
const bitgoPub = buffer_1.Buffer.from(keys.bitgo.pub, 'hex');
|
|
207
|
+
// Algorand wallet addresses are the version-1 2-of-3 multisig address over the three child pubs
|
|
208
|
+
// in wallet-creation order. `Algo.recover()` recomputes and enforces the same value and throws
|
|
209
|
+
// `RecoveryKeyMismatchError` on any mismatch (sdk-coin-algo/src/algo.ts).
|
|
210
|
+
const rootAddress = (0, sdk_lib_safes_1.algoMultisigAddress)(1, 2, [userPub, backupPub, bitgoPub]);
|
|
211
|
+
if (mode === 'unsigned') {
|
|
212
|
+
return {
|
|
213
|
+
slot: 'ed25519Multisig',
|
|
214
|
+
mode: 'unsigned',
|
|
215
|
+
userKey: encoders.encodePub(userPub),
|
|
216
|
+
backupKey: encoders.encodePub(backupPub),
|
|
217
|
+
bitgoKey: encoders.encodePub(bitgoPub),
|
|
218
|
+
rootAddress,
|
|
219
|
+
};
|
|
163
220
|
}
|
|
221
|
+
// The user child is a hardened SLIP-0010 seed, so it re-encrypts exactly like slot 1. The backup
|
|
222
|
+
// child is a seedless soft extended key: it cannot be re-encrypted as a seed, so it becomes a lazy
|
|
223
|
+
// external signer over the tx bytes (WCN-2895's extended-key signer, invoked by the coin).
|
|
164
224
|
const walletPassphrase = (0, crypto_1.randomBytes)(32).toString('hex');
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
225
|
+
const userKey = await bitgo.encrypt({
|
|
226
|
+
input: encoders.encodeSeed(buffer_1.Buffer.from(keys.user.seed, 'hex')),
|
|
227
|
+
password: walletPassphrase,
|
|
228
|
+
encryptionVersion: 1,
|
|
229
|
+
});
|
|
169
230
|
return {
|
|
231
|
+
slot: 'ed25519Multisig',
|
|
232
|
+
mode: 'signed',
|
|
170
233
|
userKey,
|
|
171
|
-
|
|
172
|
-
bitgoKey: keys.bitgo.pub,
|
|
234
|
+
bitgoKey: encoders.encodePub(bitgoPub),
|
|
173
235
|
walletPassphrase,
|
|
236
|
+
rootAddress,
|
|
237
|
+
externalBackupSigner: {
|
|
238
|
+
publicKey: keys.backup.pub,
|
|
239
|
+
sign: async (message) => ({
|
|
240
|
+
signature: (await (0, derivableEd25519Pub_1.signEd25519Extended)(buffer_1.Buffer.from(message), buffer_1.Buffer.from(keys.backup.kL, 'hex'), buffer_1.Buffer.from(keys.backup.kR, 'hex'))).toString('hex'),
|
|
241
|
+
}),
|
|
242
|
+
},
|
|
174
243
|
};
|
|
175
244
|
}
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1HQSxnREFvRUM7QUFNRCxvREE2RUM7QUFPRCw4REFzQ0M7QUFqU0QsbUNBQXFDO0FBQ3JDLG1EQUE2QztBQUM3QyxpREFBc0Q7QUFFdEQsNkRBV21DO0FBQ25DLCtEQUkrQjtBQUMvQix5REFBb0U7QUFFcEUsc0NBQW1EO0FBQ25ELG9FQUF5RTtBQXFFbEUsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BTXhDO0lBQ0MsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFMUUsTUFBTSxTQUFTLEdBQUcsSUFBQSxtQ0FBbUIsRUFBQyxVQUFVLENBQUMsQ0FBQztJQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFBLG1DQUFtQixFQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sVUFBVSxHQUFHLElBQUEsbUNBQW1CLEVBQUMsV0FBVyxDQUFDLENBQUM7SUFFcEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLElBQVksRUFBbUIsRUFBRTtRQUMxRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSwrQkFBc0IsQ0FBQywrREFBK0QsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxTQUFpQixFQUF3QixFQUFFO1FBQ2hFLElBQUksQ0FBQztZQUNILE9BQU8sSUFBQSwyQ0FBd0IsRUFBQyxTQUFTLENBQUMsQ0FB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Q0FBQztJQUNoRCxNQUFNLFNBQVMsR0FBRyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsb0ZBQW9GLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLG9CQUFXLEVBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pELE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQzdDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3pGLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDO0tBQzVGLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxPQUFPO1FBQ1AsU0FBUztRQUNULFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7UUFDeEIsZ0JBQWdCO0tBQ2pCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFdSVy1mYWNpbmcgc2FmZSByZWNvdmVyeSBlbnRyeSBwb2ludHMuXG4gKi9cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IE1BWF9CSVAzMl9JTkRFWCB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHR5cGUgeyBSb290S2V5VHlwZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHtcbiAgYnVpbGRTYWZlQmlwNDRQYXRoLFxuICBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5LFxuICBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQsXG4gIGRlcml2ZVNhZmVDaGlsZFRyaXBsZXQsXG4gIEVkMjU1MTlDaGFpbkNvZGVFbnRyeUNvZGVjLFxuICBnZXRTYWZlQmlwNDRDb2luVHlwZSxcbiAgcGFyc2VTYWZlQmlwNDRQYXRoLFxuICBwYXJzZVNhZmVLZXljYXJkQm94LFxuICB0b1NvZnRUd2luUGF0aCxcbiAgdHlwZSBTYWZlS2V5Y2FyZFJvb3RFbnRyeSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1zYWZlcyc7XG5pbXBvcnQge1xuICBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5QXRQYXRoLFxuICBzb2Z0RGVyaXZlQ2hpbGRQcnZFZDI1NTE5QXRQYXRoLFxuICB0eXBlIEVkMjU1MTlFeHRlbmRlZEtleVBhcnRzLFxufSBmcm9tICcuL2Rlcml2YWJsZUVkMjU1MTlQdWInO1xuaW1wb3J0IHsgRGtsc1ZyZlV0aWxzLCBNcHNWcmZVdGlscyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBJbmNvcnJlY3RQYXNzd29yZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlU2FmZU1wY0tleUVudmVsb3BlcyB9IGZyb20gJy4uL3V0aWxzL3Rzcy9rZXlTaGFyZUVudmVsb3BlJztcblxuZXhwb3J0IHR5cGUgRGVjcnlwdGVkTXBjU2FmZVJvb3QgPSB7IHNpZ25pbmc6IEJ1ZmZlcjsgdnJmOiBCdWZmZXIgfTtcblxuZXhwb3J0IHR5cGUgT25jaGFpblNhZmVSb290ID0geyB1c2VyOiBzdHJpbmc7IGJhY2t1cDogc3RyaW5nOyBiaXRnbzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBNcGNTYWZlUm9vdCA9IHsgdXNlcjogRGVjcnlwdGVkTXBjU2FmZVJvb3Q7IGJhY2t1cDogRGVjcnlwdGVkTXBjU2FmZVJvb3Q7IGJpdGdvOiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIEVkMjU1MTlNdWx0aXNpZ1NhZmVSb290ID0ge1xuICB1c2VyOiBzdHJpbmc7XG4gIGJhY2t1cDogeyBwcnY6IHN0cmluZzsgY2hhaW5Db2RlOiBzdHJpbmcgfTtcbiAgYml0Z286IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNlY3AyNTZrMU11bHRpc2lnQ2hpbGRLZXlzID0ge1xuICB1c2VyOiB7IHBydjogc3RyaW5nOyBwdWI6IHN0cmluZyB9O1xuICBiYWNrdXA6IHsgcHJ2OiBzdHJpbmc7IHB1Yjogc3RyaW5nIH07XG4gIGJpdGdvOiB7IHB1Yjogc3RyaW5nIH07XG59O1xuXG5leHBvcnQgdHlwZSBFY2RzYU1wY0NoaWxkS2V5cyA9IHtcbiAgY29tbW9uS2V5Y2hhaW46IHN0cmluZztcbiAgdXNlcjogc3RyaW5nO1xuICBiYWNrdXA6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEVkZHNhTXBjQ2hpbGRLZXlzID0gRWNkc2FNcGNDaGlsZEtleXM7XG5cbi8qKlxuICogQSBoYXJkZW5lZCAoU0xJUC0wMDEwKSBlZDI1NTE5IGNoaWxkLiBUaGUgYGtpbmRgIGRpc2NyaW1pbmF0b3IgcHJldmVudHMgYSByYXcgc2VlZCBmcm9tIGJlaW5nXG4gKiBtaXN0YWtlbiBmb3IgYW4gZXh0ZW5kZWQga2V5IGRvd25zdHJlYW0g4oCUIGJvdGggYXJlIDMyLWJ5dGUgdmFsdWVzIHRoYXQgYGlzVmFsaWRQdWJgIHdvdWxkIGFjY2VwdC5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUVkMjU1MTlTZWVkS2V5ID0ge1xuICByZWFkb25seSBraW5kOiAnc2VlZCc7XG4gIHJlYWRvbmx5IHNlZWQ6IHN0cmluZzsgLy8gMzItYnl0ZSBjaGlsZCBzZWVkIChoZXgpIOKAlCB0aGUgc2lnbmVyIGlucHV0XG4gIHJlYWRvbmx5IHB1Yjogc3RyaW5nOyAvLyAzMi1ieXRlIHB1YmxpYyBrZXkgKGhleClcbn07XG5cbi8qKlxuICogQSBzb2Z0IChCSVAzMi1FZDI1NTE5KSBlZDI1NTE5IGNoaWxkLiBObyAzMi1ieXRlIHNlZWQgbWFwcyBiYWNrIHRvIGEgc29mdC1kZXJpdmVkIGNoaWxkLCBzbyB0aGVcbiAqIHNpZ25lciBuZWVkcyBib3RoIGhhbHZlcyBkaXJlY3RseTogYGtMYCAodGhlIGNsYW1wZWQgc2NhbGFyKSBhbmQgYGtSYCAodGhlIG5vbmNlIHByZWZpeCkuXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVFZDI1NTE5RXh0ZW5kZWRLZXkgPSB7IHJlYWRvbmx5IGtpbmQ6ICdleHRlbmRlZCcgfSAmIEVkMjU1MTlFeHRlbmRlZEtleVBhcnRzPHN0cmluZz47IC8vIGhleFxuXG4vKiogVGhlIHRocmVlIGVkMjU1MTkgY28tc2lnbmVyIGNoaWxkcmVuLiBCaXRHbyBpcyBwdWItb25seTogaXRzIHByaXZhdGUga2V5IHN0YXlzIGluIHRoZSBIU00uICovXG5leHBvcnQgdHlwZSBFZDI1NTE5TXVsdGlzaWdDaGlsZEtleXMgPSB7XG4gIHVzZXI6IFNhZmVFZDI1NTE5U2VlZEtleTtcbiAgYmFja3VwOiBTYWZlRWQyNTUxOUV4dGVuZGVkS2V5O1xuICBiaXRnbzogeyByZWFkb25seSBwdWI6IHN0cmluZyB9O1xufTtcblxuZXhwb3J0IHR5cGUgRGVyaXZlZFNhZmVXYWxsZXRLZXlzID1cbiAgfCB7IHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZyc7IHBhdGg6IHN0cmluZzsga2V5czogU2VjcDI1NmsxTXVsdGlzaWdDaGlsZEtleXMgfVxuICB8IHsgc2xvdDogJ2VjZHNhTXBjJzsgcGF0aDogc3RyaW5nOyBrZXlzOiBFY2RzYU1wY0NoaWxkS2V5cyB9XG4gIHwgeyBzbG90OiAnZWRkc2FNcGMnOyBwYXRoOiBzdHJpbmc7IGtleXM6IEVkZHNhTXBjQ2hpbGRLZXlzIH1cbiAgfCB7IHNsb3Q6ICdlZDI1NTE5TXVsdGlzaWcnOyBwYXRoOiBzdHJpbmc7IGtleXM6IEVkMjU1MTlNdWx0aXNpZ0NoaWxkS2V5cyB9O1xuXG5leHBvcnQgdHlwZSBTYWZlUmVjb3ZlcktleVBhcmFtcyA9IHtcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlY3J5cHRlZFNhZmVSb290cyA9IHtcbiAgc2VjcDI1NmsxTXVsdGlzaWc6IE9uY2hhaW5TYWZlUm9vdDtcbiAgZWQyNTUxOU11bHRpc2lnOiBFZDI1NTE5TXVsdGlzaWdTYWZlUm9vdDtcbiAgZWNkc2FNcGM6IE1wY1NhZmVSb290O1xuICBlZGRzYU1wYzogTXBjU2FmZVJvb3Q7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdFNhZmVLZXljYXJkKHBhcmFtczoge1xuICBiaXRnbzogQml0R29CYXNlO1xuICB1c2VyS2V5Qm94OiBzdHJpbmc7XG4gIGJhY2t1cEtleUJveDogc3RyaW5nO1xuICBiaXRnb0tleUJveDogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xufSk6IFByb21pc2U8RGVjcnlwdGVkU2FmZVJvb3RzPiB7XG4gIGNvbnN0IHsgYml0Z28sIHVzZXJLZXlCb3gsIGJhY2t1cEtleUJveCwgYml0Z29LZXlCb3gsIHBhc3N3b3JkIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgdXNlclJvb3RzID0gcGFyc2VTYWZlS2V5Y2FyZEJveCh1c2VyS2V5Qm94KTtcbiAgY29uc3QgYmFja3VwUm9vdHMgPSBwYXJzZVNhZmVLZXljYXJkQm94KGJhY2t1cEtleUJveCk7XG4gIGNvbnN0IGJpdGdvUm9vdHMgPSBwYXJzZVNhZmVLZXljYXJkQm94KGJpdGdvS2V5Qm94KTtcblxuICBjb25zdCBkZWNyeXB0Um9vdCA9IGFzeW5jIChyb290OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiByb290LCBwYXNzd29yZCB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcigndW5hYmxlIHRvIGRlY3J5cHQgdGhlIHNhZmUga2V5Y2FyZCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzd29yZCcsIGUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1bndyYXBNcGNSb290ID0gKGRlY3J5cHRlZDogc3RyaW5nKTogRGVjcnlwdGVkTXBjU2FmZVJvb3QgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcGFyc2VTYWZlTXBjS2V5RW52ZWxvcGVzKGRlY3J5cHRlZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoJ3VuYWJsZSB0byBkZWNyeXB0IHRoZSBzYWZlIGtleWNhcmQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3dvcmQnLCBlKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gT25seSBib3ggQidzIGVkMjU1MTlNdWx0aXNpZyBzbG90IG1heSBjYXJyeSB0aGUgZGVyaXZhYmxlIGB7IHBydiwgY2hhaW5Db2RlIH1gIG9iamVjdDsgZXZlcnlcbiAgLy8gb3RoZXIgZW50cnkg4oCUIGFsbCBvZiBib3hlcyBBIGFuZCBDLCBhbmQgZXZlcnkgbm9uLWVkMjU1MTkgc2xvdCBpbiBib3ggQiDigJQgaXMgYSBiYXJlIHN0cmluZyBhbmRcbiAgLy8gZmFpbHMgY2xvc2VkIGlmIGl0IGNhcnJpZXMgdGhlIG9iamVjdCBpbnN0ZWFkLlxuICBjb25zdCByZXF1aXJlQmFyZVN0cmluZyA9IChlbnRyeTogU2FmZUtleWNhcmRSb290RW50cnkpOiBzdHJpbmcgPT4ge1xuICAgIGlmIChFZDI1NTE5Q2hhaW5Db2RlRW50cnlDb2RlYy5pcyhlbnRyeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBlZDI1NTE5IGNoYWluLWNvZGUgZW50cnkgd2hlcmUgYSBiYXJlIHN0cmluZyB3YXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9O1xuXG4gIGNvbnN0IGRlY3J5cHRFZDI1NTE5QmFja3VwID0gYXN5bmMgKGVudHJ5OiBTYWZlS2V5Y2FyZFJvb3RFbnRyeSk6IFByb21pc2U8eyBwcnY6IHN0cmluZzsgY2hhaW5Db2RlOiBzdHJpbmcgfT4gPT4ge1xuICAgIGlmICghRWQyNTUxOUNoYWluQ29kZUVudHJ5Q29kZWMuaXMoZW50cnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VkMjU1MTkgYmFja3VwIHJvb3QgbXVzdCBjYXJyeSBhIGNoYWluIGNvZGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcHJ2OiBhd2FpdCBkZWNyeXB0Um9vdChlbnRyeS5wcnYpLCBjaGFpbkNvZGU6IGVudHJ5LmNoYWluQ29kZSB9O1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc2VjcDI1NmsxTXVsdGlzaWc6IHtcbiAgICAgIHVzZXI6IGF3YWl0IGRlY3J5cHRSb290KHJlcXVpcmVCYXJlU3RyaW5nKHVzZXJSb290cy5zZWNwMjU2azFNdWx0aXNpZykpLFxuICAgICAgYmFja3VwOiBhd2FpdCBkZWNyeXB0Um9vdChyZXF1aXJlQmFyZVN0cmluZyhiYWNrdXBSb290cy5zZWNwMjU2azFNdWx0aXNpZykpLFxuICAgICAgYml0Z286IHJlcXVpcmVCYXJlU3RyaW5nKGJpdGdvUm9vdHMuc2VjcDI1NmsxTXVsdGlzaWcpLFxuICAgIH0sXG4gICAgZWQyNTUxOU11bHRpc2lnOiB7XG4gICAgICB1c2VyOiBhd2FpdCBkZWNyeXB0Um9vdChyZXF1aXJlQmFyZVN0cmluZyh1c2VyUm9vdHMuZWQyNTUxOU11bHRpc2lnKSksXG4gICAgICBiYWNrdXA6IGF3YWl0IGRlY3J5cHRFZDI1NTE5QmFja3VwKGJhY2t1cFJvb3RzLmVkMjU1MTlNdWx0aXNpZyksXG4gICAgICBiaXRnbzogcmVxdWlyZUJhcmVTdHJpbmcoYml0Z29Sb290cy5lZDI1NTE5TXVsdGlzaWcpLFxuICAgIH0sXG4gICAgZWNkc2FNcGM6IHtcbiAgICAgIHVzZXI6IHVud3JhcE1wY1Jvb3QoYXdhaXQgZGVjcnlwdFJvb3QocmVxdWlyZUJhcmVTdHJpbmcodXNlclJvb3RzLmVjZHNhTXBjKSkpLFxuICAgICAgYmFja3VwOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KHJlcXVpcmVCYXJlU3RyaW5nKGJhY2t1cFJvb3RzLmVjZHNhTXBjKSkpLFxuICAgICAgYml0Z286IHJlcXVpcmVCYXJlU3RyaW5nKGJpdGdvUm9vdHMuZWNkc2FNcGMpLFxuICAgIH0sXG4gICAgZWRkc2FNcGM6IHtcbiAgICAgIHVzZXI6IHVud3JhcE1wY1Jvb3QoYXdhaXQgZGVjcnlwdFJvb3QocmVxdWlyZUJhcmVTdHJpbmcodXNlclJvb3RzLmVkZHNhTXBjKSkpLFxuICAgICAgYmFja3VwOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KHJlcXVpcmVCYXJlU3RyaW5nKGJhY2t1cFJvb3RzLmVkZHNhTXBjKSkpLFxuICAgICAgYml0Z286IHJlcXVpcmVCYXJlU3RyaW5nKGJpdGdvUm9vdHMuZWRkc2FNcGMpLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRGVyaXZlcyBhIFNhZmUgd2FsbGV0J3MgY2hpbGQga2V5cyBhdCB0aGUgQklQNDQgcGF0aCBmb3IgYSBnaXZlbiBzbG90IGFuZCBhY2NvdW50LlxuICogU3VwcG9ydHMgYWxsIGZvdXIgc2xvdHM6IGBzZWNwMjU2azFNdWx0aXNpZ2AsIGBlZDI1NTE5TXVsdGlzaWdgLCBgZWNkc2FNcGNgLCBhbmQgYGVkZHNhTXBjYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcml2ZVNhZmVXYWxsZXRLZXlzKHBhcmFtczoge1xuICBjb2luOiBzdHJpbmc7XG4gIHNsb3Q6IFJvb3RLZXlUeXBlO1xuICBhY2NvdW50OiBudW1iZXI7XG4gIHJvb3RzOiBEZWNyeXB0ZWRTYWZlUm9vdHM7XG59KTogUHJvbWlzZTxEZXJpdmVkU2FmZVdhbGxldEtleXM+IHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcmFtcy5hY2NvdW50KSB8fCBwYXJhbXMuYWNjb3VudCA8IDAgfHwgcGFyYW1zLmFjY291bnQgPiBNQVhfQklQMzJfSU5ERVgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlcml2ZVNhZmVXYWxsZXRLZXlzOiBpbnZhbGlkIGFjY291bnQgJyR7cGFyYW1zLmFjY291bnR9J2ApO1xuICB9XG5cbiAgY29uc3QgeyBhY2NvdW50LCByb290cyB9ID0gcGFyYW1zO1xuICBjb25zdCBwYXRoID0gYnVpbGRTYWZlQmlwNDRQYXRoKGdldFNhZmVCaXA0NENvaW5UeXBlKHBhcmFtcy5jb2luKSwgcGFyYW1zLnNsb3QsIGFjY291bnQpO1xuICBjb25zdCB7IGNvaW5UeXBlLCBzbG90T3JkaW5hbCB9ID0gcGFyc2VTYWZlQmlwNDRQYXRoKHBhdGgpO1xuXG4gIGlmIChwYXJhbXMuc2xvdCA9PT0gJ3NlY3AyNTZrMU11bHRpc2lnJykge1xuICAgIHJldHVybiB7IHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsIHBhdGgsIGtleXM6IGRlcml2ZVNhZmVDaGlsZFRyaXBsZXQocm9vdHMuc2VjcDI1NmsxTXVsdGlzaWcsIHBhdGgpIH07XG4gIH1cblxuICBpZiAocGFyYW1zLnNsb3QgPT09ICdlY2RzYU1wYycpIHtcbiAgICBjb25zdCB7IGNvbW1vbktleWNoYWluLCB1c2VyQ2hpbGQsIGJhY2t1cENoaWxkIH0gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZGVyaXZlU2FmZUVjZHNhTXBjQ2hpbGQoe1xuICAgICAgdXNlclJvb3Q6IHJvb3RzLmVjZHNhTXBjLnVzZXIsXG4gICAgICBiYWNrdXBSb290OiByb290cy5lY2RzYU1wYy5iYWNrdXAsXG4gICAgICBhY2NvdW50LFxuICAgICAgY29pblR5cGUsXG4gICAgICBzYWZlU2xvdE9yZGluYWw6IHNsb3RPcmRpbmFsLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzbG90OiAnZWNkc2FNcGMnLFxuICAgICAgcGF0aCxcbiAgICAgIGtleXM6IHsgY29tbW9uS2V5Y2hhaW4sIHVzZXI6IHVzZXJDaGlsZCwgYmFja3VwOiBiYWNrdXBDaGlsZCB9LFxuICAgIH07XG4gIH1cblxuICBpZiAocGFyYW1zLnNsb3QgPT09ICdlZGRzYU1wYycpIHtcbiAgICBjb25zdCB7IGNvbW1vbktleWNoYWluLCB1c2VyQ2hpbGQsIGJhY2t1cENoaWxkIH0gPSBhd2FpdCBNcHNWcmZVdGlscy5kZXJpdmVTYWZlRWRkc2FNcGNDaGlsZCh7XG4gICAgICB1c2VyUm9vdDogcm9vdHMuZWRkc2FNcGMudXNlcixcbiAgICAgIGJhY2t1cFJvb3Q6IHJvb3RzLmVkZHNhTXBjLmJhY2t1cCxcbiAgICAgIGFjY291bnQsXG4gICAgICBjb2luVHlwZSxcbiAgICAgIHNhZmVTbG90T3JkaW5hbDogc2xvdE9yZGluYWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNsb3Q6ICdlZGRzYU1wYycsXG4gICAgICBwYXRoLFxuICAgICAga2V5czogeyBjb21tb25LZXljaGFpbiwgdXNlcjogdXNlckNoaWxkLCBiYWNrdXA6IGJhY2t1cENoaWxkIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2xvdCA9PT0gJ2VkMjU1MTlNdWx0aXNpZycpIHtcbiAgICBjb25zdCByb290ID0gcm9vdHMuZWQyNTUxOU11bHRpc2lnO1xuICAgIGNvbnN0IGNvc2lnbmVyUGF0aCA9IHRvU29mdFR3aW5QYXRoKHBhdGgpO1xuXG4gICAgY29uc3QgdXNlciA9IGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZChyb290LnVzZXIsIHBhdGgpO1xuICAgIGNvbnN0IGJhY2t1cCA9IGF3YWl0IHNvZnREZXJpdmVDaGlsZFBydkVkMjU1MTlBdFBhdGgoe1xuICAgICAgc2VlZFN0cktleTogcm9vdC5iYWNrdXAucHJ2LFxuICAgICAgY2hhaW5Db2RlOiByb290LmJhY2t1cC5jaGFpbkNvZGUsXG4gICAgICBwYXRoOiBjb3NpZ25lclBhdGgsXG4gICAgfSk7XG4gICAgY29uc3QgYml0Z28gPSBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5QXRQYXRoKHJvb3QuYml0Z28sIGNvc2lnbmVyUGF0aCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgICBwYXRoLFxuICAgICAga2V5czoge1xuICAgICAgICB1c2VyOiB7IGtpbmQ6ICdzZWVkJywgc2VlZDogdXNlci5wcnYsIHB1YjogZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSh1c2VyLnB1YikudG9TdHJpbmcoJ2hleCcpIH0sXG4gICAgICAgIGJhY2t1cDoge1xuICAgICAgICAgIGtpbmQ6ICdleHRlbmRlZCcsXG4gICAgICAgICAga0w6IGJhY2t1cC5rTC50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAga1I6IGJhY2t1cC5rUi50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgcHViOiBiYWNrdXAucHViLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSxcbiAgICAgICAgYml0Z286IHsgcHViOiBiaXRnby50b1N0cmluZygnaGV4JykgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgZGVyaXZlU2FmZVdhbGxldEtleXM6IHNsb3QgJyR7cGFyYW1zLnNsb3R9JyBpcyBub3Qgc3VwcG9ydGVkIHlldGApO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUga2V5IGZpZWxkcyBgY29pbi5yZWNvdmVyKClgIGV4cGVjdHMgZnJvbSBkZXJpdmVkIFNhZmUgY2hpbGQga2V5cy5cbiAqIE9ubHkgYHNlY3AyNTZrMU11bHRpc2lnYCAoc2xvdCAxKSBpcyBzdXBwb3J0ZWQgZm9yIG5vdy4gU2lnbmVkIG1vZGUgcmUtZW5jcnlwdHMgdGhlXG4gKiBjaGlsZCB4cHJ2cyB1bmRlciBhIGZyZXNoIGVwaGVtZXJhbCBwYXNzcGhyYXNlICh2MS9TSkNMKTsgdW5zaWduZWQgbW9kZSByZXR1cm5zIHB1YnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHBhcmFtczoge1xuICBiaXRnbzogQml0R29CYXNlO1xuICBjb2luOiBzdHJpbmc7XG4gIHNsb3Q6IFJvb3RLZXlUeXBlO1xuICBrZXlzOiBTZWNwMjU2azFNdWx0aXNpZ0NoaWxkS2V5cztcbiAgbW9kZTogJ3NpZ25lZCcgfCAndW5zaWduZWQnO1xufSk6IFByb21pc2U8U2FmZVJlY292ZXJLZXlQYXJhbXM+IHtcbiAgaWYgKHBhcmFtcy5zbG90ICE9PSAnc2VjcDI1NmsxTXVsdGlzaWcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zOiBzbG90ICcke3BhcmFtcy5zbG90fScgaXMgbm90IHN1cHBvcnRlZCB5ZXRgKTtcbiAgfVxuICBjb25zdCB7IGJpdGdvLCBrZXlzLCBtb2RlIH0gPSBwYXJhbXM7XG5cbiAgaWYgKG1vZGUgPT09ICd1bnNpZ25lZCcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcktleToga2V5cy51c2VyLnB1YixcbiAgICAgIGJhY2t1cEtleToga2V5cy5iYWNrdXAucHViLFxuICAgICAgYml0Z29LZXk6IGtleXMuYml0Z28ucHViLFxuICAgIH07XG4gIH1cblxuICBjb25zdCB1c2VyUHJ2ID0gYmlwMzIuZnJvbUJhc2U1OChrZXlzLnVzZXIucHJ2KTtcbiAgY29uc3QgYmFja3VwUHJ2ID0gYmlwMzIuZnJvbUJhc2U1OChrZXlzLmJhY2t1cC5wcnYpO1xuICBpZiAoIXVzZXJQcnYucHJpdmF0ZUtleSB8fCAhYmFja3VwUHJ2LnByaXZhdGVLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXM6IGtleXMudXNlci5wcnYgYW5kIGtleXMuYmFja3VwLnBydiBtdXN0IGJlIHByaXZhdGUgeHBydnMnKTtcbiAgfVxuXG4gIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSByYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBbdXNlcktleSwgYmFja3VwS2V5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBiaXRnby5lbmNyeXB0KHsgaW5wdXQ6IGtleXMudXNlci5wcnYsIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0aW9uVmVyc2lvbjogMSB9KSxcbiAgICBiaXRnby5lbmNyeXB0KHsgaW5wdXQ6IGtleXMuYmFja3VwLnBydiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRpb25WZXJzaW9uOiAxIH0pLFxuICBdKTtcblxuICByZXR1cm4ge1xuICAgIHVzZXJLZXksXG4gICAgYmFja3VwS2V5LFxuICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvLnB1YixcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICB9O1xufVxuIl19
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZJQSxnREFvRUM7QUFNRCxvREE2RUM7QUE0Q0QsOERBeUNDO0FBelhEOzs7O0dBSUc7QUFDSCxtQ0FBZ0M7QUFDaEMsbUNBQXFDO0FBQ3JDLG1EQUE2QztBQUM3QyxpREFBc0Q7QUFFdEQsNkRBYW1DO0FBQ25DLCtEQU0rQjtBQUMvQix5REFBb0U7QUFFcEUsc0NBQW1EO0FBQ25ELG9FQUF5RTtBQTJHbEUsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BTXhDO0lBQ0MsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFMUUsTUFBTSxTQUFTLEdBQUcsSUFBQSxtQ0FBbUIsRUFBQyxVQUFVLENBQUMsQ0FBQztJQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFBLG1DQUFtQixFQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sVUFBVSxHQUFHLElBQUEsbUNBQW1CLEVBQUMsV0FBVyxDQUFDLENBQUM7SUFFcEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLElBQVksRUFBbUIsRUFBRTtRQUMxRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSwrQkFBc0IsQ0FBQywrREFBK0QsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxTQUFpQixFQUF3QixFQUFFO1FBQ2hFLElBQUksQ0FBQztZQUNILE9BQU8sSUFB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QUM7UUFDdEMsZ0JBQWdCO1FBQ2hCLFdBQVc7UUFDWCxvQkFBb0IsRUFBRTtZQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQzFCLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QixTQUFTLEVBQUUsQ0FDVCxNQUFNLElBQUEseUNBQW1CLEVBQ3ZCLGVBQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQ3BCLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQ2xDLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQ25DLENBQ0YsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2FBQ2xCLENBQUM7U0FDSDtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFdSVy1mYWNpbmcgc2FmZSByZWNvdmVyeSBlbnRyeSBwb2ludHMuXG4gKi9cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IE1BWF9CSVAzMl9JTkRFWCB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHR5cGUgeyBSb290S2V5VHlwZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHtcbiAgYnVpbGRTYWZlQmlwNDRQYXRoLFxuICBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5LFxuICBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQsXG4gIGRlcml2ZVNhZmVDaGlsZFRyaXBsZXQsXG4gIEVkMjU1MTlDaGFpbkNvZGVFbnRyeUNvZGVjLFxuICBnZXRTYWZlQmlwNDRDb2luVHlwZSxcbiAgcGFyc2VTYWZlQmlwNDRQYXRoLFxuICBwYXJzZVNhZmVLZXljYXJkQm94LFxuICB0b1NvZnRUd2luUGF0aCxcbiAgYWxnb011bHRpc2lnQWRkcmVzcyxcbiAgZW5jb2RlQWxnb0tleSxcbiAgdHlwZSBTYWZlS2V5Y2FyZFJvb3RFbnRyeSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1zYWZlcyc7XG5pbXBvcnQge1xuICBzaWduRWQyNTUxOUV4dGVuZGVkLFxuICBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5QXRQYXRoLFxuICBzb2Z0RGVyaXZlQ2hpbGRQcnZFZDI1NTE5QXRQYXRoLFxuICB0eXBlIEVkMjU1MTlFeHRlbmRlZEtleVBhcnRzLFxuICB0eXBlIEV4dGVybmFsRWQyNTUxOVNpZ25lcixcbn0gZnJvbSAnLi9kZXJpdmFibGVFZDI1NTE5UHViJztcbmltcG9ydCB7IERrbHNWcmZVdGlscywgTXBzVnJmVXRpbHMgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBwYXJzZVNhZmVNcGNLZXlFbnZlbG9wZXMgfSBmcm9tICcuLi91dGlscy90c3Mva2V5U2hhcmVFbnZlbG9wZSc7XG5cbmV4cG9ydCB0eXBlIERlY3J5cHRlZE1wY1NhZmVSb290ID0geyBzaWduaW5nOiBCdWZmZXI7IHZyZjogQnVmZmVyIH07XG5cbmV4cG9ydCB0eXBlIE9uY2hhaW5TYWZlUm9vdCA9IHsgdXNlcjogc3RyaW5nOyBiYWNrdXA6IHN0cmluZzsgYml0Z286IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgTXBjU2FmZVJvb3QgPSB7IHVzZXI6IERlY3J5cHRlZE1wY1NhZmVSb290OyBiYWNrdXA6IERlY3J5cHRlZE1wY1NhZmVSb290OyBiaXRnbzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBFZDI1NTE5TXVsdGlzaWdTYWZlUm9vdCA9IHtcbiAgdXNlcjogc3RyaW5nO1xuICBiYWNrdXA6IHsgcHJ2OiBzdHJpbmc7IGNoYWluQ29kZTogc3RyaW5nIH07XG4gIGJpdGdvOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTZWNwMjU2azFNdWx0aXNpZ0NoaWxkS2V5cyA9IHtcbiAgdXNlcjogeyBwcnY6IHN0cmluZzsgcHViOiBzdHJpbmcgfTtcbiAgYmFja3VwOiB7IHBydjogc3RyaW5nOyBwdWI6IHN0cmluZyB9O1xuICBiaXRnbzogeyBwdWI6IHN0cmluZyB9O1xufTtcblxuZXhwb3J0IHR5cGUgRWNkc2FNcGNDaGlsZEtleXMgPSB7XG4gIGNvbW1vbktleWNoYWluOiBzdHJpbmc7XG4gIHVzZXI6IHN0cmluZztcbiAgYmFja3VwOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBFZGRzYU1wY0NoaWxkS2V5cyA9IEVjZHNhTXBjQ2hpbGRLZXlzO1xuXG4vKipcbiAqIEEgaGFyZGVuZWQgKFNMSVAtMDAxMCkgZWQyNTUxOSBjaGlsZC4gVGhlIGBraW5kYCBkaXNjcmltaW5hdG9yIHByZXZlbnRzIGEgcmF3IHNlZWQgZnJvbSBiZWluZ1xuICogbWlzdGFrZW4gZm9yIGFuIGV4dGVuZGVkIGtleSBkb3duc3RyZWFtIOKAlCBib3RoIGFyZSAzMi1ieXRlIHZhbHVlcyB0aGF0IGBpc1ZhbGlkUHViYCB3b3VsZCBhY2NlcHQuXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVFZDI1NTE5U2VlZEtleSA9IHtcbiAgcmVhZG9ubHkga2luZDogJ3NlZWQnO1xuICByZWFkb25seSBzZWVkOiBzdHJpbmc7IC8vIDMyLWJ5dGUgY2hpbGQgc2VlZCAoaGV4KSDigJQgdGhlIHNpZ25lciBpbnB1dFxuICByZWFkb25seSBwdWI6IHN0cmluZzsgLy8gMzItYnl0ZSBwdWJsaWMga2V5IChoZXgpXG59O1xuXG4vKipcbiAqIEEgc29mdCAoQklQMzItRWQyNTUxOSkgZWQyNTUxOSBjaGlsZC4gTm8gMzItYnl0ZSBzZWVkIG1hcHMgYmFjayB0byBhIHNvZnQtZGVyaXZlZCBjaGlsZCwgc28gdGhlXG4gKiBzaWduZXIgbmVlZHMgYm90aCBoYWx2ZXMgZGlyZWN0bHk6IGBrTGAgKHRoZSBjbGFtcGVkIHNjYWxhcikgYW5kIGBrUmAgKHRoZSBub25jZSBwcmVmaXgpLlxuICovXG5leHBvcnQgdHlwZSBTYWZlRWQyNTUxOUV4dGVuZGVkS2V5ID0geyByZWFkb25seSBraW5kOiAnZXh0ZW5kZWQnIH0gJiBFZDI1NTE5RXh0ZW5kZWRLZXlQYXJ0czxzdHJpbmc+OyAvLyBoZXhcblxuLyoqIFRoZSB0aHJlZSBlZDI1NTE5IGNvLXNpZ25lciBjaGlsZHJlbi4gQml0R28gaXMgcHViLW9ubHk6IGl0cyBwcml2YXRlIGtleSBzdGF5cyBpbiB0aGUgSFNNLiAqL1xuZXhwb3J0IHR5cGUgRWQyNTUxOU11bHRpc2lnQ2hpbGRLZXlzID0ge1xuICB1c2VyOiBTYWZlRWQyNTUxOVNlZWRLZXk7XG4gIGJhY2t1cDogU2FmZUVkMjU1MTlFeHRlbmRlZEtleTtcbiAgYml0Z286IHsgcmVhZG9ubHkgcHViOiBzdHJpbmcgfTtcbn07XG5cbmV4cG9ydCB0eXBlIERlcml2ZWRTYWZlV2FsbGV0S2V5cyA9XG4gIHwgeyBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnOyBwYXRoOiBzdHJpbmc7IGtleXM6IFNlY3AyNTZrMU11bHRpc2lnQ2hpbGRLZXlzIH1cbiAgfCB7IHNsb3Q6ICdlY2RzYU1wYyc7IHBhdGg6IHN0cmluZzsga2V5czogRWNkc2FNcGNDaGlsZEtleXMgfVxuICB8IHsgc2xvdDogJ2VkZHNhTXBjJzsgcGF0aDogc3RyaW5nOyBrZXlzOiBFZGRzYU1wY0NoaWxkS2V5cyB9XG4gIHwgeyBzbG90OiAnZWQyNTUxOU11bHRpc2lnJzsgcGF0aDogc3RyaW5nOyBrZXlzOiBFZDI1NTE5TXVsdGlzaWdDaGlsZEtleXMgfTtcblxuZXhwb3J0IHR5cGUgU2VjcFNhZmVSZWNvdmVyS2V5UGFyYW1zID0ge1xuICBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBTbG90LTIgKGVkMjU1MTlNdWx0aXNpZykgc2FmZSByZWNvdmVyeSBrZXkgcGFyYW1zLiBBIGRpc2NyaW1pbmF0ZWQgdW5pb24gb24gYG1vZGVgLCBzbyB0aGUgaW52YWxpZFxuICogY29tYm9zIGFyZSBub3QgcmVwcmVzZW50YWJsZTogc2lnbmVkIG1vZGUgYWx3YXlzIGNhcnJpZXMgdGhlIGxhenkgc2lnbmVyIGFuZCBuZXZlciBhIGBiYWNrdXBLZXlgLFxuICogdW5zaWduZWQgbW9kZSBhbHdheXMgY2FycmllcyB0aGUgZW5jb2RlZCBgYmFja3VwS2V5YCBhbmQgbmV2ZXIgYSBzaWduZXIgb3IgcGFzc3BocmFzZS5cbiAqXG4gKiBgcm9vdEFkZHJlc3NgIGlzIHRoZSB3YWxsZXQncyBvbi1jaGFpbiBhZGRyZXNzLiBGb3IgQUxHTyBpdCdzIHRoZSAyLW9mLTMgbXVsdGlzaWcgYWRkcmVzcyBvdmVyIHRoZVxuICogdGhyZWUgY2hpbGQgcHVicyDigJQgZGVyaXZhYmxlIGhlcmUsIGJ1dCBgcmVjb3ZlcigpYCBzdGlsbCByZXF1aXJlcyBpdCBhcyBpbnB1dC4gTm90ZSB0aGlzIGlzXG4gKiAqZGVyaXZlZCosIG5vdCBpbmRlcGVuZGVudGx5IHZlcmlmaWVkIGFnYWluc3QgYSBrbm93biB3YWxsZXQgYWRkcmVzczsgY2FsbGVycyB3aXRoIGEgcmVjb3JkZWRcbiAqIGFkZHJlc3Mgc2hvdWxkIGNyb3NzLWNoZWNrIGl0IHRoZW1zZWx2ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEVkMjU1MTlTYWZlUmVjb3ZlcktleVBhcmFtcyA9XG4gIHwge1xuICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZyc7XG4gICAgICBtb2RlOiAnc2lnbmVkJztcbiAgICAgIHVzZXJLZXk6IHN0cmluZztcbiAgICAgIGJpdGdvS2V5OiBzdHJpbmc7XG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgICByb290QWRkcmVzczogc3RyaW5nO1xuICAgICAgLyoqXG4gICAgICAgKiBMYXp5IHNpZ25lciBmb3IgdGhlIHNlZWRsZXNzIGJhY2t1cCBjaGlsZC4gVGhlIGJhY2t1cCBjaGlsZCBoYXMgbm8gc2VlZCwgc28gaXQgY2Fubm90IGJlXG4gICAgICAgKiBzZWVkLXNpZ25lZDsgYW5kIGl0cyBzaWduYXR1cmUgbXVzdCBjb3ZlciBgdHguYnl0ZXNUb1NpZ24oKWAsIHdoaWNoIG9ubHkgZXhpc3RzIG9uY2VcbiAgICAgICAqIGByZWNvdmVyKClgIGJ1aWxkcyB0aGUgdHguIFNvIGluc3RlYWQgb2YgYSBwcmUtbWFkZSBzaWduYXR1cmUgd2UgcGFzcyBhIGNsb3N1cmUgdGhhdCBob2xkc1xuICAgICAgICogdGhlIHByaXZhdGUgYGtMYC9ga1JgIGFuZCBzaWducyBvbiBkZW1hbmQg4oCUIHRoZSBwcml2YXRlIGhhbHZlcyBuZXZlciBsZWF2ZSBpdC5cbiAgICAgICAqL1xuICAgICAgZXh0ZXJuYWxCYWNrdXBTaWduZXI6IEV4dGVybmFsRWQyNTUxOVNpZ25lcjtcbiAgICB9XG4gIHwge1xuICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZyc7XG4gICAgICBtb2RlOiAndW5zaWduZWQnO1xuICAgICAgdXNlcktleTogc3RyaW5nO1xuICAgICAgYmFja3VwS2V5OiBzdHJpbmc7XG4gICAgICBiaXRnb0tleTogc3RyaW5nO1xuICAgICAgcm9vdEFkZHJlc3M6IHN0cmluZztcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBTYWZlUmVjb3ZlcktleVBhcmFtcyA9IFNlY3BTYWZlUmVjb3ZlcktleVBhcmFtcyB8IEVkMjU1MTlTYWZlUmVjb3ZlcktleVBhcmFtcztcblxuZXhwb3J0IHR5cGUgRGVjcnlwdGVkU2FmZVJvb3RzID0ge1xuICBzZWNwMjU2azFNdWx0aXNpZzogT25jaGFpblNhZmVSb290O1xuICBlZDI1NTE5TXVsdGlzaWc6IEVkMjU1MTlNdWx0aXNpZ1NhZmVSb290O1xuICBlY2RzYU1wYzogTXBjU2FmZVJvb3Q7XG4gIGVkZHNhTXBjOiBNcGNTYWZlUm9vdDtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0U2FmZUtleWNhcmQocGFyYW1zOiB7XG4gIGJpdGdvOiBCaXRHb0Jhc2U7XG4gIHVzZXJLZXlCb3g6IHN0cmluZztcbiAgYmFja3VwS2V5Qm94OiBzdHJpbmc7XG4gIGJpdGdvS2V5Qm94OiBzdHJpbmc7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG59KTogUHJvbWlzZTxEZWNyeXB0ZWRTYWZlUm9vdHM+IHtcbiAgY29uc3QgeyBiaXRnbywgdXNlcktleUJveCwgYmFja3VwS2V5Qm94LCBiaXRnb0tleUJveCwgcGFzc3dvcmQgfSA9IHBhcmFtcztcblxuICBjb25zdCB1c2VyUm9vdHMgPSBwYXJzZVNhZmVLZXljYXJkQm94KHVzZXJLZXlCb3gpO1xuICBjb25zdCBiYWNrdXBSb290cyA9IHBhcnNlU2FmZUtleWNhcmRCb3goYmFja3VwS2V5Qm94KTtcbiAgY29uc3QgYml0Z29Sb290cyA9IHBhcnNlU2FmZUtleWNhcmRCb3goYml0Z29LZXlCb3gpO1xuXG4gIGNvbnN0IGRlY3J5cHRSb290ID0gYXN5bmMgKHJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBiaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHJvb3QsIHBhc3N3b3JkIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCd1bmFibGUgdG8gZGVjcnlwdCB0aGUgc2FmZSBrZXljYXJkIHdpdGggdGhlIHByb3ZpZGVkIHBhc3N3b3JkJywgZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHVud3JhcE1wY1Jvb3QgPSAoZGVjcnlwdGVkOiBzdHJpbmcpOiBEZWNyeXB0ZWRNcGNTYWZlUm9vdCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXJzZVNhZmVNcGNLZXlFbnZlbG9wZXMoZGVjcnlwdGVkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcigndW5hYmxlIHRvIGRlY3J5cHQgdGhlIHNhZmUga2V5Y2FyZCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzd29yZCcsIGUpO1xuICAgIH1cbiAgfTtcblxuICAvLyBPbmx5IGJveCBCJ3MgZWQyNTUxOU11bHRpc2lnIHNsb3QgbWF5IGNhcnJ5IHRoZSBkZXJpdmFibGUgYHsgcHJ2LCBjaGFpbkNvZGUgfWAgb2JqZWN0OyBldmVyeVxuICAvLyBvdGhlciBlbnRyeSDigJQgYWxsIG9mIGJveGVzIEEgYW5kIEMsIGFuZCBldmVyeSBub24tZWQyNTUxOSBzbG90IGluIGJveCBCIOKAlCBpcyBhIGJhcmUgc3RyaW5nIGFuZFxuICAvLyBmYWlscyBjbG9zZWQgaWYgaXQgY2FycmllcyB0aGUgb2JqZWN0IGluc3RlYWQuXG4gIGNvbnN0IHJlcXVpcmVCYXJlU3RyaW5nID0gKGVudHJ5OiBTYWZlS2V5Y2FyZFJvb3RFbnRyeSk6IHN0cmluZyA9PiB7XG4gICAgaWYgKEVkMjU1MTlDaGFpbkNvZGVFbnRyeUNvZGVjLmlzKGVudHJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGVkMjU1MTkgY2hhaW4tY29kZSBlbnRyeSB3aGVyZSBhIGJhcmUgc3RyaW5nIHdhcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH07XG5cbiAgY29uc3QgZGVjcnlwdEVkMjU1MTlCYWNrdXAgPSBhc3luYyAoZW50cnk6IFNhZmVLZXljYXJkUm9vdEVudHJ5KTogUHJvbWlzZTx7IHBydjogc3RyaW5nOyBjaGFpbkNvZGU6IHN0cmluZyB9PiA9PiB7XG4gICAgaWYgKCFFZDI1NTE5Q2hhaW5Db2RlRW50cnlDb2RlYy5pcyhlbnRyeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZWQyNTUxOSBiYWNrdXAgcm9vdCBtdXN0IGNhcnJ5IGEgY2hhaW4gY29kZScpO1xuICAgIH1cbiAgICByZXR1cm4geyBwcnY6IGF3YWl0IGRlY3J5cHRSb290KGVudHJ5LnBydiksIGNoYWluQ29kZTogZW50cnkuY2hhaW5Db2RlIH07XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzZWNwMjU2azFNdWx0aXNpZzoge1xuICAgICAgdXNlcjogYXdhaXQgZGVjcnlwdFJvb3QocmVxdWlyZUJhcmVTdHJpbmcodXNlclJvb3RzLnNlY3AyNTZrMU11bHRpc2lnKSksXG4gICAgICBiYWNrdXA6IGF3YWl0IGRlY3J5cHRSb290KHJlcXVpcmVCYXJlU3RyaW5nKGJhY2t1cFJvb3RzLnNlY3AyNTZrMU11bHRpc2lnKSksXG4gICAgICBiaXRnbzogcmVxdWlyZUJhcmVTdHJpbmcoYml0Z29Sb290cy5zZWNwMjU2azFNdWx0aXNpZyksXG4gICAgfSxcbiAgICBlZDI1NTE5TXVsdGlzaWc6IHtcbiAgICAgIHVzZXI6IGF3YWl0IGRlY3J5cHRSb290KHJlcXVpcmVCYXJlU3RyaW5nKHVzZXJSb290cy5lZDI1NTE5TXVsdGlzaWcpKSxcbiAgICAgIGJhY2t1cDogYXdhaXQgZGVjcnlwdEVkMjU1MTlCYWNrdXAoYmFja3VwUm9vdHMuZWQyNTUxOU11bHRpc2lnKSxcbiAgICAgIGJpdGdvOiByZXF1aXJlQmFyZVN0cmluZyhiaXRnb1Jvb3RzLmVkMjU1MTlNdWx0aXNpZyksXG4gICAgfSxcbiAgICBlY2RzYU1wYzoge1xuICAgICAgdXNlcjogdW53cmFwTXBjUm9vdChhd2FpdCBkZWNyeXB0Um9vdChyZXF1aXJlQmFyZVN0cmluZyh1c2VyUm9vdHMuZWNkc2FNcGMpKSksXG4gICAgICBiYWNrdXA6IHVud3JhcE1wY1Jvb3QoYXdhaXQgZGVjcnlwdFJvb3QocmVxdWlyZUJhcmVTdHJpbmcoYmFja3VwUm9vdHMuZWNkc2FNcGMpKSksXG4gICAgICBiaXRnbzogcmVxdWlyZUJhcmVTdHJpbmcoYml0Z29Sb290cy5lY2RzYU1wYyksXG4gICAgfSxcbiAgICBlZGRzYU1wYzoge1xuICAgICAgdXNlcjogdW53cmFwTXBjUm9vdChhd2FpdCBkZWNyeXB0Um9vdChyZXF1aXJlQmFyZVN0cmluZyh1c2VyUm9vdHMuZWRkc2FNcGMpKSksXG4gICAgICBiYWNrdXA6IHVud3JhcE1wY1Jvb3QoYXdhaXQgZGVjcnlwdFJvb3QocmVxdWlyZUJhcmVTdHJpbmcoYmFja3VwUm9vdHMuZWRkc2FNcGMpKSksXG4gICAgICBiaXRnbzogcmVxdWlyZUJhcmVTdHJpbmcoYml0Z29Sb290cy5lZGRzYU1wYyksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIGEgU2FmZSB3YWxsZXQncyBjaGlsZCBrZXlzIGF0IHRoZSBCSVA0NCBwYXRoIGZvciBhIGdpdmVuIHNsb3QgYW5kIGFjY291bnQuXG4gKiBTdXBwb3J0cyBhbGwgZm91ciBzbG90czogYHNlY3AyNTZrMU11bHRpc2lnYCwgYGVkMjU1MTlNdWx0aXNpZ2AsIGBlY2RzYU1wY2AsIGFuZCBgZWRkc2FNcGNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVyaXZlU2FmZVdhbGxldEtleXMocGFyYW1zOiB7XG4gIGNvaW46IHN0cmluZztcbiAgc2xvdDogUm9vdEtleVR5cGU7XG4gIGFjY291bnQ6IG51bWJlcjtcbiAgcm9vdHM6IERlY3J5cHRlZFNhZmVSb290cztcbn0pOiBQcm9taXNlPERlcml2ZWRTYWZlV2FsbGV0S2V5cz4ge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFyYW1zLmFjY291bnQpIHx8IHBhcmFtcy5hY2NvdW50IDwgMCB8fCBwYXJhbXMuYWNjb3VudCA+IE1BWF9CSVAzMl9JTkRFWCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZGVyaXZlU2FmZVdhbGxldEtleXM6IGludmFsaWQgYWNjb3VudCAnJHtwYXJhbXMuYWNjb3VudH0nYCk7XG4gIH1cblxuICBjb25zdCB7IGFjY291bnQsIHJvb3RzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBhdGggPSBidWlsZFNhZmVCaXA0NFBhdGgoZ2V0U2FmZUJpcDQ0Q29pblR5cGUocGFyYW1zLmNvaW4pLCBwYXJhbXMuc2xvdCwgYWNjb3VudCk7XG4gIGNvbnN0IHsgY29pblR5cGUsIHNsb3RPcmRpbmFsIH0gPSBwYXJzZVNhZmVCaXA0NFBhdGgocGF0aCk7XG5cbiAgaWYgKHBhcmFtcy5zbG90ID09PSAnc2VjcDI1NmsxTXVsdGlzaWcnKSB7XG4gICAgcmV0dXJuIHsgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJywgcGF0aCwga2V5czogZGVyaXZlU2FmZUNoaWxkVHJpcGxldChyb290cy5zZWNwMjU2azFNdWx0aXNpZywgcGF0aCkgfTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2xvdCA9PT0gJ2VjZHNhTXBjJykge1xuICAgIGNvbnN0IHsgY29tbW9uS2V5Y2hhaW4sIHVzZXJDaGlsZCwgYmFja3VwQ2hpbGQgfSA9IGF3YWl0IERrbHNWcmZVdGlscy5kZXJpdmVTYWZlRWNkc2FNcGNDaGlsZCh7XG4gICAgICB1c2VyUm9vdDogcm9vdHMuZWNkc2FNcGMudXNlcixcbiAgICAgIGJhY2t1cFJvb3Q6IHJvb3RzLmVjZHNhTXBjLmJhY2t1cCxcbiAgICAgIGFjY291bnQsXG4gICAgICBjb2luVHlwZSxcbiAgICAgIHNhZmVTbG90T3JkaW5hbDogc2xvdE9yZGluYWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNsb3Q6ICdlY2RzYU1wYycsXG4gICAgICBwYXRoLFxuICAgICAga2V5czogeyBjb21tb25LZXljaGFpbiwgdXNlcjogdXNlckNoaWxkLCBiYWNrdXA6IGJhY2t1cENoaWxkIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2xvdCA9PT0gJ2VkZHNhTXBjJykge1xuICAgIGNvbnN0IHsgY29tbW9uS2V5Y2hhaW4sIHVzZXJDaGlsZCwgYmFja3VwQ2hpbGQgfSA9IGF3YWl0IE1wc1ZyZlV0aWxzLmRlcml2ZVNhZmVFZGRzYU1wY0NoaWxkKHtcbiAgICAgIHVzZXJSb290OiByb290cy5lZGRzYU1wYy51c2VyLFxuICAgICAgYmFja3VwUm9vdDogcm9vdHMuZWRkc2FNcGMuYmFja3VwLFxuICAgICAgYWNjb3VudCxcbiAgICAgIGNvaW5UeXBlLFxuICAgICAgc2FmZVNsb3RPcmRpbmFsOiBzbG90T3JkaW5hbCxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc2xvdDogJ2VkZHNhTXBjJyxcbiAgICAgIHBhdGgsXG4gICAgICBrZXlzOiB7IGNvbW1vbktleWNoYWluLCB1c2VyOiB1c2VyQ2hpbGQsIGJhY2t1cDogYmFja3VwQ2hpbGQgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHBhcmFtcy5zbG90ID09PSAnZWQyNTUxOU11bHRpc2lnJykge1xuICAgIGNvbnN0IHJvb3QgPSByb290cy5lZDI1NTE5TXVsdGlzaWc7XG4gICAgY29uc3QgY29zaWduZXJQYXRoID0gdG9Tb2Z0VHdpblBhdGgocGF0aCk7XG5cbiAgICBjb25zdCB1c2VyID0gZGVyaXZlU2FmZUNoaWxkRWQyNTUxOUhhcmRlbmVkKHJvb3QudXNlciwgcGF0aCk7XG4gICAgY29uc3QgYmFja3VwID0gYXdhaXQgc29mdERlcml2ZUNoaWxkUHJ2RWQyNTUxOUF0UGF0aCh7XG4gICAgICBzZWVkU3RyS2V5OiByb290LmJhY2t1cC5wcnYsXG4gICAgICBjaGFpbkNvZGU6IHJvb3QuYmFja3VwLmNoYWluQ29kZSxcbiAgICAgIHBhdGg6IGNvc2lnbmVyUGF0aCxcbiAgICB9KTtcbiAgICBjb25zdCBiaXRnbyA9IGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTlBdFBhdGgocm9vdC5iaXRnbywgY29zaWduZXJQYXRoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzbG90OiAnZWQyNTUxOU11bHRpc2lnJyxcbiAgICAgIHBhdGgsXG4gICAgICBrZXlzOiB7XG4gICAgICAgIHVzZXI6IHsga2luZDogJ3NlZWQnLCBzZWVkOiB1c2VyLnBydiwgcHViOiBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KHVzZXIucHViKS50b1N0cmluZygnaGV4JykgfSxcbiAgICAgICAgYmFja3VwOiB7XG4gICAgICAgICAga2luZDogJ2V4dGVuZGVkJyxcbiAgICAgICAgICBrTDogYmFja3VwLmtMLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBrUjogYmFja3VwLmtSLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBwdWI6IGJhY2t1cC5wdWIudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9LFxuICAgICAgICBiaXRnbzogeyBwdWI6IGJpdGdvLnRvU3RyaW5nKCdoZXgnKSB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBkZXJpdmVTYWZlV2FsbGV0S2V5czogc2xvdCAnJHtwYXJhbXMuc2xvdH0nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0YCk7XG59XG5cbi8qKlxuICogUGVyLWNvaW4gZW5jb2RlcnMgZm9yIHRoZSBgZWQyNTUxOU11bHRpc2lnYCBzbG90OiBlYWNoIHNsb3QtMiBjb2luIHJlLWVuY29kZXMgdGhlIHNhbWUgMzItYnl0ZVxuICogY2hpbGRyZW4gaW50byBpdHMgb3duIGFkZHJlc3Mvc2VlZCBzdHJpbmcgZm9ybWF0cy4gQSBjb2luIGFic2VudCBmcm9tIHRoZSByZWdpc3RyeSBpcyBub3QgeWV0XG4gKiBzdXBwb3J0ZWQgZm9yIHNsb3QtMiByZWNvdmVyeSAoeGxtL2hiYXIgYXJlIGZ1dHVyZSBhcm1zKS5cbiAqL1xuY29uc3QgRUQyNTUxOV9NVUxUSVNJR19DT0lOX0VOQ09ERVJTOiBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgeyBlbmNvZGVQdWI6IChieXRlczogQnVmZmVyKSA9PiBzdHJpbmc7IGVuY29kZVNlZWQ6IChieXRlczogQnVmZmVyKSA9PiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuPiA9IHtcbiAgYWxnbzogeyBlbmNvZGVQdWI6IGVuY29kZUFsZ29LZXksIGVuY29kZVNlZWQ6IGVuY29kZUFsZ29LZXkgfSxcbiAgdGFsZ286IHsgZW5jb2RlUHViOiBlbmNvZGVBbGdvS2V5LCBlbmNvZGVTZWVkOiBlbmNvZGVBbGdvS2V5IH0sXG59O1xuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHNoYXBlIGZvciBgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtc2AuIFRoZSBgc2xvdGAgbGl0ZXJhbCBpcyB0aGUgZGlzY3JpbWluYW50IHRoYXRcbiAqIHRpZXMgZWFjaCBzbG90IHRvIGl0cyBvd24gYGtleXNgIHNoYXBlLCBzbyBUeXBlU2NyaXB0IG5hcnJvd3MgYHBhcmFtcy5rZXlzYCBhdXRvbWF0aWNhbGx5IGFuZCBhXG4gKiBzbG90IGFkZGVkIHdpdGhvdXQgYSBicmFuY2ggaXMgYSBjb21waWxlIGVycm9yIHJhdGhlciB0aGFuIGEgc2lsZW50IGNhc3QuXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVSZWNvdmVyS2V5UGFyYW1zUmVxdWVzdCA9IHtcbiAgYml0Z286IEJpdEdvQmFzZTtcbiAgY29pbjogc3RyaW5nO1xuICBtb2RlOiAnc2lnbmVkJyB8ICd1bnNpZ25lZCc7XG59ICYgKFxuICB8IHsgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJzsga2V5czogU2VjcDI1NmsxTXVsdGlzaWdDaGlsZEtleXMgfVxuICB8IHsgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZyc7IGtleXM6IEVkMjU1MTlNdWx0aXNpZ0NoaWxkS2V5cyB9XG4gIHwgeyBzbG90OiAnZWNkc2FNcGMnOyBrZXlzOiBFY2RzYU1wY0NoaWxkS2V5cyB9XG4gIHwgeyBzbG90OiAnZWRkc2FNcGMnOyBrZXlzOiBFZGRzYU1wY0NoaWxkS2V5cyB9XG4pO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUga2V5IGZpZWxkcyBgY29pbi5yZWNvdmVyKClgIGV4cGVjdHMgZnJvbSBkZXJpdmVkIFNhZmUgY2hpbGQga2V5cy5cbiAqIFN1cHBvcnRzIGBzZWNwMjU2azFNdWx0aXNpZ2AgKHNsb3QgMSkgYW5kIGBlZDI1NTE5TXVsdGlzaWdgIChzbG90IDIpOyB0aGUgTVBDIHNsb3RzIGZhaWwgY2xvc2VkLlxuICogU2lnbmVkIG1vZGUgcmUtZW5jcnlwdHMgdGhlIGNoaWxkIHNlY3JldHMgdW5kZXIgYSBmcmVzaCBlcGhlbWVyYWwgcGFzc3BocmFzZSAodjEvU0pDTCk7IHVuc2lnbmVkXG4gKiBtb2RlIHJldHVybnMgcHVicy4gYHJvb3RBZGRyZXNzYCBpcyBkZXJpdmVkIGZyb20gdGhlIGNoaWxkIGtleXMsIG5vdCBpbmRlcGVuZGVudGx5IHZlcmlmaWVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyhcbiAgcGFyYW1zOiBFeHRyYWN0PFNhZmVSZWNvdmVyS2V5UGFyYW1zUmVxdWVzdCwgeyBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnIH0+XG4pOiBQcm9taXNlPFNlY3BTYWZlUmVjb3ZlcktleVBhcmFtcz47XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyhcbiAgcGFyYW1zOiBFeHRyYWN0PFNhZmVSZWNvdmVyS2V5UGFyYW1zUmVxdWVzdCwgeyBzbG90OiAnZWQyNTUxOU11bHRpc2lnJyB9PlxuKTogUHJvbWlzZTxFZDI1NTE5U2FmZVJlY292ZXJLZXlQYXJhbXM+O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMocGFyYW1zOiBTYWZlUmVjb3ZlcktleVBhcmFtc1JlcXVlc3QpOiBQcm9taXNlPFNhZmVSZWNvdmVyS2V5UGFyYW1zPjtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHBhcmFtczogU2FmZVJlY292ZXJLZXlQYXJhbXNSZXF1ZXN0KTogUHJvbWlzZTxTYWZlUmVjb3ZlcktleVBhcmFtcz4ge1xuICBjb25zdCB7IGJpdGdvLCBtb2RlIH0gPSBwYXJhbXM7XG5cbiAgaWYgKHBhcmFtcy5zbG90ID09PSAnZWQyNTUxOU11bHRpc2lnJykge1xuICAgIHJldHVybiBidWlsZEVkMjU1MTlNdWx0aXNpZ1JlY292ZXJLZXlQYXJhbXMoYml0Z28sIHBhcmFtcy5jb2luLCBwYXJhbXMua2V5cywgbW9kZSk7XG4gIH1cblxuICBpZiAocGFyYW1zLnNsb3QgPT09ICdzZWNwMjU2azFNdWx0aXNpZycpIHtcbiAgICBjb25zdCBrZXlzID0gcGFyYW1zLmtleXM7XG5cbiAgICBpZiAobW9kZSA9PT0gJ3Vuc2lnbmVkJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJyxcbiAgICAgICAgdXNlcktleToga2V5cy51c2VyLnB1YixcbiAgICAgICAgYmFja3VwS2V5OiBrZXlzLmJhY2t1cC5wdWIsXG4gICAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvLnB1YixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclBydiA9IGJpcDMyLmZyb21CYXNlNTgoa2V5cy51c2VyLnBydik7XG4gICAgY29uc3QgYmFja3VwUHJ2ID0gYmlwMzIuZnJvbUJhc2U1OChrZXlzLmJhY2t1cC5wcnYpO1xuICAgIGlmICghdXNlclBydi5wcml2YXRlS2V5IHx8ICFiYWNrdXBQcnYucHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zOiBrZXlzLnVzZXIucHJ2IGFuZCBrZXlzLmJhY2t1cC5wcnYgbXVzdCBiZSBwcml2YXRlIHhwcnZzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9IHJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgW3VzZXJLZXksIGJhY2t1cEtleV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBiaXRnby5lbmNyeXB0KHsgaW5wdXQ6IGtleXMudXNlci5wcnYsIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0aW9uVmVyc2lvbjogMSB9KSxcbiAgICAgIGJpdGdvLmVuY3J5cHQoeyBpbnB1dDoga2V5cy5iYWNrdXAucHJ2LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGlvblZlcnNpb246IDEgfSksXG4gICAgXSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJyxcbiAgICAgIHVzZXJLZXksXG4gICAgICBiYWNrdXBLZXksXG4gICAgICBiaXRnb0tleToga2V5cy5iaXRnby5wdWIsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH07XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXM6IHNsb3QgJyR7cGFyYW1zLnNsb3R9JyBpcyBub3Qgc3VwcG9ydGVkIHlldGApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEVkMjU1MTlNdWx0aXNpZ1JlY292ZXJLZXlQYXJhbXMoXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIGNvaW46IHN0cmluZyxcbiAga2V5czogRWQyNTUxOU11bHRpc2lnQ2hpbGRLZXlzLFxuICBtb2RlOiAnc2lnbmVkJyB8ICd1bnNpZ25lZCdcbik6IFByb21pc2U8RWQyNTUxOVNhZmVSZWNvdmVyS2V5UGFyYW1zPiB7XG4gIGNvbnN0IGVuY29kZXJzID0gRUQyNTUxOV9NVUxUSVNJR19DT0lOX0VOQ09ERVJTW2NvaW5dO1xuICBpZiAoIWVuY29kZXJzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zOiBjb2luICcke2NvaW59JyBlZDI1NTE5TXVsdGlzaWcgaXMgbm90IHN1cHBvcnRlZCB5ZXRgKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHViIG9mIFtrZXlzLnVzZXIucHViLCBrZXlzLmJhY2t1cC5wdWIsIGtleXMuYml0Z28ucHViXSkge1xuICAgIC8vIHN0cmljdCBoZXgsIG5vdCBsZW5ndGgtb25seTogQnVmZmVyLmZyb20ocHViLCAnaGV4JykgdHJ1bmNhdGVzIGF0IHRoZSBmaXJzdCBiYWQgcGFpciwgc28gYVxuICAgIC8vIGxlbmd0aCBjaGVjayBhbG9uZSB3b3VsZCBhY2NlcHQgdHJhaWxpbmcgZ2FyYmFnZVxuICAgIGlmICghL15bMC05YS1mXXs2NH0kL2kudGVzdChwdWIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXM6IGVkMjU1MTkgY2hpbGQgcHVibGljIGtleXMgbXVzdCBiZSAzMiBieXRlcycpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVzZXJQdWIgPSBCdWZmZXIuZnJvbShrZXlzLnVzZXIucHViLCAnaGV4Jyk7XG4gIGNvbnN0IGJhY2t1cFB1YiA9IEJ1ZmZlci5mcm9tKGtleXMuYmFja3VwLnB1YiwgJ2hleCcpO1xuICBjb25zdCBiaXRnb1B1YiA9IEJ1ZmZlci5mcm9tKGtleXMuYml0Z28ucHViLCAnaGV4Jyk7XG5cbiAgLy8gQWxnb3JhbmQgd2FsbGV0IGFkZHJlc3NlcyBhcmUgdGhlIHZlcnNpb24tMSAyLW9mLTMgbXVsdGlzaWcgYWRkcmVzcyBvdmVyIHRoZSB0aHJlZSBjaGlsZCBwdWJzXG4gIC8vIGluIHdhbGxldC1jcmVhdGlvbiBvcmRlci4gYEFsZ28ucmVjb3ZlcigpYCByZWNvbXB1dGVzIGFuZCBlbmZvcmNlcyB0aGUgc2FtZSB2YWx1ZSBhbmQgdGhyb3dzXG4gIC8vIGBSZWNvdmVyeUtleU1pc21hdGNoRXJyb3JgIG9uIGFueSBtaXNtYXRjaCAoc2RrLWNvaW4tYWxnby9zcmMvYWxnby50cykuXG4gIGNvbnN0IHJvb3RBZGRyZXNzID0gYWxnb011bHRpc2lnQWRkcmVzcygxLCAyLCBbdXNlclB1YiwgYmFja3VwUHViLCBiaXRnb1B1Yl0pO1xuXG4gIGlmIChtb2RlID09PSAndW5zaWduZWQnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNsb3Q6ICdlZDI1NTE5TXVsdGlzaWcnLFxuICAgICAgbW9kZTogJ3Vuc2lnbmVkJyxcbiAgICAgIHVzZXJLZXk6IGVuY29kZXJzLmVuY29kZVB1Yih1c2VyUHViKSxcbiAgICAgIGJhY2t1cEtleTogZW5jb2RlcnMuZW5jb2RlUHViKGJhY2t1cFB1YiksXG4gICAgICBiaXRnb0tleTogZW5jb2RlcnMuZW5jb2RlUHViKGJpdGdvUHViKSxcbiAgICAgIHJvb3RBZGRyZXNzLFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgdXNlciBjaGlsZCBpcyBhIGhhcmRlbmVkIFNMSVAtMDAxMCBzZWVkLCBzbyBpdCByZS1lbmNyeXB0cyBleGFjdGx5IGxpa2Ugc2xvdCAxLiBUaGUgYmFja3VwXG4gIC8vIGNoaWxkIGlzIGEgc2VlZGxlc3Mgc29mdCBleHRlbmRlZCBrZXk6IGl0IGNhbm5vdCBiZSByZS1lbmNyeXB0ZWQgYXMgYSBzZWVkLCBzbyBpdCBiZWNvbWVzIGEgbGF6eVxuICAvLyBleHRlcm5hbCBzaWduZXIgb3ZlciB0aGUgdHggYnl0ZXMgKFdDTi0yODk1J3MgZXh0ZW5kZWQta2V5IHNpZ25lciwgaW52b2tlZCBieSB0aGUgY29pbikuXG4gIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSByYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCB1c2VyS2V5ID0gYXdhaXQgYml0Z28uZW5jcnlwdCh7XG4gICAgaW5wdXQ6IGVuY29kZXJzLmVuY29kZVNlZWQoQnVmZmVyLmZyb20oa2V5cy51c2VyLnNlZWQsICdoZXgnKSksXG4gICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgbW9kZTogJ3NpZ25lZCcsXG4gICAgdXNlcktleSxcbiAgICBiaXRnb0tleTogZW5jb2RlcnMuZW5jb2RlUHViKGJpdGdvUHViKSxcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIHJvb3RBZGRyZXNzLFxuICAgIGV4dGVybmFsQmFja3VwU2lnbmVyOiB7XG4gICAgICBwdWJsaWNLZXk6IGtleXMuYmFja3VwLnB1YixcbiAgICAgIHNpZ246IGFzeW5jIChtZXNzYWdlKSA9PiAoe1xuICAgICAgICBzaWduYXR1cmU6IChcbiAgICAgICAgICBhd2FpdCBzaWduRWQyNTUxOUV4dGVuZGVkKFxuICAgICAgICAgICAgQnVmZmVyLmZyb20obWVzc2FnZSksXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShrZXlzLmJhY2t1cC5rTCwgJ2hleCcpLFxuICAgICAgICAgICAgQnVmZmVyLmZyb20oa2V5cy5iYWNrdXAua1IsICdoZXgnKVxuICAgICAgICAgIClcbiAgICAgICAgKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KSxcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
@@ -189,5 +189,56 @@ describe('derivableEd25519Pub', function () {
|
|
|
189
189
|
await (0, src_1.signEd25519Extended)(message, Buffer.alloc(32), Buffer.alloc(33)).should.be.rejectedWith(/kR length/);
|
|
190
190
|
});
|
|
191
191
|
});
|
|
192
|
+
describe('ExternalEd25519Signer', function () {
|
|
193
|
+
const message = Buffer.from('external-signer message');
|
|
194
|
+
const keyPair = nacl.sign.keyPair.fromSeed(Buffer.alloc(32, 0x42));
|
|
195
|
+
const publicKey = Buffer.from(keyPair.publicKey).toString('hex');
|
|
196
|
+
const otherKeyPair = nacl.sign.keyPair.fromSeed(Buffer.alloc(32, 0x77));
|
|
197
|
+
const validSigner = {
|
|
198
|
+
publicKey,
|
|
199
|
+
sign: async (m) => ({
|
|
200
|
+
signature: Buffer.from(nacl.sign.detached(m, keyPair.secretKey)).toString('hex'),
|
|
201
|
+
}),
|
|
202
|
+
};
|
|
203
|
+
it('rejects a malformed public key', function () {
|
|
204
|
+
(() => (0, src_1.assertValidExternalEd25519Signer)({
|
|
205
|
+
publicKey: 'not-hex',
|
|
206
|
+
sign: async () => ({ signature: 'a'.repeat(128) }),
|
|
207
|
+
})).should.throw(/expected 32 bytes/);
|
|
208
|
+
});
|
|
209
|
+
it('rejects a public key with trailing garbage after 64 hex chars', function () {
|
|
210
|
+
// Buffer.from(pub, 'hex') truncates at the first bad pair, so a length-only check would
|
|
211
|
+
// accept this; the strict regex must not.
|
|
212
|
+
(() => (0, src_1.assertValidExternalEd25519Signer)({
|
|
213
|
+
publicKey: 'f1'.repeat(32) + 'zz',
|
|
214
|
+
sign: async () => ({ signature: 'a'.repeat(128) }),
|
|
215
|
+
})).should.throw(/expected 32 bytes/);
|
|
216
|
+
});
|
|
217
|
+
it('rejects a signer without a sign function', function () {
|
|
218
|
+
(() => (0, src_1.assertValidExternalEd25519Signer)({
|
|
219
|
+
publicKey,
|
|
220
|
+
sign: undefined,
|
|
221
|
+
})).should.throw(/sign must be a function/);
|
|
222
|
+
});
|
|
223
|
+
it('rejects a non-64-byte signature', async function () {
|
|
224
|
+
await (0, src_1.signWithExternalEd25519Signer)({ publicKey, sign: async () => ({ signature: 'ab' }) }, message).should.be.rejectedWith(/expected 64 bytes/);
|
|
225
|
+
});
|
|
226
|
+
it('rejects when sign resolves to a non-object', async function () {
|
|
227
|
+
await (0, src_1.signWithExternalEd25519Signer)({ publicKey, sign: async () => null }, message).should.be.rejectedWith(/sign must resolve to \{ signature: string \}/);
|
|
228
|
+
});
|
|
229
|
+
it('rejects a well-formed signature from the wrong key', async function () {
|
|
230
|
+
await (0, src_1.signWithExternalEd25519Signer)({
|
|
231
|
+
publicKey,
|
|
232
|
+
sign: async (m) => ({
|
|
233
|
+
signature: Buffer.from(nacl.sign.detached(m, otherKeyPair.secretKey)).toString('hex'),
|
|
234
|
+
}),
|
|
235
|
+
}, message).should.be.rejectedWith(/does not verify against its public key/);
|
|
236
|
+
});
|
|
237
|
+
it('signs and returns a verified 64-byte signature', async function () {
|
|
238
|
+
const signature = await (0, src_1.signWithExternalEd25519Signer)(validSigner, message);
|
|
239
|
+
signature.should.match(/^[0-9a-f]{128}$/);
|
|
240
|
+
nacl.sign.detached.verify(message, Buffer.from(signature, 'hex'), keyPair.publicKey).should.equal(true);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
192
243
|
});
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsbUNBQW9DO0FBQ3BDLGdEQUFrQztBQUNsQyx5Q0FzQnlCO0FBRXpCLHdEQUF3RDtBQUN4RCxtR0FBbUc7QUFDbkcsOEVBQThFO0FBQzlFLDZFQUErRDtBQUUvRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUEsK0JBQXlCLEVBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsTUFBTSxhQUFhLEdBQUcsMERBQTBELENBQUM7QUFDakYsTUFBTSxXQUFXLEdBQUcsMERBQTBELENBQUM7QUFFL0UsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtRQUM3QixFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsd0NBQWtDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRCxrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDekMsSUFB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QUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRSxxRkFBcUY7WUFDckYsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLO1lBQzdDLE1BQU0sSUFBQSx5QkFBbUIsRUFBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0csTUFBTSxJQUFBLHlCQUFtQixFQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7XG4gIERFUklWQUJMRV9FRDI1NTE5X0NIQUlOX0NPREVfQllURVMsXG4gIERFUklWQUJMRV9FRDI1NTE5X1BVQl9MRU5HVEgsXG4gIEVkMjU1MTlCSVAzMixcbiAgRWRkc2EsXG4gIGJpZ0ludEZyb21CdWZmZXJMRSxcbiAgYmlnSW50VG9CdWZmZXJMRSxcbiAgY2xhbXAsXG4gIGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIsXG4gIGRlY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG4gIGRlY29kZUVkMjU1MTlTdHJLZXlTZWNyZXRTZWVkLFxuICBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViLFxuICBlbmNvZGVFZDI1NTE5Q2hhaW5Db2RlLFxuICBlbmNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5LFxuICBnZW5lcmF0ZUVkMjU1MTlDaGFpbkNvZGUsXG4gIGlzQ2hlY2tzdW1WYWxpZFN0cktleUVkMjU1MTlQdWIsXG4gIGlzRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG4gIHNpZ25FZDI1NTE5RXh0ZW5kZWQsXG4gIHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTksXG4gIHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTlBdFBhdGgsXG4gIHNvZnREZXJpdmVDaGlsZFBydkVkMjU1MTlBdFBhdGgsXG59IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5cbi8vIENyb3NzLXJlcG8gZml4dHVyZTogYnl0ZS1pZGVudGljYWwgdG8gd2FsbGV0LXBsYXRmb3JtXG4vLyB0ZXN0L3VuaXQvYmFzZS9zYWZlcy9maXh0dXJlcy9kZXJpdmFibGVFZDI1NTE5UHViLmpzb24uIEZvdXIgaW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoaXNcbi8vIGZvcm1hdCB3aWxsIG90aGVyd2lzZSBkcmlmdCwgYW5kIHRoZSBmYWlsdXJlIG1vZGUgaXMgdW5yZWNvdmVyYWJsZSB3YWxsZXRzLlxuaW1wb3J0ICogYXMgZml4dHVyZSBmcm9tICcuL2ZpeHR1cmVzL2Rlcml2YWJsZUVkMjU1MTlQdWIuanNvbic7XG5cbmNvbnN0IFBVQkxJQ19LRVkgPSBCdWZmZXIuYWxsb2MoMzIpO1xuY29uc3QgQ0hBSU5fQ09ERSA9IEJ1ZmZlci5hbGxvYygzMiwgMHhhYik7XG5jb25zdCBST09UX1BVQiA9IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIoUFVCTElDX0tFWSwgQ0hBSU5fQ09ERSk7XG5jb25zdCBST09UX0tFWUNIQUlOID0gQnVmZmVyLmNvbmNhdChbUFVCTElDX0tFWSwgQ0hBSU5fQ09ERV0pLnRvU3RyaW5nKCdoZXgnKTtcbmNvbnN0IFNUUktFWV9QVUJMSUMgPSAnR0E1V1VKNTRaMjNLSUxMQ1VPVU5BS1RQQlZaV0tNUVZPNE82RVE1R0hMQUVSSU1MTEhOQ1NLWUgnO1xuY29uc3QgU1RSS0VZX1NFRUQgPSAnU0FBQUNBUURBUUNRTUJZSUJFRkFXREFOQllIUkFFSVNDTUtCS0ZRWERBTVJVR1k0RFVQQjZOS0knO1xuXG5kZXNjcmliZSgnZGVyaXZhYmxlRWQyNTUxOVB1YicsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2Jhc2UzMiByb290IGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZW5jb2RlcyAzMi1ieXRlIHB1YmxpYyBrZXkgcGx1cyAzMi1ieXRlIGNoYWluIGNvZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0JZVEVTLnNob3VsZC5lcXVhbCgzMik7XG4gICAgICBERVJJVkFCTEVfRUQyNTUxOV9QVUJfTEVOR1RILnNob3VsZC5lcXVhbCgxMDMpO1xuICAgICAgUk9PVF9QVUIuc2hvdWxkLm1hdGNoKC9eW0EtWjItN117MTAzfSQvKTtcbiAgICAgIGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIoUk9PVF9QVUIpLnB1Yi5lcXVhbHMoUFVCTElDX0tFWSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihST09UX1BVQikuY2hhaW5Db2RlLmVxdWFscyhDSEFJTl9DT0RFKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWF0Y2hlcyB0aGUgY29uc3RhbnRzIHBpbm5lZCBpbiB0aGUgc2hhcmVkIGZpeHR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBERVJJVkFCTEVfRUQyNTUxOV9QVUJfTEVOR1RILnNob3VsZC5lcXVhbChmaXh0dXJlLnJvb3RQdWJCYXNlMzJMZW5ndGgpO1xuICAgICAgREVSSVZBQkxFX0VEMjU1MTlfQ0hBSU5fQ09ERV9CWVRFUy5zaG91bGQuZXF1YWwoZml4dHVyZS5jaGFpbkNvZGVCeXRlcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2VuZXJhdGVzIHJhdyBjaGFpbiBjb2RlIGZvciByb290IGNvbXBvc2l0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgZ2VuZXJhdGVFZDI1NTE5Q2hhaW5Db2RlKCkubGVuZ3RoLnNob3VsZC5lcXVhbCgzMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmaXh0dXJlIHZlY3RvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChjb25zdCB2ZWN0b3Igb2YgZml4dHVyZS52YWxpZCkge1xuICAgICAgaXQoYHJvdW5kLXRyaXBzICR7dmVjdG9yLm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb21wb3NpdGUgPSBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKHZlY3Rvci5wdWIsICdoZXgnKSxcbiAgICAgICAgICBCdWZmZXIuZnJvbSh2ZWN0b3IuY2hhaW5Db2RlLCAnaGV4JylcbiAgICAgICAgKTtcbiAgICAgICAgY29tcG9zaXRlLnNob3VsZC5lcXVhbCh2ZWN0b3IuY29tcG9zaXRlKTtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIodmVjdG9yLmNvbXBvc2l0ZSk7XG4gICAgICAgIGRlY29kZWQucHViLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwodmVjdG9yLnB1Yik7XG4gICAgICAgIGRlY29kZWQuY2hhaW5Db2RlLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwodmVjdG9yLmNoYWluQ29kZSk7XG4gICAgICAgIGlzRGVyaXZhYmxlRWQyNTUxOVB1Yih2ZWN0b3IuY29tcG9zaXRlKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHZlY3RvciBvZiBmaXh0dXJlLmludmFsaWRDb21wb3NpdGUpIHtcbiAgICAgIGl0KGByZWplY3RzICR7dmVjdG9yLm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpc0Rlcml2YWJsZUVkMjU1MTlQdWIodmVjdG9yLmNvbXBvc2l0ZSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgICAgKCgpID0+IGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIodmVjdG9yLmNvbXBvc2l0ZSkpLnNob3VsZC50aHJvdygvSW52YWxpZCBkZXJpdmFibGUgZWQyNTUxOSBwdWIvKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JhdyBwdWJsaWMgc29mdCBkZXJpdmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdkZXJpdmVzIGEgZGV0ZXJtaW5pc3RpYyBwdWJsaWMga2V5IGFuZCBkaXNjYXJkcyB0aGUgY2hpbGQgY2hhaW4gY29kZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVkZHNhID0gYXdhaXQgRWRkc2EuaW5pdGlhbGl6ZShhd2FpdCBFZDI1NTE5QklQMzIuaW5pdGlhbGl6ZSgpKTtcbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBlZGRzYS5kZXJpdmVVbmhhcmRlbmVkKFJPT1RfS0VZQ0hBSU4sICdtLzcnKTtcbiAgICAgIGRlcml2ZWQubGVuZ3RoLnNob3VsZC5lcXVhbCgxMjgpO1xuICAgICAgZGVyaXZlZC5zbGljZSgwLCA2NCkuc2hvdWxkLm1hdGNoKC9eWzAtOWEtZl17NjR9JC8pO1xuICAgICAgZGVyaXZlZC5zbGljZSg2NCkuc2hvdWxkLm1hdGNoKC9eWzAtOWEtZl17NjR9JC8pO1xuICAgICAgKGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkoUk9PVF9QVUIsIDcpKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKGRlcml2ZWQuc2xpY2UoMCwgNjQpKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBnb2xkZW4gdmVjdG9ycyBiZWxvdyBwaW4gdGhlIHVuaGFyZGVuZWQgZGVyaXZhdGlvbiBvdXRwdXQgc2hhcmVkIGNyb3NzLXJlcG8gd2l0aFxuICAgIC8vIHdhbGxldC1wbGF0Zm9ybTogYSBkaXZlcmdlbnQgaW1wbGVtZW50YXRpb24gZGVyaXZlcyBjby1zaWduZXIga2V5cyBub2JvZHkgZWxzZSBjYW5cbiAgICAvLyByZXByb2R1Y2UsIHBlcm1hbmVudGx5IGJyaWNraW5nIHRoZSB3YWxsZXRzIG1pbnRlZCB3aXRoIGl0LlxuICAgIGZvciAoY29uc3QgdmVjdG9yIG9mIGZpeHR1cmUuc29mdERlcml2YXRpb24pIHtcbiAgICAgIGl0KGBkZXJpdmVzIHRoZSBwaW5uZWQgZ29sZGVuIGNoaWxkOiAke3ZlY3Rvci5uYW1lfWAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVGhlIHB1Yi9jaGFpbkNvZGUgZmllbGRzIG11c3QgZW5jb2RlIHRvIHRoZSBjb21wb3NpdGUgYWN0dWFsbHkgZGVyaXZlZCBmcm9tLlxuICAgICAgICBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKEJ1ZmZlci5mcm9tKHZlY3Rvci5wdWIsICdoZXgnKSwgQnVmZmVyLmZyb20odmVjdG9yLmNoYWluQ29kZSwgJ2hleCcpKS5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgdmVjdG9yLmNvbXBvc2l0ZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjaGlsZCA9IGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkodmVjdG9yLmNvbXBvc2l0ZSwgdmVjdG9yLmluZGV4KTtcbiAgICAgICAgY2hpbGQudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh2ZWN0b3IuY2hpbGRQdWIpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ3JlamVjdHMgYSBoYXJkZW5lZCBvciBvdXQtb2YtcmFuZ2UgaW5kZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KFJPT1RfUFVCLCAtMSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm9uLWhhcmRlbmVkLyk7XG4gICAgICBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KFJPT1RfUFVCLCAweDgwMDAwMDAwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9ub24taGFyZGVuZWQvKTtcbiAgICAgIGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkoUk9PVF9QVUIsIDEuNSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm9uLWhhcmRlbmVkLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIG1hbGZvcm1lZCByb290JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShmaXh0dXJlLmludmFsaWRDb21wb3NpdGVbMV0uY29tcG9zaXRlLCAwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAvSW52YWxpZCBkZXJpdmFibGUgZWQyNTUxOSBwdWIvXG4gICAgICApO1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShTVFJLRVlfUFVCTElDLCAwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGRlcml2YWJsZSBlZDI1NTE5IHB1Yi8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbXVsdGktc2VnbWVudCBzb2Z0IGRlcml2YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2VlZCA9IGRlY29kZUVkMjU1MTlTdHJLZXlTZWNyZXRTZWVkKFNUUktFWV9TRUVEKTtcbiAgICBjb25zdCByb290UHViID0gQnVmZmVyLmZyb20obmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQoc2VlZCkucHVibGljS2V5KTtcbiAgICBjb25zdCByb290Q2hhaW5Db2RlID0gQnVmZmVyLmFsbG9jKDMyLCAweGFiKTtcbiAgICBjb25zdCBjb21wb3NpdGUgPSBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHJvb3RQdWIsIHJvb3RDaGFpbkNvZGUpO1xuICAgIGNvbnN0IGNoYWluQ29kZVN0ciA9IGVuY29kZUVkMjU1MTlDaGFpbkNvZGUocm9vdENoYWluQ29kZSk7XG5cbiAgICBpdCgncHJpdmF0ZSBkZXJpdmUgcHVibGljIGhhbGYgbWF0Y2hlcyBwdWJsaWMgZGVyaXZlIGF0IG0vMCBhbmQgbS80NC8yODMvMi8wJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIFsnbS8wJywgJ20vNDQvMjgzLzIvMCddKSB7XG4gICAgICAgIGNvbnN0IHB1YiA9IGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTlBdFBhdGgoY29tcG9zaXRlLCBwYXRoKTtcbiAgICAgICAgY29uc3QgcHJ2ID0gYXdhaXQgc29mdERlcml2ZUNoaWxkUHJ2RWQyNTUxOUF0UGF0aCh7IHNlZWRTdHJLZXk6IFNUUktFWV9TRUVELCBjaGFpbkNvZGU6IGNoYWluQ29kZVN0ciwgcGF0aCB9KTtcbiAgICAgICAgcHJ2LnB1Yi5lcXVhbHMocHViKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICAgIC8vIFJlY29tcHV0ZSB0aGUgcHVibGljIHBvaW50IGRpcmVjdGx5IGZyb20ga0wgdG8gcHJvdmUgdGhlIHByaXZhdGUgc2NhbGFyIG1hcHMgdG8gcHViLlxuICAgICAgICBiaWdJbnRUb0J1ZmZlckxFKEVkZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoYmlnSW50RnJvbUJ1ZmZlckxFKHBydi5rTCkpLCAzMilcbiAgICAgICAgICAuZXF1YWxzKHBydi5wdWIpXG4gICAgICAgICAgLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGhhcmRlbmVkIGFuZCBvdXQtb2YtcmFuZ2UgcGF0aHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5QXRQYXRoKGNvbXBvc2l0ZSwgXCJtLzAnXCIpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgc29mdCBkZXJpdmF0aW9uIHBhdGgvKTtcbiAgICAgIGF3YWl0IHNvZnREZXJpdmVDaGlsZFBydkVkMjU1MTlBdFBhdGgoe1xuICAgICAgICBzZWVkU3RyS2V5OiBTVFJLRVlfU0VFRCxcbiAgICAgICAgY2hhaW5Db2RlOiBjaGFpbkNvZGVTdHIsXG4gICAgICAgIHBhdGg6IFwibS8wJ1wiLFxuICAgICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBzb2Z0IGRlcml2YXRpb24gcGF0aC8pO1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOUF0UGF0aChjb21wb3NpdGUsICdtLzIxNDc0ODM2NDgnKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9vdXQgb2YgcmFuZ2UvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1N0ZWxsYXIgdXNlci1rZXkgY29kZWNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdrZWVwcyBTdGVsbGFyIGVuY29kaW5nIHNlcGFyYXRlIGZyb20gdGhlIG5ldXRyYWwgcm9vdCBmb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleShTVFJLRVlfUFVCTElDKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBlbmNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KGRlY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoU1RSS0VZX1BVQkxJQykpLnNob3VsZC5lcXVhbChTVFJLRVlfUFVCTElDKTtcbiAgICAgIGRlY29kZUVkMjU1MTlTdHJLZXlTZWNyZXRTZWVkKFNUUktFWV9TRUVEKS5sZW5ndGguc2hvdWxkLmVxdWFsKDMyKTtcbiAgICAgIGlzRGVyaXZhYmxlRWQyNTUxOVB1YihTVFJLRVlfUFVCTElDKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgaXNDaGVja3N1bVZhbGlkU3RyS2V5RWQyNTUxOVB1YihTVFJLRVlfUFVCTElDKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIHB1YmxpYyBrZXkgd2l0aCBhIGNvcnJ1cHRlZCBjaGVja3N1bScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KCdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZQScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIHNlY3JldCBzZWVkIHdoZXJlIGEgcHVibGljIGtleSBpcyByZXF1aXJlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KCdTQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCcpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICAoKCkgPT4gZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSgnU0E1V1VKNTRaMjNLSUxMQ1VPVU5BS1RQQlZaV0tNUVZPNE82RVE1R0hMQUVSSU1MTEhOQ1NLWUgnKSkuc2hvdWxkLnRocm93KFxuICAgICAgICAvU3RyS2V5IHB1YmxpYyBrZXkvXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBub24tYmFzZTMyIGNoYXJhY3RlciwgdGhlIGVtcHR5IHN0cmluZywgYW5kIGxvd2VyY2FzZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KCdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZMScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSgnJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KFNUUktFWV9QVUJMSUMudG9Mb3dlckNhc2UoKSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2V4dGVuZGVkLWtleSBzaWduaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNlZWQgPSBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZChTVFJLRVlfU0VFRCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IEJ1ZmZlci5mcm9tKCdleHRlbmRlZC1rZXkgc2lnbmF0dXJlJyk7XG4gICAgY29uc3Qgcm9vdENoYWluQ29kZSA9IEJ1ZmZlci5hbGxvYygzMiwgMHhhYik7XG4gICAgY29uc3QgY2hhaW5Db2RlU3RyID0gZW5jb2RlRWQyNTUxOUNoYWluQ29kZShyb290Q2hhaW5Db2RlKTtcblxuICAgIGl0KCdtYXRjaGVzIHRoZSBzZWVkLWJhc2VkIHNpZ25lciBmb3IgYSBzZWVkLWJhY2tlZCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBoID0gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNlZWQpLmRpZ2VzdCgpO1xuICAgICAgY29uc3Qga0wgPSBiaWdJbnRUb0J1ZmZlckxFKGNsYW1wKGJpZ0ludEZyb21CdWZmZXJMRShoLnN1YmFycmF5KDAsIDMyKSkpLCAzMik7XG4gICAgICBjb25zdCBrUiA9IGguc3ViYXJyYXkoMzIpO1xuICAgICAgY29uc3Qgc2lnID0gYXdhaXQgc2lnbkVkMjU1MTlFeHRlbmRlZChtZXNzYWdlLCBrTCwga1IpO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBCdWZmZXIuZnJvbShuYWNsLnNpZ24uZGV0YWNoZWQobWVzc2FnZSwgbmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQoc2VlZCkuc2VjcmV0S2V5KSk7XG4gICAgICBzaWcuZXF1YWxzKGV4cGVjdGVkKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2lnbnMgYSBzb2Z0LWRlcml2ZWQga2V5IHdpdGggbm8gc2VlZCBhbmQgdmVyaWZpZXMgYWdhaW5zdCBpdHMgcHViJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHJ2ID0gYXdhaXQgc29mdERlcml2ZUNoaWxkUHJ2RWQyNTUxOUF0UGF0aCh7XG4gICAgICAgIHNlZWRTdHJLZXk6IFNUUktFWV9TRUVELFxuICAgICAgICBjaGFpbkNvZGU6IGNoYWluQ29kZVN0cixcbiAgICAgICAgcGF0aDogJ20vMCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZyA9IGF3YWl0IHNpZ25FZDI1NTE5RXh0ZW5kZWQobWVzc2FnZSwgcHJ2LmtMLCBwcnYua1IpO1xuICAgICAgbmFjbC5zaWduLmRldGFjaGVkLnZlcmlmeShtZXNzYWdlLCBzaWcsIHBydi5wdWIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIC8vIFRoZSBzb2Z0LWRlcml2ZWQgc2NhbGFyIGhhcyBubyBzZWVkOiB0cmVhdGluZyBrTCBhcyBhIHNlZWQgeWllbGRzIGEgZGlmZmVyZW50IHB1Yi5cbiAgICAgIEJ1ZmZlci5mcm9tKG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKHBydi5rTCkucHVibGljS2V5KS5lcXVhbHMocHJ2LnB1Yikuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGtML2tSIHRoYXQgYXJlIG5vdCAzMiBieXRlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHNpZ25FZDI1NTE5RXh0ZW5kZWQobWVzc2FnZSwgQnVmZmVyLmFsbG9jKDMxKSwgQnVmZmVyLmFsbG9jKDMyKSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgva0wgbGVuZ3RoLyk7XG4gICAgICBhd2FpdCBzaWduRWQyNTUxOUV4dGVuZGVkKG1lc3NhZ2UsIEJ1ZmZlci5hbGxvYygzMiksIEJ1ZmZlci5hbGxvYygzMykpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2tSIGxlbmd0aC8pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsbUNBQW9DO0FBQ3BDLGdEQUFrQztBQUNsQyx5Q0F5QnlCO0FBRXpCLHdEQUF3RDtBQUN4RCxtR0FBbUc7QUFDbkcsOEVBQThFO0FBQzlFLDZFQUErRDtBQUUvRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUEsK0JBQXlCLEVBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsTUFBTSxhQUFhLEdBQUcsMERBQTBELENBQUM7QUFDakYsTUFBTSxXQUFXLEdBQUcsMERBQTBELENBQUM7QUFFL0UsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtRQUM3QixFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsd0NBQWtDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRCxrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDekMsSUFB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UyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUN0RixDQUFDO2FBQ0gsRUFDRCxPQUFPLENBQ1IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEtBQUs7WUFDeEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFBLG1DQUE2QixFQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RSxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQge1xuICBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0JZVEVTLFxuICBERVJJVkFCTEVfRUQyNTUxOV9QVUJfTEVOR1RILFxuICBFZDI1NTE5QklQMzIsXG4gIEVkZHNhLFxuICBiaWdJbnRGcm9tQnVmZmVyTEUsXG4gIGJpZ0ludFRvQnVmZmVyTEUsXG4gIGNsYW1wLFxuICBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViLFxuICBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5LFxuICBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZCxcbiAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgZW5jb2RlRWQyNTUxOUNoYWluQ29kZSxcbiAgZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSxcbiAgZ2VuZXJhdGVFZDI1NTE5Q2hhaW5Db2RlLFxuICBhc3NlcnRWYWxpZEV4dGVybmFsRWQyNTUxOVNpZ25lcixcbiAgc2lnbldpdGhFeHRlcm5hbEVkMjU1MTlTaWduZXIsXG4gIGlzQ2hlY2tzdW1WYWxpZFN0cktleUVkMjU1MTlQdWIsXG4gIGlzRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG4gIHNpZ25FZDI1NTE5RXh0ZW5kZWQsXG4gIHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTksXG4gIHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTlBdFBhdGgsXG4gIHNvZnREZXJpdmVDaGlsZFBydkVkMjU1MTlBdFBhdGgsXG4gIHR5cGUgRXh0ZXJuYWxFZDI1NTE5U2lnbmVyLFxufSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG4vLyBDcm9zcy1yZXBvIGZpeHR1cmU6IGJ5dGUtaWRlbnRpY2FsIHRvIHdhbGxldC1wbGF0Zm9ybVxuLy8gdGVzdC91bml0L2Jhc2Uvc2FmZXMvZml4dHVyZXMvZGVyaXZhYmxlRWQyNTUxOVB1Yi5qc29uLiBGb3VyIGluZGVwZW5kZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGlzXG4vLyBmb3JtYXQgd2lsbCBvdGhlcndpc2UgZHJpZnQsIGFuZCB0aGUgZmFpbHVyZSBtb2RlIGlzIHVucmVjb3ZlcmFibGUgd2FsbGV0cy5cbmltcG9ydCAqIGFzIGZpeHR1cmUgZnJvbSAnLi9maXh0dXJlcy9kZXJpdmFibGVFZDI1NTE5UHViLmpzb24nO1xuXG5jb25zdCBQVUJMSUNfS0VZID0gQnVmZmVyLmFsbG9jKDMyKTtcbmNvbnN0IENIQUlOX0NPREUgPSBCdWZmZXIuYWxsb2MoMzIsIDB4YWIpO1xuY29uc3QgUk9PVF9QVUIgPSBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKFBVQkxJQ19LRVksIENIQUlOX0NPREUpO1xuY29uc3QgUk9PVF9LRVlDSEFJTiA9IEJ1ZmZlci5jb25jYXQoW1BVQkxJQ19LRVksIENIQUlOX0NPREVdKS50b1N0cmluZygnaGV4Jyk7XG5jb25zdCBTVFJLRVlfUFVCTElDID0gJ0dBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lIJztcbmNvbnN0IFNUUktFWV9TRUVEID0gJ1NBQUFDQVFEQVFDUU1CWUlCRUZBV0RBTkJZSFJBRUlTQ01LQktGUVhEQU1SVUdZNERVUEI2TktJJztcblxuZGVzY3JpYmUoJ2Rlcml2YWJsZUVkMjU1MTlQdWInLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdiYXNlMzIgcm9vdCBmb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2VuY29kZXMgMzItYnl0ZSBwdWJsaWMga2V5IHBsdXMgMzItYnl0ZSBjaGFpbiBjb2RlJywgZnVuY3Rpb24gKCkge1xuICAgICAgREVSSVZBQkxFX0VEMjU1MTlfQ0hBSU5fQ09ERV9CWVRFUy5zaG91bGQuZXF1YWwoMzIpO1xuICAgICAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSC5zaG91bGQuZXF1YWwoMTAzKTtcbiAgICAgIFJPT1RfUFVCLnNob3VsZC5tYXRjaCgvXltBLVoyLTddezEwM30kLyk7XG4gICAgICBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKFJPT1RfUFVCKS5wdWIuZXF1YWxzKFBVQkxJQ19LRVkpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIoUk9PVF9QVUIpLmNoYWluQ29kZS5lcXVhbHMoQ0hBSU5fQ09ERSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ21hdGNoZXMgdGhlIGNvbnN0YW50cyBwaW5uZWQgaW4gdGhlIHNoYXJlZCBmaXh0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSC5zaG91bGQuZXF1YWwoZml4dHVyZS5yb290UHViQmFzZTMyTGVuZ3RoKTtcbiAgICAgIERFUklWQUJMRV9FRDI1NTE5X0NIQUlOX0NPREVfQllURVMuc2hvdWxkLmVxdWFsKGZpeHR1cmUuY2hhaW5Db2RlQnl0ZXMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dlbmVyYXRlcyByYXcgY2hhaW4gY29kZSBmb3Igcm9vdCBjb21wb3NpdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZSgpLmxlbmd0aC5zaG91bGQuZXF1YWwoMzIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZml4dHVyZSB2ZWN0b3JzJywgZnVuY3Rpb24gKCkge1xuICAgIGZvciAoY29uc3QgdmVjdG9yIG9mIGZpeHR1cmUudmFsaWQpIHtcbiAgICAgIGl0KGByb3VuZC10cmlwcyAke3ZlY3Rvci5uYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlID0gZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihcbiAgICAgICAgICBCdWZmZXIuZnJvbSh2ZWN0b3IucHViLCAnaGV4JyksXG4gICAgICAgICAgQnVmZmVyLmZyb20odmVjdG9yLmNoYWluQ29kZSwgJ2hleCcpXG4gICAgICAgICk7XG4gICAgICAgIGNvbXBvc2l0ZS5zaG91bGQuZXF1YWwodmVjdG9yLmNvbXBvc2l0ZSk7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHZlY3Rvci5jb21wb3NpdGUpO1xuICAgICAgICBkZWNvZGVkLnB1Yi50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHZlY3Rvci5wdWIpO1xuICAgICAgICBkZWNvZGVkLmNoYWluQ29kZS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHZlY3Rvci5jaGFpbkNvZGUpO1xuICAgICAgICBpc0Rlcml2YWJsZUVkMjU1MTlQdWIodmVjdG9yLmNvbXBvc2l0ZSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB2ZWN0b3Igb2YgZml4dHVyZS5pbnZhbGlkQ29tcG9zaXRlKSB7XG4gICAgICBpdChgcmVqZWN0cyAke3ZlY3Rvci5uYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXNEZXJpdmFibGVFZDI1NTE5UHViKHZlY3Rvci5jb21wb3NpdGUpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICAgICgoKSA9PiBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHZlY3Rvci5jb21wb3NpdGUpKS5zaG91bGQudGhyb3coL0ludmFsaWQgZGVyaXZhYmxlIGVkMjU1MTkgcHViLyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyYXcgcHVibGljIHNvZnQgZGVyaXZhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZGVyaXZlcyBhIGRldGVybWluaXN0aWMgcHVibGljIGtleSBhbmQgZGlzY2FyZHMgdGhlIGNoaWxkIGNoYWluIGNvZGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlZGRzYSA9IGF3YWl0IEVkZHNhLmluaXRpYWxpemUoYXdhaXQgRWQyNTUxOUJJUDMyLmluaXRpYWxpemUoKSk7XG4gICAgICBjb25zdCBkZXJpdmVkID0gZWRkc2EuZGVyaXZlVW5oYXJkZW5lZChST09UX0tFWUNIQUlOLCAnbS83Jyk7XG4gICAgICBkZXJpdmVkLmxlbmd0aC5zaG91bGQuZXF1YWwoMTI4KTtcbiAgICAgIGRlcml2ZWQuc2xpY2UoMCwgNjQpLnNob3VsZC5tYXRjaCgvXlswLTlhLWZdezY0fSQvKTtcbiAgICAgIGRlcml2ZWQuc2xpY2UoNjQpLnNob3VsZC5tYXRjaCgvXlswLTlhLWZdezY0fSQvKTtcbiAgICAgIChhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KFJPT1RfUFVCLCA3KSkudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbChkZXJpdmVkLnNsaWNlKDAsIDY0KSk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgZ29sZGVuIHZlY3RvcnMgYmVsb3cgcGluIHRoZSB1bmhhcmRlbmVkIGRlcml2YXRpb24gb3V0cHV0IHNoYXJlZCBjcm9zcy1yZXBvIHdpdGhcbiAgICAvLyB3YWxsZXQtcGxhdGZvcm06IGEgZGl2ZXJnZW50IGltcGxlbWVudGF0aW9uIGRlcml2ZXMgY28tc2lnbmVyIGtleXMgbm9ib2R5IGVsc2UgY2FuXG4gICAgLy8gcmVwcm9kdWNlLCBwZXJtYW5lbnRseSBicmlja2luZyB0aGUgd2FsbGV0cyBtaW50ZWQgd2l0aCBpdC5cbiAgICBmb3IgKGNvbnN0IHZlY3RvciBvZiBmaXh0dXJlLnNvZnREZXJpdmF0aW9uKSB7XG4gICAgICBpdChgZGVyaXZlcyB0aGUgcGlubmVkIGdvbGRlbiBjaGlsZDogJHt2ZWN0b3IubmFtZX1gLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFRoZSBwdWIvY2hhaW5Db2RlIGZpZWxkcyBtdXN0IGVuY29kZSB0byB0aGUgY29tcG9zaXRlIGFjdHVhbGx5IGRlcml2ZWQgZnJvbS5cbiAgICAgICAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihCdWZmZXIuZnJvbSh2ZWN0b3IucHViLCAnaGV4JyksIEJ1ZmZlci5mcm9tKHZlY3Rvci5jaGFpbkNvZGUsICdoZXgnKSkuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgIHZlY3Rvci5jb21wb3NpdGVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KHZlY3Rvci5jb21wb3NpdGUsIHZlY3Rvci5pbmRleCk7XG4gICAgICAgIGNoaWxkLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwodmVjdG9yLmNoaWxkUHViKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdyZWplY3RzIGEgaGFyZGVuZWQgb3Igb3V0LW9mLXJhbmdlIGluZGV4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShST09UX1BVQiwgLTEpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vbi1oYXJkZW5lZC8pO1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShST09UX1BVQiwgMHg4MDAwMDAwMCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm9uLWhhcmRlbmVkLyk7XG4gICAgICBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KFJPT1RfUFVCLCAxLjUpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vbi1oYXJkZW5lZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBtYWxmb3JtZWQgcm9vdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkoZml4dHVyZS5pbnZhbGlkQ29tcG9zaXRlWzFdLmNvbXBvc2l0ZSwgMCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgL0ludmFsaWQgZGVyaXZhYmxlIGVkMjU1MTkgcHViL1xuICAgICAgKTtcbiAgICAgIGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkoU1RSS0VZX1BVQkxJQywgMCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBkZXJpdmFibGUgZWQyNTUxOSBwdWIvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ211bHRpLXNlZ21lbnQgc29mdCBkZXJpdmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNlZWQgPSBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZChTVFJLRVlfU0VFRCk7XG4gICAgY29uc3Qgcm9vdFB1YiA9IEJ1ZmZlci5mcm9tKG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKHNlZWQpLnB1YmxpY0tleSk7XG4gICAgY29uc3Qgcm9vdENoYWluQ29kZSA9IEJ1ZmZlci5hbGxvYygzMiwgMHhhYik7XG4gICAgY29uc3QgY29tcG9zaXRlID0gZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yihyb290UHViLCByb290Q2hhaW5Db2RlKTtcbiAgICBjb25zdCBjaGFpbkNvZGVTdHIgPSBlbmNvZGVFZDI1NTE5Q2hhaW5Db2RlKHJvb3RDaGFpbkNvZGUpO1xuXG4gICAgaXQoJ3ByaXZhdGUgZGVyaXZlIHB1YmxpYyBoYWxmIG1hdGNoZXMgcHVibGljIGRlcml2ZSBhdCBtLzAgYW5kIG0vNDQvMjgzLzIvMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBbJ20vMCcsICdtLzQ0LzI4My8yLzAnXSkge1xuICAgICAgICBjb25zdCBwdWIgPSBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5QXRQYXRoKGNvbXBvc2l0ZSwgcGF0aCk7XG4gICAgICAgIGNvbnN0IHBydiA9IGF3YWl0IHNvZnREZXJpdmVDaGlsZFBydkVkMjU1MTlBdFBhdGgoeyBzZWVkU3RyS2V5OiBTVFJLRVlfU0VFRCwgY2hhaW5Db2RlOiBjaGFpbkNvZGVTdHIsIHBhdGggfSk7XG4gICAgICAgIHBydi5wdWIuZXF1YWxzKHB1Yikuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgICAvLyBSZWNvbXB1dGUgdGhlIHB1YmxpYyBwb2ludCBkaXJlY3RseSBmcm9tIGtMIHRvIHByb3ZlIHRoZSBwcml2YXRlIHNjYWxhciBtYXBzIHRvIHB1Yi5cbiAgICAgICAgYmlnSW50VG9CdWZmZXJMRShFZGRzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGJpZ0ludEZyb21CdWZmZXJMRShwcnYua0wpKSwgMzIpXG4gICAgICAgICAgLmVxdWFscyhwcnYucHViKVxuICAgICAgICAgIC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBoYXJkZW5lZCBhbmQgb3V0LW9mLXJhbmdlIHBhdGhzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOUF0UGF0aChjb21wb3NpdGUsIFwibS8wJ1wiKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIHNvZnQgZGVyaXZhdGlvbiBwYXRoLyk7XG4gICAgICBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQcnZFZDI1NTE5QXRQYXRoKHtcbiAgICAgICAgc2VlZFN0cktleTogU1RSS0VZX1NFRUQsXG4gICAgICAgIGNoYWluQ29kZTogY2hhaW5Db2RlU3RyLFxuICAgICAgICBwYXRoOiBcIm0vMCdcIixcbiAgICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgc29mdCBkZXJpdmF0aW9uIHBhdGgvKTtcbiAgICAgIGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTlBdFBhdGgoY29tcG9zaXRlLCAnbS8yMTQ3NDgzNjQ4Jykuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvb3V0IG9mIHJhbmdlLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTdGVsbGFyIHVzZXIta2V5IGNvZGVjcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgna2VlcHMgU3RlbGxhciBlbmNvZGluZyBzZXBhcmF0ZSBmcm9tIHRoZSBuZXV0cmFsIHJvb3QgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoU1RSS0VZX1BVQkxJQykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KFNUUktFWV9QVUJMSUMpKS5zaG91bGQuZXF1YWwoU1RSS0VZX1BVQkxJQyk7XG4gICAgICBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZChTVFJLRVlfU0VFRCkubGVuZ3RoLnNob3VsZC5lcXVhbCgzMik7XG4gICAgICBpc0Rlcml2YWJsZUVkMjU1MTlQdWIoU1RSS0VZX1BVQkxJQykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGlzQ2hlY2tzdW1WYWxpZFN0cktleUVkMjU1MTlQdWIoU1RSS0VZX1BVQkxJQykuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBwdWJsaWMga2V5IHdpdGggYSBjb3JydXB0ZWQgY2hlY2tzdW0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSgnR0E1V1VKNTRaMjNLSUxMQ1VPVU5BS1RQQlZaV0tNUVZPNE82RVE1R0hMQUVSSU1MTEhOQ1NLWUEnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBzZWNyZXQgc2VlZCB3aGVyZSBhIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSgnU0E1V1VKNTRaMjNLSUxMQ1VPVU5BS1RQQlZaV0tNUVZPNE82RVE1R0hMQUVSSU1MTEhOQ1NLWUgnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgKCgpID0+IGRlY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ1NBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lIJykpLnNob3VsZC50aHJvdyhcbiAgICAgICAgL1N0cktleSBwdWJsaWMga2V5L1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgbm9uLWJhc2UzMiBjaGFyYWN0ZXIsIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBsb3dlcmNhc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSgnR0E1V1VKNTRaMjNLSUxMQ1VPVU5BS1RQQlZaV0tNUVZPNE82RVE1R0hMQUVSSU1MTEhOQ1NLWTEnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleShTVFJLRVlfUFVCTElDLnRvTG93ZXJDYXNlKCkpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdleHRlbmRlZC1rZXkgc2lnbmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzZWVkID0gZGVjb2RlRWQyNTUxOVN0cktleVNlY3JldFNlZWQoU1RSS0VZX1NFRUQpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuZnJvbSgnZXh0ZW5kZWQta2V5IHNpZ25hdHVyZScpO1xuICAgIGNvbnN0IHJvb3RDaGFpbkNvZGUgPSBCdWZmZXIuYWxsb2MoMzIsIDB4YWIpO1xuICAgIGNvbnN0IGNoYWluQ29kZVN0ciA9IGVuY29kZUVkMjU1MTlDaGFpbkNvZGUocm9vdENoYWluQ29kZSk7XG5cbiAgICBpdCgnbWF0Y2hlcyB0aGUgc2VlZC1iYXNlZCBzaWduZXIgZm9yIGEgc2VlZC1iYWNrZWQga2V5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaCA9IGNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzZWVkKS5kaWdlc3QoKTtcbiAgICAgIGNvbnN0IGtMID0gYmlnSW50VG9CdWZmZXJMRShjbGFtcChiaWdJbnRGcm9tQnVmZmVyTEUoaC5zdWJhcnJheSgwLCAzMikpKSwgMzIpO1xuICAgICAgY29uc3Qga1IgPSBoLnN1YmFycmF5KDMyKTtcbiAgICAgIGNvbnN0IHNpZyA9IGF3YWl0IHNpZ25FZDI1NTE5RXh0ZW5kZWQobWVzc2FnZSwga0wsIGtSKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gQnVmZmVyLmZyb20obmFjbC5zaWduLmRldGFjaGVkKG1lc3NhZ2UsIG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKHNlZWQpLnNlY3JldEtleSkpO1xuICAgICAgc2lnLmVxdWFscyhleHBlY3RlZCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25zIGEgc29mdC1kZXJpdmVkIGtleSB3aXRoIG5vIHNlZWQgYW5kIHZlcmlmaWVzIGFnYWluc3QgaXRzIHB1YicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBydiA9IGF3YWl0IHNvZnREZXJpdmVDaGlsZFBydkVkMjU1MTlBdFBhdGgoe1xuICAgICAgICBzZWVkU3RyS2V5OiBTVFJLRVlfU0VFRCxcbiAgICAgICAgY2hhaW5Db2RlOiBjaGFpbkNvZGVTdHIsXG4gICAgICAgIHBhdGg6ICdtLzAnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzaWcgPSBhd2FpdCBzaWduRWQyNTUxOUV4dGVuZGVkKG1lc3NhZ2UsIHBydi5rTCwgcHJ2LmtSKTtcbiAgICAgIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobWVzc2FnZSwgc2lnLCBwcnYucHViKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICAvLyBUaGUgc29mdC1kZXJpdmVkIHNjYWxhciBoYXMgbm8gc2VlZDogdHJlYXRpbmcga0wgYXMgYSBzZWVkIHlpZWxkcyBhIGRpZmZlcmVudCBwdWIuXG4gICAgICBCdWZmZXIuZnJvbShuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VlZChwcnYua0wpLnB1YmxpY0tleSkuZXF1YWxzKHBydi5wdWIpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBrTC9rUiB0aGF0IGFyZSBub3QgMzIgYnl0ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzaWduRWQyNTUxOUV4dGVuZGVkKG1lc3NhZ2UsIEJ1ZmZlci5hbGxvYygzMSksIEJ1ZmZlci5hbGxvYygzMikpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2tMIGxlbmd0aC8pO1xuICAgICAgYXdhaXQgc2lnbkVkMjU1MTlFeHRlbmRlZChtZXNzYWdlLCBCdWZmZXIuYWxsb2MoMzIpLCBCdWZmZXIuYWxsb2MoMzMpKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9rUiBsZW5ndGgvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0V4dGVybmFsRWQyNTUxOVNpZ25lcicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gQnVmZmVyLmZyb20oJ2V4dGVybmFsLXNpZ25lciBtZXNzYWdlJyk7XG4gICAgY29uc3Qga2V5UGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKEJ1ZmZlci5hbGxvYygzMiwgMHg0MikpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKGtleVBhaXIucHVibGljS2V5KS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3Qgb3RoZXJLZXlQYWlyID0gbmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQoQnVmZmVyLmFsbG9jKDMyLCAweDc3KSk7XG4gICAgY29uc3QgdmFsaWRTaWduZXI6IEV4dGVybmFsRWQyNTUxOVNpZ25lciA9IHtcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIHNpZ246IGFzeW5jIChtOiBVaW50OEFycmF5KSA9PiAoe1xuICAgICAgICBzaWduYXR1cmU6IEJ1ZmZlci5mcm9tKG5hY2wuc2lnbi5kZXRhY2hlZChtLCBrZXlQYWlyLnNlY3JldEtleSkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBpdCgncmVqZWN0cyBhIG1hbGZvcm1lZCBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+XG4gICAgICAgIGFzc2VydFZhbGlkRXh0ZXJuYWxFZDI1NTE5U2lnbmVyKHtcbiAgICAgICAgICBwdWJsaWNLZXk6ICdub3QtaGV4JyxcbiAgICAgICAgICBzaWduOiBhc3luYyAoKSA9PiAoeyBzaWduYXR1cmU6ICdhJy5yZXBlYXQoMTI4KSB9KSxcbiAgICAgICAgfSkpLnNob3VsZC50aHJvdygvZXhwZWN0ZWQgMzIgYnl0ZXMvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgcHVibGljIGtleSB3aXRoIHRyYWlsaW5nIGdhcmJhZ2UgYWZ0ZXIgNjQgaGV4IGNoYXJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQnVmZmVyLmZyb20ocHViLCAnaGV4JykgdHJ1bmNhdGVzIGF0IHRoZSBmaXJzdCBiYWQgcGFpciwgc28gYSBsZW5ndGgtb25seSBjaGVjayB3b3VsZFxuICAgICAgLy8gYWNjZXB0IHRoaXM7IHRoZSBzdHJpY3QgcmVnZXggbXVzdCBub3QuXG4gICAgICAoKCkgPT5cbiAgICAgICAgYXNzZXJ0VmFsaWRFeHRlcm5hbEVkMjU1MTlTaWduZXIoe1xuICAgICAgICAgIHB1YmxpY0tleTogJ2YxJy5yZXBlYXQoMzIpICsgJ3p6JyxcbiAgICAgICAgICBzaWduOiBhc3luYyAoKSA9PiAoeyBzaWduYXR1cmU6ICdhJy5yZXBlYXQoMTI4KSB9KSxcbiAgICAgICAgfSkpLnNob3VsZC50aHJvdygvZXhwZWN0ZWQgMzIgYnl0ZXMvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgc2lnbmVyIHdpdGhvdXQgYSBzaWduIGZ1bmN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgKCgpID0+XG4gICAgICAgIGFzc2VydFZhbGlkRXh0ZXJuYWxFZDI1NTE5U2lnbmVyKHtcbiAgICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgICAgc2lnbjogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgRXh0ZXJuYWxFZDI1NTE5U2lnbmVyWydzaWduJ10sXG4gICAgICAgIH0pKS5zaG91bGQudGhyb3coL3NpZ24gbXVzdCBiZSBhIGZ1bmN0aW9uLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIG5vbi02NC1ieXRlIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHNpZ25XaXRoRXh0ZXJuYWxFZDI1NTE5U2lnbmVyKFxuICAgICAgICB7IHB1YmxpY0tleSwgc2lnbjogYXN5bmMgKCkgPT4gKHsgc2lnbmF0dXJlOiAnYWInIH0pIH0sXG4gICAgICAgIG1lc3NhZ2VcbiAgICAgICkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvZXhwZWN0ZWQgNjQgYnl0ZXMvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIHdoZW4gc2lnbiByZXNvbHZlcyB0byBhIG5vbi1vYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzaWduV2l0aEV4dGVybmFsRWQyNTUxOVNpZ25lcihcbiAgICAgICAgeyBwdWJsaWNLZXksIHNpZ246IGFzeW5jICgpID0+IG51bGwgYXMgdW5rbm93biBhcyB7IHNpZ25hdHVyZTogc3RyaW5nIH0gfSxcbiAgICAgICAgbWVzc2FnZVxuICAgICAgKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9zaWduIG11c3QgcmVzb2x2ZSB0byBcXHsgc2lnbmF0dXJlOiBzdHJpbmcgXFx9Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIHdlbGwtZm9ybWVkIHNpZ25hdHVyZSBmcm9tIHRoZSB3cm9uZyBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzaWduV2l0aEV4dGVybmFsRWQyNTUxOVNpZ25lcihcbiAgICAgICAge1xuICAgICAgICAgIHB1YmxpY0tleSxcbiAgICAgICAgICBzaWduOiBhc3luYyAobTogVWludDhBcnJheSkgPT4gKHtcbiAgICAgICAgICAgIHNpZ25hdHVyZTogQnVmZmVyLmZyb20obmFjbC5zaWduLmRldGFjaGVkKG0sIG90aGVyS2V5UGFpci5zZWNyZXRLZXkpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2VcbiAgICAgICkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvZG9lcyBub3QgdmVyaWZ5IGFnYWluc3QgaXRzIHB1YmxpYyBrZXkvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWducyBhbmQgcmV0dXJucyBhIHZlcmlmaWVkIDY0LWJ5dGUgc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgc2lnbldpdGhFeHRlcm5hbEVkMjU1MTlTaWduZXIodmFsaWRTaWduZXIsIG1lc3NhZ2UpO1xuICAgICAgc2lnbmF0dXJlLnNob3VsZC5tYXRjaCgvXlswLTlhLWZdezEyOH0kLyk7XG4gICAgICBuYWNsLnNpZ24uZGV0YWNoZWQudmVyaWZ5KG1lc3NhZ2UsIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2hleCcpLCBrZXlQYWlyLnB1YmxpY0tleSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|