utxo-lib 1.0.7 → 1.0.9
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/src/base_crypto.d.ts +14 -0
- package/dist/src/base_crypto.d.ts.map +1 -0
- package/dist/src/base_crypto.js +215 -0
- package/dist/src/bitgo/Musig2.js +2 -3
- package/dist/src/bitgo/UtxoPsbt.js +12 -20
- package/dist/src/bitgo/UtxoTransaction.js +2 -2
- package/dist/src/bitgo/outputScripts.js +3 -3
- package/dist/src/bitgo/parseInput.js +2 -2
- package/dist/src/bitgo/psbt/scriptTypes.js +3 -3
- package/dist/src/bitgo/wallet/chains.d.ts +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +2 -3
- package/dist/src/bitgo/zcash/ZcashTransaction.js +2 -2
- package/dist/src/musig.d.ts +391 -0
- package/dist/src/musig.d.ts.map +1 -0
- package/dist/src/musig.js +461 -0
- package/dist/src/noble_ecc.d.ts +1 -1
- package/dist/src/noble_ecc.d.ts.map +1 -1
- package/dist/src/noble_ecc.js +5 -5
- package/dist/src/payments/p2tr.js +9 -13
- package/dist/src/payments/p2tr_ns.js +2 -3
- package/dist/src/taproot.js +2 -3
- package/dist/src/transaction_builder.js +2 -2
- package/package.json +1 -2
@@ -0,0 +1,14 @@
|
|
1
|
+
export declare function readScalar(bytes: Uint8Array): bigint;
|
2
|
+
export declare function readSecret(bytes: Uint8Array): bigint;
|
3
|
+
export declare function isPoint(p: Uint8Array): boolean;
|
4
|
+
export declare function isXOnlyPoint(p: Uint8Array): boolean;
|
5
|
+
export declare function scalarAdd(a: Uint8Array, b: Uint8Array): Uint8Array;
|
6
|
+
export declare function scalarMultiply(a: Uint8Array, b: Uint8Array): Uint8Array;
|
7
|
+
export declare function scalarNegate(a: Uint8Array): Uint8Array;
|
8
|
+
export declare function scalarMod(a: Uint8Array): Uint8Array;
|
9
|
+
export declare function isScalar(t: Uint8Array): boolean;
|
10
|
+
export declare function isSecret(s: Uint8Array): boolean;
|
11
|
+
export declare function pointNegate(p: Uint8Array): Uint8Array;
|
12
|
+
export declare function pointX(p: Uint8Array): Uint8Array;
|
13
|
+
export declare function hasEvenY(p: Uint8Array): boolean;
|
14
|
+
//# sourceMappingURL=base_crypto.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"base_crypto.d.ts","sourceRoot":"","sources":["../../src/base_crypto.ts"],"names":[],"mappings":"AA4CA,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAkCD,wBAAgB,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAqB9C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAOnD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAKlE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAKvE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAItD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAInD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAO/C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAO/C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAcrD;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAIhD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAW/C"}
|
@@ -0,0 +1,215 @@
|
|
1
|
+
"use strict";
|
2
|
+
// BigInt / Uint8Array versions of Crypto functions that do not require point
|
3
|
+
// math. If your JS interpreter has BigInt, you can use all of these. If not,
|
4
|
+
// you'll need to either shim it in or override more of these functions.
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.hasEvenY = exports.pointX = exports.pointNegate = exports.isSecret = exports.isScalar = exports.scalarMod = exports.scalarNegate = exports.scalarMultiply = exports.scalarAdd = exports.isXOnlyPoint = exports.isPoint = exports.readSecret = exports.readScalar = void 0;
|
7
|
+
// Idea from noble-secp256k1, be nice to bad JS parsers
|
8
|
+
const _0n = BigInt(0);
|
9
|
+
const _1n = BigInt(1);
|
10
|
+
const _2n = BigInt(2);
|
11
|
+
const _3n = BigInt(3);
|
12
|
+
const _5n = BigInt(5);
|
13
|
+
const _7n = BigInt(7);
|
14
|
+
const _64n = BigInt(64);
|
15
|
+
const _64mask = BigInt('0xFFFFFFFFFFFFFFFF');
|
16
|
+
const MAX_INT = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF');
|
17
|
+
const CURVE = {
|
18
|
+
b: BigInt(7),
|
19
|
+
P: BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F'),
|
20
|
+
n: BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141'),
|
21
|
+
};
|
22
|
+
// Big Endian
|
23
|
+
function read32b(bytes) {
|
24
|
+
if (bytes.length !== 32)
|
25
|
+
throw new Error(`Expected 32-bytes, not ${bytes.length}`);
|
26
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
27
|
+
let b = view.getBigUint64(0);
|
28
|
+
for (let offs = 8; offs < bytes.length; offs += 8) {
|
29
|
+
b <<= _64n;
|
30
|
+
b += view.getBigUint64(offs);
|
31
|
+
}
|
32
|
+
return b;
|
33
|
+
}
|
34
|
+
function write32b(num, dest = new Uint8Array(32)) {
|
35
|
+
// All input values are modulo P or n, so no bounds checking needed
|
36
|
+
const view = new DataView(dest.buffer, dest.byteOffset, dest.length);
|
37
|
+
for (let offs = 24; offs >= 0; offs -= 8) {
|
38
|
+
view.setBigUint64(offs, num & _64mask);
|
39
|
+
num >>= _64n;
|
40
|
+
}
|
41
|
+
return dest;
|
42
|
+
}
|
43
|
+
function readScalar(bytes) {
|
44
|
+
const a = read32b(bytes);
|
45
|
+
if (a >= CURVE.n)
|
46
|
+
throw new Error('Expected value mod n');
|
47
|
+
return a;
|
48
|
+
}
|
49
|
+
exports.readScalar = readScalar;
|
50
|
+
function readSecret(bytes) {
|
51
|
+
const a = readScalar(bytes);
|
52
|
+
if (a === 0n)
|
53
|
+
throw new Error('Expected non-zero');
|
54
|
+
return a;
|
55
|
+
}
|
56
|
+
exports.readSecret = readSecret;
|
57
|
+
// The short Weierstrass form curve equation simplifes to y^2 = x^3 + 7.
|
58
|
+
function secp256k1Right(x) {
|
59
|
+
const x2 = (x * x) % CURVE.P;
|
60
|
+
const x3 = (x2 * x) % CURVE.P;
|
61
|
+
return (x3 + CURVE.b) % CURVE.P;
|
62
|
+
}
|
63
|
+
// For prime P, the Jacobi Symbol of 'a' is 1 if and only if 'a' is a quadratic
|
64
|
+
// residue mod P, ie. there exists a value 'x' for whom x^2 = a.
|
65
|
+
function jacobiSymbol(a) {
|
66
|
+
if (a === _0n)
|
67
|
+
return 0; // Vanishingly improbable
|
68
|
+
let p = CURVE.P;
|
69
|
+
let sign = 1;
|
70
|
+
// This algorithm is fairly heavily optimized, so don't simplify it w/o benchmarking
|
71
|
+
for (;;) {
|
72
|
+
let and3;
|
73
|
+
// Handle runs of zeros efficiently w/o flipping sign each time
|
74
|
+
for (and3 = a & _3n; and3 === _0n; a >>= _2n, and3 = a & _3n)
|
75
|
+
;
|
76
|
+
// If there's one more zero, shift it off and flip the sign
|
77
|
+
if (and3 === _2n) {
|
78
|
+
a >>= _1n;
|
79
|
+
const pand7 = p & _7n;
|
80
|
+
if (pand7 === _3n || pand7 === _5n)
|
81
|
+
sign = -sign;
|
82
|
+
}
|
83
|
+
if (a === _1n)
|
84
|
+
break;
|
85
|
+
if ((_3n & a) === _3n && (_3n & p) === _3n)
|
86
|
+
sign = -sign;
|
87
|
+
[a, p] = [p % a, a];
|
88
|
+
}
|
89
|
+
return sign > 0 ? 1 : -1;
|
90
|
+
}
|
91
|
+
function isPoint(p) {
|
92
|
+
if (p.length < 33)
|
93
|
+
return false;
|
94
|
+
const t = p[0];
|
95
|
+
if (p.length === 33) {
|
96
|
+
return (t === 0x02 || t === 0x03) && isXOnlyPoint(p.subarray(1));
|
97
|
+
}
|
98
|
+
if (t !== 0x04 || p.length !== 65)
|
99
|
+
return false;
|
100
|
+
const x = read32b(p.subarray(1, 33));
|
101
|
+
if (x === _0n)
|
102
|
+
return false;
|
103
|
+
if (x >= CURVE.P)
|
104
|
+
return false;
|
105
|
+
const y = read32b(p.subarray(33));
|
106
|
+
if (y === _0n)
|
107
|
+
return false;
|
108
|
+
if (y >= CURVE.P)
|
109
|
+
return false;
|
110
|
+
const left = (y * y) % CURVE.P;
|
111
|
+
const right = secp256k1Right(x);
|
112
|
+
return left === right;
|
113
|
+
}
|
114
|
+
exports.isPoint = isPoint;
|
115
|
+
function isXOnlyPoint(p) {
|
116
|
+
if (p.length !== 32)
|
117
|
+
return false;
|
118
|
+
const x = read32b(p);
|
119
|
+
if (x === _0n)
|
120
|
+
return false;
|
121
|
+
if (x >= CURVE.P)
|
122
|
+
return false;
|
123
|
+
const y2 = secp256k1Right(x);
|
124
|
+
return jacobiSymbol(y2) === 1; // If sqrt(y^2) exists, x is on the curve.
|
125
|
+
}
|
126
|
+
exports.isXOnlyPoint = isXOnlyPoint;
|
127
|
+
function scalarAdd(a, b) {
|
128
|
+
const aN = readScalar(a);
|
129
|
+
const bN = readScalar(b);
|
130
|
+
const sum = (aN + bN) % CURVE.n;
|
131
|
+
return write32b(sum);
|
132
|
+
}
|
133
|
+
exports.scalarAdd = scalarAdd;
|
134
|
+
function scalarMultiply(a, b) {
|
135
|
+
const aN = readScalar(a);
|
136
|
+
const bN = readScalar(b);
|
137
|
+
const product = (aN * bN) % CURVE.n;
|
138
|
+
return write32b(product);
|
139
|
+
}
|
140
|
+
exports.scalarMultiply = scalarMultiply;
|
141
|
+
function scalarNegate(a) {
|
142
|
+
const aN = readScalar(a);
|
143
|
+
const negated = aN === _0n ? _0n : CURVE.n - aN;
|
144
|
+
return write32b(negated);
|
145
|
+
}
|
146
|
+
exports.scalarNegate = scalarNegate;
|
147
|
+
function scalarMod(a) {
|
148
|
+
const aN = read32b(a);
|
149
|
+
const remainder = aN % CURVE.n;
|
150
|
+
return write32b(remainder);
|
151
|
+
}
|
152
|
+
exports.scalarMod = scalarMod;
|
153
|
+
function isScalar(t) {
|
154
|
+
try {
|
155
|
+
readScalar(t);
|
156
|
+
return true;
|
157
|
+
}
|
158
|
+
catch {
|
159
|
+
return false;
|
160
|
+
}
|
161
|
+
}
|
162
|
+
exports.isScalar = isScalar;
|
163
|
+
function isSecret(s) {
|
164
|
+
try {
|
165
|
+
readSecret(s);
|
166
|
+
return true;
|
167
|
+
}
|
168
|
+
catch {
|
169
|
+
return false;
|
170
|
+
}
|
171
|
+
}
|
172
|
+
exports.isSecret = isSecret;
|
173
|
+
function pointNegate(p) {
|
174
|
+
// hasEvenY does basic structure check, so start there
|
175
|
+
const even = hasEvenY(p);
|
176
|
+
// `from` because node.Buffer.slice doesn't copy but looks like a Uint8Array
|
177
|
+
const negated = Uint8Array.from(p);
|
178
|
+
if (p.length === 33) {
|
179
|
+
negated[0] = even ? 3 : 2;
|
180
|
+
}
|
181
|
+
else if (p.length === 65) {
|
182
|
+
const y = read32b(p.subarray(33));
|
183
|
+
if (y >= CURVE.P)
|
184
|
+
throw new Error('Expected Y coordinate mod P');
|
185
|
+
const minusY = y === _0n ? _0n : CURVE.P - y;
|
186
|
+
write32b(minusY, negated.subarray(33));
|
187
|
+
}
|
188
|
+
return negated;
|
189
|
+
}
|
190
|
+
exports.pointNegate = pointNegate;
|
191
|
+
function pointX(p) {
|
192
|
+
if (p.length === 32)
|
193
|
+
return p;
|
194
|
+
hasEvenY(p); // hasEvenY throws if not well structured
|
195
|
+
return p.slice(1, 33);
|
196
|
+
}
|
197
|
+
exports.pointX = pointX;
|
198
|
+
function hasEvenY(p) {
|
199
|
+
if (p.length === 33) {
|
200
|
+
if (p[0] === 2)
|
201
|
+
return true;
|
202
|
+
else if (p[0] === 3)
|
203
|
+
return false;
|
204
|
+
else
|
205
|
+
throw new Error('Wrong first byte to be a point');
|
206
|
+
}
|
207
|
+
if (p.length === 65) {
|
208
|
+
if (p[0] !== 4)
|
209
|
+
throw new Error('Wrong first byte to be point');
|
210
|
+
return p[64] % 2 === 0;
|
211
|
+
}
|
212
|
+
throw new Error('Wrong length to be a point');
|
213
|
+
}
|
214
|
+
exports.hasEvenY = hasEvenY;
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9jcnlwdG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZV9jcnlwdG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0Usd0VBQXdFOzs7QUFFeEUsdURBQXVEO0FBQ3ZELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUU3QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsb0VBQW9FLENBQUMsQ0FBQztBQUU3RixNQUFNLEtBQUssR0FBRztJQUNaLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxFQUFFLE1BQU0sQ0FBQyxvRUFBb0UsQ0FBQztJQUMvRSxDQUFDLEVBQUUsTUFBTSxDQUFDLG9FQUFvRSxDQUFDO0NBQ2hGLENBQUM7QUFFRixhQUFhO0FBQ2IsU0FBUyxPQUFPLENBQUMsS0FBaUI7SUFDaEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEVBQUU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNuRixNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxL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SyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUNBQXlDO0lBQ3RELE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUpELHdCQUlDO0FBRUQsU0FBZ0IsUUFBUSxDQUFDLENBQWE7SUFDcEMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtRQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7YUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDOztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7S0FDeEQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ25CLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDaEUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4QjtJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBWEQsNEJBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCaWdJbnQgLyBVaW50OEFycmF5IHZlcnNpb25zIG9mIENyeXB0byBmdW5jdGlvbnMgdGhhdCBkbyBub3QgcmVxdWlyZSBwb2ludFxuLy8gbWF0aC4gSWYgeW91ciBKUyBpbnRlcnByZXRlciBoYXMgQmlnSW50LCB5b3UgY2FuIHVzZSBhbGwgb2YgdGhlc2UuIElmIG5vdCxcbi8vIHlvdSdsbCBuZWVkIHRvIGVpdGhlciBzaGltIGl0IGluIG9yIG92ZXJyaWRlIG1vcmUgb2YgdGhlc2UgZnVuY3Rpb25zLlxuXG4vLyBJZGVhIGZyb20gbm9ibGUtc2VjcDI1NmsxLCBiZSBuaWNlIHRvIGJhZCBKUyBwYXJzZXJzXG5jb25zdCBfMG4gPSBCaWdJbnQoMCk7XG5jb25zdCBfMW4gPSBCaWdJbnQoMSk7XG5jb25zdCBfMm4gPSBCaWdJbnQoMik7XG5jb25zdCBfM24gPSBCaWdJbnQoMyk7XG5jb25zdCBfNW4gPSBCaWdJbnQoNSk7XG5jb25zdCBfN24gPSBCaWdJbnQoNyk7XG5jb25zdCBfNjRuID0gQmlnSW50KDY0KTtcbmNvbnN0IF82NG1hc2sgPSBCaWdJbnQoJzB4RkZGRkZGRkZGRkZGRkZGRicpO1xuXG5jb25zdCBNQVhfSU5UID0gQmlnSW50KCcweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYnKTtcblxuY29uc3QgQ1VSVkUgPSB7XG4gIGI6IEJpZ0ludCg3KSxcbiAgUDogQmlnSW50KCcweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZDMkYnKSxcbiAgbjogQmlnSW50KCcweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFQkFBRURDRTZBRjQ4QTAzQkJGRDI1RThDRDAzNjQxNDEnKSxcbn07XG5cbi8vIEJpZyBFbmRpYW5cbmZ1bmN0aW9uIHJlYWQzMmIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICBpZiAoYnl0ZXMubGVuZ3RoICE9PSAzMikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAzMi1ieXRlcywgbm90ICR7Ynl0ZXMubGVuZ3RofWApO1xuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlciwgYnl0ZXMuYnl0ZU9mZnNldCwgYnl0ZXMubGVuZ3RoKTtcbiAgbGV0IGIgPSB2aWV3LmdldEJpZ1VpbnQ2NCgwKTtcbiAgZm9yIChsZXQgb2ZmcyA9IDg7IG9mZnMgPCBieXRlcy5sZW5ndGg7IG9mZnMgKz0gOCkge1xuICAgIGIgPDw9IF82NG47XG4gICAgYiArPSB2aWV3LmdldEJpZ1VpbnQ2NChvZmZzKTtcbiAgfVxuICByZXR1cm4gYjtcbn1cblxuZnVuY3Rpb24gd3JpdGUzMmIobnVtOiBiaWdpbnQsIGRlc3Q6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgzMikpOiBVaW50OEFycmF5IHtcbiAgLy8gQWxsIGlucHV0IHZhbHVlcyBhcmUgbW9kdWxvIFAgb3Igbiwgc28gbm8gYm91bmRzIGNoZWNraW5nIG5lZWRlZFxuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGRlc3QuYnVmZmVyLCBkZXN0LmJ5dGVPZmZzZXQsIGRlc3QubGVuZ3RoKTtcbiAgZm9yIChsZXQgb2ZmcyA9IDI0OyBvZmZzID49IDA7IG9mZnMgLT0gOCkge1xuICAgIHZpZXcuc2V0QmlnVWludDY0KG9mZnMsIG51bSAmIF82NG1hc2spO1xuICAgIG51bSA+Pj0gXzY0bjtcbiAgfVxuICByZXR1cm4gZGVzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTY2FsYXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICBjb25zdCBhID0gcmVhZDMyYihieXRlcyk7XG4gIGlmIChhID49IENVUlZFLm4pIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFsdWUgbW9kIG4nKTtcbiAgcmV0dXJuIGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkU2VjcmV0KGJ5dGVzOiBVaW50OEFycmF5KTogYmlnaW50IHtcbiAgY29uc3QgYSA9IHJlYWRTY2FsYXIoYnl0ZXMpO1xuICBpZiAoYSA9PT0gMG4pIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbm9uLXplcm8nKTtcbiAgcmV0dXJuIGE7XG59XG5cbi8vIFRoZSBzaG9ydCBXZWllcnN0cmFzcyBmb3JtIGN1cnZlIGVxdWF0aW9uIHNpbXBsaWZlcyB0byB5XjIgPSB4XjMgKyA3LlxuZnVuY3Rpb24gc2VjcDI1NmsxUmlnaHQoeDogYmlnaW50KTogYmlnaW50IHtcbiAgY29uc3QgeDIgPSAoeCAqIHgpICUgQ1VSVkUuUDtcbiAgY29uc3QgeDMgPSAoeDIgKiB4KSAlIENVUlZFLlA7XG4gIHJldHVybiAoeDMgKyBDVVJWRS5iKSAlIENVUlZFLlA7XG59XG5cbi8vIEZvciBwcmltZSBQLCB0aGUgSmFjb2JpIFN5bWJvbCBvZiAnYScgaXMgMSBpZiBhbmQgb25seSBpZiAnYScgaXMgYSBxdWFkcmF0aWNcbi8vIHJlc2lkdWUgbW9kIFAsIGllLiB0aGVyZSBleGlzdHMgYSB2YWx1ZSAneCcgZm9yIHdob20geF4yID0gYS5cbmZ1bmN0aW9uIGphY29iaVN5bWJvbChhOiBiaWdpbnQpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEgPT09IF8wbikgcmV0dXJuIDA7IC8vIFZhbmlzaGluZ2x5IGltcHJvYmFibGVcblxuICBsZXQgcCA9IENVUlZFLlA7XG4gIGxldCBzaWduID0gMTtcbiAgLy8gVGhpcyBhbGdvcml0aG0gaXMgZmFpcmx5IGhlYXZpbHkgb3B0aW1pemVkLCBzbyBkb24ndCBzaW1wbGlmeSBpdCB3L28gYmVuY2htYXJraW5nXG4gIGZvciAoOzspIHtcbiAgICBsZXQgYW5kMztcbiAgICAvLyBIYW5kbGUgcnVucyBvZiB6ZXJvcyBlZmZpY2llbnRseSB3L28gZmxpcHBpbmcgc2lnbiBlYWNoIHRpbWVcbiAgICBmb3IgKGFuZDMgPSBhICYgXzNuOyBhbmQzID09PSBfMG47IGEgPj49IF8ybiwgYW5kMyA9IGEgJiBfM24pO1xuICAgIC8vIElmIHRoZXJlJ3Mgb25lIG1vcmUgemVybywgc2hpZnQgaXQgb2ZmIGFuZCBmbGlwIHRoZSBzaWduXG4gICAgaWYgKGFuZDMgPT09IF8ybikge1xuICAgICAgYSA+Pj0gXzFuO1xuICAgICAgY29uc3QgcGFuZDcgPSBwICYgXzduO1xuICAgICAgaWYgKHBhbmQ3ID09PSBfM24gfHwgcGFuZDcgPT09IF81bikgc2lnbiA9IC1zaWduO1xuICAgIH1cbiAgICBpZiAoYSA9PT0gXzFuKSBicmVhaztcbiAgICBpZiAoKF8zbiAmIGEpID09PSBfM24gJiYgKF8zbiAmIHApID09PSBfM24pIHNpZ24gPSAtc2lnbjtcbiAgICBbYSwgcF0gPSBbcCAlIGEsIGFdO1xuICB9XG4gIHJldHVybiBzaWduID4gMCA/IDEgOiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9pbnQocDogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICBpZiAocC5sZW5ndGggPCAzMykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHQgPSBwWzBdO1xuICBpZiAocC5sZW5ndGggPT09IDMzKSB7XG4gICAgcmV0dXJuICh0ID09PSAweDAyIHx8IHQgPT09IDB4MDMpICYmIGlzWE9ubHlQb2ludChwLnN1YmFycmF5KDEpKTtcbiAgfVxuXG4gIGlmICh0ICE9PSAweDA0IHx8IHAubGVuZ3RoICE9PSA2NSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHggPSByZWFkMzJiKHAuc3ViYXJyYXkoMSwgMzMpKTtcbiAgaWYgKHggPT09IF8wbikgcmV0dXJuIGZhbHNlO1xuICBpZiAoeCA+PSBDVVJWRS5QKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgeSA9IHJlYWQzMmIocC5zdWJhcnJheSgzMykpO1xuICBpZiAoeSA9PT0gXzBuKSByZXR1cm4gZmFsc2U7XG4gIGlmICh5ID49IENVUlZFLlApIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsZWZ0ID0gKHkgKiB5KSAlIENVUlZFLlA7XG4gIGNvbnN0IHJpZ2h0ID0gc2VjcDI1NmsxUmlnaHQoeCk7XG4gIHJldHVybiBsZWZ0ID09PSByaWdodDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWE9ubHlQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIGlmIChwLmxlbmd0aCAhPT0gMzIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgeCA9IHJlYWQzMmIocCk7XG4gIGlmICh4ID09PSBfMG4pIHJldHVybiBmYWxzZTtcbiAgaWYgKHggPj0gQ1VSVkUuUCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB5MiA9IHNlY3AyNTZrMVJpZ2h0KHgpO1xuICByZXR1cm4gamFjb2JpU3ltYm9sKHkyKSA9PT0gMTsgLy8gSWYgc3FydCh5XjIpIGV4aXN0cywgeCBpcyBvbiB0aGUgY3VydmUuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsYXJBZGQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBhTiA9IHJlYWRTY2FsYXIoYSk7XG4gIGNvbnN0IGJOID0gcmVhZFNjYWxhcihiKTtcbiAgY29uc3Qgc3VtID0gKGFOICsgYk4pICUgQ1VSVkUubjtcbiAgcmV0dXJuIHdyaXRlMzJiKHN1bSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsYXJNdWx0aXBseShhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGNvbnN0IGFOID0gcmVhZFNjYWxhcihhKTtcbiAgY29uc3QgYk4gPSByZWFkU2NhbGFyKGIpO1xuICBjb25zdCBwcm9kdWN0ID0gKGFOICogYk4pICUgQ1VSVkUubjtcbiAgcmV0dXJuIHdyaXRlMzJiKHByb2R1Y3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGFyTmVnYXRlKGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYU4gPSByZWFkU2NhbGFyKGEpO1xuICBjb25zdCBuZWdhdGVkID0gYU4gPT09IF8wbiA/IF8wbiA6IENVUlZFLm4gLSBhTjtcbiAgcmV0dXJuIHdyaXRlMzJiKG5lZ2F0ZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGFyTW9kKGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYU4gPSByZWFkMzJiKGEpO1xuICBjb25zdCByZW1haW5kZXIgPSBhTiAlIENVUlZFLm47XG4gIHJldHVybiB3cml0ZTMyYihyZW1haW5kZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY2FsYXIodDogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJlYWRTY2FsYXIodCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTZWNyZXQoczogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJlYWRTZWNyZXQocyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnROZWdhdGUocDogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAvLyBoYXNFdmVuWSBkb2VzIGJhc2ljIHN0cnVjdHVyZSBjaGVjaywgc28gc3RhcnQgdGhlcmVcbiAgY29uc3QgZXZlbiA9IGhhc0V2ZW5ZKHApO1xuICAvLyBgZnJvbWAgYmVjYXVzZSBub2RlLkJ1ZmZlci5zbGljZSBkb2Vzbid0IGNvcHkgYnV0IGxvb2tzIGxpa2UgYSBVaW50OEFycmF5XG4gIGNvbnN0IG5lZ2F0ZWQgPSBVaW50OEFycmF5LmZyb20ocCk7XG4gIGlmIChwLmxlbmd0aCA9PT0gMzMpIHtcbiAgICBuZWdhdGVkWzBdID0gZXZlbiA/IDMgOiAyO1xuICB9IGVsc2UgaWYgKHAubGVuZ3RoID09PSA2NSkge1xuICAgIGNvbnN0IHkgPSByZWFkMzJiKHAuc3ViYXJyYXkoMzMpKTtcbiAgICBpZiAoeSA+PSBDVVJWRS5QKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFkgY29vcmRpbmF0ZSBtb2QgUCcpO1xuICAgIGNvbnN0IG1pbnVzWSA9IHkgPT09IF8wbiA/IF8wbiA6IENVUlZFLlAgLSB5O1xuICAgIHdyaXRlMzJiKG1pbnVzWSwgbmVnYXRlZC5zdWJhcnJheSgzMykpO1xuICB9XG4gIHJldHVybiBuZWdhdGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRYKHA6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgaWYgKHAubGVuZ3RoID09PSAzMikgcmV0dXJuIHA7XG4gIGhhc0V2ZW5ZKHApOyAvLyBoYXNFdmVuWSB0aHJvd3MgaWYgbm90IHdlbGwgc3RydWN0dXJlZFxuICByZXR1cm4gcC5zbGljZSgxLCAzMyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNFdmVuWShwOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIGlmIChwLmxlbmd0aCA9PT0gMzMpIHtcbiAgICBpZiAocFswXSA9PT0gMikgcmV0dXJuIHRydWU7XG4gICAgZWxzZSBpZiAocFswXSA9PT0gMykgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBmaXJzdCBieXRlIHRvIGJlIGEgcG9pbnQnKTtcbiAgfVxuICBpZiAocC5sZW5ndGggPT09IDY1KSB7XG4gICAgaWYgKHBbMF0gIT09IDQpIHRocm93IG5ldyBFcnJvcignV3JvbmcgZmlyc3QgYnl0ZSB0byBiZSBwb2ludCcpO1xuICAgIHJldHVybiBwWzY0XSAlIDIgPT09IDA7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBsZW5ndGggdG8gYmUgYSBwb2ludCcpO1xufVxuIl19
|
package/dist/src/bitgo/Musig2.js
CHANGED
@@ -96,7 +96,6 @@ function deriveWalletPubKey(tapBip32Derivations, rootWalletKey) {
|
|
96
96
|
return rootWalletKey.derivePath(myDerivation[0].path).publicKey;
|
97
97
|
}
|
98
98
|
function getMusig2NonceKeyValueData(psbt, inputIndex, rootWalletKey, sessionId) {
|
99
|
-
var _a;
|
100
99
|
const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
|
101
100
|
if (!input.tapInternalKey) {
|
102
101
|
return;
|
@@ -104,7 +103,7 @@ function getMusig2NonceKeyValueData(psbt, inputIndex, rootWalletKey, sessionId)
|
|
104
103
|
if (!input.tapMerkleRoot) {
|
105
104
|
throw new Error('tapMerkleRoot is required to generate nonce');
|
106
105
|
}
|
107
|
-
if (!
|
106
|
+
if (!input.tapBip32Derivation?.length) {
|
108
107
|
throw new Error('tapBip32Derivation is required to generate nonce');
|
109
108
|
}
|
110
109
|
const participantsKeyVals = psbt.getProprietaryKeyVals(inputIndex, {
|
@@ -172,4 +171,4 @@ function setMusig2Nonces(psbt, rootWalletKey, sessionId) {
|
|
172
171
|
});
|
173
172
|
}
|
174
173
|
exports.setMusig2Nonces = setMusig2Nonces;
|
175
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUg7QUFDbkgsbURBQTZGO0FBRTdGLDRDQUEwQztBQUUxQyx3Q0FBNEM7QUFFNUMsZ0RBQXFEO0FBb0JyRDs7OztHQUlHO0FBQ0gsU0FBZ0Isc0NBQXNDLENBQ3BELHNCQUEwRDtJQUUxRCxNQUFNLE9BQU8sR0FBRyxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUMxRyxtQ0FBbUIsQ0FBQyxNQUFNLENBQUMsQ0FDNUIsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsbUNBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNyRyxNQUFNLEdBQUcsR0FBRztRQUNWLFVBQVUsRUFBRSxzQ0FBMkI7UUFDdkMsT0FBTyxFQUFFLGdDQUFxQixDQUFDLDJCQUEyQjtRQUMxRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDaEMsQ0FBQztJQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBYkQsd0ZBYUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isa0NBQWtDLENBQ2hELGtCQUFnRDtJQUVoRCxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQ3BGO0lBQ0QsTUFB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OUQ7SUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDL0Q7SUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7UUFDN0MsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRyxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUNsRTtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWJELDBDQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLCBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSwgVXR4b1BzYnQsIFByb3ByaWV0YXJ5S2V5U3VidHlwZSB9IGZyb20gJy4vVXR4b1BzYnQnO1xuaW1wb3J0IHsgY2hlY2tQbGFpblB1YmxpY0tleSwgY2hlY2tYT25seVB1YmxpY0tleSwgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcbmltcG9ydCB7IGVjYywgbXVzaWcgfSBmcm9tICcuLi9ub2JsZV9lY2MnO1xuaW1wb3J0IHsgVHVwbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHRhcFR3ZWFrUHVia2V5IH0gZnJvbSAnLi4vdGFwcm9vdCc7XG5pbXBvcnQgeyBUYXBCaXAzMkRlcml2YXRpb24gfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNoZWNrRm9ySW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi91dGlscyc7XG5cbi8qKlxuICogIFBhcnRpY2lwYW50IGtleSB2YWx1ZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbHVlRGF0YSB7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICB0YXBJbnRlcm5hbEtleTogQnVmZmVyO1xuICBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj47XG59XG5cbi8qKlxuICogIE5vbmNlIGtleSB2YWx1ZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMk5vbmNlc0tleVZhbHVlRGF0YSB7XG4gIHBhcnRpY2lwYW50UHViS2V5OiBCdWZmZXI7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICBwdWJOb25jZXM6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiBQc2J0IHByb3ByaWV0YXJ5IGtleSB2YWwgdXRpbCBmdW5jdGlvbiBmb3IgcGFydGljaXBhbnRzIHB1YiBrZXlzLiBTdWJUeXBlIGlzIDB4MDFcbiAqIFJlZjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2Fua2V0MTcyOS80YjUyNWM2MDQ5ZjRkOWUwMzRkMjczNjhjNDlmMjhhNlxuICogQHJldHVybiB4LW9ubHkgdGFwT3V0cHV0S2V5fHx0YXBJbnRlcm5hbEtleSBhcyBzdWIga2V5ZGF0YSwgcGxhaW4gc2lnaW5pbmcgcGFydGljaXBhbnQga2V5cyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWxEYXRhKFxuICBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzS2V5VmFsdWVEYXRhXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSB7XG4gIGNvbnN0IGtleWRhdGEgPSBbcGFydGljaXBhbnRzS2V5VmFsRGF0YS50YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50c0tleVZhbERhdGEudGFwSW50ZXJuYWxLZXldLm1hcCgocHVia2V5KSA9PlxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkocHVia2V5KVxuICApO1xuICBjb25zdCB2YWx1ZSA9IHBhcnRpY2lwYW50c0tleVZhbERhdGEucGFydGljaXBhbnRQdWJLZXlzLm1hcCgocHVia2V5KSA9PiBjaGVja1BsYWluUHVibGljS2V5KHB1YmtleSkpO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gICAga2V5ZGF0YTogQnVmZmVyLmNvbmNhdChrZXlkYXRhKSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogQnVmZmVyLmNvbmNhdCh2YWx1ZSkgfTtcbn1cblxuLyoqXG4gKiBQc2J0IHByb3ByaWV0YXJ5IGtleSB2YWwgdXRpbCBmdW5jdGlvbiBmb3IgcHViIG5vbmNlLiBTdWJUeXBlIGlzIDB4MDJcbiAqIFJlZjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2Fua2V0MTcyOS80YjUyNWM2MDQ5ZjRkOWUwMzRkMjczNjhjNDlmMjhhNlxuICogQHJldHVybiBwbGFpbi1wYXJ0aWNpcGFudFB1YktleXx8eC1vbmx5LXRhcE91dHB1dEtleSBhcyBzdWIga2V5ZGF0YSwgNjYgYnl0ZXMgb2YgMiBwdWIgbm9uY2VzIGFzIHZhbHVlZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlS2V5VmFsRGF0YShcbiAgbm9uY2VzS2V5VmFsdWVEYXRhOiBQc2J0TXVzaWcyTm9uY2VzS2V5VmFsdWVEYXRhXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSB7XG4gIGlmIChub25jZXNLZXlWYWx1ZURhdGEucHViTm9uY2VzLmxlbmd0aCAhPT0gNjYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHViTm9uY2VzIGxlbmd0aCAke25vbmNlc0tleVZhbHVlRGF0YS5wdWJOb25jZXMubGVuZ3RofWApO1xuICB9XG4gIGNvbnN0IGtleWRhdGEgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBjaGVja1BsYWluUHVibGljS2V5KG5vbmNlc0tleVZhbHVlRGF0YS5wYXJ0aWNpcGFudFB1YktleSksXG4gICAgY2hlY2tYT25seVB1YmxpY0tleShub25jZXNLZXlWYWx1ZURhdGEudGFwT3V0cHV0S2V5KSxcbiAgXSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9uY2VzS2V5VmFsdWVEYXRhLnB1Yk5vbmNlcyB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIHBhcnRpY2lwYW50IHB1YiBrZXlzXG4gKiBAcGFyYW0ga3ZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWxEYXRhKFxuICBrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZURhdGFcbik6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWx1ZURhdGEge1xuICBpZiAoXG4gICAga3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fFxuICAgIGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5c2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj4gPSBbdmFsdWUuc3ViYXJyYXkoMCwgMzMpLCB2YWx1ZS5zdWJhcnJheSgzMyldO1xuICBpZiAocGFydGljaXBhbnRQdWJLZXlzWzBdLmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgcGFydGljaXBhbnQgcHViIGtleXMgZm91bmRgKTtcbiAgfVxuXG4gIHJldHVybiB7IHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDAsIDMyKSwgdGFwSW50ZXJuYWxLZXk6IGtleS5zdWJhcnJheSgzMiksIHBhcnRpY2lwYW50UHViS2V5cyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFwSW50ZXJuYWxLZXkocGxhaW5QdWJLZXlzOiBCdWZmZXJbXSk6IEJ1ZmZlciB7XG4gIHBsYWluUHViS2V5cy5mb3JFYWNoKChwdWJLZXkpID0+IGNoZWNrUGxhaW5QdWJsaWNLZXkocHViS2V5KSk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShtdXNpZy5nZXRYT25seVB1YmtleShtdXNpZy5rZXlBZ2cobXVzaWcua2V5U29ydChwbGFpblB1YktleXMpKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFwT3V0cHV0S2V5KGludGVybmFsUHViS2V5OiBCdWZmZXIsIHRhcFRyZWVSb290OiBCdWZmZXIpOiBCdWZmZXIge1xuICBpZiAodGFwVHJlZVJvb3QubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YXBUcmVlUm9vdCBzaXplICR7dGFwVHJlZVJvb3QubGVuZ3RofWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbSh0YXBUd2Vha1B1YmtleShlY2MsIHRvWE9ubHlQdWJsaWNLZXkoaW50ZXJuYWxQdWJLZXkpLCB0YXBUcmVlUm9vdCkueE9ubHlQdWJrZXkpO1xufVxuXG5mdW5jdGlvbiBkZXJpdmVXYWxsZXRQdWJLZXkodGFwQmlwMzJEZXJpdmF0aW9uczogVGFwQmlwMzJEZXJpdmF0aW9uW10sIHJvb3RXYWxsZXRLZXk6IEJJUDMySW50ZXJmYWNlKTogQnVmZmVyIHtcbiAgY29uc3QgbXlEZXJpdmF0aW9ucyA9IHRhcEJpcDMyRGVyaXZhdGlvbnMuZmlsdGVyKChiaXBEdikgPT4ge1xuICAgIHJldHVybiBiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMocm9vdFdhbGxldEtleS5maW5nZXJwcmludCk7XG4gIH0pO1xuXG4gIGlmICghbXlEZXJpdmF0aW9ucy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCB0byBtYXRjaCB0aGUgcm9vdFdhbGxldEtleSBmaW5nZXJwcmludCcpO1xuICB9XG5cbiAgY29uc3QgbXlEZXJpdmF0aW9uID0gbXlEZXJpdmF0aW9ucy5maWx0ZXIoKGJpcER2KSA9PiB7XG4gICAgY29uc3QgcHVibGljS2V5ID0gcm9vdFdhbGxldEtleS5kZXJpdmVQYXRoKGJpcER2LnBhdGgpLnB1YmxpY0tleTtcbiAgICByZXR1cm4gYmlwRHYucHVia2V5LmVxdWFscyh0b1hPbmx5UHVibGljS2V5KHB1YmxpY0tleSkpO1xuICB9KTtcblxuICBpZiAobXlEZXJpdmF0aW9uLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncm9vdCB3YWxsZXQga2V5IHNob3VsZCBkZXJpdmUgb25lIHRhcEJpcDMyRGVyaXZhdGlvbicpO1xuICB9XG4gIHJldHVybiByb290V2FsbGV0S2V5LmRlcml2ZVBhdGgobXlEZXJpdmF0aW9uWzBdLnBhdGgpLnB1YmxpY0tleTtcbn1cblxuZnVuY3Rpb24gZ2V0TXVzaWcyTm9uY2VLZXlWYWx1ZURhdGEoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHJvb3RXYWxsZXRLZXk6IEJJUDMySW50ZXJmYWNlLFxuICBzZXNzaW9uSWQ/OiBCdWZmZXJcbik6IFByb3ByaWV0YXJ5S2V5VmFsdWVEYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBNZXJrbGVSb290IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gIH1cblxuICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBCaXAzMkRlcml2YXRpb24gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgbm9uY2UnKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRpY2lwYW50c0tleVZhbHMgPSBwc2J0LmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gIH0pO1xuXG4gIGlmIChwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aH0gbWF0Y2hpbmcgcGFydGljaXBhbnQga2V5IHZhbHVlIGluc3RlYWQgb2YgMWApO1xuICB9XG5cbiAgY29uc3QgcGFydGljaXBhbnRLZXlWYWxEYXRhID0gZGVjb2RlUHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbERhdGEocGFydGljaXBhbnRzS2V5VmFsc1swXSk7XG4gIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5cyA9IHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXM7XG5cbiAgY29uc3QgdGFwSW50ZXJuYWxLZXkgPSBjcmVhdGVUYXBJbnRlcm5hbEtleShwYXJ0aWNpcGFudFB1YktleXMpO1xuICBpZiAoIXRhcEludGVybmFsS2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50cyBrZXlhdGEgdGFwSW50ZXJuYWxLZXknKTtcbiAgfVxuXG4gIGNvbnN0IHRhcE91dHB1dEtleSA9IGNyZWF0ZVRhcE91dHB1dEtleSh0YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gIGlmICghdGFwT3V0cHV0S2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudHMga2V5YXRhIHRhcE91dHB1dEtleScpO1xuICB9XG5cbiAgaWYgKCF0YXBJbnRlcm5hbEtleS5lcXVhbHMoaW5wdXQudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBJbnRlcm5hbEtleSBhbmQgYWdncmVnYXRlZCBwYXJ0aWNpcGFudCBwdWIga2V5cyBkb2VzIG5vdCBtYXRjaCcpO1xuICB9XG5cbiAgY29uc3QgZGVyaXZlZFB1YktleSA9IGRlcml2ZVdhbGxldFB1YktleShpbnB1dC50YXBCaXAzMkRlcml2YXRpb24sIHJvb3RXYWxsZXRLZXkpO1xuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleSA9IHBhcnRpY2lwYW50UHViS2V5cy5maW5kKChwdWJLZXkpID0+IHB1YktleS5lcXVhbHMoZGVyaXZlZFB1YktleSkpO1xuXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHBhcnRpY2lwYW50UHViS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFydGljaXBhbnQgcGxhaW4gcHViIGtleSBzaG91bGQgbWF0Y2ggb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBwbGFpbiBwdWIga2V5Jyk7XG4gIH1cblxuICBjb25zdCB7IGhhc2ggfSA9IHBzYnQuZ2V0VGFwcm9vdEhhc2hGb3JTaWdDaGVja2VkKGlucHV0SW5kZXgpO1xuXG4gIGNvbnN0IG5vbmNlR2VuQXJncyA9IHtcbiAgICBzZXNzaW9uSWQsXG4gICAgcHVibGljS2V5OiBwYXJ0aWNpcGFudFB1YktleSxcbiAgICB4T25seVB1YmxpY0tleTogdGFwT3V0cHV0S2V5LFxuICAgIG1zZzogaGFzaCxcbiAgICBzZWNyZXRLZXk6IHJvb3RXYWxsZXRLZXkucHJpdmF0ZUtleSxcbiAgfTtcblxuICBjb25zdCBwdWJOb25jZXMgPSBCdWZmZXIuZnJvbShtdXNpZy5ub25jZUdlbihub25jZUdlbkFyZ3MpKTtcblxuICByZXR1cm4gZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlS2V5VmFsRGF0YSh7XG4gICAgcGFydGljaXBhbnRQdWJLZXksXG4gICAgdGFwT3V0cHV0S2V5LFxuICAgIHB1Yk5vbmNlcyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuZCBzZXRzIE11c2lnMiBub25jZXMgdG8gcDJ0ck11c2lnMiBrZXkgcGF0aCBzcGVuZGluZyBpbnB1dHMuXG4gKiB0YXBJbnRlcm5hbGtleSwgdGFwTWVya2xlUm9vdCwgdGFwQmlwMzJEZXJpdmF0aW9uIGZvciByb290V2FsbGV0S2V5IGFyZSByZXF1aXJlZCBwZXIgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbnB1dC5cbiAqIEFsc28gcGFydGljaXBhbnQga2V5cyBhcmUgcmVxdWlyZWQgZnJvbSBwc2J0IHByb3ByaWV0YXJ5IGtleSB2YWx1ZXMuXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEBwYXJhbSBwc2J0XG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleVxuICogQHBhcmFtIHNlc3Npb25JZCBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TXVzaWcyTm9uY2VzKHBzYnQ6IFV0eG9Qc2J0LCByb290V2FsbGV0S2V5OiBCSVAzMkludGVyZmFjZSwgc2Vzc2lvbklkPzogQnVmZmVyKTogdm9pZCB7XG4gIGlmIChyb290V2FsbGV0S2V5LmlzTmV1dGVyZWQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJpdmF0ZSBrZXkgaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgbm9uY2UnKTtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNlc3Npb25JZCkgJiYgc2Vzc2lvbklkLmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Vzc2lvbklkIHNpemUgJHtzZXNzaW9uSWQubGVuZ3RofWApO1xuICB9XG4gIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGlucHV0SW5kZXgpID0+IHtcbiAgICBjb25zdCBub25jZXNLZXlWYWx1ZURhdGEgPSBnZXRNdXNpZzJOb25jZUtleVZhbHVlRGF0YShwc2J0LCBpbnB1dEluZGV4LCByb290V2FsbGV0S2V5LCBzZXNzaW9uSWQpO1xuICAgIGlmIChub25jZXNLZXlWYWx1ZURhdGEpIHtcbiAgICAgIHBzYnQuYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIG5vbmNlc0tleVZhbHVlRGF0YSk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUg7QUFDbkgsbURBQTZGO0FBRTdGLDRDQUEwQztBQUUxQyx3Q0FBNEM7QUFFNUMsZ0RBQXFEO0FBb0JyRDs7OztHQUlHO0FBQ0gsU0FBZ0Isc0NBQXNDLENBQ3BELHNCQUEwRDtJQUUxRCxNQUFNLE9BQU8sR0FBRyxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUMxRyxtQ0FBbUIsQ0FBQyxNQUFNLENBQUMsQ0FDNUIsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsbUNBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNyRyxNQUFNLEdBQUcsR0FBRztRQUNWLFVBQVUsRUFBRSxzQ0FBMkI7UUFDdkMsT0FBTyxFQUFFLGdDQUFxQixDQUFDLDJCQUEyQjtRQUMxRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDaEMsQ0FBQztJQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBYkQsd0ZBYUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isa0NBQWtDLENBQ2hELGtCQUFnRDtJQUVoRCxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQ3BGO0lBQ0QsTUFB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LENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQy9EO0lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1FBQzdDLE1BQU0sa0JBQWtCLEdBQUcsMEJBQTBCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEcsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLENBQUM7U0FDbEU7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFiRCwwQ0FhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiwgUHJvcHJpZXRhcnlLZXlWYWx1ZURhdGEsIFV0eG9Qc2J0LCBQcm9wcmlldGFyeUtleVN1YnR5cGUgfSBmcm9tICcuL1V0eG9Qc2J0JztcbmltcG9ydCB7IGNoZWNrUGxhaW5QdWJsaWNLZXksIGNoZWNrWE9ubHlQdWJsaWNLZXksIHRvWE9ubHlQdWJsaWNLZXkgfSBmcm9tICcuL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG5pbXBvcnQgeyBlY2MsIG11c2lnIH0gZnJvbSAnLi4vbm9ibGVfZWNjJztcbmltcG9ydCB7IFR1cGxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyB0YXBUd2Vha1B1YmtleSB9IGZyb20gJy4uL3RhcHJvb3QnO1xuaW1wb3J0IHsgVGFwQmlwMzJEZXJpdmF0aW9uIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBjaGVja0ZvcklucHV0IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvdXRpbHMnO1xuXG4vKipcbiAqICBQYXJ0aWNpcGFudCBrZXkgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWx1ZURhdGEge1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlcjtcbiAgcGFydGljaXBhbnRQdWJLZXlzOiBUdXBsZTxCdWZmZXI+O1xufVxuXG4vKipcbiAqICBOb25jZSBrZXkgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJOb25jZXNLZXlWYWx1ZURhdGEge1xuICBwYXJ0aWNpcGFudFB1YktleTogQnVmZmVyO1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgcHViTm9uY2VzOiBCdWZmZXI7XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5cy4gU3ViVHlwZSBpcyAweDAxXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4geC1vbmx5IHRhcE91dHB1dEtleXx8dGFwSW50ZXJuYWxLZXkgYXMgc3ViIGtleWRhdGEsIHBsYWluIHNpZ2luaW5nIHBhcnRpY2lwYW50IGtleXMgYXMgdmFsdWVkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzS2V5VmFsRGF0YShcbiAgcGFydGljaXBhbnRzS2V5VmFsRGF0YTogUHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbHVlRGF0YVxuKTogUHJvcHJpZXRhcnlLZXlWYWx1ZURhdGEge1xuICBjb25zdCBrZXlkYXRhID0gW3BhcnRpY2lwYW50c0tleVZhbERhdGEudGFwT3V0cHV0S2V5LCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhLnRhcEludGVybmFsS2V5XS5tYXAoKHB1YmtleSkgPT5cbiAgICBjaGVja1hPbmx5UHVibGljS2V5KHB1YmtleSlcbiAgKTtcbiAgY29uc3QgdmFsdWUgPSBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5tYXAoKHB1YmtleSkgPT4gY2hlY2tQbGFpblB1YmxpY0tleShwdWJrZXkpKTtcbiAgY29uc3Qga2V5ID0ge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgIGtleWRhdGE6IEJ1ZmZlci5jb25jYXQoa2V5ZGF0YSksXG4gIH07XG4gIHJldHVybiB7IGtleSwgdmFsdWU6IEJ1ZmZlci5jb25jYXQodmFsdWUpIH07XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHB1YiBub25jZS4gU3ViVHlwZSBpcyAweDAyXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4gcGxhaW4tcGFydGljaXBhbnRQdWJLZXl8fHgtb25seS10YXBPdXRwdXRLZXkgYXMgc3ViIGtleWRhdGEsIDY2IGJ5dGVzIG9mIDIgcHViIG5vbmNlcyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZUtleVZhbERhdGEoXG4gIG5vbmNlc0tleVZhbHVlRGF0YTogUHNidE11c2lnMk5vbmNlc0tleVZhbHVlRGF0YVxuKTogUHJvcHJpZXRhcnlLZXlWYWx1ZURhdGEge1xuICBpZiAobm9uY2VzS2V5VmFsdWVEYXRhLnB1Yk5vbmNlcy5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1Yk5vbmNlcyBsZW5ndGggJHtub25jZXNLZXlWYWx1ZURhdGEucHViTm9uY2VzLmxlbmd0aH1gKTtcbiAgfVxuICBjb25zdCBrZXlkYXRhID0gQnVmZmVyLmNvbmNhdChbXG4gICAgY2hlY2tQbGFpblB1YmxpY0tleShub25jZXNLZXlWYWx1ZURhdGEucGFydGljaXBhbnRQdWJLZXkpLFxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkobm9uY2VzS2V5VmFsdWVEYXRhLnRhcE91dHB1dEtleSksXG4gIF0pO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFLFxuICAgIGtleWRhdGEsXG4gIH07XG4gIHJldHVybiB7IGtleSwgdmFsdWU6IG5vbmNlc0tleVZhbHVlRGF0YS5wdWJOb25jZXMgfTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBkYXRhIGZvciBwYXJ0aWNpcGFudCBwdWIga2V5c1xuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzS2V5VmFsRGF0YShcbiAga3Y6IFByb3ByaWV0YXJ5S2V5VmFsdWVEYXRhXG4pOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzS2V5VmFsdWVEYXRhIHtcbiAgaWYgKFxuICAgIGt2LmtleS5pZGVudGlmaWVyICE9PSBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfHxcbiAgICBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZU1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBwYXJ0aWNpcGFudHMgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IGtleSA9IGt2LmtleS5rZXlkYXRhO1xuICBpZiAoa2V5Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5ZGF0YSBzaXplICR7a2V5Lmxlbmd0aH0gZm9yIHBhcnRpY2lwYW50IHB1YiBrZXlzYCk7XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IGt2LnZhbHVlO1xuICBpZiAodmFsdWUubGVuZ3RoICE9PSA2Nikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZWRhdGEgc2l6ZSAke3ZhbHVlLmxlbmd0aH0gZm9yIHBhcnRpY2lwYW50IHB1YiBrZXlzYCk7XG4gIH1cbiAgY29uc3QgcGFydGljaXBhbnRQdWJLZXlzOiBUdXBsZTxCdWZmZXI+ID0gW3ZhbHVlLnN1YmFycmF5KDAsIDMzKSwgdmFsdWUuc3ViYXJyYXkoMzMpXTtcbiAgaWYgKHBhcnRpY2lwYW50UHViS2V5c1swXS5lcXVhbHMocGFydGljaXBhbnRQdWJLZXlzWzFdKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHBhcnRpY2lwYW50IHB1YiBrZXlzIGZvdW5kYCk7XG4gIH1cblxuICByZXR1cm4geyB0YXBPdXRwdXRLZXk6IGtleS5zdWJhcnJheSgwLCAzMiksIHRhcEludGVybmFsS2V5OiBrZXkuc3ViYXJyYXkoMzIpLCBwYXJ0aWNpcGFudFB1YktleXMgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcEludGVybmFsS2V5KHBsYWluUHViS2V5czogQnVmZmVyW10pOiBCdWZmZXIge1xuICBwbGFpblB1YktleXMuZm9yRWFjaCgocHViS2V5KSA9PiBjaGVja1BsYWluUHVibGljS2V5KHB1YktleSkpO1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuZ2V0WE9ubHlQdWJrZXkobXVzaWcua2V5QWdnKG11c2lnLmtleVNvcnQocGxhaW5QdWJLZXlzKSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcE91dHB1dEtleShpbnRlcm5hbFB1YktleTogQnVmZmVyLCB0YXBUcmVlUm9vdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgaWYgKHRhcFRyZWVSb290Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFwVHJlZVJvb3Qgc2l6ZSAke3RhcFRyZWVSb290Lmxlbmd0aH1gKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmZyb20odGFwVHdlYWtQdWJrZXkoZWNjLCB0b1hPbmx5UHVibGljS2V5KGludGVybmFsUHViS2V5KSwgdGFwVHJlZVJvb3QpLnhPbmx5UHVia2V5KTtcbn1cblxuZnVuY3Rpb24gZGVyaXZlV2FsbGV0UHViS2V5KHRhcEJpcDMyRGVyaXZhdGlvbnM6IFRhcEJpcDMyRGVyaXZhdGlvbltdLCByb290V2FsbGV0S2V5OiBCSVAzMkludGVyZmFjZSk6IEJ1ZmZlciB7XG4gIGNvbnN0IG15RGVyaXZhdGlvbnMgPSB0YXBCaXAzMkRlcml2YXRpb25zLmZpbHRlcigoYmlwRHYpID0+IHtcbiAgICByZXR1cm4gYmlwRHYubWFzdGVyRmluZ2VycHJpbnQuZXF1YWxzKHJvb3RXYWxsZXRLZXkuZmluZ2VycHJpbnQpO1xuICB9KTtcblxuICBpZiAoIW15RGVyaXZhdGlvbnMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIG9uZSB0YXBCaXAzMkRlcml2YXRpb24gbWFzdGVyRmluZ2VycHJpbnQgdG8gbWF0Y2ggdGhlIHJvb3RXYWxsZXRLZXkgZmluZ2VycHJpbnQnKTtcbiAgfVxuXG4gIGNvbnN0IG15RGVyaXZhdGlvbiA9IG15RGVyaXZhdGlvbnMuZmlsdGVyKChiaXBEdikgPT4ge1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IHJvb3RXYWxsZXRLZXkuZGVyaXZlUGF0aChiaXBEdi5wYXRoKS5wdWJsaWNLZXk7XG4gICAgcmV0dXJuIGJpcER2LnB1YmtleS5lcXVhbHModG9YT25seVB1YmxpY0tleShwdWJsaWNLZXkpKTtcbiAgfSk7XG5cbiAgaWYgKG15RGVyaXZhdGlvbi5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jvb3Qgd2FsbGV0IGtleSBzaG91bGQgZGVyaXZlIG9uZSB0YXBCaXAzMkRlcml2YXRpb24nKTtcbiAgfVxuICByZXR1cm4gcm9vdFdhbGxldEtleS5kZXJpdmVQYXRoKG15RGVyaXZhdGlvblswXS5wYXRoKS5wdWJsaWNLZXk7XG59XG5cbmZ1bmN0aW9uIGdldE11c2lnMk5vbmNlS2V5VmFsdWVEYXRhKFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICByb290V2FsbGV0S2V5OiBCSVAzMkludGVyZmFjZSxcbiAgc2Vzc2lvbklkPzogQnVmZmVyXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dChwc2J0LmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgaWYgKCFpbnB1dC50YXBJbnRlcm5hbEtleSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFwTWVya2xlUm9vdCBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSBub25jZScpO1xuICB9XG5cbiAgaWYgKCFpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFwQmlwMzJEZXJpdmF0aW9uIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gIH1cblxuICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICB9KTtcblxuICBpZiAocGFydGljaXBhbnRzS2V5VmFscy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7cGFydGljaXBhbnRzS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDFgKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRpY2lwYW50S2V5VmFsRGF0YSA9IGRlY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWxEYXRhKHBhcnRpY2lwYW50c0tleVZhbHNbMF0pO1xuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXMgPSBwYXJ0aWNpcGFudEtleVZhbERhdGEucGFydGljaXBhbnRQdWJLZXlzO1xuXG4gIGNvbnN0IHRhcEludGVybmFsS2V5ID0gY3JlYXRlVGFwSW50ZXJuYWxLZXkocGFydGljaXBhbnRQdWJLZXlzKTtcbiAgaWYgKCF0YXBJbnRlcm5hbEtleS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcEludGVybmFsS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudHMga2V5YXRhIHRhcEludGVybmFsS2V5Jyk7XG4gIH1cblxuICBjb25zdCB0YXBPdXRwdXRLZXkgPSBjcmVhdGVUYXBPdXRwdXRLZXkodGFwSW50ZXJuYWxLZXksIGlucHV0LnRhcE1lcmtsZVJvb3QpO1xuICBpZiAoIXRhcE91dHB1dEtleS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcE91dHB1dEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnRzIGtleWF0YSB0YXBPdXRwdXRLZXknKTtcbiAgfVxuXG4gIGlmICghdGFwSW50ZXJuYWxLZXkuZXF1YWxzKGlucHV0LnRhcEludGVybmFsS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFwSW50ZXJuYWxLZXkgYW5kIGFnZ3JlZ2F0ZWQgcGFydGljaXBhbnQgcHViIGtleXMgZG9lcyBub3QgbWF0Y2gnKTtcbiAgfVxuXG4gIGNvbnN0IGRlcml2ZWRQdWJLZXkgPSBkZXJpdmVXYWxsZXRQdWJLZXkoaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uLCByb290V2FsbGV0S2V5KTtcbiAgY29uc3QgcGFydGljaXBhbnRQdWJLZXkgPSBwYXJ0aWNpcGFudFB1YktleXMuZmluZCgocHViS2V5KSA9PiBwdWJLZXkuZXF1YWxzKGRlcml2ZWRQdWJLZXkpKTtcblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwYXJ0aWNpcGFudFB1YktleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRpY2lwYW50IHBsYWluIHB1YiBrZXkgc2hvdWxkIG1hdGNoIG9uZSB0YXBCaXAzMkRlcml2YXRpb24gcGxhaW4gcHViIGtleScpO1xuICB9XG5cbiAgY29uc3QgeyBoYXNoIH0gPSBwc2J0LmdldFRhcHJvb3RIYXNoRm9yU2lnQ2hlY2tlZChpbnB1dEluZGV4KTtcblxuICBjb25zdCBub25jZUdlbkFyZ3MgPSB7XG4gICAgc2Vzc2lvbklkLFxuICAgIHB1YmxpY0tleTogcGFydGljaXBhbnRQdWJLZXksXG4gICAgeE9ubHlQdWJsaWNLZXk6IHRhcE91dHB1dEtleSxcbiAgICBtc2c6IGhhc2gsXG4gICAgc2VjcmV0S2V5OiByb290V2FsbGV0S2V5LnByaXZhdGVLZXksXG4gIH07XG5cbiAgY29uc3QgcHViTm9uY2VzID0gQnVmZmVyLmZyb20obXVzaWcubm9uY2VHZW4obm9uY2VHZW5BcmdzKSk7XG5cbiAgcmV0dXJuIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZUtleVZhbERhdGEoe1xuICAgIHBhcnRpY2lwYW50UHViS2V5LFxuICAgIHRhcE91dHB1dEtleSxcbiAgICBwdWJOb25jZXMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbmQgc2V0cyBNdXNpZzIgbm9uY2VzIHRvIHAydHJNdXNpZzIga2V5IHBhdGggc3BlbmRpbmcgaW5wdXRzLlxuICogdGFwSW50ZXJuYWxrZXksIHRhcE1lcmtsZVJvb3QsIHRhcEJpcDMyRGVyaXZhdGlvbiBmb3Igcm9vdFdhbGxldEtleSBhcmUgcmVxdWlyZWQgcGVyIHAydHJNdXNpZzIga2V5IHBhdGggaW5wdXQuXG4gKiBBbHNvIHBhcnRpY2lwYW50IGtleXMgYXJlIHJlcXVpcmVkIGZyb20gcHNidCBwcm9wcmlldGFyeSBrZXkgdmFsdWVzLlxuICogUmVmOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zYW5rZXQxNzI5LzRiNTI1YzYwNDlmNGQ5ZTAzNGQyNzM2OGM0OWYyOGE2XG4gKiBAcGFyYW0gcHNidFxuICogQHBhcmFtIHJvb3RXYWxsZXRLZXlcbiAqIEBwYXJhbSBzZXNzaW9uSWQgSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE11c2lnMk5vbmNlcyhwc2J0OiBVdHhvUHNidCwgcm9vdFdhbGxldEtleTogQklQMzJJbnRlcmZhY2UsIHNlc3Npb25JZD86IEJ1ZmZlcik6IHZvaWQge1xuICBpZiAocm9vdFdhbGxldEtleS5pc05ldXRlcmVkKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGUga2V5IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzZXNzaW9uSWQpICYmIHNlc3Npb25JZC5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlc3Npb25JZCBzaXplICR7c2Vzc2lvbklkLmxlbmd0aH1gKTtcbiAgfVxuICBwc2J0LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbnB1dEluZGV4KSA9PiB7XG4gICAgY29uc3Qgbm9uY2VzS2V5VmFsdWVEYXRhID0gZ2V0TXVzaWcyTm9uY2VLZXlWYWx1ZURhdGEocHNidCwgaW5wdXRJbmRleCwgcm9vdFdhbGxldEtleSwgc2Vzc2lvbklkKTtcbiAgICBpZiAobm9uY2VzS2V5VmFsdWVEYXRhKSB7XG4gICAgICBwc2J0LmFkZFByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCBub25jZXNLZXlWYWx1ZURhdGEpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=
|