bitgo
Version:
BitGo JavaScript SDK
639 lines • 149 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
const openpgp = require("openpgp");
const should = require("should");
const sdk_test_1 = require("@bitgo/sdk-test");
const src_1 = require("../../../../src");
const helpers_1 = require("./helpers");
const ecdsaFixtures_1 = require("../../fixtures/tss/ecdsaFixtures");
const nock = require("nock");
const encryptNShare = sdk_core_1.ECDSAMethods.encryptNShare;
const createCombinedKey = sdk_core_1.ECDSAMethods.createCombinedKey;
describe('Ecdsa tss helper functions tests', function () {
let mpc;
let userKeyShare;
let backupKeyShare;
let bitgoKeyShare;
let userKey;
let backupKey;
let bitgoKey;
let userGpgKeypair;
let backupGpgKeypair;
let bitgoGpgKeypair;
let commonKeychain;
before(async function () {
mpc = new sdk_core_1.Ecdsa();
userKeyShare = ecdsaFixtures_1.keyShares.userKeyShare;
backupKeyShare = ecdsaFixtures_1.keyShares.backupKeyShare;
bitgoKeyShare = ecdsaFixtures_1.keyShares.bitgoKeyShare;
userKey = mpc.keyCombine(userKeyShare.pShare, [backupKeyShare.nShares[1], bitgoKeyShare.nShares[1]]);
backupKey = mpc.keyCombine(backupKeyShare.pShare, [userKeyShare.nShares[2], bitgoKeyShare.nShares[2]]);
bitgoKey = mpc.keyCombine(bitgoKeyShare.pShare, [backupKeyShare.nShares[3], userKeyShare.nShares[3]]);
(userKey.xShare.y + userKey.xShare.chaincode).should.equal(backupKey.xShare.y + backupKey.xShare.chaincode);
(userKey.xShare.y + userKey.xShare.chaincode).should.equal(bitgoKey.xShare.y + bitgoKey.xShare.chaincode);
commonKeychain = userKey.xShare.y + userKey.xShare.chaincode;
const gpgKeypairPromises = [
{ name: 'user', email: 'user@bitgo.com' },
{ name: 'backup', email: 'backup@bitgo.com' },
{ name: 'bitgo', email: 'bitgo@bitgo.com' },
].map(async (user) => {
return openpgp.generateKey({
userIDs: [
{
name: user.name,
email: user.email,
},
],
curve: 'secp256k1',
});
});
const gpgKeypairs = await Promise.all(gpgKeypairPromises);
userGpgKeypair = gpgKeypairs[0];
backupGpgKeypair = gpgKeypairs[1];
bitgoGpgKeypair = gpgKeypairs[2];
});
after(function () {
nock.cleanAll();
});
describe('encryptNShare and decryptNShare', function () {
after(function () {
nock.cleanAll();
});
it('should encrypt n shares foreach user', async function () {
for (let i = 2; i <= 3; i++) {
const encryptedNShare = await sdk_core_1.ECDSAMethods.encryptNShare(userKeyShare, i, bitgoGpgKeypair.publicKey, userGpgKeypair);
const decryptedNShare = await sdk_core_1.ECDSAMethods.decryptNShare({
nShare: encryptedNShare,
senderPublicArmor: userGpgKeypair.publicKey,
recipientPrivateArmor: bitgoGpgKeypair.privateKey,
});
decryptedNShare.u.should.equal(userKeyShare.nShares[i].u);
const publicKey = userKeyShare.pShare.y + userKeyShare.pShare.chaincode;
encryptedNShare.i.should.equal(i);
encryptedNShare.vssProof.should.equal(userKeyShare.nShares[3].v);
encryptedNShare.j.should.equal(1);
encryptedNShare.publicShare.should.equal(publicKey);
}
});
it('should error for invalid recipient', async function () {
await encryptNShare(userKeyShare, 1, userGpgKeypair.privateKey, userGpgKeypair).should.be.rejectedWith('Invalid recipient');
await encryptNShare(backupKeyShare, 2, userGpgKeypair.privateKey, userGpgKeypair).should.be.rejectedWith('Invalid recipient');
await encryptNShare(bitgoKeyShare, 3, userGpgKeypair.privateKey, userGpgKeypair).should.be.rejectedWith('Invalid recipient');
});
it('should decrypt n share', async function () {
const encryptedNShare = await sdk_core_1.ECDSAMethods.encryptNShare(userKeyShare, 3, bitgoGpgKeypair.publicKey, userGpgKeypair);
const decryptedNShare = await sdk_core_1.ECDSAMethods.decryptNShare({
nShare: encryptedNShare,
recipientPrivateArmor: bitgoGpgKeypair.privateKey,
senderPublicArmor: userGpgKeypair.publicKey,
});
decryptedNShare.i.should.equal(userKeyShare.nShares[3].i);
decryptedNShare.j.should.equal(userKeyShare.nShares[3].j);
decryptedNShare.n.should.equal(userKeyShare.nShares[3].n);
decryptedNShare.u.should.equal(userKeyShare.nShares[3].u);
decryptedNShare.y.should.equal(userKeyShare.nShares[3].y);
});
});
describe('createCombinedKey', function () {
after(function () {
nock.cleanAll();
});
it('should create combined user key', async function () {
const bitgoToUserShare = await sdk_core_1.ECDSAMethods.encryptNShare(bitgoKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair, false);
const backupToUserShare = await sdk_core_1.ECDSAMethods.encryptNShare(backupKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair, false);
const combinedUserKey = await createCombinedKey(userKeyShare, [
{
nShare: bitgoToUserShare,
recipientPrivateArmor: userGpgKeypair.privateKey,
senderPublicArmor: bitgoGpgKeypair.publicKey,
isbs58Encoded: false,
},
{
nShare: backupToUserShare,
recipientPrivateArmor: userGpgKeypair.privateKey,
senderPublicArmor: backupGpgKeypair.publicKey,
isbs58Encoded: false,
},
], commonKeychain);
combinedUserKey.commonKeychain.should.equal(commonKeychain);
combinedUserKey.signingMaterial.pShare.should.deepEqual(userKeyShare.pShare);
should.exist(combinedUserKey.signingMaterial.backupNShare);
combinedUserKey.signingMaterial.backupNShare?.should.deepEqual(backupKeyShare.nShares[1]);
combinedUserKey.signingMaterial.bitgoNShare.should.deepEqual(bitgoKeyShare.nShares[1]);
should.not.exist(combinedUserKey.signingMaterial.userNShare);
});
it('should create combined backup key', async function () {
const bitgoToBackupShare = await encryptNShare(bitgoKeyShare, 2, backupGpgKeypair.publicKey, userGpgKeypair);
const userToBackupShare = await encryptNShare(userKeyShare, 2, backupGpgKeypair.publicKey, userGpgKeypair);
const combinedBackupKey = await createCombinedKey(backupKeyShare, [
{
nShare: bitgoToBackupShare,
recipientPrivateArmor: backupGpgKeypair.privateKey,
senderPublicArmor: bitgoGpgKeypair.publicKey,
},
{
nShare: userToBackupShare,
recipientPrivateArmor: backupGpgKeypair.privateKey,
senderPublicArmor: userGpgKeypair.publicKey,
},
], commonKeychain);
combinedBackupKey.commonKeychain.should.equal(commonKeychain);
combinedBackupKey.signingMaterial.pShare.should.deepEqual(backupKeyShare.pShare);
should.exist(combinedBackupKey.signingMaterial.userNShare);
combinedBackupKey.signingMaterial.userNShare?.should.deepEqual(userKeyShare.nShares[2]);
combinedBackupKey.signingMaterial.bitgoNShare.should.deepEqual(bitgoKeyShare.nShares[2]);
should.not.exist(combinedBackupKey.signingMaterial.backupNShare);
});
it('should fail if common keychains do not match', async function () {
const bitgoToUserShare = await encryptNShare(bitgoKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair);
const backupToUserShare = await encryptNShare(backupKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair);
// this should fail to combine the keys because we pass in invalid common key chain
await createCombinedKey(userKeyShare, [
{
nShare: bitgoToUserShare,
recipientPrivateArmor: userGpgKeypair.privateKey,
senderPublicArmor: bitgoGpgKeypair.publicKey,
},
{
nShare: backupToUserShare,
recipientPrivateArmor: userGpgKeypair.privateKey,
senderPublicArmor: backupGpgKeypair.publicKey,
},
], 'nottherightkeychain').should.be.rejectedWith('Common keychains do not match');
});
it('should fail if gpg keys are mismatched', async function () {
const bitgoToUserShare = await encryptNShare(bitgoKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair);
const backupToUserShare = await encryptNShare(backupKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair);
await createCombinedKey(userKeyShare, [
{
nShare: bitgoToUserShare,
recipientPrivateArmor: backupGpgKeypair.privateKey,
senderPublicArmor: bitgoGpgKeypair.publicKey,
},
{
nShare: backupToUserShare,
recipientPrivateArmor: userGpgKeypair.privateKey,
senderPublicArmor: backupGpgKeypair.publicKey,
},
], 'nottherightkeychain').should.be.rejectedWith('Error decrypting message: Session key decryption failed.');
});
});
describe('tss signing helper function', async function () {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock' });
bitgo.initializeTestVars();
let wallet;
const txRequest = {
txRequestId: 'randomId',
unsignedTxs: [{ signableHex: 'TOO MANY SECRETS', serializedTxHex: 'randomhex2' }],
signatureShares: [
{
from: 'bitgo',
to: 'user',
share: '',
},
],
};
const signablePayload = Buffer.from(txRequest.unsignedTxs[0].signableHex, 'hex');
before('initializes', async function () {
const baseCoin = bitgo.coin('hteth');
const walletData = {
id: '5b34252f1bf349930e34020a00000000',
coin: 'hteth',
keys: [
'5b3424f91bf349930e34017500000000',
'5b3424f91bf349930e34017600000000',
'5b3424f91bf349930e34017700000000',
],
coinSpecific: {},
};
wallet = new sdk_core_1.Wallet(bitgo, baseCoin, walletData);
});
describe('createUserSignShare:', async function () {
let userToBitGoPaillierChallenge;
let bitgoToUserPaillierChallenge;
before(async function () {
userToBitGoPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallenge({
p: await sdk_lib_mpc_1.EcdsaPaillierProof.generateP((0, sdk_core_1.hexToBigInt)(userKey.yShares[3].n)),
});
bitgoToUserPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallenge({
p: await sdk_lib_mpc_1.EcdsaPaillierProof.generateP((0, sdk_core_1.hexToBigInt)(userKey.xShare.n)),
});
});
it('should succeed to create User SignShare', async function () {
const xShare = mpc.appendChallenge(userKey.xShare, sdk_test_1.mockSerializedChallengeWithProofs, userToBitGoPaillierChallenge);
const yShare = mpc.appendChallenge(userKey.yShares[3], { ntilde: xShare.ntilde, h1: xShare.h1, h2: xShare.h2 }, bitgoToUserPaillierChallenge);
const userSignShare = await sdk_core_1.ECDSAMethods.createUserSignShare(xShare, yShare);
userSignShare.should.have.properties(['wShare', 'kShare']);
const { wShare, kShare } = userSignShare;
wShare.should.have.property('gamma').and.be.a.String();
wShare.should.have.property('w').and.be.a.String();
wShare.should.have.property('k').and.be.a.String();
wShare.should.have.property('ck').and.be.a.String();
wShare.should.have.property('h2').and.be.a.String();
wShare.should.have.property('h1').and.be.a.String();
wShare.should.have.property('ntilde').and.be.a.String();
wShare.should.have.property('y').and.be.a.String();
wShare.should.have.property('n').and.be.a.String();
wShare.should.have.property('m').and.be.a.String();
wShare.should.have.property('l').and.be.a.String();
wShare.should.have.property('i').and.be.a.Number();
kShare['i'].should.equal(3);
kShare['j'].should.equal(1);
kShare.should.have.property('n').and.be.a.String();
kShare.should.have.property('k').and.be.a.String();
kShare.should.have.property('ntilde').and.be.a.String();
kShare.should.have.property('h1').and.be.a.String();
kShare.should.have.property('h2').and.be.a.String();
});
it('should fail if the Xshare doesnt belong to the User', async function () {
let xShare = mpc.appendChallenge(userKey.xShare, sdk_test_1.mockSerializedChallengeWithProofs, userToBitGoPaillierChallenge);
xShare = { ...xShare, i: 3 };
const yShare = mpc.appendChallenge(userKey.yShares[3], {
ntilde: xShare.ntilde,
h1: xShare.h1,
h2: xShare.h2,
}, bitgoToUserPaillierChallenge);
await sdk_core_1.ECDSAMethods.createUserSignShare(xShare, yShare).should.be.rejectedWith(`Invalid XShare, XShare doesn't belong to the User`);
});
});
describe('createUserGammaAndMuShare:', async function () {
it('should succeed to create User Gamma Share and MuShare', async function () {
const userShare = await sdk_core_1.ECDSAMethods.createUserGammaAndMuShare(ecdsaFixtures_1.gammaAndMuShareCreationParams.wShare, ecdsaFixtures_1.gammaAndMuShareCreationParams.aShare);
userShare.should.have.properties(['muShare', 'gShare']);
const { muShare, gShare } = userShare;
muShare?.i?.should.equal(3);
muShare?.j?.should.equal(1);
muShare?.should.have.property('alpha').and.be.a.String();
muShare?.should.have.property('mu').and.be.a.String();
gShare?.should.have.property('beta').and.be.a.String();
gShare?.should.have.property('nu').and.be.a.String();
});
it('should fail if the Wshare / AShare doesnt belong to the User', async function () {
const invalidWShare = { ...ecdsaFixtures_1.gammaAndMuShareCreationParams.wShare, i: 3 };
const invalidAShare = { ...ecdsaFixtures_1.gammaAndMuShareCreationParams.aShare, i: 3 };
await sdk_core_1.ECDSAMethods.createUserGammaAndMuShare(invalidWShare, ecdsaFixtures_1.gammaAndMuShareCreationParams.aShare).should.be.rejectedWith(`Invalid WShare, doesn't belong to the User`);
await sdk_core_1.ECDSAMethods.createUserGammaAndMuShare(ecdsaFixtures_1.gammaAndMuShareCreationParams.wShare, invalidAShare).should.be.rejectedWith(`Invalid AShare, is not from Bitgo to User`);
});
});
describe('createUserOmicronAndDeltaShare:', async function () {
it('should succeed to create User Omicron and Mu Shares', async function () {
const userShare = await sdk_core_1.ECDSAMethods.createUserOmicronAndDeltaShare(ecdsaFixtures_1.omicronAndDeltaShareCreationParams.gShare);
userShare.should.have.properties(['dShare', 'oShare']);
const { dShare, oShare } = userShare;
dShare?.i?.should.equal(3);
dShare?.j?.should.equal(1);
dShare?.should.have.property('delta').and.be.a.String();
dShare?.should.have.property('Gamma').and.be.a.String();
oShare?.should.have.property('omicron').and.be.a.String();
oShare?.should.have.property('delta').and.be.a.String();
});
it(`should fail if the gShare doesn't belong to the User`, async function () {
const invalidGShare = { ...ecdsaFixtures_1.omicronAndDeltaShareCreationParams.gShare, i: 3 };
await sdk_core_1.ECDSAMethods.createUserOmicronAndDeltaShare(invalidGShare).should.be.rejectedWith(`Invalid GShare, doesn't belong to the User`);
});
});
describe('createUserSignatureShare:', async function () {
afterEach(function () {
nock.cleanAll();
});
it('should succeed to create User Signature Share', async function () {
const userSignatureShare = await sdk_core_1.ECDSAMethods.createUserSignatureShare(ecdsaFixtures_1.createUserSignatureParams.oShare, ecdsaFixtures_1.createUserSignatureParams.dShare, signablePayload);
const { R, s, y, i } = userSignatureShare;
i.should.be.Number();
R.should.be.a.String();
s.should.be.a.String();
y.should.be.a.String();
});
it(`should fail if the OShare / dShare doesn't belong to the User`, async function () {
const invalidOShare = { ...ecdsaFixtures_1.createUserSignatureParams.oShare, i: 3 };
await sdk_core_1.ECDSAMethods.createUserSignatureShare(invalidOShare, ecdsaFixtures_1.createUserSignatureParams.dShare, signablePayload).should.be.rejectedWith(`Invalid OShare, doesn't belong to the User`);
const invalidDShare = { ...ecdsaFixtures_1.createUserSignatureParams.dShare, i: 3 };
await sdk_core_1.ECDSAMethods.createUserSignatureShare(ecdsaFixtures_1.createUserSignatureParams.oShare, invalidDShare, signablePayload).should.be.rejectedWith(`Invalid DShare, doesn't seem to be from BitGo`);
});
});
describe('sendSignatureShare Tests', async function () {
afterEach(function () {
nock.cleanAll();
});
const mockAShareString = sdk_core_1.ECDSAMethods.convertAShare(ecdsaFixtures_1.mockAShare).share;
const mockDShareString = sdk_core_1.ECDSAMethods.convertDShare(ecdsaFixtures_1.mockDShare).share;
const config = [
{
shareToSend: 'KShare',
mockShareToSend: ecdsaFixtures_1.mockSignRT.kShare,
mockShareToSendString: sdk_core_1.ECDSAMethods.convertKShare(ecdsaFixtures_1.mockSignRT.kShare).share,
sendType: sdk_core_1.ECDSAMethodTypes.SendShareType.KShare,
mockShareAsResponse: ecdsaFixtures_1.mockAShare,
mockShareAsResponseString: mockAShareString,
shareReceived: 'AShare',
incorrectReceivedShareString: ecdsaFixtures_1.mockAShare.k,
signerShare: 'a valid signer share',
},
{
shareToSend: 'MUShare',
mockShareToSend: { muShare: ecdsaFixtures_1.mockMuShare, dShare: ecdsaFixtures_1.mockDShareToBitgo, i: ecdsaFixtures_1.mockMuShare.i },
mockShareToSendString: `${sdk_core_1.ECDSAMethods.convertMuShare(ecdsaFixtures_1.mockMuShare).share}${sdk_core_1.ECDSAMethods.secondaryDelimeter}${sdk_core_1.ECDSAMethods.convertDShare(ecdsaFixtures_1.mockDShareToBitgo).share}`,
sendType: sdk_core_1.ECDSAMethodTypes.SendShareType.MUShare,
mockShareAsResponse: ecdsaFixtures_1.mockDShare,
mockShareAsResponseString: mockDShareString,
shareReceived: 'DShare',
incorrectReceivedShareString: ecdsaFixtures_1.mockDShare.Gamma,
},
];
for (let index = 0; index < config.length; index++) {
describe(`sendSignatureShare: ${config[index].shareToSend}`, async function () {
it(`should succeed to send ${config[index].shareToSend}`, async function () {
const mockSendReq = {
from: 'user',
to: 'bitgo',
share: config[index].mockShareToSendString,
};
const shareRecord = {
from: 'bitgo',
to: 'user',
share: config[index].mockShareAsResponseString,
};
await (0, helpers_1.nockSendSignatureShare)({
walletId: wallet.id(),
txRequestId: txRequest.txRequestId,
signatureShare: mockSendReq,
response: shareRecord,
tssType: 'ecdsa',
signerShare: config[index].signerShare,
});
txRequest.signatureShares = [shareRecord];
const response = { txRequests: [{ transactions: [{ ...txRequest }] }] };
await (0, helpers_1.nockGetTxRequest)({ walletId: wallet.id(), txRequestId: txRequest.txRequestId, response: response });
const responseAShare = await sdk_core_1.ECDSAMethods.sendShareToBitgo(bitgo, wallet.id(), txRequest.txRequestId, sdk_core_1.RequestType.tx, config[index].sendType, config[index].mockShareToSend, config[index].signerShare);
responseAShare.should.deepEqual(config[index].mockShareAsResponse);
});
it(`should fail if we get an invalid ${config[index].shareReceived} as response`, async function () {
const mockSendReq = {
from: 'user',
to: 'bitgo',
share: config[index].mockShareToSendString,
};
const invalidSignatureShare = {
from: 'bitgo',
to: 'user',
share: JSON.stringify(config[index].incorrectReceivedShareString),
};
const nock = await (0, helpers_1.nockSendSignatureShare)({
walletId: wallet.id(),
txRequestId: txRequest.txRequestId,
signatureShare: mockSendReq,
response: invalidSignatureShare,
tssType: 'ecdsa',
signerShare: config[index].signerShare,
}, 200);
txRequest.signatureShares = [invalidSignatureShare];
const response = { txRequests: [{ transactions: [{ ...txRequest }] }] };
await (0, helpers_1.nockGetTxRequest)({ walletId: wallet.id(), txRequestId: txRequest.txRequestId, response: response });
await sdk_core_1.ECDSAMethods.sendShareToBitgo(bitgo, wallet.id(), txRequest.txRequestId, sdk_core_1.RequestType.tx, config[index].sendType, config[index].mockShareToSend, config[index].signerShare).should.be.rejectedWith(/Invalid .* share/g); // `Invalid ${shareName} share`
nock.isDone().should.equal(true);
});
});
}
});
describe('getTxRequest:', async function () {
afterEach(function () {
nock.cleanAll();
});
it('should succeed to get txRequest by id', async function () {
const response = { txRequests: [txRequest] };
const nock = await (0, helpers_1.nockGetTxRequest)({ walletId: wallet.id(), txRequestId: txRequest.txRequestId, response });
const txReq = await (0, sdk_core_1.getTxRequest)(bitgo, wallet.id(), txRequest.txRequestId);
txReq.should.deepEqual(txRequest);
nock.isDone().should.equal(true);
});
it('should fail if there are no txRequests', async function () {
const response = { txRequests: [] };
const nock = await (0, helpers_1.nockGetTxRequest)({ walletId: wallet.id(), txRequestId: txRequest.txRequestId, response });
await (0, sdk_core_1.getTxRequest)(bitgo, wallet.id(), txRequest.txRequestId).should.be.rejectedWith('Unable to find TxRequest with id randomId');
nock.isDone().should.equal(true);
});
});
describe('signing share parsers and converters', function () {
afterEach(function () {
nock.cleanAll();
});
it('should successfully parse K share', function () {
const bitgoKShare = ecdsaFixtures_1.mockSignWithPaillierChallengeRT.kShare;
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.USER,
share: sdk_core_1.ECDSAMethods.convertKShare(ecdsaFixtures_1.mockSignWithPaillierChallengeRT.kShare).share,
};
const kShare = sdk_core_1.ECDSAMethods.parseKShare(share);
kShare.should.deepEqual(bitgoKShare);
});
it('should successfully convert K share to signature share record', function () {
const bitgoKShare = ecdsaFixtures_1.mockSignWithPaillierChallengeRT.kShare;
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.USER,
share: `${ecdsaFixtures_1.mockSignRT.kShare.k}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.n}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.ntilde}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.h1}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.h2}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${bitgoKShare.p.join(sdk_core_1.ECDSAMethods.delimeter)}${sdk_core_1.ECDSAMethods.delimeter}${bitgoKShare.sigma.join(sdk_core_1.ECDSAMethods.delimeter)}`,
};
const kshare = sdk_core_1.ECDSAMethods.convertKShare(bitgoKShare);
kshare.from.should.equal(share.from);
kshare.to.should.equal(share.to);
kshare.share.should.equal(share.share);
});
it('should successfully parse A share without paillier challenge', function () {
const share = {
to: sdk_core_1.SignatureShareType.USER,
from: sdk_core_1.SignatureShareType.BITGO,
share: sdk_core_1.ECDSAMethods.convertAShare(ecdsaFixtures_1.mockAShare).share,
};
const aShare = sdk_core_1.ECDSAMethods.parseAShare(share);
should.exist(aShare);
aShare.should.deepEqual(ecdsaFixtures_1.mockAShare);
});
it('should successfully parse A share', function () {
const share = {
to: sdk_core_1.SignatureShareType.USER,
from: sdk_core_1.SignatureShareType.BITGO,
share: sdk_core_1.ECDSAMethods.convertAShare(ecdsaFixtures_1.mockAShare).share,
};
const aShare = sdk_core_1.ECDSAMethods.parseAShare(share);
should.exist(aShare);
aShare.should.deepEqual(ecdsaFixtures_1.mockAShare);
});
it('should successfully convert A share to signature share record', function () {
const mockShare = ecdsaFixtures_1.mockAShare;
const share = {
to: sdk_core_1.SignatureShareType.USER,
from: sdk_core_1.SignatureShareType.BITGO,
share: `${mockShare.k}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.alpha}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.mu}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.n}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.ntilde}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.h1}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.h2}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.zprm || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.t || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.v || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.t1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.t2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.x || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.zprm || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.t || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.v || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.t1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.t2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.x || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.sigma.join(sdk_core_1.ECDSAMethods.delimeter)}`,
};
const aShare = sdk_core_1.ECDSAMethods.convertAShare(mockShare);
aShare.from.should.equal(share.from);
aShare.to.should.equal(share.to);
aShare.share.should.equal(share.share);
});
it('should successfully parse Mu share', function () {
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.USER,
share: sdk_core_1.ECDSAMethods.convertMuShare(ecdsaFixtures_1.mockMuShare).share,
};
const muShare = sdk_core_1.ECDSAMethods.parseMuShare(share);
muShare.i.should.equal(ecdsaFixtures_1.mockMuShare.i);
muShare.j.should.equal(ecdsaFixtures_1.mockMuShare.j);
muShare.alpha.should.equal(ecdsaFixtures_1.mockMuShare.alpha);
muShare.mu.should.equal(ecdsaFixtures_1.mockMuShare.mu);
});
it('should successfully convert Mu share to signature share record', function () {
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.USER,
share: `${ecdsaFixtures_1.mockMuShare.alpha}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.mu}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.zprm || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.t || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.v || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.t1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.t2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.x || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.zprm || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.t || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.v || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.t1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.t2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.x || ''}`,
};
const muShare = sdk_core_1.ECDSAMethods.convertMuShare(ecdsaFixtures_1.mockMuShare);
muShare.from.should.equal(share.from);
muShare.to.should.equal(share.to);
muShare.share.should.equal(share.share);
});
it('should successfully parse D share', function () {
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.USER,
share: sdk_core_1.ECDSAMethods.convertDShare(ecdsaFixtures_1.mockDShareToBitgo).share,
};
const dShare = sdk_core_1.ECDSAMethods.parseDShare(share);
dShare.i.should.equal(ecdsaFixtures_1.mockDShareToBitgo.i);
dShare.j.should.equal(ecdsaFixtures_1.mockDShareToBitgo.j);
dShare.delta.should.equal(ecdsaFixtures_1.mockDShareToBitgo.delta);
dShare.Gamma.should.equal(ecdsaFixtures_1.mockDShareToBitgo.Gamma);
});
it('should successfully convert D share to signature share record', function () {
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.USER,
share: `${ecdsaFixtures_1.mockDShareToBitgo.delta}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockDShareToBitgo.Gamma}`,
};
const dShare = sdk_core_1.ECDSAMethods.convertDShare(ecdsaFixtures_1.mockDShareToBitgo);
dShare.from.should.equal(share.from);
dShare.to.should.equal(share.to);
dShare.share.should.equal(share.share);
});
it('should successfully parse S and D share', function () {
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.USER,
share: `${ecdsaFixtures_1.mockSShareFromUser.R}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.s}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.y}${sdk_core_1.ECDSAMethods.secondaryDelimeter}${ecdsaFixtures_1.mockDShareToBitgo.delta}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockDShareToBitgo.Gamma}`,
};
const { sShare, dShare } = sdk_core_1.ECDSAMethods.parseSDShare(share);
sShare.i.should.equal(3);
sShare.R.should.equal(ecdsaFixtures_1.mockSShareFromUser.R);
sShare.s.should.equal(ecdsaFixtures_1.mockSShareFromUser.s);
sShare.y.should.equal(ecdsaFixtures_1.mockSShareFromUser.y);
dShare.i.should.equal(ecdsaFixtures_1.mockDShareToBitgo.i);
dShare.j.should.equal(ecdsaFixtures_1.mockDShareToBitgo.j);
dShare.delta.should.equal(ecdsaFixtures_1.mockDShareToBitgo.delta);
dShare.Gamma.should.equal(ecdsaFixtures_1.mockDShareToBitgo.Gamma);
});
it('should successfully convert S and D share to signature share record', function () {
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.USER,
share: `${ecdsaFixtures_1.mockSShareFromUser.R}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.s}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.y}${sdk_core_1.ECDSAMethods.secondaryDelimeter}${ecdsaFixtures_1.mockDShareToBitgo.delta}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockDShareToBitgo.Gamma}`,
};
const sdShare = sdk_core_1.ECDSAMethods.convertSDShare({ sShare: ecdsaFixtures_1.mockSShareFromUser, dShare: ecdsaFixtures_1.mockDShareToBitgo });
sdShare.from.should.equal(share.from);
sdShare.to.should.equal(share.to);
sdShare.share.should.equal(share.share);
});
it('should successfully parse signature share', function () {
const share = {
to: sdk_core_1.SignatureShareType.USER,
from: sdk_core_1.SignatureShareType.BITGO,
share: `${ecdsaFixtures_1.mockSShareFromUser.R}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.s}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.y}`,
};
const signature = sdk_core_1.ECDSAMethods.parseSignatureShare(share);
signature.i.should.equal(1);
signature.R.should.equal(ecdsaFixtures_1.mockSShareFromUser.R);
signature.s.should.equal(ecdsaFixtures_1.mockSShareFromUser.s);
signature.y.should.equal(ecdsaFixtures_1.mockSShareFromUser.y);
});
it('should succuesfully parse combined signature', function () {
const mockCombinedSignature = mpc.constructSignature([ecdsaFixtures_1.mockSShareFromUser, ecdsaFixtures_1.mockSShare]);
const share = {
to: sdk_core_1.SignatureShareType.USER,
from: sdk_core_1.SignatureShareType.BITGO,
share: `${mockCombinedSignature.recid}${sdk_core_1.ECDSAMethods.delimeter}${mockCombinedSignature.r}${sdk_core_1.ECDSAMethods.delimeter}${mockCombinedSignature.s}${sdk_core_1.ECDSAMethods.delimeter}${mockCombinedSignature.y}`,
};
const signature = sdk_core_1.ECDSAMethods.parseCombinedSignature(share);
signature.recid.should.equal(mockCombinedSignature.recid);
signature.r.should.equal(mockCombinedSignature.r);
signature.s.should.equal(mockCombinedSignature.s);
signature.y.should.equal(mockCombinedSignature.y);
});
it('should successfully convert signature share to signature share record', function () {
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.USER,
share: `${ecdsaFixtures_1.mockSShareFromUser.R}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.s}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.y}`,
};
const signatureShare = sdk_core_1.ECDSAMethods.convertSignatureShare(ecdsaFixtures_1.mockSShareFromUser, sdk_core_1.ECDSAMethods.getParticipantIndex('user'), sdk_core_1.ECDSAMethods.getParticipantIndex('bitgo'));
signatureShare.from.should.equal(share.from);
signatureShare.to.should.equal(share.to);
signatureShare.share.should.equal(share.share);
});
it('should successfully convert B share to signature share record', function () {
const bShare = ecdsaFixtures_1.mockedBitgoBShare.bShare;
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.BITGO,
share: `${bShare.beta}${sdk_core_1.ECDSAMethods.delimeter}${bShare.gamma}${sdk_core_1.ECDSAMethods.delimeter}${bShare.k}${sdk_core_1.ECDSAMethods.delimeter}${bShare.nu}${sdk_core_1.ECDSAMethods.delimeter}${bShare.w}${sdk_core_1.ECDSAMethods.delimeter}${bShare.y}${sdk_core_1.ECDSAMethods.delimeter}${bShare.l}${sdk_core_1.ECDSAMethods.delimeter}${bShare.m}${sdk_core_1.ECDSAMethods.delimeter}${bShare.n}${sdk_core_1.ECDSAMethods.delimeter}${bShare.ntilde}${sdk_core_1.ECDSAMethods.delimeter}${bShare.h1}${sdk_core_1.ECDSAMethods.delimeter}${bShare.h2}${sdk_core_1.ECDSAMethods.delimeter}${bShare.ck}${sdk_core_1.ECDSAMethods.delimeter}${bShare.p.join(sdk_core_1.ECDSAMethods.delimeter)}`,
};
const signatureShare = sdk_core_1.ECDSAMethods.convertBShare(bShare);
signatureShare.from.should.equal(share.from);
signatureShare.to.should.equal(share.to);
signatureShare.share.should.equal(share.share);
});
it('should successfully parse B share', function () {
const bShare = ecdsaFixtures_1.mockedBitgoBShare.bShare;
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.BITGO,
share: sdk_core_1.ECDSAMethods.convertBShare(ecdsaFixtures_1.mockedBitgoBShare.bShare).share,
};
const parsedBShare = sdk_core_1.ECDSAMethods.parseBShare(share);
parsedBShare.should.deepEqual(bShare);
});
it('should successfully convert O share to signature share record', function () {
const oShare = ecdsaFixtures_1.mockedBitgoOAndDShare.oShare;
const delimeter = sdk_core_1.ECDSAMethods.delimeter;
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.BITGO,
share: `${oShare.Gamma}${delimeter}${oShare.delta}${delimeter}${oShare.k}${delimeter}${oShare.omicron}${delimeter}${oShare.y}`,
};
const oShareSigRecord = sdk_core_1.ECDSAMethods.convertOShare(oShare);
oShareSigRecord.from.should.equal(share.from);
oShareSigRecord.to.should.equal(share.to);
oShareSigRecord.share.should.equal(share.share);
});
it('should successfully parse O share', function () {
const oShare = ecdsaFixtures_1.mockedBitgoOAndDShare.oShare;
const delimeter = sdk_core_1.ECDSAMethods.delimeter;
const share = {
to: sdk_core_1.SignatureShareType.BITGO,
from: sdk_core_1.SignatureShareType.BITGO,
share: `${oShare.Gamma}${delimeter}${oShare.delta}${delimeter}${oShare.k}${delimeter}${oShare.omicron}${delimeter}${oShare.y}`,
};
const parsedOShare = sdk_core_1.ECDSAMethods.parseOShare(share);
parsedOShare.i.should.equal(oShare.i);
parsedOShare.y.should.equal(oShare.y);
parsedOShare.k.should.equal(oShare.k);
parsedOShare.omicron.should.equal(oShare.omicron);
parsedOShare.delta.should.equal(oShare.delta);
parsedOShare.Gamma.should.equal(oShare.Gamma);
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3YyL3VuaXQvdHNzL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOENBV3lCO0FBQ3pCLG9EQUFvRTtBQUNwRSxtQ0FBbUM7QUFDbkMsaUNBQWtDO0FBQ2xDLDhDQUErRTtBQUMvRSx5Q0FBd0M7QUFDeEMsdUNBQXFFO0FBQ3JFLG9FQWUwQztBQUUxQyw2QkFBOEI7QUFHOUIsTUFBTSxhQUFhLEdBQUcsdUJBQVksQ0FBQyxhQUFhLENBQUM7QUFDakQsTUFBTSxpQkFBaUIsR0FBRyx1QkFBWSxDQUFDLGlCQUFpQixDQUFDO0FBTXpELFFBQVEsQ0FBQyxrQ0FBa0MsRUFBRTtJQUMzQyxJQUFJLEdBQVUsQ0FBQztJQUVmLElBQUksWUFBc0IsQ0FBQztJQUMzQixJQUFJLGNBQXdCLENBQUM7SUFDN0IsSUFBSSxhQUF1QixDQUFDO0lBRTVCLElBQUksT0FBMEIsQ0FBQztJQUMvQixJQUFJLFNBQTRCLENBQUM7SUFDakMsSUFBSSxRQUEyQixDQUFDO0lBRWhDLElBQUksY0FBMEIsQ0FBQztJQUMvQixJQUFJLGdCQUE0QixDQUFDO0lBQ2pDLElBQUksZUFBMkIsQ0FBQztJQUNoQyxJQUFJLGNBQXNCLENBQUM7SUFFM0IsTUFBTSxDQUFDLEtBQUs7UUFDVixHQUFHLEdBQUcsSUFBSSxnQkFBSyxFQUFFLENBQUM7UUFDbEIsWUFBWSxHQUFHLHlCQUFTLENBQUMsWUFBWSxDQUFDO1FBQ3RDLGNBQWMsR0FBRyx5QkFBUyxDQUFDLGNBQWMsQ0FBQztRQUMxQyxhQUFhLEdBQUcseUJBQVMsQ0FBQyxhQUFhLENBQUM7UUFFeEMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxD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TUFBTSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRCxNQUFNLENBQUMsTUFBTSxDQUFDLElB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dUJBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLHVCQUFZLENBQUMsU0FBUyxHQUNoRixTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUN6QixHQUFHLHVCQUFZLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDL0UsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFDekIsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxHQUN4Ryx1QkFBWSxDQUFDLFNBQ2YsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLHVCQUFZLENBQUMsU0FBUyxHQUN6RyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUMxQixHQUFHLHVCQUFZLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDN0UsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFDMUIsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxHQUN4Ryx1QkFBWSxDQUFDLFNBQ2YsR0FBRyxTQUFTLENBQUMsS0FBTSxDQUFDLElBQUksQ0FBQyx1QkFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2lCQUMzQixDQUFDO2dCQUUxQixNQUFNLE1BQU0sR0FBRyx1QkFBWSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtnQkFDdkMsTUFBTSxLQUFLLEdBQUc7b0JBQ1osRUFBRSxFQUFFLDZCQUFrQixDQUFDLEtBQUs7b0JBQzVCLElBQUksRUFBRSw2QkFBa0IsQ0FBQyxJQUFJO29CQUM3QixLQUFLLEVBQUUsdUJBQVksQ0FBQyxjQUFjLENBQUMsMkJBQVcsQ0FBQyxDQUFDLEtBQUs7aUJBQzlCLENBQUM7Z0JBQzFCLE1BQU0sT0FBTyxHQUFHLHVCQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRTtnQkFDbkUsTUFBTSxLQUFLLEdBQUc7b0JBQ1osRUFBRSxFQUFFLDZCQUFrQixDQUFDLEtBQUs7b0JBQzVCLElBQUksRUFBRSw2QkFBa0IsQ0FBQyxJQUFJO29CQUM3QixLQUFLLEVBQUUsR0FBRywyQkFBVyxDQUFDLEtBQUssR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FBRywyQkFBVyxDQUFDLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDNUYsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQy9CLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDckYsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQy9CLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDbEYsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQy9CLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDbEYsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQ2hDLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDbkYsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQ2hDLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDbkYsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQy9CLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDbEYsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDakYsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDOUUsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDOUUsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQzVCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDL0UsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQzVCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDL0UsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtpQkFDbEMsQ0FBQztnQkFDMUIsTUFBTSxPQUFPLEdBQUcsdUJBQVksQ0FBQyxjQUFjLENBQUMsMkJBQVcsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFD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Q0RTQU1ldGhvZFR5cGVzLFxuICBXYWxsZXQsXG4gIFNpZ25hdHVyZVNoYXJlUmVjb3JkLFxuICBnZXRUeFJlcXVlc3QsXG4gIEVDRFNBTWV0aG9kcyxcbiAgUmVxdWVzdFR5cGUsXG4gIFNpZ25hdHVyZVNoYXJlVHlwZSxcbiAgaGV4VG9CaWdJbnQsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBFY2RzYVR5cGVzLCBFY2RzYVBhaWxsaWVyUHJvb2YgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0ICogYXMgb3BlbnBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCBzaG91bGQgPSByZXF1aXJlKCdzaG91bGQnKTtcbmltcG9ydCB7IG1vY2tTZXJpYWxpemVkQ2hhbGxlbmdlV2l0aFByb29mcywgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IG5vY2tHZXRUeFJlcXVlc3QsIG5vY2tTZW5kU2lnbmF0dXJlU2hhcmUgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgZ2FtbWFBbmRNdVNoYXJlQ3JlYXRpb25QYXJhbXMsXG4gIG9taWNyb25BbmREZWx0YVNoYXJlQ3JlYXRpb25QYXJhbXMsXG4gIGtleVNoYXJlcyxcbiAgY3JlYXRlVXNlclNpZ25hdHVyZVBhcmFtcyxcbiAgbW9ja1NpZ25SVCxcbiAgbW9ja0FTaGFyZSxcbiAgbW9ja011U2hhcmUsXG4gIG1vY2tEU2hhcmUsXG4gIG1vY2tTU2hhcmVGcm9tVXNlcixcbiAgbW9ja0RTaGFyZVRvQml0Z28sXG4gIG1vY2tlZEJpdGdvQlNoYXJlLFxuICBtb2NrZWRCaXRnb09BbmREU2hhcmUsXG4gIG1vY2tTU2hhcmUsXG4gIG1vY2tTaWduV2l0aFBhaWxsaWVyQ2hhbGxlbmdlUlQsXG59IGZyb20gJy4uLy4uL2ZpeHR1cmVzL3Rzcy9lY2RzYUZpeHR1cmVzJztcblxuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5cbnR5cGUgS2V5U2hhcmUgPSBFQ0RTQS5LZXlTaGFyZTtcbmNvbnN0IGVuY3J5cHROU2hhcmUgPSBFQ0RTQU1ldGhvZHMuZW5jcnlwdE5TaGFyZTtcbmNvbnN0IGNyZWF0ZUNvbWJpbmVkS2V5ID0gRUNEU0FNZXRob2RzLmNyZWF0ZUNvbWJpbmVkS2V5O1xudHlwZSBHcGdLZXlwYWlyID0ge1xuICBwdWJsaWNLZXk6IHN0cmluZztcbiAgcHJpdmF0ZUtleTogc3RyaW5nO1xufTtcblxuZGVzY3JpYmUoJ0VjZHNhIHRzcyBoZWxwZXIgZnVuY3Rpb25zIHRlc3RzJywgZnVuY3Rpb24gKCkge1xuICBsZXQgbXBjOiBFY2RzYTtcblxuICBsZXQgdXNlcktleVNoYXJlOiBLZXlTaGFyZTtcbiAgbGV0IGJhY2t1cEtleVNoYXJlOiBLZXlTaGFyZTtcbiAgbGV0IGJpdGdvS2V5U2hhcmU6IEtleVNoYXJlO1xuXG4gIGxldCB1c2VyS2V5OiBFQ0RTQS5LZXlDb21iaW5lZDtcbiAgbGV0IGJhY2t1cEtleTogRUNEU0EuS2V5Q29tYmluZWQ7XG4gIGxldCBiaXRnb0tleTogRUNEU0EuS2V5Q29tYmluZWQ7XG5cbiAgbGV0IHVzZXJHcGdLZXlwYWlyOiBHcGdLZXlwYWlyO1xuICBsZXQgYmFja3VwR3BnS2V5cGFpcjogR3BnS2V5cGFpcjtcbiAgbGV0IGJpdGdvR3BnS2V5cGFpcjogR3BnS2V5cGFpcjtcbiAgbGV0IGNvbW1vbktleWNoYWluOiBzdHJpbmc7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBtcGMgPSBuZXcgRWNkc2EoKTtcbiAgICB1c2VyS2V5U2hhcmUgPSBrZXlTaGFyZXMudXNlcktleVNoYXJlO1xuICAgIGJhY2t1cEtleVNoYXJlID0ga2V5U2hhcmVzLmJhY2t1cEtleVNoYXJlO1xuICAgIGJpdGdvS2V5U2hhcmUgPSBrZXlTaGFyZXMuYml0Z29LZXlTaGFyZTtcblxuICAgIHVzZXJLZXkgPSBtcGMua2V5Q29tYmluZSh1c2VyS2V5U2hhcmUucFNoYXJlLCBbYmFja3VwS2V5U2hhcmUublNoYXJlc1sxXSwgYml0Z29LZXlTaGFyZS5uU2hhcmVzWzFdXSk7XG4gICAgYmFja3VwS2V5ID0gbXBjLmtleUNvbWJpbmUoYmFja3VwS2V5U2hhcmUucFNoYXJlLCBbdXNlcktleVNoYXJlLm5TaGFyZXNbMl0sIGJpdGdvS2V5U2hhcmUublNoYXJlc1syXV0pO1xuICAgIGJpdGdvS2V5ID0gbXBjLmtleUNvbWJpbmUoYml0Z29LZXlTaGFyZS5wU2hhcmUsIFtiYWNrdXBLZXlTaGFyZS5uU2hhcmVzWzNdLCB1c2VyS2V5U2hhcmUublNoYXJlc1szXV0pO1xuXG4gICAgKHVzZXJLZXkueFNoYXJlLnkgKyB1c2VyS2V5LnhTaGFyZS5jaGFpbmNvZGUpLnNob3VsZC5lcXVhbChiYWNrdXBLZXkueFNoYXJlLnkgKyBiYWNrdXBLZXkueFNoYXJlLmNoYWluY29kZSk7XG4gICAgKHVzZXJLZXkueFNoYXJlLnkgKyB1c2VyS2V5LnhTaGFyZS5jaGFpbmNvZGUpLnNob3VsZC5lcXVhbChiaXRnb0tleS54U2hhcmUueSArIGJpdGdvS2V5LnhTaGFyZS5jaGFpbmNvZGUpO1xuICAgIGNvbW1vbktleWNoYWluID0gdXNlcktleS54U2hhcmUueSArIHVzZXJLZXkueFNoYXJlLmNoYWluY29kZTtcbiAgICBjb25zdCBncGdLZXlwYWlyUHJvbWlzZXMgPSBbXG4gICAgICB7IG5hbWU6ICd1c2VyJywgZW1haWw6ICd1c2VyQGJpdGdvLmNvbScgfSxcbiAgICAgIHsgbmFtZTogJ2JhY2t1cCcsIGVtYWlsOiAnYmFja3VwQGJpdGdvLmNvbScgfSxcbiAgICAgIHsgbmFtZTogJ2JpdGdvJywgZW1haWw6ICdiaXRnb0BiaXRnby5jb20nIH0sXG4gICAgXS5tYXAoYXN5bmMgKHVzZXIpID0+IHtcbiAgICAgIHJldHVybiBvcGVucGdwLmdlbmVyYXRlS2V5KHtcbiAgICAgICAgdXNlcklEczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGN1cnZlOiAnc2VjcDI1NmsxJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZ3BnS2V5cGFpcnMgPSBhd2FpdCBQcm9taXNlLmFsbChncGdLZXlwYWlyUHJvbWlzZXMpO1xuICAgIHVzZXJHcGdLZXlwYWlyID0gZ3BnS2V5cGFpcnNbMF07XG4gICAgYmFja3VwR3BnS2V5cGFpciA9IGdwZ0tleXBhaXJzWzFdO1xuICAgIGJpdGdvR3BnS2V5cGFpciA9IGdwZ0tleXBhaXJzWzJdO1xuICB9KTtcblxuICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZW5jcnlwdE5TaGFyZSBhbmQgZGVjcnlwdE5TaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGVuY3J5cHQgbiBzaGFyZXMgZm9yZWFjaCB1c2VyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPD0gMzsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZE5TaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5lbmNyeXB0TlNoYXJlKFxuICAgICAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgICAgICBpLFxuICAgICAgICAgIGJpdGdvR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICAgICAgdXNlckdwZ0tleXBhaXJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkTlNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmRlY3J5cHROU2hhcmUoe1xuICAgICAgICAgIG5TaGFyZTogZW5jcnlwdGVkTlNoYXJlLFxuICAgICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiB1c2VyR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiBiaXRnb0dwZ0tleXBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlY3J5cHRlZE5TaGFyZS51LnNob3VsZC5lcXVhbCh1c2VyS2V5U2hhcmUublNoYXJlc1tpXS51KTtcbiAgICAgICAgY29uc3QgcHVibGljS2V5ID0gdXNlcktleVNoYXJlLnBTaGFyZS55ICsgdXNlcktleVNoYXJlLnBTaGFyZS5jaGFpbmNvZGU7XG4gICAgICAgIGVuY3J5cHRlZE5TaGFyZS5pLnNob3VsZC5lcXVhbChpKTtcbiAgICAgICAgZW5jcnlwdGVkTlNoYXJlLnZzc1Byb29mIS5zaG91bGQuZXF1YWwodXNlcktleVNoYXJlLm5TaGFyZXNbM10udiEpO1xuICAgICAgICBlbmNyeXB0ZWROU2hhcmUuai5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIGVuY3J5cHRlZE5TaGFyZS5wdWJsaWNTaGFyZS5zaG91bGQuZXF1YWwocHVibGljS2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXJyb3IgZm9yIGludmFsaWQgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZW5jcnlwdE5TaGFyZSh1c2VyS2V5U2hhcmUsIDEsIHVzZXJHcGdLZXlwYWlyLnByaXZhdGVLZXksIHVzZXJHcGdLZXlwYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAnSW52YWxpZCByZWNpcGllbnQnXG4gICAgICApO1xuICAgICAgYXdhaXQgZW5jcnlwdE5TaGFyZShiYWNrdXBLZXlTaGFyZSwgMiwgdXNlckdwZ0tleXBhaXIucHJpdmF0ZUtleSwgdXNlckdwZ0tleXBhaXIpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdJbnZhbGlkIHJlY2lwaWVudCdcbiAgICAgICk7XG4gICAgICBhd2FpdCBlbmNyeXB0TlNoYXJlKGJpdGdvS2V5U2hhcmUsIDMsIHVzZXJHcGdLZXlwYWlyLnByaXZhdGVLZXksIHVzZXJHcGdLZXlwYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAnSW52YWxpZCByZWNpcGllbnQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNyeXB0IG4gc2hhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbmNyeXB0ZWROU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuZW5jcnlwdE5TaGFyZShcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICAzLFxuICAgICAgICBiaXRnb0dwZ0tleXBhaXIucHVibGljS2V5LFxuICAgICAgICB1c2VyR3BnS2V5cGFpclxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZE5TaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5kZWNyeXB0TlNoYXJlKHtcbiAgICAgICAgblNoYXJlOiBlbmNyeXB0ZWROU2hhcmUsXG4gICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogYml0Z29HcGdLZXlwYWlyLnByaXZhdGVLZXksXG4gICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiB1c2VyR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICB9KTtcbiAgICAgIGRlY3J5cHRlZE5TaGFyZS5pLnNob3VsZC5lcXVhbCh1c2VyS2V5U2hhcmUublNoYXJlc1szXS5pKTtcbiAgICAgIGRlY3J5cHRlZE5TaGFyZS5qLnNob3VsZC5lcXVhbCh1c2VyS2V5U2hhcmUublNoYXJlc1szXS5qKTtcbiAgICAgIGRlY3J5cHRlZE5TaGFyZS5uLnNob3VsZC5lcXVhbCh1c2VyS2V5U2hhcmUublNoYXJlc1szXS5uKTtcbiAgICAgIGRlY3J5cHRlZE5TaGFyZS51LnNob3VsZC5lcXVhbCh1c2VyS2V5U2hhcmUublNoYXJlc1szXS51KTtcbiAgICAgIGRlY3J5cHRlZE5TaGFyZS55LnNob3VsZC5lcXVhbCh1c2VyS2V5U2hhcmUublNoYXJlc1szXS55KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NyZWF0ZUNvbWJpbmVkS2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIGNvbWJpbmVkIHVzZXIga2V5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z29Ub1VzZXJTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5lbmNyeXB0TlNoYXJlKFxuICAgICAgICBiaXRnb0tleVNoYXJlLFxuICAgICAgICAxLFxuICAgICAgICB1c2VyR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICAgIHVzZXJHcGdLZXlwYWlyLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJhY2t1cFRvVXNlclNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmVuY3J5cHROU2hhcmUoXG4gICAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgICAxLFxuICAgICAgICB1c2VyR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICAgIHVzZXJHcGdLZXlwYWlyLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvbWJpbmVkVXNlcktleSA9IGF3YWl0IGNyZWF0ZUNvbWJpbmVkS2V5KFxuICAgICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuU2hhcmU6IGJpdGdvVG9Vc2VyU2hhcmUsXG4gICAgICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHVzZXJHcGdLZXlwYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogYml0Z29HcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgblNoYXJlOiBiYWNrdXBUb1VzZXJTaGFyZSxcbiAgICAgICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleXBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiBiYWNrdXBHcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNvbW1vbktleWNoYWluXG4gICAgICApO1xuXG4gICAgICBjb21iaW5lZFVzZXJLZXkuY29tbW9uS2V5Y2hhaW4uc2hvdWxkLmVxdWFsKGNvbW1vbktleWNoYWluKTtcbiAgICAgIGNvbWJpbmVkVXNlcktleS5zaWduaW5nTWF0ZXJpYWwucFNoYXJlLnNob3VsZC5kZWVwRXF1YWwodXNlcktleVNoYXJlLnBTaGFyZSk7XG4gICAgICBzaG91bGQuZXhpc3QoY29tYmluZWRVc2VyS2V5LnNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpO1xuICAgICAgY29tYmluZWRVc2VyS2V5LnNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmU/LnNob3VsZC5kZWVwRXF1YWwoYmFja3VwS2V5U2hhcmUublNoYXJlc1sxXSk7XG4gICAgICBjb21iaW5lZFVzZXJLZXkuc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLnNob3VsZC5kZWVwRXF1YWwoYml0Z29LZXlTaGFyZS5uU2hhcmVzWzFdKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoY29tYmluZWRVc2VyS2V5LnNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIGNvbWJpbmVkIGJhY2t1cCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnb1RvQmFja3VwU2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKGJpdGdvS2V5U2hhcmUsIDIsIGJhY2t1cEdwZ0tleXBhaXIucHVibGljS2V5LCB1c2VyR3BnS2V5cGFpcik7XG5cbiAgICAgIGNvbnN0IHVzZXJUb0JhY2t1cFNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZSh1c2VyS2V5U2hhcmUsIDIsIGJhY2t1cEdwZ0tleXBhaXIucHVibGljS2V5LCB1c2VyR3BnS2V5cGFpcik7XG5cbiAgICAgIGNvbnN0IGNvbWJpbmVkQmFja3VwS2V5ID0gYXdhaXQgY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgblNoYXJlOiBiaXRnb1RvQmFja3VwU2hhcmUsXG4gICAgICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IGJhY2t1cEdwZ0tleXBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiBiaXRnb0dwZ0tleXBhaXIucHVibGljS2V5LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgblNoYXJlOiB1c2VyVG9CYWNrdXBTaGFyZSxcbiAgICAgICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogYmFja3VwR3BnS2V5cGFpci5wcml2YXRlS2V5LFxuICAgICAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHVzZXJHcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBjb21tb25LZXljaGFpblxuICAgICAgKTtcblxuICAgICAgY29tYmluZWRCYWNrdXBLZXkuY29tbW9uS2V5Y2hhaW4uc2hvdWxkLmVxdWFsKGNvbW1vbktleWNoYWluKTtcbiAgICAgIGNvbWJpbmVkQmFja3VwS2V5LnNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuc2hvdWxkLmRlZXBFcXVhbChiYWNrdXBLZXlTaGFyZS5wU2hhcmUpO1xuICAgICAgc2hvdWxkLmV4aXN0KGNvbWJpbmVkQmFja3VwS2V5LnNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlKTtcbiAgICAgIGNvbWJpbmVkQmFja3VwS2V5LnNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlPy5zaG91bGQuZGVlcEVxdWFsKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzJdKTtcbiAgICAgIGNvbWJpbmVkQmFja3VwS2V5LnNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZS5zaG91bGQuZGVlcEVxdWFsKGJpdGdvS2V5U2hhcmUublNoYXJlc1syXSk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KGNvbWJpbmVkQmFja3VwS2V5LnNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIGNvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z29Ub1VzZXJTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoYml0Z29LZXlTaGFyZSwgMSwgdXNlckdwZ0tleXBhaXIucHVibGljS2V5LCB1c2VyR3BnS2V5cGFpcik7XG4gICAgICBjb25zdCBiYWNrdXBUb1VzZXJTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoYmFja3VwS2V5U2hhcmUsIDEsIHVzZXJHcGdLZXlwYWlyLnB1YmxpY0tleSwgdXNlckdwZ0tleXBhaXIpO1xuXG4gICAgICAvLyB0aGlzIHNob3VsZCBmYWlsIHRvIGNvbWJpbmUgdGhlIGtleXMgYmVjYXVzZSB3ZSBwYXNzIGluIGludmFsaWQgY29tbW9uIGtleSBjaGFpblxuICAgICAgYXdhaXQgY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5TaGFyZTogYml0Z29Ub1VzZXJTaGFyZSxcbiAgICAgICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleXBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiBiaXRnb0dwZ0tleXBhaXIucHVibGljS2V5LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgblNoYXJlOiBiYWNrdXBUb1VzZXJTaGFyZSxcbiAgICAgICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleXBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiBiYWNrdXBHcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAnbm90dGhlcmlnaHRrZXljaGFpbidcbiAgICAgICkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnQ29tbW9uIGtleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiBncGcga2V5cyBhcmUgbWlzbWF0Y2hlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvVG9Vc2VyU2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKGJpdGdvS2V5U2hhcmUsIDEsIHVzZXJHcGdLZXlwYWlyLnB1YmxpY0tleSwgdXNlckdwZ0tleXBhaXIpO1xuICAgICAgY29uc3QgYmFja3VwVG9Vc2VyU2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKGJhY2t1cEtleVNoYXJlLCAxLCB1c2VyR3BnS2V5cGFpci5wdWJsaWNLZXksIHVzZXJHcGdLZXlwYWlyKTtcblxuICAgICAgYXdhaXQgY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5TaGFyZTogYml0Z29Ub1VzZXJTaGFyZSxcbiAgICAgICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogYmFja3VwR3BnS2V5cGFpci5wcml2YXRlS2V5LFxuICAgICAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuU2hhcmU6IGJhY2t1cFRvVXNlclNoYXJlLFxuICAgICAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiB1c2VyR3BnS2V5cGFpci5wcml2YXRlS2V5LFxuICAgICAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJhY2t1cEdwZ0tleXBhaXIucHVibGljS2V5LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgICdub3R0aGVyaWdodGtleWNoYWluJ1xuICAgICAgKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdFcnJvciBkZWNyeXB0aW5nIG1lc3NhZ2U6IFNlc3Npb24ga2V5IGRlY3J5cHRpb24gZmFpbGVkLicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHNzIHNpZ25pbmcgaGVscGVyIGZ1bmN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuXG4gICAgbGV0IHdhbGxldDogV2FsbGV0O1xuICAgIGNvbnN0IHR4UmVxdWVzdCA9IHtcbiAgICAgIHR4UmVxdWVzdElkOiAncmFuZG9tSWQnLFxuICAgICAgdW5zaWduZWRUeHM6IFt7IHNpZ25hYmxlSGV4OiAnVE9PIE1BTlkgU0VDUkVUUycsIHNlcmlhbGl6ZWRUeEhleDogJ3JhbmRvbWhleDInIH1dLFxuICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiAnYml0Z28nLFxuICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgc2hhcmU6ICcnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXS5zaWduYWJsZUhleCwgJ2hleCcpO1xuXG4gICAgYmVmb3JlKCdpbml0aWFsaXplcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJhc2VDb2luID0gYml0Z28uY29pbignaHRldGgnKTtcbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnLFxuICAgICAgICBjb2luOiAnaHRldGgnLFxuICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NTAwMDAwMDAwJyxcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc2MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzcwMDAwMDAwMCcsXG4gICAgICAgIF0sXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICB9O1xuICAgICAgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZUNvaW4sIHdhbGxldERhdGEpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZVVzZXJTaWduU2hhcmU6JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHVzZXJUb0JpdEdvUGFpbGxpZXJDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZFBhaWxsaWVyQ2hhbGxlbmdlO1xuICAgICAgbGV0IGJpdGdvVG9Vc2VyUGFpbGxpZXJDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZFBhaWxsaWVyQ2hhbGxlbmdlO1xuXG4gICAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICB1c2VyVG9CaXRHb1BhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5zZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7XG4gICAgICAgICAgcDogYXdhaXQgRWNkc2FQYWlsbGllclByb29mLmdlbmVyYXRlUChoZXhUb0JpZ0ludCh1c2VyS2V5LnlTaGFyZXNbM10ubikpLFxuICAgICAgICB9KTtcbiAgICAgICAgYml0Z29Ub1VzZXJQYWlsbGllckNoYWxsZW5nZSA9IEVjZHNhVHlwZXMuc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2Uoe1xuICAgICAgICAgIHA6IGF3YWl0IEVjZHNhUGFpbGxpZXJQcm9vZi5nZW5lcmF0ZVAoaGV4VG9CaWdJbnQodXNlcktleS54U2hhcmUubikpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gY3JlYXRlIFVzZXIgU2lnblNoYXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB4U2hhcmUgPSBtcGMuYXBwZW5kQ2hhbGxlbmdlKFxuICAgICAgICAgIHVzZXJLZXkueFNoYXJlLFxuICAgICAgICAgIG1vY2tTZXJpYWxpemVkQ2hhbGxlbmdlV2l0aFByb29mcyxcbiAgICAgICAgICB1c2VyVG9CaXRHb1BhaWxsaWVyQ2hhbGxlbmdlXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHlTaGFyZSA9IG1wYy5hcHBlbmRDaGFsbGVuZ2UoXG4gICAgICAgICAgdXNlcktleS55U2hhcmVzWzNdLFxuICAgICAgICAgIHsgbnRpbGRlOiB4U2hhcmUubnRpbGRlLCBoMTogeFNoYXJlLmgxLCBoMjogeFNoYXJlLmgyIH0sXG4gICAgICAgICAgYml0Z29Ub1VzZXJQYWlsbGllckNoYWxsZW5nZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB1c2VyU2lnblNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduU2hhcmUoeFNoYXJlLCB5U2hhcmUpO1xuICAgICAgICB1c2VyU2lnblNoYXJlLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWyd3U2hhcmUnLCAna1NoYXJlJ10pO1xuICAgICAgICBjb25zdCB7IHdTaGFyZSwga1NoYXJlIH0gPSB1c2VyU2lnblNoYXJlO1xuICAgICAgICB3U2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2dhbW1hJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIHdTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndycpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICB3U2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2snKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgd1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjaycpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICB3U2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2gyJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIHdTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaDEnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgd1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdudGlsZGUnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgd1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCd5JykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIHdTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbicpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICB3U2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ20nKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgd1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdsJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIHdTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaScpLmFuZC5iZS5hLk51bWJlcigpO1xuICAgICAgICBrU2hhcmVbJ2knXS5zaG91bGQuZXF1YWwoMyk7XG4gICAgICAgIGtTaGFyZVsnaiddLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAga1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCduJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIGtTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaycpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICBrU2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ250aWxkZScpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICBrU2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2gxJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIGtTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaDInKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIFhzaGFyZSBkb2VzbnQgYmVsb25nIHRvIHRoZSBVc2VyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgeFNoYXJlID0gbXBjLmFwcGVuZENoYWxsZW5nZShcbiAgICAgICAgICB1c2VyS2V5LnhTaGFyZSxcbiAgICAgICAgICBtb2NrU2VyaWFsaXplZENoYWxsZW5nZVdpdGhQcm9vZnMsXG4gICAgICAgICAgdXNlclRvQml0R29QYWlsbGllckNoYWxsZW5nZVxuICAgICAgICApO1xuICAgICAgICB4U2hhcmUgPSB7IC4uLnhTaGFyZSwgaTogMyB9O1xuICAgICAgICBjb25zdCB5U2hhcmUgPSBtcGMuYXBwZW5kQ2hhbGxlbmdlKFxuICAgICAgICAgIHVzZXJLZXkueVNoYXJlc1szXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IHhTaGFyZS5udGlsZGUsXG4gICAgICAgICAgICBoMTogeFNoYXJlLmgxLFxuICAgICAgICAgICAgaDI6IHhTaGFyZS5oMixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJpdGdvVG9Vc2VyUGFpbGxpZXJDaGFsbGVuZ2VcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduU2hhcmUoeFNoYXJlLCB5U2hhcmUpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgYEludmFsaWQgWFNoYXJlLCBYU2hhcmUgZG9lc24ndCBiZWxvbmcgdG8gdGhlIFVzZXJgXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjcmVhdGVVc2VyR2FtbWFBbmRNdVNoYXJlOicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byBjcmVhdGUgVXNlciBHYW1tYSBTaGFyZSBhbmQgTXVTaGFyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdXNlclNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJHYW1tYUFuZE11U2hhcmUoXG4gICAgICAgICAgZ2FtbWFBbmRNdVNoYXJlQ3JlYXRpb25QYXJhbXMud1NoYXJlLFxuICAgICAgICAgIGdhbW1hQW5kTXVTaGFyZUNyZWF0aW9uUGFyYW1zLmFTaGFyZVxuICAgICAgICApO1xuICAgICAgICB1c2VyU2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ211U2hhcmUnLCAnZ1NoYXJlJ10pO1xuICAgICAgICBjb25zdCB7IG11U2hhcmUsIGdTaGFyZSB9ID0gdXNlclNoYXJlO1xuICAgICAgICBtdVNoYXJlPy5pPy5zaG91bGQuZXF1YWwoMyk7XG4gICAgICAgIG11U2hhcmU/Lmo/LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgbXVTaGFyZT8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FscGhhJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIG11U2hhcmU/LnNob3VsZC5oYXZlLnByb3BlcnR5KCdtdScpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICBnU2hhcmU/LnNob3VsZC5oYXZlLnByb3BlcnR5KCdiZXRhJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIGdTaGFyZT8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ251JykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBXc2hhcmUgLyBBU2hhcmUgZG9lc250IGJlbG9uZyB0byB0aGUgVXNlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFdTaGFyZSA9IHsgLi4uZ2FtbWFBbmRNdVNoYXJlQ3JlYXRpb25QYXJhbXMud1NoYXJlLCBpOiAzIH07XG4gICAgICAgIGNvbnN0IGludmFsaWRBU2hhcmUgPSB7IC4uLmdhbW1hQW5kTXVTaGFyZUNyZWF0aW9uUGFyYW1zLmFTaGFyZSwgaTogMyB9O1xuICAgICAgICBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlckdhbW1hQW5kTXVTaGFyZShcbiAgICAgICAgICBpbnZhbGlkV1NoYXJlLFxuICAgICAgICAgIGdhbW1hQW5kTXVTaGFyZUNyZWF0aW9uUGFyYW1zLmFTaGFyZVxuICAgICAgICApLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoYEludmFsaWQgV1NoYXJlLCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgVXNlcmApO1xuICAgICAgICBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlckdhbW1hQW5kTXVTaGFyZShcbiAgICAgICAgICBnYW1tYUFuZE11U2hhcmVDcmVhdGlvblBhcmFtcy53U2hhcmUsXG4gICAgICAgICAgaW52YWxpZEFTaGFyZVxuICAgICAgICApLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoYEludmFsaWQgQVNoYXJlLCBpcyBub3QgZnJvbSBCaXRnbyB0byBVc2VyYCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjcmVhdGVVc2VyT21pY3JvbkFuZERlbHRhU2hhcmU6JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIGNyZWF0ZSBVc2VyIE9taWNyb24gYW5kIE11IFNoYXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdXNlclNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZShvbWljcm9uQW5kRGVsdGFTaGFyZUNyZWF0aW9uUGFyYW1zLmdTaGFyZSk7XG4gICAgICAgIHVzZXJTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnZFNoYXJlJywgJ29TaGFyZSddKTtcbiAgICAgICAgY29uc3QgeyBkU2hhcmUsIG9TaGFyZSB9ID0gdXNlclNoYXJlO1xuICAgICAgICBkU2hhcmU/Lmk/LnNob3VsZC5lcXVhbCgzKTtcbiAgICAgICAgZFNoYXJlPy5qPy5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIGRTaGFyZT8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2RlbHRhJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIGRTaGFyZT8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ0dhbW1hJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIG9TaGFyZT8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ29taWNyb24nKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgb1NoYXJlPy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZGVsdGEnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgc2hvdWxkIGZhaWwgaWYgdGhlIGdTaGFyZSBkb2Vzbid0IGJlbG9uZyB0byB0aGUgVXNlcmAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZEdTaGFyZSA9IHsgLi4ub21pY3JvbkFuZERlbHRhU2hhcmVDcmVhdGlvblBhcmFtcy5nU2hhcmUsIGk6IDMgfTtcbiAgICAgICAgYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZShpbnZhbGlkR1NoYXJlKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgIGBJbnZhbGlkIEdTaGFyZSwgZG9lc24ndCBiZWxvbmcgdG8gdGhlIFVzZXJgXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmU6JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byBjcmVhdGUgVXNlciBTaWduYXR1cmUgU2hhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHVzZXJTaWduYXR1cmVTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICAgICAgY3JlYXRlVXNlclNpZ25hdHVyZVBhcmFtcy5vU2hhcmUsXG4gICAgICAgICAgY3JlYXRlVXNlclNpZ25hdHVyZVBhcmFtcy5kU2hhcmUsXG4gICAgICAgICAgc2lnbmFibGVQYXlsb2FkXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHsgUiwgcywgeSwgaSB9ID0gdXNlclNpZ25hdHVyZVNoYXJlO1xuICAgICAgICBpLnNob3VsZC5iZS5OdW1iZXIoKTtcbiAgICAgICAgUi5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgcy5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgeS5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgc2hvdWxkIGZhaWwgaWYgdGhlIE9TaGFyZSAvIGRTaGFyZSBkb2Vzbid0IGJlbG9uZyB0byB0aGUgVXNlcmAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZE9TaGFyZSA9IHsgLi4uY3JlYXRlVXNlclNpZ25hdHVyZVBhcmFtcy5vU2hhcmUsIGk6IDMgfTtcbiAgICAgICAgYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduYXR1cmVTaGFyZShcbiAgICAgICAgICBpbnZhbGlkT1NoYXJlLFxuICAgICAgICAgIGNyZWF0ZVVzZXJTaWduYXR1cmVQYXJhbXMuZFNoYXJlLFxuICAgICAgICAgIHNpZ25hYmxlUGF5bG9hZFxuICAgICAgICApLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoYEludmFsaWQgT1NoYXJlLCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgVXNlcmApO1xuICAgICAgICBjb25zdCBpbnZhbGlkRFNoYXJlID0geyAuLi5jcmVhdGVVc2VyU2lnbmF0dXJlUGFyYW1zLmRTaGFyZSwgaTogMyB9O1xuICAgICAgICBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlclNpZ25hdHVyZVNoYXJlKFxuICAgICAgICAgIGNyZWF0ZVVzZXJTaWduYXR1cmVQYXJhbXMub1NoYXJlLFxuICAgICAgICAgIGludmFsaWREU2hhcmUsXG4gICAgICAgICAgc2lnbmFibGVQYXlsb2FkXG4gICAgICAgICkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChgSW52YWxpZCBEU2hhcmUsIGRvZXNuJ3Qgc2VlbSB0byBiZSBmcm9tIEJpdEdvYCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZW5kU2lnbmF0dXJlU2hhcmUgVGVzdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbW9ja0FTaGFyZVN0cmluZyA9IEVDRFNBTWV0aG9kcy5jb252ZXJ0QVNoYXJlKG1vY2tBU2hhcmUpLnNoYXJlO1xuICAgICAgY29uc3QgbW9ja0RTaGFyZVN0cmluZyA9IEVDRFNBTWV0aG9kcy5jb252ZXJ0RFNoYXJlKG1vY2tEU2hhcmUpLnNoYXJlO1xuICAgICAgY29uc3QgY29uZmlnID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc2hhcmVUb1NlbmQ6ICdLU2hhcmUnLFxuICAgICAgICAgIG1vY2tTaGFyZVRvU2VuZDogbW9ja1NpZ25SVC5rU2hhcmUsXG4gICAgICAgICAgbW9ja1NoYXJlVG9TZW5kU3RyaW5nOiBFQ0RTQU1ldGhvZHMuY29udmVydEtTaGFyZShtb2NrU2lnblJULmtTaGFyZSkuc2hhcmUsXG4gICAgICAgICAgc2VuZFR5cGU6IEVDRFNBTWV0aG9kVHlwZXMuU2VuZFNoYXJlVHlwZS5LU2hhcmUsXG4gICAgICAgICAgbW9ja1NoYXJlQXNSZXNwb25zZTogbW9ja0FTaGFyZSxcbiAgICAgICAgICBtb2NrU2hhcmVBc1Jlc3BvbnNlU3RyaW5nOiBtb2NrQVNoYXJlU3RyaW5nLFxuICAgICAgICAgIHNoYXJlUmVjZWl2ZWQ6ICdBU2hhcmUnLFxuICAgICAgICAgIGluY29ycmVjdFJlY2VpdmVkU2hhcmVTdHJpbmc6IG1vY2tBU2hhcmUuayxcbiAgICAgICAgICBzaWduZXJTaGFyZTogJ2EgdmFsaWQgc2lnbmVyIHNoYXJlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNoYXJlVG9TZW5kOiAnTVVTaGFyZScsXG4gICAgICAgICAgbW9ja1NoYXJlVG9TZW5kOiB7IG11U2hhcmU6IG1vY2tNdVNoYXJlLCBkU2hhcmU6IG1vY2tEU2hhcmVUb0JpdGdvLCBpOiBtb2NrTXVTaGFyZS5pIH0sXG4gICAgICAgICAgbW9ja1NoYXJlVG9TZW5kU3RyaW5nOiBgJHtFQ0RTQU1ldGhvZHMuY29udmVydE11U2hhcmUobW9ja011U2hhcmUpLnNoYXJlfSR7RUNEU0FNZXRob2RzLnNlY29uZGFyeURlbGltZXRlcn0ke1xuICAgICAgICAgICAgRUNEU0FNZXRob2RzLmNvbnZlcnREU2hhcmUobW9ja0RTaGFyZVRvQml0Z28pLnNoYXJlXG4gICAgICAgICAgfWAsXG4gICAgICAgICAgc2VuZFR5cGU6IEVDRFNBTWV0aG9kVHlwZXMuU2VuZFNoYXJlVHlwZS5NVVNoYXJlLFxuICAgICAgICAgIG1vY2tTaGFyZUFzUmVzcG9uc2U6IG1vY2tEU2hhcmUsXG4gICAgICAgICAgbW9ja1NoYXJlQXNSZXNwb25zZVN0cmluZzogbW9ja0RTaGFyZVN0cmluZyxcbiAgICAgICAgICBzaGFyZVJlY2VpdmVkOiAnRFNoYXJlJyxcbiAgICAgICAgICBpbmNvcnJlY3RSZWNlaXZlZFNoYXJlU3RyaW5nOiBtb2NrRFNoYXJlLkdhbW1hLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbmZpZy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgZGVzY3JpYmUoYHNlbmRTaWduYXR1cmVTaGFyZTogJHtjb25maWdbaW5kZXhdLnNoYXJlVG9TZW5kfWAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdChgc2hvdWxkIHN1Y2NlZWQgdG8gc2VuZCAke2NvbmZpZ1tpbmRleF0uc2hhcmVUb1NlbmR9YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgbW9ja1NlbmRSZXEgPSB7XG4gICAgICAgICAgICAgIGZyb206ICd1c2VyJyxcbiAgICAgICAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgICAgICAgIHNoYXJlOiBjb25maWdbaW5kZXhdLm1vY2tTaGFyZVRvU2VuZFN0cmluZyxcbiAgICAgICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgICAgICBjb25zdCBzaGFyZVJlY29yZCA9IHtcbiAgICAgICAgICAgICAgZnJvbTogJ2JpdGdvJyxcbiAgICAgICAgICAgICAgdG86ICd1c2VyJyxcbiAgICAgICAgICAgICAgc2hhcmU6IGNvbmZpZ1tpbmRleF0ubW9ja1NoYXJlQXNSZXNwb25zZVN0cmluZyxcbiAgICAgICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgICAgICBhd2FpdCBub2NrU2VuZFNpZ25hdHVyZVNoYXJlKHtcbiAgICAgICAgICAgICAgd2FsbGV0SWQ6IHdhbGxldC5pZCgpLFxuICAgICAgICAgICAgICB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgICAgICAgICBzaWduYXR1cmVTaGFyZTogbW9ja1NlbmRSZXEsXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiBzaGFyZVJlY29yZCxcbiAgICAgICAgICAgICAgdHNzVHlwZTogJ2VjZHNhJyxcbiAgICAgICAgICAgICAgc2lnbmVyU2hhcmU6IGNvbmZpZ1tpbmRleF0uc2lnbmVyU2hhcmUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHR4UmVxdWVzdC5zaWduYXR1cmVTaGFyZXMgPSBbc2hhcmVSZWNvcmRdO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7IHR4UmVxdWVzdHM6IFt7IHRyYW5zYWN0aW9uczogW3sgLi4udHhSZXF1ZXN0IH1dIH1dIH07XG4gICAgICAgICAgICBhd2FpdCBub2NrR2V0VHhSZXF1ZXN0KHsgd2FsbGV0SWQ6IHdhbGxldC5pZCgpLCB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZUFTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgICAgICAgICBiaXRnbyxcbiAgICAgICAgICAgICAgd2FsbGV0LmlkKCksXG4gICAgICAgICAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgUmVxdWVzdFR5cGUudHgsXG4gICAgICAgICAgICAgIGNvbmZpZ1tpbmRleF0uc2VuZFR5cGUsXG4gICAgICAgICAgICAgIGNvbmZpZ1tpbmRleF0ubW9ja1NoYXJlVG9TZW5kLFxuICAgICAgICAgICAgICBjb25maWdbaW5kZXhdLnNpZ25lclNoYXJlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzcG9uc2VBU2hhcmUuc2hvdWxkLmRlZXBFcXVhbChjb25maWdbaW5kZXhdLm1vY2tTaGFyZUFzUmVzcG9uc2UpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoYHNob3VsZCBmYWlsIGlmIHdlIGdldCBhbiBpbnZhbGlkICR7Y29uZmlnW2luZGV4XS5zaGFyZVJlY2VpdmVkfSBhcyByZXNwb25zZWAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vY2tTZW5kUmVxID0ge1xuICAgICAgICAgICAgICBmcm9tOiAndXNlcicsXG4gICAgICAgICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICAgICAgICBzaGFyZTogY29uZmlnW2luZGV4XS5tb2NrU2hhcmVUb1NlbmRTdHJpbmcsXG4gICAgICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgICAgICAgICAgY29uc3QgaW52YWxpZFNpZ25hdHVyZVNoYXJlID0ge1xuICAgICAgICAgICAgICBmcm9tOiAnYml0Z28nLFxuICAgICAgICAgICAgICB0bzogJ3VzZXInLFxuICAgICAgICAgICAgICBzaGFyZTogSlNPTi5zdHJpbmdpZnkoY29uZmlnW2luZGV4XS5pbmNvcnJlY3RSZWNlaXZlZFNoYXJlU3RyaW5nKSxcbiAgICAgICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgICAgICBjb25zdCBub2NrID0gYXdhaXQgbm9ja1NlbmRTaWduYXR1cmVTaGFyZShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdhbGxldElkOiB3YWxsZXQuaWQoKSxcbiAgICAgICAgICAgICAgICB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlOiBtb2NrU2VuZFJlcSxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogaW52YWxpZFNpZ25hdHVyZVNoYXJlLFxuICAgICAgICAgICAgICAgIHRzc1R5cGU6ICdlY2RzYScsXG4gICAgICAgICAgICAgICAgc2lnbmVyU2hhcmU6IGNvbmZpZ1tpbmRleF0uc2lnbmVyU2hhcmUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIDIwMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHR4UmVxdWVzdC5zaWduYXR1cmVTaGFyZXMgPSBbaW52YWxpZFNpZ25hdHVyZVNoYXJlXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geyB0eFJlcXVlc3RzOiBbeyB0cmFuc2FjdGlvbnM6IFt7IC4uLnR4UmVxdWVzdCB9XSB9XSB9O1xuICAgICAgICAgICAgYXdhaXQgbm9ja0dldFR4UmVxdWVzdCh7IHdhbGxldElkOiB3YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQ6IHR4UmVxdWVzdC50eFJlcXVlc3RJZCwgcmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICAgICAgICAgICAgYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICAgICAgICAgIGJpdGdvLFxuICAgICAgICAgICAgICB3YWxsZXQuaWQoKSxcbiAgICAgICAgICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgICAgICAgICBSZXF1ZXN0VHlwZS50eCxcbiAgICAgICAgICAgICAgY29uZmlnW2luZGV4XS5zZW5kVHlwZSxcbiAgICAgICAgICAgICAgY29uZmlnW2luZGV4XS5tb2NrU2hhcmVUb1NlbmQsXG4gICAgICAgICAgICAgIGNvbmZpZ1tpbmRleF0uc2lnbmVyU2hhcmVcbiAgICAgICAgICAgICkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCAuKiBzaGFyZS9nKTsgLy8gYEludmFsaWQgJHtzaGFyZU5hbWV9IHNoYXJlYFxuICAgICAgICAgICAgbm9jay5pc0RvbmUoKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldFR4UmVxdWVzdDonLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIGdldCB0eFJlcXVlc3QgYnkgaWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0geyB0eFJlcXVlc3RzOiBbdHhSZXF1ZXN0XSB9O1xuICAgICAgICBjb25zdCBub2NrID0gYXdhaXQgbm9ja0dldFR4UmVxdWVzdCh7IHdhbGxldElkOiB3YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQ6IHR4UmVxdWVzdC50eFJlcXVlc3RJZCwgcmVzcG9uc2UgfSk7XG4gICAgICAgIGNvbnN0IHR4UmVxID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KGJpdGdvLCB3YWxsZXQuaWQoKSwgdHhSZXF1ZXN0LnR4UmVxdWVzdElkKTtcbiAgICAgICAgdHhSZXEuc2hvdWxkLmRlZXBFcXVhbCh0eFJlcXVlc3QpO1xuICAgICAgICBub2NrLmlzRG9uZSgpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlcmUgYXJlIG5vIHR4UmVxdWVzdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0geyB0eFJlcXVlc3RzOiBbXSB9O1xuICAgICAgICBjb25zdCBub2NrID0gYXdhaXQgbm9ja0dldFR4UmVxdWVzdCh7IHdhbGxldElkOiB3YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQ6IHR4UmVxdWVzdC50eFJlcXVlc3RJZCwgcmVzcG9uc2UgfSk7XG4gICAgICAgIGF3YWl0IGdldFR4UmVxdWVzdChiaXRnbywgd2FsbGV0LmlkKCksIHR4UmVxdWVzdC50eFJlcXVlc3RJZCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnVW5hYmxlIHRvIGZpbmQgVHhSZXF1ZXN0IHdpdGggaWQgcmFuZG9tSWQnXG4gICAgICAgICk7XG4gICAgICAgIG5vY2suaXNEb25lKCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2lnbmluZyBzaGFyZSBwYXJzZXJzIGFuZCBjb252ZXJ0ZXJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHBhcnNlIEsgc2hhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJpdGdvS1NoYXJlID0gbW9ja1NpZ25XaXRoUGFpbGxpZXJDaGFsbGVuZ2VSVC5rU2hhcmU7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICAgICAgc2hhcmU6IEVDRFNBTWV0aG9kcy5jb252ZXJ0S1NoYXJlKG1vY2tTaWduV2l0aFBhaWxsaWVyQ2hhbGxlbmdlUlQua1NoYXJlKS5zaGFyZSxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3Qga1NoYXJlID0gRUNEU0FNZXRob2RzLnBhcnNlS1NoYXJlKHNoYXJlKTtcbiAgICAgICAga1NoYXJlLnNob3VsZC5kZWVwRXF1YWwoYml0Z29LU2hhcmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IGNvbnZlcnQgSyBzaGFyZSB0byBzaWduYXR1cmUgc2hhcmUgcmVjb3JkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBiaXRnb0tTaGFyZSA9IG1vY2tTaWduV2l0aFBhaWxsaWVyQ2hhbGxlbmdlUlQua1NoYXJlO1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIHNoYXJlOiBgJHttb2NrU2lnblJULmtTaGFyZS5rfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaWduUlQua1NoYXJlLm59JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrU2lnblJULmtTaGFyZS5udGlsZGVcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NpZ25SVC5rU2hhcmUuaDF9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NpZ25SVC5rU2hhcmUuaDJ9JHtcbiAgICAgICAgICAgIEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXJcbiAgICAgICAgICB9JHttb2NrU2lnblJULmtTaGFyZS5wcm9vZj8ueiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2lnblJULmtTaGFyZS5wcm9vZj8udSB8fCAnJ30ke1xuICAgICAgICAgICAgRUNEU0FNZXRob2RzLmRlbGltZXRlclxuICAgICAgICAgIH0ke21vY2tTaWduUlQua1NoYXJlLnByb29mPy53IHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaWduUlQua1NoYXJlLnByb29mPy5zIHx8ICcnfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7bW9ja1NpZ25SVC5rU2hhcmUucHJvb2Y/LnMxIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaWduUlQua1NoYXJlLnByb29mPy5zMiB8fCAnJ30ke1xuICAgICAgICAgICAgRUNEU0FNZXRob2RzLmRlbGltZXRlclxuICAgICAgICAgIH0ke2JpdGdvS1NoYXJlLnAuam9pbihFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyKX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtiaXRnb0tTaGFyZS5zaWdtYS5qb2luKFxuICAgICAgICAgICAgRUNEU0FNZXRob2RzLmRlbGltZXRlclxuICAgICAgICAgICl9YCxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcblxuICAgICAgICBjb25zdCBrc2hhcmUgPSBFQ0RTQU1ldGhvZHMuY29udmVydEtTaGFyZShiaXRnb0tTaGFyZSk7XG4gICAgICAgIGtzaGFyZS5mcm9tLnNob3VsZC5lcXVhbChzaGFyZS5mcm9tKTtcbiAgICAgICAga3NoYXJlLnRvLnNob3VsZC5lcXVhbChzaGFyZS50byk7XG4gICAgICAgIGtzaGFyZS5zaGFyZS5zaG91bGQuZXF1YWwoc2hhcmUuc2hhcmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHBhcnNlIEEgc2hhcmUgd2l0aG91dCBwYWlsbGllciBjaGFsbGVuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUixcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgc2hhcmU6IEVDRFNBTWV0aG9kcy5jb252ZXJ0QVNoYXJlKG1vY2tBU2hhcmUpLnNoYXJlLFxuICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgICAgICBjb25zdCBhU2hhcmUgPSBFQ0RTQU1ldGhvZHMucGFyc2VBU2hhcmUoc2hhcmUpO1xuICAgICAgICBzaG91bGQuZXhpc3QoYVNoYXJlKTtcbiAgICAgICAgYVNoYXJlLnNob3VsZC5kZWVwRXF1YWwobW9ja0FTaGFyZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgQSBzaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBzaGFyZTogRUNEU0FNZXRob2RzLmNvbnZlcnRBU2hhcmUobW9ja0FTaGFyZSkuc2hhcmUsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IGFTaGFyZSA9IEVDRFNBTWV0aG9kcy5wYXJzZUFTaGFyZShzaGFyZSk7XG4gICAgICAgIHNob3VsZC5leGlzdChhU2hhcmUpO1xuICAgICAgICBhU2hhcmUuc2hvdWxkLmRlZXBFcXVhbChtb2NrQVNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb252ZXJ0IEEgc2hhcmUgdG8gc2lnbmF0dXJlIHNoYXJlIHJlY29yZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgbW9ja1NoYXJlID0gbW9ja0FTaGFyZTtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBzaGFyZTogYCR7bW9ja1NoYXJlLmt9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLmFscGhhfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5tdX0ke1xuICAgICAgICAgICAgRUNEU0FNZXRob2RzLmRlbGltZXRlclxuICAgICAgICAgIH0ke21vY2tTaGFyZS5ufSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5udGlsZGV9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLmgxfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7bW9ja1NoYXJlLmgyfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5wcm9vZj8ueiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tTaGFyZS5wcm9vZj8udSB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUucHJvb2Y/LncgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLnByb29mPy5zIHx8ICcnfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7bW9ja1NoYXJlLnByb29mPy5zMSB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUucHJvb2Y/LnMyIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja1NoYXJlLmdhbW1hUHJvb2Y/LnogfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLmdhbW1hUHJvb2Y/Lnpwcm0gfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrU2hhcmUuZ2FtbWFQcm9vZj8udCB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUuZ2FtbWFQcm9vZj8udiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tTaGFyZS5nYW1tYVByb29mPy53IHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5nYW1tYVByb29mPy5zIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja1NoYXJlLmdhbW1hUHJvb2Y/LnMxIHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5nYW1tYVByb29mPy5zMiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tTaGFyZS5nYW1tYVByb29mPy50MSB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUuZ2FtbWFQcm9vZj8udDIgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrU2hhcmUuZ2FtbWFQcm9vZj8udSB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUuZ2FtbWFQcm9vZj8ueCB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tTaGFyZS53UHJvb2Y/LnogfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLndQcm9vZj8uenBybSB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tTaGFyZS53UHJvb2Y/LnQgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLndQcm9vZj8udiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUud1Byb29mPy53IHx8ICcnfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7bW9ja1NoYXJlLndQcm9vZj8ucyB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUud1Byb29mPy5zMSB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tTaGFyZS53UHJvb2Y/LnMyIHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS53UHJvb2Y/LnQxIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja1NoYXJlLndQcm9vZj8udDIgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLndQcm9vZj8udSB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUud1Byb29mPy54IHx8ICcnfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7bW9ja1NoYXJlLnNpZ21hIS5qb2luKEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXIpfWAsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG5cbiAgICAgICAgY29uc3QgYVNoYXJlID0gRUNEU0FNZXRob2RzLmNvbnZlcnRBU2hhcmUobW9ja1NoYXJlKTtcbiAgICAgICAgYVNoYXJlLmZyb20uc2hvdWxkLmVxdWFsKHNoYXJlLmZyb20pO1xuICAgICAgICBhU2hhcmUudG8uc2hvdWxkLmVxdWFsKHNoYXJlLnRvKTtcbiAgICAgICAgYVNoYXJlLnNoYXJlLnNob3VsZC5lcXVhbChzaGFyZS5zaGFyZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgTXUgc2hhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICAgICAgc2hhcmU6IEVDRFNBTWV0aG9kcy5jb252ZXJ0TXVTaGFyZShtb2NrTXVTaGFyZSkuc2hhcmUsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IG11U2hhcmUgPSBFQ0RTQU1ldGhvZHMucGFyc2VNdVNoYXJlKHNoYXJlKTtcbiAgICAgICAgbXVTaGFyZS5pLnNob3VsZC5lcXVhbChtb2NrTXVTaGFyZS5pKTtcbiAgICAgICAgbXVTaGFyZS5qLnNob3VsZC5lcXVhbChtb2NrTXVTaGFyZS5qKTtcbiAgICAgICAgbXVTaGFyZS5hbHBoYS5zaG91bGQuZXF1YWwobW9ja011U2hhcmUuYWxwaGEpO1xuICAgICAgICBtdVNoYXJlLm11LnNob3VsZC5lcXVhbChtb2NrTXVTaGFyZS5tdSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgY29udmVydCBNdSBzaGFyZSB0byBzaWduYXR1cmUgc2hhcmUgcmVjb3JkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIHNoYXJlOiBgJHttb2NrTXVTaGFyZS5hbHBoYX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrTXVTaGFyZS5tdX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLmdhbW1hUHJvb2Y/LnogfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUuZ2FtbWFQcm9vZj8uenBybSB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLmdhbW1hUHJvb2Y/LnQgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUuZ2FtbWFQcm9vZj8udiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLmdhbW1hUHJvb2Y/LncgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUuZ2FtbWFQcm9vZj8ucyB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLmdhbW1hUHJvb2Y/LnMxIHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tNdVNoYXJlLmdhbW1hUHJvb2Y/LnMyIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja011U2hhcmUuZ2FtbWFQcm9vZj8udDEgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUuZ2FtbWFQcm9vZj8udDIgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrTXVTaGFyZS5nYW1tYVByb29mPy51IHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tNdVNoYXJlLmdhbW1hUHJvb2Y/LnggfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrTXVTaGFyZS53UHJvb2Y/LnogfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUud1Byb29mPy56cHJtIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja011U2hhcmUud1Byb29mPy50IHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tNdVNoYXJlLndQcm9vZj8udiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLndQcm9vZj8udyB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrTXVTaGFyZS53UHJvb2Y/LnMgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrTXVTaGFyZS53UHJvb2Y/LnMxIHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tNdVNoYXJlLndQcm9vZj8uczIgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrTXVTaGFyZS53UHJvb2Y/LnQxIHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tNdVNoYXJlLndQcm9vZj8udDIgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrTXVTaGFyZS53UHJvb2Y/LnUgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUud1Byb29mPy54IHx8ICcnfWAsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IG11U2hhcmUgPSBFQ0RTQU1ldGhvZHMuY29udmVydE11U2hhcmUobW9ja011U2hhcmUpO1xuICAgICAgICBtdVNoYXJlLmZyb20uc2hvdWxkLmVxdWFsKHNoYXJlLmZyb20pO1xuICAgICAgICBtdVNoYXJlLnRvLnNob3VsZC5lcXVhbChzaGFyZS50byk7XG4gICAgICAgIG11U2hhcmUuc2hhcmUuc2hvdWxkLmVxdWFsKHNoYXJlLnNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwYXJzZSBEIHNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIHNoYXJlOiBFQ0RTQU1ldGhvZHMuY29udmVydERTaGFyZShtb2NrRFNoYXJlVG9CaXRnbykuc2hhcmUsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IGRTaGFyZSA9IEVDRFNBTWV0aG9kcy5wYXJzZURTaGFyZShzaGFyZSk7XG4gICAgICAgIGRTaGFyZS5pLnNob3VsZC5lcXVhbChtb2NrRFNoYXJlVG9CaXRnby5pKTtcbiAgICAgICAgZFNoYXJlLmouc2hvdWxkLmVxdWFsKG1vY2tEU2hhcmVUb0JpdGdvLmopO1xuICAgICAgICBkU2hhcmUuZGVsdGEuc2hvdWxkLmVxdWFsKG1vY2tEU2hhcmVUb0JpdGdvLmRlbHRhKTtcbiAgICAgICAgZFNoYXJlLkdhbW1hLnNob3VsZC5lcXVhbChtb2NrRFNoYXJlVG9CaXRnby5HYW1tYSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgY29udmVydCBEIHNoYXJlIHRvIHNpZ25hdHVyZSBzaGFyZSByZWNvcmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICAgICAgc2hhcmU6IGAke21vY2tEU2hhcmVUb0JpdGdvLmRlbHRhfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tEU2hhcmVUb0JpdGdvLkdhbW1hfWAsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IGRTaGFyZSA9IEVDRFNBTWV0aG9kcy5jb252ZXJ0RFNoYXJlKG1vY2tEU2hhcmVUb0JpdGdvKTtcbiAgICAgICAgZFNoYXJlLmZyb20uc2hvdWxkLmVxdWFsKHNoYXJlLmZyb20pO1xuICAgICAgICBkU2hhcmUudG8uc2hvdWxkLmVxdWFsKHNoYXJlLnRvKTtcbiAgICAgICAgZFNoYXJlLnNoYXJlLnNob3VsZC5lcXVhbChzaGFyZS5zaGFyZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgUyBhbmQgRCBzaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUixcbiAgICAgICAgICBzaGFyZTogYCR7bW9ja1NTaGFyZUZyb21Vc2VyLlJ9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NTaGFyZUZyb21Vc2VyLnN9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NTaGFyZUZyb21Vc2VyLnl9JHtFQ0RTQU1ldGhvZHMuc2Vjb25kYXJ5RGVsaW1ldGVyfSR7bW9ja0RTaGFyZVRvQml0Z28uZGVsdGF9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja0RTaGFyZVRvQml0Z28uR2FtbWF9YCxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3QgeyBzU2hhcmUsIGRTaGFyZSB9ID0gRUNEU0FNZXRob2RzLnBhcnNlU0RTaGFyZShzaGFyZSk7XG4gICAgICAgIHNTaGFyZS5pLnNob3VsZC5lcXVhbCgzKTtcbiAgICAgICAgc1NoYXJlLlIuc2hvdWxkLmVxdWFsKG1vY2tTU2hhcmVGcm9tVXNlci5SKTtcbiAgICAgICAgc1NoYXJlLnMuc2hvdWxkLmVxdWFsKG1vY2tTU2hhcmVGcm9tVXNlci5zKTtcbiAgICAgICAgc1NoYXJlLnkuc2hvdWxkLmVxdWFsKG1vY2tTU2hhcmVGcm9tVXNlci55KTtcbiAgICAgICAgZFNoYXJlLmkuc2hvdWxkLmVxdWFsKG1vY2tEU2hhcmVUb0JpdGdvLmkpO1xuICAgICAgICBkU2hhcmUuai5zaG91bGQuZXF1YWwobW9ja0RTaGFyZVRvQml0Z28uaik7XG4gICAgICAgIGRTaGFyZS5kZWx0YS5zaG91bGQuZXF1YWwobW9ja0RTaGFyZVRvQml0Z28uZGVsdGEpO1xuICAgICAgICBkU2hhcmUuR2FtbWEuc2hvdWxkLmVxdWFsKG1vY2tEU2hhcmVUb0JpdGdvLkdhbW1hKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb252ZXJ0IFMgYW5kIEQgc2hhcmUgdG8gc2lnbmF0dXJlIHNoYXJlIHJlY29yZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUixcbiAgICAgICAgICBzaGFyZTogYCR7bW9ja1NTaGFyZUZyb21Vc2VyLlJ9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NTaGFyZUZyb21Vc2VyLnN9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NTaGFyZUZyb21Vc2VyLnl9JHtFQ0RTQU1ldGhvZHMuc2Vjb25kYXJ5RGVsaW1ldGVyfSR7bW9ja0RTaGFyZVRvQml0Z28uZGVsdGF9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja0RTaGFyZVRvQml0Z28uR2FtbWF9YCxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3Qgc2RTaGFyZSA9IEVDRFNBTWV0aG9kcy5jb252ZXJ0U0RTaGFyZSh7IHNTaGFyZTogbW9ja1NTaGFyZUZyb21Vc2VyLCBkU2hhcmU6IG1vY2tEU2hhcmVUb0JpdGdvIH0pO1xuICAgICAgICBzZFNoYXJlLmZyb20uc2hvdWxkLmVxdWFsKHNoYXJlLmZyb20pO1xuICAgICAgICBzZFNoYXJlLnRvLnNob3VsZC5lcXVhbChzaGFyZS50byk7XG4gICAgICAgIHNkU2hhcmUuc2hhcmUuc2hvdWxkLmVxdWFsKHNoYXJlLnNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwYXJzZSBzaWduYXR1cmUgc2hhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUixcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgc2hhcmU6IGAke21vY2tTU2hhcmVGcm9tVXNlci5SfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTU2hhcmVGcm9tVXNlci5zfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTU2hhcmVGcm9tVXNlci55fWAsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IEVDRFNBTWV0aG9kcy5wYXJzZVNpZ25hdHVyZVNoYXJlKHNoYXJlKTtcbiAgICAgICAgc2lnbmF0dXJlLmkuc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICBzaWduYXR1cmUuUi5zaG91bGQuZXF1YWwobW9ja1NTaGFyZUZyb21Vc2VyLlIpO1xuICAgICAgICBzaWduYXR1cmUucy5zaG91bGQuZXF1YWwobW9ja1NTaGFyZUZyb21Vc2VyLnMpO1xuICAgICAgICBzaWduYXR1cmUueS5zaG91bGQuZXF1YWwobW9ja1NTaGFyZUZyb21Vc2VyLnkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY3Vlc2Z1bGx5IHBhcnNlIGNvbWJpbmVkIHNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgbW9ja0NvbWJpbmVkU2lnbmF0dXJlID0gbXBjLmNvbnN0cnVjdFNpZ25hdHVyZShbbW9ja1NTaGFyZUZyb21Vc2VyLCBtb2NrU1NoYXJlXSk7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUixcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgc2hhcmU6IGAke21vY2tDb21iaW5lZFNpZ25hdHVyZS5yZWNpZH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrQ29tYmluZWRTaWduYXR1cmUucn0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrQ29tYmluZWRTaWduYXR1cmUuc30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrQ29tYmluZWRTaWduYXR1cmUueX1gLFxuICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBFQ0RTQU1ldGhvZHMucGFyc2VDb21iaW5lZFNpZ25hdHVyZShzaGFyZSk7XG4gICAgICAgIHNpZ25hdHVyZS5yZWNpZC5zaG91bGQuZXF1YWwobW9ja0NvbWJpbmVkU2lnbmF0dXJlLnJlY2lkKTtcbiAgICAgICAgc2lnbmF0dXJlLnIuc2hvdWxkLmVxdWFsKG1vY2tDb21iaW5lZFNpZ25hdHVyZS5yKTtcbiAgICAgICAgc2lnbmF0dXJlLnMuc2hvdWxkLmVxdWFsKG1vY2tDb21iaW5lZFNpZ25hdHVyZS5zKTtcbiAgICAgICAgc2lnbmF0dXJlLnkuc2hvdWxkLmVxdWFsKG1vY2tDb21iaW5lZFNpZ25hdHVyZS55KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb252ZXJ0IHNpZ25hdHVyZSBzaGFyZSB0byBzaWduYXR1cmUgc2hhcmUgcmVjb3JkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIHNoYXJlOiBgJHttb2NrU1NoYXJlRnJvbVVzZXIuUn0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU1NoYXJlRnJvbVVzZXIuc30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU1NoYXJlRnJvbVVzZXIueX1gLFxuICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgICAgICBjb25zdCBzaWduYXR1cmVTaGFyZSA9IEVDRFNBTWV0aG9kcy5jb252ZXJ0U2lnbmF0dXJlU2hhcmUoXG4gICAgICAgICAgbW9ja1NTaGFyZUZyb21Vc2VyLFxuICAgICAgICAgIEVDRFNBTWV0aG9kcy5nZXRQYXJ0aWNpcGFudEluZGV4KCd1c2VyJyksXG4gICAgICAgICAgRUNEU0FNZXRob2RzLmdldFBhcnRpY2lwYW50SW5kZXgoJ2JpdGdvJylcbiAgICAgICAgKTtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmUuZnJvbS5zaG91bGQuZXF1YWwoc2hhcmUuZnJvbSk7XG4gICAgICAgIHNpZ25hdHVyZVNoYXJlLnRvLnNob3VsZC5lcXVhbChzaGFyZS50byk7XG4gICAgICAgIHNpZ25hdHVyZVNoYXJlLnNoYXJlLnNob3VsZC5lcXVhbChzaGFyZS5zaGFyZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgY29udmVydCBCIHNoYXJlIHRvIHNpZ25hdHVyZSBzaGFyZSByZWNvcmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJTaGFyZSA9IG1vY2tlZEJpdGdvQlNoYXJlLmJTaGFyZTtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgc2hhcmU6IGAke2JTaGFyZS5iZXRhfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke2JTaGFyZS5nYW1tYX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtiU2hhcmUua30ke1xuICAgICAgICAgICAgRUNEU0FNZXRob2RzLmRlbGltZXRlclxuICAgICAgICAgIH0ke2JTaGFyZS5udX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtiU2hhcmUud30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtiU2hhcmUueX0ke1xuICAgICAgICAgICAgRUNEU0FNZXRob2RzLmRlbGltZXRlclxuICAgICAgICAgIH0ke2JTaGFyZS5sfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke2JTaGFyZS5tfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke2JTaGFyZS5ufSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7YlNoYXJlLm50aWxkZX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtiU2hhcmUuaDF9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7YlNoYXJlLmgyfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7YlNoYXJlLmNrfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke2JTaGFyZS5wIS5qb2luKEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXIpfWAsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlID0gRUNEU0FNZXRob2RzLmNvbnZlcnRCU2hhcmUoYlNoYXJlKTtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmUuZnJvbS5zaG91bGQuZXF1YWwoc2hhcmUuZnJvbSk7XG4gICAgICAgIHNpZ25hdHVyZVNoYXJlLnRvLnNob3VsZC5lcXVhbChzaGFyZS50byk7XG4gICAgICAgIHNpZ25hdHVyZVNoYXJlLnNoYXJlLnNob3VsZC5lcXVhbChzaGFyZS5zaGFyZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgQiBzaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYlNoYXJlID0gbW9ja2VkQml0Z29CU2hhcmUuYlNoYXJlO1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBzaGFyZTogRUNEU0FNZXRob2RzLmNvbnZlcnRCU2hhcmUobW9ja2VkQml0Z29CU2hhcmUuYlNoYXJlKS5zaGFyZSxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3QgcGFyc2VkQlNoYXJlID0gRUNEU0FNZXRob2RzLnBhcnNlQlNoYXJlKHNoYXJlKTtcbiAgICAgICAgcGFyc2VkQlNoYXJlLnNob3VsZC5kZWVwRXF1YWwoYlNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb252ZXJ0IE8gc2hhcmUgdG8gc2lnbmF0dXJlIHNoYXJlIHJlY29yZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb1NoYXJlID0gbW9ja2VkQml0Z29PQW5kRFNoYXJlLm9TaGFyZTtcbiAgICAgICAgY29uc3QgZGVsaW1ldGVyID0gRUNEU0FNZXRob2RzLmRlbGltZXRlcjtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgc2hhcmU6IGAke29TaGFyZS5HYW1tYX0ke2RlbGltZXRlcn0ke29TaGFyZS5kZWx0YX0ke2RlbGltZXRlcn0ke29TaGFyZS5rfSR7ZGVsaW1ldGVyfSR7b1NoYXJlLm9taWNyb259JHtkZWxpbWV0ZXJ9JHtvU2hhcmUueX1gLFxuICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgICAgICBjb25zdCBvU2hhcmVTaWdSZWNvcmQgPSBFQ0RTQU1ldGhvZHMuY29udmVydE9TaGFyZShvU2hhcmUpO1xuICAgICAgICBvU2hhcmVTaWdSZWNvcmQuZnJvbS5zaG91bGQuZXF1YWwoc2hhcmUuZnJvbSk7XG4gICAgICAgIG9TaGFyZVNpZ1JlY29yZC50by5zaG91bGQuZXF1YWwoc2hhcmUudG8pO1xuICAgICAgICBvU2hhcmVTaWdSZWNvcmQuc2hhcmUuc2hvdWxkLmVxdWFsKHNoYXJlLnNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwYXJzZSBPIHNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvU2hhcmUgPSBtb2NrZWRCaXRnb09BbmREU2hhcmUub1NoYXJlO1xuICAgICAgICBjb25zdCBkZWxpbWV0ZXIgPSBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyO1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBzaGFyZTogYCR7b1NoYXJlLkdhbW1hfSR7ZGVsaW1ldGVyfSR7b1NoYXJlLmRlbHRhfSR7ZGVsaW1ldGVyfSR7b1NoYXJlLmt9JHtkZWxpbWV0ZXJ9JHtvU2hhcmUub21pY3Jvbn0ke2RlbGltZXRlcn0ke29TaGFyZS55fWAsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IHBhcnNlZE9TaGFyZSA9IEVDRFNBTWV0aG9kcy5wYXJzZU9TaGFyZShzaGFyZSk7XG4gICAgICAgIHBhcnNlZE9TaGFyZS5pLnNob3VsZC5lcXVhbChvU2hhcmUuaSk7XG4gICAgICAgIHBhcnNlZE9TaGFyZS55LnNob3VsZC5lcXVhbChvU2hhcmUueSk7XG4gICAgICAgIHBhcnNlZE9TaGFyZS5rLnNob3VsZC5lcXVhbChvU2hhcmUuayk7XG4gICAgICAgIHBhcnNlZE9TaGFyZS5vbWljcm9uLnNob3VsZC5lcXVhbChvU2hhcmUub21pY3Jvbik7XG4gICAgICAgIHBhcnNlZE9TaGFyZS5kZWx0YS5zaG91bGQuZXF1YWwob1NoYXJlLmRlbHRhKTtcbiAgICAgICAgcGFyc2VkT1NoYXJlLkdhbW1hLnNob3VsZC5lcXVhbChvU2hhcmUuR2FtbWEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=