@bitgo-beta/utxo-lib 8.0.3-beta.9 → 8.0.3-beta.90
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/README.md +19 -16
- package/dist/src/bitgo/Musig2.d.ts +5 -10
- package/dist/src/bitgo/Musig2.d.ts.map +1 -1
- package/dist/src/bitgo/Musig2.js +26 -51
- package/dist/src/bitgo/PsbtUtil.d.ts +54 -0
- package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -0
- package/dist/src/bitgo/PsbtUtil.js +79 -0
- package/dist/src/bitgo/UtxoPsbt.d.ts +21 -37
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoPsbt.js +138 -125
- package/dist/src/bitgo/index.d.ts +8 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +2 -1
- package/dist/src/bitgo/legacysafe/index.d.ts +15 -0
- package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
- package/dist/src/bitgo/legacysafe/index.js +57 -0
- package/dist/src/bitgo/parseInput.js +2 -2
- package/dist/src/bitgo/signature.d.ts +2 -2
- package/dist/src/bitgo/signature.d.ts.map +1 -1
- package/dist/src/bitgo/signature.js +8 -2
- package/dist/src/bitgo/transaction.d.ts +18 -3
- package/dist/src/bitgo/transaction.d.ts.map +1 -1
- package/dist/src/bitgo/transaction.js +9 -7
- package/dist/src/bitgo/wallet/Psbt.d.ts +49 -10
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Psbt.js +159 -83
- package/dist/src/bitgo/wallet/Unspent.d.ts +26 -0
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Unspent.js +149 -60
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +17 -1
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletOutput.js +64 -23
- package/dist/src/bitgo/wallet/chains.d.ts +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +4 -3
- package/dist/src/testutil/index.d.ts +1 -0
- package/dist/src/testutil/index.d.ts.map +1 -1
- package/dist/src/testutil/index.js +2 -1
- package/dist/src/testutil/mock.d.ts +1 -1
- package/dist/src/testutil/mock.d.ts.map +1 -1
- package/dist/src/testutil/mock.js +12 -4
- package/dist/src/testutil/psbt.d.ts +13 -4
- package/dist/src/testutil/psbt.d.ts.map +1 -1
- package/dist/src/testutil/psbt.js +10 -9
- package/dist/src/testutil/transaction.d.ts +17 -6
- package/dist/src/testutil/transaction.d.ts.map +1 -1
- package/dist/src/testutil/transaction.js +17 -10
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
This library is a wrapper around [bitcoinjs-lib](https://github.com/bitcoinjs/bitcoinjs-lib) adding altcoin support.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
|
+
|
|
6
7
|
- Multicoin support: Configurable behaviour based on [network](https://github.com/BitGo/bitgo-utxo-lib/blob/master/src/networks.js) objects.
|
|
7
8
|
- Backed by [BitGo](https://www.bitgo.com/info/)
|
|
8
9
|
|
|
9
10
|
## Installation
|
|
10
11
|
|
|
11
|
-
```
|
|
12
|
+
```bash
|
|
12
13
|
# using npm
|
|
13
14
|
npm install @bitgo/utxo-lib
|
|
14
15
|
|
|
@@ -19,20 +20,22 @@ yarn add @bitgo/utxo-lib
|
|
|
19
20
|
## Setup
|
|
20
21
|
|
|
21
22
|
JavaScript (ESM)
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
24
26
|
```
|
|
25
27
|
|
|
26
28
|
NodeJS (CJS)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
const utxolib = require('@bitgo/utxo-lib');
|
|
29
32
|
```
|
|
30
33
|
|
|
31
34
|
## Usage
|
|
32
35
|
|
|
33
36
|
Support for parsing and building altcoin transactions is provided by the following methods
|
|
34
37
|
|
|
35
|
-
```
|
|
38
|
+
```typescript
|
|
36
39
|
utxolib.bitgo.createTransactionFromBuffer(buffer, network): UtxoTransaction
|
|
37
40
|
// (similarly `createTransactionFromHex(string, network)`)
|
|
38
41
|
|
|
@@ -45,15 +48,15 @@ The `UtxoTransaction(Builder)` classes have the same interface as the `Transacti
|
|
|
45
48
|
|
|
46
49
|
## Supported coins
|
|
47
50
|
|
|
48
|
-
|Network|Mainnet|Testnet|
|
|
49
|
-
|
|
50
|
-
|Bitcoin
|
|
51
|
-
|Bitcoin Cash
|
|
52
|
-
|Bitcoin Gold
|
|
53
|
-
|Bitcoin SV (Satoshi Vision)
|
|
54
|
-
|Dash
|
|
55
|
-
|eCash
|
|
56
|
-
|Litecoin
|
|
57
|
-
|Zcash
|
|
51
|
+
| Network | Mainnet | Testnet |
|
|
52
|
+
| --------------------------- | ------------------------------ | ------------------------------------- |
|
|
53
|
+
| Bitcoin | `utxolib.networks.bitcoin` | `utxolib.networks.testnet` |
|
|
54
|
+
| Bitcoin Cash | `utxolib.networks.bitcoincash` | `utxolib.networks.bitcoincashTestnet` |
|
|
55
|
+
| Bitcoin Gold | `utxolib.networks.bitcoingold` | `utxolib.networks.bitcoingoldTestnet` |
|
|
56
|
+
| Bitcoin SV (Satoshi Vision) | `utxolib.networks.bitcoinsv` | `utxolib.networks.bitcoinsvTestnet` |
|
|
57
|
+
| Dash | `utxolib.networks.dash` | `utxolib.networks.dash` |
|
|
58
|
+
| eCash | `utxolib.networks.ecash` | `utxolib.networks.ecashTestnet` |
|
|
59
|
+
| Litecoin | `utxolib.networks.litecoin` | `utxolib.networks.litecoinTest` |
|
|
60
|
+
| Zcash | `utxolib.networks.zcash` | `utxolib.networks.zcashTest` |
|
|
58
61
|
|
|
59
62
|
> [Bitcoin SV](https://blog.bitgo.com/bsv-deprecation-6b3fff4df34c) no longer supports sending funds to BitGo wallets. Existing customers with Bitcoin SV in BitGo wallets will still be able to access and sweep funds to an external Bitcoin SV wallet.
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { TxInput } from 'bitcoinjs-lib';
|
|
3
2
|
import { SessionKey } from '@brandonblack/musig';
|
|
4
|
-
import { ProprietaryKeyValue, UtxoPsbt } from './UtxoPsbt';
|
|
5
3
|
import { Tuple } from './types';
|
|
6
|
-
import {
|
|
4
|
+
import { PsbtInput } from 'bip174/src/lib/interfaces';
|
|
5
|
+
import { ProprietaryKeyValue } from './PsbtUtil';
|
|
7
6
|
/**
|
|
8
7
|
* Participant key value object.
|
|
9
8
|
*/
|
|
@@ -107,17 +106,17 @@ export declare function createMusig2SigningSession(sessionArgs: {
|
|
|
107
106
|
* @returns psbt proprietary key for musig2 participant key value data
|
|
108
107
|
* If no key value exists, undefined is returned.
|
|
109
108
|
*/
|
|
110
|
-
export declare function parsePsbtMusig2Participants(
|
|
109
|
+
export declare function parsePsbtMusig2Participants(input: PsbtInput): PsbtMusig2Participants | undefined;
|
|
111
110
|
/**
|
|
112
111
|
* @returns psbt proprietary key for musig2 public nonce key value data
|
|
113
112
|
* If no key value exists, undefined is returned.
|
|
114
113
|
*/
|
|
115
|
-
export declare function parsePsbtMusig2Nonces(
|
|
114
|
+
export declare function parsePsbtMusig2Nonces(input: PsbtInput): PsbtMusig2PubNonce[] | undefined;
|
|
116
115
|
/**
|
|
117
116
|
* @returns psbt proprietary key for musig2 partial sig key value data
|
|
118
117
|
* If no key value exists, undefined is returned.
|
|
119
118
|
*/
|
|
120
|
-
export declare function parsePsbtMusig2PartialSigs(
|
|
119
|
+
export declare function parsePsbtMusig2PartialSigs(input: PsbtInput): PsbtMusig2PartialSig[] | undefined;
|
|
121
120
|
/**
|
|
122
121
|
* Assert musig2 participant key value data with tapInternalKey and tapMerkleRoot.
|
|
123
122
|
* <tapOutputKey><tapInputKey> => <participantKey1><participantKey2>
|
|
@@ -147,8 +146,4 @@ export declare function musig2DeterministicSign(params: PsbtMusig2DeterministicP
|
|
|
147
146
|
sessionKey: SessionKey;
|
|
148
147
|
publicNonce: Buffer;
|
|
149
148
|
};
|
|
150
|
-
/**
|
|
151
|
-
* @returns true iff given psbt/transaction/tx-input-array contains at least one taproot key path spend input
|
|
152
|
-
*/
|
|
153
|
-
export declare function isTransactionWithKeyPathSpendInput(data: UtxoPsbt | UtxoTransaction<bigint | number> | TxInput[]): boolean;
|
|
154
149
|
//# sourceMappingURL=Musig2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Musig2.d.ts","sourceRoot":"","sources":["../../../src/bitgo/Musig2.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Musig2.d.ts","sourceRoot":"","sources":["../../../src/bitgo/Musig2.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAUjD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAGL,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAoB;IAElC;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IASrC;;;;;;;;;;OAUG;IACH,iBAAiB,CACf,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,UAAU,EACrB,cAAc,EAAE,UAAU,EAC1B,MAAM,EAAE,UAAU,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,UAAU;CAQd;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,sBAAsB,GAAG,mBAAmB,CAStG;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CAcvF;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,oBAAoB,GAAG,mBAAmB,CAchG;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,mBAAmB,GAAG,sBAAsB,CAuB5F;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,mBAAmB,GAAG,kBAAkB,CAgBjF;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,mBAAmB,GAAG,oBAAoB,CAmBxF;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAEnE;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAItF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAErE;AAED,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpF;AAWD,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,gBAAgB,GAC3B,MAAM,CASR;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,GACrB,OAAO,CAGT;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAElF;AAED,0EAA0E;AAC1E,wBAAgB,0BAA0B,CAAC,WAAW,EAAE;IACtD,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,UAAU,CAKb;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,SAAS,GAAG,sBAAsB,GAAG,SAAS,CAehG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,GAAG,kBAAkB,EAAE,GAAG,SAAS,CAexF;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,oBAAoB,EAAE,GAAG,SAAS,CAe/F;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,qBAAqB,EAAE,sBAAsB,EAC7C,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GACpB,IAAI,CAmBN;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,kBAAkB,EAAE,EACtC,qBAAqB,EAAE,sBAAsB,GAC5C,IAAI,CAuBN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,oBAAoB,EAAE,GAAG;IAC3E,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB,CAiBA;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,6BAA6B,GAAG,MAAM,CAU5F;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,6BAA6B,GAAG;IAC9E,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,CASA"}
|
package/dist/src/bitgo/Musig2.js
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const UtxoPsbt_1 = require("./UtxoPsbt");
|
|
3
|
+
exports.musig2DeterministicSign = exports.createMusig2DeterministicNonce = exports.getSigHashTypeFromSigs = exports.assertPsbtMusig2Nonces = exports.assertPsbtMusig2Participants = exports.parsePsbtMusig2PartialSigs = exports.parsePsbtMusig2Nonces = exports.parsePsbtMusig2Participants = exports.createMusig2SigningSession = exports.musig2AggregateSigs = exports.musig2PartialSigVerify = exports.musig2PartialSign = exports.createTapTweak = exports.createAggregateNonce = exports.createTapOutputKey = exports.createTapInternalKey = exports.decodePsbtMusig2PartialSig = exports.decodePsbtMusig2Nonce = exports.decodePsbtMusig2Participants = exports.encodePsbtMusig2PartialSig = exports.encodePsbtMusig2PubNonce = exports.encodePsbtMusig2Participants = exports.Musig2NonceStore = void 0;
|
|
5
4
|
const outputScripts_1 = require("./outputScripts");
|
|
6
5
|
const noble_ecc_1 = require("../noble_ecc");
|
|
7
6
|
const taproot_1 = require("../taproot");
|
|
8
7
|
const index_1 = require("../index");
|
|
9
|
-
const
|
|
10
|
-
const wallet_1 = require("./wallet");
|
|
11
|
-
const parseInput_1 = require("./parseInput");
|
|
8
|
+
const PsbtUtil_1 = require("./PsbtUtil");
|
|
12
9
|
/**
|
|
13
10
|
* Because musig uses reference-equal buffers to cache nonces, we wrap it here to allow using
|
|
14
11
|
* nonces that are byte-equal but not reference-equal.
|
|
@@ -59,8 +56,8 @@ function encodePsbtMusig2Participants(participants) {
|
|
|
59
56
|
const keydata = [participants.tapOutputKey, participants.tapInternalKey].map((pubkey) => outputScripts_1.checkXOnlyPublicKey(pubkey));
|
|
60
57
|
const value = participants.participantPubKeys.map((pubkey) => outputScripts_1.checkPlainPublicKey(pubkey));
|
|
61
58
|
const key = {
|
|
62
|
-
identifier:
|
|
63
|
-
subtype:
|
|
59
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
60
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
|
|
64
61
|
keydata: Buffer.concat(keydata),
|
|
65
62
|
};
|
|
66
63
|
return { key, value: Buffer.concat(value) };
|
|
@@ -80,8 +77,8 @@ function encodePsbtMusig2PubNonce(nonce) {
|
|
|
80
77
|
outputScripts_1.checkXOnlyPublicKey(nonce.tapOutputKey),
|
|
81
78
|
]);
|
|
82
79
|
const key = {
|
|
83
|
-
identifier:
|
|
84
|
-
subtype:
|
|
80
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
81
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
|
|
85
82
|
keydata,
|
|
86
83
|
};
|
|
87
84
|
return { key, value: nonce.pubNonce };
|
|
@@ -96,8 +93,8 @@ function encodePsbtMusig2PartialSig(partialSig) {
|
|
|
96
93
|
outputScripts_1.checkXOnlyPublicKey(partialSig.tapOutputKey),
|
|
97
94
|
]);
|
|
98
95
|
const key = {
|
|
99
|
-
identifier:
|
|
100
|
-
subtype:
|
|
96
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
97
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
|
|
101
98
|
keydata,
|
|
102
99
|
};
|
|
103
100
|
return { key, value: partialSig.partialSig };
|
|
@@ -108,8 +105,8 @@ exports.encodePsbtMusig2PartialSig = encodePsbtMusig2PartialSig;
|
|
|
108
105
|
* @param kv
|
|
109
106
|
*/
|
|
110
107
|
function decodePsbtMusig2Participants(kv) {
|
|
111
|
-
if (kv.key.identifier !==
|
|
112
|
-
kv.key.subtype !==
|
|
108
|
+
if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER ||
|
|
109
|
+
kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS) {
|
|
113
110
|
throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for participants pub keys`);
|
|
114
111
|
}
|
|
115
112
|
const key = kv.key.keydata;
|
|
@@ -132,7 +129,7 @@ exports.decodePsbtMusig2Participants = decodePsbtMusig2Participants;
|
|
|
132
129
|
* @param kv
|
|
133
130
|
*/
|
|
134
131
|
function decodePsbtMusig2Nonce(kv) {
|
|
135
|
-
if (kv.key.identifier !==
|
|
132
|
+
if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER || kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE) {
|
|
136
133
|
throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for nonce`);
|
|
137
134
|
}
|
|
138
135
|
const key = kv.key.keydata;
|
|
@@ -151,8 +148,8 @@ exports.decodePsbtMusig2Nonce = decodePsbtMusig2Nonce;
|
|
|
151
148
|
* @param kv
|
|
152
149
|
*/
|
|
153
150
|
function decodePsbtMusig2PartialSig(kv) {
|
|
154
|
-
if (kv.key.identifier !==
|
|
155
|
-
kv.key.subtype !==
|
|
151
|
+
if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER ||
|
|
152
|
+
kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG) {
|
|
156
153
|
throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for partial sig`);
|
|
157
154
|
}
|
|
158
155
|
const key = kv.key.keydata;
|
|
@@ -215,10 +212,10 @@ exports.createMusig2SigningSession = createMusig2SigningSession;
|
|
|
215
212
|
* @returns psbt proprietary key for musig2 participant key value data
|
|
216
213
|
* If no key value exists, undefined is returned.
|
|
217
214
|
*/
|
|
218
|
-
function parsePsbtMusig2Participants(
|
|
219
|
-
const participantsKeyVals =
|
|
220
|
-
identifier:
|
|
221
|
-
subtype:
|
|
215
|
+
function parsePsbtMusig2Participants(input) {
|
|
216
|
+
const participantsKeyVals = PsbtUtil_1.getPsbtInputProprietaryKeyVals(input, {
|
|
217
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
218
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
|
|
222
219
|
});
|
|
223
220
|
if (!participantsKeyVals.length) {
|
|
224
221
|
return undefined;
|
|
@@ -233,10 +230,10 @@ exports.parsePsbtMusig2Participants = parsePsbtMusig2Participants;
|
|
|
233
230
|
* @returns psbt proprietary key for musig2 public nonce key value data
|
|
234
231
|
* If no key value exists, undefined is returned.
|
|
235
232
|
*/
|
|
236
|
-
function parsePsbtMusig2Nonces(
|
|
237
|
-
const nonceKeyVals =
|
|
238
|
-
identifier:
|
|
239
|
-
subtype:
|
|
233
|
+
function parsePsbtMusig2Nonces(input) {
|
|
234
|
+
const nonceKeyVals = PsbtUtil_1.getPsbtInputProprietaryKeyVals(input, {
|
|
235
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
236
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
|
|
240
237
|
});
|
|
241
238
|
if (!nonceKeyVals.length) {
|
|
242
239
|
return undefined;
|
|
@@ -251,10 +248,10 @@ exports.parsePsbtMusig2Nonces = parsePsbtMusig2Nonces;
|
|
|
251
248
|
* @returns psbt proprietary key for musig2 partial sig key value data
|
|
252
249
|
* If no key value exists, undefined is returned.
|
|
253
250
|
*/
|
|
254
|
-
function parsePsbtMusig2PartialSigs(
|
|
255
|
-
const sigKeyVals =
|
|
256
|
-
identifier:
|
|
257
|
-
subtype:
|
|
251
|
+
function parsePsbtMusig2PartialSigs(input) {
|
|
252
|
+
const sigKeyVals = PsbtUtil_1.getPsbtInputProprietaryKeyVals(input, {
|
|
253
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
254
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
|
|
258
255
|
});
|
|
259
256
|
if (!sigKeyVals.length) {
|
|
260
257
|
return undefined;
|
|
@@ -357,26 +354,4 @@ function musig2DeterministicSign(params) {
|
|
|
357
354
|
return { sig: Buffer.from(sig), sessionKey, publicNonce: Buffer.from(publicNonce) };
|
|
358
355
|
}
|
|
359
356
|
exports.musig2DeterministicSign = musig2DeterministicSign;
|
|
360
|
-
/**
|
|
361
|
-
* @returns true iff given psbt/transaction/tx-input-array contains at least one taproot key path spend input
|
|
362
|
-
*/
|
|
363
|
-
function isTransactionWithKeyPathSpendInput(data) {
|
|
364
|
-
if (data instanceof UtxoPsbt_1.UtxoPsbt) {
|
|
365
|
-
return data.data.inputs.some((_, inputIndex) => {
|
|
366
|
-
const parsedInput = wallet_1.parsePsbtInput(data, inputIndex);
|
|
367
|
-
return (parsedInput === null || parsedInput === void 0 ? void 0 : parsedInput.scriptType) === 'taprootKeyPathSpend';
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
const inputs = data instanceof UtxoTransaction_1.UtxoTransaction ? data.ins : data;
|
|
371
|
-
return inputs.some((input, inputIndex) => {
|
|
372
|
-
// If the input is not signed, it cannot be a taprootKeyPathSpend input because you can only
|
|
373
|
-
// extract a fully signed psbt into a transaction with taprootKeyPathSpend inputs.
|
|
374
|
-
if (wallet_1.getSignatureCount(data, inputIndex) === 0) {
|
|
375
|
-
return false;
|
|
376
|
-
}
|
|
377
|
-
const parsedInput = parseInput_1.parseSignatureScript(input);
|
|
378
|
-
return (parsedInput === null || parsedInput === void 0 ? void 0 : parsedInput.scriptType) === 'taprootKeyPathSpend';
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
exports.isTransactionWithKeyPathSpendInput = isTransactionWithKeyPathSpendInput;
|
|
382
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSx5Q0FBK0c7QUFDL0csbURBTXlCO0FBQ3pCLDRDQUEwQztBQUUxQyx3Q0FBK0Q7QUFDL0Qsb0NBQXVDO0FBQ3ZDLHVEQUFvRDtBQUNwRCxxQ0FBNkQ7QUFDN0QsNkNBQW9EO0FBc0NwRDs7O0dBR0c7QUFDSCxNQUFhLGdCQUFnQjtJQUE3QjtRQUNVLFdBQU0sR0FBaUIsRUFBRSxDQUFDO0lBd0NwQyxDQUFDO0lBdENDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFpQjtRQUN0QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDM0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLENBQUM7YUFDVjtTQUNGO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILGlCQUFpQixDQUNmLFVBQXNCLEVBQ3RCLFNBQXFCLEVBQ3JCLGNBQTBCLEVBQzFCLE1BQWtCLEVBQ2xCLFNBQWtCO1FBRWxCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELE1BQU0sR0FBRyxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0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QUFDLENBQUM7WUFDckQsT0FBTyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxVQUFVLE1BQUsscUJBQXFCLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUNELE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxpQ0FBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1FBQ3ZDLDRGQUE0RjtRQUM1RixrRkFBa0Y7UUFDbEYsSUFBSSwwQkFBaUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLFdBQVcsR0FBRyxpQ0FBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFVBQVUsTUFBSyxxQkFBcUIsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFuQkQsZ0ZBbUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHhJbnB1dCB9IGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0IHsgU2Vzc2lvbktleSB9IGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcnO1xuXG5pbXBvcnQgeyBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsIFByb3ByaWV0YXJ5S2V5VmFsdWUsIFV0eG9Qc2J0LCBQcm9wcmlldGFyeUtleVN1YnR5cGUgfSBmcm9tICcuL1V0eG9Qc2J0JztcbmltcG9ydCB7XG4gIGNoZWNrUGxhaW5QdWJsaWNLZXksXG4gIGNoZWNrVGFwTWVya2xlUm9vdCxcbiAgY2hlY2tUeEhhc2gsXG4gIGNoZWNrWE9ubHlQdWJsaWNLZXksXG4gIHRvWE9ubHlQdWJsaWNLZXksXG59IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBlY2MsIG11c2lnIH0gZnJvbSAnLi4vbm9ibGVfZWNjJztcbmltcG9ydCB7IFR1cGxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjYWxjdWxhdGVUYXBUd2VhaywgdGFwVHdlYWtQdWJrZXkgfSBmcm9tICcuLi90YXByb290JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZ2V0U2lnbmF0dXJlQ291bnQsIHBhcnNlUHNidElucHV0IH0gZnJvbSAnLi93YWxsZXQnO1xuaW1wb3J0IHsgcGFyc2VTaWduYXR1cmVTY3JpcHQgfSBmcm9tICcuL3BhcnNlSW5wdXQnO1xuXG4vKipcbiAqICBQYXJ0aWNpcGFudCBrZXkgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlcjtcbiAgcGFydGljaXBhbnRQdWJLZXlzOiBUdXBsZTxCdWZmZXI+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJEZXRlcm1pbmlzdGljUGFyYW1zIHtcbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xuICBvdGhlck5vbmNlOiBCdWZmZXI7XG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj47XG4gIGludGVybmFsUHViS2V5OiBCdWZmZXI7XG4gIHRhcFRyZWVSb290OiBCdWZmZXI7XG4gIGhhc2g6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgTm9uY2Uga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBwYXJ0aWNpcGFudFB1YktleTogQnVmZmVyO1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgcHViTm9uY2U6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgUGFydGlhbCBzaWduYXR1cmUga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUGFydGlhbFNpZyB7XG4gIHBhcnRpY2lwYW50UHViS2V5OiBCdWZmZXI7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICBwYXJ0aWFsU2lnOiBCdWZmZXI7XG59XG5cbi8qKlxuICogQmVjYXVzZSBtdXNpZyB1c2VzIHJlZmVyZW5jZS1lcXVhbCBidWZmZXJzIHRvIGNhY2hlIG5vbmNlcywgd2Ugd3JhcCBpdCBoZXJlIHRvIGFsbG93IHVzaW5nXG4gKiBub25jZXMgdGhhdCBhcmUgYnl0ZS1lcXVhbCBidXQgbm90IHJlZmVyZW5jZS1lcXVhbC5cbiAqL1xuZXhwb3J0IGNsYXNzIE11c2lnMk5vbmNlU3RvcmUge1xuICBwcml2YXRlIG5vbmNlczogVWludDhBcnJheVtdID0gW107XG5cbiAgLyoqXG4gICAqIEdldCBvcmlnaW5hbCBCdWZmZXIgaW5zdGFuY2UgZm9yIG5vbmNlICh3aGljaCBtYXkgYmUgYSBjb3B5KS5cbiAgICogQHJldHVybiBieXRlLWVxdWFsIGJ1ZmZlciB0aGF0IGlzIHJlZmVyZW5jZS1lcXVhbCB0byB3aGF0IHdhcyBzdG9yZWQgZWFybGllciBpbiBjcmVhdGVNdXNpZzJOb25jZVxuICAgKi9cbiAgZ2V0UmVmKG5vbmNlOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgZm9yIChjb25zdCBiIG9mIHRoaXMubm9uY2VzKSB7XG4gICAgICBpZiAoQnVmZmVyLmZyb20oYikuZXF1YWxzKG5vbmNlKSkge1xuICAgICAgICByZXR1cm4gYjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG5vbmNlYCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBtdXNpZzIgbm9uY2UgYW5kIHN0b3JlcyBidWZmZXIgcmVmZXJlbmNlLlxuICAgKiB0YXBJbnRlcm5hbGtleSwgdGFwTWVya2xlUm9vdCwgdGFwQmlwMzJEZXJpdmF0aW9uIGZvciByb290V2FsbGV0S2V5IGFyZSByZXF1aXJlZCBwZXIgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbnB1dC5cbiAgICogQWxzbyBwYXJ0aWNpcGFudCBrZXlzIGFyZSByZXF1aXJlZCBmcm9tIHBzYnQgcHJvcHJpZXRhcnkga2V5IHZhbHVlcy5cbiAgICogUmVmOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zYW5rZXQxNzI5LzRiNTI1YzYwNDlmNGQ5ZTAzNGQyNzM2OGM0OWYyOGE2XG4gICAqIEBwYXJhbSBwcml2YXRlS2V5IC0gc2lnbmVyIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgLSBzaWduZXIgeHkgcHVibGljIGtleVxuICAgKiBAcGFyYW0geE9ubHlQdWJsaWNLZXkgLSB0d2Vha2VkIGFnZ3JlZ2F0ZWQga2V5ICh0YXBPdXRwdXRLZXkpXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQWRkaXRpb25hbCBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBjcmVhdGVNdXNpZzJOb25jZShcbiAgICBwcml2YXRlS2V5OiBVaW50OEFycmF5LFxuICAgIHB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB4T25seVB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB0eEhhc2g6IFVpbnQ4QXJyYXksXG4gICAgc2Vzc2lvbklkPzogQnVmZmVyXG4gICk6IFVpbnQ4QXJyYXkge1xuICAgIGlmICh0eEhhc2gubGVuZ3RoICE9IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHhIYXNoIHNpemUgJHt0eEhhc2h9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZiA9IG11c2lnLm5vbmNlR2VuKHsgc2VjcmV0S2V5OiBwcml2YXRlS2V5LCBwdWJsaWNLZXksIHhPbmx5UHVibGljS2V5LCBtc2c6IHR4SGFzaCwgc2Vzc2lvbklkIH0pO1xuICAgIHRoaXMubm9uY2VzLnB1c2goYnVmKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5cy4gU3ViVHlwZSBpcyAweDAxXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4geC1vbmx5IHRhcE91dHB1dEtleXx8dGFwSW50ZXJuYWxLZXkgYXMgc3ViIGtleWRhdGEsIHBsYWluIHNpZ2luaW5nIHBhcnRpY2lwYW50IGtleXMgYXMgdmFsdWVkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50czogUHNidE11c2lnMlBhcnRpY2lwYW50cyk6IFByb3ByaWV0YXJ5S2V5VmFsdWUge1xuICBjb25zdCBrZXlkYXRhID0gW3BhcnRpY2lwYW50cy50YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50cy50YXBJbnRlcm5hbEtleV0ubWFwKChwdWJrZXkpID0+IGNoZWNrWE9ubHlQdWJsaWNLZXkocHVia2V5KSk7XG4gIGNvbnN0IHZhbHVlID0gcGFydGljaXBhbnRzLnBhcnRpY2lwYW50UHViS2V5cy5tYXAoKHB1YmtleSkgPT4gY2hlY2tQbGFpblB1YmxpY0tleShwdWJrZXkpKTtcbiAgY29uc3Qga2V5ID0ge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgIGtleWRhdGE6IEJ1ZmZlci5jb25jYXQoa2V5ZGF0YSksXG4gIH07XG4gIHJldHVybiB7IGtleSwgdmFsdWU6IEJ1ZmZlci5jb25jYXQodmFsdWUpIH07XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHB1YiBub25jZS4gU3ViVHlwZSBpcyAweDAyXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4gcGxhaW4tcGFydGljaXBhbnRQdWJLZXl8fHgtb25seS10YXBPdXRwdXRLZXkgYXMgc3ViIGtleWRhdGEsIDY2IGJ5dGVzIG9mIDIgcHViIG5vbmNlcyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZShub25jZTogUHNidE11c2lnMlB1Yk5vbmNlKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChub25jZS5wdWJOb25jZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1Yk5vbmNlcyBsZW5ndGggJHtub25jZS5wdWJOb25jZS5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkobm9uY2UucGFydGljaXBhbnRQdWJLZXkpLFxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkobm9uY2UudGFwT3V0cHV0S2V5KSxcbiAgXSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9uY2UucHViTm9uY2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKHBhcnRpYWxTaWc6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMiAmJiBwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJ0aWFsU2lnIGxlbmd0aCAke3BhcnRpYWxTaWcucGFydGlhbFNpZy5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkocGFydGlhbFNpZy5wYXJ0aWNpcGFudFB1YktleSksXG4gICAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWFsU2lnLnRhcE91dHB1dEtleSksXG4gIF0pO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogcGFydGlhbFNpZy5wYXJ0aWFsU2lnIH07XG59XG5cbi8qKlxuICogRGVjb2RlcyBwcm9wcmlldGFyeSBrZXkgdmFsdWUgZGF0YSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNcbiAqIEBwYXJhbSBrdlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICBpZiAoXG4gICAga3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fFxuICAgIGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5c2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj4gPSBbdmFsdWUuc3ViYXJyYXkoMCwgMzMpLCB2YWx1ZS5zdWJhcnJheSgzMyldO1xuICBpZiAocGFydGljaXBhbnRQdWJLZXlzWzBdLmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgcGFydGljaXBhbnQgcHViIGtleXMgZm91bmRgKTtcbiAgfVxuXG4gIHJldHVybiB7IHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDAsIDMyKSwgdGFwSW50ZXJuYWxLZXk6IGtleS5zdWJhcnJheSgzMiksIHBhcnRpY2lwYW50UHViS2V5cyB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBub25jZVxuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyTm9uY2Uoa3Y6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBpZiAoa3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fCBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBub25jZWApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIHJldHVybiB7IHBhcnRpY2lwYW50UHViS2V5OiBrZXkuc3ViYXJyYXkoMCwgMzMpLCB0YXBPdXRwdXRLZXk6IGtleS5zdWJhcnJheSgzMyksIHB1Yk5vbmNlOiB2YWx1ZSB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBwYXJ0aWFsIHNpZ1xuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyUGFydGlhbFNpZyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnIHtcbiAgaWYgKFxuICAgIGt2LmtleS5pZGVudGlmaWVyICE9PSBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfHxcbiAgICBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJR1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGlhbCBzaWdgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDMyICYmIHZhbHVlLmxlbmd0aCAhPT0gMzMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWVkYXRhIHNpemUgJHt2YWx1ZS5sZW5ndGh9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGljaXBhbnRQdWJLZXk6IGtleS5zdWJhcnJheSgwLCAzMyksIHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDMzKSwgcGFydGlhbFNpZzogdmFsdWUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcEludGVybmFsS2V5KHBsYWluUHViS2V5czogQnVmZmVyW10pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuZ2V0WE9ubHlQdWJrZXkobXVzaWcua2V5QWdnKHBsYWluUHViS2V5cykpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcE91dHB1dEtleShpbnRlcm5hbFB1YktleTogQnVmZmVyLCB0YXBUcmVlUm9vdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIHRhcFR3ZWFrUHVia2V5KGVjYywgdG9YT25seVB1YmxpY0tleShpbnRlcm5hbFB1YktleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBUcmVlUm9vdCkpLnhPbmx5UHVia2V5XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdGVOb25jZShwdWJOb25jZXM6IFR1cGxlPEJ1ZmZlcj4pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcubm9uY2VBZ2cocHViTm9uY2VzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXBUd2Vhayh0YXBJbnRlcm5hbEtleTogQnVmZmVyLCB0YXBNZXJrbGVSb290OiBCdWZmZXIpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2FsY3VsYXRlVGFwVHdlYWsoY2hlY2tYT25seVB1YmxpY0tleSh0YXBJbnRlcm5hbEtleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBNZXJrbGVSb290KSkpO1xufVxuXG5mdW5jdGlvbiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKFxuICBhZ2dOb25jZTogQnVmZmVyLFxuICBoYXNoOiBCdWZmZXIsXG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj4sXG4gIHR3ZWFrOiBCdWZmZXJcbik6IFNlc3Npb25LZXkge1xuICByZXR1cm4gbXVzaWcuc3RhcnRTaWduaW5nU2Vzc2lvbihhZ2dOb25jZSwgaGFzaCwgcHVibGljS2V5cywgeyB0d2VhaywgeE9ubHk6IHRydWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnbihcbiAgcHJpdmF0ZUtleTogQnVmZmVyLFxuICBwdWJsaWNOb25jZTogVWludDhBcnJheSxcbiAgc2Vzc2lvbktleTogU2Vzc2lvbktleSxcbiAgbm9uY2VTdG9yZTogTXVzaWcyTm9uY2VTdG9yZVxuKTogQnVmZmVyIHtcbiAgY2hlY2tUeEhhc2goQnVmZmVyLmZyb20oc2Vzc2lvbktleS5tc2cpKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIG11c2lnLnBhcnRpYWxTaWduKHtcbiAgICAgIHNlY3JldEtleTogcHJpdmF0ZUtleSxcbiAgICAgIHB1YmxpY05vbmNlOiBub25jZVN0b3JlLmdldFJlZihwdWJsaWNOb25jZSksXG4gICAgICBzZXNzaW9uS2V5LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnVmVyaWZ5KFxuICBzaWc6IEJ1ZmZlcixcbiAgcHVibGljS2V5OiBCdWZmZXIsXG4gIHB1YmxpY05vbmNlOiBCdWZmZXIsXG4gIHNlc3Npb25LZXk6IFNlc3Npb25LZXlcbik6IGJvb2xlYW4ge1xuICBjaGVja1R4SGFzaChCdWZmZXIuZnJvbShzZXNzaW9uS2V5Lm1zZykpO1xuICByZXR1cm4gbXVzaWcucGFydGlhbFZlcmlmeSh7IHNpZywgcHVibGljS2V5LCBwdWJsaWNOb25jZSwgc2Vzc2lvbktleSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkFnZ3JlZ2F0ZVNpZ3Moc2lnczogQnVmZmVyW10sIHNlc3Npb25LZXk6IFNlc3Npb25LZXkpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuc2lnbkFnZyhzaWdzLCBzZXNzaW9uS2V5KSk7XG59XG5cbi8qKiBAcmV0dXJuIHNlc3Npb24ga2V5IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBzZXNzaW9uIGxhdGVyICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oc2Vzc2lvbkFyZ3M6IHtcbiAgcHViTm9uY2VzOiBUdXBsZTxCdWZmZXI+O1xuICB0eEhhc2g6IEJ1ZmZlcjtcbiAgcHViS2V5czogVHVwbGU8QnVmZmVyPjtcbiAgaW50ZXJuYWxQdWJLZXk6IEJ1ZmZlcjtcbiAgdGFwVHJlZVJvb3Q6IEJ1ZmZlcjtcbn0pOiBTZXNzaW9uS2V5IHtcbiAgY2hlY2tUeEhhc2goc2Vzc2lvbkFyZ3MudHhIYXNoKTtcbiAgY29uc3QgYWdnTm9uY2UgPSBjcmVhdGVBZ2dyZWdhdGVOb25jZShzZXNzaW9uQXJncy5wdWJOb25jZXMpO1xuICBjb25zdCB0d2VhayA9IGNyZWF0ZVRhcFR3ZWFrKHNlc3Npb25BcmdzLmludGVybmFsUHViS2V5LCBzZXNzaW9uQXJncy50YXBUcmVlUm9vdCk7XG4gIHJldHVybiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKGFnZ05vbmNlLCBzZXNzaW9uQXJncy50eEhhc2gsIHNlc3Npb25BcmdzLnB1YktleXMsIHR3ZWFrKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBwc2J0IHByb3ByaWV0YXJ5IGtleSBmb3IgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICB9KTtcblxuICBpZiAoIXBhcnRpY2lwYW50c0tleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7cGFydGljaXBhbnRzS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDFgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50c0tleVZhbHNbMF0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHBzYnQgcHJvcHJpZXRhcnkga2V5IGZvciBtdXNpZzIgcHVibGljIG5vbmNlIGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJOb25jZXMocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IFBzYnRNdXNpZzJQdWJOb25jZVtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9uY2VLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgfSk7XG5cbiAgaWYgKCFub25jZUtleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChub25jZUtleVZhbHMubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtub25jZUtleVZhbHMubGVuZ3RofSBtYXRjaGluZyBub25jZSBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxIG9yIDJgKTtcbiAgfVxuXG4gIHJldHVybiBub25jZUtleVZhbHMubWFwKChrdikgPT4gZGVjb2RlUHNidE11c2lnMk5vbmNlKGt2KSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgcHNidCBwcm9wcmlldGFyeSBrZXkgZm9yIG11c2lnMiBwYXJ0aWFsIHNpZyBrZXkgdmFsdWUgZGF0YVxuICogSWYgbm8ga2V5IHZhbHVlIGV4aXN0cywgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBzaWdLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHLFxuICB9KTtcblxuICBpZiAoIXNpZ0tleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChzaWdLZXlWYWxzLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7c2lnS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpYWwgc2lnbmF0dXJlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDEgb3IgMmApO1xuICB9XG5cbiAgcmV0dXJuIHNpZ0tleVZhbHMubWFwKChrdikgPT4gZGVjb2RlUHNidE11c2lnMlBhcnRpYWxTaWcoa3YpKTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhIHdpdGggdGFwSW50ZXJuYWxLZXkgYW5kIHRhcE1lcmtsZVJvb3QuXG4gKiA8dGFwT3V0cHV0S2V5Pjx0YXBJbnB1dEtleT4gPT4gPHBhcnRpY2lwYW50S2V5MT48cGFydGljaXBhbnRLZXkyPlxuICogVXNpbmcgdGFwTWVya2xlUm9vdCBhbmQgMiBwYXJ0aWNpcGFudCBrZXlzLCB0aGUgdGFwSW5wdXRLZXkgaXMgdmFsaWRhdGVkIGFuZCB1c2luZyB0YXBNZXJrbGVSb290IGFuZCB0YXBJbnB1dEtleSxcbiAqIHRoZSB0YXBPdXRwdXRLZXkgaXMgdmFsaWRhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyhcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICB0YXBJbnRlcm5hbEtleTogQnVmZmVyLFxuICB0YXBNZXJrbGVSb290OiBCdWZmZXJcbik6IHZvaWQge1xuICBjaGVja1hPbmx5UHVibGljS2V5KHRhcEludGVybmFsS2V5KTtcbiAgY2hlY2tUYXBNZXJrbGVSb290KHRhcE1lcmtsZVJvb3QpO1xuXG4gIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5cyA9IHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXM7XG5cbiAgY29uc3QgaW50ZXJuYWxLZXkgPSBjcmVhdGVUYXBJbnRlcm5hbEtleShwYXJ0aWNpcGFudFB1YktleXMpO1xuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50cyBrZXlkYXRhIHRhcEludGVybmFsS2V5Jyk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRLZXkgPSBjcmVhdGVUYXBPdXRwdXRLZXkoaW50ZXJuYWxLZXksIHRhcE1lcmtsZVJvb3QpO1xuICBpZiAoIW91dHB1dEtleS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcE91dHB1dEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnRzIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gIH1cblxuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyh0YXBJbnRlcm5hbEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEludGVybmFsS2V5IGFuZCBhZ2dyZWdhdGVkIHBhcnRpY2lwYW50IHB1YiBrZXlzIGRvZXMgbm90IG1hdGNoJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHB1YmxpYyBub25jZSBrZXkgdmFsdWUgZGF0YSB3aXRoIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiAocmVmZXIgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbERhdGEpLlxuICogPHBhcnRpY2lwYW50S2V5MT48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UxPlxuICogPHBhcnRpY2lwYW50S2V5Mj48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UyPlxuICogQ2hlY2tzIGFnYWluc3QgcGFydGljaXBhbnQga2V5cyBhbmQgdGFwT3V0cHV0S2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzKFxuICBub25jZXNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUHViTm9uY2VbXSxcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzXG4pOiB2b2lkIHtcbiAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KTtcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5mb3JFYWNoKChrdikgPT4gY2hlY2tQbGFpblB1YmxpY0tleShrdikpO1xuICBpZiAocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1swXS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBwYXJ0aWNpcGFudCBwdWIga2V5cyBmb3VuZGApO1xuICB9XG5cbiAgaWYgKG5vbmNlc0tleVZhbERhdGEubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBub25jZSBrZXkgdmFsdWUgY291bnQgJHtub25jZXNLZXlWYWxEYXRhLmxlbmd0aH1gKTtcbiAgfVxuXG4gIG5vbmNlc0tleVZhbERhdGEuZm9yRWFjaCgobm9uY2VLdikgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5maW5kSW5kZXgoKHB1YktleSkgPT5cbiAgICAgIG5vbmNlS3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHB1YktleSlcbiAgICApO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBub25jZSBrZXlkYXRhIHBhcnRpY2lwYW50IHB1YiBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vbmNlS3YudGFwT3V0cHV0S2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5vbmNlIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBJbnB1dCBvYmplY3QgYnV0IHNpZyBoYXNoIHR5cGUgZGF0YSBpcyB0YWtlbiBvdXQgZnJvbSBwYXJ0aWFsU2lnIGZpZWxkLlxuICogSWYgc2lnIGhhc2ggdHlwZSBpcyBub3QgY29tbW9uIGZvciBhbGwgc2lncywgZXJyb3Igb3V0LCBvdGhlcndpc2UgcmV0dXJucyB0aGUgbW9kaWZpZWQgb2JqZWN0IGFuZCBzaW5nbGUgaGFzaCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhwYXJ0aWFsU2lnczogUHNidE11c2lnMlBhcnRpYWxTaWdbXSk6IHtcbiAgcGFydGlhbFNpZ3M6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW107XG4gIHNpZ0hhc2hUeXBlOiBudW1iZXI7XG59IHtcbiAgaWYgKCFwYXJ0aWFsU2lncy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRpYWxTaWdzIGFycmF5IGNhbiBub3QgYmUgZW1wdHknKTtcbiAgfVxuICBjb25zdCBwU2lnc1dpdGhIYXNoVHlwZSA9IHBhcnRpYWxTaWdzLm1hcCgoa3YpID0+IHtcbiAgICBjb25zdCB7IHBhcnRpYWxTaWcsIHBhcnRpY2lwYW50UHViS2V5LCB0YXBPdXRwdXRLZXkgfSA9IGt2O1xuICAgIHJldHVybiBwYXJ0aWFsU2lnLmxlbmd0aCA9PT0gMzNcbiAgICAgID8geyBwU2lnOiB7IHBhcnRpYWxTaWc6IHBhcnRpYWxTaWcuc2xpY2UoMCwgMzIpLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBwYXJ0aWFsU2lnWzMyXSB9XG4gICAgICA6IHsgcFNpZzogeyBwYXJ0aWFsU2lnLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgfTtcbiAgfSk7XG5cbiAgY29uc3Qgc2lnSGFzaFR5cGUgPSBwU2lnc1dpdGhIYXNoVHlwZVswXS5zaWdIYXNoVHlwZTtcbiAgaWYgKCFwU2lnc1dpdGhIYXNoVHlwZS5ldmVyeSgocFNpZykgPT4gcFNpZy5zaWdIYXNoVHlwZSA9PT0gc2lnSGFzaFR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzaWduYXR1cmVzIG11c3QgdXNlIHNhbWUgc2lnIGhhc2ggdHlwZScpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGlhbFNpZ3M6IHBTaWdzV2l0aEhhc2hUeXBlLm1hcCgoeyBwU2lnIH0pID0+IHBTaWcpLCBzaWdIYXNoVHlwZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyRGV0ZXJtaW5pc3RpY05vbmNlKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgbXVzaWcuZGV0ZXJtaW5pc3RpY05vbmNlR2VuKHtcbiAgICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgICBhZ2dPdGhlck5vbmNlOiBtdXNpZy5ub25jZUFnZyhbcGFyYW1zLm90aGVyTm9uY2VdKSxcbiAgICAgIHB1YmxpY0tleXM6IHBhcmFtcy5wdWJsaWNLZXlzLFxuICAgICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICAgIG1zZzogcGFyYW1zLmhhc2gsXG4gICAgfSkucHVibGljTm9uY2VcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkRldGVybWluaXN0aWNTaWduKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiB7XG4gIHNpZzogQnVmZmVyO1xuICBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5O1xuICBwdWJsaWNOb25jZTogQnVmZmVyO1xufSB7XG4gIGNvbnN0IHsgc2lnLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZSB9ID0gbXVzaWcuZGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgYWdnT3RoZXJOb25jZTogbXVzaWcubm9uY2VBZ2coW3BhcmFtcy5vdGhlck5vbmNlXSksXG4gICAgcHVibGljS2V5czogcGFyYW1zLnB1YmxpY0tleXMsXG4gICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICBtc2c6IHBhcmFtcy5oYXNoLFxuICB9KTtcbiAgcmV0dXJuIHsgc2lnOiBCdWZmZXIuZnJvbShzaWcpLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZTogQnVmZmVyLmZyb20ocHVibGljTm9uY2UpIH07XG59XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZmYgZ2l2ZW4gcHNidC90cmFuc2FjdGlvbi90eC1pbnB1dC1hcnJheSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGFwcm9vdCBrZXkgcGF0aCBzcGVuZCBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dChcbiAgZGF0YTogVXR4b1BzYnQgfCBVdHhvVHJhbnNhY3Rpb248YmlnaW50IHwgbnVtYmVyPiB8IFR4SW5wdXRbXVxuKTogYm9vbGVhbiB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVXR4b1BzYnQpIHtcbiAgICByZXR1cm4gZGF0YS5kYXRhLmlucHV0cy5zb21lKChfLCBpbnB1dEluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlUHNidElucHV0KGRhdGEsIGlucHV0SW5kZXgpO1xuICAgICAgcmV0dXJuIHBhcnNlZElucHV0Py5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCc7XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgaW5wdXRzID0gZGF0YSBpbnN0YW5jZW9mIFV0eG9UcmFuc2FjdGlvbiA/IGRhdGEuaW5zIDogZGF0YTtcbiAgcmV0dXJuIGlucHV0cy5zb21lKChpbnB1dCwgaW5wdXRJbmRleCkgPT4ge1xuICAgIC8vIElmIHRoZSBpbnB1dCBpcyBub3Qgc2lnbmVkLCBpdCBjYW5ub3QgYmUgYSB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0IGJlY2F1c2UgeW91IGNhbiBvbmx5XG4gICAgLy8gZXh0cmFjdCBhIGZ1bGx5IHNpZ25lZCBwc2J0IGludG8gYSB0cmFuc2FjdGlvbiB3aXRoIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXRzLlxuICAgIGlmIChnZXRTaWduYXR1cmVDb3VudChkYXRhLCBpbnB1dEluZGV4KSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlU2lnbmF0dXJlU2NyaXB0KGlucHV0KTtcbiAgICByZXR1cm4gcGFyc2VkSW5wdXQ/LnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJztcbiAgfSk7XG59XG4iXX0=
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxtREFNeUI7QUFDekIsNENBQTBDO0FBRTFDLHdDQUErRDtBQUMvRCxvQ0FBdUM7QUFFdkMseUNBS29CO0FBc0NwQjs7O0dBR0c7QUFDSCxNQUFhLGdCQUFnQjtJQUE3QjtRQUNVLFdBQU0sR0FBaUIsRUFBRSxDQUFDO0lBd0NwQyxDQUFDO0lBdENDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFpQjtRQUN0QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDM0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLENBQUM7YUFDVjtTQUNGO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILGlCQUFpQixDQUNmLFVBQXNCLEVBQ3RCLFNBQXFCLEVBQ3JCLGNBQTBCLEVBQzFCLE1BQWtCLEVBQ2xCLFNBQWtCO1FBRWxCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELE1BQU0sR0FBRyxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRjtBQXpDRCw0Q0F5Q0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsNEJBQTRCLENBQUMsWUFBb0M7SUFDL0UsTUFBTSxPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLG1DQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdEgsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsbUNBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMzRixNQUFNLEdBQUcsR0FBRztRQUNWLFVBQVUsRUFBRSxzQ0FBMkI7UUFDdkMsT0FBTyxFQUFFLGdDQUFxQixDQUFDLDJCQUEyQjtRQUMxRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDaEMsQ0FBQztJQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBVEQsb0VBU0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsS0FBeUI7SUFDaEUsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQ3RFO0lBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixtQ0FBbUIsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7UUFDNUMsbUNBQW1CLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztLQUN4QyxDQUFDLENBQUM7SUFDSCxNQUFNLEdBQUcsR0FBRztRQUNWLFVBQVUsRUFBRSxzQ0FBMkI7UUFDdkMsT0FBTyxFQUFFLGdDQUFxQixDQUFDLGdCQUFnQjtRQUMvQyxPQUFPO0tBQ1IsQ0FBQztJQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBZEQsNERBY0M7QUFFRCxTQUFnQiwwQkFBMEIsQ0FBQyxVQUFnQztJQUN6RSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDOUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQzlFO0lBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixtQ0FBbUIsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUM7UUFDakQsbUNBQW1CLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztLQUM3QyxDQUFDLENBQUM7SUFDSCxNQUFNLEdBQUcsR0FBRztRQUNWLFVBQVUsRUFBRSxzQ0FBMkI7UUFDdkMsT0FBTyxFQUFFLGdDQUFxQixDQUFDLGtCQUFrQjtRQUNqRCxPQUFPO0tBQ1IsQ0FBQztJQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMvQyxDQUFDO0FBZEQsZ0VBY0M7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQiw0QkFBNEIsQ0FBQyxFQUF1QjtJQUNsRSxJQUNFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLHNDQUEyQjtRQUNqRCxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sS0FBSyxnQ0FBcUIsQ0FBQywyQkFBMkIsRUFDcEU7UUFDQSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sNEJBQTRCLENBQUMsQ0FBQztLQUNuSDtJQUVELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBQzNCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLE1BQU0sMkJBQTJCLENBQUMsQ0FBQztLQUNoRjtJQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDdkIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixLQUFLLENBQUMsTUFBTSwyQkFBMkIsQ0FBQyxDQUFDO0tBQ3BGO0lBQ0QsTUFBTSxrQkFBa0IsR0FBa0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7S0FDekQ7SUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDckcsQ0FBQztBQXZCRCxvRUF1QkM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxFQUF1QjtJQUMzRCxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLHNDQUEyQixJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLGdDQUFxQixDQUFDLGdCQUFnQixFQUFFO1FBQ2xILE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxZQUFZLENBQUMsQ0FBQztLQUNuRztJQUVELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBQzNCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLE1BQU0sWUFBWSxDQUFDLENBQUM7S0FDakU7SUFFRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsS0FBSyxDQUFDLE1BQU0sWUFBWSxDQUFDLENBQUM7S0FDckU7SUFFRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3JHLENBQUM7QUFoQkQsc0RBZ0JDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQUMsRUFBdUI7SUFDaEUsSUFDRSxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsS0FBSyxzQ0FBMkI7UUFDakQsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEtBQUssZ0NBQXFCLENBQUMsa0JBQWtCLEVBQzNEO1FBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLENBQUM7S0FDekc7SUFFRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUMzQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxNQUFNLGtCQUFrQixDQUFDLENBQUM7S0FDdkU7SUFFRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsS0FBSyxDQUFDLE1BQU0sa0JBQWtCLENBQUMsQ0FBQztLQUMzRTtJQUVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDdkcsQ0FBQztBQW5CRCxnRUFtQkM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxZQUFzQjtJQUN6RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQUssQ0FBQyxjQUFjLENBQUMsaUJBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFGRCxvREFFQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLGNBQXNCLEVBQUUsV0FBbUI7SUFDNUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUNoQix3QkFBYyxDQUFDLGVBQUcsRUFBRSxnQ0FBZ0IsQ0FBQyxjQUFjLENBQUMsRUFBRSxrQ0FBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FDbkcsQ0FBQztBQUNKLENBQUM7QUFKRCxnREFJQztBQUVELFNBQWdCLG9CQUFvQixDQUFDLFNBQXdCO0lBQzNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFGRCxvREFFQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxjQUFzQixFQUFFLGFBQXFCO0lBQzFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBaUIsQ0FBQyxtQ0FBbUIsQ0FBQyxjQUFjLENBQUMsRUFBRSxrQ0FBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEgsQ0FBQztBQUZELHdDQUVDO0FBRUQsU0FBUyx5QkFBeUIsQ0FDaEMsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLFVBQXlCLEVBQ3pCLEtBQWE7SUFFYixPQUFPLGlCQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELFNBQWdCLGlCQUFpQixDQUMvQixVQUFrQixFQUNsQixXQUF1QixFQUN2QixVQUFzQixFQUN0QixVQUE0QjtJQUU1QiwyQkFBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUNoQixpQkFBSyxDQUFDLFdBQVcsQ0FBQztRQUNoQixTQUFTLEVBQUUsVUFBVTtRQUNyQixXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDM0MsVUFBVTtLQUNYLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQWRELDhDQWNDO0FBRUQsU0FBZ0Isc0JBQXNCLENBQ3BDLEdBQVcsRUFDWCxTQUFpQixFQUNqQixXQUFtQixFQUNuQixVQUFzQjtJQUV0QiwyQkFBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekMsT0FBTyxpQkFBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQVJELHdEQVFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsSUFBYyxFQUFFLFVBQXNCO0lBQ3hFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRkQsa0RBRUM7QUFFRCwwRUFBMEU7QUFDMUUsU0FBZ0IsMEJBQTBCLENBQUMsV0FNMUM7SUFDQywyQkFBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0QsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xGLE9BQU8seUJBQXlCLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBWEQsZ0VBV0M7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQiwyQkFBMkIsQ0FBQyxLQUFnQjtJQUMxRCxNQUFNLG1CQUFtQixHQUFHLHlDQUE4QixDQUFDLEtBQUssRUFBRTtRQUNoRSxVQUFVLEVBQUUsc0NBQTJCO1FBQ3ZDLE9BQU8sRUFBRSxnQ0FBcUIsQ0FBQywyQkFBMkI7S0FDM0QsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRTtRQUMvQixPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUVELElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsbUJBQW1CLENBQUMsTUFBTSw4Q0FBOEMsQ0FBQyxDQUFDO0tBQ3BHO0lBRUQsT0FBTyw0QkFBNEIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFmRCxrRUFlQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLEtBQWdCO0lBQ3BELE1BQU0sWUFBWSxHQUFHLHlDQUE4QixDQUFDLEtBQUssRUFBRTtRQUN6RCxVQUFVLEVBQUUsc0NBQTJCO1FBQ3ZDLE9BQU8sRUFBRSxnQ0FBcUIsQ0FBQyxnQkFBZ0I7S0FDaEQsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7UUFDeEIsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxZQUFZLENBQUMsTUFBTSw2Q0FBNkMsQ0FBQyxDQUFDO0tBQzVGO0lBRUQsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFmRCxzREFlQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLDBCQUEwQixDQUFDLEtBQWdCO0lBQ3pELE1BQU0sVUFBVSxHQUFHLHlDQUE4QixDQUFDLEtBQUssRUFBRTtRQUN2RCxVQUFVLEVBQUUsc0NBQTJCO1FBQ3ZDLE9BQU8sRUFBRSxnQ0FBcUIsQ0FBQyxrQkFBa0I7S0FDbEQsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDdEIsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxVQUFVLENBQUMsTUFBTSx5REFBeUQsQ0FBQyxDQUFDO0tBQ3RHO0lBRUQsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFmRCxnRUFlQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsNEJBQTRCLENBQzFDLHFCQUE2QyxFQUM3QyxjQUFzQixFQUN0QixhQUFxQjtJQUVyQixtQ0FBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNwQyxrQ0FBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUVsQyxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDO0lBRXBFLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0tBQ2hFO0lBRUQsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2pFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztLQUM5RDtJQUVELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztLQUN0RjtBQUNILENBQUM7QUF2QkQsb0VBdUJDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQ3BDLGdCQUFzQyxFQUN0QyxxQkFBNkM7SUFFN0MsbUNBQW1CLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxtQ0FBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLElBQUkscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDbkcsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDN0U7SUFFRCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUMxRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUN6QyxDQUFDO1FBQ0YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RDtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQTFCRCx3REEwQkM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxXQUFtQztJQUl4RSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7S0FDdkQ7SUFDRCxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtRQUMvQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUMzRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLEtBQUssRUFBRTtZQUM3QixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNqSCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLG1CQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUcsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDckQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsRUFBRTtRQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7S0FDM0Q7SUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBQ2pGLENBQUM7QUFwQkQsd0RBb0JDO0FBRUQsU0FBZ0IsOEJBQThCLENBQUMsTUFBcUM7SUFDbEYsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUNoQixpQkFBSyxDQUFDLHFCQUFxQixDQUFDO1FBQzFCLFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVTtRQUM1QixhQUFhLEVBQUUsaUJBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1FBQzdCLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDM0YsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJO0tBQ2pCLENBQUMsQ0FBQyxXQUFXLENBQ2YsQ0FBQztBQUNKLENBQUM7QUFWRCx3RUFVQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE1BQXFDO0lBSzNFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLGlCQUFLLENBQUMsaUJBQWlCLENBQUM7UUFDL0QsU0FBUyxFQUFFLE1BQU0sQ0FBQyxVQUFVO1FBQzVCLGFBQWEsRUFBRSxpQkFBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRCxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDN0IsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzRixHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUk7S0FDakIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0FBQ3RGLENBQUM7QUFiRCwwREFhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlc3Npb25LZXkgfSBmcm9tICdAYnJhbmRvbmJsYWNrL211c2lnJztcblxuaW1wb3J0IHtcbiAgY2hlY2tQbGFpblB1YmxpY0tleSxcbiAgY2hlY2tUYXBNZXJrbGVSb290LFxuICBjaGVja1R4SGFzaCxcbiAgY2hlY2tYT25seVB1YmxpY0tleSxcbiAgdG9YT25seVB1YmxpY0tleSxcbn0gZnJvbSAnLi9vdXRwdXRTY3JpcHRzJztcbmltcG9ydCB7IGVjYywgbXVzaWcgfSBmcm9tICcuLi9ub2JsZV9lY2MnO1xuaW1wb3J0IHsgVHVwbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNhbGN1bGF0ZVRhcFR3ZWFrLCB0YXBUd2Vha1B1YmtleSB9IGZyb20gJy4uL3RhcHJvb3QnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBQc2J0SW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyxcbiAgUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLFxuICBQcm9wcmlldGFyeUtleVZhbHVlLFxuICBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG59IGZyb20gJy4vUHNidFV0aWwnO1xuXG4vKipcbiAqICBQYXJ0aWNpcGFudCBrZXkgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlcjtcbiAgcGFydGljaXBhbnRQdWJLZXlzOiBUdXBsZTxCdWZmZXI+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJEZXRlcm1pbmlzdGljUGFyYW1zIHtcbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xuICBvdGhlck5vbmNlOiBCdWZmZXI7XG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj47XG4gIGludGVybmFsUHViS2V5OiBCdWZmZXI7XG4gIHRhcFRyZWVSb290OiBCdWZmZXI7XG4gIGhhc2g6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgTm9uY2Uga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBwYXJ0aWNpcGFudFB1YktleTogQnVmZmVyO1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgcHViTm9uY2U6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgUGFydGlhbCBzaWduYXR1cmUga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUGFydGlhbFNpZyB7XG4gIHBhcnRpY2lwYW50UHViS2V5OiBCdWZmZXI7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICBwYXJ0aWFsU2lnOiBCdWZmZXI7XG59XG5cbi8qKlxuICogQmVjYXVzZSBtdXNpZyB1c2VzIHJlZmVyZW5jZS1lcXVhbCBidWZmZXJzIHRvIGNhY2hlIG5vbmNlcywgd2Ugd3JhcCBpdCBoZXJlIHRvIGFsbG93IHVzaW5nXG4gKiBub25jZXMgdGhhdCBhcmUgYnl0ZS1lcXVhbCBidXQgbm90IHJlZmVyZW5jZS1lcXVhbC5cbiAqL1xuZXhwb3J0IGNsYXNzIE11c2lnMk5vbmNlU3RvcmUge1xuICBwcml2YXRlIG5vbmNlczogVWludDhBcnJheVtdID0gW107XG5cbiAgLyoqXG4gICAqIEdldCBvcmlnaW5hbCBCdWZmZXIgaW5zdGFuY2UgZm9yIG5vbmNlICh3aGljaCBtYXkgYmUgYSBjb3B5KS5cbiAgICogQHJldHVybiBieXRlLWVxdWFsIGJ1ZmZlciB0aGF0IGlzIHJlZmVyZW5jZS1lcXVhbCB0byB3aGF0IHdhcyBzdG9yZWQgZWFybGllciBpbiBjcmVhdGVNdXNpZzJOb25jZVxuICAgKi9cbiAgZ2V0UmVmKG5vbmNlOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgZm9yIChjb25zdCBiIG9mIHRoaXMubm9uY2VzKSB7XG4gICAgICBpZiAoQnVmZmVyLmZyb20oYikuZXF1YWxzKG5vbmNlKSkge1xuICAgICAgICByZXR1cm4gYjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG5vbmNlYCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBtdXNpZzIgbm9uY2UgYW5kIHN0b3JlcyBidWZmZXIgcmVmZXJlbmNlLlxuICAgKiB0YXBJbnRlcm5hbGtleSwgdGFwTWVya2xlUm9vdCwgdGFwQmlwMzJEZXJpdmF0aW9uIGZvciByb290V2FsbGV0S2V5IGFyZSByZXF1aXJlZCBwZXIgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbnB1dC5cbiAgICogQWxzbyBwYXJ0aWNpcGFudCBrZXlzIGFyZSByZXF1aXJlZCBmcm9tIHBzYnQgcHJvcHJpZXRhcnkga2V5IHZhbHVlcy5cbiAgICogUmVmOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zYW5rZXQxNzI5LzRiNTI1YzYwNDlmNGQ5ZTAzNGQyNzM2OGM0OWYyOGE2XG4gICAqIEBwYXJhbSBwcml2YXRlS2V5IC0gc2lnbmVyIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgLSBzaWduZXIgeHkgcHVibGljIGtleVxuICAgKiBAcGFyYW0geE9ubHlQdWJsaWNLZXkgLSB0d2Vha2VkIGFnZ3JlZ2F0ZWQga2V5ICh0YXBPdXRwdXRLZXkpXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQWRkaXRpb25hbCBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBjcmVhdGVNdXNpZzJOb25jZShcbiAgICBwcml2YXRlS2V5OiBVaW50OEFycmF5LFxuICAgIHB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB4T25seVB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB0eEhhc2g6IFVpbnQ4QXJyYXksXG4gICAgc2Vzc2lvbklkPzogQnVmZmVyXG4gICk6IFVpbnQ4QXJyYXkge1xuICAgIGlmICh0eEhhc2gubGVuZ3RoICE9IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHhIYXNoIHNpemUgJHt0eEhhc2h9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZiA9IG11c2lnLm5vbmNlR2VuKHsgc2VjcmV0S2V5OiBwcml2YXRlS2V5LCBwdWJsaWNLZXksIHhPbmx5UHVibGljS2V5LCBtc2c6IHR4SGFzaCwgc2Vzc2lvbklkIH0pO1xuICAgIHRoaXMubm9uY2VzLnB1c2goYnVmKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5cy4gU3ViVHlwZSBpcyAweDAxXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4geC1vbmx5IHRhcE91dHB1dEtleXx8dGFwSW50ZXJuYWxLZXkgYXMgc3ViIGtleWRhdGEsIHBsYWluIHNpZ2luaW5nIHBhcnRpY2lwYW50IGtleXMgYXMgdmFsdWVkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50czogUHNidE11c2lnMlBhcnRpY2lwYW50cyk6IFByb3ByaWV0YXJ5S2V5VmFsdWUge1xuICBjb25zdCBrZXlkYXRhID0gW3BhcnRpY2lwYW50cy50YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50cy50YXBJbnRlcm5hbEtleV0ubWFwKChwdWJrZXkpID0+IGNoZWNrWE9ubHlQdWJsaWNLZXkocHVia2V5KSk7XG4gIGNvbnN0IHZhbHVlID0gcGFydGljaXBhbnRzLnBhcnRpY2lwYW50UHViS2V5cy5tYXAoKHB1YmtleSkgPT4gY2hlY2tQbGFpblB1YmxpY0tleShwdWJrZXkpKTtcbiAgY29uc3Qga2V5ID0ge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgIGtleWRhdGE6IEJ1ZmZlci5jb25jYXQoa2V5ZGF0YSksXG4gIH07XG4gIHJldHVybiB7IGtleSwgdmFsdWU6IEJ1ZmZlci5jb25jYXQodmFsdWUpIH07XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHB1YiBub25jZS4gU3ViVHlwZSBpcyAweDAyXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4gcGxhaW4tcGFydGljaXBhbnRQdWJLZXl8fHgtb25seS10YXBPdXRwdXRLZXkgYXMgc3ViIGtleWRhdGEsIDY2IGJ5dGVzIG9mIDIgcHViIG5vbmNlcyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZShub25jZTogUHNidE11c2lnMlB1Yk5vbmNlKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChub25jZS5wdWJOb25jZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1Yk5vbmNlcyBsZW5ndGggJHtub25jZS5wdWJOb25jZS5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkobm9uY2UucGFydGljaXBhbnRQdWJLZXkpLFxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkobm9uY2UudGFwT3V0cHV0S2V5KSxcbiAgXSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9uY2UucHViTm9uY2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKHBhcnRpYWxTaWc6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMiAmJiBwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJ0aWFsU2lnIGxlbmd0aCAke3BhcnRpYWxTaWcucGFydGlhbFNpZy5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkocGFydGlhbFNpZy5wYXJ0aWNpcGFudFB1YktleSksXG4gICAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWFsU2lnLnRhcE91dHB1dEtleSksXG4gIF0pO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogcGFydGlhbFNpZy5wYXJ0aWFsU2lnIH07XG59XG5cbi8qKlxuICogRGVjb2RlcyBwcm9wcmlldGFyeSBrZXkgdmFsdWUgZGF0YSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNcbiAqIEBwYXJhbSBrdlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICBpZiAoXG4gICAga3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fFxuICAgIGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5c2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj4gPSBbdmFsdWUuc3ViYXJyYXkoMCwgMzMpLCB2YWx1ZS5zdWJhcnJheSgzMyldO1xuICBpZiAocGFydGljaXBhbnRQdWJLZXlzWzBdLmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgcGFydGljaXBhbnQgcHViIGtleXMgZm91bmRgKTtcbiAgfVxuXG4gIHJldHVybiB7IHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDAsIDMyKSwgdGFwSW50ZXJuYWxLZXk6IGtleS5zdWJhcnJheSgzMiksIHBhcnRpY2lwYW50UHViS2V5cyB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBub25jZVxuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyTm9uY2Uoa3Y6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBpZiAoa3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fCBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBub25jZWApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIHJldHVybiB7IHBhcnRpY2lwYW50UHViS2V5OiBrZXkuc3ViYXJyYXkoMCwgMzMpLCB0YXBPdXRwdXRLZXk6IGtleS5zdWJhcnJheSgzMyksIHB1Yk5vbmNlOiB2YWx1ZSB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBwYXJ0aWFsIHNpZ1xuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyUGFydGlhbFNpZyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnIHtcbiAgaWYgKFxuICAgIGt2LmtleS5pZGVudGlmaWVyICE9PSBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfHxcbiAgICBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJR1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGlhbCBzaWdgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDMyICYmIHZhbHVlLmxlbmd0aCAhPT0gMzMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWVkYXRhIHNpemUgJHt2YWx1ZS5sZW5ndGh9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGljaXBhbnRQdWJLZXk6IGtleS5zdWJhcnJheSgwLCAzMyksIHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDMzKSwgcGFydGlhbFNpZzogdmFsdWUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcEludGVybmFsS2V5KHBsYWluUHViS2V5czogQnVmZmVyW10pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuZ2V0WE9ubHlQdWJrZXkobXVzaWcua2V5QWdnKHBsYWluUHViS2V5cykpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcE91dHB1dEtleShpbnRlcm5hbFB1YktleTogQnVmZmVyLCB0YXBUcmVlUm9vdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIHRhcFR3ZWFrUHVia2V5KGVjYywgdG9YT25seVB1YmxpY0tleShpbnRlcm5hbFB1YktleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBUcmVlUm9vdCkpLnhPbmx5UHVia2V5XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdGVOb25jZShwdWJOb25jZXM6IFR1cGxlPEJ1ZmZlcj4pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcubm9uY2VBZ2cocHViTm9uY2VzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXBUd2Vhayh0YXBJbnRlcm5hbEtleTogQnVmZmVyLCB0YXBNZXJrbGVSb290OiBCdWZmZXIpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2FsY3VsYXRlVGFwVHdlYWsoY2hlY2tYT25seVB1YmxpY0tleSh0YXBJbnRlcm5hbEtleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBNZXJrbGVSb290KSkpO1xufVxuXG5mdW5jdGlvbiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKFxuICBhZ2dOb25jZTogQnVmZmVyLFxuICBoYXNoOiBCdWZmZXIsXG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj4sXG4gIHR3ZWFrOiBCdWZmZXJcbik6IFNlc3Npb25LZXkge1xuICByZXR1cm4gbXVzaWcuc3RhcnRTaWduaW5nU2Vzc2lvbihhZ2dOb25jZSwgaGFzaCwgcHVibGljS2V5cywgeyB0d2VhaywgeE9ubHk6IHRydWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnbihcbiAgcHJpdmF0ZUtleTogQnVmZmVyLFxuICBwdWJsaWNOb25jZTogVWludDhBcnJheSxcbiAgc2Vzc2lvbktleTogU2Vzc2lvbktleSxcbiAgbm9uY2VTdG9yZTogTXVzaWcyTm9uY2VTdG9yZVxuKTogQnVmZmVyIHtcbiAgY2hlY2tUeEhhc2goQnVmZmVyLmZyb20oc2Vzc2lvbktleS5tc2cpKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIG11c2lnLnBhcnRpYWxTaWduKHtcbiAgICAgIHNlY3JldEtleTogcHJpdmF0ZUtleSxcbiAgICAgIHB1YmxpY05vbmNlOiBub25jZVN0b3JlLmdldFJlZihwdWJsaWNOb25jZSksXG4gICAgICBzZXNzaW9uS2V5LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnVmVyaWZ5KFxuICBzaWc6IEJ1ZmZlcixcbiAgcHVibGljS2V5OiBCdWZmZXIsXG4gIHB1YmxpY05vbmNlOiBCdWZmZXIsXG4gIHNlc3Npb25LZXk6IFNlc3Npb25LZXlcbik6IGJvb2xlYW4ge1xuICBjaGVja1R4SGFzaChCdWZmZXIuZnJvbShzZXNzaW9uS2V5Lm1zZykpO1xuICByZXR1cm4gbXVzaWcucGFydGlhbFZlcmlmeSh7IHNpZywgcHVibGljS2V5LCBwdWJsaWNOb25jZSwgc2Vzc2lvbktleSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkFnZ3JlZ2F0ZVNpZ3Moc2lnczogQnVmZmVyW10sIHNlc3Npb25LZXk6IFNlc3Npb25LZXkpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuc2lnbkFnZyhzaWdzLCBzZXNzaW9uS2V5KSk7XG59XG5cbi8qKiBAcmV0dXJuIHNlc3Npb24ga2V5IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBzZXNzaW9uIGxhdGVyICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oc2Vzc2lvbkFyZ3M6IHtcbiAgcHViTm9uY2VzOiBUdXBsZTxCdWZmZXI+O1xuICB0eEhhc2g6IEJ1ZmZlcjtcbiAgcHViS2V5czogVHVwbGU8QnVmZmVyPjtcbiAgaW50ZXJuYWxQdWJLZXk6IEJ1ZmZlcjtcbiAgdGFwVHJlZVJvb3Q6IEJ1ZmZlcjtcbn0pOiBTZXNzaW9uS2V5IHtcbiAgY2hlY2tUeEhhc2goc2Vzc2lvbkFyZ3MudHhIYXNoKTtcbiAgY29uc3QgYWdnTm9uY2UgPSBjcmVhdGVBZ2dyZWdhdGVOb25jZShzZXNzaW9uQXJncy5wdWJOb25jZXMpO1xuICBjb25zdCB0d2VhayA9IGNyZWF0ZVRhcFR3ZWFrKHNlc3Npb25BcmdzLmludGVybmFsUHViS2V5LCBzZXNzaW9uQXJncy50YXBUcmVlUm9vdCk7XG4gIHJldHVybiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKGFnZ05vbmNlLCBzZXNzaW9uQXJncy50eEhhc2gsIHNlc3Npb25BcmdzLnB1YktleXMsIHR3ZWFrKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBwc2J0IHByb3ByaWV0YXJ5IGtleSBmb3IgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXQ6IFBzYnRJbnB1dCk6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxzID0gZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0LCB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gIH0pO1xuXG4gIGlmICghcGFydGljaXBhbnRzS2V5VmFscy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHBhcnRpY2lwYW50c0tleVZhbHMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aH0gbWF0Y2hpbmcgcGFydGljaXBhbnQga2V5IHZhbHVlIGluc3RlYWQgb2YgMWApO1xuICB9XG5cbiAgcmV0dXJuIGRlY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocGFydGljaXBhbnRzS2V5VmFsc1swXSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgcHNidCBwcm9wcmlldGFyeSBrZXkgZm9yIG11c2lnMiBwdWJsaWMgbm9uY2Uga2V5IHZhbHVlIGRhdGFcbiAqIElmIG5vIGtleSB2YWx1ZSBleGlzdHMsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHNidE11c2lnMk5vbmNlcyhpbnB1dDogUHNidElucHV0KTogUHNidE11c2lnMlB1Yk5vbmNlW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBub25jZUtleVZhbHMgPSBnZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXQsIHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gIH0pO1xuXG4gIGlmICghbm9uY2VLZXlWYWxzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAobm9uY2VLZXlWYWxzLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7bm9uY2VLZXlWYWxzLmxlbmd0aH0gbWF0Y2hpbmcgbm9uY2Uga2V5IHZhbHVlIGluc3RlYWQgb2YgMSBvciAyYCk7XG4gIH1cblxuICByZXR1cm4gbm9uY2VLZXlWYWxzLm1hcCgoa3YpID0+IGRlY29kZVBzYnRNdXNpZzJOb25jZShrdikpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHBzYnQgcHJvcHJpZXRhcnkga2V5IGZvciBtdXNpZzIgcGFydGlhbCBzaWcga2V5IHZhbHVlIGRhdGFcbiAqIElmIG5vIGtleSB2YWx1ZSBleGlzdHMsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKGlucHV0OiBQc2J0SW5wdXQpOiBQc2J0TXVzaWcyUGFydGlhbFNpZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2lnS2V5VmFscyA9IGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHLFxuICB9KTtcblxuICBpZiAoIXNpZ0tleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChzaWdLZXlWYWxzLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7c2lnS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpYWwgc2lnbmF0dXJlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDEgb3IgMmApO1xuICB9XG5cbiAgcmV0dXJuIHNpZ0tleVZhbHMubWFwKChrdikgPT4gZGVjb2RlUHNidE11c2lnMlBhcnRpYWxTaWcoa3YpKTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhIHdpdGggdGFwSW50ZXJuYWxLZXkgYW5kIHRhcE1lcmtsZVJvb3QuXG4gKiA8dGFwT3V0cHV0S2V5Pjx0YXBJbnB1dEtleT4gPT4gPHBhcnRpY2lwYW50S2V5MT48cGFydGljaXBhbnRLZXkyPlxuICogVXNpbmcgdGFwTWVya2xlUm9vdCBhbmQgMiBwYXJ0aWNpcGFudCBrZXlzLCB0aGUgdGFwSW5wdXRLZXkgaXMgdmFsaWRhdGVkIGFuZCB1c2luZyB0YXBNZXJrbGVSb290IGFuZCB0YXBJbnB1dEtleSxcbiAqIHRoZSB0YXBPdXRwdXRLZXkgaXMgdmFsaWRhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyhcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICB0YXBJbnRlcm5hbEtleTogQnVmZmVyLFxuICB0YXBNZXJrbGVSb290OiBCdWZmZXJcbik6IHZvaWQge1xuICBjaGVja1hPbmx5UHVibGljS2V5KHRhcEludGVybmFsS2V5KTtcbiAgY2hlY2tUYXBNZXJrbGVSb290KHRhcE1lcmtsZVJvb3QpO1xuXG4gIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5cyA9IHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXM7XG5cbiAgY29uc3QgaW50ZXJuYWxLZXkgPSBjcmVhdGVUYXBJbnRlcm5hbEtleShwYXJ0aWNpcGFudFB1YktleXMpO1xuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50cyBrZXlkYXRhIHRhcEludGVybmFsS2V5Jyk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRLZXkgPSBjcmVhdGVUYXBPdXRwdXRLZXkoaW50ZXJuYWxLZXksIHRhcE1lcmtsZVJvb3QpO1xuICBpZiAoIW91dHB1dEtleS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcE91dHB1dEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnRzIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gIH1cblxuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyh0YXBJbnRlcm5hbEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEludGVybmFsS2V5IGFuZCBhZ2dyZWdhdGVkIHBhcnRpY2lwYW50IHB1YiBrZXlzIGRvZXMgbm90IG1hdGNoJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHB1YmxpYyBub25jZSBrZXkgdmFsdWUgZGF0YSB3aXRoIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiAocmVmZXIgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbERhdGEpLlxuICogPHBhcnRpY2lwYW50S2V5MT48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UxPlxuICogPHBhcnRpY2lwYW50S2V5Mj48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UyPlxuICogQ2hlY2tzIGFnYWluc3QgcGFydGljaXBhbnQga2V5cyBhbmQgdGFwT3V0cHV0S2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzKFxuICBub25jZXNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUHViTm9uY2VbXSxcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzXG4pOiB2b2lkIHtcbiAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KTtcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5mb3JFYWNoKChrdikgPT4gY2hlY2tQbGFpblB1YmxpY0tleShrdikpO1xuICBpZiAocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1swXS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBwYXJ0aWNpcGFudCBwdWIga2V5cyBmb3VuZGApO1xuICB9XG5cbiAgaWYgKG5vbmNlc0tleVZhbERhdGEubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBub25jZSBrZXkgdmFsdWUgY291bnQgJHtub25jZXNLZXlWYWxEYXRhLmxlbmd0aH1gKTtcbiAgfVxuXG4gIG5vbmNlc0tleVZhbERhdGEuZm9yRWFjaCgobm9uY2VLdikgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5maW5kSW5kZXgoKHB1YktleSkgPT5cbiAgICAgIG5vbmNlS3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHB1YktleSlcbiAgICApO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBub25jZSBrZXlkYXRhIHBhcnRpY2lwYW50IHB1YiBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vbmNlS3YudGFwT3V0cHV0S2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5vbmNlIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBJbnB1dCBvYmplY3QgYnV0IHNpZyBoYXNoIHR5cGUgZGF0YSBpcyB0YWtlbiBvdXQgZnJvbSBwYXJ0aWFsU2lnIGZpZWxkLlxuICogSWYgc2lnIGhhc2ggdHlwZSBpcyBub3QgY29tbW9uIGZvciBhbGwgc2lncywgZXJyb3Igb3V0LCBvdGhlcndpc2UgcmV0dXJucyB0aGUgbW9kaWZpZWQgb2JqZWN0IGFuZCBzaW5nbGUgaGFzaCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhwYXJ0aWFsU2lnczogUHNidE11c2lnMlBhcnRpYWxTaWdbXSk6IHtcbiAgcGFydGlhbFNpZ3M6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW107XG4gIHNpZ0hhc2hUeXBlOiBudW1iZXI7XG59IHtcbiAgaWYgKCFwYXJ0aWFsU2lncy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRpYWxTaWdzIGFycmF5IGNhbiBub3QgYmUgZW1wdHknKTtcbiAgfVxuICBjb25zdCBwU2lnc1dpdGhIYXNoVHlwZSA9IHBhcnRpYWxTaWdzLm1hcCgoa3YpID0+IHtcbiAgICBjb25zdCB7IHBhcnRpYWxTaWcsIHBhcnRpY2lwYW50UHViS2V5LCB0YXBPdXRwdXRLZXkgfSA9IGt2O1xuICAgIHJldHVybiBwYXJ0aWFsU2lnLmxlbmd0aCA9PT0gMzNcbiAgICAgID8geyBwU2lnOiB7IHBhcnRpYWxTaWc6IHBhcnRpYWxTaWcuc2xpY2UoMCwgMzIpLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBwYXJ0aWFsU2lnWzMyXSB9XG4gICAgICA6IHsgcFNpZzogeyBwYXJ0aWFsU2lnLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgfTtcbiAgfSk7XG5cbiAgY29uc3Qgc2lnSGFzaFR5cGUgPSBwU2lnc1dpdGhIYXNoVHlwZVswXS5zaWdIYXNoVHlwZTtcbiAgaWYgKCFwU2lnc1dpdGhIYXNoVHlwZS5ldmVyeSgocFNpZykgPT4gcFNpZy5zaWdIYXNoVHlwZSA9PT0gc2lnSGFzaFR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzaWduYXR1cmVzIG11c3QgdXNlIHNhbWUgc2lnIGhhc2ggdHlwZScpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGlhbFNpZ3M6IHBTaWdzV2l0aEhhc2hUeXBlLm1hcCgoeyBwU2lnIH0pID0+IHBTaWcpLCBzaWdIYXNoVHlwZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyRGV0ZXJtaW5pc3RpY05vbmNlKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgbXVzaWcuZGV0ZXJtaW5pc3RpY05vbmNlR2VuKHtcbiAgICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgICBhZ2dPdGhlck5vbmNlOiBtdXNpZy5ub25jZUFnZyhbcGFyYW1zLm90aGVyTm9uY2VdKSxcbiAgICAgIHB1YmxpY0tleXM6IHBhcmFtcy5wdWJsaWNLZXlzLFxuICAgICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICAgIG1zZzogcGFyYW1zLmhhc2gsXG4gICAgfSkucHVibGljTm9uY2VcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkRldGVybWluaXN0aWNTaWduKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiB7XG4gIHNpZzogQnVmZmVyO1xuICBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5O1xuICBwdWJsaWNOb25jZTogQnVmZmVyO1xufSB7XG4gIGNvbnN0IHsgc2lnLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZSB9ID0gbXVzaWcuZGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgYWdnT3RoZXJOb25jZTogbXVzaWcubm9uY2VBZ2coW3BhcmFtcy5vdGhlck5vbmNlXSksXG4gICAgcHVibGljS2V5czogcGFyYW1zLnB1YmxpY0tleXMsXG4gICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICBtc2c6IHBhcmFtcy5oYXNoLFxuICB9KTtcbiAgcmV0dXJuIHsgc2lnOiBCdWZmZXIuZnJvbShzaWcpLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZTogQnVmZmVyLmZyb20ocHVibGljTm9uY2UpIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ProprietaryKey } from 'bip174/src/lib/proprietaryKeyVal';
|
|
3
|
+
import { PsbtInput } from 'bip174/src/lib/interfaces';
|
|
4
|
+
/**
|
|
5
|
+
* bitgo proprietary key identifier
|
|
6
|
+
*/
|
|
7
|
+
export declare const PSBT_PROPRIETARY_IDENTIFIER = "BITGO";
|
|
8
|
+
/**
|
|
9
|
+
* subtype for proprietary keys that bitgo uses
|
|
10
|
+
*/
|
|
11
|
+
export declare enum ProprietaryKeySubtype {
|
|
12
|
+
ZEC_CONSENSUS_BRANCH_ID = 0,
|
|
13
|
+
MUSIG2_PARTICIPANT_PUB_KEYS = 1,
|
|
14
|
+
MUSIG2_PUB_NONCE = 2,
|
|
15
|
+
MUSIG2_PARTIAL_SIG = 3
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Psbt proprietary keydata object.
|
|
19
|
+
* <compact size uint identifier length> <bytes identifier> <compact size uint subtype> <bytes subkeydata>
|
|
20
|
+
* => <bytes valuedata>
|
|
21
|
+
*/
|
|
22
|
+
export interface ProprietaryKeyValue {
|
|
23
|
+
key: ProprietaryKey;
|
|
24
|
+
value: Buffer;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Psbt proprietary keydata object search fields.
|
|
28
|
+
* <compact size uint identifier length> <bytes identifier> <compact size uint subtype> <bytes subkeydata>
|
|
29
|
+
*/
|
|
30
|
+
export interface ProprietaryKeySearch {
|
|
31
|
+
identifier: string;
|
|
32
|
+
subtype?: number;
|
|
33
|
+
keydata?: Buffer;
|
|
34
|
+
identifierEncoding?: BufferEncoding;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Search any data from psbt proprietary key value against keydata.
|
|
38
|
+
* Default identifierEncoding is utf-8 for identifier.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getPsbtInputProprietaryKeyVals(input: PsbtInput, keySearch?: ProprietaryKeySearch): ProprietaryKeyValue[];
|
|
41
|
+
/**
|
|
42
|
+
* @return partialSig/tapScriptSig/MUSIG2_PARTIAL_SIG count iff input is not finalized
|
|
43
|
+
*/
|
|
44
|
+
export declare function getPsbtInputSignatureCount(input: PsbtInput): number;
|
|
45
|
+
/**
|
|
46
|
+
* @return true iff PSBT input is finalized
|
|
47
|
+
*/
|
|
48
|
+
export declare function isPsbtInputFinalized(input: PsbtInput): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* @return true iff data starts with magic PSBT byte sequence
|
|
51
|
+
* @param data byte array or hex string
|
|
52
|
+
* */
|
|
53
|
+
export declare function isPsbt(data: Buffer | string): boolean;
|
|
54
|
+
//# sourceMappingURL=PsbtUtil.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PsbtUtil.d.ts","sourceRoot":"","sources":["../../../src/bitgo/PsbtUtil.ts"],"names":[],"mappings":";AAAA,OAAO,EAAwB,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,2BAA2B,UAAU,CAAC;AAEnD;;GAEG;AACH,oBAAY,qBAAqB;IAC/B,uBAAuB,IAAO;IAC9B,2BAA2B,IAAO;IAClC,gBAAgB,IAAO;IACvB,kBAAkB,IAAO;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,cAAc,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,EAChB,SAAS,CAAC,EAAE,oBAAoB,GAC/B,mBAAmB,EAAE,CAmBvB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE9D;AAED;;;KAGK;AACL,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAUrD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isPsbt = exports.isPsbtInputFinalized = exports.getPsbtInputSignatureCount = exports.getPsbtInputProprietaryKeyVals = exports.ProprietaryKeySubtype = exports.PSBT_PROPRIETARY_IDENTIFIER = void 0;
|
|
4
|
+
const proprietaryKeyVal_1 = require("bip174/src/lib/proprietaryKeyVal");
|
|
5
|
+
/**
|
|
6
|
+
* bitgo proprietary key identifier
|
|
7
|
+
*/
|
|
8
|
+
exports.PSBT_PROPRIETARY_IDENTIFIER = 'BITGO';
|
|
9
|
+
/**
|
|
10
|
+
* subtype for proprietary keys that bitgo uses
|
|
11
|
+
*/
|
|
12
|
+
var ProprietaryKeySubtype;
|
|
13
|
+
(function (ProprietaryKeySubtype) {
|
|
14
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["ZEC_CONSENSUS_BRANCH_ID"] = 0] = "ZEC_CONSENSUS_BRANCH_ID";
|
|
15
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PARTICIPANT_PUB_KEYS"] = 1] = "MUSIG2_PARTICIPANT_PUB_KEYS";
|
|
16
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PUB_NONCE"] = 2] = "MUSIG2_PUB_NONCE";
|
|
17
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PARTIAL_SIG"] = 3] = "MUSIG2_PARTIAL_SIG";
|
|
18
|
+
})(ProprietaryKeySubtype = exports.ProprietaryKeySubtype || (exports.ProprietaryKeySubtype = {}));
|
|
19
|
+
/**
|
|
20
|
+
* Search any data from psbt proprietary key value against keydata.
|
|
21
|
+
* Default identifierEncoding is utf-8 for identifier.
|
|
22
|
+
*/
|
|
23
|
+
function getPsbtInputProprietaryKeyVals(input, keySearch) {
|
|
24
|
+
var _a;
|
|
25
|
+
if (!((_a = input.unknownKeyVals) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
if (keySearch && keySearch.subtype === undefined && Buffer.isBuffer(keySearch.keydata)) {
|
|
29
|
+
throw new Error('invalid proprietary key search filter combination. subtype is required');
|
|
30
|
+
}
|
|
31
|
+
const keyVals = input.unknownKeyVals.map(({ key, value }, i) => {
|
|
32
|
+
return { key: proprietaryKeyVal_1.decodeProprietaryKey(key), value };
|
|
33
|
+
});
|
|
34
|
+
return keyVals.filter((keyVal) => {
|
|
35
|
+
return (keySearch === undefined ||
|
|
36
|
+
(keySearch.identifier === keyVal.key.identifier &&
|
|
37
|
+
(keySearch.subtype === undefined ||
|
|
38
|
+
(keySearch.subtype === keyVal.key.subtype &&
|
|
39
|
+
(!Buffer.isBuffer(keySearch.keydata) || keySearch.keydata.equals(keyVal.key.keydata))))));
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
exports.getPsbtInputProprietaryKeyVals = getPsbtInputProprietaryKeyVals;
|
|
43
|
+
/**
|
|
44
|
+
* @return partialSig/tapScriptSig/MUSIG2_PARTIAL_SIG count iff input is not finalized
|
|
45
|
+
*/
|
|
46
|
+
function getPsbtInputSignatureCount(input) {
|
|
47
|
+
if (isPsbtInputFinalized(input)) {
|
|
48
|
+
throw new Error('Input is already finalized');
|
|
49
|
+
}
|
|
50
|
+
return Math.max(Array.isArray(input.partialSig) ? input.partialSig.length : 0, Array.isArray(input.tapScriptSig) ? input.tapScriptSig.length : 0, getPsbtInputProprietaryKeyVals(input, {
|
|
51
|
+
identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
|
|
52
|
+
subtype: ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
|
|
53
|
+
}).length);
|
|
54
|
+
}
|
|
55
|
+
exports.getPsbtInputSignatureCount = getPsbtInputSignatureCount;
|
|
56
|
+
/**
|
|
57
|
+
* @return true iff PSBT input is finalized
|
|
58
|
+
*/
|
|
59
|
+
function isPsbtInputFinalized(input) {
|
|
60
|
+
return Buffer.isBuffer(input.finalScriptSig) || Buffer.isBuffer(input.finalScriptWitness);
|
|
61
|
+
}
|
|
62
|
+
exports.isPsbtInputFinalized = isPsbtInputFinalized;
|
|
63
|
+
/**
|
|
64
|
+
* @return true iff data starts with magic PSBT byte sequence
|
|
65
|
+
* @param data byte array or hex string
|
|
66
|
+
* */
|
|
67
|
+
function isPsbt(data) {
|
|
68
|
+
// https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#specification
|
|
69
|
+
// 0x70736274 - ASCII for 'psbt'. 0xff - separator
|
|
70
|
+
if (typeof data === 'string') {
|
|
71
|
+
if (data.length < 10) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
data = Buffer.from(data.slice(0, 10), 'hex');
|
|
75
|
+
}
|
|
76
|
+
return 5 <= data.length && data.readUInt32BE(0) === 0x70736274 && data.readUInt8(4) === 0xff;
|
|
77
|
+
}
|
|
78
|
+
exports.isPsbt = isPsbt;
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHNidFV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vUHNidFV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQXdGO0FBR3hGOztHQUVHO0FBQ1UsUUFBQSwyQkFBMkIsR0FBRyxPQUFPLENBQUM7QUFFbkQ7O0dBRUc7QUFDSCxJQUFZLHFCQUtYO0FBTEQsV0FBWSxxQkFBcUI7SUFDL0IsdUdBQThCLENBQUE7SUFDOUIsK0dBQWtDLENBQUE7SUFDbEMseUZBQXVCLENBQUE7SUFDdkIsNkZBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLHFCQUFxQixHQUFyQiw2QkFBcUIsS0FBckIsNkJBQXFCLFFBS2hDO0FBdUJEOzs7R0FHRztBQUNILFNBQWdCLDhCQUE4QixDQUM1QyxLQUFnQixFQUNoQixTQUFnQzs7SUFFaEMsSUFBSSxDQUFDLENBQUEsTUFBQSxLQUFLLENBQUMsY0FBYywwQ0FBRSxNQUFNLENBQUEsRUFBRTtRQUNqQyxPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDdEYsTUFBTSxJQUFJLEtBQUssQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0tBQzNGO0lBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM3RCxPQUFPLEVBQUUsR0FBRyxFQUFFLHdDQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDL0IsT0FBTyxDQUNMLFNBQVMsS0FBSyxTQUFTO1lBQ3ZCLENBQUMsU0FBUyxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVU7Z0JBQzdDLENBQUMsU0FBUyxDQUFDLE9BQU8sS0FBSyxTQUFTO29CQUM5QixDQUFDLFNBQVMsQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPO3dCQUN2QyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMvRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBdEJELHdFQXNCQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQUMsS0FBZ0I7SUFDekQsSUFBSSxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7S0FDL0M7SUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQ2IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzdELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNqRSw4QkFBOEIsQ0FBQyxLQUFLLEVBQUU7UUFDcEMsVUFBVSxFQUFFLG1DQUEyQjtRQUN2QyxPQUFPLEVBQUUscUJBQXFCLENBQUMsa0JBQWtCO0tBQ2xELENBQUMsQ0FBQyxNQUFNLENBQ1YsQ0FBQztBQUNKLENBQUM7QUFaRCxnRUFZQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsS0FBZ0I7SUFDbkQsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQzVGLENBQUM7QUFGRCxvREFFQztBQUVEOzs7S0FHSztBQUNMLFNBQWdCLE1BQU0sQ0FBQyxJQUFxQjtJQUMxQywrRUFBK0U7SUFDL0Usa0RBQWtEO0lBQ2xELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzlDO0lBQ0QsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUMvRixDQUFDO0FBVkQsd0JBVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWNvZGVQcm9wcmlldGFyeUtleSwgUHJvcHJpZXRhcnlLZXkgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9wcm9wcmlldGFyeUtleVZhbCc7XG5pbXBvcnQgeyBQc2J0SW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBiaXRnbyBwcm9wcmlldGFyeSBrZXkgaWRlbnRpZmllclxuICovXG5leHBvcnQgY29uc3QgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSID0gJ0JJVEdPJztcblxuLyoqXG4gKiBzdWJ0eXBlIGZvciBwcm9wcmlldGFyeSBrZXlzIHRoYXQgYml0Z28gdXNlc1xuICovXG5leHBvcnQgZW51bSBQcm9wcmlldGFyeUtleVN1YnR5cGUge1xuICBaRUNfQ09OU0VOU1VTX0JSQU5DSF9JRCA9IDB4MDAsXG4gIE1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyA9IDB4MDEsXG4gIE1VU0lHMl9QVUJfTk9OQ0UgPSAweDAyLFxuICBNVVNJRzJfUEFSVElBTF9TSUcgPSAweDAzLFxufVxuXG4vKipcbiAqIFBzYnQgcHJvcHJpZXRhcnkga2V5ZGF0YSBvYmplY3QuXG4gKiA8Y29tcGFjdCBzaXplIHVpbnQgaWRlbnRpZmllciBsZW5ndGg+IDxieXRlcyBpZGVudGlmaWVyPiA8Y29tcGFjdCBzaXplIHVpbnQgc3VidHlwZT4gPGJ5dGVzIHN1YmtleWRhdGE+XG4gKiA9PiA8Ynl0ZXMgdmFsdWVkYXRhPlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ByaWV0YXJ5S2V5VmFsdWUge1xuICBrZXk6IFByb3ByaWV0YXJ5S2V5O1xuICB2YWx1ZTogQnVmZmVyO1xufVxuXG4vKipcbiAqIFBzYnQgcHJvcHJpZXRhcnkga2V5ZGF0YSBvYmplY3Qgc2VhcmNoIGZpZWxkcy5cbiAqIDxjb21wYWN0IHNpemUgdWludCBpZGVudGlmaWVyIGxlbmd0aD4gPGJ5dGVzIGlkZW50aWZpZXI+IDxjb21wYWN0IHNpemUgdWludCBzdWJ0eXBlPiA8Ynl0ZXMgc3Via2V5ZGF0YT5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wcmlldGFyeUtleVNlYXJjaCB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgc3VidHlwZT86IG51bWJlcjtcbiAga2V5ZGF0YT86IEJ1ZmZlcjtcbiAgaWRlbnRpZmllckVuY29kaW5nPzogQnVmZmVyRW5jb2Rpbmc7XG59XG5cbi8qKlxuICogU2VhcmNoIGFueSBkYXRhIGZyb20gcHNidCBwcm9wcmlldGFyeSBrZXkgdmFsdWUgYWdhaW5zdCBrZXlkYXRhLlxuICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMoXG4gIGlucHV0OiBQc2J0SW5wdXQsXG4gIGtleVNlYXJjaD86IFByb3ByaWV0YXJ5S2V5U2VhcmNoXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlW10ge1xuICBpZiAoIWlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGtleVNlYXJjaCAmJiBrZXlTZWFyY2guc3VidHlwZSA9PT0gdW5kZWZpbmVkICYmIEJ1ZmZlci5pc0J1ZmZlcihrZXlTZWFyY2gua2V5ZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJvcHJpZXRhcnkga2V5IHNlYXJjaCBmaWx0ZXIgY29tYmluYXRpb24uIHN1YnR5cGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBjb25zdCBrZXlWYWxzID0gaW5wdXQudW5rbm93bktleVZhbHMubWFwKCh7IGtleSwgdmFsdWUgfSwgaSkgPT4ge1xuICAgIHJldHVybiB7IGtleTogZGVjb2RlUHJvcHJpZXRhcnlLZXkoa2V5KSwgdmFsdWUgfTtcbiAgfSk7XG4gIHJldHVybiBrZXlWYWxzLmZpbHRlcigoa2V5VmFsKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGtleVNlYXJjaCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAoa2V5U2VhcmNoLmlkZW50aWZpZXIgPT09IGtleVZhbC5rZXkuaWRlbnRpZmllciAmJlxuICAgICAgICAoa2V5U2VhcmNoLnN1YnR5cGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChrZXlTZWFyY2guc3VidHlwZSA9PT0ga2V5VmFsLmtleS5zdWJ0eXBlICYmXG4gICAgICAgICAgICAoIUJ1ZmZlci5pc0J1ZmZlcihrZXlTZWFyY2gua2V5ZGF0YSkgfHwga2V5U2VhcmNoLmtleWRhdGEuZXF1YWxzKGtleVZhbC5rZXkua2V5ZGF0YSkpKSkpXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQHJldHVybiBwYXJ0aWFsU2lnL3RhcFNjcmlwdFNpZy9NVVNJRzJfUEFSVElBTF9TSUcgY291bnQgaWZmIGlucHV0IGlzIG5vdCBmaW5hbGl6ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50KGlucHV0OiBQc2J0SW5wdXQpOiBudW1iZXIge1xuICBpZiAoaXNQc2J0SW5wdXRGaW5hbGl6ZWQoaW5wdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBpcyBhbHJlYWR5IGZpbmFsaXplZCcpO1xuICB9XG4gIHJldHVybiBNYXRoLm1heChcbiAgICBBcnJheS5pc0FycmF5KGlucHV0LnBhcnRpYWxTaWcpID8gaW5wdXQucGFydGlhbFNpZy5sZW5ndGggOiAwLFxuICAgIEFycmF5LmlzQXJyYXkoaW5wdXQudGFwU2NyaXB0U2lnKSA/IGlucHV0LnRhcFNjcmlwdFNpZy5sZW5ndGggOiAwLFxuICAgIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwge1xuICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICB9KS5sZW5ndGhcbiAgKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHRydWUgaWZmIFBTQlQgaW5wdXQgaXMgZmluYWxpemVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnRJbnB1dEZpbmFsaXplZChpbnB1dDogUHNidElucHV0KTogYm9vbGVhbiB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoaW5wdXQuZmluYWxTY3JpcHRTaWcpIHx8IEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC5maW5hbFNjcmlwdFdpdG5lc3MpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgZGF0YSBzdGFydHMgd2l0aCBtYWdpYyBQU0JUIGJ5dGUgc2VxdWVuY2VcbiAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgb3IgaGV4IHN0cmluZ1xuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnQoZGF0YTogQnVmZmVyIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAxNzQubWVkaWF3aWtpI3NwZWNpZmljYXRpb25cbiAgLy8gMHg3MDczNjI3NCAtIEFTQ0lJIGZvciAncHNidCcuIDB4ZmYgLSBzZXBhcmF0b3JcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IDEwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLnNsaWNlKDAsIDEwKSwgJ2hleCcpO1xuICB9XG4gIHJldHVybiA1IDw9IGRhdGEubGVuZ3RoICYmIGRhdGEucmVhZFVJbnQzMkJFKDApID09PSAweDcwNzM2Mjc0ICYmIGRhdGEucmVhZFVJbnQ4KDQpID09PSAweGZmO1xufVxuIl19
|