PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-sui/dist/test/unit/transactionBuilder
Просмотр файла: transactionBuilder.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const getBuilderFactory_1 = require("../getBuilderFactory");
const testData = __importStar(require("../../resources/sui"));
const should_1 = __importDefault(require("should"));
const sdk_core_1 = require("@bitgo/sdk-core");
const iface_1 = require("../../../src/lib/iface");
const sui_1 = require("../../resources/sui");
const keyPair_1 = require("../../../src/lib/keyPair");
const constants_1 = require("../../../src/lib/constants");
describe('Sui Transaction Builder', async () => {
let builders;
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsui');
describe('Transfer TX', async () => {
beforeEach(function (done) {
builders = [factory.getTransferBuilder()];
done();
});
it('should build a transfer transaction and serialize it and deserialize it', async function () {
const txBuilder = factory.getTransferBuilder();
txBuilder.type(iface_1.SuiTransactionType.Transfer);
txBuilder.sender(testData.sender.address);
txBuilder.send(sui_1.recipients);
txBuilder.gasData(testData.gasData);
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.TRANSFER);
const reserialized = await factory.from(rawTx).build();
reserialized.should.be.deepEqual(tx);
reserialized.toBroadcastFormat().should.equal(rawTx);
});
it('should build and sign a transfer tx with gasPayment', async function () {
const txBuilder = factory.getTransferBuilder();
txBuilder.type(iface_1.SuiTransactionType.Transfer);
txBuilder.sender(testData.sender.address);
txBuilder.send(sui_1.recipients);
txBuilder.gasData(testData.gasData);
const tx = await txBuilder.build();
should_1.default.equal(tx.id, 'UNAVAILABLE');
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.TRANSFER);
const txBuilder2 = await factory.from(rawTx);
await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
const signedTx = await txBuilder2.build();
should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.Send);
should_1.default.equal(signedTx.id, 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR');
const rawSignedTx = signedTx.toBroadcastFormat();
should_1.default.equal(rawSignedTx, testData.TRANSFER);
const reserializedTxBuilder = factory.from(rawSignedTx);
reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
const reserialized = await reserializedTxBuilder.build();
reserialized.should.be.deepEqual(signedTx);
reserialized.toBroadcastFormat().should.equal(rawSignedTx);
});
it('should submit a transfer transaction with private keys', async () => {
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
const keyPairRecipient = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey2 });
const senderAddress = keyPairSender.getAddress();
const receiveAddress = keyPairRecipient.getAddress();
const expectedTransferTxSig = 'AI8Q9KINqSCOeHvhv6MJ6Vf3TWbTcxhpclg0PD9gBgand2kLQZxEJS/HJASganLKfZ277Il4mAifKHzvtb2fCA+lzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
const expectedTransferTxHex = 'AAACAAgA4fUFAAAAAAAgtev+nncDfTtowJZEPHUMsJXia4wKmT/Xpgtrzsy6O38CAgABAQAAAQECAAABAQCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
const coins = [
{
digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
version: 1126,
},
{
digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
version: 1126,
},
];
const txBuilder_1 = factory.getTransferBuilder();
txBuilder_1.type(iface_1.SuiTransactionType.Transfer);
txBuilder_1.sender(senderAddress);
txBuilder_1.send([{ address: receiveAddress, amount: '100000000' }]);
const gasData = {
payment: coins,
owner: senderAddress,
budget: testData.GAS_BUDGET,
price: 1000,
};
txBuilder_1.gasData(gasData);
const tx_1 = await txBuilder_1.build();
const signable_1 = tx_1.signablePayload;
const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
const signedTx_1 = (await txBuilder_1.build());
const txHex_1 = signedTx_1.toBroadcastFormat();
const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
const txBuilderFromRaw_2 = factory.getTransferBuilder();
txBuilderFromRaw_2.from(txHex_1);
const signable_2 = tx_1.signablePayload;
txBuilderFromRaw_2.sign({ key: testData.privateKeys.prvKey1 });
const signedTx_2 = (await txBuilderFromRaw_2.build());
const txHex_2 = signedTx_2.toBroadcastFormat();
const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
should_1.default.equal(txHex_1, txHex_2);
should_1.default.equal(txHex_1, expectedTransferTxHex);
should_1.default.equal(txHex_2, expectedTransferTxHex);
should_1.default.equal(sig_1, sig_2);
should_1.default.equal(sig_1, expectedTransferTxSig);
should_1.default.equal(sig_2, expectedTransferTxSig);
});
it('should submit a slit coin transaction with private keys', async () => {
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
const senderAddress = keyPairSender.getAddress();
const expectedTransferTxSig = 'AGGWHZuyUjsxMhMoPoqdsZRTC50a8mByDhupwE0WrDlvvqzwaRO7R5sY20/IYgabUA9fep3o35ssnRhUZ0jDqwmlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
const expectedTransferTxHex = 'AAAVAAgA4fUFAAAAAAAgkAdCu5I+qQalbzJaF1l3UuzTrDAmu6luDt/0XejbM6sACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAAAgA4fUFAAAAAAAIAOH1BQAAAAAACADh9QUAAAAAKAIAAQEAAAEBAgAAAQEAAgABAQIAAQECAgABAQACAAEBAwABAQIEAAEBAAIAAQEEAAEBAgYAAQEAAgABAQUAAQECCAABAQACAAEBBgABAQIKAAEBAAIAAQEHAAEBAgwAAQEAAgABAQgAAQECDgABAQACAAEBCQABAQIQAAEBAAIAAQEKAAEBAhIAAQEAAgABAQsAAQECFAABAQACAAEBDAABAQIWAAEBAAIAAQENAAEBAhgAAQEAAgABAQ4AAQECGgABAQACAAEBDwABAQIcAAEBAAIAAQEQAAEBAh4AAQEAAgABAREAAQECIAABAQACAAEBEgABAQIiAAEBAAIAAQETAAEBAiQAAQEAAgABARQAAQECJgABAQCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
const coins = [
{
digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
version: 1126,
},
{
digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
version: 1126,
},
];
const txBuilder_1 = factory.getTransferBuilder();
txBuilder_1.type(iface_1.SuiTransactionType.Transfer);
txBuilder_1.sender(senderAddress);
txBuilder_1.send(Array(20).fill({ address: senderAddress, amount: '100000000' }));
const gasData = {
payment: coins,
owner: senderAddress,
budget: testData.GAS_BUDGET,
price: 1000,
};
txBuilder_1.gasData(gasData);
const tx_1 = await txBuilder_1.build();
const signable_1 = tx_1.signablePayload;
const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
const signedTx_1 = (await txBuilder_1.build());
const txHex_1 = signedTx_1.toBroadcastFormat();
const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
const txBuilderFromRaw_2 = factory.getTransferBuilder();
txBuilderFromRaw_2.from(txHex_1);
const signable_2 = tx_1.signablePayload;
const signature_2 = keyPairSender.signMessageinUint8Array(signable_2);
txBuilderFromRaw_2.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_2));
const signedTx_2 = (await txBuilderFromRaw_2.build());
const txHex_2 = signedTx_2.toBroadcastFormat();
const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
should_1.default.equal(txHex_1, txHex_2);
should_1.default.equal(txHex_1, expectedTransferTxHex);
should_1.default.equal(txHex_2, expectedTransferTxHex);
should_1.default.equal(sig_1, sig_2);
should_1.default.equal(sig_1, expectedTransferTxSig);
should_1.default.equal(sig_2, expectedTransferTxSig);
});
it('should fail to build if missing type', async function () {
for (const txBuilder of builders) {
txBuilder.sender(testData.sender.address);
txBuilder.send(sui_1.recipients);
txBuilder.gasData(testData.gasData);
await txBuilder.build().should.rejectedWith('type is required before building');
}
});
it('should fail to build if missing sender', async function () {
for (const txBuilder of builders) {
txBuilder.type(iface_1.SuiTransactionType.Transfer);
txBuilder.send(sui_1.recipients);
txBuilder.gasData(testData.gasData);
await txBuilder.build().should.rejectedWith('sender is required before building');
}
});
it('should fail to build if missing recipients', async function () {
for (const txBuilder of builders) {
txBuilder.type(iface_1.SuiTransactionType.Transfer);
txBuilder.sender(testData.sender.address);
txBuilder.gasData(testData.gasData);
await txBuilder.build().should.rejectedWith('at least one recipient is required before building');
}
});
it('should fail to build if missing gasData', async function () {
for (const txBuilder of builders) {
txBuilder.type(iface_1.SuiTransactionType.Transfer);
txBuilder.sender(testData.sender.address);
txBuilder.send(sui_1.recipients);
await txBuilder.build().should.rejectedWith('gasData is required before building');
}
});
it('should fail to build if missing payment coins in gasData', async function () {
for (const txBuilder of builders) {
txBuilder.type(iface_1.SuiTransactionType.Transfer);
txBuilder.sender(testData.sender.address);
txBuilder.send(sui_1.recipients);
(0, should_1.default)(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(`gas payment is required before building`);
await txBuilder.build().should.rejectedWith('gasData is required before building');
}
});
it('should build a send from rawTx', async function () {
const txBuilder = factory.from(testData.TRANSFER);
const builtTx = await txBuilder.build();
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.Send);
should_1.default.equal(builtTx.id, 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR');
builtTx.inputs.length.should.equal(1);
builtTx.inputs[0].should.deepEqual({
address: testData.sender.address,
value: (testData.AMOUNT * 2).toString(),
coin: 'tsui',
});
builtTx.outputs.length.should.equal(2);
builtTx.outputs[0].should.deepEqual({
address: testData.recipients[0].address,
value: testData.recipients[0].amount,
coin: 'tsui',
});
builtTx.outputs[1].should.deepEqual({
address: testData.recipients[1].address,
value: testData.recipients[1].amount,
coin: 'tsui',
});
const jsonTx = builtTx.toJson();
jsonTx.gasData.should.deepEqual(testData.gasData);
jsonTx.kind.ProgrammableTransaction.should.deepEqual({
inputs: testData.txInputs,
transactions: testData.txTransactions,
});
jsonTx.sender.should.equal(testData.sender.address);
jsonTx.gasData.should.deepEqual(testData.gasData);
builtTx.toBroadcastFormat().should.equal(testData.TRANSFER);
});
});
describe('Staking TX', async () => {
beforeEach(function (done) {
builders = [factory.getStakingBuilder()];
done();
});
it('should build an add staking transaction and serialize it and deserialize it', async function () {
const txBuilder = factory.getStakingBuilder();
txBuilder.type(iface_1.SuiTransactionType.AddStake);
txBuilder.sender(testData.sender.address);
txBuilder.stake([testData.requestAddStake]);
txBuilder.gasData(testData.gasData);
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.ADD_STAKE);
const reserialized = await factory.from(rawTx).build();
reserialized.toBroadcastFormat().should.equal(rawTx);
});
it('should build an stakeMany transaction and serialize it and deserialize it', async function () {
const txBuilder = factory.getStakingBuilder();
txBuilder.type(iface_1.SuiTransactionType.AddStake);
txBuilder.sender(testData.sender.address);
txBuilder.stake(testData.requestAddStakeMany);
txBuilder.gasData(testData.gasData);
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingAdd);
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.STAKE_MANY);
const reserialized = await factory.from(rawTx).build();
// reserialized.should.be.deepEqual(tx);
reserialized.toBroadcastFormat().should.equal(rawTx);
});
it('should build and sign a staking tx with gasPayment', async function () {
const txBuilder = factory.getStakingBuilder();
txBuilder.type(iface_1.SuiTransactionType.AddStake);
txBuilder.sender(testData.sender.address);
txBuilder.stake([testData.requestAddStake]);
txBuilder.gasData(testData.gasData);
const tx = await txBuilder.build();
should_1.default.equal(tx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.ADD_STAKE);
const txBuilder2 = await factory.from(rawTx);
await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
const signedTx = await txBuilder2.build();
should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.StakingAdd);
should_1.default.equal(signedTx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
const rawSignedTx = signedTx.toBroadcastFormat();
should_1.default.equal(rawSignedTx, testData.ADD_STAKE);
const reserializedTxBuilder = factory.from(rawSignedTx);
reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
const reserialized = await reserializedTxBuilder.build();
reserialized.should.be.deepEqual(signedTx);
reserialized.toBroadcastFormat().should.equal(rawSignedTx);
});
it('should build and sign a staking transaction with private keys', async () => {
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
const senderAddress = keyPairSender.getAddress();
const expectedStakingTxSig = 'AD8755e+kA3/Iy+3oRxBbQiK0Iz4qmD4sZcpoQN0UMPxIXv7Qx4twvuAiZf9H2nHYa/Ae0asM4Rkz1SCP0dhXgqlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
const expectedStakingTxHex = 'AAAJAAgALTEBAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBAAAAAAAAAAEAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjAAgArCP8BgAAAAAgRLGzGeI0lZlfyDfa/Sj8avi2Re3d/w/BRn8a1jE2LCYACAAtMQEAAAAAACBEsbMZ4jSVmV/IN9r9KPxq+LZF7d3/D8FGfxrWMTYsJgAIAKwj/AYAAAAAIESxsxniNJWZX8g32v0o/Gr4tkXt3f8PwUZ/GtYxNiwjCAIAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACAAABAgACAAEBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKc3VpX3N5c3RlbRFyZXF1ZXN0X2FkZF9zdGFrZQADAQEAAgIAAQQAAgABAQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCnN1aV9zeXN0ZW0RcmVxdWVzdF9hZGRfc3Rha2UAAwEBAAIEAAEGAAIAAQEHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwpzdWlfc3lzdGVtEXJlcXVlc3RfYWRkX3N0YWtlAAMBAQACBgABCACQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
const coins = [
{
digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
version: 1126,
},
{
digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
version: 1126,
},
];
const txBuilder_1 = factory.getStakingBuilder();
txBuilder_1.type(iface_1.SuiTransactionType.AddStake);
txBuilder_1.sender(senderAddress);
txBuilder_1.stake(testData.requestAddStakeMany);
const gasData = {
payment: coins,
owner: senderAddress,
budget: testData.GAS_BUDGET,
price: 1000,
};
txBuilder_1.gasData(gasData);
const tx_1 = await txBuilder_1.build();
const signable_1 = tx_1.signablePayload;
const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
const signedTx_1 = (await txBuilder_1.build());
const txHex_1 = signedTx_1.toBroadcastFormat();
const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
const txBuilderFromRaw_2 = factory.getStakingBuilder();
txBuilderFromRaw_2.from(txHex_1);
const signable_2 = tx_1.signablePayload;
txBuilderFromRaw_2.sign({ key: testData.privateKeys.prvKey1 });
const signedTx_2 = (await txBuilderFromRaw_2.build());
const txHex_2 = signedTx_2.toBroadcastFormat();
const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
should_1.default.equal(txHex_1, txHex_2);
should_1.default.equal(txHex_1, expectedStakingTxHex);
should_1.default.equal(txHex_2, expectedStakingTxHex);
should_1.default.equal(sig_1, sig_2);
should_1.default.equal(sig_1, expectedStakingTxSig);
should_1.default.equal(sig_2, expectedStakingTxSig);
});
it('should fail to build if missing type', async function () {
for (const txBuilder of builders) {
txBuilder.sender(testData.sender.address);
txBuilder.stake([testData.requestAddStake]);
txBuilder.gasData(testData.gasData);
await txBuilder.build().should.rejectedWith('type is required before building');
}
});
it('should fail to build if missing sender', async function () {
for (const txBuilder of builders) {
txBuilder.type(iface_1.SuiTransactionType.AddStake);
txBuilder.stake([testData.requestAddStake]);
txBuilder.gasData(testData.gasData);
await txBuilder.build().should.rejectedWith('sender is required before building');
}
});
it('should fail to build if missing gasData', async function () {
for (const txBuilder of builders) {
txBuilder.sender(testData.sender.address);
txBuilder.type(iface_1.SuiTransactionType.AddStake);
txBuilder.stake([testData.requestAddStake]);
await txBuilder.build().should.rejectedWith('gasData is required before building');
}
});
it('should fail to build if missing payment coins in gasData', async function () {
for (const txBuilder of builders) {
txBuilder.sender(testData.sender.address);
txBuilder.type(iface_1.SuiTransactionType.AddStake);
txBuilder.stake([testData.requestAddStake]);
(0, should_1.default)(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(`gas payment is required before building`);
await txBuilder.build().should.rejectedWith('gasData is required before building');
}
});
it('should build a send from rawTx', async function () {
const txBuilder = factory.from(testData.ADD_STAKE);
const builtTx = await txBuilder.build();
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.StakingAdd);
should_1.default.equal(builtTx.id, 'bP78boZ48sDdJsg2V1tJahpGyBwaC9GSTL2rvyADnsh');
builtTx.inputs.length.should.equal(1);
builtTx.inputs[0].should.deepEqual({
address: testData.sender.address,
value: sui_1.STAKING_AMOUNT.toString(),
coin: 'tsui',
});
builtTx.outputs.length.should.equal(1);
builtTx.outputs[0].should.deepEqual({
address: testData.requestAddStake.validatorAddress,
value: sui_1.STAKING_AMOUNT.toString(),
coin: 'tsui',
});
const jsonTx = builtTx.toJson();
jsonTx.gasData.should.deepEqual(testData.gasData);
jsonTx.kind.ProgrammableTransaction.should.deepEqual({
inputs: testData.txInputsAddStake,
transactions: testData.txTransactionsAddStake,
});
jsonTx.sender.should.equal(testData.sender.address);
jsonTx.gasData.should.deepEqual(testData.gasData);
builtTx.toBroadcastFormat().should.equal(testData.ADD_STAKE);
});
});
describe('Unstaking TX', async () => {
beforeEach(function (done) {
builders = [factory.getUnstakingBuilder()];
done();
});
it('should build an unstaking transaction and serialize it and deserialize it', async function () {
const txBuilder = factory.getUnstakingBuilder();
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
txBuilder.sender(testData.sender.address);
txBuilder.unstake(testData.requestWithdrawStakedSui);
txBuilder.gasData(testData.gasData);
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingClaim);
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.WITHDRAW_STAKED_SUI);
const reserialized = await factory.from(rawTx).build();
reserialized.toBroadcastFormat().should.equal(rawTx);
});
it('should build and sign a staking tx with gasPayment', async function () {
const txBuilder = factory.getUnstakingBuilder();
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
txBuilder.sender(testData.sender.address);
txBuilder.unstake(testData.requestWithdrawStakedSui);
txBuilder.gasData(testData.gasData);
const tx = await txBuilder.build();
should_1.default.equal(tx.id, 'Rixz9C2yQ6jDFFsovUs84Y6yw2dco8HH4QhK7RCQYNo');
const rawTx = tx.toBroadcastFormat();
should_1.default.equal(rawTx, testData.WITHDRAW_STAKED_SUI);
const txBuilder2 = await factory.from(rawTx);
await txBuilder2.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
const signedTx = await txBuilder2.build();
should_1.default.equal(signedTx.type, sdk_core_1.TransactionType.StakingClaim);
should_1.default.equal(signedTx.id, 'Rixz9C2yQ6jDFFsovUs84Y6yw2dco8HH4QhK7RCQYNo');
const rawSignedTx = signedTx.toBroadcastFormat();
should_1.default.equal(rawSignedTx, testData.WITHDRAW_STAKED_SUI);
const reserializedTxBuilder = factory.from(rawSignedTx);
reserializedTxBuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
const reserialized = await reserializedTxBuilder.build();
reserialized.should.be.deepEqual(signedTx);
reserialized.toBroadcastFormat().should.equal(rawSignedTx);
});
it('should build and sign a staking transaction with private keys', async () => {
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
const senderAddress = keyPairSender.getAddress();
const expectedStakingTxSig = 'ABqwaOIsxZjf/LIE985SJK2lH56oNxIuHVpZhN+6L9uZFYFuipa6zsg5fnprxuBPIUVTorw3yEJcoKNGZwOpQgKlzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==';
const expectedStakingTxHex = 'AAACAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQEAAAAAAAAAAQEA7m38PaMuIVQaKurfzSUPigoju3q9qciYhAf8MgaMN0ZhBAAAAAAAACDJYCWUFis6HawzxGyErvRT03pYayRliLki0kYsV0XCBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKc3VpX3N5c3RlbRZyZXF1ZXN0X3dpdGhkcmF3X3N0YWtlAAIBAAABAQCQB0K7kj6pBqVvMloXWXdS7NOsMCa7qW4O3/Rd6NszqwJ3AbiIwWM5ms1bgEYzwdDlMrwxQ8/vNMo2C+YHxo3N72YEAAAAAAAAIDrMcEOTidjOdp7a1J/jjJ9tOjb6P2WTyBSwQqAHiA1/yfVla+cYIwE9k34GVOs+3LJhla/SMAm+mrlufz8twgNmBAAAAAAAACAhXnkXobS2E/RZ/cLDQ/n3BH/TxAjKv5VxsbLEZCUxu5AHQruSPqkGpW8yWhdZd1Ls06wwJrupbg7f9F3o2zOr6AMAAAAAAAAALTEBAAAAAAA=';
const coins = [
{
digest: '4xXTGhhtNUjBU8nMivsLWTMRWvZRc5RWDMgyTMnnRDYS',
objectId: '0x7701b888c163399acd5b804633c1d0e532bc3143cfef34ca360be607c68dcdef',
version: 1126,
},
{
digest: '3FG1Nfk5HrQ1tWYKS8BX9ynZTSprL5hLn3pgw7kdj1RU',
objectId: '0xc9f5656be71823013d937e0654eb3edcb26195afd23009be9ab96e7f3f2dc203',
version: 1126,
},
];
const txBuilder_1 = factory.getUnstakingBuilder();
txBuilder_1.type(iface_1.SuiTransactionType.WithdrawStake);
txBuilder_1.sender(senderAddress);
txBuilder_1.unstake(testData.requestWithdrawStakedSui);
const gasData = {
payment: coins,
owner: senderAddress,
budget: testData.GAS_BUDGET,
price: 1000,
};
txBuilder_1.gasData(gasData);
const tx_1 = await txBuilder_1.build();
const signable_1 = tx_1.signablePayload;
const signature_1 = keyPairSender.signMessageinUint8Array(signable_1);
txBuilder_1.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signature_1));
const signedTx_1 = (await txBuilder_1.build());
const txHex_1 = signedTx_1.toBroadcastFormat();
const sig_1 = Buffer.from(signedTx_1.serializedSig).toString('base64');
const txBuilderFromRaw_2 = factory.getUnstakingBuilder();
txBuilderFromRaw_2.from(txHex_1);
const signable_2 = tx_1.signablePayload;
txBuilderFromRaw_2.sign({ key: testData.privateKeys.prvKey1 });
const signedTx_2 = (await txBuilderFromRaw_2.build());
const txHex_2 = signedTx_2.toBroadcastFormat();
const sig_2 = Buffer.from(signedTx_2.serializedSig).toString('base64');
should_1.default.equal(Buffer.from(signable_1).toString('hex'), Buffer.from(signable_2).toString('hex'));
should_1.default.equal(txHex_1, txHex_2);
should_1.default.equal(txHex_1, expectedStakingTxHex);
should_1.default.equal(txHex_2, expectedStakingTxHex);
should_1.default.equal(sig_1, sig_2);
should_1.default.equal(sig_1, expectedStakingTxSig);
should_1.default.equal(sig_2, expectedStakingTxSig);
});
it('should fail to build if missing type', async function () {
for (const txBuilder of builders) {
txBuilder.sender(testData.sender.address);
txBuilder.unstake(testData.requestWithdrawStakedSui);
txBuilder.gasData(testData.gasData);
await txBuilder.build().should.rejectedWith('type is required before building');
}
});
it('should fail to build if missing sender', async function () {
for (const txBuilder of builders) {
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
txBuilder.unstake(testData.requestWithdrawStakedSui);
txBuilder.gasData(testData.gasData);
await txBuilder.build().should.rejectedWith('sender is required before building');
}
});
it('should fail to build if missing gasData', async function () {
for (const txBuilder of builders) {
txBuilder.sender(testData.sender.address);
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
txBuilder.unstake(testData.requestWithdrawStakedSui);
await txBuilder.build().should.rejectedWith('gasData is required before building');
}
});
it('should fail to build if missing payment coins in gasData', async function () {
for (const txBuilder of builders) {
txBuilder.sender(testData.sender.address);
txBuilder.type(iface_1.SuiTransactionType.WithdrawStake);
txBuilder.unstake(testData.requestWithdrawStakedSui);
(0, should_1.default)(() => txBuilder.gasData(testData.gasDataWithoutGasPayment)).throwError(`gas payment is required before building`);
await txBuilder.build().should.rejectedWith('gasData is required before building');
}
});
it('should build a send from rawTx', async function () {
const txBuilder = factory.from(testData.WITHDRAW_STAKED_SUI);
const builtTx = await txBuilder.build();
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.StakingClaim);
should_1.default.equal(builtTx.id, 'Rixz9C2yQ6jDFFsovUs84Y6yw2dco8HH4QhK7RCQYNo');
builtTx.inputs.length.should.equal(1);
builtTx.inputs[0].should.deepEqual({
address: testData.requestWithdrawStakedSui.stakedSui.objectId,
value: constants_1.AMOUNT_UNKNOWN_TEXT,
coin: 'tsui',
});
builtTx.outputs.length.should.equal(1);
builtTx.outputs[0].should.deepEqual({
address: testData.sender.address,
value: constants_1.AMOUNT_UNKNOWN_TEXT,
coin: 'tsui',
});
const jsonTx = builtTx.toJson();
jsonTx.gasData.should.deepEqual(testData.gasData);
jsonTx.kind.ProgrammableTransaction.should.deepEqual({
inputs: testData.txInputWithdrawStaked,
transactions: testData.txTransactionsWithdrawStaked,
});
jsonTx.sender.should.equal(testData.sender.address);
jsonTx.gasData.should.deepEqual(testData.gasData);
builtTx.toBroadcastFormat().should.equal(testData.WITHDRAW_STAKED_SUI);
});
it('should determine correct type for withdrawal with amount', async function () {
const txBuilder = factory.from(testData.WITHDRAW_STAKED_SUI_WITH_AMOUNT);
const tx = await txBuilder.build();
should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingClaim);
});
});
describe('Custom TX', async () => {
it('should sign a custom tx', async function () {
const keyPairSender = new keyPair_1.KeyPair({ prv: testData.privateKeys.prvKey1 });
const txBuilder = factory.from(sui_1.CUSTOM_TX_STAKING_POOL_SPLIT);
const tx = await txBuilder.build();
const unsignedTxHex = tx.toBroadcastFormat();
const signable = tx.signablePayload;
const signatureBytes = keyPairSender.signMessageinUint8Array(signable);
txBuilder.addSignature({ pub: keyPairSender.getKeys().pub }, Buffer.from(signatureBytes));
const signedTx = (await txBuilder.build());
const signedTxHex = signedTx.toBroadcastFormat();
should_1.default.equal(signedTxHex, unsignedTxHex);
should_1.default.equal(signedTx.signature.length, 1);
should_1.default.equal(signedTx.signature[0], Buffer.from(signatureBytes).toString('hex'));
const serializedSig = Buffer.from(signedTx.serializedSig).toString('base64');
should_1.default.equal(serializedSig, 'APGQHoYbVSyL6M7lOQL5w2YYzeeVcTMEbe0Y4jVphQA+0QHq3VEDoXVwIukkL44z+vqsekviS4gQ0ZwUPTWHFQilzaq1j4wMuCiXuFW4ojFfuoBhEiBy/K4eB5BkHZ+eZw==');
});
it('should fail to build if unsupported txn type', async function () {
(0, should_1.default)(() => factory.from(sui_1.UNSUPPORTED_TX)).throwError('unsupported target method 0000000000000000000000000000000000000000000000000000000000000003::staking_pool::split_staked_sui');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0REFBeUQ7QUFDekQsOERBQWdEO0FBQ2hELG9EQUE0QjtBQUM1Qiw4Q0FBa0Q7QUFDbEQsa0RBQTREO0FBQzVELDZDQUErRztBQUMvRyxzREFBbUQ7QUFJbkQsMERBQWlFO0FBR2pFLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLElBQUksRUFBRTtJQUM3QyxJQUFJLFFBQVEsQ0FBQztJQUNiLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNqQyxVQUFVLENBQUMsVUFBVSxJQUFJO1lBQ3ZCLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDMUMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5RUFBeUUsRUFBRSxLQUFLO1lBQ2pGLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQVUsQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFD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LEVBQUUsQ0FBc0IsQ0FBQztZQUNoRSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRWpGLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RSxnQkFBTSxDQUFDLEtBQUssQ0FDVixhQUFhLEVBQ2Isc0lBQXNJLENBQ3ZJLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxLQUFLO1lBQ3RELElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FDbkQsNEhBQTRILENBQzdILENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9zdWknO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFN1aVRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuaW1wb3J0IHsgQ1VTVE9NX1RYX1NUQUtJTkdfUE9PTF9TUExJVCwgcmVjaXBpZW50cywgU1RBS0lOR19BTU9VTlQsIFVOU1VQUE9SVEVEX1RYIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3N1aSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9rZXlQYWlyJztcbmltcG9ydCB7IEdhc0RhdGEgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL215c3RlbmxhYi90eXBlcyc7XG5pbXBvcnQgeyBTdGFraW5nVHJhbnNhY3Rpb24sIFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgVW5zdGFraW5nVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3Vuc3Rha2luZ1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IEFNT1VOVF9VTktOT1dOX1RFWFQgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDdXN0b21UcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvY3VzdG9tVHJhbnNhY3Rpb24nO1xuXG5kZXNjcmliZSgnU3VpIFRyYW5zYWN0aW9uIEJ1aWxkZXInLCBhc3luYyAoKSA9PiB7XG4gIGxldCBidWlsZGVycztcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c3VpJyk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zZmVyIFRYJywgYXN5bmMgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGJ1aWxkZXJzID0gW2ZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCldO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGFuZCBzZXJpYWxpemUgaXQgYW5kIGRlc2VyaWFsaXplIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuVFJBTlNGRVIpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KS5idWlsZCgpO1xuICAgICAgcmVzZXJpYWxpemVkLnNob3VsZC5iZS5kZWVwRXF1YWwodHgpO1xuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNpZ24gYSB0cmFuc2ZlciB0eCB3aXRoIGdhc1BheW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICdVTkFWQUlMQUJMRScpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5UUkFOU0ZFUik7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyMi5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LmlkLCAnQnhvZUdYYkJDdXc2VkZFY2d3SEhVQUtyQ29Bc0dhblBCMzlrZFZWS1paY1InKTtcblxuICAgICAgY29uc3QgcmF3U2lnbmVkVHggPSBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4LCB0ZXN0RGF0YS5UUkFOU0ZFUik7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3U2lnbmVkVHgpO1xuICAgICAgcmVzZXJpYWxpemVkVHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWQgPSBhd2FpdCByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgcmVzZXJpYWxpemVkLnNob3VsZC5iZS5kZWVwRXF1YWwoc2lnbmVkVHgpO1xuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VibWl0IGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBwcml2YXRlIGtleXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyU2VuZGVyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTEgfSk7XG4gICAgICBjb25zdCBrZXlQYWlyUmVjaXBpZW50ID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTIgfSk7XG4gICAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0ga2V5UGFpclNlbmRlci5nZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCByZWNlaXZlQWRkcmVzcyA9IGtleVBhaXJSZWNpcGllbnQuZ2V0QWRkcmVzcygpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnID1cbiAgICAgICAgJ0FJOFE5S0lOcVNDT2VIdmh2Nk1KNlZmM1RXYlRjeGhwY2xnMFBEOWdCZ2FuZDJrTFFaeEVKUy9ISkFTZ2FuTEtmWjI3N0lsNG1BaWZLSHp2dGIyZkNBK2x6YXExajR3TXVDaVh1Rlc0b2pGZnVvQmhFaUJ5L0s0ZUI1QmtIWitlWnc9PSc7XG4gICAgICBjb25zdCBleHBlY3RlZFRyYW5zZmVyVHhIZXggPVxuICAgICAgICAnQUFBQ0FBZ0E0ZlVGQUFBQUFBQWd0ZXYrbm5jRGZUdG93SlpFUEhVTXNKWGlhNHdLbVQvWHBndHJ6c3k2TzM4Q0FnQUJBUUFBQVFFQ0FBQUJBUUNRQjBLN2tqNnBCcVZ2TWxvWFdYZFM3Tk9zTUNhN3FXNE8zL1JkNk5zenF3SjNBYmlJd1dNNW1zMWJnRVl6d2REbE1yd3hROC92Tk1vMkMrWUh4bzNONzJZRUFBQUFBQUFBSURyTWNFT1RpZGpPZHA3YTFKL2pqSjl0T2piNlAyV1R5QlN3UXFBSGlBMS95ZlZsYStjWUl3RTlrMzRHVk9zKzNMSmhsYS9TTUFtK21ybHVmejh0d2dObUJBQUFBQUFBQUNBaFhua1hvYlMyRS9SWi9jTERRL24zQkgvVHhBakt2NVZ4c2JMRVpDVXh1NUFIUXJ1U1Bxa0dwVzh5V2hkWmQxTHMwNnd3SnJ1cGJnN2Y5RjNvMnpPcjZBTUFBQUFBQUFBQUxURUJBQUFBQUFBPSc7XG5cbiAgICAgIGNvbnN0IGNvaW5zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgZGlnZXN0OiAnNHhYVEdoaHROVWpCVThuTWl2c0xXVE1SV3ZaUmM1UldETWd5VE1ublJEWVMnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg3NzAxYjg4OGMxNjMzOTlhY2Q1YjgwNDYzM2MxZDBlNTMyYmMzMTQzY2ZlZjM0Y2EzNjBiZTYwN2M2OGRjZGVmJyxcbiAgICAgICAgICB2ZXJzaW9uOiAxMTI2LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGlnZXN0OiAnM0ZHMU5mazVIclExdFdZS1M4Qlg5eW5aVFNwckw1aExuM3BndzdrZGoxUlUnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHhjOWY1NjU2YmU3MTgyMzAxM2Q5MzdlMDY1NGViM2VkY2IyNjE5NWFmZDIzMDA5YmU5YWI5NmU3ZjNmMmRjMjAzJyxcbiAgICAgICAgICB2ZXJzaW9uOiAxMTI2LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcl8xID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlcl8xLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlcl8xLnNlbmRlcihzZW5kZXJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlcl8xLnNlbmQoW3sgYWRkcmVzczogcmVjZWl2ZUFkZHJlc3MsIGFtb3VudDogJzEwMDAwMDAwMCcgfV0pO1xuICAgICAgY29uc3QgZ2FzRGF0YTogR2FzRGF0YSA9IHtcbiAgICAgICAgcGF5bWVudDogY29pbnMsXG4gICAgICAgIG93bmVyOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBidWRnZXQ6IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgIHByaWNlOiAxMDAwLFxuICAgICAgfTtcbiAgICAgIHR4QnVpbGRlcl8xLmdhc0RhdGEoZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4XzEgPSBhd2FpdCB0eEJ1aWxkZXJfMS5idWlsZCgpO1xuICAgICAgY29uc3Qgc2lnbmFibGVfMSA9IHR4XzEuc2lnbmFibGVQYXlsb2FkO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlXzEgPSBrZXlQYWlyU2VuZGVyLnNpZ25NZXNzYWdlaW5VaW50OEFycmF5KHNpZ25hYmxlXzEpO1xuICAgICAgdHhCdWlsZGVyXzEuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU2VuZGVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlXzEpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzEgPSAoYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SGV4XzEgPSBzaWduZWRUeF8xLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBzaWdfMSA9IEJ1ZmZlci5mcm9tKHNpZ25lZFR4XzEuc2VyaWFsaXplZFNpZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXJGcm9tUmF3XzIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyRnJvbVJhd18yLmZyb20odHhIZXhfMSk7XG4gICAgICBjb25zdCBzaWduYWJsZV8yID0gdHhfMS5zaWduYWJsZVBheWxvYWQ7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzIgPSAoYXdhaXQgdHhCdWlsZGVyRnJvbVJhd18yLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEhleF8yID0gc2lnbmVkVHhfMi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgc2lnXzIgPSBCdWZmZXIuZnJvbShzaWduZWRUeF8yLnNlcmlhbGl6ZWRTaWcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzEpLnRvU3RyaW5nKCdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmFibGVfMikudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCB0eEhleF8yKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCBleHBlY3RlZFRyYW5zZmVyVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzIsIGV4cGVjdGVkVHJhbnNmZXJUeEhleCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzEsIHNpZ18yKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMiwgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VibWl0IGEgc2xpdCBjb2luIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXlzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpclNlbmRlciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGtleVBhaXJTZW5kZXIuZ2V0QWRkcmVzcygpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnID1cbiAgICAgICAgJ0FHR1dIWnV5VWpzeE1oTW9Qb3Fkc1pSVEM1MGE4bUJ5RGh1cHdFMFdyRGx2dnF6d2FSTzdSNXNZMjAvSVlnYWJVQTlmZXAzbzM1c3NuUmhVWjBqRHF3bWx6YXExajR3TXVDaVh1Rlc0b2pGZnVvQmhFaUJ5L0s0ZUI1QmtIWitlWnc9PSc7XG4gICAgICBjb25zdCBleHBlY3RlZFRyYW5zZmVyVHhIZXggPVxuICAgICAgICAnQUFBVkFBZ0E0ZlVGQUFBQUFBQWdrQWRDdTVJK3FRYWxiekphRjFsM1V1elRyREFtdTZsdUR0LzBYZWpiTTZzQUNBRGg5UVVBQUFBQUFBZ0E0ZlVGQUFBQUFBQUlBT0gxQlFBQUFBQUFDQURoOVFVQUFBQUFBQWdBNGZVRkFBQUFBQUFJQU9IMUJRQUFBQUFBQ0FEaDlRVUFBQUFBQUFnQTRmVUZBQUFBQUFBSUFPSDFCUUFBQUFBQUNBRGg5UVVBQUFBQUFBZ0E0ZlVGQUFBQUFBQUlBT0gxQlFBQUFBQUFDQURoOVFVQUFBQUFBQWdBNGZVRkFBQUFBQUFJQU9IMUJRQUFBQUFBQ0FEaDlRVUFBQUFBQUFnQTRmVUZBQUFBQUFBSUFPSDFCUUFBQUFBQUNBRGg5UVVBQUFBQUtBSUFBUUVBQUFFQkFnQUFBUUVBQWdBQkFRSUFBUUVDQWdBQkFRQUNBQUVCQXdBQkFRSUVBQUVCQUFJQUFRRUVBQUVCQWdZQUFRRUFBZ0FCQVFVQUFRRUNDQUFCQVFBQ0FBRUJCZ0FCQVFJS0FBRUJBQUlBQVFFSEFBRUJBZ3dBQVFFQUFnQUJBUWdBQVFFQ0RnQUJBUUFDQUFFQkNRQUJBUUlRQUFFQkFBSUFBUUVLQUFFQkFoSUFBUUVBQWdBQkFRc0FBUUVDRkFBQkFRQUNBQUVCREFBQkFRSVdBQUVCQUFJQUFRRU5BQUVCQWhnQUFRRUFBZ0FCQVE0QUFRRUNHZ0FCQVFBQ0FBRUJEd0FCQVFJY0FBRUJBQUlBQVFFUUFBRUJBaDRBQVFFQUFnQUJBUkVBQVFFQ0lBQUJBUUFDQUFFQkVnQUJBUUlpQUFFQkFBSUFBUUVUQUFFQkFpUUFBUUVBQWdBQkFSUUFBUUVDSmdBQkFRQ1FCMEs3a2o2cEJxVnZNbG9YV1hkUzdOT3NNQ2E3cVc0TzMvUmQ2TnN6cXdKM0FiaUl3V001bXMxYmdFWXp3ZERsTXJ3eFE4L3ZOTW8yQytZSHhvM043MllFQUFBQUFBQUFJRHJNY0VPVGlkak9kcDdhMUovampKOXRPamI2UDJXVHlCU3dRcUFIaUExL3lmVmxhK2NZSXdFOWszNEdWT3MrM0xKaGxhL1NNQW0rbXJsdWZ6OHR3Z05tQkFBQUFBQUFBQ0FoWG5rWG9iUzJFL1JaL2NMRFEvbjNCSC9UeEFqS3Y1VnhzYkxFWkNVeHU1QUhRcnVTUHFrR3BXOHlXaGRaZDFMczA2d3dKcnVwYmc3ZjlGM28yek9yNkFNQUFBQUFBQUFBTFRFQkFBQUFBQUE9JztcblxuICAgICAgY29uc3QgY29pbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICc0eFhUR2hodE5VakJVOG5NaXZzTFdUTVJXdlpSYzVSV0RNZ3lUTW5uUkRZUycsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDc3MDFiODg4YzE2MzM5OWFjZDViODA0NjMzYzFkMGU1MzJiYzMxNDNjZmVmMzRjYTM2MGJlNjA3YzY4ZGNkZWYnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICczRkcxTmZrNUhyUTF0V1lLUzhCWDl5blpUU3ByTDVoTG4zcGd3N2tkajFSVScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweGM5ZjU2NTZiZTcxODIzMDEzZDkzN2UwNjU0ZWIzZWRjYjI2MTk1YWZkMjMwMDliZTlhYjk2ZTdmM2YyZGMyMDMnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgdHhCdWlsZGVyXzEgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyXzEudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyXzEuc2VuZGVyKHNlbmRlckFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyXzEuc2VuZChBcnJheSgyMCkuZmlsbCh7IGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsIGFtb3VudDogJzEwMDAwMDAwMCcgfSkpO1xuICAgICAgY29uc3QgZ2FzRGF0YTogR2FzRGF0YSA9IHtcbiAgICAgICAgcGF5bWVudDogY29pbnMsXG4gICAgICAgIG93bmVyOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBidWRnZXQ6IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgIHByaWNlOiAxMDAwLFxuICAgICAgfTtcbiAgICAgIHR4QnVpbGRlcl8xLmdhc0RhdGEoZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4XzEgPSBhd2FpdCB0eEJ1aWxkZXJfMS5idWlsZCgpO1xuICAgICAgY29uc3Qgc2lnbmFibGVfMSA9IHR4XzEuc2lnbmFibGVQYXlsb2FkO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlXzEgPSBrZXlQYWlyU2VuZGVyLnNpZ25NZXNzYWdlaW5VaW50OEFycmF5KHNpZ25hYmxlXzEpO1xuICAgICAgdHhCdWlsZGVyXzEuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU2VuZGVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlXzEpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzEgPSAoYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SGV4XzEgPSBzaWduZWRUeF8xLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBzaWdfMSA9IEJ1ZmZlci5mcm9tKHNpZ25lZFR4XzEuc2VyaWFsaXplZFNpZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXJGcm9tUmF3XzIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyRnJvbVJhd18yLmZyb20odHhIZXhfMSk7XG4gICAgICBjb25zdCBzaWduYWJsZV8yID0gdHhfMS5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBjb25zdCBzaWduYXR1cmVfMiA9IGtleVBhaXJTZW5kZXIuc2lnbk1lc3NhZ2VpblVpbnQ4QXJyYXkoc2lnbmFibGVfMik7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuYWRkU2lnbmF0dXJlKHsgcHViOiBrZXlQYWlyU2VuZGVyLmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlXzIpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzIgPSAoYXdhaXQgdHhCdWlsZGVyRnJvbVJhd18yLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEhleF8yID0gc2lnbmVkVHhfMi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgc2lnXzIgPSBCdWZmZXIuZnJvbShzaWduZWRUeF8yLnNlcmlhbGl6ZWRTaWcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzEpLnRvU3RyaW5nKCdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmFibGVfMikudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCB0eEhleF8yKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEhleF8xLCBleHBlY3RlZFRyYW5zZmVyVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzIsIGV4cGVjdGVkVHJhbnNmZXJUeEhleCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzEsIHNpZ18yKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMiwgZXhwZWN0ZWRUcmFuc2ZlclR4U2lnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCd0eXBlIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3Npbmcgc2VuZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdzZW5kZXIgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdhdCBsZWFzdCBvbmUgcmVjaXBpZW50IGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgZ2FzRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZChyZWNpcGllbnRzKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnZ2FzRGF0YSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHBheW1lbnQgY29pbnMgaW4gZ2FzRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZChyZWNpcGllbnRzKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCkpLnRocm93RXJyb3IoXG4gICAgICAgICAgYGdhcyBwYXltZW50IGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZ2BcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnZ2FzRGF0YSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzZW5kIGZyb20gcmF3VHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuVFJBTlNGRVIpO1xuICAgICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHguaWQsICdCeG9lR1hiQkN1dzZWRkVjZ3dISFVBS3JDb0FzR2FuUEIzOWtkVlZLWlpjUicpO1xuICAgICAgYnVpbHRUeC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIGJ1aWx0VHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6ICh0ZXN0RGF0YS5BTU9VTlQgKiAyKS50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGJ1aWx0VHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgYnVpbHRUeC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICBidWlsdFR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYW1vdW50LFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG4gICAgICBqc29uVHguZ2FzRGF0YS5zaG91bGQuZGVlcEVxdWFsKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAganNvblR4LmtpbmQuUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGlucHV0czogdGVzdERhdGEudHhJbnB1dHMsXG4gICAgICAgIHRyYW5zYWN0aW9uczogdGVzdERhdGEudHhUcmFuc2FjdGlvbnMsXG4gICAgICB9KTtcbiAgICAgIGpzb25UeC5zZW5kZXIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGpzb25UeC5nYXNEYXRhLnNob3VsZC5kZWVwRXF1YWwodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHRlc3REYXRhLlRSQU5TRkVSKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdTdGFraW5nIFRYJywgYXN5bmMgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGJ1aWxkZXJzID0gW2ZhY3RvcnkuZ2V0U3Rha2luZ0J1aWxkZXIoKV07XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuIGFkZCBzdGFraW5nIHRyYW5zYWN0aW9uIGFuZCBzZXJpYWxpemUgaXQgYW5kIGRlc2VyaWFsaXplIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VdKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkFERF9TVEFLRSk7XG4gICAgICBjb25zdCByZXNlcmlhbGl6ZWQgPSBhd2FpdCBmYWN0b3J5LmZyb20ocmF3VHgpLmJ1aWxkKCk7XG4gICAgICByZXNlcmlhbGl6ZWQudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiBzdGFrZU1hbnkgdHJhbnNhY3Rpb24gYW5kIHNlcmlhbGl6ZSBpdCBhbmQgZGVzZXJpYWxpemUgaXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2UodGVzdERhdGEucmVxdWVzdEFkZFN0YWtlTWFueSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBZGQpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5TVEFLRV9NQU5ZKTtcbiAgICAgIGNvbnN0IHJlc2VyaWFsaXplZCA9IGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCkuYnVpbGQoKTtcbiAgICAgIC8vIHJlc2VyaWFsaXplZC5zaG91bGQuYmUuZGVlcEVxdWFsKHR4KTtcbiAgICAgIHJlc2VyaWFsaXplZC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzaWduIGEgc3Rha2luZyB0eCB3aXRoIGdhc1BheW1lbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlkLCAnYlA3OGJvWjQ4c0RkSnNnMlYxdEphaHBHeUJ3YUM5R1NUTDJydnlBRG5zaCcpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5BRERfU1RBS0UpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlcjIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pZCwgJ2JQNzhib1o0OHNEZEpzZzJWMXRKYWhwR3lCd2FDOUdTVEwycnZ5QURuc2gnKTtcblxuICAgICAgY29uc3QgcmF3U2lnbmVkVHggPSBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4LCB0ZXN0RGF0YS5BRERfU1RBS0UpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkVHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1NpZ25lZFR4KTtcbiAgICAgIHJlc2VyaWFsaXplZFR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkID0gYXdhaXQgcmVzZXJpYWxpemVkVHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHJlc2VyaWFsaXplZC5zaG91bGQuYmUuZGVlcEVxdWFsKHNpZ25lZFR4KTtcbiAgICAgIHJlc2VyaWFsaXplZC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdTaWduZWRUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuZCBzaWduIGEgc3Rha2luZyB0cmFuc2FjdGlvbiB3aXRoIHByaXZhdGUga2V5cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXJTZW5kZXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBrZXlQYWlyU2VuZGVyLmdldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3Rha2luZ1R4U2lnID1cbiAgICAgICAgJ0FEODc1NWUra0EzL0l5KzNvUnhCYlFpSzBJejRxbUQ0c1pjcG9RTjBVTVB4SVh2N1F4NHR3dnVBaVpmOUgybkhZYS9BZTBhc000Umt6MVNDUDBkaFhncWx6YXExajR3TXVDaVh1Rlc0b2pGZnVvQmhFaUJ5L0s0ZUI1QmtIWitlWnc9PSc7XG4gICAgICBjb25zdCBleHBlY3RlZFN0YWtpbmdUeEhleCA9XG4gICAgICAgICdBQUFKQUFnQUxURUJBQUFBQUFFQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVVCQUFBQUFBQUFBQUVBSUVTeHN4bmlOSldaWDhnMzJ2MG8vR3I0dGtYdDNmOFB3VVovR3RZeE5pd2pBQWdBckNQOEJnQUFBQUFnUkxHekdlSTBsWmxmeURmYS9TajhhdmkyUmUzZC93L0JSbjhhMWpFMkxDWUFDQUF0TVFFQUFBQUFBQ0JFc2JNWjRqU1ZtVi9JTjlyOUtQeHErTFpGN2QzL0Q4RkdmeHJXTVRZc0pnQUlBS3dqL0FZQUFBQUFJRVN4c3huaU5KV1pYOGczMnYwby9HcjR0a1h0M2Y4UHdVWi9HdFl4Tml3akNBSUFBUUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd3B6ZFdsZmMzbHpkR1Z0RVhKbGNYVmxjM1JmWVdSa1gzTjBZV3RsQUFNQkFRQUNBQUFCQWdBQ0FBRUJBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUtjM1ZwWDNONWMzUmxiUkZ5WlhGMVpYTjBYMkZrWkY5emRHRnJaUUFEQVFFQUFnSUFBUVFBQWdBQkFRVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRENuTjFhVjl6ZVhOMFpXMFJjbVZ4ZFdWemRGOWhaR1JmYzNSaGEyVUFBd0VCQUFJRUFBRUdBQUlBQVFFSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdwemRXbGZjM2x6ZEdWdEVYSmxjWFZsYzNSZllXUmtYM04wWVd0bEFBTUJBUUFDQmdBQkNBQ1FCMEs3a2o2cEJxVnZNbG9YV1hkUzdOT3NNQ2E3cVc0TzMvUmQ2TnN6cXdKM0FiaUl3V001bXMxYmdFWXp3ZERsTXJ3eFE4L3ZOTW8yQytZSHhvM043MllFQUFBQUFBQUFJRHJNY0VPVGlkak9kcDdhMUovampKOXRPamI2UDJXVHlCU3dRcUFIaUExL3lmVmxhK2NZSXdFOWszNEdWT3MrM0xKaGxhL1NNQW0rbXJsdWZ6OHR3Z05tQkFBQUFBQUFBQ0FoWG5rWG9iUzJFL1JaL2NMRFEvbjNCSC9UeEFqS3Y1VnhzYkxFWkNVeHU1QUhRcnVTUHFrR3BXOHlXaGRaZDFMczA2d3dKcnVwYmc3ZjlGM28yek9yNkFNQUFBQUFBQUFBTFRFQkFBQUFBQUE9JztcblxuICAgICAgY29uc3QgY29pbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICc0eFhUR2hodE5VakJVOG5NaXZzTFdUTVJXdlpSYzVSV0RNZ3lUTW5uUkRZUycsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDc3MDFiODg4YzE2MzM5OWFjZDViODA0NjMzYzFkMGU1MzJiYzMxNDNjZmVmMzRjYTM2MGJlNjA3YzY4ZGNkZWYnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkaWdlc3Q6ICczRkcxTmZrNUhyUTF0V1lLUzhCWDl5blpUU3ByTDVoTG4zcGd3N2tkajFSVScsXG4gICAgICAgICAgb2JqZWN0SWQ6ICcweGM5ZjU2NTZiZTcxODIzMDEzZDkzN2UwNjU0ZWIzZWRjYjI2MTk1YWZkMjMwMDliZTlhYjk2ZTdmM2YyZGMyMDMnLFxuICAgICAgICAgIHZlcnNpb246IDExMjYsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgdHhCdWlsZGVyXzEgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJfMS50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZSk7XG4gICAgICB0eEJ1aWxkZXJfMS5zZW5kZXIoc2VuZGVyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXJfMS5zdGFrZSh0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VNYW55KTtcbiAgICAgIGNvbnN0IGdhc0RhdGE6IEdhc0RhdGEgPSB7XG4gICAgICAgIHBheW1lbnQ6IGNvaW5zLFxuICAgICAgICBvd25lcjogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYnVkZ2V0OiB0ZXN0RGF0YS5HQVNfQlVER0VULFxuICAgICAgICBwcmljZTogMTAwMCxcbiAgICAgIH07XG4gICAgICB0eEJ1aWxkZXJfMS5nYXNEYXRhKGdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eF8xID0gYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlXzEgPSB0eF8xLnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZV8xID0ga2V5UGFpclNlbmRlci5zaWduTWVzc2FnZWluVWludDhBcnJheShzaWduYWJsZV8xKTtcbiAgICAgIHR4QnVpbGRlcl8xLmFkZFNpZ25hdHVyZSh7IHB1Yjoga2V5UGFpclNlbmRlci5nZXRLZXlzKCkucHViIH0sIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZV8xKSk7XG4gICAgICBjb25zdCBzaWduZWRUeF8xID0gKGF3YWl0IHR4QnVpbGRlcl8xLmJ1aWxkKCkpIGFzIFN0YWtpbmdUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SGV4XzEgPSBzaWduZWRUeF8xLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBzaWdfMSA9IEJ1ZmZlci5mcm9tKHNpZ25lZFR4XzEuc2VyaWFsaXplZFNpZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXJGcm9tUmF3XzIgPSBmYWN0b3J5LmdldFN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuZnJvbSh0eEhleF8xKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlXzIgPSB0eF8xLnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIHR4QnVpbGRlckZyb21SYXdfMi5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxIH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHhfMiA9IChhd2FpdCB0eEJ1aWxkZXJGcm9tUmF3XzIuYnVpbGQoKSkgYXMgU3Rha2luZ1RyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhIZXhfMiA9IHNpZ25lZFR4XzIudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHNpZ18yID0gQnVmZmVyLmZyb20oc2lnbmVkVHhfMi5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShzaWduYWJsZV8xKS50b1N0cmluZygnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzIpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMSwgdHhIZXhfMik7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMSwgZXhwZWN0ZWRTdGFraW5nVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzIsIGV4cGVjdGVkU3Rha2luZ1R4SGV4KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgc2lnXzIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18xLCBleHBlY3RlZFN0YWtpbmdUeFNpZyk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzIsIGV4cGVjdGVkU3Rha2luZ1R4U2lnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnN0YWtlKFt0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2VdKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ3R5cGUgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBzZW5kZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnc2VuZGVyIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgZ2FzRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2UpO1xuICAgICAgICB0eEJ1aWxkZXIuc3Rha2UoW3Rlc3REYXRhLnJlcXVlc3RBZGRTdGFrZV0pO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdnYXNEYXRhIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIG1pc3NpbmcgcGF5bWVudCBjb2lucyBpbiBnYXNEYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZSk7XG4gICAgICAgIHR4QnVpbGRlci5zdGFrZShbdGVzdERhdGEucmVxdWVzdEFkZFN0YWtlXSk7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQpKS50aHJvd0Vycm9yKFxuICAgICAgICAgIGBnYXMgcGF5bWVudCBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmdgXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2dhc0RhdGEgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2VuZCBmcm9tIHJhd1R4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLkFERF9TVEFLRSk7XG4gICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZCk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC5pZCwgJ2JQNzhib1o0OHNEZEpzZzJWMXRKYWhwR3lCd2FDOUdTVEwycnZ5QURuc2gnKTtcbiAgICAgIGJ1aWx0VHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBidWlsdFR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiBTVEFLSU5HX0FNT1VOVC50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGJ1aWx0VHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgYnVpbHRUeC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5yZXF1ZXN0QWRkU3Rha2UudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IFNUQUtJTkdfQU1PVU5ULnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QganNvblR4ID0gYnVpbHRUeC50b0pzb24oKTtcbiAgICAgIGpzb25UeC5nYXNEYXRhLnNob3VsZC5kZWVwRXF1YWwodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBqc29uVHgua2luZC5Qcm9ncmFtbWFibGVUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgaW5wdXRzOiB0ZXN0RGF0YS50eElucHV0c0FkZFN0YWtlLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IHRlc3REYXRhLnR4VHJhbnNhY3Rpb25zQWRkU3Rha2UsXG4gICAgICB9KTtcbiAgICAgIGpzb25UeC5zZW5kZXIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGpzb25UeC5nYXNEYXRhLnNob3VsZC5kZWVwRXF1YWwodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFERF9TVEFLRSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnVW5zdGFraW5nIFRYJywgYXN5bmMgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAgIGJ1aWxkZXJzID0gW2ZhY3RvcnkuZ2V0VW5zdGFraW5nQnVpbGRlcigpXTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gdW5zdGFraW5nIHRyYW5zYWN0aW9uIGFuZCBzZXJpYWxpemUgaXQgYW5kIGRlc2VyaWFsaXplIGl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRVbnN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZSk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci51bnN0YWtlKHRlc3REYXRhLnJlcXVlc3RXaXRoZHJhd1N0YWtlZFN1aSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLldJVEhEUkFXX1NUQUtFRF9TVUkpO1xuICAgICAgY29uc3QgcmVzZXJpYWxpemVkID0gYXdhaXQgZmFjdG9yeS5mcm9tKHJhd1R4KS5idWlsZCgpO1xuICAgICAgcmVzZXJpYWxpemVkLnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIHNpZ24gYSBzdGFraW5nIHR4IHdpdGggZ2FzUGF5bWVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VW5zdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2UpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIudW5zdGFrZSh0ZXN0RGF0YS5yZXF1ZXN0V2l0aGRyYXdTdGFrZWRTdWkpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlkLCAnUml4ejlDMnlRNmpERkZzb3ZVczg0WTZ5dzJkY284SEg0UWhLN1JDUVlObycpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0RGF0YS5XSVRIRFJBV19TVEFLRURfU1VJKTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGF3YWl0IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0NsYWltKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pZCwgJ1JpeHo5QzJ5UTZqREZGc292VXM4NFk2eXcyZGNvOEhINFFoSzdSQ1FZTm8nKTtcblxuICAgICAgY29uc3QgcmF3U2lnbmVkVHggPSBzaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJhd1NpZ25lZFR4LCB0ZXN0RGF0YS5XSVRIRFJBV19TVEFLRURfU1VJKTtcbiAgICAgIGNvbnN0IHJlc2VyaWFsaXplZFR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdTaWduZWRUeCk7XG4gICAgICByZXNlcmlhbGl6ZWRUeEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlc2VyaWFsaXplZCA9IGF3YWl0IHJlc2VyaWFsaXplZFR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICByZXNlcmlhbGl6ZWQuc2hvdWxkLmJlLmRlZXBFcXVhbChzaWduZWRUeCk7XG4gICAgICByZXNlcmlhbGl6ZWQudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3U2lnbmVkVHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiBhIHN0YWtpbmcgdHJhbnNhY3Rpb24gd2l0aCBwcml2YXRlIGtleXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyU2VuZGVyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTEgfSk7XG4gICAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0ga2V5UGFpclNlbmRlci5nZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBleHBlY3RlZFN0YWtpbmdUeFNpZyA9XG4gICAgICAgICdBQnF3YU9Jc3haamYvTElFOTg1U0pLMmxINTZvTnhJdUhWcFpoTis2TDl1WkZZRnVpcGE2enNnNWZucHJ4dUJQSVVWVG9ydzN5RUpjb0tOR1p3T3BRZ0tsemFxMWo0d011Q2lYdUZXNG9qRmZ1b0JoRWlCeS9LNGVCNUJrSForZVp3PT0nO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTdGFraW5nVHhIZXggPVxuICAgICAgICAnQUFBQ0FRRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQlFFQUFBQUFBQUFBQVFFQTdtMzhQYU11SVZRYUt1cmZ6U1VQaWdvanUzcTlxY2lZaEFmOE1nYU1OMFpoQkFBQUFBQUFBQ0RKWUNXVUZpczZIYXd6eEd5RXJ2UlQwM3BZYXlSbGlMa2kwa1lzVjBYQ0JBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNS2MzVnBYM041YzNSbGJSWnlaWEYxWlhOMFgzZHBkR2hrY21GM1gzTjBZV3RsQUFJQkFBQUJBUUNRQjBLN2tqNnBCcVZ2TWxvWFdYZFM3Tk9zTUNhN3FXNE8zL1JkNk5zenF3SjNBYmlJd1dNNW1zMWJnRVl6d2REbE1yd3hROC92Tk1vMkMrWUh4bzNONzJZRUFBQUFBQUFBSURyTWNFT1RpZGpPZHA3YTFKL2pqSjl0T2piNlAyV1R5QlN3UXFBSGlBMS95ZlZsYStjWUl3RTlrMzRHVk9zKzNMSmhsYS9TTUFtK21ybHVmejh0d2dObUJBQUFBQUFBQUNBaFhua1hvYlMyRS9SWi9jTERRL24zQkgvVHhBakt2NVZ4c2JMRVpDVXh1NUFIUXJ1U1Bxa0dwVzh5V2hkWmQxTHMwNnd3SnJ1cGJnN2Y5RjNvMnpPcjZBTUFBQUFBQUFBQUxURUJBQUFBQUFBPSc7XG5cbiAgICAgIGNvbnN0IGNvaW5zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgZGlnZXN0OiAnNHhYVEdoaHROVWpCVThuTWl2c0xXVE1SV3ZaUmM1UldETWd5VE1ublJEWVMnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHg3NzAxYjg4OGMxNjMzOTlhY2Q1YjgwNDYzM2MxZDBlNTMyYmMzMTQzY2ZlZjM0Y2EzNjBiZTYwN2M2OGRjZGVmJyxcbiAgICAgICAgICB2ZXJzaW9uOiAxMTI2LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGlnZXN0OiAnM0ZHMU5mazVIclExdFdZS1M4Qlg5eW5aVFNwckw1aExuM3BndzdrZGoxUlUnLFxuICAgICAgICAgIG9iamVjdElkOiAnMHhjOWY1NjU2YmU3MTgyMzAxM2Q5MzdlMDY1NGViM2VkY2IyNjE5NWFmZDIzMDA5YmU5YWI5NmU3ZjNmMmRjMjAzJyxcbiAgICAgICAgICB2ZXJzaW9uOiAxMTI2LFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcl8xID0gZmFjdG9yeS5nZXRVbnN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXJfMS50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlKTtcbiAgICAgIHR4QnVpbGRlcl8xLnNlbmRlcihzZW5kZXJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlcl8xLnVuc3Rha2UodGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpKTtcbiAgICAgIGNvbnN0IGdhc0RhdGE6IEdhc0RhdGEgPSB7XG4gICAgICAgIHBheW1lbnQ6IGNvaW5zLFxuICAgICAgICBvd25lcjogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYnVkZ2V0OiB0ZXN0RGF0YS5HQVNfQlVER0VULFxuICAgICAgICBwcmljZTogMTAwMCxcbiAgICAgIH07XG4gICAgICB0eEJ1aWxkZXJfMS5nYXNEYXRhKGdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eF8xID0gYXdhaXQgdHhCdWlsZGVyXzEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNpZ25hYmxlXzEgPSB0eF8xLnNpZ25hYmxlUGF5bG9hZDtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZV8xID0ga2V5UGFpclNlbmRlci5zaWduTWVzc2FnZWluVWludDhBcnJheShzaWduYWJsZV8xKTtcbiAgICAgIHR4QnVpbGRlcl8xLmFkZFNpZ25hdHVyZSh7IHB1Yjoga2V5UGFpclNlbmRlci5nZXRLZXlzKCkucHViIH0sIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZV8xKSk7XG4gICAgICBjb25zdCBzaWduZWRUeF8xID0gKGF3YWl0IHR4QnVpbGRlcl8xLmJ1aWxkKCkpIGFzIFVuc3Rha2luZ1RyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhIZXhfMSA9IHNpZ25lZFR4XzEudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHNpZ18xID0gQnVmZmVyLmZyb20oc2lnbmVkVHhfMS5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlckZyb21SYXdfMiA9IGZhY3RvcnkuZ2V0VW5zdGFraW5nQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyRnJvbVJhd18yLmZyb20odHhIZXhfMSk7XG4gICAgICBjb25zdCBzaWduYWJsZV8yID0gdHhfMS5zaWduYWJsZVBheWxvYWQ7XG4gICAgICB0eEJ1aWxkZXJGcm9tUmF3XzIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4XzIgPSAoYXdhaXQgdHhCdWlsZGVyRnJvbVJhd18yLmJ1aWxkKCkpIGFzIFVuc3Rha2luZ1RyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhIZXhfMiA9IHNpZ25lZFR4XzIudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHNpZ18yID0gQnVmZmVyLmZyb20oc2lnbmVkVHhfMi5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShzaWduYWJsZV8xKS50b1N0cmluZygnaGV4JyksIEJ1ZmZlci5mcm9tKHNpZ25hYmxlXzIpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMSwgdHhIZXhfMik7XG4gICAgICBzaG91bGQuZXF1YWwodHhIZXhfMSwgZXhwZWN0ZWRTdGFraW5nVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SGV4XzIsIGV4cGVjdGVkU3Rha2luZ1R4SGV4KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWdfMSwgc2lnXzIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ18xLCBleHBlY3RlZFN0YWtpbmdUeFNpZyk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnXzIsIGV4cGVjdGVkU3Rha2luZ1R4U2lnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgdHhCdWlsZGVyLnVuc3Rha2UodGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ3R5cGUgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBzZW5kZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR4QnVpbGRlciBvZiBidWlsZGVycykge1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZSk7XG4gICAgICAgIHR4QnVpbGRlci51bnN0YWtlKHRlc3REYXRhLnJlcXVlc3RXaXRoZHJhd1N0YWtlZFN1aSk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdzZW5kZXIgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgaWYgbWlzc2luZyBnYXNEYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB0eEJ1aWxkZXIgb2YgYnVpbGRlcnMpIHtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlKTtcbiAgICAgICAgdHhCdWlsZGVyLnVuc3Rha2UodGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpKTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnZ2FzRGF0YSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiBtaXNzaW5nIHBheW1lbnQgY29pbnMgaW4gZ2FzRGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgdHhCdWlsZGVyIG9mIGJ1aWxkZXJzKSB7XG4gICAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZSk7XG4gICAgICAgIHR4QnVpbGRlci51bnN0YWtlKHRlc3REYXRhLnJlcXVlc3RXaXRoZHJhd1N0YWtlZFN1aSk7XG4gICAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQpKS50aHJvd0Vycm9yKFxuICAgICAgICAgIGBnYXMgcGF5bWVudCBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmdgXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2dhc0RhdGEgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2VuZCBmcm9tIHJhd1R4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLldJVEhEUkFXX1NUQUtFRF9TVUkpO1xuICAgICAgY29uc3QgYnVpbHRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC5pZCwgJ1JpeHo5QzJ5UTZqREZGc292VXM4NFk2eXcyZGNvOEhINFFoSzdSQ1FZTm8nKTtcbiAgICAgIGJ1aWx0VHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBidWlsdFR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVxdWVzdFdpdGhkcmF3U3Rha2VkU3VpLnN0YWtlZFN1aS5vYmplY3RJZCxcbiAgICAgICAgdmFsdWU6IEFNT1VOVF9VTktOT1dOX1RFWFQsXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgYnVpbHRUeC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBidWlsdFR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogQU1PVU5UX1VOS05PV05fVEVYVCxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBqc29uVHggPSBidWlsdFR4LnRvSnNvbigpO1xuICAgICAganNvblR4Lmdhc0RhdGEuc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGpzb25UeC5raW5kLlByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBpbnB1dHM6IHRlc3REYXRhLnR4SW5wdXRXaXRoZHJhd1N0YWtlZCxcbiAgICAgICAgdHJhbnNhY3Rpb25zOiB0ZXN0RGF0YS50eFRyYW5zYWN0aW9uc1dpdGhkcmF3U3Rha2VkLFxuICAgICAgfSk7XG4gICAgICBqc29uVHguc2VuZGVyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBqc29uVHguZ2FzRGF0YS5zaG91bGQuZGVlcEVxdWFsKHRlc3REYXRhLmdhc0RhdGEpO1xuICAgICAgYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5XSVRIRFJBV19TVEFLRURfU1VJKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGV0ZXJtaW5lIGNvcnJlY3QgdHlwZSBmb3Igd2l0aGRyYXdhbCB3aXRoIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5XSVRIRFJBV19TVEFLRURfU1VJX1dJVEhfQU1PVU5UKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdDbGFpbSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnQ3VzdG9tIFRYJywgYXN5bmMgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2lnbiBhIGN1c3RvbSB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXJTZW5kZXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJpdmF0ZUtleXMucHJ2S2V5MSB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKENVU1RPTV9UWF9TVEFLSU5HX1BPT0xfU1BMSVQpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgc2lnbmFibGUgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBjb25zdCBzaWduYXR1cmVCeXRlcyA9IGtleVBhaXJTZW5kZXIuc2lnbk1lc3NhZ2VpblVpbnQ4QXJyYXkoc2lnbmFibGUpO1xuICAgICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjoga2V5UGFpclNlbmRlci5nZXRLZXlzKCkucHViIH0sIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZUJ5dGVzKSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgQ3VzdG9tVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzaWduZWRUeEhleCA9IHNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHhIZXgsIHVuc2lnbmVkVHhIZXgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4LnNpZ25hdHVyZVswXSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlQnl0ZXMpLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTaWcgPSBCdWZmZXIuZnJvbShzaWduZWRUeC5zZXJpYWxpemVkU2lnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIHNlcmlhbGl6ZWRTaWcsXG4gICAgICAgICdBUEdRSG9ZYlZTeUw2TTdsT1FMNXcyWVl6ZWVWY1RNRWJlMFk0alZwaFFBKzBRSHEzVkVEb1hWd0l1a2tMNDR6K3Zxc2VrdmlTNGdRMFp3VVBUV0hGUWlsemFxMWo0d011Q2lYdUZXNG9qRmZ1b0JoRWlCeS9LNGVCNUJrSForZVp3PT0nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGJ1aWxkIGlmIHVuc3VwcG9ydGVkIHR4biB0eXBlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkKCgpID0+IGZhY3RvcnkuZnJvbShVTlNVUFBPUlRFRF9UWCkpLnRocm93RXJyb3IoXG4gICAgICAgICd1bnN1cHBvcnRlZCB0YXJnZXQgbWV0aG9kIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM6OnN0YWtpbmdfcG9vbDo6c3BsaXRfc3Rha2VkX3N1aSdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!