@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.9 → 8.2.1-alpha.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/CHANGELOG.md +504 -0
- package/dist/src/curves/constant.d.ts +2 -0
- package/dist/src/curves/constant.d.ts.map +1 -0
- package/dist/src/curves/constant.js +6 -0
- package/dist/src/curves/{baseCurve.d.ts → ed25519.d.ts} +9 -7
- package/dist/src/curves/ed25519.d.ts.map +1 -0
- package/dist/src/curves/ed25519.js +72 -0
- package/dist/src/curves/ed25519Bip32HdTree.d.ts +10 -0
- package/dist/src/curves/ed25519Bip32HdTree.d.ts.map +1 -0
- package/dist/src/curves/ed25519Bip32HdTree.js +85 -0
- package/dist/src/curves/index.d.ts +6 -1
- package/dist/src/curves/index.d.ts.map +1 -1
- package/dist/src/curves/index.js +12 -3
- package/dist/src/curves/secp256k1.d.ts +3 -1
- package/dist/src/curves/secp256k1.d.ts.map +1 -1
- package/dist/src/curves/secp256k1.js +25 -14
- package/dist/src/curves/secp256k1Bip32HdTree.d.ts +8 -0
- package/dist/src/curves/secp256k1Bip32HdTree.d.ts.map +1 -0
- package/dist/src/curves/secp256k1Bip32HdTree.js +54 -0
- package/dist/src/curves/types.d.ts +36 -0
- package/dist/src/curves/types.d.ts.map +1 -0
- package/dist/src/curves/types.js +3 -0
- package/dist/src/curves/util.d.ts +2 -0
- package/dist/src/curves/util.d.ts.map +1 -0
- package/dist/src/curves/util.js +11 -0
- package/dist/src/hashCommitment.d.ts +17 -0
- package/dist/src/hashCommitment.d.ts.map +1 -0
- package/dist/src/hashCommitment.js +45 -0
- package/dist/src/index.d.ts +6 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +25 -4
- package/dist/src/openssl/index.js +6 -2
- package/dist/src/openssl/openssl.js +3 -3
- package/dist/src/safePrime.d.ts +3 -0
- package/dist/src/safePrime.d.ts.map +1 -0
- package/dist/src/safePrime.js +20 -0
- package/dist/src/schnorrProof.d.ts +22 -0
- package/dist/src/schnorrProof.d.ts.map +1 -0
- package/dist/src/schnorrProof.js +62 -0
- package/dist/src/shamir/index.d.ts +3 -0
- package/dist/src/shamir/index.d.ts.map +1 -0
- package/dist/src/shamir/index.js +19 -0
- package/dist/src/shamir/shamir.d.ts +38 -0
- package/dist/src/shamir/shamir.d.ts.map +1 -0
- package/dist/src/shamir/shamir.js +136 -0
- package/dist/src/shamir/types.d.ts +5 -0
- package/dist/src/shamir/types.d.ts.map +1 -0
- package/dist/src/shamir/types.js +3 -0
- package/dist/src/tss/ecdsa/index.d.ts +1 -0
- package/dist/src/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/index.js +8 -3
- package/dist/src/tss/ecdsa/paillierproof.js +6 -6
- package/dist/src/tss/ecdsa/rangeproof.d.ts +0 -1
- package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/rangeproof.js +102 -108
- package/dist/src/tss/ecdsa/types.d.ts +16 -0
- package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/types.js +19 -20
- package/dist/src/tss/ecdsa/zkVProof.d.ts +25 -0
- package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -0
- package/dist/src/tss/ecdsa/zkVProof.js +71 -0
- package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +43 -0
- package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/commsLayer.js +222 -0
- package/dist/src/tss/ecdsa-dkls/dkg.d.ts +25 -0
- package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/dkg.js +224 -0
- package/dist/src/tss/ecdsa-dkls/dsg.d.ts +30 -0
- package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/dsg.js +171 -0
- package/dist/src/tss/ecdsa-dkls/index.d.ts +6 -0
- package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/index.js +32 -0
- package/dist/src/tss/ecdsa-dkls/types.d.ts +120 -0
- package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/types.js +155 -0
- package/dist/src/tss/ecdsa-dkls/util.d.ts +28 -0
- package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/util.js +261 -0
- package/dist/src/tss/index.d.ts +1 -0
- package/dist/src/tss/index.d.ts.map +1 -1
- package/dist/src/tss/index.js +7 -2
- package/dist/src/types.d.ts +14 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +3 -0
- package/dist/src/util.d.ts +8 -2
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +35 -13
- package/dist/tsconfig.tsbuildinfo +1 -3645
- package/package.json +17 -6
- package/dist/src/curves/baseCurve.d.ts.map +0 -1
- package/dist/src/curves/baseCurve.js +0 -6
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import * as t from 'io-ts';
|
|
3
|
+
import { XShare } from '../ecdsa/types';
|
|
4
|
+
interface BroadcastMessage<T> {
|
|
5
|
+
payload: T;
|
|
6
|
+
from: number;
|
|
7
|
+
signatureR?: T;
|
|
8
|
+
}
|
|
9
|
+
interface P2PMessage<T, G> {
|
|
10
|
+
payload: T;
|
|
11
|
+
from: number;
|
|
12
|
+
commitment?: G;
|
|
13
|
+
to: number;
|
|
14
|
+
}
|
|
15
|
+
export declare enum DkgState {
|
|
16
|
+
Uninitialized = 0,
|
|
17
|
+
Round1 = 1,
|
|
18
|
+
Round2 = 2,
|
|
19
|
+
Round3 = 3,
|
|
20
|
+
Round4 = 4,
|
|
21
|
+
Complete = 5,
|
|
22
|
+
InvalidState = 6
|
|
23
|
+
}
|
|
24
|
+
export declare enum DsgState {
|
|
25
|
+
Uninitialized = 0,
|
|
26
|
+
Round1 = 1,
|
|
27
|
+
Round2 = 2,
|
|
28
|
+
Round3 = 3,
|
|
29
|
+
Round4 = 4,
|
|
30
|
+
Complete = 5,
|
|
31
|
+
InvalidState = 6
|
|
32
|
+
}
|
|
33
|
+
export declare type AuthEncMessage = {
|
|
34
|
+
encryptedMessage: string;
|
|
35
|
+
signature: string;
|
|
36
|
+
};
|
|
37
|
+
export declare type AuthMessage = {
|
|
38
|
+
message: string;
|
|
39
|
+
signature: string;
|
|
40
|
+
};
|
|
41
|
+
export declare type PartyGpgKey = {
|
|
42
|
+
partyId: number;
|
|
43
|
+
gpgKey: string;
|
|
44
|
+
};
|
|
45
|
+
export declare type DklsSignature<T> = {
|
|
46
|
+
R: T;
|
|
47
|
+
S: T;
|
|
48
|
+
};
|
|
49
|
+
export declare type RetrofitData = {
|
|
50
|
+
bigSiList: string[];
|
|
51
|
+
xShare: Partial<XShare>;
|
|
52
|
+
xiList?: number[][];
|
|
53
|
+
};
|
|
54
|
+
export declare const ReducedKeyShareType: t.TypeC<{
|
|
55
|
+
bigSList: t.ArrayC<t.ArrayC<t.NumberC>>;
|
|
56
|
+
xList: t.ArrayC<t.ArrayC<t.NumberC>>;
|
|
57
|
+
rootChainCode: t.ArrayC<t.NumberC>;
|
|
58
|
+
prv: t.ArrayC<t.NumberC>;
|
|
59
|
+
pub: t.ArrayC<t.NumberC>;
|
|
60
|
+
}>;
|
|
61
|
+
export declare type ReducedKeyShare = t.TypeOf<typeof ReducedKeyShareType>;
|
|
62
|
+
export declare type SerializedBroadcastMessage = BroadcastMessage<string>;
|
|
63
|
+
export declare type DeserializedBroadcastMessage = BroadcastMessage<Uint8Array>;
|
|
64
|
+
export declare type SerializedP2PMessage = P2PMessage<string, string>;
|
|
65
|
+
export declare type DeserializedP2PMessage = P2PMessage<Uint8Array, Uint8Array>;
|
|
66
|
+
export declare type SerializedDklsSignature = DklsSignature<string>;
|
|
67
|
+
export declare type DeserializedDklsSignature = DklsSignature<Uint8Array>;
|
|
68
|
+
export declare type AuthEncP2PMessage = P2PMessage<AuthEncMessage, string>;
|
|
69
|
+
export declare type AuthBroadcastMessage = BroadcastMessage<AuthMessage>;
|
|
70
|
+
export declare type SerializedMessages = {
|
|
71
|
+
p2pMessages: SerializedP2PMessage[];
|
|
72
|
+
broadcastMessages: SerializedBroadcastMessage[];
|
|
73
|
+
};
|
|
74
|
+
export declare type AuthEncMessages = {
|
|
75
|
+
p2pMessages: AuthEncP2PMessage[];
|
|
76
|
+
broadcastMessages: AuthBroadcastMessage[];
|
|
77
|
+
};
|
|
78
|
+
export declare type DeserializedMessages = {
|
|
79
|
+
p2pMessages: DeserializedP2PMessage[];
|
|
80
|
+
broadcastMessages: DeserializedBroadcastMessage[];
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Serializes messages payloads to base64 strings.
|
|
84
|
+
* @param messages
|
|
85
|
+
*/
|
|
86
|
+
export declare function serializeMessages(messages: DeserializedMessages): SerializedMessages;
|
|
87
|
+
/**
|
|
88
|
+
* Deserialize messages payloads to Uint8Array.
|
|
89
|
+
* @param messages
|
|
90
|
+
*/
|
|
91
|
+
export declare function deserializeMessages(messages: SerializedMessages): DeserializedMessages;
|
|
92
|
+
/**
|
|
93
|
+
* Deserializes a P2P message.
|
|
94
|
+
* @param message
|
|
95
|
+
*/
|
|
96
|
+
export declare function deserializeP2PMessage(message: SerializedP2PMessage): DeserializedP2PMessage;
|
|
97
|
+
/**
|
|
98
|
+
* Deserializes a Broadcast message.
|
|
99
|
+
* @param message
|
|
100
|
+
*/
|
|
101
|
+
export declare function deserializeBroadcastMessage(message: SerializedBroadcastMessage): DeserializedBroadcastMessage;
|
|
102
|
+
/**
|
|
103
|
+
* Serializes a P2P message.
|
|
104
|
+
* @param message
|
|
105
|
+
*/
|
|
106
|
+
export declare function serializeP2PMessage(message: DeserializedP2PMessage): SerializedP2PMessage;
|
|
107
|
+
/**
|
|
108
|
+
* Serializes a Broadcast message.
|
|
109
|
+
* @param message
|
|
110
|
+
*/
|
|
111
|
+
export declare function serializeBroadcastMessage(message: DeserializedBroadcastMessage): SerializedBroadcastMessage;
|
|
112
|
+
/**
|
|
113
|
+
* Gets commonkeyChain from DKLS keyShare
|
|
114
|
+
* @param {Buffer} keyShare - DKLS keyShare
|
|
115
|
+
* @returns {string} commonKeychain in hex format
|
|
116
|
+
*/
|
|
117
|
+
export declare function getCommonKeychain(keyShare: Buffer): string;
|
|
118
|
+
export declare function getDecodedReducedKeyShare(reducedKeyShare: Buffer | Uint8Array): ReducedKeyShare;
|
|
119
|
+
export {};
|
|
120
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.getDecodedReducedKeyShare = exports.getCommonKeychain = exports.serializeBroadcastMessage = exports.serializeP2PMessage = exports.deserializeBroadcastMessage = exports.deserializeP2PMessage = exports.deserializeMessages = exports.serializeMessages = exports.ReducedKeyShareType = exports.DsgState = exports.DkgState = void 0;
|
|
30
|
+
const assert_1 = __importDefault(require("assert"));
|
|
31
|
+
const cbor_x_1 = require("cbor-x");
|
|
32
|
+
const t = __importStar(require("io-ts"));
|
|
33
|
+
const Either_1 = require("fp-ts/Either");
|
|
34
|
+
var DkgState;
|
|
35
|
+
(function (DkgState) {
|
|
36
|
+
DkgState[DkgState["Uninitialized"] = 0] = "Uninitialized";
|
|
37
|
+
DkgState[DkgState["Round1"] = 1] = "Round1";
|
|
38
|
+
DkgState[DkgState["Round2"] = 2] = "Round2";
|
|
39
|
+
DkgState[DkgState["Round3"] = 3] = "Round3";
|
|
40
|
+
DkgState[DkgState["Round4"] = 4] = "Round4";
|
|
41
|
+
DkgState[DkgState["Complete"] = 5] = "Complete";
|
|
42
|
+
DkgState[DkgState["InvalidState"] = 6] = "InvalidState";
|
|
43
|
+
})(DkgState = exports.DkgState || (exports.DkgState = {}));
|
|
44
|
+
var DsgState;
|
|
45
|
+
(function (DsgState) {
|
|
46
|
+
DsgState[DsgState["Uninitialized"] = 0] = "Uninitialized";
|
|
47
|
+
DsgState[DsgState["Round1"] = 1] = "Round1";
|
|
48
|
+
DsgState[DsgState["Round2"] = 2] = "Round2";
|
|
49
|
+
DsgState[DsgState["Round3"] = 3] = "Round3";
|
|
50
|
+
DsgState[DsgState["Round4"] = 4] = "Round4";
|
|
51
|
+
DsgState[DsgState["Complete"] = 5] = "Complete";
|
|
52
|
+
DsgState[DsgState["InvalidState"] = 6] = "InvalidState";
|
|
53
|
+
})(DsgState = exports.DsgState || (exports.DsgState = {}));
|
|
54
|
+
exports.ReducedKeyShareType = t.type({
|
|
55
|
+
bigSList: t.array(t.array(t.number)),
|
|
56
|
+
xList: t.array(t.array(t.number)),
|
|
57
|
+
rootChainCode: t.array(t.number),
|
|
58
|
+
prv: t.array(t.number),
|
|
59
|
+
pub: t.array(t.number),
|
|
60
|
+
});
|
|
61
|
+
/**
|
|
62
|
+
* Serializes messages payloads to base64 strings.
|
|
63
|
+
* @param messages
|
|
64
|
+
*/
|
|
65
|
+
function serializeMessages(messages) {
|
|
66
|
+
return {
|
|
67
|
+
p2pMessages: messages.p2pMessages.map(serializeP2PMessage),
|
|
68
|
+
broadcastMessages: messages.broadcastMessages.map(serializeBroadcastMessage),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
exports.serializeMessages = serializeMessages;
|
|
72
|
+
/**
|
|
73
|
+
* Deserialize messages payloads to Uint8Array.
|
|
74
|
+
* @param messages
|
|
75
|
+
*/
|
|
76
|
+
function deserializeMessages(messages) {
|
|
77
|
+
return {
|
|
78
|
+
p2pMessages: messages.p2pMessages.map(deserializeP2PMessage),
|
|
79
|
+
broadcastMessages: messages.broadcastMessages.map(deserializeBroadcastMessage),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
exports.deserializeMessages = deserializeMessages;
|
|
83
|
+
/**
|
|
84
|
+
* Deserializes a P2P message.
|
|
85
|
+
* @param message
|
|
86
|
+
*/
|
|
87
|
+
function deserializeP2PMessage(message) {
|
|
88
|
+
return {
|
|
89
|
+
to: message.to,
|
|
90
|
+
from: message.from,
|
|
91
|
+
payload: new Uint8Array(Buffer.from(message.payload, 'base64')),
|
|
92
|
+
commitment: message.commitment ? new Uint8Array(Buffer.from(message.commitment, 'hex')) : undefined,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
exports.deserializeP2PMessage = deserializeP2PMessage;
|
|
96
|
+
/**
|
|
97
|
+
* Deserializes a Broadcast message.
|
|
98
|
+
* @param message
|
|
99
|
+
*/
|
|
100
|
+
function deserializeBroadcastMessage(message) {
|
|
101
|
+
return {
|
|
102
|
+
from: message.from,
|
|
103
|
+
payload: new Uint8Array(Buffer.from(message.payload, 'base64')),
|
|
104
|
+
signatureR: message.signatureR ? new Uint8Array(Buffer.from(message.signatureR, 'base64')) : undefined,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
exports.deserializeBroadcastMessage = deserializeBroadcastMessage;
|
|
108
|
+
/**
|
|
109
|
+
* Serializes a P2P message.
|
|
110
|
+
* @param message
|
|
111
|
+
*/
|
|
112
|
+
function serializeP2PMessage(message) {
|
|
113
|
+
return {
|
|
114
|
+
to: message.to,
|
|
115
|
+
from: message.from,
|
|
116
|
+
payload: Buffer.from(message.payload).toString('base64'),
|
|
117
|
+
commitment: message.commitment ? Buffer.from(message.commitment).toString('hex') : undefined,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
exports.serializeP2PMessage = serializeP2PMessage;
|
|
121
|
+
/**
|
|
122
|
+
* Serializes a Broadcast message.
|
|
123
|
+
* @param message
|
|
124
|
+
*/
|
|
125
|
+
function serializeBroadcastMessage(message) {
|
|
126
|
+
return {
|
|
127
|
+
from: message.from,
|
|
128
|
+
payload: Buffer.from(message.payload).toString('base64'),
|
|
129
|
+
signatureR: message.signatureR ? Buffer.from(message.signatureR).toString('base64') : undefined,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
exports.serializeBroadcastMessage = serializeBroadcastMessage;
|
|
133
|
+
/**
|
|
134
|
+
* Gets commonkeyChain from DKLS keyShare
|
|
135
|
+
* @param {Buffer} keyShare - DKLS keyShare
|
|
136
|
+
* @returns {string} commonKeychain in hex format
|
|
137
|
+
*/
|
|
138
|
+
function getCommonKeychain(keyShare) {
|
|
139
|
+
const parsedKeyShare = (0, cbor_x_1.decode)(keyShare);
|
|
140
|
+
(0, assert_1.default)(parsedKeyShare.public_key, 'public_key not found in keyShare');
|
|
141
|
+
(0, assert_1.default)(parsedKeyShare.root_chain_code, 'root_chain_code not found in public_key');
|
|
142
|
+
const publicKey = Buffer.from(parsedKeyShare.public_key).toString('hex');
|
|
143
|
+
const rootChainCode = Buffer.from(parsedKeyShare.root_chain_code).toString('hex');
|
|
144
|
+
return publicKey + rootChainCode;
|
|
145
|
+
}
|
|
146
|
+
exports.getCommonKeychain = getCommonKeychain;
|
|
147
|
+
function getDecodedReducedKeyShare(reducedKeyShare) {
|
|
148
|
+
const decoded = exports.ReducedKeyShareType.decode((0, cbor_x_1.decode)(reducedKeyShare));
|
|
149
|
+
if ((0, Either_1.isLeft)(decoded)) {
|
|
150
|
+
throw new Error(`Unable to parse reducedKeyShare: ${decoded.left}`);
|
|
151
|
+
}
|
|
152
|
+
return decoded.right;
|
|
153
|
+
}
|
|
154
|
+
exports.getDecodedReducedKeyShare = getDecodedReducedKeyShare;
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VjZHNhLWRrbHMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQWdDO0FBQ2hDLHlDQUEyQjtBQUUzQix5Q0FBc0M7QUFpQnRDLElBQVksUUFRWDtBQVJELFdBQVksUUFBUTtJQUNsQix5REFBaUIsQ0FBQTtJQUNqQiwyQ0FBTSxDQUFBO0lBQ04sMkNBQU0sQ0FBQTtJQUNOLDJDQUFNLENBQUE7SUFDTiwyQ0FBTSxDQUFBO0lBQ04sK0NBQVEsQ0FBQTtJQUNSLHVEQUFZLENBQUE7QUFDZCxDQUFDLEVBUlcsUUFBUSxHQUFSLGdCQUFRLEtBQVIsZ0JBQVEsUUFRbkI7QUFFRCxJQUFZLFFBUVg7QUFSRCxXQUFZLFFBQVE7SUFDbEIseURBQWlCLENBQUE7SUFDakIsMkNBQU0sQ0FBQTtJQUNOLDJDQUFNLENBQUE7SUFDTiwyQ0FBTSxDQUFBO0lBQ04sMkNBQU0sQ0FBQTtJQUNOLCtDQUFRLENBQUE7SUFDUix1REFBWSxDQUFBO0FBQ2QsQ0FBQyxFQVJXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBUW5CO0FBd0JZLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2hDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEIsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztDQUN2QixDQUFDLENBQUM7QUF5Qkg7OztHQUdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsUUFBOEI7SUFDOUQsT0FBTztRQUNMLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztRQUMxRCxpQkFBaUIsRUFBRSxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDO0tBQzdFLENBQUM7QUFDSixDQUFDO0FBTEQsOENBS0M7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxRQUE0QjtJQUM5RCxPQUFPO1FBQ0wsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQzVELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUM7S0FDL0UsQ0FBQztBQUNKLENBQUM7QUFMRCxrREFLQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLE9BQTZCO0lBQ2pFLE9BQU87UUFDTCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvRCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDcEcsQ0FBQztBQUNKLENBQUM7QUFQRCxzREFPQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLDJCQUEyQixDQUFDLE9BQW1DO0lBQzdFLE9BQU87UUFDTCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvRCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDdkcsQ0FBQztBQUNKLENBQUM7QUFORCxrRUFNQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLE9BQStCO0lBQ2pFLE9BQU87UUFDTCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDeEQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUM3RixDQUFDO0FBQ0osQ0FBQztBQVBELGtEQU9DO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IseUJBQXlCLENBQUMsT0FBcUM7SUFDN0UsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUN4RCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ2hHLENBQUM7QUFDSixDQUFDO0FBTkQsOERBTUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsUUFBZ0I7SUFDaEQsTUFBTSxjQUFjLEdBQUcsSUFBQSxlQUFNLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsSUFBQSxnQkFBTSxFQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztJQUN0RSxJQUFBLGdCQUFNLEVBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEYsT0FBTyxTQUFTLEdBQUcsYUFBYSxDQUFDO0FBQ25DLENBQUM7QUFQRCw4Q0FPQztBQUVELFNBQWdCLHlCQUF5QixDQUFDLGVBQW9DO0lBQzVFLE1BQU0sT0FBTyxHQUFHLDJCQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQU0sRUFBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLElBQUksSUFBQSxlQUFNLEVBQUMsT0FBTyxDQUFDLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7S0FDckU7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDdkIsQ0FBQztBQU5ELDhEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnY2Jvci14JztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHsgWFNoYXJlIH0gZnJvbSAnLi4vZWNkc2EvdHlwZXMnO1xuaW1wb3J0IHsgaXNMZWZ0IH0gZnJvbSAnZnAtdHMvRWl0aGVyJztcblxuLy8gQnJvYWRjYXN0IG1lc3NhZ2UgbWVhbnQgdG8gYmUgc2VudCB0byBtdWx0aXBsZSBwYXJ0aWVzXG5pbnRlcmZhY2UgQnJvYWRjYXN0TWVzc2FnZTxUPiB7XG4gIHBheWxvYWQ6IFQ7XG4gIGZyb206IG51bWJlcjtcbiAgc2lnbmF0dXJlUj86IFQ7XG59XG5cbi8vIFAyUCBtZXNzYWdlIG1lYW50IHRvIGJlIHNlbnQgdG8gYSBzcGVjaWZpYyBwYXJ0eVxuaW50ZXJmYWNlIFAyUE1lc3NhZ2U8VCwgRz4ge1xuICBwYXlsb2FkOiBUO1xuICBmcm9tOiBudW1iZXI7XG4gIGNvbW1pdG1lbnQ/OiBHO1xuICB0bzogbnVtYmVyO1xufVxuXG5leHBvcnQgZW51bSBEa2dTdGF0ZSB7XG4gIFVuaW5pdGlhbGl6ZWQgPSAwLFxuICBSb3VuZDEsXG4gIFJvdW5kMixcbiAgUm91bmQzLFxuICBSb3VuZDQsXG4gIENvbXBsZXRlLFxuICBJbnZhbGlkU3RhdGUsXG59XG5cbmV4cG9ydCBlbnVtIERzZ1N0YXRlIHtcbiAgVW5pbml0aWFsaXplZCA9IDAsXG4gIFJvdW5kMSxcbiAgUm91bmQyLFxuICBSb3VuZDMsXG4gIFJvdW5kNCxcbiAgQ29tcGxldGUsXG4gIEludmFsaWRTdGF0ZSxcbn1cblxuZXhwb3J0IHR5cGUgQXV0aEVuY01lc3NhZ2UgPSB7XG4gIGVuY3J5cHRlZE1lc3NhZ2U6IHN0cmluZztcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQXV0aE1lc3NhZ2UgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgUGFydHlHcGdLZXkgPSB7XG4gIHBhcnR5SWQ6IG51bWJlcjtcbiAgZ3BnS2V5OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGtsc1NpZ25hdHVyZTxUPiA9IHtcbiAgUjogVDtcbiAgUzogVDtcbn07XG5leHBvcnQgdHlwZSBSZXRyb2ZpdERhdGEgPSB7XG4gIGJpZ1NpTGlzdDogc3RyaW5nW107XG4gIHhTaGFyZTogUGFydGlhbDxYU2hhcmU+O1xuICB4aUxpc3Q/OiBudW1iZXJbXVtdO1xufTtcblxuZXhwb3J0IGNvbnN0IFJlZHVjZWRLZXlTaGFyZVR5cGUgPSB0LnR5cGUoe1xuICBiaWdTTGlzdDogdC5hcnJheSh0LmFycmF5KHQubnVtYmVyKSksXG4gIHhMaXN0OiB0LmFycmF5KHQuYXJyYXkodC5udW1iZXIpKSxcbiAgcm9vdENoYWluQ29kZTogdC5hcnJheSh0Lm51bWJlciksXG4gIHBydjogdC5hcnJheSh0Lm51bWJlciksXG4gIHB1YjogdC5hcnJheSh0Lm51bWJlciksXG59KTtcblxuZXhwb3J0IHR5cGUgUmVkdWNlZEtleVNoYXJlID0gdC5UeXBlT2Y8dHlwZW9mIFJlZHVjZWRLZXlTaGFyZVR5cGU+O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSA9IEJyb2FkY2FzdE1lc3NhZ2U8c3RyaW5nPjtcbmV4cG9ydCB0eXBlIERlc2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2UgPSBCcm9hZGNhc3RNZXNzYWdlPFVpbnQ4QXJyYXk+O1xuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFAyUE1lc3NhZ2UgPSBQMlBNZXNzYWdlPHN0cmluZywgc3RyaW5nPjtcbmV4cG9ydCB0eXBlIERlc2VyaWFsaXplZFAyUE1lc3NhZ2UgPSBQMlBNZXNzYWdlPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+O1xuZXhwb3J0IHR5cGUgU2VyaWFsaXplZERrbHNTaWduYXR1cmUgPSBEa2xzU2lnbmF0dXJlPHN0cmluZz47XG5leHBvcnQgdHlwZSBEZXNlcmlhbGl6ZWREa2xzU2lnbmF0dXJlID0gRGtsc1NpZ25hdHVyZTxVaW50OEFycmF5PjtcbmV4cG9ydCB0eXBlIEF1dGhFbmNQMlBNZXNzYWdlID0gUDJQTWVzc2FnZTxBdXRoRW5jTWVzc2FnZSwgc3RyaW5nPjtcbmV4cG9ydCB0eXBlIEF1dGhCcm9hZGNhc3RNZXNzYWdlID0gQnJvYWRjYXN0TWVzc2FnZTxBdXRoTWVzc2FnZT47XG5leHBvcnQgdHlwZSBTZXJpYWxpemVkTWVzc2FnZXMgPSB7XG4gIHAycE1lc3NhZ2VzOiBTZXJpYWxpemVkUDJQTWVzc2FnZVtdO1xuICBicm9hZGNhc3RNZXNzYWdlczogU2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2VbXTtcbn07XG5leHBvcnQgdHlwZSBBdXRoRW5jTWVzc2FnZXMgPSB7XG4gIHAycE1lc3NhZ2VzOiBBdXRoRW5jUDJQTWVzc2FnZVtdO1xuICBicm9hZGNhc3RNZXNzYWdlczogQXV0aEJyb2FkY2FzdE1lc3NhZ2VbXTtcbn07XG5leHBvcnQgdHlwZSBEZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IHtcbiAgcDJwTWVzc2FnZXM6IERlc2VyaWFsaXplZFAyUE1lc3NhZ2VbXTtcbiAgYnJvYWRjYXN0TWVzc2FnZXM6IERlc2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2VbXTtcbn07XG5cbi8qKlxuICogU2VyaWFsaXplcyBtZXNzYWdlcyBwYXlsb2FkcyB0byBiYXNlNjQgc3RyaW5ncy5cbiAqIEBwYXJhbSBtZXNzYWdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTWVzc2FnZXMobWVzc2FnZXM6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogU2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgcmV0dXJuIHtcbiAgICBwMnBNZXNzYWdlczogbWVzc2FnZXMucDJwTWVzc2FnZXMubWFwKHNlcmlhbGl6ZVAyUE1lc3NhZ2UpLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5tYXAoc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZSksXG4gIH07XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemUgbWVzc2FnZXMgcGF5bG9hZHMgdG8gVWludDhBcnJheS5cbiAqIEBwYXJhbSBtZXNzYWdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVNZXNzYWdlcyhtZXNzYWdlczogU2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICByZXR1cm4ge1xuICAgIHAycE1lc3NhZ2VzOiBtZXNzYWdlcy5wMnBNZXNzYWdlcy5tYXAoZGVzZXJpYWxpemVQMlBNZXNzYWdlKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogbWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubWFwKGRlc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZSksXG4gIH07XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGEgUDJQIG1lc3NhZ2UuXG4gKiBAcGFyYW0gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVQMlBNZXNzYWdlKG1lc3NhZ2U6IFNlcmlhbGl6ZWRQMlBNZXNzYWdlKTogRGVzZXJpYWxpemVkUDJQTWVzc2FnZSB7XG4gIHJldHVybiB7XG4gICAgdG86IG1lc3NhZ2UudG8sXG4gICAgZnJvbTogbWVzc2FnZS5mcm9tLFxuICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKG1lc3NhZ2UucGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICBjb21taXRtZW50OiBtZXNzYWdlLmNvbW1pdG1lbnQgPyBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShtZXNzYWdlLmNvbW1pdG1lbnQsICdoZXgnKSkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGEgQnJvYWRjYXN0IG1lc3NhZ2UuXG4gKiBAcGFyYW0gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKG1lc3NhZ2U6IFNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlKTogRGVzZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSB7XG4gIHJldHVybiB7XG4gICAgZnJvbTogbWVzc2FnZS5mcm9tLFxuICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKG1lc3NhZ2UucGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICBzaWduYXR1cmVSOiBtZXNzYWdlLnNpZ25hdHVyZVIgPyBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShtZXNzYWdlLnNpZ25hdHVyZVIsICdiYXNlNjQnKSkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBhIFAyUCBtZXNzYWdlLlxuICogQHBhcmFtIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVAyUE1lc3NhZ2UobWVzc2FnZTogRGVzZXJpYWxpemVkUDJQTWVzc2FnZSk6IFNlcmlhbGl6ZWRQMlBNZXNzYWdlIHtcbiAgcmV0dXJuIHtcbiAgICB0bzogbWVzc2FnZS50byxcbiAgICBmcm9tOiBtZXNzYWdlLmZyb20sXG4gICAgcGF5bG9hZDogQnVmZmVyLmZyb20obWVzc2FnZS5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgY29tbWl0bWVudDogbWVzc2FnZS5jb21taXRtZW50ID8gQnVmZmVyLmZyb20obWVzc2FnZS5jb21taXRtZW50KS50b1N0cmluZygnaGV4JykgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBhIEJyb2FkY2FzdCBtZXNzYWdlLlxuICogQHBhcmFtIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UobWVzc2FnZTogRGVzZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSk6IFNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBtZXNzYWdlLmZyb20sXG4gICAgcGF5bG9hZDogQnVmZmVyLmZyb20obWVzc2FnZS5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgc2lnbmF0dXJlUjogbWVzc2FnZS5zaWduYXR1cmVSID8gQnVmZmVyLmZyb20obWVzc2FnZS5zaWduYXR1cmVSKS50b1N0cmluZygnYmFzZTY0JykgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogR2V0cyBjb21tb25rZXlDaGFpbiBmcm9tIERLTFMga2V5U2hhcmVcbiAqIEBwYXJhbSB7QnVmZmVyfSBrZXlTaGFyZSAtIERLTFMga2V5U2hhcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbW1vbktleWNoYWluIGluIGhleCBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vbktleWNoYWluKGtleVNoYXJlOiBCdWZmZXIpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWRLZXlTaGFyZSA9IGRlY29kZShrZXlTaGFyZSk7XG4gIGFzc2VydChwYXJzZWRLZXlTaGFyZS5wdWJsaWNfa2V5LCAncHVibGljX2tleSBub3QgZm91bmQgaW4ga2V5U2hhcmUnKTtcbiAgYXNzZXJ0KHBhcnNlZEtleVNoYXJlLnJvb3RfY2hhaW5fY29kZSwgJ3Jvb3RfY2hhaW5fY29kZSBub3QgZm91bmQgaW4gcHVibGljX2tleScpO1xuICBjb25zdCBwdWJsaWNLZXkgPSBCdWZmZXIuZnJvbShwYXJzZWRLZXlTaGFyZS5wdWJsaWNfa2V5KS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IHJvb3RDaGFpbkNvZGUgPSBCdWZmZXIuZnJvbShwYXJzZWRLZXlTaGFyZS5yb290X2NoYWluX2NvZGUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgcmV0dXJuIHB1YmxpY0tleSArIHJvb3RDaGFpbkNvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKHJlZHVjZWRLZXlTaGFyZTogQnVmZmVyIHwgVWludDhBcnJheSk6IFJlZHVjZWRLZXlTaGFyZSB7XG4gIGNvbnN0IGRlY29kZWQgPSBSZWR1Y2VkS2V5U2hhcmVUeXBlLmRlY29kZShkZWNvZGUocmVkdWNlZEtleVNoYXJlKSk7XG4gIGlmIChpc0xlZnQoZGVjb2RlZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwYXJzZSByZWR1Y2VkS2V5U2hhcmU6ICR7ZGVjb2RlZC5sZWZ0fWApO1xuICB9XG4gIHJldHVybiBkZWNvZGVkLnJpZ2h0O1xufVxuIl19
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { DeserializedDklsSignature, DeserializedMessages, RetrofitData } from './types';
|
|
4
|
+
import { Hash } from 'crypto';
|
|
5
|
+
import { Dsg } from './dsg';
|
|
6
|
+
import { Dkg } from './dkg';
|
|
7
|
+
/**
|
|
8
|
+
* Combines partial signatures from parties participating in DSG.
|
|
9
|
+
* @param round4MessagePayloads - round 4 message payloads from participating parties
|
|
10
|
+
* @param rHex - hex representation of the r value in the signature
|
|
11
|
+
* @returns {DeserializedMessages} - messages to send to other parties for the next round
|
|
12
|
+
*/
|
|
13
|
+
export declare function combinePartialSignatures(round4MessagePayloads: Uint8Array[], rHex: string): DeserializedDklsSignature;
|
|
14
|
+
/**
|
|
15
|
+
* Verify a DKLs Signature and serialize it to recid:r:s:publickey format.
|
|
16
|
+
* @param message - message that was signed.
|
|
17
|
+
* @param dklsSignature - R and S values of the ECDSA signature.
|
|
18
|
+
* @param commonKeychain - public key appended to chaincode in hex.
|
|
19
|
+
* @param derivationPath - optional derivation path to derive on the commonkeychain before verification.
|
|
20
|
+
* @param hash - optional hash function to apply on message before verifying. Default is sha256.
|
|
21
|
+
* @param shouldHash - flag to determine whether message should be hashed before verifying.
|
|
22
|
+
* @returns {string} - serialized signature in `recid:r:s:publickey` format
|
|
23
|
+
*/
|
|
24
|
+
export declare function verifyAndConvertDklsSignature(message: Buffer, dklsSignature: DeserializedDklsSignature, commonKeychain: string, derivationPath?: string, hash?: Hash, shouldHash?: boolean): string;
|
|
25
|
+
export declare function executeTillRound(round: number, party1Dsg: Dsg, party2Dsg: Dsg): Promise<DeserializedMessages[] | DeserializedDklsSignature>;
|
|
26
|
+
export declare function generateDKGKeyShares(retrofitDataA?: RetrofitData, retrofitDataB?: RetrofitData, retrofitDataC?: RetrofitData): Promise<[Dkg, Dkg, Dkg]>;
|
|
27
|
+
export declare function generate2of2KeyShares(retrofitDataA?: RetrofitData, retrofitDataB?: RetrofitData): Promise<[Dkg, Dkg]>;
|
|
28
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/util.ts"],"names":[],"mappings":";;AAGA,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGxF,OAAO,EAAc,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAK5B;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,qBAAqB,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,yBAAyB,CAgBrH;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,yBAAyB,EACxC,cAAc,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,EACvB,IAAI,CAAC,EAAE,IAAI,EACX,UAAU,UAAO,GAChB,MAAM,CA6BR;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,GAAG,GACb,OAAO,CAAC,oBAAoB,EAAE,GAAG,yBAAyB,CAAC,CAgD7D;AAED,wBAAsB,oBAAoB,CACxC,aAAa,CAAC,EAAE,YAAY,EAC5B,aAAa,CAAC,EAAE,YAAY,EAC5B,aAAa,CAAC,EAAE,YAAY,GAC3B,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAoE1B;AAED,wBAAsB,qBAAqB,CACzC,aAAa,CAAC,EAAE,YAAY,EAC5B,aAAa,CAAC,EAAE,YAAY,GAC3B,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAsCrB"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.generate2of2KeyShares = exports.generateDKGKeyShares = exports.executeTillRound = exports.verifyAndConvertDklsSignature = exports.combinePartialSignatures = void 0;
|
|
30
|
+
const secp256k1_1 = require("@noble/secp256k1");
|
|
31
|
+
const curves_1 = require("../../curves");
|
|
32
|
+
const util_1 = require("../../util");
|
|
33
|
+
const cbor_x_1 = require("cbor-x");
|
|
34
|
+
const secp256k1 = __importStar(require("secp256k1"));
|
|
35
|
+
const crypto_1 = require("crypto");
|
|
36
|
+
const dkg_1 = require("./dkg");
|
|
37
|
+
const assert_1 = __importDefault(require("assert"));
|
|
38
|
+
const delimeter = ':';
|
|
39
|
+
/**
|
|
40
|
+
* Combines partial signatures from parties participating in DSG.
|
|
41
|
+
* @param round4MessagePayloads - round 4 message payloads from participating parties
|
|
42
|
+
* @param rHex - hex representation of the r value in the signature
|
|
43
|
+
* @returns {DeserializedMessages} - messages to send to other parties for the next round
|
|
44
|
+
*/
|
|
45
|
+
function combinePartialSignatures(round4MessagePayloads, rHex) {
|
|
46
|
+
const r = (0, util_1.bigIntFromBufferBE)(Buffer.from(rHex, 'hex').subarray(1));
|
|
47
|
+
const s0Arr = round4MessagePayloads.map((p) => (0, cbor_x_1.decode)(p).s_0);
|
|
48
|
+
const s1Arr = round4MessagePayloads.map((p) => (0, cbor_x_1.decode)(p).s_1);
|
|
49
|
+
const s0BigInts = s0Arr.map((s0) => (0, util_1.bigIntFromBufferBE)(Buffer.from(s0)));
|
|
50
|
+
const s1BigInts = s1Arr.map((s1) => (0, util_1.bigIntFromBufferBE)(Buffer.from(s1)));
|
|
51
|
+
const secp256k1Curve = new curves_1.Secp256k1Curve();
|
|
52
|
+
const s0Sum = s0BigInts.slice(1).reduce((sumSoFar, s0) => secp256k1Curve.scalarAdd(sumSoFar, s0), s0BigInts[0]);
|
|
53
|
+
const s1Sum = s1BigInts.slice(1).reduce((sumSoFar, s1) => secp256k1Curve.scalarAdd(sumSoFar, s1), s1BigInts[0]);
|
|
54
|
+
const s = secp256k1Curve.scalarMult(s0Sum, secp256k1Curve.scalarInvert(s1Sum));
|
|
55
|
+
const sig = new secp256k1_1.Signature(r, s);
|
|
56
|
+
const normalizedSig = sig.normalizeS();
|
|
57
|
+
return {
|
|
58
|
+
R: new Uint8Array((0, util_1.bigIntToBufferBE)(normalizedSig.r, 32)),
|
|
59
|
+
S: new Uint8Array((0, util_1.bigIntToBufferBE)(normalizedSig.s, 32)),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
exports.combinePartialSignatures = combinePartialSignatures;
|
|
63
|
+
/**
|
|
64
|
+
* Verify a DKLs Signature and serialize it to recid:r:s:publickey format.
|
|
65
|
+
* @param message - message that was signed.
|
|
66
|
+
* @param dklsSignature - R and S values of the ECDSA signature.
|
|
67
|
+
* @param commonKeychain - public key appended to chaincode in hex.
|
|
68
|
+
* @param derivationPath - optional derivation path to derive on the commonkeychain before verification.
|
|
69
|
+
* @param hash - optional hash function to apply on message before verifying. Default is sha256.
|
|
70
|
+
* @param shouldHash - flag to determine whether message should be hashed before verifying.
|
|
71
|
+
* @returns {string} - serialized signature in `recid:r:s:publickey` format
|
|
72
|
+
*/
|
|
73
|
+
function verifyAndConvertDklsSignature(message, dklsSignature, commonKeychain, derivationPath, hash, shouldHash = true) {
|
|
74
|
+
let truePub = '';
|
|
75
|
+
if (derivationPath && derivationPath !== 'm') {
|
|
76
|
+
const hdTree = new curves_1.Secp256k1Bip32HdTree();
|
|
77
|
+
const derivedPub = hdTree.publicDerive({
|
|
78
|
+
pk: (0, util_1.bigIntFromBufferBE)(Buffer.from(commonKeychain.slice(0, 66), 'hex')),
|
|
79
|
+
chaincode: (0, util_1.bigIntFromBufferBE)(Buffer.from(commonKeychain.slice(66), 'hex')),
|
|
80
|
+
}, derivationPath);
|
|
81
|
+
truePub = (0, util_1.bigIntToBufferBE)(derivedPub.pk).toString('hex');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
truePub = commonKeychain.slice(0, 66);
|
|
85
|
+
}
|
|
86
|
+
const messageToVerify = shouldHash ? (hash || (0, crypto_1.createHash)('sha256')).update(message).digest() : message;
|
|
87
|
+
const pub0 = secp256k1.ecdsaRecover(Buffer.concat([dklsSignature.R, dklsSignature.S]), 0, messageToVerify, true);
|
|
88
|
+
const pub1 = secp256k1.ecdsaRecover(Buffer.concat([dklsSignature.R, dklsSignature.S]), 1, messageToVerify, true);
|
|
89
|
+
let recId;
|
|
90
|
+
if (truePub === Buffer.from(pub0).toString('hex')) {
|
|
91
|
+
recId = 0;
|
|
92
|
+
}
|
|
93
|
+
else if (truePub === Buffer.from(pub1).toString('hex')) {
|
|
94
|
+
recId = 1;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
throw Error('Invalid Signature');
|
|
98
|
+
}
|
|
99
|
+
return `${recId}${delimeter}${Buffer.from(dklsSignature.R).toString('hex')}${delimeter}${Buffer.from(dklsSignature.S).toString('hex')}${delimeter}${truePub}`;
|
|
100
|
+
}
|
|
101
|
+
exports.verifyAndConvertDklsSignature = verifyAndConvertDklsSignature;
|
|
102
|
+
async function executeTillRound(round, party1Dsg, party2Dsg) {
|
|
103
|
+
if (round < 1 || round > 5) {
|
|
104
|
+
throw Error('Invalid round number');
|
|
105
|
+
}
|
|
106
|
+
const party1Round1Message = await party1Dsg.init();
|
|
107
|
+
const party2Round1Message = await party2Dsg.init();
|
|
108
|
+
const party2Round2Messages = party2Dsg.handleIncomingMessages({
|
|
109
|
+
p2pMessages: [],
|
|
110
|
+
broadcastMessages: [party1Round1Message],
|
|
111
|
+
});
|
|
112
|
+
const party1Round2Messages = party1Dsg.handleIncomingMessages({
|
|
113
|
+
p2pMessages: [],
|
|
114
|
+
broadcastMessages: [party2Round1Message],
|
|
115
|
+
});
|
|
116
|
+
if (round === 2)
|
|
117
|
+
return [party1Round2Messages, party2Round2Messages];
|
|
118
|
+
const party1Round3Messages = party1Dsg.handleIncomingMessages({
|
|
119
|
+
p2pMessages: party2Round2Messages.p2pMessages,
|
|
120
|
+
broadcastMessages: [],
|
|
121
|
+
});
|
|
122
|
+
const party2Round3Messages = party2Dsg.handleIncomingMessages({
|
|
123
|
+
p2pMessages: party1Round2Messages.p2pMessages,
|
|
124
|
+
broadcastMessages: [],
|
|
125
|
+
});
|
|
126
|
+
if (round === 3)
|
|
127
|
+
return [party1Round3Messages, party2Round3Messages];
|
|
128
|
+
const party2Round4Messages = party2Dsg.handleIncomingMessages({
|
|
129
|
+
p2pMessages: party1Round3Messages.p2pMessages,
|
|
130
|
+
broadcastMessages: [],
|
|
131
|
+
});
|
|
132
|
+
const party1Round4Messages = party1Dsg.handleIncomingMessages({
|
|
133
|
+
p2pMessages: party2Round3Messages.p2pMessages,
|
|
134
|
+
broadcastMessages: [],
|
|
135
|
+
});
|
|
136
|
+
if (round === 4)
|
|
137
|
+
return [party1Round4Messages, party2Round4Messages];
|
|
138
|
+
party1Dsg.handleIncomingMessages({
|
|
139
|
+
p2pMessages: [],
|
|
140
|
+
broadcastMessages: party2Round4Messages.broadcastMessages,
|
|
141
|
+
});
|
|
142
|
+
party2Dsg.handleIncomingMessages({
|
|
143
|
+
p2pMessages: [],
|
|
144
|
+
broadcastMessages: party1Round4Messages.broadcastMessages,
|
|
145
|
+
});
|
|
146
|
+
(0, assert_1.default)(Buffer.from(party1Dsg.signature.R).toString('hex') === Buffer.from(party2Dsg.signature.R).toString('hex'));
|
|
147
|
+
(0, assert_1.default)(Buffer.from(party1Dsg.signature.S).toString('hex') === Buffer.from(party2Dsg.signature.S).toString('hex'));
|
|
148
|
+
return party1Dsg.signature;
|
|
149
|
+
}
|
|
150
|
+
exports.executeTillRound = executeTillRound;
|
|
151
|
+
async function generateDKGKeyShares(retrofitDataA, retrofitDataB, retrofitDataC) {
|
|
152
|
+
const user = new dkg_1.Dkg(3, 2, 0, retrofitDataA);
|
|
153
|
+
const backup = new dkg_1.Dkg(3, 2, 1, retrofitDataB);
|
|
154
|
+
const bitgo = new dkg_1.Dkg(3, 2, 2, retrofitDataC);
|
|
155
|
+
const userRound1Message = await user.initDkg();
|
|
156
|
+
const backupRound1Message = await backup.initDkg();
|
|
157
|
+
const bitgoRound1Message = await bitgo.initDkg();
|
|
158
|
+
const userRound2Messages = user.handleIncomingMessages({
|
|
159
|
+
p2pMessages: [],
|
|
160
|
+
broadcastMessages: [bitgoRound1Message, backupRound1Message],
|
|
161
|
+
});
|
|
162
|
+
const backupRound2Messages = backup.handleIncomingMessages({
|
|
163
|
+
p2pMessages: [],
|
|
164
|
+
broadcastMessages: [userRound1Message, bitgoRound1Message],
|
|
165
|
+
});
|
|
166
|
+
const bitgoRound2Messages = bitgo.handleIncomingMessages({
|
|
167
|
+
p2pMessages: [],
|
|
168
|
+
broadcastMessages: [userRound1Message, backupRound1Message],
|
|
169
|
+
});
|
|
170
|
+
const userRound3Messages = user.handleIncomingMessages({
|
|
171
|
+
p2pMessages: backupRound2Messages.p2pMessages
|
|
172
|
+
.filter((m) => m.to === 0)
|
|
173
|
+
.concat(bitgoRound2Messages.p2pMessages.filter((m) => m.to === 0)),
|
|
174
|
+
broadcastMessages: [],
|
|
175
|
+
});
|
|
176
|
+
const backupRound3Messages = backup.handleIncomingMessages({
|
|
177
|
+
p2pMessages: bitgoRound2Messages.p2pMessages
|
|
178
|
+
.filter((m) => m.to === 1)
|
|
179
|
+
.concat(userRound2Messages.p2pMessages.filter((m) => m.to === 1)),
|
|
180
|
+
broadcastMessages: [],
|
|
181
|
+
});
|
|
182
|
+
const bitgoRound3Messages = bitgo.handleIncomingMessages({
|
|
183
|
+
p2pMessages: backupRound2Messages.p2pMessages
|
|
184
|
+
.filter((m) => m.to === 2)
|
|
185
|
+
.concat(userRound2Messages.p2pMessages.filter((m) => m.to === 2)),
|
|
186
|
+
broadcastMessages: [],
|
|
187
|
+
});
|
|
188
|
+
const userRound4Messages = user.handleIncomingMessages({
|
|
189
|
+
p2pMessages: backupRound3Messages.p2pMessages
|
|
190
|
+
.filter((m) => m.to === 0)
|
|
191
|
+
.concat(bitgoRound3Messages.p2pMessages.filter((m) => m.to === 0)),
|
|
192
|
+
broadcastMessages: [],
|
|
193
|
+
});
|
|
194
|
+
const backupRound4Messages = backup.handleIncomingMessages({
|
|
195
|
+
p2pMessages: bitgoRound3Messages.p2pMessages
|
|
196
|
+
.filter((m) => m.to === 1)
|
|
197
|
+
.concat(userRound3Messages.p2pMessages.filter((m) => m.to === 1)),
|
|
198
|
+
broadcastMessages: [],
|
|
199
|
+
});
|
|
200
|
+
const bitgoRound4Messages = bitgo.handleIncomingMessages({
|
|
201
|
+
p2pMessages: backupRound3Messages.p2pMessages
|
|
202
|
+
.filter((m) => m.to === 2)
|
|
203
|
+
.concat(userRound3Messages.p2pMessages.filter((m) => m.to === 2)),
|
|
204
|
+
broadcastMessages: [],
|
|
205
|
+
});
|
|
206
|
+
user.handleIncomingMessages({
|
|
207
|
+
p2pMessages: [],
|
|
208
|
+
broadcastMessages: bitgoRound4Messages.broadcastMessages.concat(backupRound4Messages.broadcastMessages),
|
|
209
|
+
});
|
|
210
|
+
bitgo.handleIncomingMessages({
|
|
211
|
+
p2pMessages: [],
|
|
212
|
+
broadcastMessages: backupRound4Messages.broadcastMessages.concat(userRound4Messages.broadcastMessages),
|
|
213
|
+
});
|
|
214
|
+
backup.handleIncomingMessages({
|
|
215
|
+
p2pMessages: [],
|
|
216
|
+
broadcastMessages: bitgoRound4Messages.broadcastMessages.concat(userRound4Messages.broadcastMessages),
|
|
217
|
+
});
|
|
218
|
+
return [user, backup, bitgo];
|
|
219
|
+
}
|
|
220
|
+
exports.generateDKGKeyShares = generateDKGKeyShares;
|
|
221
|
+
async function generate2of2KeyShares(retrofitDataA, retrofitDataB) {
|
|
222
|
+
const partyA = new dkg_1.Dkg(2, 2, 0, retrofitDataA);
|
|
223
|
+
const partyB = new dkg_1.Dkg(2, 2, 1, retrofitDataB);
|
|
224
|
+
const partyARound1Message = await partyA.initDkg();
|
|
225
|
+
const partyBRound1Message = await partyB.initDkg();
|
|
226
|
+
const partyARound2Messages = partyA.handleIncomingMessages({
|
|
227
|
+
p2pMessages: [],
|
|
228
|
+
broadcastMessages: [partyBRound1Message],
|
|
229
|
+
});
|
|
230
|
+
const partyBRound2Messages = partyB.handleIncomingMessages({
|
|
231
|
+
p2pMessages: [],
|
|
232
|
+
broadcastMessages: [partyARound1Message],
|
|
233
|
+
});
|
|
234
|
+
const partyARound3Messages = partyA.handleIncomingMessages({
|
|
235
|
+
p2pMessages: partyBRound2Messages.p2pMessages.filter((m) => m.to === 0),
|
|
236
|
+
broadcastMessages: [],
|
|
237
|
+
});
|
|
238
|
+
const partyBRound3Messages = partyB.handleIncomingMessages({
|
|
239
|
+
p2pMessages: partyARound2Messages.p2pMessages.filter((m) => m.to === 1),
|
|
240
|
+
broadcastMessages: [],
|
|
241
|
+
});
|
|
242
|
+
const partyARound4Messages = partyA.handleIncomingMessages({
|
|
243
|
+
p2pMessages: partyBRound3Messages.p2pMessages.filter((m) => m.to === 0),
|
|
244
|
+
broadcastMessages: [],
|
|
245
|
+
});
|
|
246
|
+
const partyBRound4Messages = partyB.handleIncomingMessages({
|
|
247
|
+
p2pMessages: partyARound3Messages.p2pMessages.filter((m) => m.to === 1),
|
|
248
|
+
broadcastMessages: [],
|
|
249
|
+
});
|
|
250
|
+
partyA.handleIncomingMessages({
|
|
251
|
+
p2pMessages: [],
|
|
252
|
+
broadcastMessages: partyBRound4Messages.broadcastMessages,
|
|
253
|
+
});
|
|
254
|
+
partyB.handleIncomingMessages({
|
|
255
|
+
p2pMessages: [],
|
|
256
|
+
broadcastMessages: partyARound4Messages.broadcastMessages,
|
|
257
|
+
});
|
|
258
|
+
return [partyA, partyB];
|
|
259
|
+
}
|
|
260
|
+
exports.generate2of2KeyShares = generate2of2KeyShares;
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EtZGtscy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQTZDO0FBQzdDLHlDQUE0RTtBQUM1RSxxQ0FBa0U7QUFFbEUsbUNBQWdDO0FBQ2hDLHFEQUF1QztBQUN2QyxtQ0FBMEM7QUFFMUMsK0JBQTRCO0FBQzVCLG9EQUE0QjtBQUU1QixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUM7QUFFdEI7Ozs7O0dBS0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxxQkFBbUMsRUFBRSxJQUFZO0lBQ3hGLE1BQU0sQ0FBQyxHQUFHLElBQUEseUJBQWtCLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkUsTUFBTSxLQUFLLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLGVBQU0sRUFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5RCxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUEsZUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUEseUJBQWtCLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBQSx5QkFBa0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLGNBQWMsR0FBRyxJQUFJLHVCQUFjLEVBQUUsQ0FBQztJQUM1QyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hILE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEgsTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQy9FLE1BQU0sR0FBRyxHQUFHLElBQUkscUJBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZDLE9BQU87UUFDTCxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsSUFBQSx1QkFBZ0IsRUFBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFBLHVCQUFnQixFQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDekQsQ0FBQztBQUNKLENBQUM7QUFoQkQsNERBZ0JDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsNkJBQTZCLENBQzNDLE9BQWUsRUFDZixhQUF3QyxFQUN4QyxjQUFzQixFQUN0QixjQUF1QixFQUN2QixJQUFXLEVBQ1gsVUFBVSxHQUFHLElBQUk7SUFFakIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUksY0FBYyxJQUFJLGNBQWMsS0FBSyxHQUFHLEVBQUU7UUFDNUMsTUFBTSxNQUFNLEdBQVcsSUFBSSw2QkFBb0IsRUFBRSxDQUFDO1FBQ2xELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQ3BDO1lBQ0UsRUFBRSxFQUFFLElBQUEseUJBQWtCLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RSxTQUFTLEVBQUUsSUFBQSx5QkFBa0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDNUUsRUFDRCxjQUFjLENBQ2YsQ0FBQztRQUNGLE9BQU8sR0FBRyxJQUFBLHVCQUFnQixFQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDM0Q7U0FBTTtRQUNMLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUN2QztJQUNELE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDdkcsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pILE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqSCxJQUFJLEtBQWEsQ0FBQztJQUNsQixJQUFJLE9BQU8sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNqRCxLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQ1g7U0FBTSxJQUFJLE9BQU8sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN4RCxLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQ1g7U0FBTTtRQUNMLE1BQU0sS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FDbEM7SUFDRCxPQUFPLEdBQUcsS0FBSyxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQ2xHLGFBQWEsQ0FBQyxDQUFDLENBQ2hCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUM1QyxDQUFDO0FBcENELHNFQW9DQztBQUVNLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsS0FBYSxFQUNiLFNBQWMsRUFDZCxTQUFjO0lBRWQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDMUIsTUFBTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztLQUNyQztJQUNELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVuRCxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQztRQUM1RCxXQUFXLEVBQUUsRUFBRTtRQUNmLGlCQUFpQixFQUFFLENBQUMsbUJBQW1CLENBQUM7S0FDekMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUM7UUFDNUQsV0FBVyxFQUFFLEVBQUU7UUFDZixpQkFBaUIsRUFBRSxDQUFDLG1CQUFtQixDQUFDO0tBQ3pDLENBQUMsQ0FBQztJQUNILElBQUksS0FBSyxLQUFLLENBQUM7UUFBRSxPQUFPLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUVyRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQztRQUM1RCxXQUFXLEVBQUUsb0JBQW9CLENBQUMsV0FBVztRQUM3QyxpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUMsQ0FBQztJQUNILE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDO1FBQzVELFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXO1FBQzdDLGlCQUFpQixFQUFFLEVBQUU7S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxLQUFLLEtBQUssQ0FBQztRQUFFLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBRXJFLE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDO1FBQzVELFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXO1FBQzdDLGlCQUFpQixFQUFFLEVBQUU7S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUM7UUFDNUQsV0FBVyxFQUFFLG9CQUFvQixDQUFDLFdBQVc7UUFDN0MsaUJBQWlCLEVBQUUsRUFBRTtLQUN0QixDQUFDLENBQUM7SUFDSCxJQUFJLEtBQUssS0FBSyxDQUFDO1FBQUUsT0FBTyxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFFckUsU0FBUyxDQUFDLHNCQUFzQixDQUFDO1FBQy9CLFdBQVcsRUFBRSxFQUFFO1FBQ2YsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsaUJBQWlCO0tBQzFELENBQUMsQ0FBQztJQUNILFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQztRQUMvQixXQUFXLEVBQUUsRUFBRTtRQUNmLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLGlCQUFpQjtLQUMxRCxDQUFDLENBQUM7SUFDSCxJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEgsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xILE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUM3QixDQUFDO0FBcERELDRDQW9EQztBQUVNLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsYUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsYUFBNEI7SUFFNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDOUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25ELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDckQsV0FBVyxFQUFFLEVBQUU7UUFDZixpQkFBaUIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixDQUFDO0tBQzdELENBQUMsQ0FBQztJQUNILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQ3pELFdBQVcsRUFBRSxFQUFFO1FBQ2YsaUJBQWlCLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQztLQUMzRCxDQUFDLENBQUM7SUFDSCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztRQUN2RCxXQUFXLEVBQUUsRUFBRTtRQUNmLGlCQUFpQixFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7S0FDNUQsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDckQsV0FBVyxFQUFFLG9CQUFvQixDQUFDLFdBQVc7YUFDMUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6QixNQUFNLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRSxpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUMsQ0FBQztJQUNILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQ3pELFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxXQUFXO2FBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDekIsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkUsaUJBQWlCLEVBQUUsRUFBRTtLQUN0QixDQUFDLENBQUM7SUFDSCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztRQUN2RCxXQUFXLEVBQUUsb0JBQW9CLENBQUMsV0FBVzthQUMxQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3pCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25FLGlCQUFpQixFQUFFLEVBQUU7S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDckQsV0FBVyxFQUFFLG9CQUFvQixDQUFDLFdBQVc7YUFDMUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6QixNQUFNLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRSxpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUMsQ0FBQztJQUNILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQ3pELFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxXQUFXO2FBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDekIsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkUsaUJBQWlCLEVBQUUsRUFBRTtLQUN0QixDQUFDLENBQUM7SUFDSCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztRQUN2RCxXQUFXLEVBQUUsb0JBQW9CLENBQUMsV0FBVzthQUMxQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3pCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25FLGlCQUFpQixFQUFFLEVBQUU7S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQzFCLFdBQVcsRUFBRSxFQUFFO1FBQ2YsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDO0tBQ3hHLENBQUMsQ0FBQztJQUNILEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztRQUMzQixXQUFXLEVBQUUsRUFBRTtRQUNmLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQztLQUN2RyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsc0JBQXNCLENBQUM7UUFDNUIsV0FBVyxFQUFFLEVBQUU7UUFDZixpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUM7S0FDdEcsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQXhFRCxvREF3RUM7QUFFTSxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLGFBQTRCLEVBQzVCLGFBQTRCO0lBRTVCLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuRCxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztRQUN6RCxXQUFXLEVBQUUsRUFBRTtRQUNmLGlCQUFpQixFQUFFLENBQUMsbUJBQW1CLENBQUM7S0FDekMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUM7UUFDekQsV0FBVyxFQUFFLEVBQUU7UUFDZixpQkFBaUIsRUFBRSxDQUFDLG1CQUFtQixDQUFDO0tBQ3pDLENBQUMsQ0FBQztJQUNILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQ3pELFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUMsQ0FBQztJQUNILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQ3pELFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUMsQ0FBQztJQUNILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQ3pELFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUMsQ0FBQztJQUNILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQ3pELFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztRQUM1QixXQUFXLEVBQUUsRUFBRTtRQUNmLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLGlCQUFpQjtLQUMxRCxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsc0JBQXNCLENBQUM7UUFDNUIsV0FBVyxFQUFFLEVBQUU7UUFDZixpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxpQkFBaUI7S0FDMUQsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBekNELHNEQXlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpZ25hdHVyZSB9IGZyb20gJ0Bub2JsZS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgSERUcmVlLCBTZWNwMjU2azFCaXAzMkhkVHJlZSwgU2VjcDI1NmsxQ3VydmUgfSBmcm9tICcuLi8uLi9jdXJ2ZXMnO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRUb0J1ZmZlckJFIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZWREa2xzU2lnbmF0dXJlLCBEZXNlcmlhbGl6ZWRNZXNzYWdlcywgUmV0cm9maXREYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0ICogYXMgc2VjcDI1NmsxIGZyb20gJ3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IERzZyB9IGZyb20gJy4vZHNnJztcbmltcG9ydCB7IERrZyB9IGZyb20gJy4vZGtnJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuY29uc3QgZGVsaW1ldGVyID0gJzonO1xuXG4vKipcbiAqIENvbWJpbmVzIHBhcnRpYWwgc2lnbmF0dXJlcyBmcm9tIHBhcnRpZXMgcGFydGljaXBhdGluZyBpbiBEU0cuXG4gKiBAcGFyYW0gcm91bmQ0TWVzc2FnZVBheWxvYWRzIC0gcm91bmQgNCBtZXNzYWdlIHBheWxvYWRzIGZyb20gcGFydGljaXBhdGluZyBwYXJ0aWVzXG4gKiBAcGFyYW0gckhleCAtIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgciB2YWx1ZSBpbiB0aGUgc2lnbmF0dXJlXG4gKiBAcmV0dXJucyB7RGVzZXJpYWxpemVkTWVzc2FnZXN9IC0gbWVzc2FnZXMgdG8gc2VuZCB0byBvdGhlciBwYXJ0aWVzIGZvciB0aGUgbmV4dCByb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVBhcnRpYWxTaWduYXR1cmVzKHJvdW5kNE1lc3NhZ2VQYXlsb2FkczogVWludDhBcnJheVtdLCBySGV4OiBzdHJpbmcpOiBEZXNlcmlhbGl6ZWREa2xzU2lnbmF0dXJlIHtcbiAgY29uc3QgciA9IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShySGV4LCAnaGV4Jykuc3ViYXJyYXkoMSkpO1xuICBjb25zdCBzMEFyciA9IHJvdW5kNE1lc3NhZ2VQYXlsb2Fkcy5tYXAoKHApID0+IGRlY29kZShwKS5zXzApO1xuICBjb25zdCBzMUFyciA9IHJvdW5kNE1lc3NhZ2VQYXlsb2Fkcy5tYXAoKHApID0+IGRlY29kZShwKS5zXzEpO1xuICBjb25zdCBzMEJpZ0ludHMgPSBzMEFyci5tYXAoKHMwKSA9PiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oczApKSk7XG4gIGNvbnN0IHMxQmlnSW50cyA9IHMxQXJyLm1hcCgoczEpID0+IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShzMSkpKTtcbiAgY29uc3Qgc2VjcDI1NmsxQ3VydmUgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgY29uc3QgczBTdW0gPSBzMEJpZ0ludHMuc2xpY2UoMSkucmVkdWNlKChzdW1Tb0ZhciwgczApID0+IHNlY3AyNTZrMUN1cnZlLnNjYWxhckFkZChzdW1Tb0ZhciwgczApLCBzMEJpZ0ludHNbMF0pO1xuICBjb25zdCBzMVN1bSA9IHMxQmlnSW50cy5zbGljZSgxKS5yZWR1Y2UoKHN1bVNvRmFyLCBzMSkgPT4gc2VjcDI1NmsxQ3VydmUuc2NhbGFyQWRkKHN1bVNvRmFyLCBzMSksIHMxQmlnSW50c1swXSk7XG4gIGNvbnN0IHMgPSBzZWNwMjU2azFDdXJ2ZS5zY2FsYXJNdWx0KHMwU3VtLCBzZWNwMjU2azFDdXJ2ZS5zY2FsYXJJbnZlcnQoczFTdW0pKTtcbiAgY29uc3Qgc2lnID0gbmV3IFNpZ25hdHVyZShyLCBzKTtcbiAgY29uc3Qgbm9ybWFsaXplZFNpZyA9IHNpZy5ub3JtYWxpemVTKCk7XG4gIHJldHVybiB7XG4gICAgUjogbmV3IFVpbnQ4QXJyYXkoYmlnSW50VG9CdWZmZXJCRShub3JtYWxpemVkU2lnLnIsIDMyKSksXG4gICAgUzogbmV3IFVpbnQ4QXJyYXkoYmlnSW50VG9CdWZmZXJCRShub3JtYWxpemVkU2lnLnMsIDMyKSksXG4gIH07XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgREtMcyBTaWduYXR1cmUgYW5kIHNlcmlhbGl6ZSBpdCB0byByZWNpZDpyOnM6cHVibGlja2V5IGZvcm1hdC5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gbWVzc2FnZSB0aGF0IHdhcyBzaWduZWQuXG4gKiBAcGFyYW0gZGtsc1NpZ25hdHVyZSAtIFIgYW5kIFMgdmFsdWVzIG9mIHRoZSBFQ0RTQSBzaWduYXR1cmUuXG4gKiBAcGFyYW0gY29tbW9uS2V5Y2hhaW4gLSBwdWJsaWMga2V5IGFwcGVuZGVkIHRvIGNoYWluY29kZSBpbiBoZXguXG4gKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggLSBvcHRpb25hbCBkZXJpdmF0aW9uIHBhdGggdG8gZGVyaXZlIG9uIHRoZSBjb21tb25rZXljaGFpbiBiZWZvcmUgdmVyaWZpY2F0aW9uLlxuICogQHBhcmFtIGhhc2ggLSBvcHRpb25hbCBoYXNoIGZ1bmN0aW9uIHRvIGFwcGx5IG9uIG1lc3NhZ2UgYmVmb3JlIHZlcmlmeWluZy4gRGVmYXVsdCBpcyBzaGEyNTYuXG4gKiBAcGFyYW0gc2hvdWxkSGFzaCAtIGZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgbWVzc2FnZSBzaG91bGQgYmUgaGFzaGVkIGJlZm9yZSB2ZXJpZnlpbmcuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHNlcmlhbGl6ZWQgc2lnbmF0dXJlIGluIGByZWNpZDpyOnM6cHVibGlja2V5YCBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeUFuZENvbnZlcnREa2xzU2lnbmF0dXJlKFxuICBtZXNzYWdlOiBCdWZmZXIsXG4gIGRrbHNTaWduYXR1cmU6IERlc2VyaWFsaXplZERrbHNTaWduYXR1cmUsXG4gIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gIGRlcml2YXRpb25QYXRoPzogc3RyaW5nLFxuICBoYXNoPzogSGFzaCxcbiAgc2hvdWxkSGFzaCA9IHRydWVcbik6IHN0cmluZyB7XG4gIGxldCB0cnVlUHViID0gJyc7XG4gIGlmIChkZXJpdmF0aW9uUGF0aCAmJiBkZXJpdmF0aW9uUGF0aCAhPT0gJ20nKSB7XG4gICAgY29uc3QgaGRUcmVlOiBIRFRyZWUgPSBuZXcgU2VjcDI1NmsxQmlwMzJIZFRyZWUoKTtcbiAgICBjb25zdCBkZXJpdmVkUHViID0gaGRUcmVlLnB1YmxpY0Rlcml2ZShcbiAgICAgIHtcbiAgICAgICAgcGs6IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShjb21tb25LZXljaGFpbi5zbGljZSgwLCA2NiksICdoZXgnKSksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKGNvbW1vbktleWNoYWluLnNsaWNlKDY2KSwgJ2hleCcpKSxcbiAgICAgIH0sXG4gICAgICBkZXJpdmF0aW9uUGF0aFxuICAgICk7XG4gICAgdHJ1ZVB1YiA9IGJpZ0ludFRvQnVmZmVyQkUoZGVyaXZlZFB1Yi5waykudG9TdHJpbmcoJ2hleCcpO1xuICB9IGVsc2Uge1xuICAgIHRydWVQdWIgPSBjb21tb25LZXljaGFpbi5zbGljZSgwLCA2Nik7XG4gIH1cbiAgY29uc3QgbWVzc2FnZVRvVmVyaWZ5ID0gc2hvdWxkSGFzaCA/IChoYXNoIHx8IGNyZWF0ZUhhc2goJ3NoYTI1NicpKS51cGRhdGUobWVzc2FnZSkuZGlnZXN0KCkgOiBtZXNzYWdlO1xuICBjb25zdCBwdWIwID0gc2VjcDI1NmsxLmVjZHNhUmVjb3ZlcihCdWZmZXIuY29uY2F0KFtka2xzU2lnbmF0dXJlLlIsIGRrbHNTaWduYXR1cmUuU10pLCAwLCBtZXNzYWdlVG9WZXJpZnksIHRydWUpO1xuICBjb25zdCBwdWIxID0gc2VjcDI1NmsxLmVjZHNhUmVjb3ZlcihCdWZmZXIuY29uY2F0KFtka2xzU2lnbmF0dXJlLlIsIGRrbHNTaWduYXR1cmUuU10pLCAxLCBtZXNzYWdlVG9WZXJpZnksIHRydWUpO1xuICBsZXQgcmVjSWQ6IG51bWJlcjtcbiAgaWYgKHRydWVQdWIgPT09IEJ1ZmZlci5mcm9tKHB1YjApLnRvU3RyaW5nKCdoZXgnKSkge1xuICAgIHJlY0lkID0gMDtcbiAgfSBlbHNlIGlmICh0cnVlUHViID09PSBCdWZmZXIuZnJvbShwdWIxKS50b1N0cmluZygnaGV4JykpIHtcbiAgICByZWNJZCA9IDE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgU2lnbmF0dXJlJyk7XG4gIH1cbiAgcmV0dXJuIGAke3JlY0lkfSR7ZGVsaW1ldGVyfSR7QnVmZmVyLmZyb20oZGtsc1NpZ25hdHVyZS5SKS50b1N0cmluZygnaGV4Jyl9JHtkZWxpbWV0ZXJ9JHtCdWZmZXIuZnJvbShcbiAgICBka2xzU2lnbmF0dXJlLlNcbiAgKS50b1N0cmluZygnaGV4Jyl9JHtkZWxpbWV0ZXJ9JHt0cnVlUHVifWA7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlVGlsbFJvdW5kKFxuICByb3VuZDogbnVtYmVyLFxuICBwYXJ0eTFEc2c6IERzZyxcbiAgcGFydHkyRHNnOiBEc2dcbik6IFByb21pc2U8RGVzZXJpYWxpemVkTWVzc2FnZXNbXSB8IERlc2VyaWFsaXplZERrbHNTaWduYXR1cmU+IHtcbiAgaWYgKHJvdW5kIDwgMSB8fCByb3VuZCA+IDUpIHtcbiAgICB0aHJvdyBFcnJvcignSW52YWxpZCByb3VuZCBudW1iZXInKTtcbiAgfVxuICBjb25zdCBwYXJ0eTFSb3VuZDFNZXNzYWdlID0gYXdhaXQgcGFydHkxRHNnLmluaXQoKTtcbiAgY29uc3QgcGFydHkyUm91bmQxTWVzc2FnZSA9IGF3YWl0IHBhcnR5MkRzZy5pbml0KCk7XG5cbiAgY29uc3QgcGFydHkyUm91bmQyTWVzc2FnZXMgPSBwYXJ0eTJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbcGFydHkxUm91bmQxTWVzc2FnZV0sXG4gIH0pO1xuICBjb25zdCBwYXJ0eTFSb3VuZDJNZXNzYWdlcyA9IHBhcnR5MURzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtwYXJ0eTJSb3VuZDFNZXNzYWdlXSxcbiAgfSk7XG4gIGlmIChyb3VuZCA9PT0gMikgcmV0dXJuIFtwYXJ0eTFSb3VuZDJNZXNzYWdlcywgcGFydHkyUm91bmQyTWVzc2FnZXNdO1xuXG4gIGNvbnN0IHBhcnR5MVJvdW5kM01lc3NhZ2VzID0gcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBwYXJ0eTJSb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBjb25zdCBwYXJ0eTJSb3VuZDNNZXNzYWdlcyA9IHBhcnR5MkRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogcGFydHkxUm91bmQyTWVzc2FnZXMucDJwTWVzc2FnZXMsXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgaWYgKHJvdW5kID09PSAzKSByZXR1cm4gW3BhcnR5MVJvdW5kM01lc3NhZ2VzLCBwYXJ0eTJSb3VuZDNNZXNzYWdlc107XG5cbiAgY29uc3QgcGFydHkyUm91bmQ0TWVzc2FnZXMgPSBwYXJ0eTJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5MVJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGNvbnN0IHBhcnR5MVJvdW5kNE1lc3NhZ2VzID0gcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBwYXJ0eTJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBpZiAocm91bmQgPT09IDQpIHJldHVybiBbcGFydHkxUm91bmQ0TWVzc2FnZXMsIHBhcnR5MlJvdW5kNE1lc3NhZ2VzXTtcblxuICBwYXJ0eTFEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBwYXJ0eTJSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgfSk7XG4gIHBhcnR5MkRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IHBhcnR5MVJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLFxuICB9KTtcbiAgYXNzZXJ0KEJ1ZmZlci5mcm9tKHBhcnR5MURzZy5zaWduYXR1cmUuUikudG9TdHJpbmcoJ2hleCcpID09PSBCdWZmZXIuZnJvbShwYXJ0eTJEc2cuc2lnbmF0dXJlLlIpLnRvU3RyaW5nKCdoZXgnKSk7XG4gIGFzc2VydChCdWZmZXIuZnJvbShwYXJ0eTFEc2cuc2lnbmF0dXJlLlMpLnRvU3RyaW5nKCdoZXgnKSA9PT0gQnVmZmVyLmZyb20ocGFydHkyRHNnLnNpZ25hdHVyZS5TKS50b1N0cmluZygnaGV4JykpO1xuICByZXR1cm4gcGFydHkxRHNnLnNpZ25hdHVyZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlREtHS2V5U2hhcmVzKFxuICByZXRyb2ZpdERhdGFBPzogUmV0cm9maXREYXRhLFxuICByZXRyb2ZpdERhdGFCPzogUmV0cm9maXREYXRhLFxuICByZXRyb2ZpdERhdGFDPzogUmV0cm9maXREYXRhXG4pOiBQcm9taXNlPFtEa2csIERrZywgRGtnXT4ge1xuICBjb25zdCB1c2VyID0gbmV3IERrZygzLCAyLCAwLCByZXRyb2ZpdERhdGFBKTtcbiAgY29uc3QgYmFja3VwID0gbmV3IERrZygzLCAyLCAxLCByZXRyb2ZpdERhdGFCKTtcbiAgY29uc3QgYml0Z28gPSBuZXcgRGtnKDMsIDIsIDIsIHJldHJvZml0RGF0YUMpO1xuICBjb25zdCB1c2VyUm91bmQxTWVzc2FnZSA9IGF3YWl0IHVzZXIuaW5pdERrZygpO1xuICBjb25zdCBiYWNrdXBSb3VuZDFNZXNzYWdlID0gYXdhaXQgYmFja3VwLmluaXREa2coKTtcbiAgY29uc3QgYml0Z29Sb3VuZDFNZXNzYWdlID0gYXdhaXQgYml0Z28uaW5pdERrZygpO1xuICBjb25zdCB1c2VyUm91bmQyTWVzc2FnZXMgPSB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW2JpdGdvUm91bmQxTWVzc2FnZSwgYmFja3VwUm91bmQxTWVzc2FnZV0sXG4gIH0pO1xuICBjb25zdCBiYWNrdXBSb3VuZDJNZXNzYWdlcyA9IGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxTWVzc2FnZSwgYml0Z29Sb3VuZDFNZXNzYWdlXSxcbiAgfSk7XG4gIGNvbnN0IGJpdGdvUm91bmQyTWVzc2FnZXMgPSBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxTWVzc2FnZSwgYmFja3VwUm91bmQxTWVzc2FnZV0sXG4gIH0pO1xuICBjb25zdCB1c2VyUm91bmQzTWVzc2FnZXMgPSB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBiYWNrdXBSb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlc1xuICAgICAgLmZpbHRlcigobSkgPT4gbS50byA9PT0gMClcbiAgICAgIC5jb25jYXQoYml0Z29Sb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IDApKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBjb25zdCBiYWNrdXBSb3VuZDNNZXNzYWdlcyA9IGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogYml0Z29Sb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlc1xuICAgICAgLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSlcbiAgICAgIC5jb25jYXQodXNlclJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSkpLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGNvbnN0IGJpdGdvUm91bmQzTWVzc2FnZXMgPSBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogYmFja3VwUm91bmQyTWVzc2FnZXMucDJwTWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpXG4gICAgICAuY29uY2F0KHVzZXJSb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBjb25zdCB1c2VyUm91bmQ0TWVzc2FnZXMgPSB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBiYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlc1xuICAgICAgLmZpbHRlcigobSkgPT4gbS50byA9PT0gMClcbiAgICAgIC5jb25jYXQoYml0Z29Sb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IDApKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBjb25zdCBiYWNrdXBSb3VuZDRNZXNzYWdlcyA9IGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogYml0Z29Sb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlc1xuICAgICAgLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSlcbiAgICAgIC5jb25jYXQodXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSkpLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGNvbnN0IGJpdGdvUm91bmQ0TWVzc2FnZXMgPSBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpXG4gICAgICAuY29uY2F0KHVzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogYml0Z29Sb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5jb25jYXQoYmFja3VwUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMpLFxuICB9KTtcbiAgYml0Z28uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBiYWNrdXBSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5jb25jYXQodXNlclJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzKSxcbiAgfSk7XG4gIGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IGJpdGdvUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuY29uY2F0KHVzZXJSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyksXG4gIH0pO1xuICByZXR1cm4gW3VzZXIsIGJhY2t1cCwgYml0Z29dO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGUyb2YyS2V5U2hhcmVzKFxuICByZXRyb2ZpdERhdGFBPzogUmV0cm9maXREYXRhLFxuICByZXRyb2ZpdERhdGFCPzogUmV0cm9maXREYXRhXG4pOiBQcm9taXNlPFtEa2csIERrZ10+IHtcbiAgY29uc3QgcGFydHlBID0gbmV3IERrZygyLCAyLCAwLCByZXRyb2ZpdERhdGFBKTtcbiAgY29uc3QgcGFydHlCID0gbmV3IERrZygyLCAyLCAxLCByZXRyb2ZpdERhdGFCKTtcbiAgY29uc3QgcGFydHlBUm91bmQxTWVzc2FnZSA9IGF3YWl0IHBhcnR5QS5pbml0RGtnKCk7XG4gIGNvbnN0IHBhcnR5QlJvdW5kMU1lc3NhZ2UgPSBhd2FpdCBwYXJ0eUIuaW5pdERrZygpO1xuICBjb25zdCBwYXJ0eUFSb3VuZDJNZXNzYWdlcyA9IHBhcnR5QS5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtwYXJ0eUJSb3VuZDFNZXNzYWdlXSxcbiAgfSk7XG4gIGNvbnN0IHBhcnR5QlJvdW5kMk1lc3NhZ2VzID0gcGFydHlCLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW3BhcnR5QVJvdW5kMU1lc3NhZ2VdLFxuICB9KTtcbiAgY29uc3QgcGFydHlBUm91bmQzTWVzc2FnZXMgPSBwYXJ0eUEuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QlJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMCksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHlCUm91bmQzTWVzc2FnZXMgPSBwYXJ0eUIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QVJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHlBUm91bmQ0TWVzc2FnZXMgPSBwYXJ0eUEuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QlJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMCksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHlCUm91bmQ0TWVzc2FnZXMgPSBwYXJ0eUIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QVJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgcGFydHlBLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogcGFydHlCUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gIH0pO1xuICBwYXJ0eUIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBwYXJ0eUFSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgfSk7XG4gIHJldHVybiBbcGFydHlBLCBwYXJ0eUJdO1xufVxuIl19
|