PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-algo/dist/test/unit/lib
Просмотр файла: utils.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 assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const algosdk_1 = __importDefault(require("algosdk"));
const utils_1 = __importDefault(require("../../../src/lib/utils"));
const src_1 = require("../../../src");
const AlgoResources = __importStar(require("../../fixtures/resources"));
describe('utils', () => {
const { accounts: { account1, account2, account3 }, base64Txn: { validTxn, invalidTxn, invalidTxn2 }, } = AlgoResources;
it('should properly encode an algorand address from an ed25519 public key', () => {
should_1.default.equal(utils_1.default.publicKeyToAlgoAddress(account1.pubKey), account1.address);
should_1.default.equal(utils_1.default.publicKeyToAlgoAddress(account2.pubKey), account2.address);
should_1.default.equal(utils_1.default.publicKeyToAlgoAddress(account3.pubKey), account3.address);
});
it('should encode an object from a string message', () => {
const note = Buffer.from('hola mundo', 'base64');
const objEncoded = src_1.AlgoLib.algoUtils.encodeObj(note);
const objEncodedByAlgo = algosdk_1.default.encodeObj(note);
should_1.default.deepEqual(objEncoded, objEncodedByAlgo);
});
it('should return a mnemonic from a secret key ', () => {
const keyPair = new src_1.AlgoLib.KeyPair();
const keys = keyPair.getKeys();
let mn;
let mnAlgo;
if (keys.prv) {
mn = src_1.AlgoLib.algoUtils.secretKeyToMnemonic(Buffer.from(keys.prv, 'hex'));
mnAlgo = algosdk_1.default.secretKeyToMnemonic(Buffer.from(keys.prv, 'hex'));
}
should_1.default.equal(mn, mnAlgo);
});
it('it should return error if the secret key is invalid', () => {
const secretKeyInValid = '9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f6$';
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.secretKeyToMnemonic(Buffer.from(secretKeyInValid, 'hex')), /The secret key: 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f is invalid/);
});
it('should return a seed from a mnemonic ', () => {
const mnemonic = 'green office boost casino shoe army peace damp mimic this brand economy second sudden credit give coast match brick add good exact brand about neck';
const seed = src_1.AlgoLib.algoUtils.seedFromMnemonic(mnemonic);
const seedAlgo = algosdk_1.default.mnemonicToMasterDerivationKey(mnemonic);
should_1.default.deepEqual(seed, seedAlgo);
});
it('it should return error if the mnemonic is invalid', () => {
const mnemonicInValid = 'crisp hello solution ten remove object watch enhance future rather biology era myth image swap crash coffee scatter buffalo depart day twist advance about unfair';
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.seedFromMnemonic(mnemonicInValid), new RegExp('the mnemonic contains a word that is not in the wordlist'));
});
it('should reuturn a keyPair from seed', () => {
const mnemonic = 'green office boost casino shoe army peace damp mimic this brand economy second sudden credit give coast match brick add good exact brand about neck';
const seed = src_1.AlgoLib.algoUtils.seedFromMnemonic(mnemonic);
const keyPairAlgo = src_1.AlgoLib.algoUtils.keyPairFromSeed(seed);
const { sk } = algosdk_1.default.mnemonicToSecretKey(mnemonic);
const skOnly = Buffer.from(sk.slice(0, 32)).toString('hex');
const keyPair = new src_1.AlgoLib.KeyPair({ prv: skOnly });
should_1.default.deepEqual(keyPairAlgo, keyPair);
});
it('it should return error if the seed is invalid', () => {
const seedInValid = new Uint8Array(Buffer.from('9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f6$', 'hex'));
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.keyPairFromSeed(seedInValid), /Seed length must be 32/);
});
it('should generate the same keyPair with which it started', () => {
const keyPair = new src_1.AlgoLib.KeyPair();
const keys = keyPair.getKeys();
const mnemonic = keys.prv
? src_1.AlgoLib.algoUtils.secretKeyToMnemonic(Buffer.from(keys.prv, 'hex'))
: 'green office boost casino shoe army peace damp mimic this brand economy second sudden credit give coast match brick add good exact brand about neck';
const seed = src_1.AlgoLib.algoUtils.seedFromMnemonic(mnemonic);
const keyPairAlgo = src_1.AlgoLib.algoUtils.keyPairFromSeed(seed);
should_1.default.deepEqual(keyPair, keyPairAlgo);
});
it('stellarAddressToAlgoAddress should convert a XLM address to ALGO address', () => {
const xlmAddress1 = 'GDV4ZW7UBRSQAHLORJPQF4L6OZJBKU3ZIVS2O6C7WWGSNZOV42JDHPMF';
const xlmAddress2 = 'GACWEU7LB4D5GGK23BDOAL3D3KWN77Y5FVTH2CTEMY5MC6TQMGGQMZNS';
const algoAddress1 = '5PGNX5AMMUAB23UKL4BPC7TWKIKVG6KFMWTXQX5VRUTOLVPGSIZSHUA7HU';
const algoAddress2 = 'AVRFH2YPA7JRSWWYI3QC6Y62VTP76HJNMZ6QUZDGHLAXU4DBRUDEGBSW2U';
const result1 = src_1.AlgoLib.algoUtils.stellarAddressToAlgoAddress(xlmAddress1);
const result2 = src_1.AlgoLib.algoUtils.stellarAddressToAlgoAddress(xlmAddress2);
should_1.default.equal(result1, algoAddress1);
should_1.default.equal(result2, algoAddress2);
});
it('stellarAddressToAlgoAddress should not change a valid ALGO address', () => {
const algoAddress = 'X4GMYVKF6VVNKA4Q4AUSRUYXYCGQSY7DZS7QXVJC33VYQTRUKCU7DDFE2U';
const result = src_1.AlgoLib.algoUtils.stellarAddressToAlgoAddress(algoAddress);
should_1.default.equal(result, algoAddress);
});
it('stellarAddressToAlgoAddress should return error if the xlm and algoaddress are invalid', () => {
const xlmAddress = 'GDV4ZW7UBRSQAHLORJPQF4L6OZJBKU3ZIVS2O6C7WWGSNZOV42JDHPM/';
const algoAddress = '5PGNX5AMMUAB23UKL4BPC7TWKIKVG6KFMWTXQX5VRUTOLVPGSIZSHUA7H/';
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.stellarAddressToAlgoAddress(xlmAddress), new RegExp('Neither an Algorand address nor a stellar pubkey'));
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.stellarAddressToAlgoAddress(algoAddress), new RegExp('Neither an Algorand address nor a stellar pubkey'));
});
it('should decode same address', () => {
const address = algosdk_1.default.decodeAddress(account1.address);
const addressAlgo = src_1.AlgoLib.algoUtils.decodeAddress(account1.address);
should_1.default.deepEqual(address, addressAlgo);
});
it('should returns error when invalid address', () => {
const invalidAddress1 = '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5QT/';
const invalidAddress2 = '25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5QTEF';
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.decodeAddress(invalidAddress1), /Error: Invalid base32 characters/);
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.decodeAddress(invalidAddress2), /Error: address seems to be malformed/);
});
it('multisigAddress should return the same string with accountLib and algosdk', () => {
const version = 1;
const threshold = 1;
const addrs = ['25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5QTE'];
const accountLibResult = src_1.AlgoLib.algoUtils.multisigAddress(version, threshold, addrs);
const algosdkResult = algosdk_1.default.multisigAddress({ version, threshold, addrs });
should_1.default.deepEqual(algosdkResult, accountLibResult);
});
it('multisigAddress should fail when threshold is 2', () => {
const version = 1;
const threshold = 2;
const addrs = ['X4GMYVKF6VVNKA4Q4AUSRUYXYCGQSY7DZS7QXVJC33VYQTRUKCU7DDFE2U'];
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.multisigAddress(version, threshold, addrs), /Error: bad multisig threshold/);
});
it('multisigAddress should fail when threshold is 3', () => {
const version = 1;
const threshold = 3;
const addrs = ['X4GMYVKF6VVNKA4Q4AUSRUYXYCGQSY7DZS7QXVJC33VYQTRUKCU7DDFE2U'];
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.multisigAddress(version, threshold, addrs), /Error: bad multisig threshold/);
});
it('multisigAddress should fail when version is 2', () => {
const version = 2;
const threshold = 1;
const addrs = ['25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5QTE'];
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.multisigAddress(version, threshold, addrs), /Error: invalid multisig version/);
});
it('multisigAddress should fail when address is not valid', () => {
const version = 1;
const threshold = 1;
const addrs = ['25NJQAMCWEFLPVKL73J4SZAHHIHOC4XT3KTCGJNPAINGR5YHKENMEF5QT-'];
assert_1.default.throws(() => src_1.AlgoLib.algoUtils.multisigAddress(version, threshold, addrs), /Error: Invalid base32 characters/);
});
it('generateAccount should of create a valid addres and valid secretKey', () => {
const account = src_1.AlgoLib.algoUtils.generateAccount();
const isValid = src_1.AlgoLib.algoUtils.isValidAddress(account.addr);
const isValidSecretKey = src_1.AlgoLib.algoUtils.isValidPrivateKey(Buffer.from(account.sk).toString('hex'));
should_1.default.equal(isValid, true);
should_1.default.equal(isValidSecretKey, true);
});
it('should validate a valid seed', () => {
const isValid = src_1.AlgoLib.algoUtils.isValidSeed('O52I55AZNYPG266JBZSG33G2RKDKFM7UVEBVWJ25UES7MBGP6BQW6467XU');
should_1.default.equal(isValid, true);
});
it('should not validate an invalid seed', () => {
const isValid = src_1.AlgoLib.algoUtils.isValidSeed('O52I55AZNYPG266JBZSG33G2RKDKFM7UVEBVWJ25UES7MBGP6BQW6467X$');
should_1.default.equal(isValid, false);
});
it('should not validate a seed with invalid length', () => {
const isValid = src_1.AlgoLib.algoUtils.isValidSeed('O52I55AZNYPG266JBZSG33G2RKDKFM7UVEBVWJ25UES7MBGP6BQW6467XUDSFD');
should_1.default.equal(isValid, false);
});
it('should verify a valid signature', () => {
const pub = Buffer.from([
23, 105, 203, 242, 76, 245, 135, 179, 225, 133, 67, 83, 51, 23, 208, 60, 11, 107, 219, 137, 211, 13, 249, 236,
176, 47, 118, 91, 96, 208, 98, 255,
]);
const msg = Buffer.from([
85, 71, 70, 77, 53, 53, 76, 51, 82, 68, 78, 78, 53, 81, 88, 87, 50, 68, 88, 51, 90, 76, 80, 50, 89, 78, 73, 82,
71, 72, 87, 50, 85, 73, 69, 89, 84, 54, 84, 85, 75, 71, 79, 68, 68, 67, 72, 66, 50, 79, 77, 78, 81, 70, 87, 55,
55, 52,
]);
const sign = Buffer.from([
47, 113, 122, 6, 171, 235, 80, 105, 32, 237, 94, 174, 5, 30, 228, 73, 5, 211, 245, 51, 187, 252, 124, 109, 241,
174, 203, 34, 132, 41, 101, 197, 42, 134, 251, 76, 91, 92, 118, 112, 235, 111, 208, 234, 163, 203, 149, 160, 233,
95, 210, 253, 249, 106, 7, 245, 2, 222, 154, 180, 198, 152, 32, 3,
]);
const isValid = src_1.AlgoLib.algoUtils.verifySignature(msg, sign, pub);
should_1.default.equal(isValid, true);
});
it('should not verify a invalid signature', () => {
const pub = Buffer.from([
23, 105, 203, 242, 76, 245, 135, 179, 225, 133, 67, 83, 51, 23, 208, 60, 11, 107, 219, 137, 211, 13, 249, 236,
176, 47, 118, 91, 96, 208, 98, 255,
]);
const msg = Buffer.from([
85, 71, 70, 77, 53, 53, 76, 51, 82, 68, 78, 78, 53, 81, 88, 87, 50, 68, 88, 51, 90, 76, 80, 50, 89, 78, 73, 82,
71, 72, 87, 50, 85, 73, 69, 89, 84, 54, 84, 85, 75, 71, 79, 68, 68, 67, 72, 66, 50, 79, 77, 78, 81, 70, 87, 55,
55, 52,
]);
const invalidSign = Buffer.from([
47, 113, 122, 6, 171, 235, 80, 105, 32, 237, 94, 174, 5, 30, 228, 73, 5, 211, 245, 51, 187, 252, 124, 109, 241,
174, 203, 34, 132, 41, 101, 197, 42, 134, 251, 76, 91, 92, 118, 112, 235, 111, 208, 234, 163, 203, 149, 160, 233,
95, 210, 253, 249, 106, 7, 245, 2, 222, 154, 180, 198, 150, 45, 6,
]);
const isValid = src_1.AlgoLib.algoUtils.verifySignature(msg, invalidSign, pub);
should_1.default.equal(isValid, false);
});
it('should not verify a valid signature with invalid public key', () => {
const invalidPub = Buffer.from([
23, 105, 203, 242, 76, 245, 135, 179, 225, 133, 67, 83, 51, 23, 208, 60, 11, 107, 219, 137, 211, 13, 249, 236,
176, 47, 118, 91, 96, 200, 90, 50,
]);
const msg = Buffer.from([
85, 71, 70, 77, 53, 53, 76, 51, 82, 68, 78, 78, 53, 81, 88, 87, 50, 68, 88, 51, 90, 76, 80, 50, 89, 78, 73, 82,
71, 72, 87, 50, 85, 73, 69, 89, 84, 54, 84, 85, 75, 71, 79, 68, 68, 67, 72, 66, 50, 79, 77, 78, 81, 70, 87, 55,
55, 52,
]);
const sign = Buffer.from([
47, 113, 122, 6, 171, 235, 80, 105, 32, 237, 94, 174, 5, 30, 228, 73, 5, 211, 245, 51, 187, 252, 124, 109, 241,
174, 203, 34, 132, 41, 101, 197, 42, 134, 251, 76, 91, 92, 118, 112, 235, 111, 208, 234, 163, 203, 149, 160, 233,
95, 210, 253, 249, 106, 7, 245, 2, 222, 154, 180, 198, 152, 32, 3,
]);
const isValid = src_1.AlgoLib.algoUtils.verifySignature(msg, sign, invalidPub);
should_1.default.equal(isValid, false);
});
it('should verify a valid signature with invalid message', () => {
const pub = Buffer.from([
23, 105, 203, 242, 76, 245, 135, 179, 225, 133, 67, 83, 51, 23, 208, 60, 11, 107, 219, 137, 211, 13, 249, 236,
176, 47, 118, 91, 96, 208, 98, 255,
]);
const invalidMsg = Buffer.from([
85, 71, 70, 77, 53, 53, 76, 51, 82, 68, 78, 78, 53, 81, 88, 87, 50, 68, 88, 51, 90, 76, 80, 50, 89, 78, 73, 82,
71, 72, 87, 50, 85, 73, 69, 89, 84, 54, 84, 85, 75, 71, 79, 68, 68, 67, 72, 66, 50, 79, 77, 78, 81, 70, 87, 50,
50, 50,
]);
const sign = Buffer.from([
47, 113, 122, 6, 171, 235, 80, 105, 32, 237, 94, 174, 5, 30, 228, 73, 5, 211, 245, 51, 187, 252, 124, 109, 241,
174, 203, 34, 132, 41, 101, 197, 42, 134, 251, 76, 91, 92, 118, 112, 235, 111, 208, 234, 163, 203, 149, 160, 233,
95, 210, 253, 249, 106, 7, 245, 2, 222, 154, 180, 198, 152, 32, 3,
]);
const isValid = src_1.AlgoLib.algoUtils.verifySignature(invalidMsg, sign, pub);
should_1.default.equal(isValid, false);
});
it('Should be able to get a txID from a multising Tx', () => {
const rawTxn = validTxn.txn;
const txId = src_1.AlgoLib.algoUtils.getMultisigTxID(rawTxn);
should_1.default.equal(txId, validTxn.txid);
});
it('Should not be able to get a txID from an incomplete multising Tx', () => {
const rawTxn = invalidTxn.txn;
assert_1.default.throws(() => {
src_1.AlgoLib.algoUtils.getMultisigTxID(rawTxn);
}, 'RangeError: Insufficient data');
});
it('Should not be able to get a txID from a simple Tx', () => {
const rawTxn = invalidTxn2.txn;
assert_1.default.throws(() => {
src_1.AlgoLib.algoUtils.getMultisigTxID(rawTxn);
}, 'Error: The object contains empty or 0 values. First empty or 0 value encountered during encoding: msig');
});
it('Should return enableToken', () => {
const amount = '0';
const from = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
const to = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
const closeRemainderTo = '';
src_1.AlgoLib.algoUtils.getTokenTxType(amount, from, to, closeRemainderTo).should.equal('enableToken');
});
it('Should return disableToken', () => {
const amount = '0';
const from = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
const to = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
const closeRemainderTo = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
src_1.AlgoLib.algoUtils.getTokenTxType(amount, from, to, closeRemainderTo).should.equal('disableToken');
});
it('Should return transferToken when "from" and "to" are different ', () => {
const amount = '0';
const from = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
const to = 'SP745JJR4KPRQEXJZHVIEN736LYTL2T2DFMG3OIIFJBV66K73PHNMDCZVM';
const closeRemainderTo = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
src_1.AlgoLib.algoUtils.getTokenTxType(amount, from, to, closeRemainderTo).should.equal('transferToken');
});
it('Should return transferToken when amount is not 0', () => {
const amount = '1000';
const from = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
const to = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
const closeRemainderTo = 'R275HNKEXC3AI3CYL2PPOGP2AFA4XCRDO2CCREGCVDX6OJAZ54MBD7VLYA';
src_1.AlgoLib.algoUtils.getTokenTxType(amount, from, to, closeRemainderTo).should.equal('transferToken');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixzREFBOEI7QUFDOUIsbUVBQTJDO0FBQzNDLHNDQUErQztBQUMvQyx3RUFBMEQ7QUFFMUQsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7SUFDckIsTUFBTSxFQUNKLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQzFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQ2pELEdBQUcsYUFBYSxDQUFDO0lBRWxCLEVBQUUsQ0FBQyx1RUFBdUUsRUFBRSxHQUFHLEVBQUU7UUFDL0UsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLGFBQUksQ0FBQyxTQUFTLENB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QUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUM5RyxFQUFFLEVBQUUsRUFBRTtTQUNQLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDdkIsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUM5RyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDaEgsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQ2xFLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0QsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtRQUMvQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3RCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUM3RyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRztTQUNuQyxDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUM5RyxFQUFFLEVBQUUsRUFBRTtTQUNQLENBQUMsQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDOUIsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUM5RyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDaEgsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQ2xFLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEdBQUcsRUFBRTtRQUNyRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUM3RyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtTQUNsQyxDQUFDLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3RCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUM5RyxFQUFFLEVBQUUsRUFBRTtTQUNQLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDdkIsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUM5RyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDaEgsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQ2xFLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtRQUM5RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3RCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUM3RyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRztTQUNuQyxDQUFDLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzdCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUM5RyxFQUFFLEVBQUUsRUFBRTtTQUNQLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDdkIsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztZQUM5RyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7WUFDaEgsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO1NBQ2xFLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFF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LGFBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IGFsZ29zZGsgZnJvbSAnYWxnb3Nkayc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBBbGdvTGliIGFzIEFsZ28gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgQWxnb1Jlc291cmNlcyBmcm9tICcuLi8uLi9maXh0dXJlcy9yZXNvdXJjZXMnO1xuXG5kZXNjcmliZSgndXRpbHMnLCAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhY2NvdW50czogeyBhY2NvdW50MSwgYWNjb3VudDIsIGFjY291bnQzIH0sXG4gICAgYmFzZTY0VHhuOiB7IHZhbGlkVHhuLCBpbnZhbGlkVHhuLCBpbnZhbGlkVHhuMiB9LFxuICB9ID0gQWxnb1Jlc291cmNlcztcblxuICBpdCgnc2hvdWxkIHByb3Blcmx5IGVuY29kZSBhbiBhbGdvcmFuZCBhZGRyZXNzIGZyb20gYW4gZWQyNTUxOSBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgIHNob3VsZC5lcXVhbCh1dGlscy5wdWJsaWNLZXlUb0FsZ29BZGRyZXNzKGFjY291bnQxLnB1YktleSksIGFjY291bnQxLmFkZHJlc3MpO1xuICAgIHNob3VsZC5lcXVhbCh1dGlscy5wdWJsaWNLZXlUb0FsZ29BZGRyZXNzKGFjY291bnQyLnB1YktleSksIGFjY291bnQyLmFkZHJlc3MpO1xuICAgIHNob3VsZC5lcXVhbCh1dGlscy5wdWJsaWNLZXlUb0FsZ29BZGRyZXNzKGFjY291bnQzLnB1YktleSksIGFjY291bnQzLmFkZHJlc3MpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVuY29kZSBhbiBvYmplY3QgZnJvbSBhIHN0cmluZyBtZXNzYWdlJywgKCkgPT4ge1xuICAgIGNvbnN0IG5vdGUgPSBCdWZmZXIuZnJvbSgnaG9sYSBtdW5kbycsICdiYXNlNjQnKTtcbiAgICBjb25zdCBvYmpFbmNvZGVkID0gQWxnby5hbGdvVXRpbHMuZW5jb2RlT2JqKG5vdGUpO1xuICAgIGNvbnN0IG9iakVuY29kZWRCeUFsZ28gPSBhbGdvc2RrLmVuY29kZU9iaihub3RlKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKG9iakVuY29kZWQsIG9iakVuY29kZWRCeUFsZ28pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBhIG1uZW1vbmljIGZyb20gYSBzZWNyZXQga2V5ICcsICgpID0+IHtcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IEFsZ28uS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBsZXQgbW47XG4gICAgbGV0IG1uQWxnbztcbiAgICBpZiAoa2V5cy5wcnYpIHtcbiAgICAgIG1uID0gQWxnby5hbGdvVXRpbHMuc2VjcmV0S2V5VG9NbmVtb25pYyhCdWZmZXIuZnJvbShrZXlzLnBydiwgJ2hleCcpKTtcbiAgICAgIG1uQWxnbyA9IGFsZ29zZGsuc2VjcmV0S2V5VG9NbmVtb25pYyhCdWZmZXIuZnJvbShrZXlzLnBydiwgJ2hleCcpKTtcbiAgICB9XG4gICAgc2hvdWxkLmVxdWFsKG1uLCBtbkFsZ28pO1xuICB9KTtcblxuICBpdCgnaXQgc2hvdWxkIHJldHVybiBlcnJvciBpZiB0aGUgc2VjcmV0IGtleSBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgIGNvbnN0IHNlY3JldEtleUluVmFsaWQgPSAnOWQ2MWIxOWRlZmZkNWE2MGJhODQ0YWY0OTJlYzJjYzQ0NDQ5YzU2OTdiMzI2OTE5NzAzYmFjMDMxY2FlN2Y2JCc7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IEFsZ28uYWxnb1V0aWxzLnNlY3JldEtleVRvTW5lbW9uaWMoQnVmZmVyLmZyb20oc2VjcmV0S2V5SW5WYWxpZCwgJ2hleCcpKSxcbiAgICAgIC9UaGUgc2VjcmV0IGtleTogOWQ2MWIxOWRlZmZkNWE2MGJhODQ0YWY0OTJlYzJjYzQ0NDQ5YzU2OTdiMzI2OTE5NzAzYmFjMDMxY2FlN2YgaXMgaW52YWxpZC9cbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBhIHNlZWQgZnJvbSBhIG1uZW1vbmljICcsICgpID0+IHtcbiAgICBjb25zdCBtbmVtb25pYyA9XG4gICAgICAnZ3JlZW4gb2ZmaWNlIGJvb3N0IGNhc2lubyBzaG9lIGFybXkgcGVhY2UgZGFtcCBtaW1pYyB0aGlzIGJyYW5kIGVjb25vbXkgc2Vjb25kIHN1ZGRlbiBjcmVkaXQgZ2l2ZSBjb2FzdCBtYXRjaCBicmljayBhZGQgZ29vZCBleGFjdCBicmFuZCBhYm91dCBuZWNrJztcbiAgICBjb25zdCBzZWVkID0gQWxnby5hbGdvVXRpbHMuc2VlZEZyb21NbmVtb25pYyhtbmVtb25pYyk7XG4gICAgY29uc3Qgc2VlZEFsZ28gPSBhbGdvc2RrLm1uZW1vbmljVG9NYXN0ZXJEZXJpdmF0aW9uS2V5KG1uZW1vbmljKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHNlZWQsIHNlZWRBbGdvKTtcbiAgfSk7XG5cbiAgaXQoJ2l0IHNob3VsZCByZXR1cm4gZXJyb3IgaWYgdGhlIG1uZW1vbmljIGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgY29uc3QgbW5lbW9uaWNJblZhbGlkID1cbiAgICAgICdjcmlzcCBoZWxsbyBzb2x1dGlvbiB0ZW4gcmVtb3ZlIG9iamVjdCB3YXRjaCBlbmhhbmNlIGZ1dHVyZSByYXRoZXIgYmlvbG9neSBlcmEgbXl0aCBpbWFnZSBzd2FwIGNyYXNoIGNvZmZlZSBzY2F0dGVyIGJ1ZmZhbG8gZGVwYXJ0IGRheSB0d2lzdCBhZHZhbmNlIGFib3V0IHVuZmFpcic7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IEFsZ28uYWxnb1V0aWxzLnNlZWRGcm9tTW5lbW9uaWMobW5lbW9uaWNJblZhbGlkKSxcbiAgICAgIG5ldyBSZWdFeHAoJ3RoZSBtbmVtb25pYyBjb250YWlucyBhIHdvcmQgdGhhdCBpcyBub3QgaW4gdGhlIHdvcmRsaXN0JylcbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldXR1cm4gYSBrZXlQYWlyIGZyb20gc2VlZCcsICgpID0+IHtcbiAgICBjb25zdCBtbmVtb25pYyA9XG4gICAgICAnZ3JlZW4gb2ZmaWNlIGJvb3N0IGNhc2lubyBzaG9lIGFybXkgcGVhY2UgZGFtcCBtaW1pYyB0aGlzIGJyYW5kIGVjb25vbXkgc2Vjb25kIHN1ZGRlbiBjcmVkaXQgZ2l2ZSBjb2FzdCBtYXRjaCBicmljayBhZGQgZ29vZCBleGFjdCBicmFuZCBhYm91dCBuZWNrJztcbiAgICBjb25zdCBzZWVkID0gQWxnby5hbGdvVXRpbHMuc2VlZEZyb21NbmVtb25pYyhtbmVtb25pYyk7XG4gICAgY29uc3Qga2V5UGFpckFsZ28gPSBBbGdvLmFsZ29VdGlscy5rZXlQYWlyRnJvbVNlZWQoc2VlZCk7XG4gICAgY29uc3QgeyBzayB9ID0gYWxnb3Nkay5tbmVtb25pY1RvU2VjcmV0S2V5KG1uZW1vbmljKTtcbiAgICBjb25zdCBza09ubHkgPSBCdWZmZXIuZnJvbShzay5zbGljZSgwLCAzMikpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IEFsZ28uS2V5UGFpcih7IHBydjogc2tPbmx5IH0pO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoa2V5UGFpckFsZ28sIGtleVBhaXIpO1xuICB9KTtcblxuICBpdCgnaXQgc2hvdWxkIHJldHVybiBlcnJvciBpZiB0aGUgc2VlZCBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgIGNvbnN0IHNlZWRJblZhbGlkID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgICBCdWZmZXIuZnJvbSgnOWQ2MWIxOWRlZmZkNWE2MGJhODQ0YWY0OTJlYzJjYzQ0NDQ5YzU2OTdiMzI2OTE5NzAzYmFjMDMxY2FlN2Y2JCcsICdoZXgnKVxuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBBbGdvLmFsZ29VdGlscy5rZXlQYWlyRnJvbVNlZWQoc2VlZEluVmFsaWQpLCAvU2VlZCBsZW5ndGggbXVzdCBiZSAzMi8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIGtleVBhaXIgd2l0aCB3aGljaCBpdCBzdGFydGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgQWxnby5LZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgIGNvbnN0IG1uZW1vbmljID0ga2V5cy5wcnZcbiAgICAgID8gQWxnby5hbGdvVXRpbHMuc2VjcmV0S2V5VG9NbmVtb25pYyhCdWZmZXIuZnJvbShrZXlzLnBydiwgJ2hleCcpKVxuICAgICAgOiAnZ3JlZW4gb2ZmaWNlIGJvb3N0IGNhc2lubyBzaG9lIGFybXkgcGVhY2UgZGFtcCBtaW1pYyB0aGlzIGJyYW5kIGVjb25vbXkgc2Vjb25kIHN1ZGRlbiBjcmVkaXQgZ2l2ZSBjb2FzdCBtYXRjaCBicmljayBhZGQgZ29vZCBleGFjdCBicmFuZCBhYm91dCBuZWNrJztcbiAgICBjb25zdCBzZWVkID0gQWxnby5hbGdvVXRpbHMuc2VlZEZyb21NbmVtb25pYyhtbmVtb25pYyk7XG4gICAgY29uc3Qga2V5UGFpckFsZ28gPSBBbGdvLmFsZ29VdGlscy5rZXlQYWlyRnJvbVNlZWQoc2VlZCk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChrZXlQYWlyLCBrZXlQYWlyQWxnbyk7XG4gIH0pO1xuXG4gIGl0KCdzdGVsbGFyQWRkcmVzc1RvQWxnb0FkZHJlc3Mgc2hvdWxkIGNvbnZlcnQgYSBYTE0gYWRkcmVzcyB0byBBTEdPIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3QgeGxtQWRkcmVzczEgPSAnR0RWNFpXN1VCUlNRQUhMT1JKUFFGNEw2T1pKQktVM1pJVlMyTzZDN1dXR1NOWk9WNDJKREhQTUYnO1xuICAgIGNvbnN0IHhsbUFkZHJlc3MyID0gJ0dBQ1dFVTdMQjRENUdHSzIzQkRPQUwzRDNLV043N1k1RlZUSDJDVEVNWTVNQzZUUU1HR1FNWk5TJztcbiAgICBjb25zdCBhbGdvQWRkcmVzczEgPSAnNVBHTlg1QU1NVUFCMjNVS0w0QlBDN1RXS0lLVkc2S0ZNV1RYUVg1VlJVVE9MVlBHU0laU0hVQTdIVSc7XG4gICAgY29uc3QgYWxnb0FkZHJlc3MyID0gJ0FWUkZIMllQQTdKUlNXV1lJM1FDNlk2MlZUUDc2SEpOTVo2UVVaREdITEFYVTREQlJVREVHQlNXMlUnO1xuXG4gICAgY29uc3QgcmVzdWx0MSA9IEFsZ28uYWxnb1V0aWxzLnN0ZWxsYXJBZGRyZXNzVG9BbGdvQWRkcmVzcyh4bG1BZGRyZXNzMSk7XG4gICAgY29uc3QgcmVzdWx0MiA9IEFsZ28uYWxnb1V0aWxzLnN0ZWxsYXJBZGRyZXNzVG9BbGdvQWRkcmVzcyh4bG1BZGRyZXNzMik7XG5cbiAgICBzaG91bGQuZXF1YWwocmVzdWx0MSwgYWxnb0FkZHJlc3MxKTtcbiAgICBzaG91bGQuZXF1YWwocmVzdWx0MiwgYWxnb0FkZHJlc3MyKTtcbiAgfSk7XG5cbiAgaXQoJ3N0ZWxsYXJBZGRyZXNzVG9BbGdvQWRkcmVzcyBzaG91bGQgbm90IGNoYW5nZSBhIHZhbGlkIEFMR08gYWRkcmVzcycsICgpID0+IHtcbiAgICBjb25zdCBhbGdvQWRkcmVzcyA9ICdYNEdNWVZLRjZWVk5LQTRRNEFVU1JVWVhZQ0dRU1k3RFpTN1FYVkpDMzNWWVFUUlVLQ1U3RERGRTJVJztcbiAgICBjb25zdCByZXN1bHQgPSBBbGdvLmFsZ29VdGlscy5zdGVsbGFyQWRkcmVzc1RvQWxnb0FkZHJlc3MoYWxnb0FkZHJlc3MpO1xuXG4gICAgc2hvdWxkLmVxdWFsKHJlc3VsdCwgYWxnb0FkZHJlc3MpO1xuICB9KTtcblxuICBpdCgnc3RlbGxhckFkZHJlc3NUb0FsZ29BZGRyZXNzIHNob3VsZCByZXR1cm4gZXJyb3IgaWYgdGhlIHhsbSBhbmQgYWxnb2FkZHJlc3MgYXJlIGludmFsaWQnLCAoKSA9PiB7XG4gICAgY29uc3QgeGxtQWRkcmVzcyA9ICdHRFY0Wlc3VUJSU1FBSExPUkpQUUY0TDZPWkpCS1UzWklWUzJPNkM3V1dHU05aT1Y0MkpESFBNLyc7XG4gICAgY29uc3QgYWxnb0FkZHJlc3MgPSAnNVBHTlg1QU1NVUFCMjNVS0w0QlBDN1RXS0lLVkc2S0ZNV1RYUVg1VlJVVE9MVlBHU0laU0hVQTdILyc7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IEFsZ28uYWxnb1V0aWxzLnN0ZWxsYXJBZGRyZXNzVG9BbGdvQWRkcmVzcyh4bG1BZGRyZXNzKSxcbiAgICAgIG5ldyBSZWdFeHAoJ05laXRoZXIgYW4gQWxnb3JhbmQgYWRkcmVzcyBub3IgYSBzdGVsbGFyIHB1YmtleScpXG4gICAgKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gQWxnby5hbGdvVXRpbHMuc3RlbGxhckFkZHJlc3NUb0FsZ29BZGRyZXNzKGFsZ29BZGRyZXNzKSxcbiAgICAgIG5ldyBSZWdFeHAoJ05laXRoZXIgYW4gQWxnb3JhbmQgYWRkcmVzcyBub3IgYSBzdGVsbGFyIHB1YmtleScpXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZWNvZGUgc2FtZSBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBhbGdvc2RrLmRlY29kZUFkZHJlc3MoYWNjb3VudDEuYWRkcmVzcyk7XG4gICAgY29uc3QgYWRkcmVzc0FsZ28gPSBBbGdvLmFsZ29VdGlscy5kZWNvZGVBZGRyZXNzKGFjY291bnQxLmFkZHJlc3MpO1xuICAgIHNob3VsZC5kZWVwRXF1YWwoYWRkcmVzcywgYWRkcmVzc0FsZ28pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybnMgZXJyb3Igd2hlbiBpbnZhbGlkIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3QgaW52YWxpZEFkZHJlc3MxID0gJzI1TkpRQU1DV0VGTFBWS0w3M0o0U1pBSEhJSE9DNFhUM0tUQ0dKTlBBSU5HUjVZSEtFTk1FRjVRVC8nO1xuICAgIGNvbnN0IGludmFsaWRBZGRyZXNzMiA9ICcyNU5KUUFNQ1dFRkxQVktMNzNKNFNaQUhISUhPQzRYVDNLVENHSk5QQUlOR1I1WUhLRU5NRUY1UVRFRic7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBBbGdvLmFsZ29VdGlscy5kZWNvZGVBZGRyZXNzKGludmFsaWRBZGRyZXNzMSksIC9FcnJvcjogSW52YWxpZCBiYXNlMzIgY2hhcmFjdGVycy8pO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gQWxnby5hbGdvVXRpbHMuZGVjb2RlQWRkcmVzcyhpbnZhbGlkQWRkcmVzczIpLCAvRXJyb3I6IGFkZHJlc3Mgc2VlbXMgdG8gYmUgbWFsZm9ybWVkLyk7XG4gIH0pO1xuXG4gIGl0KCdtdWx0aXNpZ0FkZHJlc3Mgc2hvdWxkIHJldHVybiB0aGUgc2FtZSBzdHJpbmcgd2l0aCBhY2NvdW50TGliIGFuZCBhbGdvc2RrJywgKCkgPT4ge1xuICAgIGNvbnN0IHZlcnNpb24gPSAxO1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IDE7XG4gICAgY29uc3QgYWRkcnMgPSBbJzI1TkpRQU1DV0VGTFBWS0w3M0o0U1pBSEhJSE9DNFhUM0tUQ0dKTlBBSU5HUjVZSEtFTk1FRjVRVEUnXTtcblxuICAgIGNvbnN0IGFjY291bnRMaWJSZXN1bHQgPSBBbGdvLmFsZ29VdGlscy5tdWx0aXNpZ0FkZHJlc3ModmVyc2lvbiwgdGhyZXNob2xkLCBhZGRycyk7XG4gICAgY29uc3QgYWxnb3Nka1Jlc3VsdCA9IGFsZ29zZGsubXVsdGlzaWdBZGRyZXNzKHsgdmVyc2lvbiwgdGhyZXNob2xkLCBhZGRycyB9KTtcblxuICAgIHNob3VsZC5kZWVwRXF1YWwoYWxnb3Nka1Jlc3VsdCwgYWNjb3VudExpYlJlc3VsdCk7XG4gIH0pO1xuXG4gIGl0KCdtdWx0aXNpZ0FkZHJlc3Mgc2hvdWxkIGZhaWwgd2hlbiB0aHJlc2hvbGQgaXMgMicsICgpID0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gMTtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAyO1xuICAgIGNvbnN0IGFkZHJzID0gWydYNEdNWVZLRjZWVk5LQTRRNEFVU1JVWVhZQ0dRU1k3RFpTN1FYVkpDMzNWWVFUUlVLQ1U3RERGRTJVJ107XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IEFsZ28uYWxnb1V0aWxzLm11bHRpc2lnQWRkcmVzcyh2ZXJzaW9uLCB0aHJlc2hvbGQsIGFkZHJzKSwgL0Vycm9yOiBiYWQgbXVsdGlzaWcgdGhyZXNob2xkLyk7XG4gIH0pO1xuXG4gIGl0KCdtdWx0aXNpZ0FkZHJlc3Mgc2hvdWxkIGZhaWwgd2hlbiAgdGhyZXNob2xkIGlzIDMnLCAoKSA9PiB7XG4gICAgY29uc3QgdmVyc2lvbiA9IDE7XG4gICAgY29uc3QgdGhyZXNob2xkID0gMztcbiAgICBjb25zdCBhZGRycyA9IFsnWDRHTVlWS0Y2VlZOS0E0UTRBVVNSVVlYWUNHUVNZN0RaUzdRWFZKQzMzVllRVFJVS0NVN0RERkUyVSddO1xuXG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBBbGdvLmFsZ29VdGlscy5tdWx0aXNpZ0FkZHJlc3ModmVyc2lvbiwgdGhyZXNob2xkLCBhZGRycyksIC9FcnJvcjogYmFkIG11bHRpc2lnIHRocmVzaG9sZC8pO1xuICB9KTtcblxuICBpdCgnbXVsdGlzaWdBZGRyZXNzIHNob3VsZCBmYWlsIHdoZW4gIHZlcnNpb24gaXMgMicsICgpID0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gMjtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxO1xuICAgIGNvbnN0IGFkZHJzID0gWycyNU5KUUFNQ1dFRkxQVktMNzNKNFNaQUhISUhPQzRYVDNLVENHSk5QQUlOR1I1WUhLRU5NRUY1UVRFJ107XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IEFsZ28uYWxnb1V0aWxzLm11bHRpc2lnQWRkcmVzcyh2ZXJzaW9uLCB0aHJlc2hvbGQsIGFkZHJzKSwgL0Vycm9yOiBpbnZhbGlkIG11bHRpc2lnIHZlcnNpb24vKTtcbiAgfSk7XG5cbiAgaXQoJ211bHRpc2lnQWRkcmVzcyBzaG91bGQgZmFpbCB3aGVuICBhZGRyZXNzIGlzIG5vdCB2YWxpZCcsICgpID0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gMTtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAxO1xuICAgIGNvbnN0IGFkZHJzID0gWycyNU5KUUFNQ1dFRkxQVktMNzNKNFNaQUhISUhPQzRYVDNLVENHSk5QQUlOR1I1WUhLRU5NRUY1UVQtJ107XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IEFsZ28uYWxnb1V0aWxzLm11bHRpc2lnQWRkcmVzcyh2ZXJzaW9uLCB0aHJlc2hvbGQsIGFkZHJzKSwgL0Vycm9yOiBJbnZhbGlkIGJhc2UzMiBjaGFyYWN0ZXJzLyk7XG4gIH0pO1xuXG4gIGl0KCdnZW5lcmF0ZUFjY291bnQgc2hvdWxkIG9mIGNyZWF0ZSBhIHZhbGlkIGFkZHJlcyBhbmQgdmFsaWQgc2VjcmV0S2V5JywgKCkgPT4ge1xuICAgIGNvbnN0IGFjY291bnQgPSBBbGdvLmFsZ29VdGlscy5nZW5lcmF0ZUFjY291bnQoKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gQWxnby5hbGdvVXRpbHMuaXNWYWxpZEFkZHJlc3MoYWNjb3VudC5hZGRyKTtcbiAgICBjb25zdCBpc1ZhbGlkU2VjcmV0S2V5ID0gQWxnby5hbGdvVXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoQnVmZmVyLmZyb20oYWNjb3VudC5zaykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBzaG91bGQuZXF1YWwoaXNWYWxpZCwgdHJ1ZSk7XG4gICAgc2hvdWxkLmVxdWFsKGlzVmFsaWRTZWNyZXRLZXksIHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgdmFsaWQgc2VlZCcsICgpID0+IHtcbiAgICBjb25zdCBpc1ZhbGlkID0gQWxnby5hbGdvVXRpbHMuaXNWYWxpZFNlZWQoJ081Mkk1NUFaTllQRzI2NkpCWlNHMzNHMlJLREtGTTdVVkVCVldKMjVVRVM3TUJHUDZCUVc2NDY3WFUnKTtcbiAgICBzaG91bGQuZXF1YWwoaXNWYWxpZCwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IHZhbGlkYXRlIGFuIGludmFsaWQgc2VlZCcsICgpID0+IHtcbiAgICBjb25zdCBpc1ZhbGlkID0gQWxnby5hbGdvVXRpbHMuaXNWYWxpZFNlZWQoJ081Mkk1NUFaTllQRzI2NkpCWlNHMzNHMlJLREtGTTdVVkVCVldKMjVVRVM3TUJHUDZCUVc2NDY3WCQnKTtcbiAgICBzaG91bGQuZXF1YWwoaXNWYWxpZCwgZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCB2YWxpZGF0ZSBhIHNlZWQgd2l0aCBpbnZhbGlkIGxlbmd0aCcsICgpID0+IHtcbiAgICBjb25zdCBpc1ZhbGlkID0gQWxnby5hbGdvVXRpbHMuaXNWYWxpZFNlZWQoJ081Mkk1NUFaTllQRzI2NkpCWlNHMzNHMlJLREtGTTdVVkVCVldKMjVVRVM3TUJHUDZCUVc2NDY3WFVEU0ZEJyk7XG4gICAgc2hvdWxkLmVxdWFsKGlzVmFsaWQsIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB2YWxpZCBzaWduYXR1cmUnLCAoKSA9PiB7XG4gICAgY29uc3QgcHViID0gQnVmZmVyLmZyb20oW1xuICAgICAgMjMsIDEwNSwgMjAzLCAyNDIsIDc2LCAyNDUsIDEzNSwgMTc5LCAyMjUsIDEzMywgNjcsIDgzLCA1MSwgMjMsIDIwOCwgNjAsIDExLCAxMDcsIDIxOSwgMTM3LCAyMTEsIDEzLCAyNDksIDIzNixcbiAgICAgIDE3NiwgNDcsIDExOCwgOTEsIDk2LCAyMDgsIDk4LCAyNTUsXG4gICAgXSk7XG4gICAgY29uc3QgbXNnID0gQnVmZmVyLmZyb20oW1xuICAgICAgODUsIDcxLCA3MCwgNzcsIDUzLCA1MywgNzYsIDUxLCA4MiwgNjgsIDc4LCA3OCwgNTMsIDgxLCA4OCwgODcsIDUwLCA2OCwgODgsIDUxLCA5MCwgNzYsIDgwLCA1MCwgODksIDc4LCA3MywgODIsXG4gICAgICA3MSwgNzIsIDg3LCA1MCwgODUsIDczLCA2OSwgODksIDg0LCA1NCwgODQsIDg1LCA3NSwgNzEsIDc5LCA2OCwgNjgsIDY3LCA3MiwgNjYsIDUwLCA3OSwgNzcsIDc4LCA4MSwgNzAsIDg3LCA1NSxcbiAgICAgIDU1LCA1MixcbiAgICBdKTtcbiAgICBjb25zdCBzaWduID0gQnVmZmVyLmZyb20oW1xuICAgICAgNDcsIDExMywgMTIyLCA2LCAxNzEsIDIzNSwgODAsIDEwNSwgMzIsIDIzNywgOTQsIDE3NCwgNSwgMzAsIDIyOCwgNzMsIDUsIDIxMSwgMjQ1LCA1MSwgMTg3LCAyNTIsIDEyNCwgMTA5LCAyNDEsXG4gICAgICAxNzQsIDIwMywgMzQsIDEzMiwgNDEsIDEwMSwgMTk3LCA0MiwgMTM0LCAyNTEsIDc2LCA5MSwgOTIsIDExOCwgMTEyLCAyMzUsIDExMSwgMjA4LCAyMzQsIDE2MywgMjAzLCAxNDksIDE2MCwgMjMzLFxuICAgICAgOTUsIDIxMCwgMjUzLCAyNDksIDEwNiwgNywgMjQ1LCAyLCAyMjIsIDE1NCwgMTgwLCAxOTgsIDE1MiwgMzIsIDMsXG4gICAgXSk7XG4gICAgY29uc3QgaXNWYWxpZCA9IEFsZ28uYWxnb1V0aWxzLnZlcmlmeVNpZ25hdHVyZShtc2csIHNpZ24sIHB1Yik7XG4gICAgc2hvdWxkLmVxdWFsKGlzVmFsaWQsIHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCB2ZXJpZnkgYSBpbnZhbGlkIHNpZ25hdHVyZScsICgpID0+IHtcbiAgICBjb25zdCBwdWIgPSBCdWZmZXIuZnJvbShbXG4gICAgICAyMywgMTA1LCAyMDMsIDI0MiwgNzYsIDI0NSwgMTM1LCAxNzksIDIyNSwgMTMzLCA2NywgODMsIDUxLCAyMywgMjA4LCA2MCwgMTEsIDEwNywgMjE5LCAxMzcsIDIxMSwgMTMsIDI0OSwgMjM2LFxuICAgICAgMTc2LCA0NywgMTE4LCA5MSwgOTYsIDIwOCwgOTgsIDI1NSxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBCdWZmZXIuZnJvbShbXG4gICAgICA4NSwgNzEsIDcwLCA3NywgNTMsIDUzLCA3NiwgNTEsIDgyLCA2OCwgNzgsIDc4LCA1MywgODEsIDg4LCA4NywgNTAsIDY4LCA4OCwgNTEsIDkwLCA3NiwgODAsIDUwLCA4OSwgNzgsIDczLCA4MixcbiAgICAgIDcxLCA3MiwgODcsIDUwLCA4NSwgNzMsIDY5LCA4OSwgODQsIDU0LCA4NCwgODUsIDc1LCA3MSwgNzksIDY4LCA2OCwgNjcsIDcyLCA2NiwgNTAsIDc5LCA3NywgNzgsIDgxLCA3MCwgODcsIDU1LFxuICAgICAgNTUsIDUyLFxuICAgIF0pO1xuICAgIGNvbnN0IGludmFsaWRTaWduID0gQnVmZmVyLmZyb20oW1xuICAgICAgNDcsIDExMywgMTIyLCA2LCAxNzEsIDIzNSwgODAsIDEwNSwgMzIsIDIzNywgOTQsIDE3NCwgNSwgMzAsIDIyOCwgNzMsIDUsIDIxMSwgMjQ1LCA1MSwgMTg3LCAyNTIsIDEyNCwgMTA5LCAyNDEsXG4gICAgICAxNzQsIDIwMywgMzQsIDEzMiwgNDEsIDEwMSwgMTk3LCA0MiwgMTM0LCAyNTEsIDc2LCA5MSwgOTIsIDExOCwgMTEyLCAyMzUsIDExMSwgMjA4LCAyMzQsIDE2MywgMjAzLCAxNDksIDE2MCwgMjMzLFxuICAgICAgOTUsIDIxMCwgMjUzLCAyNDksIDEwNiwgNywgMjQ1LCAyLCAyMjIsIDE1NCwgMTgwLCAxOTgsIDE1MCwgNDUsIDYsXG4gICAgXSk7XG4gICAgY29uc3QgaXNWYWxpZCA9IEFsZ28uYWxnb1V0aWxzLnZlcmlmeVNpZ25hdHVyZShtc2csIGludmFsaWRTaWduLCBwdWIpO1xuICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkLCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IHZlcmlmeSBhIHZhbGlkIHNpZ25hdHVyZSB3aXRoIGludmFsaWQgcHVibGljIGtleScsICgpID0+IHtcbiAgICBjb25zdCBpbnZhbGlkUHViID0gQnVmZmVyLmZyb20oW1xuICAgICAgMjMsIDEwNSwgMjAzLCAyNDIsIDc2LCAyNDUsIDEzNSwgMTc5LCAyMjUsIDEzMywgNjcsIDgzLCA1MSwgMjMsIDIwOCwgNjAsIDExLCAxMDcsIDIxOSwgMTM3LCAyMTEsIDEzLCAyNDksIDIzNixcbiAgICAgIDE3NiwgNDcsIDExOCwgOTEsIDk2LCAyMDAsIDkwLCA1MCxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBCdWZmZXIuZnJvbShbXG4gICAgICA4NSwgNzEsIDcwLCA3NywgNTMsIDUzLCA3NiwgNTEsIDgyLCA2OCwgNzgsIDc4LCA1MywgODEsIDg4LCA4NywgNTAsIDY4LCA4OCwgNTEsIDkwLCA3NiwgODAsIDUwLCA4OSwgNzgsIDczLCA4MixcbiAgICAgIDcxLCA3MiwgODcsIDUwLCA4NSwgNzMsIDY5LCA4OSwgODQsIDU0LCA4NCwgODUsIDc1LCA3MSwgNzksIDY4LCA2OCwgNjcsIDcyLCA2NiwgNTAsIDc5LCA3NywgNzgsIDgxLCA3MCwgODcsIDU1LFxuICAgICAgNTUsIDUyLFxuICAgIF0pO1xuICAgIGNvbnN0IHNpZ24gPSBCdWZmZXIuZnJvbShbXG4gICAgICA0NywgMTEzLCAxMjIsIDYsIDE3MSwgMjM1LCA4MCwgMTA1LCAzMiwgMjM3LCA5NCwgMTc0LCA1LCAzMCwgMjI4LCA3MywgNSwgMjExLCAyNDUsIDUxLCAxODcsIDI1MiwgMTI0LCAxMDksIDI0MSxcbiAgICAgIDE3NCwgMjAzLCAzNCwgMTMyLCA0MSwgMTAxLCAxOTcsIDQyLCAxMzQsIDI1MSwgNzYsIDkxLCA5MiwgMTE4LCAxMTIsIDIzNSwgMTExLCAyMDgsIDIzNCwgMTYzLCAyMDMsIDE0OSwgMTYwLCAyMzMsXG4gICAgICA5NSwgMjEwLCAyNTMsIDI0OSwgMTA2LCA3LCAyNDUsIDIsIDIyMiwgMTU0LCAxODAsIDE5OCwgMTUyLCAzMiwgMyxcbiAgICBdKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gQWxnby5hbGdvVXRpbHMudmVyaWZ5U2lnbmF0dXJlKG1zZywgc2lnbiwgaW52YWxpZFB1Yik7XG4gICAgc2hvdWxkLmVxdWFsKGlzVmFsaWQsIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB2YWxpZCBzaWduYXR1cmUgd2l0aCBpbnZhbGlkIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgcHViID0gQnVmZmVyLmZyb20oW1xuICAgICAgMjMsIDEwNSwgMjAzLCAyNDIsIDc2LCAyNDUsIDEzNSwgMTc5LCAyMjUsIDEzMywgNjcsIDgzLCA1MSwgMjMsIDIwOCwgNjAsIDExLCAxMDcsIDIxOSwgMTM3LCAyMTEsIDEzLCAyNDksIDIzNixcbiAgICAgIDE3NiwgNDcsIDExOCwgOTEsIDk2LCAyMDgsIDk4LCAyNTUsXG4gICAgXSk7XG4gICAgY29uc3QgaW52YWxpZE1zZyA9IEJ1ZmZlci5mcm9tKFtcbiAgICAgIDg1LCA3MSwgNzAsIDc3LCA1MywgNTMsIDc2LCA1MSwgODIsIDY4LCA3OCwgNzgsIDUzLCA4MSwgODgsIDg3LCA1MCwgNjgsIDg4LCA1MSwgOTAsIDc2LCA4MCwgNTAsIDg5LCA3OCwgNzMsIDgyLFxuICAgICAgNzEsIDcyLCA4NywgNTAsIDg1LCA3MywgNjksIDg5LCA4NCwgNTQsIDg0LCA4NSwgNzUsIDcxLCA3OSwgNjgsIDY4LCA2NywgNzIsIDY2LCA1MCwgNzksIDc3LCA3OCwgODEsIDcwLCA4NywgNTAsXG4gICAgICA1MCwgNTAsXG4gICAgXSk7XG4gICAgY29uc3Qgc2lnbiA9IEJ1ZmZlci5mcm9tKFtcbiAgICAgIDQ3LCAxMTMsIDEyMiwgNiwgMTcxLCAyMzUsIDgwLCAxMDUsIDMyLCAyMzcsIDk0LCAxNzQsIDUsIDMwLCAyMjgsIDczLCA1LCAyMTEsIDI0NSwgNTEsIDE4NywgMjUyLCAxMjQsIDEwOSwgMjQxLFxuICAgICAgMTc0LCAyMDMsIDM0LCAxMzIsIDQxLCAxMDEsIDE5NywgNDIsIDEzNCwgMjUxLCA3NiwgOTEsIDkyLCAxMTgsIDExMiwgMjM1LCAxMTEsIDIwOCwgMjM0LCAxNjMsIDIwMywgMTQ5LCAxNjAsIDIzMyxcbiAgICAgIDk1LCAyMTAsIDI1MywgMjQ5LCAxMDYsIDcsIDI0NSwgMiwgMjIyLCAxNTQsIDE4MCwgMTk4LCAxNTIsIDMyLCAzLFxuICAgIF0pO1xuICAgIGNvbnN0IGlzVmFsaWQgPSBBbGdvLmFsZ29VdGlscy52ZXJpZnlTaWduYXR1cmUoaW52YWxpZE1zZywgc2lnbiwgcHViKTtcbiAgICBzaG91bGQuZXF1YWwoaXNWYWxpZCwgZmFsc2UpO1xuICB9KTtcblxuICBpdCgnU2hvdWxkIGJlIGFibGUgdG8gZ2V0IGEgdHhJRCBmcm9tIGEgbXVsdGlzaW5nIFR4JywgKCkgPT4ge1xuICAgIGNvbnN0IHJhd1R4biA9IHZhbGlkVHhuLnR4bjtcbiAgICBjb25zdCB0eElkID0gQWxnby5hbGdvVXRpbHMuZ2V0TXVsdGlzaWdUeElEKHJhd1R4bik7XG5cbiAgICBzaG91bGQuZXF1YWwodHhJZCwgdmFsaWRUeG4udHhpZCk7XG4gIH0pO1xuXG4gIGl0KCdTaG91bGQgbm90IGJlIGFibGUgdG8gZ2V0IGEgdHhJRCBmcm9tIGFuIGluY29tcGxldGUgbXVsdGlzaW5nIFR4JywgKCkgPT4ge1xuICAgIGNvbnN0IHJhd1R4biA9IGludmFsaWRUeG4udHhuO1xuXG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICBBbGdvLmFsZ29VdGlscy5nZXRNdWx0aXNpZ1R4SUQocmF3VHhuKTtcbiAgICB9LCAnUmFuZ2VFcnJvcjogSW5zdWZmaWNpZW50IGRhdGEnKTtcbiAgfSk7XG5cbiAgaXQoJ1Nob3VsZCBub3QgYmUgYWJsZSB0byBnZXQgYSB0eElEIGZyb20gYSBzaW1wbGUgVHgnLCAoKSA9PiB7XG4gICAgY29uc3QgcmF3VHhuID0gaW52YWxpZFR4bjIudHhuO1xuXG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICBBbGdvLmFsZ29VdGlscy5nZXRNdWx0aXNpZ1R4SUQocmF3VHhuKTtcbiAgICB9LCAnRXJyb3I6IFRoZSBvYmplY3QgY29udGFpbnMgZW1wdHkgb3IgMCB2YWx1ZXMuIEZpcnN0IGVtcHR5IG9yIDAgdmFsdWUgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nOiBtc2lnJyk7XG4gIH0pO1xuXG4gIGl0KCdTaG91bGQgcmV0dXJuIGVuYWJsZVRva2VuJywgKCkgPT4ge1xuICAgIGNvbnN0IGFtb3VudCA9ICcwJztcbiAgICBjb25zdCBmcm9tID0gJ1IyNzVITktFWEMzQUkzQ1lMMlBQT0dQMkFGQTRYQ1JETzJDQ1JFR0NWRFg2T0pBWjU0TUJEN1ZMWUEnO1xuICAgIGNvbnN0IHRvID0gJ1IyNzVITktFWEMzQUkzQ1lMMlBQT0dQMkFGQTRYQ1JETzJDQ1JFR0NWRFg2T0pBWjU0TUJEN1ZMWUEnO1xuICAgIGNvbnN0IGNsb3NlUmVtYWluZGVyVG8gPSAnJztcblxuICAgIEFsZ28uYWxnb1V0aWxzLmdldFRva2VuVHhUeXBlKGFtb3VudCwgZnJvbSwgdG8sIGNsb3NlUmVtYWluZGVyVG8pLnNob3VsZC5lcXVhbCgnZW5hYmxlVG9rZW4nKTtcbiAgfSk7XG5cbiAgaXQoJ1Nob3VsZCByZXR1cm4gZGlzYWJsZVRva2VuJywgKCkgPT4ge1xuICAgIGNvbnN0IGFtb3VudCA9ICcwJztcbiAgICBjb25zdCBmcm9tID0gJ1IyNzVITktFWEMzQUkzQ1lMMlBQT0dQMkFGQTRYQ1JETzJDQ1JFR0NWRFg2T0pBWjU0TUJEN1ZMWUEnO1xuICAgIGNvbnN0IHRvID0gJ1IyNzVITktFWEMzQUkzQ1lMMlBQT0dQMkFGQTRYQ1JETzJDQ1JFR0NWRFg2T0pBWjU0TUJEN1ZMWUEnO1xuICAgIGNvbnN0IGNsb3NlUmVtYWluZGVyVG8gPSAnUjI3NUhOS0VYQzNBSTNDWUwyUFBPR1AyQUZBNFhDUkRPMkNDUkVHQ1ZEWDZPSkFaNTRNQkQ3VkxZQSc7XG5cbiAgICBBbGdvLmFsZ29VdGlscy5nZXRUb2tlblR4VHlwZShhbW91bnQsIGZyb20sIHRvLCBjbG9zZVJlbWFpbmRlclRvKS5zaG91bGQuZXF1YWwoJ2Rpc2FibGVUb2tlbicpO1xuICB9KTtcblxuICBpdCgnU2hvdWxkIHJldHVybiB0cmFuc2ZlclRva2VuIHdoZW4gXCJmcm9tXCIgYW5kIFwidG9cIiBhcmUgZGlmZmVyZW50ICcsICgpID0+IHtcbiAgICBjb25zdCBhbW91bnQgPSAnMCc7XG4gICAgY29uc3QgZnJvbSA9ICdSMjc1SE5LRVhDM0FJM0NZTDJQUE9HUDJBRkE0WENSRE8yQ0NSRUdDVkRYNk9KQVo1NE1CRDdWTFlBJztcbiAgICBjb25zdCB0byA9ICdTUDc0NUpKUjRLUFJRRVhKWkhWSUVONzM2TFlUTDJUMkRGTUczT0lJRkpCVjY2SzczUEhOTURDWlZNJztcbiAgICBjb25zdCBjbG9zZVJlbWFpbmRlclRvID0gJ1IyNzVITktFWEMzQUkzQ1lMMlBQT0dQMkFGQTRYQ1JETzJDQ1JFR0NWRFg2T0pBWjU0TUJEN1ZMWUEnO1xuXG4gICAgQWxnby5hbGdvVXRpbHMuZ2V0VG9rZW5UeFR5cGUoYW1vdW50LCBmcm9tLCB0bywgY2xvc2VSZW1haW5kZXJUbykuc2hvdWxkLmVxdWFsKCd0cmFuc2ZlclRva2VuJyk7XG4gIH0pO1xuXG4gIGl0KCdTaG91bGQgcmV0dXJuIHRyYW5zZmVyVG9rZW4gd2hlbiBhbW91bnQgaXMgbm90IDAnLCAoKSA9PiB7XG4gICAgY29uc3QgYW1vdW50ID0gJzEwMDAnO1xuICAgIGNvbnN0IGZyb20gPSAnUjI3NUhOS0VYQzNBSTNDWUwyUFBPR1AyQUZBNFhDUkRPMkNDUkVHQ1ZEWDZPSkFaNTRNQkQ3VkxZQSc7XG4gICAgY29uc3QgdG8gPSAnUjI3NUhOS0VYQzNBSTNDWUwyUFBPR1AyQUZBNFhDUkRPMkNDUkVHQ1ZEWDZPSkFaNTRNQkQ3VkxZQSc7XG4gICAgY29uc3QgY2xvc2VSZW1haW5kZXJUbyA9ICdSMjc1SE5LRVhDM0FJM0NZTDJQUE9HUDJBRkE0WENSRE8yQ0NSRUdDVkRYNk9KQVo1NE1CRDdWTFlBJztcblxuICAgIEFsZ28uYWxnb1V0aWxzLmdldFRva2VuVHhUeXBlKGFtb3VudCwgZnJvbSwgdG8sIGNsb3NlUmVtYWluZGVyVG8pLnNob3VsZC5lcXVhbCgndHJhbnNmZXJUb2tlbicpO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!