PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-algo/dist/test/unit/lib/transactionBuilder
Просмотр файла: keyRegistrationBuilder.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 statics_1 = require("@bitgo/statics");
const algosdk_1 = __importDefault(require("algosdk"));
const assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const sinon_1 = __importStar(require("sinon"));
const keyRegistrationBuilder_1 = require("../../../../src/lib/keyRegistrationBuilder");
const AlgoResources = __importStar(require("../../../fixtures/resources"));
class StubTransactionBuilder extends keyRegistrationBuilder_1.KeyRegistrationBuilder {
getTransaction() {
return this._transaction;
}
}
describe('Algo KeyRegistration Builder', () => {
const { networks: { testnet }, } = AlgoResources;
const { genesisHash, genesisID } = testnet;
let builder;
const sender = AlgoResources.accounts.account1;
const { rawTx } = AlgoResources;
beforeEach(() => {
const config = statics_1.coins.get('algo');
builder = new StubTransactionBuilder(config);
});
describe('setter validation', () => {
it('should validate voteKey, is set and is a valid string', () => {
should_1.default.doesNotThrow(() => builder.voteKey(sender.voteKey));
});
it('should validate selection key, is set and is a valid string', () => {
should_1.default.doesNotThrow(() => builder.selectionKey(sender.selectionKey));
});
it('should validate voteFirst is gt than 0', () => {
const spy = sinon_1.default.spy(builder, 'validateValue');
assert_1.default.throws(() => builder.voteFirst(-1), (e) => e.message === 'Value cannot be less than zero');
should_1.default.doesNotThrow(() => builder.voteFirst(15));
sinon_1.assert.calledTwice(spy);
});
it('should validate voteLast is gt than 0', () => {
const validateValueSpy = sinon_1.default.spy(builder, 'validateValue');
builder.voteFirst(1);
assert_1.default.throws(() => builder.voteLast(-1), (e) => e.message === 'Value cannot be less than zero');
should_1.default.doesNotThrow(() => builder.voteLast(15));
sinon_1.assert.calledThrice(validateValueSpy);
});
it('should validate vote Key Dilution', () => {
const validateValueSpy = sinon_1.default.spy(builder, 'validateValue');
builder.voteFirst(5).voteLast(18);
should_1.default.doesNotThrow(() => builder.voteKeyDilution(2));
sinon_1.assert.calledThrice(validateValueSpy);
});
});
describe('transaction validation', () => {
beforeEach(() => {
builder.sender({ address: sender.address }).fee({ fee: '1000' }).firstRound(1).lastRound(100).testnet();
});
it('should validate an online transaction', () => {
builder.voteKey(sender.voteKey).selectionKey(sender.selectionKey).voteFirst(1).voteLast(100).voteKeyDilution(9);
should_1.default.doesNotThrow(() => builder.validateTransaction(builder.getTransaction()));
});
});
describe('build key registration transaction', () => {
const requiredFieldErrorRegEx = /Transaction validation failed: "(voteLast|voteKey|voteFirst|voteKeyDilution|selectionKey)" is required/;
it('should build an online key registration transaction without stateProof param', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.voteKey(sender.voteKey)
.selectionKey(sender.selectionKey)
.voteFirst(1)
.voteLast(100)
.voteKeyDilution(9)
.testnet()
.numberOfSigners(1);
builder.sign({ key: sender.prvKey });
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.voteKey }));
should_1.default.deepEqual(txJson.voteKey.toString('base64'), sender.voteKey);
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.selectionKey }));
should_1.default.deepEqual(txJson.selectionKey.toString('base64'), sender.selectionKey);
should_1.default.deepEqual(txJson.from, sender.address);
should_1.default.deepEqual(txJson.firstRound, 1);
should_1.default.deepEqual(txJson.lastRound, 100);
should_1.default.deepEqual(txJson.voteFirst, 1);
should_1.default.deepEqual(txJson.voteLast, 100);
should_1.default.deepEqual(txJson.voteKeyDilution, 9);
should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
});
it('should build an online key registration transaction with stateProof Param', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.voteKey(sender.voteKey)
.selectionKey(sender.selectionKey)
.voteFirst(1)
.voteLast(100)
.voteKeyDilution(9)
.stateProofKey(sender.stateProofKey)
.testnet()
.numberOfSigners(1);
builder.sign({ key: sender.prvKey });
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.voteKey }));
should_1.default.deepEqual(txJson.voteKey.toString('base64'), sender.voteKey);
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.selectionKey }));
should_1.default.deepEqual(txJson.selectionKey.toString('base64'), sender.selectionKey);
should_1.default.deepEqual(txJson.from, sender.address);
should_1.default.deepEqual(txJson.firstRound, 1);
should_1.default.deepEqual(txJson.lastRound, 100);
should_1.default.deepEqual(txJson.voteFirst, 1);
should_1.default.deepEqual(txJson.voteLast, 100);
should_1.default.deepEqual(txJson.voteKeyDilution, 9);
should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
should_1.default.deepEqual(txJson.stateProofKey.toString('base64'), sender.stateProofKey);
});
it('should build an online keyreg transaction with malformated stateProof Param', async () => {
const malformatedStateProofKey = '0x' + '0'.repeat(64);
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.voteKey(sender.voteKey)
.selectionKey(sender.selectionKey)
.voteFirst(1)
.voteLast(100)
.voteKeyDilution(9);
assert_1.default.throws(() => builder.stateProofKey(malformatedStateProofKey), 'Error: Invalid base64 string');
});
it('should build an offline key registration transaction', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.testnet()
.numberOfSigners(1)
.nonParticipation(false);
builder.sign({ key: sender.prvKey });
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.deepEqual(txJson.voteKey, undefined);
should_1.default.deepEqual(txJson.selectionKey, undefined);
should_1.default.deepEqual(txJson.from, sender.address);
should_1.default.deepEqual(txJson.firstRound, 1);
should_1.default.deepEqual(txJson.lastRound, 100);
should_1.default.deepEqual(txJson.voteFirst, undefined);
should_1.default.deepEqual(txJson.voteLast, undefined);
should_1.default.deepEqual(txJson.voteKeyDilution, undefined);
should_1.default.deepEqual(txJson.nonParticipation, undefined);
should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
});
it('should build a key registration transaction with non participation', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.testnet()
.numberOfSigners(1)
.nonParticipation(true);
builder.sign({ key: sender.prvKey });
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.deepEqual(txJson.voteKey, undefined);
should_1.default.deepEqual(txJson.selectionKey, undefined);
should_1.default.deepEqual(txJson.from, sender.address);
should_1.default.deepEqual(txJson.firstRound, 1);
should_1.default.deepEqual(txJson.lastRound, 100);
should_1.default.deepEqual(txJson.voteFirst, undefined);
should_1.default.deepEqual(txJson.voteLast, undefined);
should_1.default.deepEqual(txJson.voteKeyDilution, undefined);
should_1.default.deepEqual(txJson.nonParticipation, true);
should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
});
it('build an offline key registration transaction should thrown an error when it hasfee', async () => {
builder.sender({ address: sender.address }).firstRound(1).lastRound(100).testnet().numberOfSigners(1);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith('Transaction validation failed: "fee" is required');
});
it('build an offline key registration transaction should thrown an error when it has voteLast', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.voteLast(100)
.testnet()
.numberOfSigners(1);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith(requiredFieldErrorRegEx);
});
it('build an offline key registration transaction should thrown an error when it has selectionKey', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.selectionKey(sender.selectionKey)
.testnet()
.numberOfSigners(1);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith(requiredFieldErrorRegEx);
});
it('build an offline key registration transaction should thrown an error when it has voteKeyDilution', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.voteKeyDilution(9)
.testnet()
.numberOfSigners(1);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith(requiredFieldErrorRegEx);
});
it('build an offline key registration transaction should thrown an error when it has voteFirst', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.voteFirst(1)
.testnet()
.numberOfSigners(1);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith(requiredFieldErrorRegEx);
});
it('build an offline key registration transaction should thrown an error when it has voteKey', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.voteKey(sender.voteKey)
.testnet()
.numberOfSigners(1);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith(requiredFieldErrorRegEx);
});
it('build an offline key registration transaction without non participation should thrown an error when it has not first round', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.lastRound(100)
.testnet()
.numberOfSigners(1)
.nonParticipation(false);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith('Transaction validation failed: "firstRound" is required');
});
it('build an offline key registration transaction without non participation should thrown an error when it has not last round', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.testnet()
.numberOfSigners(1)
.nonParticipation(false);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith('Transaction validation failed: "lastRound" is required');
});
it('build an offline key registration transaction without non participation should thrown an error when it has not testnet set', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.numberOfSigners(1)
.nonParticipation(false);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith('Transaction validation failed: "genesisHash" is required');
});
it('should build an unsigned offline key registration transaction', async () => {
builder.sender({ address: sender.address }).fee({ fee: '1000' }).firstRound(1).lastRound(100).testnet();
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.deepEqual(txJson.from, sender.address);
should_1.default.deepEqual(txJson.firstRound, 1);
should_1.default.deepEqual(txJson.lastRound, 100);
should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
});
it('build a key registration transaction with non participation should thrown an error when it has not fee', async () => {
builder
.sender({ address: sender.address })
.firstRound(1)
.lastRound(100)
.testnet()
.numberOfSigners(1)
.nonParticipation(true);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith('Transaction validation failed: "fee" is required');
});
it('build a key registration transaction with non participation should thrown an error when it has not first round', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.lastRound(100)
.testnet()
.numberOfSigners(1)
.nonParticipation(true);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith('Transaction validation failed: "firstRound" is required');
});
it('build a key registration transaction with non participation should thrown an error when it has not last round', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.testnet()
.numberOfSigners(1)
.nonParticipation(true);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith('Transaction validation failed: "lastRound" is required');
});
it('build a key registration transaction with non participation should thrown an error when it has not testnet set', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.numberOfSigners(1)
.nonParticipation(true);
builder.sign({ key: sender.prvKey });
await builder.build().should.be.rejectedWith('Transaction validation failed: "genesisHash" is required');
});
it('should build an unsigned key registration transaction', async () => {
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.voteKey(sender.voteKey)
.selectionKey(sender.selectionKey)
.voteFirst(1)
.voteLast(100)
.voteKeyDilution(9)
.testnet();
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.voteKey }));
should_1.default.deepEqual(txJson.voteKey.toString('base64'), sender.voteKey);
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.selectionKey }));
should_1.default.deepEqual(txJson.selectionKey.toString('base64'), sender.selectionKey);
should_1.default.deepEqual(txJson.from, sender.address);
should_1.default.deepEqual(txJson.firstRound, 1);
should_1.default.deepEqual(txJson.lastRound, 100);
should_1.default.deepEqual(txJson.voteFirst, 1);
should_1.default.deepEqual(txJson.voteLast, 100);
should_1.default.deepEqual(txJson.voteKeyDilution, 9);
should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
});
it('should build a trx from an unsigned raw transaction', async () => {
builder.from(rawTx.keyReg.unsigned);
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.voteKey }));
should_1.default.deepEqual(txJson.voteKey.toString('base64'), sender.voteKey);
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.selectionKey }));
should_1.default.deepEqual(txJson.selectionKey.toString('base64'), sender.selectionKey);
should_1.default.deepEqual(txJson.from, sender.address);
should_1.default.deepEqual(txJson.firstRound, 1);
should_1.default.deepEqual(txJson.lastRound, 100);
should_1.default.deepEqual(txJson.voteFirst, 1);
should_1.default.deepEqual(txJson.voteLast, 100);
should_1.default.deepEqual(txJson.voteKeyDilution, 9);
});
it('should sign from raw unsigned tx', async () => {
builder.from(rawTx.keyReg.unsigned);
builder.numberOfSigners(1);
builder.sign({ key: sender.prvKey });
const tx = await builder.build();
should_1.default.deepEqual(Buffer.from(tx.toBroadcastFormat()).toString('hex'), AlgoResources.rawTx.keyReg.signed);
const txJson = tx.toJson();
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.voteKey }));
should_1.default.deepEqual(txJson.voteKey.toString('base64'), sender.voteKey);
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.selectionKey }));
should_1.default.deepEqual(txJson.selectionKey.toString('base64'), sender.selectionKey);
should_1.default.deepEqual(txJson.from, sender.address);
should_1.default.deepEqual(txJson.firstRound, 1);
should_1.default.deepEqual(txJson.lastRound, 100);
should_1.default.deepEqual(txJson.voteFirst, 1);
should_1.default.deepEqual(txJson.voteLast, 100);
should_1.default.deepEqual(txJson.voteKeyDilution, 9);
});
});
describe('build multi-sig key registration transaction', () => {
it('should build a msig registration transaction', async () => {
const msigAddress = algosdk_1.default.multisigAddress({
version: 1,
threshold: 2,
addrs: [AlgoResources.accounts.account1.address, AlgoResources.accounts.account3.address],
});
builder
.sender({ address: sender.address })
.fee({ fee: '1000' })
.firstRound(1)
.lastRound(100)
.voteKey(sender.voteKey)
.selectionKey(sender.selectionKey)
.voteFirst(1)
.voteLast(100)
.voteKeyDilution(9)
.testnet()
.numberOfSigners(2)
.setSigners([AlgoResources.accounts.account1.address, AlgoResources.accounts.account3.address])
.sign({ key: AlgoResources.accounts.account1.prvKey });
builder.sign({ key: AlgoResources.accounts.account3.prvKey });
const tx = await builder.build();
const txJson = tx.toJson();
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.voteKey }));
should_1.default.deepEqual(txJson.voteKey.toString('base64'), sender.voteKey);
should_1.default.doesNotThrow(() => builder.validateKey({ key: txJson.selectionKey }));
should_1.default.deepEqual(txJson.selectionKey.toString('base64'), sender.selectionKey);
should_1.default.deepEqual(txJson.from, msigAddress);
should_1.default.deepEqual(txJson.firstRound, 1);
should_1.default.deepEqual(txJson.lastRound, 100);
should_1.default.deepEqual(txJson.voteFirst, 1);
should_1.default.deepEqual(txJson.voteLast, 100);
should_1.default.deepEqual(txJson.voteKeyDilution, 9);
should_1.default.deepEqual(txJson.genesisID, genesisID.toString());
should_1.default.deepEqual(txJson.genesisHash.toString('base64'), genesisHash);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UmVnaXN0cmF0aW9uQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9saWIvdHJhbnNhY3Rpb25CdWlsZGVyL2tleVJlZ2lzdHJhdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsc0RBQThCO0FBQzlCLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsK0NBQXFEO0FBRXJELHVGQUFvRjtBQUVwRiwyRUFBNkQ7QUFFN0QsTUFBTSxzQkFBdUIsU0FBUSwrQ0FBc0I7SUFDekQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUFFRCxRQUFRLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO0lBQzVDLE1BQU0sRUFDSixRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FDdEIsR0FBRyxhQUFhLENBQUM7SUFDbEIsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDM0MsSUFBSSxPQUErQixDQUFDO0lBRXBDLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQy9DLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxhQUFhLENBQUM7SUFFaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE1BQU0sTUFBTSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsT0FBTyxHQUFHLElBQUksc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxHQUFHLEVBQUU7WUFDL0QsZ0JBQU0sQ0FBQyxZQUFZ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LFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdFLGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM5RSxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzNDLGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4QyxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkMsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM1QyxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IGFsZ29zZGsgZnJvbSAnYWxnb3Nkayc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgc2lub24sIHsgYXNzZXJ0IGFzIFNpbm9uQXNzZXJ0IH0gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL2tleVJlZ2lzdHJhdGlvbkJ1aWxkZXInO1xuXG5pbXBvcnQgKiBhcyBBbGdvUmVzb3VyY2VzIGZyb20gJy4uLy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5cbmNsYXNzIFN0dWJUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgZ2V0VHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxufVxuXG5kZXNjcmliZSgnQWxnbyBLZXlSZWdpc3RyYXRpb24gQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3Qge1xuICAgIG5ldHdvcmtzOiB7IHRlc3RuZXQgfSxcbiAgfSA9IEFsZ29SZXNvdXJjZXM7XG4gIGNvbnN0IHsgZ2VuZXNpc0hhc2gsIGdlbmVzaXNJRCB9ID0gdGVzdG5ldDtcbiAgbGV0IGJ1aWxkZXI6IFN0dWJUcmFuc2FjdGlvbkJ1aWxkZXI7XG5cbiAgY29uc3Qgc2VuZGVyID0gQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50MTtcbiAgY29uc3QgeyByYXdUeCB9ID0gQWxnb1Jlc291cmNlcztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBjb2lucy5nZXQoJ2FsZ28nKTtcbiAgICBidWlsZGVyID0gbmV3IFN0dWJUcmFuc2FjdGlvbkJ1aWxkZXIoY29uZmlnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NldHRlciB2YWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdm90ZUtleSwgaXMgc2V0IGFuZCBpcyBhIHZhbGlkIHN0cmluZycsICgpID0+IHtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52b3RlS2V5KHNlbmRlci52b3RlS2V5KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHNlbGVjdGlvbiBrZXksIGlzIHNldCBhbmQgaXMgYSB2YWxpZCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuc2VsZWN0aW9uS2V5KHNlbmRlci5zZWxlY3Rpb25LZXkpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdm90ZUZpcnN0IGlzIGd0IHRoYW4gMCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweShidWlsZGVyLCAndmFsaWRhdGVWYWx1ZScpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci52b3RlRmlyc3QoLTEpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSA9PT0gJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybydcbiAgICAgICk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudm90ZUZpcnN0KDE1KSk7XG4gICAgICBTaW5vbkFzc2VydC5jYWxsZWRUd2ljZShzcHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB2b3RlTGFzdCBpcyBndCB0aGFuIDAnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0ZVZhbHVlU3B5ID0gc2lub24uc3B5KGJ1aWxkZXIsICd2YWxpZGF0ZVZhbHVlJyk7XG4gICAgICBidWlsZGVyLnZvdGVGaXJzdCgxKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIudm90ZUxhc3QoLTEpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSA9PT0gJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybydcbiAgICAgICk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudm90ZUxhc3QoMTUpKTtcbiAgICAgIFNpbm9uQXNzZXJ0LmNhbGxlZFRocmljZSh2YWxpZGF0ZVZhbHVlU3B5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdm90ZSBLZXkgRGlsdXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0ZVZhbHVlU3B5ID0gc2lub24uc3B5KGJ1aWxkZXIsICd2YWxpZGF0ZVZhbHVlJyk7XG4gICAgICBidWlsZGVyLnZvdGVGaXJzdCg1KS52b3RlTGFzdCgxOCk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudm90ZUtleURpbHV0aW9uKDIpKTtcbiAgICAgIFNpbm9uQXNzZXJ0LmNhbGxlZFRocmljZSh2YWxpZGF0ZVZhbHVlU3B5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBidWlsZGVyLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pLmZlZSh7IGZlZTogJzEwMDAnIH0pLmZpcnN0Um91bmQoMSkubGFzdFJvdW5kKDEwMCkudGVzdG5ldCgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYW4gb25saW5lIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgYnVpbGRlci52b3RlS2V5KHNlbmRlci52b3RlS2V5KS5zZWxlY3Rpb25LZXkoc2VuZGVyLnNlbGVjdGlvbktleSkudm90ZUZpcnN0KDEpLnZvdGVMYXN0KDEwMCkudm90ZUtleURpbHV0aW9uKDkpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oYnVpbGRlci5nZXRUcmFuc2FjdGlvbigpKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBrZXkgcmVnaXN0cmF0aW9uIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlcXVpcmVkRmllbGRFcnJvclJlZ0V4ID1cbiAgICAgIC9UcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZDogXCIodm90ZUxhc3R8dm90ZUtleXx2b3RlRmlyc3R8dm90ZUtleURpbHV0aW9ufHNlbGVjdGlvbktleSlcIiBpcyByZXF1aXJlZC87XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuIG9ubGluZSBrZXkgcmVnaXN0cmF0aW9uIHRyYW5zYWN0aW9uIHdpdGhvdXQgc3RhdGVQcm9vZiBwYXJhbScsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC5mZWUoeyBmZWU6ICcxMDAwJyB9KVxuICAgICAgICAuZmlyc3RSb3VuZCgxKVxuICAgICAgICAubGFzdFJvdW5kKDEwMClcbiAgICAgICAgLnZvdGVLZXkoc2VuZGVyLnZvdGVLZXkpXG4gICAgICAgIC5zZWxlY3Rpb25LZXkoc2VuZGVyLnNlbGVjdGlvbktleSlcbiAgICAgICAgLnZvdGVGaXJzdCgxKVxuICAgICAgICAudm90ZUxhc3QoMTAwKVxuICAgICAgICAudm90ZUtleURpbHV0aW9uKDkpXG4gICAgICAgIC50ZXN0bmV0KClcbiAgICAgICAgLm51bWJlck9mU2lnbmVycygxKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogc2VuZGVyLnBydktleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHR4SnNvbi52b3RlS2V5IH0pKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVLZXkudG9TdHJpbmcoJ2Jhc2U2NCcpLCBzZW5kZXIudm90ZUtleSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHR4SnNvbi5zZWxlY3Rpb25LZXkgfSkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uc2VsZWN0aW9uS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSwgc2VuZGVyLnNlbGVjdGlvbktleSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCBzZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5maXJzdFJvdW5kLCAxKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmxhc3RSb3VuZCwgMTAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVGaXJzdCwgMSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlTGFzdCwgMTAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVLZXlEaWx1dGlvbiwgOSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nZW5lc2lzSUQsIGdlbmVzaXNJRC50b1N0cmluZygpKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmdlbmVzaXNIYXNoLnRvU3RyaW5nKCdiYXNlNjQnKSwgZ2VuZXNpc0hhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiBvbmxpbmUga2V5IHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbiB3aXRoIHN0YXRlUHJvb2YgUGFyYW0nLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAuZmVlKHsgZmVlOiAnMTAwMCcgfSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLmxhc3RSb3VuZCgxMDApXG4gICAgICAgIC52b3RlS2V5KHNlbmRlci52b3RlS2V5KVxuICAgICAgICAuc2VsZWN0aW9uS2V5KHNlbmRlci5zZWxlY3Rpb25LZXkpXG4gICAgICAgIC52b3RlRmlyc3QoMSlcbiAgICAgICAgLnZvdGVMYXN0KDEwMClcbiAgICAgICAgLnZvdGVLZXlEaWx1dGlvbig5KVxuICAgICAgICAuc3RhdGVQcm9vZktleShzZW5kZXIuc3RhdGVQcm9vZktleSlcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDEpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBzZW5kZXIucHJ2S2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogdHhKc29uLnZvdGVLZXkgfSkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUtleS50b1N0cmluZygnYmFzZTY0JyksIHNlbmRlci52b3RlS2V5KTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogdHhKc29uLnNlbGVjdGlvbktleSB9KSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5zZWxlY3Rpb25LZXkudG9TdHJpbmcoJ2Jhc2U2NCcpLCBzZW5kZXIuc2VsZWN0aW9uS2V5KTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZyb20sIHNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZpcnN0Um91bmQsIDEpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubGFzdFJvdW5kLCAxMDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUZpcnN0LCAxKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVMYXN0LCAxMDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUtleURpbHV0aW9uLCA5KTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmdlbmVzaXNJRCwgZ2VuZXNpc0lELnRvU3RyaW5nKCkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZ2VuZXNpc0hhc2gudG9TdHJpbmcoJ2Jhc2U2NCcpLCBnZW5lc2lzSGFzaCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5zdGF0ZVByb29mS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSwgc2VuZGVyLnN0YXRlUHJvb2ZLZXkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiBvbmxpbmUga2V5cmVnIHRyYW5zYWN0aW9uIHdpdGggbWFsZm9ybWF0ZWQgc3RhdGVQcm9vZiBQYXJhbScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1hbGZvcm1hdGVkU3RhdGVQcm9vZktleSA9ICcweCcgKyAnMCcucmVwZWF0KDY0KTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5maXJzdFJvdW5kKDEpXG4gICAgICAgIC5sYXN0Um91bmQoMTAwKVxuICAgICAgICAudm90ZUtleShzZW5kZXIudm90ZUtleSlcbiAgICAgICAgLnNlbGVjdGlvbktleShzZW5kZXIuc2VsZWN0aW9uS2V5KVxuICAgICAgICAudm90ZUZpcnN0KDEpXG4gICAgICAgIC52b3RlTGFzdCgxMDApXG4gICAgICAgIC52b3RlS2V5RGlsdXRpb24oOSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuc3RhdGVQcm9vZktleShtYWxmb3JtYXRlZFN0YXRlUHJvb2ZLZXkpLCAnRXJyb3I6IEludmFsaWQgYmFzZTY0IHN0cmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiBvZmZsaW5lIGtleSByZWdpc3RyYXRpb24gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAuZmVlKHsgZmVlOiAnMTAwMCcgfSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLmxhc3RSb3VuZCgxMDApXG4gICAgICAgIC50ZXN0bmV0KClcbiAgICAgICAgLm51bWJlck9mU2lnbmVycygxKVxuICAgICAgICAubm9uUGFydGljaXBhdGlvbihmYWxzZSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHNlbmRlci5wcnZLZXkgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUtleSwgdW5kZWZpbmVkKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnNlbGVjdGlvbktleSwgdW5kZWZpbmVkKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZyb20sIHNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZpcnN0Um91bmQsIDEpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubGFzdFJvdW5kLCAxMDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUZpcnN0LCB1bmRlZmluZWQpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUxhc3QsIHVuZGVmaW5lZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlS2V5RGlsdXRpb24sIHVuZGVmaW5lZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5ub25QYXJ0aWNpcGF0aW9uLCB1bmRlZmluZWQpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZ2VuZXNpc0lELCBnZW5lc2lzSUQudG9TdHJpbmcoKSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nZW5lc2lzSGFzaC50b1N0cmluZygnYmFzZTY0JyksIGdlbmVzaXNIYXNoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBrZXkgcmVnaXN0cmF0aW9uIHRyYW5zYWN0aW9uIHdpdGggbm9uIHBhcnRpY2lwYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAuZmVlKHsgZmVlOiAnMTAwMCcgfSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLmxhc3RSb3VuZCgxMDApXG4gICAgICAgIC50ZXN0bmV0KClcbiAgICAgICAgLm51bWJlck9mU2lnbmVycygxKVxuICAgICAgICAubm9uUGFydGljaXBhdGlvbih0cnVlKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogc2VuZGVyLnBydktleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlS2V5LCB1bmRlZmluZWQpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uc2VsZWN0aW9uS2V5LCB1bmRlZmluZWQpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmlyc3RSb3VuZCwgMSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5sYXN0Um91bmQsIDEwMCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlRmlyc3QsIHVuZGVmaW5lZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlTGFzdCwgdW5kZWZpbmVkKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVLZXlEaWx1dGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLm5vblBhcnRpY2lwYXRpb24sIHRydWUpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZ2VuZXNpc0lELCBnZW5lc2lzSUQudG9TdHJpbmcoKSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nZW5lc2lzSGFzaC50b1N0cmluZygnYmFzZTY0JyksIGdlbmVzaXNIYXNoKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhbiBvZmZsaW5lIGtleSByZWdpc3RyYXRpb24gdHJhbnNhY3Rpb24gc2hvdWxkIHRocm93biBhbiBlcnJvciB3aGVuIGl0IGhhc2ZlZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSkuZmlyc3RSb3VuZCgxKS5sYXN0Um91bmQoMTAwKS50ZXN0bmV0KCkubnVtYmVyT2ZTaWduZXJzKDEpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBzZW5kZXIucHJ2S2V5IH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1RyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkOiBcImZlZVwiIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYW4gb2ZmbGluZSBrZXkgcmVnaXN0cmF0aW9uIHRyYW5zYWN0aW9uIHNob3VsZCB0aHJvd24gYW4gZXJyb3Igd2hlbiBpdCBoYXMgdm90ZUxhc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAuZmVlKHsgZmVlOiAnMTAwMCcgfSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLmxhc3RSb3VuZCgxMDApXG4gICAgICAgIC52b3RlTGFzdCgxMDApXG4gICAgICAgIC50ZXN0bmV0KClcbiAgICAgICAgLm51bWJlck9mU2lnbmVycygxKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogc2VuZGVyLnBydktleSB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKHJlcXVpcmVkRmllbGRFcnJvclJlZ0V4KTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhbiBvZmZsaW5lIGtleSByZWdpc3RyYXRpb24gdHJhbnNhY3Rpb24gc2hvdWxkIHRocm93biBhbiBlcnJvciB3aGVuIGl0IGhhcyBzZWxlY3Rpb25LZXknLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAuZmVlKHsgZmVlOiAnMTAwMCcgfSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLmxhc3RSb3VuZCgxMDApXG4gICAgICAgIC5zZWxlY3Rpb25LZXkoc2VuZGVyLnNlbGVjdGlvbktleSlcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDEpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBzZW5kZXIucHJ2S2V5IH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgocmVxdWlyZWRGaWVsZEVycm9yUmVnRXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGFuIG9mZmxpbmUga2V5IHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbiBzaG91bGQgdGhyb3duIGFuIGVycm9yIHdoZW4gaXQgaGFzIHZvdGVLZXlEaWx1dGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC5mZWUoeyBmZWU6ICcxMDAwJyB9KVxuICAgICAgICAuZmlyc3RSb3VuZCgxKVxuICAgICAgICAubGFzdFJvdW5kKDEwMClcbiAgICAgICAgLnZvdGVLZXlEaWx1dGlvbig5KVxuICAgICAgICAudGVzdG5ldCgpXG4gICAgICAgIC5udW1iZXJPZlNpZ25lcnMoMSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHNlbmRlci5wcnZLZXkgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChyZXF1aXJlZEZpZWxkRXJyb3JSZWdFeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYW4gb2ZmbGluZSBrZXkgcmVnaXN0cmF0aW9uIHRyYW5zYWN0aW9uIHNob3VsZCB0aHJvd24gYW4gZXJyb3Igd2hlbiBpdCBoYXMgdm90ZUZpcnN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5maXJzdFJvdW5kKDEpXG4gICAgICAgIC5sYXN0Um91bmQoMTAwKVxuICAgICAgICAudm90ZUZpcnN0KDEpXG4gICAgICAgIC50ZXN0bmV0KClcbiAgICAgICAgLm51bWJlck9mU2lnbmVycygxKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogc2VuZGVyLnBydktleSB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKHJlcXVpcmVkRmllbGRFcnJvclJlZ0V4KTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhbiBvZmZsaW5lIGtleSByZWdpc3RyYXRpb24gdHJhbnNhY3Rpb24gc2hvdWxkIHRocm93biBhbiBlcnJvciB3aGVuIGl0IGhhcyB2b3RlS2V5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5maXJzdFJvdW5kKDEpXG4gICAgICAgIC5sYXN0Um91bmQoMTAwKVxuICAgICAgICAudm90ZUtleShzZW5kZXIudm90ZUtleSlcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDEpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBzZW5kZXIucHJ2S2V5IH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgocmVxdWlyZWRGaWVsZEVycm9yUmVnRXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGFuIG9mZmxpbmUga2V5IHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbiB3aXRob3V0IG5vbiBwYXJ0aWNpcGF0aW9uIHNob3VsZCB0aHJvd24gYW4gZXJyb3Igd2hlbiBpdCBoYXMgbm90IGZpcnN0IHJvdW5kJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5sYXN0Um91bmQoMTAwKVxuICAgICAgICAudGVzdG5ldCgpXG4gICAgICAgIC5udW1iZXJPZlNpZ25lcnMoMSlcbiAgICAgICAgLm5vblBhcnRpY2lwYXRpb24oZmFsc2UpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBzZW5kZXIucHJ2S2V5IH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1RyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkOiBcImZpcnN0Um91bmRcIiBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGFuIG9mZmxpbmUga2V5IHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbiB3aXRob3V0IG5vbiBwYXJ0aWNpcGF0aW9uIHNob3VsZCB0aHJvd24gYW4gZXJyb3Igd2hlbiBpdCBoYXMgbm90IGxhc3Qgcm91bmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAuZmVlKHsgZmVlOiAnMTAwMCcgfSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDEpXG4gICAgICAgIC5ub25QYXJ0aWNpcGF0aW9uKGZhbHNlKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogc2VuZGVyLnBydktleSB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZDogXCJsYXN0Um91bmRcIiBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGFuIG9mZmxpbmUga2V5IHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbiB3aXRob3V0IG5vbiBwYXJ0aWNpcGF0aW9uIHNob3VsZCB0aHJvd24gYW4gZXJyb3Igd2hlbiBpdCBoYXMgbm90IHRlc3RuZXQgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5maXJzdFJvdW5kKDEpXG4gICAgICAgIC5sYXN0Um91bmQoMTAwKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDEpXG4gICAgICAgIC5ub25QYXJ0aWNpcGF0aW9uKGZhbHNlKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogc2VuZGVyLnBydktleSB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZDogXCJnZW5lc2lzSGFzaFwiIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuIHVuc2lnbmVkIG9mZmxpbmUga2V5IHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSkuZmVlKHsgZmVlOiAnMTAwMCcgfSkuZmlyc3RSb3VuZCgxKS5sYXN0Um91bmQoMTAwKS50ZXN0bmV0KCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmlyc3RSb3VuZCwgMSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5sYXN0Um91bmQsIDEwMCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nZW5lc2lzSUQsIGdlbmVzaXNJRC50b1N0cmluZygpKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmdlbmVzaXNIYXNoLnRvU3RyaW5nKCdiYXNlNjQnKSwgZ2VuZXNpc0hhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEga2V5IHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbiB3aXRoIG5vbiBwYXJ0aWNpcGF0aW9uIHNob3VsZCB0aHJvd24gYW4gZXJyb3Igd2hlbiBpdCBoYXMgbm90IGZlZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC5maXJzdFJvdW5kKDEpXG4gICAgICAgIC5sYXN0Um91bmQoMTAwKVxuICAgICAgICAudGVzdG5ldCgpXG4gICAgICAgIC5udW1iZXJPZlNpZ25lcnMoMSlcbiAgICAgICAgLm5vblBhcnRpY2lwYXRpb24odHJ1ZSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHNlbmRlci5wcnZLZXkgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQ6IFwiZmVlXCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIGtleSByZWdpc3RyYXRpb24gdHJhbnNhY3Rpb24gd2l0aCBub24gcGFydGljaXBhdGlvbiBzaG91bGQgdGhyb3duIGFuIGVycm9yIHdoZW4gaXQgaGFzIG5vdCBmaXJzdCByb3VuZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC5mZWUoeyBmZWU6ICcxMDAwJyB9KVxuICAgICAgICAubGFzdFJvdW5kKDEwMClcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDEpXG4gICAgICAgIC5ub25QYXJ0aWNpcGF0aW9uKHRydWUpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBzZW5kZXIucHJ2S2V5IH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1RyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkOiBcImZpcnN0Um91bmRcIiBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEga2V5IHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbiB3aXRoIG5vbiBwYXJ0aWNpcGF0aW9uIHNob3VsZCB0aHJvd24gYW4gZXJyb3Igd2hlbiBpdCBoYXMgbm90IGxhc3Qgcm91bmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAuZmVlKHsgZmVlOiAnMTAwMCcgfSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDEpXG4gICAgICAgIC5ub25QYXJ0aWNpcGF0aW9uKHRydWUpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiBzZW5kZXIucHJ2S2V5IH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ1RyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkOiBcImxhc3RSb3VuZFwiIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSBrZXkgcmVnaXN0cmF0aW9uIHRyYW5zYWN0aW9uIHdpdGggbm9uIHBhcnRpY2lwYXRpb24gc2hvdWxkIHRocm93biBhbiBlcnJvciB3aGVuIGl0IGhhcyBub3QgdGVzdG5ldCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAuZmVlKHsgZmVlOiAnMTAwMCcgfSlcbiAgICAgICAgLmZpcnN0Um91bmQoMSlcbiAgICAgICAgLmxhc3RSb3VuZCgxMDApXG4gICAgICAgIC5udW1iZXJPZlNpZ25lcnMoMSlcbiAgICAgICAgLm5vblBhcnRpY2lwYXRpb24odHJ1ZSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHNlbmRlci5wcnZLZXkgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQ6IFwiZ2VuZXNpc0hhc2hcIiBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiB1bnNpZ25lZCBrZXkgcmVnaXN0cmF0aW9uIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5maXJzdFJvdW5kKDEpXG4gICAgICAgIC5sYXN0Um91bmQoMTAwKVxuICAgICAgICAudm90ZUtleShzZW5kZXIudm90ZUtleSlcbiAgICAgICAgLnNlbGVjdGlvbktleShzZW5kZXIuc2VsZWN0aW9uS2V5KVxuICAgICAgICAudm90ZUZpcnN0KDEpXG4gICAgICAgIC52b3RlTGFzdCgxMDApXG4gICAgICAgIC52b3RlS2V5RGlsdXRpb24oOSlcbiAgICAgICAgLnRlc3RuZXQoKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHR4SnNvbi52b3RlS2V5IH0pKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVLZXkudG9TdHJpbmcoJ2Jhc2U2NCcpLCBzZW5kZXIudm90ZUtleSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHR4SnNvbi5zZWxlY3Rpb25LZXkgfSkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uc2VsZWN0aW9uS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSwgc2VuZGVyLnNlbGVjdGlvbktleSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCBzZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5maXJzdFJvdW5kLCAxKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmxhc3RSb3VuZCwgMTAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVGaXJzdCwgMSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlTGFzdCwgMTAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVLZXlEaWx1dGlvbiwgOSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nZW5lc2lzSUQsIGdlbmVzaXNJRC50b1N0cmluZygpKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmdlbmVzaXNIYXNoLnRvU3RyaW5nKCdiYXNlNjQnKSwgZ2VuZXNpc0hhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyeCBmcm9tIGFuIHVuc2lnbmVkIHJhdyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXIuZnJvbShyYXdUeC5rZXlSZWcudW5zaWduZWQpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogdHhKc29uLnZvdGVLZXkgfSkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUtleS50b1N0cmluZygnYmFzZTY0JyksIHNlbmRlci52b3RlS2V5KTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogdHhKc29uLnNlbGVjdGlvbktleSB9KSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5zZWxlY3Rpb25LZXkudG9TdHJpbmcoJ2Jhc2U2NCcpLCBzZW5kZXIuc2VsZWN0aW9uS2V5KTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZyb20sIHNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZpcnN0Um91bmQsIDEpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24ubGFzdFJvdW5kLCAxMDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUZpcnN0LCAxKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVMYXN0LCAxMDApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUtleURpbHV0aW9uLCA5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBmcm9tIHJhdyB1bnNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXIuZnJvbShyYXdUeC5rZXlSZWcudW5zaWduZWQpO1xuICAgICAgYnVpbGRlci5udW1iZXJPZlNpZ25lcnMoMSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHNlbmRlci5wcnZLZXkgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoQnVmZmVyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkudG9TdHJpbmcoJ2hleCcpLCBBbGdvUmVzb3VyY2VzLnJhd1R4LmtleVJlZy5zaWduZWQpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHR4SnNvbi52b3RlS2V5IH0pKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVLZXkudG9TdHJpbmcoJ2Jhc2U2NCcpLCBzZW5kZXIudm90ZUtleSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHR4SnNvbi5zZWxlY3Rpb25LZXkgfSkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uc2VsZWN0aW9uS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSwgc2VuZGVyLnNlbGVjdGlvbktleSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCBzZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5maXJzdFJvdW5kLCAxKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmxhc3RSb3VuZCwgMTAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVGaXJzdCwgMSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlTGFzdCwgMTAwKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnZvdGVLZXlEaWx1dGlvbiwgOSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBtdWx0aS1zaWcga2V5IHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgbXNpZyByZWdpc3RyYXRpb24gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtc2lnQWRkcmVzcyA9IGFsZ29zZGsubXVsdGlzaWdBZGRyZXNzKHtcbiAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICBhZGRyczogW0FsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcywgQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50My5hZGRyZXNzXSxcbiAgICAgIH0pO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLmZlZSh7IGZlZTogJzEwMDAnIH0pXG4gICAgICAgIC5maXJzdFJvdW5kKDEpXG4gICAgICAgIC5sYXN0Um91bmQoMTAwKVxuICAgICAgICAudm90ZUtleShzZW5kZXIudm90ZUtleSlcbiAgICAgICAgLnNlbGVjdGlvbktleShzZW5kZXIuc2VsZWN0aW9uS2V5KVxuICAgICAgICAudm90ZUZpcnN0KDEpXG4gICAgICAgIC52b3RlTGFzdCgxMDApXG4gICAgICAgIC52b3RlS2V5RGlsdXRpb24oOSlcbiAgICAgICAgLnRlc3RuZXQoKVxuICAgICAgICAubnVtYmVyT2ZTaWduZXJzKDIpXG4gICAgICAgIC5zZXRTaWduZXJzKFtBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsIEFsZ29SZXNvdXJjZXMuYWNjb3VudHMuYWNjb3VudDMuYWRkcmVzc10pXG4gICAgICAgIC5zaWduKHsga2V5OiBBbGdvUmVzb3VyY2VzLmFjY291bnRzLmFjY291bnQxLnBydktleSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogQWxnb1Jlc291cmNlcy5hY2NvdW50cy5hY2NvdW50My5wcnZLZXkgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlS2V5KHsga2V5OiB0eEpzb24udm90ZUtleSB9KSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSwgc2VuZGVyLnZvdGVLZXkpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlS2V5KHsga2V5OiB0eEpzb24uc2VsZWN0aW9uS2V5IH0pKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnNlbGVjdGlvbktleS50b1N0cmluZygnYmFzZTY0JyksIHNlbmRlci5zZWxlY3Rpb25LZXkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgbXNpZ0FkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmlyc3RSb3VuZCwgMSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5sYXN0Um91bmQsIDEwMCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlRmlyc3QsIDEpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24udm90ZUxhc3QsIDEwMCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi52b3RlS2V5RGlsdXRpb24sIDkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZ2VuZXNpc0lELCBnZW5lc2lzSUQudG9TdHJpbmcoKSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5nZW5lc2lzSGFzaC50b1N0cmluZygnYmFzZTY0JyksIGdlbmVzaXNIYXNoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!