UNPKG

@samyan/hd-wallet

Version:

61 lines 27.6 kB
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.HDWallet=exports.BLOCKCHAIN_NETWORK=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty")),_util=require("@ethereumjs/util"),_baseX=_interopRequireDefault(require("base-x")),_bip=_interopRequireDefault(require("bip32")),_bip2=require("bip39"),_bitcoinjsLib=require("bitcoinjs-lib"),_hdkey=_interopRequireDefault(require("hdkey")),ecc=_interopRequireWildcard(require("tiny-secp256k1"));function _interopRequireWildcard(a,b){if("function"==typeof WeakMap)var c=new WeakMap,d=new WeakMap;return(_interopRequireWildcard=function(a,b){if(!b&&a&&a.__esModule)return a;var e,g,h={__proto__:null,default:a};if(null===a||"object"!=typeof a&&"function"!=typeof a)return h;if(e=b?d:c){if(e.has(a))return e.get(a);e.set(a,h)}for(const c in a)"default"!=c&&{}.hasOwnProperty.call(a,c)&&((g=(e=Object.defineProperty)&&Object.getOwnPropertyDescriptor(a,c))&&(g.get||g.set)?e(h,c,g):h[c]=a[c]);return h})(a,b)}var BLOCKCHAIN_NETWORK=exports.BLOCKCHAIN_NETWORK=/*#__PURE__*/function(a){return a.BITCOIN="bitcoin",a.BITCOIN_REGTEST="bitcoinRegTest",a.LITECOIN="litecoin",a.ETHEREUM="ethereum",a.RIPPLE="ripple",a.TRON="tron",a}(BLOCKCHAIN_NETWORK||{});class HDWallet{/** * Constructor * * @param {BLOCKCHAIN_NETWORK} protocol * @param {string} mnemonicWord * @param {boolean} [includePrivateKey=false] * @param {boolean} [log=false] * @memberof HDWallet */constructor(a,b,c=!1,d=!1){(0,_defineProperty2.default)(this,"segwitParameters",{bitcoin:{messagePrefix:"\x18Bitcoin Signed Message:\n",bech32:"bc",bip32:{public:78792518,private:78791436},pubKeyHash:0,scriptHash:5,wif:128},bitcoinRegTest:{messagePrefix:"\x18Bitcoin Signed Message:\n",bech32:"bcrt",bip32:{public:70617039,private:70615956},pubKeyHash:111,scriptHash:196,wif:239},litecoin:{messagePrefix:"\x19Litecoin Signed Message:\n",bech32:"ltc",bip32:{public:78792518,private:78791436},pubKeyHash:48,scriptHash:50,wif:176}}),(0,_defineProperty2.default)(this,"rootKey",void 0),(0,_defineProperty2.default)(this,"accountExtendedKey",void 0),(0,_defineProperty2.default)(this,"protocol",void 0),(0,_defineProperty2.default)(this,"mnemonicWord",void 0),(0,_defineProperty2.default)(this,"includePrivateKey",void 0),(0,_defineProperty2.default)(this,"seed",void 0),(0,_defineProperty2.default)(this,"log",void 0),this.protocol=a,this.mnemonicWord=b,this.includePrivateKey=c,this.seed=(0,_bip2.mnemonicToSeedSync)(this.mnemonicWord),this.log=d}/** * Generate * * @param {string} path * @param {number} index * @return {*} {string} * @memberof HDWallet */generate(a,b){// Concatenamos const c="m/"+a;this.log&&(console.log("========================="),console.log("Mnemonic: %s",this.mnemonicWord),console.log("HD Path: %s\r\n",c));// Obtenemos la red si es el caso const d=this.segwitParameters[this.protocol],e=(0,_bip.default)(ecc);// Instanciamos // Obtenemos la root key if(this.rootKey=e.fromSeed(this.seed,d),this.accountExtendedKey=this.calcBip32ExtendedKey(this.rootKey,c),this.log){// Obtenemos la clave privada y pública const a=this.accountExtendedKey.toBase58(),b=this.accountExtendedKey.neutered().toBase58();console.log("Account Extended Private Key: %s \r\nAccount Extended Public Key: %s\r\n",a,b)}// Obtenemos el wallet const f=this.accountExtendedKey.derive(b);switch(this.protocol){case BLOCKCHAIN_NETWORK.BITCOIN:case BLOCKCHAIN_NETWORK.BITCOIN_REGTEST:case BLOCKCHAIN_NETWORK.LITECOIN:{// Extraemos la dirección const{address:a}=_bitcoinjsLib.payments.p2wpkh({pubkey:f.publicKey,network:d}),b=Buffer.from(f.publicKey).toString("hex");// Obtenemos la clave pública return this.log&&this.printWallet(a,f.toWIF(),b),this.includePrivateKey?{address:a,publicKey:b,privateKey:f.toWIF()}:{address:a,publicKey:b}}case BLOCKCHAIN_NETWORK.ETHEREUM:{// Obtenemos el wallet const a=_hdkey.default.fromMasterSeed(this.seed).derive(c).deriveChild(b),d="0x"+a.publicKey.toString("hex"),e="0x"+a.privateKey.toString("hex"),f=(0,_util.publicToAddress)(a.publicKey,!0),g=(0,_util.toChecksumAddress)("0x"+Buffer.from(f).toString("hex"));// Obtenemos la clave pública // Obtenemos la clave privada // Obtenemos la dirección return this.log&&this.printWallet(g,e,d),this.includePrivateKey?{address:g,publicKey:d,privateKey:e}:{address:g,publicKey:d}}case BLOCKCHAIN_NETWORK.RIPPLE:{// Extraemos la dirección const{address:a}=_bitcoinjsLib.payments.p2pkh({pubkey:f.publicKey}),b=Buffer.from(f.publicKey).toString("hex"),c=Buffer.from(f.privateKey).toString("hex"),d=this.convertRippleAdrr(a);// Obtenemos la clave pública // Obtenemos la clave privada // Obtenemos la dirección return this.log&&this.printWallet(d,c,b),this.includePrivateKey?{address:d,publicKey:b,privateKey:c}:{address:d,publicKey:b}}case BLOCKCHAIN_NETWORK.TRON:{// Obtenemos la clave pública en formato de ethereum const a=(0,_util.importPublic)(f.publicKey),b=Buffer.from(f.publicKey).toString("hex"),c=Buffer.from(f.privateKey).toString("hex"),d=(0,_util.publicToAddress)(a),e=_bitcoinjsLib.address.toBase58Check(d,65);// Obtenemos la clave pública // Obtenemos la clave privada // Clave pública a dirección // Obtenemos la dirección return this.log&&this.printWallet(e,c,b),this.includePrivateKey?{address:e,publicKey:b,privateKey:c}:{address:e,publicKey:b}}}}/** * Calculate bip32 extended key by root key * * @private * @param {BIP32Interface} bip32RootKey * @param {string} path * @return {*} {BIP32Interface} * @memberof HDWallet */calcBip32ExtendedKey(a,b){let c=a;const d=b.split("/");for(let e=0;e<d.length;e++){const a=d[e],b=parseInt(a);if(isNaN(b))continue;const f="'"===a[a.length-1];c=f?c.deriveHardened(b):c.derive(b)}return c;}/** * Convert address to Ripple address * * @private * @param {string} address * @return {*} {string} * @memberof HDWallet */convertRippleAdrr(a){return(0,_baseX.default)("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz").encode((0,_baseX.default)("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz").decode(a));}/** * Print wallet * * @private * @param {string} address * @param {string} prvKey * @param {string} pubKey * @memberof HDWallet */printWallet(a,b,c){console.log("Address: %s \r\nPrivate Key: %s \r\nPublic Key: %s \r\n=========================\r\n\r\n",a,b,c)}}exports.HDWallet=HDWallet; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCTE9DS0NIQUlOX05FVFdPUksiLCJleHBvcnRzIiwiQklUQ09JTiIsIkJJVENPSU5fUkVHVEVTVCIsIkxJVEVDT0lOIiwiRVRIRVJFVU0iLCJSSVBQTEUiLCJUUk9OIiwiSERXYWxsZXQiLCJjb25zdHJ1Y3RvciIsInByb3RvY29sIiwibW5lbW9uaWNXb3JkIiwiaW5jbHVkZVByaXZhdGVLZXkiLCJsb2ciLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImJpdGNvaW4iLCJtZXNzYWdlUHJlZml4IiwiYmVjaDMyIiwiYmlwMzIiLCJwdWJsaWMiLCJwcml2YXRlIiwicHViS2V5SGFzaCIsInNjcmlwdEhhc2giLCJ3aWYiLCJiaXRjb2luUmVnVGVzdCIsImxpdGVjb2luIiwic2VlZCIsIm1uZW1vbmljVG9TZWVkU3luYyIsImdlbmVyYXRlIiwicGF0aCIsImluZGV4IiwiaGRQYXRoIiwiY29uc29sZSIsIm5ldHdvcmsiLCJzZWd3aXRQYXJhbWV0ZXJzIiwiQklQMzJGYWN0b3J5IiwiZWNjIiwicm9vdEtleSIsImZyb21TZWVkIiwiYWNjb3VudEV4dGVuZGVkS2V5IiwiY2FsY0JpcDMyRXh0ZW5kZWRLZXkiLCJhY2NvdW50WHBydiIsInRvQmFzZTU4IiwiYWNjb3VudFhwdWIiLCJuZXV0ZXJlZCIsImtleVBhaXIiLCJkZXJpdmUiLCJhZGRyZXNzIiwicDJ3cGtoQWRkcmVzcyIsInBheW1lbnRzIiwicDJ3cGtoIiwicHVia2V5IiwicHVibGljS2V5IiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwicHJpbnRXYWxsZXQiLCJ0b1dJRiIsInByaXZhdGVLZXkiLCJldGhlcmV1bVdhbGxldCIsImhka2V5IiwiZnJvbU1hc3RlclNlZWQiLCJkZXJpdmVDaGlsZCIsImFkZHJlc3NCdWZmZXIiLCJwdWJsaWNUb0FkZHJlc3MiLCJ0b0NoZWNrc3VtQWRkcmVzcyIsInhycEFkZHJlc3MiLCJwMnBraCIsImNvbnZlcnRSaXBwbGVBZHJyIiwiZXRoUHViS2V5IiwiaW1wb3J0UHVibGljIiwiYml0Y29pbmpzQWRkcmVzcyIsInRvQmFzZTU4Q2hlY2siLCJiaXAzMlJvb3RLZXkiLCJleHRlbmRlZEtleSIsInBhdGhCaXRzIiwic3BsaXQiLCJpIiwibGVuZ3RoIiwiYml0IiwicGFyc2VJbnQiLCJpc05hTiIsImhhcmRlbmVkIiwiZGVyaXZlSGFyZGVuZWQiLCJiYXNleCIsImVuY29kZSIsImRlY29kZSIsInBydktleSIsInB1YktleSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbXBvcnRQdWJsaWMsIHB1YmxpY1RvQWRkcmVzcywgdG9DaGVja3N1bUFkZHJlc3MgfSBmcm9tICdAZXRoZXJldW1qcy91dGlsJztcbmltcG9ydCBiYXNleCBmcm9tICdiYXNlLXgnO1xuaW1wb3J0IEJJUDMyRmFjdG9yeSwgeyBCSVAzMkFQSSwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG5pbXBvcnQgeyBtbmVtb25pY1RvU2VlZFN5bmMgfSBmcm9tICdiaXAzOSc7XG5pbXBvcnQgeyBhZGRyZXNzIGFzIGJpdGNvaW5qc0FkZHJlc3MsIHBheW1lbnRzIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgaGRrZXkgZnJvbSAnaGRrZXknO1xuaW1wb3J0ICogYXMgZWNjIGZyb20gJ3Rpbnktc2VjcDI1NmsxJztcblxuZW51bSBCTE9DS0NIQUlOX05FVFdPUksge1xuXHRCSVRDT0lOID0gJ2JpdGNvaW4nLFxuXHRCSVRDT0lOX1JFR1RFU1QgPSAnYml0Y29pblJlZ1Rlc3QnLFxuXHRMSVRFQ09JTiA9ICdsaXRlY29pbicsXG5cdEVUSEVSRVVNID0gJ2V0aGVyZXVtJyxcblx0UklQUExFID0gJ3JpcHBsZScsXG5cdFRST04gPSAndHJvbicsXG59XG5cbmNsYXNzIEhEV2FsbGV0IHtcblx0cHJpdmF0ZSBzZWd3aXRQYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge1xuXHRcdGJpdGNvaW46IHtcblx0XHRcdG1lc3NhZ2VQcmVmaXg6ICdcXHgxOEJpdGNvaW4gU2lnbmVkIE1lc3NhZ2U6XFxuJyxcblx0XHRcdGJlY2gzMjogJ2JjJyxcblx0XHRcdGJpcDMyOiB7XG5cdFx0XHRcdHB1YmxpYzogMHgwNGIyNDc0Nixcblx0XHRcdFx0cHJpdmF0ZTogMHgwNGIyNDMwYyxcblx0XHRcdH0sXG5cdFx0XHRwdWJLZXlIYXNoOiAweDAwLFxuXHRcdFx0c2NyaXB0SGFzaDogMHgwNSxcblx0XHRcdHdpZjogMHg4MCxcblx0XHR9LFxuXHRcdGJpdGNvaW5SZWdUZXN0OiB7XG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MThCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbicsXG5cdFx0XHRiZWNoMzI6ICdiY3J0Jyxcblx0XHRcdGJpcDMyOiB7XG5cdFx0XHRcdHB1YmxpYzogMHgwNDM1ODdjZixcblx0XHRcdFx0cHJpdmF0ZTogMHgwNDM1ODM5NCxcblx0XHRcdH0sXG5cdFx0XHRwdWJLZXlIYXNoOiAweDZmLFxuXHRcdFx0c2NyaXB0SGFzaDogMHhjNCxcblx0XHRcdHdpZjogMHhlZixcblx0XHR9LFxuXHRcdGxpdGVjb2luOiB7XG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MTlMaXRlY29pbiBTaWduZWQgTWVzc2FnZTpcXG4nLFxuXHRcdFx0YmVjaDMyOiAnbHRjJyxcblx0XHRcdGJpcDMyOiB7XG5cdFx0XHRcdHB1YmxpYzogMHgwNGIyNDc0Nixcblx0XHRcdFx0cHJpdmF0ZTogMHgwNGIyNDMwYyxcblx0XHRcdH0sXG5cdFx0XHRwdWJLZXlIYXNoOiAweDMwLFxuXHRcdFx0c2NyaXB0SGFzaDogMHgzMixcblx0XHRcdHdpZjogMHhiMCxcblx0XHR9LFxuXHR9O1xuXG5cdHByaXZhdGUgcm9vdEtleTogQklQMzJJbnRlcmZhY2U7XG5cdHByaXZhdGUgYWNjb3VudEV4dGVuZGVkS2V5OiBCSVAzMkludGVyZmFjZTtcblxuXHRwcml2YXRlIHByb3RvY29sOiBCTE9DS0NIQUlOX05FVFdPUks7XG5cdHByaXZhdGUgbW5lbW9uaWNXb3JkOiBzdHJpbmc7XG5cdHByaXZhdGUgaW5jbHVkZVByaXZhdGVLZXk6IGJvb2xlYW47XG5cdHByaXZhdGUgc2VlZDogQnVmZmVyO1xuXG5cdHByaXZhdGUgbG9nOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBDb25zdHJ1Y3RvclxuXHQgKlxuXHQgKiBAcGFyYW0ge0JMT0NLQ0hBSU5fTkVUV09SS30gcHJvdG9jb2xcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1uZW1vbmljV29yZFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlUHJpdmF0ZUtleT1mYWxzZV1cblx0ICogQHBhcmFtIHtib29sZWFufSBbbG9nPWZhbHNlXVxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcblx0ICovXG5cdGNvbnN0cnVjdG9yKHByb3RvY29sOiBCTE9DS0NIQUlOX05FVFdPUkssIG1uZW1vbmljV29yZDogc3RyaW5nLCBpbmNsdWRlUHJpdmF0ZUtleTogYm9vbGVhbiA9IGZhbHNlLCBsb2c6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcblx0XHR0aGlzLm1uZW1vbmljV29yZCA9IG1uZW1vbmljV29yZDtcblx0XHR0aGlzLmluY2x1ZGVQcml2YXRlS2V5ID0gaW5jbHVkZVByaXZhdGVLZXk7XG5cdFx0dGhpcy5zZWVkID0gbW5lbW9uaWNUb1NlZWRTeW5jKHRoaXMubW5lbW9uaWNXb3JkKTtcblx0XHR0aGlzLmxvZyA9IGxvZztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZVxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcblx0ICogQHJldHVybiB7Kn0gIHtzdHJpbmd9XG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxuXHQgKi9cblx0cHVibGljIGdlbmVyYXRlKHBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHsgYWRkcmVzczogc3RyaW5nOyBwdWJsaWNLZXk6IHN0cmluZzsgcHJpdmF0ZUtleT86IHN0cmluZyB9IHtcblx0XHQvLyBDb25jYXRlbmFtb3Ncblx0XHRjb25zdCBoZFBhdGg6IHN0cmluZyA9ICdtLycgKyBwYXRoO1xuXG5cdFx0aWYgKHRoaXMubG9nKSB7XG5cdFx0XHRjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuXHRcdFx0Y29uc29sZS5sb2coJ01uZW1vbmljOiAlcycsIHRoaXMubW5lbW9uaWNXb3JkKTtcblx0XHRcdGNvbnNvbGUubG9nKCdIRCBQYXRoOiAlc1xcclxcbicsIGhkUGF0aCk7XG5cdFx0fVxuXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIHJlZCBzaSBlcyBlbCBjYXNvXG5cdFx0Y29uc3QgbmV0d29yazogYW55ID0gdGhpcy5zZWd3aXRQYXJhbWV0ZXJzW3RoaXMucHJvdG9jb2xdO1xuXHRcdC8vIEluc3RhbmNpYW1vc1xuXHRcdGNvbnN0IGJpcDMyOiBCSVAzMkFQSSA9IEJJUDMyRmFjdG9yeShlY2MpO1xuXHRcdC8vIE9idGVuZW1vcyBsYSByb290IGtleVxuXHRcdHRoaXMucm9vdEtleSA9IGJpcDMyLmZyb21TZWVkKHRoaXMuc2VlZCwgbmV0d29yayk7XG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIGV4dGVuZGlkYSBkZSBsYSBjdWVudGFcblx0XHR0aGlzLmFjY291bnRFeHRlbmRlZEtleSA9IHRoaXMuY2FsY0JpcDMyRXh0ZW5kZWRLZXkodGhpcy5yb290S2V5LCBoZFBhdGgpO1xuXG5cdFx0aWYgKHRoaXMubG9nKSB7XG5cdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYSB5IHDDumJsaWNhXG5cdFx0XHRjb25zdCBhY2NvdW50WHBydjogc3RyaW5nID0gdGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkudG9CYXNlNTgoKTtcblx0XHRcdGNvbnN0IGFjY291bnRYcHViOiBzdHJpbmcgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG5cblx0XHRcdGNvbnNvbGUubG9nKCdBY2NvdW50IEV4dGVuZGVkIFByaXZhdGUgS2V5OiAlcyBcXHJcXG5BY2NvdW50IEV4dGVuZGVkIFB1YmxpYyBLZXk6ICVzXFxyXFxuJywgYWNjb3VudFhwcnYsIGFjY291bnRYcHViKTtcblx0XHR9XG5cblx0XHQvLyBPYnRlbmVtb3MgZWwgd2FsbGV0XG5cdFx0Y29uc3Qga2V5UGFpcjogQklQMzJJbnRlcmZhY2UgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS5kZXJpdmUoaW5kZXgpO1xuXG5cdFx0c3dpdGNoICh0aGlzLnByb3RvY29sKSB7XG5cdFx0XHRjYXNlIEJMT0NLQ0hBSU5fTkVUV09SSy5CSVRDT0lOOlxuXHRcdFx0Y2FzZSBCTE9DS0NIQUlOX05FVFdPUksuQklUQ09JTl9SRUdURVNUOlxuXHRcdFx0Y2FzZSBCTE9DS0NIQUlOX05FVFdPUksuTElURUNPSU46IHtcblx0XHRcdFx0Ly8gRXh0cmFlbW9zIGxhIGRpcmVjY2nDs25cblx0XHRcdFx0Y29uc3QgeyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzIH0gPSBwYXltZW50cy5wMndwa2goeyBwdWJrZXk6IGtleVBhaXIucHVibGljS2V5LCBuZXR3b3JrIH0pO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxuXHRcdFx0XHRjb25zdCBwdWJsaWNLZXkgPSBCdWZmZXIuZnJvbShrZXlQYWlyLnB1YmxpY0tleSkudG9TdHJpbmcoJ2hleCcpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQocDJ3cGtoQWRkcmVzcywga2V5UGFpci50b1dJRigpLCBwdWJsaWNLZXkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcblx0XHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzLCBwdWJsaWNLZXksIHByaXZhdGVLZXk6IGtleVBhaXIudG9XSUYoKSB9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzczogcDJ3cGtoQWRkcmVzcywgcHVibGljS2V5IH07XG5cdFx0XHR9XG5cdFx0XHRjYXNlIEJMT0NLQ0hBSU5fTkVUV09SSy5FVEhFUkVVTToge1xuXHRcdFx0XHQvLyBPYnRlbmVtb3MgZWwgd2FsbGV0XG5cdFx0XHRcdGNvbnN0IGV0aGVyZXVtV2FsbGV0ID0gaGRrZXkuZnJvbU1hc3RlclNlZWQodGhpcy5zZWVkKS5kZXJpdmUoaGRQYXRoKS5kZXJpdmVDaGlsZChpbmRleCk7XG5cblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHDDumJsaWNhXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9ICcweCcgKyBldGhlcmV1bVdhbGxldC5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBwcml2YWRhXG5cdFx0XHRcdGNvbnN0IHByaXZhdGVLZXk6IHN0cmluZyA9ICcweCcgKyBldGhlcmV1bVdhbGxldC5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcblxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgZGlyZWNjacOzblxuXHRcdFx0XHRjb25zdCBhZGRyZXNzQnVmZmVyID0gcHVibGljVG9BZGRyZXNzKGV0aGVyZXVtV2FsbGV0LnB1YmxpY0tleSwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGFkZHJlc3M6IHN0cmluZyA9IHRvQ2hlY2tzdW1BZGRyZXNzKCcweCcgKyBCdWZmZXIuZnJvbShhZGRyZXNzQnVmZmVyKS50b1N0cmluZygnaGV4JykpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoYWRkcmVzcywgcHJpdmF0ZUtleSwgcHVibGljS2V5KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmluY2x1ZGVQcml2YXRlS2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5LCBwcml2YXRlS2V5IH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXkgfTtcblx0XHRcdH1cblx0XHRcdGNhc2UgQkxPQ0tDSEFJTl9ORVRXT1JLLlJJUFBMRToge1xuXHRcdFx0XHQvLyBFeHRyYWVtb3MgbGEgZGlyZWNjacOzblxuXHRcdFx0XHRjb25zdCB7IGFkZHJlc3M6IHhycEFkZHJlc3MgfSA9IHBheW1lbnRzLnAycGtoKHsgcHVia2V5OiBrZXlQYWlyLnB1YmxpY0tleSB9KTtcblxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcMO6YmxpY2Fcblx0XHRcdFx0Y29uc3QgcHVibGljS2V5ID0gQnVmZmVyLmZyb20oa2V5UGFpci5wdWJsaWNLZXkpLnRvU3RyaW5nKCdoZXgnKTtcblxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYVxuXHRcdFx0XHRjb25zdCBwcml2YXRlS2V5OiBzdHJpbmcgPSBCdWZmZXIuZnJvbShrZXlQYWlyLnByaXZhdGVLZXkpLnRvU3RyaW5nKCdoZXgnKTtcblxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgZGlyZWNjacOzblxuXHRcdFx0XHRjb25zdCBhZGRyZXNzID0gdGhpcy5jb252ZXJ0UmlwcGxlQWRycih4cnBBZGRyZXNzKTtcblxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcblx0XHRcdFx0XHR0aGlzLnByaW50V2FsbGV0KGFkZHJlc3MsIHByaXZhdGVLZXksIHB1YmxpY0tleSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5pbmNsdWRlUHJpdmF0ZUtleSkge1xuXHRcdFx0XHRcdHJldHVybiB7IGFkZHJlc3MsIHB1YmxpY0tleSwgcHJpdmF0ZUtleSB9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5IH07XG5cdFx0XHR9XG5cdFx0XHRjYXNlIEJMT0NLQ0hBSU5fTkVUV09SSy5UUk9OOiB7XG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYSBlbiBmb3JtYXRvIGRlIGV0aGVyZXVtXG5cdFx0XHRcdGNvbnN0IGV0aFB1YktleSA9IGltcG9ydFB1YmxpYyhrZXlQYWlyLnB1YmxpY0tleSk7XG5cblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHDDumJsaWNhXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKGtleVBhaXIucHVibGljS2V5KS50b1N0cmluZygnaGV4Jyk7XG5cblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGFcblx0XHRcdFx0Y29uc3QgcHJpdmF0ZUtleTogc3RyaW5nID0gQnVmZmVyLmZyb20oa2V5UGFpci5wcml2YXRlS2V5KS50b1N0cmluZygnaGV4Jyk7XG5cblx0XHRcdFx0Ly8gQ2xhdmUgcMO6YmxpY2EgYSBkaXJlY2Npw7NuXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3NCdWZmZXIgPSBwdWJsaWNUb0FkZHJlc3MoZXRoUHViS2V5KTtcblxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgZGlyZWNjacOzblxuXHRcdFx0XHRjb25zdCBhZGRyZXNzOiBzdHJpbmcgPSBiaXRjb2luanNBZGRyZXNzLnRvQmFzZTU4Q2hlY2soYWRkcmVzc0J1ZmZlciwgMHg0MSk7XG5cblx0XHRcdFx0aWYgKHRoaXMubG9nKSB7XG5cdFx0XHRcdFx0dGhpcy5wcmludFdhbGxldChhZGRyZXNzLCBwcml2YXRlS2V5LCBwdWJsaWNLZXkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcblx0XHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXksIHByaXZhdGVLZXkgfTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB7IGFkZHJlc3MsIHB1YmxpY0tleSB9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGUgYmlwMzIgZXh0ZW5kZWQga2V5IGJ5IHJvb3Qga2V5XG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QklQMzJJbnRlcmZhY2V9IGJpcDMyUm9vdEtleVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuXHQgKiBAcmV0dXJuIHsqfSAge0JJUDMySW50ZXJmYWNlfVxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcblx0ICovXG5cdHByaXZhdGUgY2FsY0JpcDMyRXh0ZW5kZWRLZXkoYmlwMzJSb290S2V5OiBCSVAzMkludGVyZmFjZSwgcGF0aDogc3RyaW5nKTogQklQMzJJbnRlcmZhY2Uge1xuXHRcdGxldCBleHRlbmRlZEtleTogQklQMzJJbnRlcmZhY2UgPSBiaXAzMlJvb3RLZXk7XG5cdFx0Y29uc3QgcGF0aEJpdHM6IHN0cmluZ1tdID0gcGF0aC5zcGxpdCgnLycpO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoQml0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgYml0OiBzdHJpbmcgPSBwYXRoQml0c1tpXTtcblx0XHRcdGNvbnN0IGluZGV4OiBudW1iZXIgPSBwYXJzZUludChiaXQpO1xuXG5cdFx0XHRpZiAoaXNOYU4oaW5kZXgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBoYXJkZW5lZDogYm9vbGVhbiA9IGJpdFtiaXQubGVuZ3RoIC0gMV0gPT09IFwiJ1wiO1xuXG5cdFx0XHRpZiAoaGFyZGVuZWQpIHtcblx0XHRcdFx0ZXh0ZW5kZWRLZXkgPSBleHRlbmRlZEtleS5kZXJpdmVIYXJkZW5lZChpbmRleCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRleHRlbmRlZEtleSA9IGV4dGVuZGVkS2V5LmRlcml2ZShpbmRleCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV4dGVuZGVkS2V5O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnQgYWRkcmVzcyB0byBSaXBwbGUgYWRkcmVzc1xuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuXHQgKiBAcmV0dXJuIHsqfSAge3N0cmluZ31cblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XG5cdCAqL1xuXHRwcml2YXRlIGNvbnZlcnRSaXBwbGVBZHJyKGFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGJhc2V4KCdycHNobmFmMzl3QlVETkVHSEpLTE00UFFSU1Q3VldYWVoyYmNkZUNnNjVqa204b0ZxaTF0dXZBeHl6JykuZW5jb2RlKFxuXHRcdFx0YmFzZXgoJzEyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXonKS5kZWNvZGUoYWRkcmVzcyksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmludCB3YWxsZXRcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3Ncblx0ICogQHBhcmFtIHtzdHJpbmd9IHBydktleVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHViS2V5XG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxuXHQgKi9cblx0cHJpdmF0ZSBwcmludFdhbGxldChhZGRyZXNzOiBzdHJpbmcsIHBydktleTogc3RyaW5nLCBwdWJLZXk6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnNvbGUubG9nKCdBZGRyZXNzOiAlcyBcXHJcXG5Qcml2YXRlIEtleTogJXMgXFxyXFxuUHVibGljIEtleTogJXMgXFxyXFxuPT09PT09PT09PT09PT09PT09PT09PT09PVxcclxcblxcclxcbicsIGFkZHJlc3MsIHBydktleSwgcHViS2V5KTtcblx0fVxufVxuXG5leHBvcnQgeyBCTE9DS0NIQUlOX05FVFdPUkssIEhEV2FsbGV0IH07XG4iXSwibWFwcGluZ3MiOiI4a0NBUUssQ0FBQUEsa0JBQWtCLENBQUFDLE9BQUEsQ0FBQUQsa0JBQUEsdUJBQWxCQSxDQUFrQixRQUFsQixDQUFBQSxDQUFrQixDQUFBRSxPQUFBLFdBQWxCRixDQUFrQixDQUFBRyxlQUFBLGtCQUFsQkgsQ0FBa0IsQ0FBQUksUUFBQSxZQUFsQkosQ0FBa0IsQ0FBQUssUUFBQSxZQUFsQkwsQ0FBa0IsQ0FBQU0sTUFBQSxVQUFsQk4sQ0FBa0IsQ0FBQU8sSUFBQSxRQUFsQlAsQ0FBa0IsRUFBbEJBLGtCQUFrQixNQVN2QixLQUFNLENBQUFRLFFBQVMsQ0ErQ2Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQ0NDLFdBQVdBLENBQUNDLENBQTRCLENBQUVDLENBQW9CLENBQUVDLENBQTBCLEdBQVEsQ0FBRUMsQ0FBWSxHQUFRLENBQUUsSUFBQUMsZ0JBQUEsQ0FBQUMsT0FBQSwwQkF2RHZFLENBQ2xEQyxPQUFPLENBQUUsQ0FDUkMsYUFBYSxDQUFFLCtCQUErQixDQUM5Q0MsTUFBTSxDQUFFLElBQUksQ0FDWkMsS0FBSyxDQUFFLENBQ05DLE1BQU0sQ0FBRSxRQUFVLENBQ2xCQyxPQUFPLENBQUUsUUFDVixDQUFDLENBQ0RDLFVBQVUsQ0FBRSxDQUFJLENBQ2hCQyxVQUFVLENBQUUsQ0FBSSxDQUNoQkMsR0FBRyxDQUFFLEdBQ04sQ0FBQyxDQUNEQyxjQUFjLENBQUUsQ0FDZlIsYUFBYSxDQUFFLCtCQUErQixDQUM5Q0MsTUFBTSxDQUFFLE1BQU0sQ0FDZEMsS0FBSyxDQUFFLENBQ05DLE1BQU0sQ0FBRSxRQUFVLENBQ2xCQyxPQUFPLENBQUUsUUFDVixDQUFDLENBQ0RDLFVBQVUsQ0FBRSxHQUFJLENBQ2hCQyxVQUFVLENBQUUsR0FBSSxDQUNoQkMsR0FBRyxDQUFFLEdBQ04sQ0FBQyxDQUNERSxRQUFRLENBQUUsQ0FDVFQsYUFBYSxDQUFFLGdDQUFnQyxDQUMvQ0MsTUFBTSxDQUFFLEtBQUssQ0FDYkMsS0FBSyxDQUFFLENBQ05DLE1BQU0sQ0FBRSxRQUFVLENBQ2xCQyxPQUFPLENBQUUsUUFDVixDQUFDLENBQ0RDLFVBQVUsQ0FBRSxFQUFJLENBQ2hCQyxVQUFVLENBQUUsRUFBSSxDQUNoQkMsR0FBRyxDQUFFLEdBQ04sQ0FDRCxDQUFDLEtBQUFWLGdCQUFBLENBQUFDLE9BQUEsNEJBQUFELGdCQUFBLENBQUFDLE9BQUEsdUNBQUFELGdCQUFBLENBQUFDLE9BQUEsNkJBQUFELGdCQUFBLENBQUFDLE9BQUEsaUNBQUFELGdCQUFBLENBQUFDLE9BQUEsc0NBQUFELGdCQUFBLENBQUFDLE9BQUEseUJBQUFELGdCQUFBLENBQUFDLE9BQUEscUJBc0JBLElBQUksQ0FBQ0wsUUFBUSxDQUFHQSxDQUFRLENBQ3hCLElBQUksQ0FBQ0MsWUFBWSxDQUFHQSxDQUFZLENBQ2hDLElBQUksQ0FBQ0MsaUJBQWlCLENBQUdBLENBQWlCLENBQzFDLElBQUksQ0FBQ2UsSUFBSSxDQUFHLEdBQUFDLHdCQUFrQixFQUFDLElBQUksQ0FBQ2pCLFlBQVksQ0FBQyxDQUNqRCxJQUFJLENBQUNFLEdBQUcsQ0FBR0EsQ0FDWixDQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFDUWdCLFFBQVFBLENBQUNDLENBQVksQ0FBRUMsQ0FBYSxDQUErRCxDQUN6RztBQUNBLEtBQU0sQ0FBQUMsQ0FBYyxDQUFHLElBQUksQ0FBR0YsQ0FBSSxDQUU5QixJQUFJLENBQUNqQixHQUFHLEdBQ1hvQixPQUFPLENBQUNwQixHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FDeENvQixPQUFPLENBQUNwQixHQUFHLENBQUMsY0FBYyxDQUFFLElBQUksQ0FBQ0YsWUFBWSxDQUFDLENBQzlDc0IsT0FBTyxDQUFDcEIsR0FBRyxDQUFDLGlCQUFpQixDQUFFbUIsQ0FBTSxDQUFDLEVBR3ZDO0FBQUEsS0FDTSxDQUFBRSxDQUFZLENBQUcsSUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUN6QixRQUFRLENBQUMsQ0FFbkRTLENBQWUsQ0FBRyxHQUFBaUIsWUFBWSxFQUFDQyxHQUFHLENBQUMsQ0FEekM7QUFFQTtBQUtBLEdBSkEsSUFBSSxDQUFDQyxPQUFPLENBQUduQixDQUFLLENBQUNvQixRQUFRLENBQUMsSUFBSSxDQUFDWixJQUFJLENBQUVPLENBQU8sQ0FBQyxDQUVqRCxJQUFJLENBQUNNLGtCQUFrQixDQUFHLElBQUksQ0FBQ0Msb0JBQW9CLENBQUMsSUFBSSxDQUFDSCxPQUFPLENBQUVOLENBQU0sQ0FBQyxDQUVyRSxJQUFJLENBQUNuQixHQUFHLENBQUUsQ0FDYjtBQUFBLEtBQ00sQ0FBQTZCLENBQW1CLENBQUcsSUFBSSxDQUFDRixrQkFBa0IsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FDeERDLENBQW1CLENBQUcsSUFBSSxDQUFDSixrQkFBa0IsQ0FBQ0ssUUFBUSxDQUFDLENBQUMsQ0FBQ0YsUUFBUSxDQUFDLENBQUMsQ0FFekVWLE9BQU8sQ0FBQ3BCLEdBQUcsQ0FBQywwRUFBMEUsQ0FBRTZCLENBQVcsQ0FBRUUsQ0FBVyxDQUNqSCxDQUVBO0FBQ0EsS0FBTSxDQUFBRSxDQUF1QixDQUFHLElBQUksQ0FBQ04sa0JBQWtCLENBQUNPLE1BQU0sQ0FBQ2hCLENBQUssQ0FBQyxDQUVyRSxPQUFRLElBQUksQ0FBQ3JCLFFBQVEsRUFDcEIsSUFBSyxDQUFBVixrQkFBa0IsQ0FBQ0UsT0FBTyxDQUMvQixJQUFLLENBQUFGLGtCQUFrQixDQUFDRyxlQUFlLENBQ3ZDLElBQUssQ0FBQUgsa0JBQWtCLENBQUNJLFFBQVEsQ0FBRSxDQUNqQztBQUFBLEtBQ00sQ0FBRTRDLE9BQU8sQ0FBRUMsQ0FBYyxDQUFDLENBQUdDLHNCQUFRLENBQUNDLE1BQU0sQ0FBQyxDQUFFQyxNQUFNLENBQUVOLENBQU8sQ0FBQ08sU0FBUyxDQUFFbkIsT0FBTyxDQUFQQSxDQUFRLENBQUMsQ0FBQyxDQUdwRm1CLENBQVMsQ0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUNULENBQU8sQ0FBQ08sU0FBUyxDQUFDLENBQUNHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FEaEU7QUFBQSxNQUdJLEtBQUksQ0FBQzNDLEdBQUcsRUFDWCxJQUFJLENBQUM0QyxXQUFXLENBQUNSLENBQWEsQ0FBRUgsQ0FBTyxDQUFDWSxLQUFLLENBQUMsQ0FBQyxDQUFFTCxDQUFTLENBQUMsQ0FHeEQsSUFBSSxDQUFDekMsaUJBQWlCLENBQ2xCLENBQUVvQyxPQUFPLENBQUVDLENBQWEsQ0FBRUksU0FBUyxDQUFUQSxDQUFTLENBQUVNLFVBQVUsQ0FBRWIsQ0FBTyxDQUFDWSxLQUFLLENBQUMsQ0FBRSxDQUFDLENBR25FLENBQUVWLE9BQU8sQ0FBRUMsQ0FBYSxDQUFFSSxTQUFTLENBQVRBLENBQVUsQ0FDNUMsQ0FDQSxJQUFLLENBQUFyRCxrQkFBa0IsQ0FBQ0ssUUFBUSxDQUFFLENBQ2pDO0FBQUEsS0FDTSxDQUFBdUQsQ0FBYyxDQUFHQyxjQUFLLENBQUNDLGNBQWMsQ0FBQyxJQUFJLENBQUNuQyxJQUFJLENBQUMsQ0FBQ29CLE1BQU0sQ0FBQ2YsQ0FBTSxDQUFDLENBQUMrQixXQUFXLENBQUNoQyxDQUFLLENBQUMsQ0FHbEZzQixDQUFTLENBQUcsSUFBSSxDQUFHTyxDQUFjLENBQUNQLFNBQVMsQ0FBQ0csUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUczREcsQ0FBa0IsQ0FBRyxJQUFJLENBQUdDLENBQWMsQ0FBQ0QsVUFBVSxDQUFDSCxRQUFRLENBQUMsS0FBSyxDQUFDLENBR3JFUSxDQUFhLENBQUcsR0FBQUMscUJBQWUsRUFBQ0wsQ0FBYyxDQUFDUCxTQUFTLEdBQU0sQ0FBQyxDQUMvREwsQ0FBZSxDQUFHLEdBQUFrQix1QkFBaUIsRUFBQyxJQUFJLENBQUdaLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDUyxDQUFhLENBQUMsQ0FBQ1IsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBUjVGO0FBR0E7QUFHQTtBQUFBLE1BSUksS0FBSSxDQUFDM0MsR0FBRyxFQUNYLElBQUksQ0FBQzRDLFdBQVcsQ0FBQ1QsQ0FBTyxDQUFFVyxDQUFVLENBQUVOLENBQVMsQ0FBQyxDQUc3QyxJQUFJLENBQUN6QyxpQkFBaUIsQ0FDbEIsQ0FBRW9DLE9BQU8sQ0FBUEEsQ0FBTyxDQUFFSyxTQUFTLENBQVRBLENBQVMsQ0FBRU0sVUFBVSxDQUFWQSxDQUFXLENBQUMsQ0FHbkMsQ0FBRVgsT0FBTyxDQUFQQSxDQUFPLENBQUVLLFNBQVMsQ0FBVEEsQ0FBVSxDQUM3QixDQUNBLElBQUssQ0FBQXJELGtCQUFrQixDQUFDTSxNQUFNLENBQUUsQ0FDL0I7QUFBQSxLQUNNLENBQUUwQyxPQUFPLENBQUVtQixDQUFXLENBQUMsQ0FBR2pCLHNCQUFRLENBQUNrQixLQUFLLENBQUMsQ0FBRWhCLE1BQU0sQ0FBRU4sQ0FBTyxDQUFDTyxTQUFVLENBQUMsQ0FBQyxDQUd2RUEsQ0FBUyxDQUFHQyxNQUFNLENBQUNDLElBQUksQ0FBQ1QsQ0FBTyxDQUFDTyxTQUFTLENBQUMsQ0FBQ0csUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUcxREcsQ0FBa0IsQ0FBR0wsTUFBTSxDQUFDQyxJQUFJLENBQUNULENBQU8sQ0FBQ2EsVUFBVSxDQUFDLENBQUNILFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FHcEVSLENBQU8sQ0FBRyxJQUFJLENBQUNxQixpQkFBaUIsQ0FBQ0YsQ0FBVSxDQUFDLENBUGxEO0FBR0E7QUFHQTtBQUFBLE1BR0ksS0FBSSxDQUFDdEQsR0FBRyxFQUNYLElBQUksQ0FBQzRDLFdBQVcsQ0FBQ1QsQ0FBTyxDQUFFVyxDQUFVLENBQUVOLENBQVMsQ0FBQyxDQUc3QyxJQUFJLENBQUN6QyxpQkFBaUIsQ0FDbEIsQ0FBRW9DLE9BQU8sQ0FBUEEsQ0FBTyxDQUFFSyxTQUFTLENBQVRBLENBQVMsQ0FBRU0sVUFBVSxDQUFWQSxDQUFXLENBQUMsQ0FHbkMsQ0FBRVgsT0FBTyxDQUFQQSxDQUFPLENBQUVLLFNBQVMsQ0FBVEEsQ0FBVSxDQUM3QixDQUNBLElBQUssQ0FBQXJELGtCQUFrQixDQUFDTyxJQUFJLENBQUUsQ0FDN0I7QUFBQSxLQUNNLENBQUErRCxDQUFTLENBQUcsR0FBQUMsa0JBQVksRUFBQ3pCLENBQU8sQ0FBQ08sU0FBUyxDQUFDLENBRzNDQSxDQUFTLENBQUdDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDVCxDQUFPLENBQUNPLFNBQVMsQ0FBQyxDQUFDRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBRzFERyxDQUFrQixDQUFHTCxNQUFNLENBQUNDLElBQUksQ0FBQ1QsQ0FBTyxDQUFDYSxVQUFVLENBQUMsQ0FBQ0gsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUdwRVEsQ0FBYSxDQUFHLEdBQUFDLHFCQUFlLEVBQUNLLENBQVMsQ0FBQyxDQUcxQ3RCLENBQWUsQ0FBR3dCLHFCQUFnQixDQUFDQyxhQUFhLENBQUNULENBQWEsQ0FBRSxFQUFJLENBQUMsQ0FWM0U7QUFHQTtBQUdBO0FBR0E7QUFBQSxNQUdJLEtBQUksQ0FBQ25ELEdBQUcsRUFDWCxJQUFJLENBQUM0QyxXQUFXLENBQUNULENBQU8sQ0FBRVcsQ0FBVSxDQUFFTixDQUFTLENBQUMsQ0FHN0MsSUFBSSxDQUFDekMsaUJBQWlCLENBQ2xCLENBQUVvQyxPQUFPLENBQVBBLENBQU8sQ0FBRUssU0FBUyxDQUFUQSxDQUFTLENBQUVNLFVBQVUsQ0FBVkEsQ0FBVyxDQUFDLENBR25DLENBQUVYLE9BQU8sQ0FBUEEsQ0FBTyxDQUFFSyxTQUFTLENBQVRBLENBQVUsQ0FDN0IsQ0FDRCxDQUNELENBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQ1NaLG9CQUFvQkEsQ0FBQ2lDLENBQTRCLENBQUU1QyxDQUFZLENBQWtCLENBQ3hGLEdBQUksQ0FBQTZDLENBQTJCLENBQUdELENBQVksQ0FDOUMsS0FBTSxDQUFBRSxDQUFrQixDQUFHOUMsQ0FBSSxDQUFDK0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUUxQyxJQUFLLEdBQUksQ0FBQUMsQ0FBQyxDQUFHLENBQUMsQ0FBRUEsQ0FBQyxDQUFHRixDQUFRLENBQUNHLE1BQU0sQ0FBRUQsQ0FBQyxFQUFFLENBQUUsTUFDbkMsQ0FBQUUsQ0FBVyxDQUFHSixDQUFRLENBQUNFLENBQUMsQ0FBQyxDQUN6Qi9DLENBQWEsQ0FBR2tELFFBQVEsQ0FBQ0QsQ0FBRyxDQUFDLENBRW5DLEdBQUlFLEtBQUssQ0FBQ25ELENBQUssQ0FBQyxDQUNmLFNBR0QsS0FBTSxDQUFBb0QsQ0FBaUIsQ0FBMkIsR0FBRyxHQUEzQkgsQ0FBRyxDQUFDQSxDQUFHLENBQUNELE1BQU0sQ0FBRyxDQUFDLENBQVMsQ0FHcERKLENBQVcsQ0FEUlEsQ0FBUSxDQUNHUixDQUFXLENBQUNTLGNBQWMsQ0FBQ3JELENBQUssQ0FBQyxDQUVqQzRDLENBQVcsQ0FBQzVCLE1BQU0sQ0FBQ2hCLENBQUssQ0FFeEMsQ0FFQSxNQUFPLENBQUE0QyxDQUFXLENBQ25CLENBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUNTTixpQkFBaUJBLENBQUNyQixDQUFlLENBQVUsQ0FDbEQsTUFBTyxHQUFBcUMsY0FBSyxFQUFDLDREQUE0RCxDQUFDLENBQUNDLE1BQU0sQ0FDaEYsR0FBQUQsY0FBSyxFQUFDLDREQUE0RCxDQUFDLENBQUNFLE1BQU0sQ0FBQ3ZDLENBQU8sQ0FDbkYsQ0FBQyxDQUNGLENBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQ1NTLFdBQVdBLENBQUNULENBQWUsQ0FBRXdDLENBQWMsQ0FBRUMsQ0FBYyxDQUFRLENBQzFFeEQsT0FBTyxDQUFDcEIsR0FBRyxDQUFDLDBGQUEwRixDQUFFbUMsQ0FBTyxDQUFFd0MsQ0FBTSxDQUFFQyxDQUFNLENBQ2hJLENBQ0QsQ0FBQ3hGLE9BQUEsQ0FBQU8sUUFBQSxDQUFBQSxRQUFBIiwiaWdub3JlTGlzdCI6W119