UNPKG

@samyan/hd-wallet

Version:

53 lines 26.2 kB
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty")),_baseX=_interopRequireDefault(require("base-x")),_bip=_interopRequireDefault(require("bip32")),_bip2=require("bip39"),_bitcoinjsLib=require("bitcoinjs-lib"),_ethereumjsUtil=require("ethereumjs-util"),_ethereumjsWallet=require("ethereumjs-wallet"),ecc=_interopRequireWildcard(require("tiny-secp256k1"));function _getRequireWildcardCache(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(_getRequireWildcardCache=function(a){return a?c:b})(a)}function _interopRequireWildcard(a,b){if(!b&&a&&a.__esModule)return a;if(null===a||"object"!=typeof a&&"function"!=typeof a)return{default:a};var c=_getRequireWildcardCache(b);if(c&&c.has(a))return c.get(a);var d={},e=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var f in a)if("default"!=f&&Object.prototype.hasOwnProperty.call(a,f)){var g=e?Object.getOwnPropertyDescriptor(a,f):null;g&&(g.get||g.set)?Object.defineProperty(d,f,g):d[f]=a[f]}return d.default=a,c&&c.set(a,d),d}class HDWallet{/** * Constructor * * @param {string} 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 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"bitcoin":case"bitcoinRegTest":case"litecoin":{// Extraemos la dirección const{address:a}=_bitcoinjsLib.payments.p2wpkh({pubkey:f.publicKey,network:d}),b=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"ethereum":{// Obtenemos el wallet const a=_ethereumjsWallet.hdkey.fromMasterSeed(this.seed).derivePath(c).deriveChild(b).getWallet(),d=a.getPublicKeyString(),e=a.getPrivateKeyString(),f=a.getAddressString();// Obtenemos la clave pública return this.log&&this.printWallet(f,e,d),this.includePrivateKey?{address:f,publicKey:d,privateKey:e}:{address:f,publicKey:d}}case"ripple":{// Extraemos la dirección const{address:a}=_bitcoinjsLib.payments.p2pkh({pubkey:f.publicKey}),b=f.publicKey.toString("hex"),c=f.privateKey.toString("hex"),d=this.convertRippleAdrr(a);// Obtenemos la clave pública return this.log&&this.printWallet(d,c,b),this.includePrivateKey?{address:d,publicKey:b,privateKey:c}:{address:d,publicKey:b}}case"tron":{// Obtenemos la clave pública en formato de ethereum const a=(0,_ethereumjsUtil.importPublic)(f.publicKey),b=f.publicKey.toString("hex"),c=f.privateKey.toString("hex"),d=(0,_ethereumjsUtil.publicToAddress)(a),e=_bitcoinjsLib.address.toBase58Check(d,65);// Obtenemos la clave pública return this.log&&this.printWallet(e,c,f.publicKey.toString("hex")),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)}}var _default=HDWallet;exports.default=_default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIRFdhbGxldCIsImNvbnN0cnVjdG9yIiwicHJvdG9jb2wiLCJtbmVtb25pY1dvcmQiLCJpbmNsdWRlUHJpdmF0ZUtleSIsImxvZyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiYml0Y29pbiIsIm1lc3NhZ2VQcmVmaXgiLCJiZWNoMzIiLCJiaXAzMiIsInB1YmxpYyIsInByaXZhdGUiLCJwdWJLZXlIYXNoIiwic2NyaXB0SGFzaCIsIndpZiIsImJpdGNvaW5SZWdUZXN0IiwibGl0ZWNvaW4iLCJzZWVkIiwibW5lbW9uaWNUb1NlZWRTeW5jIiwiZ2VuZXJhdGUiLCJwYXRoIiwiaW5kZXgiLCJoZFBhdGgiLCJjb25zb2xlIiwibmV0d29yayIsInNlZ3dpdFBhcmFtZXRlcnMiLCJCSVAzMkZhY3RvcnkiLCJlY2MiLCJyb290S2V5IiwiZnJvbVNlZWQiLCJhY2NvdW50RXh0ZW5kZWRLZXkiLCJjYWxjQmlwMzJFeHRlbmRlZEtleSIsImFjY291bnRYcHJ2IiwidG9CYXNlNTgiLCJhY2NvdW50WHB1YiIsIm5ldXRlcmVkIiwia2V5UGFpciIsImRlcml2ZSIsImFkZHJlc3MiLCJwMndwa2hBZGRyZXNzIiwicGF5bWVudHMiLCJwMndwa2giLCJwdWJrZXkiLCJwdWJsaWNLZXkiLCJ0b1N0cmluZyIsInByaW50V2FsbGV0IiwidG9XSUYiLCJwcml2YXRlS2V5IiwiZXRoZXJldW1XYWxsZXQiLCJoZGtleSIsImZyb21NYXN0ZXJTZWVkIiwiZGVyaXZlUGF0aCIsImRlcml2ZUNoaWxkIiwiZ2V0V2FsbGV0IiwiZ2V0UHVibGljS2V5U3RyaW5nIiwiZ2V0UHJpdmF0ZUtleVN0cmluZyIsImdldEFkZHJlc3NTdHJpbmciLCJ4cnBBZGRyZXNzIiwicDJwa2giLCJjb252ZXJ0UmlwcGxlQWRyciIsImV0aFB1YktleSIsImltcG9ydFB1YmxpYyIsImFkZHJlc3NCdWZmZXIiLCJwdWJsaWNUb0FkZHJlc3MiLCJiaXRjb2luanNBZGRyZXNzIiwidG9CYXNlNThDaGVjayIsImJpcDMyUm9vdEtleSIsImV4dGVuZGVkS2V5IiwicGF0aEJpdHMiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJiaXQiLCJwYXJzZUludCIsImlzTmFOIiwiaGFyZGVuZWQiLCJkZXJpdmVIYXJkZW5lZCIsImJhc2V4IiwiZW5jb2RlIiwiZGVjb2RlIiwicHJ2S2V5IiwicHViS2V5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBiYXNleCBmcm9tICdiYXNlLXgnO1xyXG5pbXBvcnQgQklQMzJGYWN0b3J5LCB7IEJJUDMyQVBJLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcclxuaW1wb3J0IHsgbW5lbW9uaWNUb1NlZWRTeW5jIH0gZnJvbSAnYmlwMzknO1xyXG5pbXBvcnQgeyBhZGRyZXNzIGFzIGJpdGNvaW5qc0FkZHJlc3MsIHBheW1lbnRzIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XHJcbmltcG9ydCB7IGltcG9ydFB1YmxpYywgcHVibGljVG9BZGRyZXNzIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcclxuaW1wb3J0IHsgaGRrZXkgfSBmcm9tICdldGhlcmV1bWpzLXdhbGxldCc7XHJcbmltcG9ydCAqIGFzIGVjYyBmcm9tICd0aW55LXNlY3AyNTZrMSc7XHJcblxyXG5jbGFzcyBIRFdhbGxldCB7XHJcblx0cHJpdmF0ZSBzZWd3aXRQYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge1xyXG5cdFx0Yml0Y29pbjoge1xyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MThCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbicsXHJcblx0XHRcdGJlY2gzMjogJ2JjJyxcclxuXHRcdFx0YmlwMzI6IHtcclxuXHRcdFx0XHRwdWJsaWM6IDB4MDRiMjQ3NDYsXHJcblx0XHRcdFx0cHJpdmF0ZTogMHgwNGIyNDMwYyxcclxuXHRcdFx0fSxcclxuXHRcdFx0cHViS2V5SGFzaDogMHgwMCxcclxuXHRcdFx0c2NyaXB0SGFzaDogMHgwNSxcclxuXHRcdFx0d2lmOiAweDgwLFxyXG5cdFx0fSxcclxuXHRcdGJpdGNvaW5SZWdUZXN0OiB7XHJcblx0XHRcdG1lc3NhZ2VQcmVmaXg6ICdcXHgxOEJpdGNvaW4gU2lnbmVkIE1lc3NhZ2U6XFxuJyxcclxuXHRcdFx0YmVjaDMyOiAnYmNydCcsXHJcblx0XHRcdGJpcDMyOiB7XHJcblx0XHRcdFx0cHVibGljOiAweDA0MzU4N2NmLFxyXG5cdFx0XHRcdHByaXZhdGU6IDB4MDQzNTgzOTQsXHJcblx0XHRcdH0sXHJcblx0XHRcdHB1YktleUhhc2g6IDB4NmYsXHJcblx0XHRcdHNjcmlwdEhhc2g6IDB4YzQsXHJcblx0XHRcdHdpZjogMHhlZixcclxuXHRcdH0sXHJcblx0XHRsaXRlY29pbjoge1xyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MTlMaXRlY29pbiBTaWduZWQgTWVzc2FnZTpcXG4nLFxyXG5cdFx0XHRiZWNoMzI6ICdsdGMnLFxyXG5cdFx0XHRiaXAzMjoge1xyXG5cdFx0XHRcdHB1YmxpYzogMHgwNGIyNDc0NixcclxuXHRcdFx0XHRwcml2YXRlOiAweDA0YjI0MzBjLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRwdWJLZXlIYXNoOiAweDMwLFxyXG5cdFx0XHRzY3JpcHRIYXNoOiAweDMyLFxyXG5cdFx0XHR3aWY6IDB4YjAsXHJcblx0XHR9LFxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcm9vdEtleTogQklQMzJJbnRlcmZhY2U7XHJcblx0cHJpdmF0ZSBhY2NvdW50RXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlO1xyXG5cclxuXHRwcml2YXRlIHByb3RvY29sOiBzdHJpbmc7XHJcblx0cHJpdmF0ZSBtbmVtb25pY1dvcmQ6IHN0cmluZztcclxuXHRwcml2YXRlIGluY2x1ZGVQcml2YXRlS2V5OiBib29sZWFuO1xyXG5cdHByaXZhdGUgc2VlZDogQnVmZmVyO1xyXG5cclxuXHRwcml2YXRlIGxvZzogYm9vbGVhbjtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3JcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm90b2NvbFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtbmVtb25pY1dvcmRcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlUHJpdmF0ZUtleT1mYWxzZV1cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2c9ZmFsc2VdXHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IocHJvdG9jb2w6IHN0cmluZywgbW5lbW9uaWNXb3JkOiBzdHJpbmcsIGluY2x1ZGVQcml2YXRlS2V5OiBib29sZWFuID0gZmFsc2UsIGxvZzogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblx0XHR0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XHJcblx0XHR0aGlzLm1uZW1vbmljV29yZCA9IG1uZW1vbmljV29yZDtcclxuXHRcdHRoaXMuaW5jbHVkZVByaXZhdGVLZXkgPSBpbmNsdWRlUHJpdmF0ZUtleTtcclxuXHRcdHRoaXMuc2VlZCA9IG1uZW1vbmljVG9TZWVkU3luYyh0aGlzLm1uZW1vbmljV29yZCk7XHJcblx0XHR0aGlzLmxvZyA9IGxvZztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxyXG5cdCAqIEByZXR1cm4geyp9ICB7c3RyaW5nfVxyXG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZW5lcmF0ZShwYXRoOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB7IGFkZHJlc3M6IHN0cmluZzsgcHVibGljS2V5OiBzdHJpbmc7IHByaXZhdGVLZXk/OiBzdHJpbmcgfSB7XHJcblx0XHQvLyBDb25jYXRlbmFtb3NcclxuXHRcdGNvbnN0IGhkUGF0aDogc3RyaW5nID0gJ20vJyArIHBhdGg7XHJcblxyXG5cdFx0aWYgKHRoaXMubG9nKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdNbmVtb25pYzogJXMnLCB0aGlzLm1uZW1vbmljV29yZCk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdIRCBQYXRoOiAlc1xcclxcbicsIGhkUGF0aCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIHJlZCBzaSBlcyBlbCBjYXNvXHJcblx0XHRjb25zdCBuZXR3b3JrOiBhbnkgPSB0aGlzLnNlZ3dpdFBhcmFtZXRlcnNbdGhpcy5wcm90b2NvbF07XHJcblx0XHQvLyBJbnN0YW5jaWFtb3NcclxuXHRcdGNvbnN0IGJpcDMyOiBCSVAzMkFQSSA9IEJJUDMyRmFjdG9yeShlY2MpO1xyXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIHJvb3Qga2V5XHJcblx0XHR0aGlzLnJvb3RLZXkgPSBiaXAzMi5mcm9tU2VlZCh0aGlzLnNlZWQsIG5ldHdvcmspO1xyXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIGV4dGVuZGlkYSBkZSBsYSBjdWVudGFcclxuXHRcdHRoaXMuYWNjb3VudEV4dGVuZGVkS2V5ID0gdGhpcy5jYWxjQmlwMzJFeHRlbmRlZEtleSh0aGlzLnJvb3RLZXksIGhkUGF0aCk7XHJcblxyXG5cdFx0aWYgKHRoaXMubG9nKSB7XHJcblx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBwcml2YWRhIHkgcMO6YmxpY2FcclxuXHRcdFx0Y29uc3QgYWNjb3VudFhwcnY6IHN0cmluZyA9IHRoaXMuYWNjb3VudEV4dGVuZGVkS2V5LnRvQmFzZTU4KCk7XHJcblx0XHRcdGNvbnN0IGFjY291bnRYcHViOiBzdHJpbmcgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XHJcblxyXG5cdFx0XHRjb25zb2xlLmxvZygnQWNjb3VudCBFeHRlbmRlZCBQcml2YXRlIEtleTogJXMgXFxyXFxuQWNjb3VudCBFeHRlbmRlZCBQdWJsaWMgS2V5OiAlc1xcclxcbicsIGFjY291bnRYcHJ2LCBhY2NvdW50WHB1Yik7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gT2J0ZW5lbW9zIGVsIHdhbGxldFxyXG5cdFx0Y29uc3Qga2V5UGFpcjogQklQMzJJbnRlcmZhY2UgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS5kZXJpdmUoaW5kZXgpO1xyXG5cclxuXHRcdHN3aXRjaCAodGhpcy5wcm90b2NvbCkge1xyXG5cdFx0XHRjYXNlICdiaXRjb2luJzpcclxuXHRcdFx0Y2FzZSAnYml0Y29pblJlZ1Rlc3QnOlxyXG5cdFx0XHRjYXNlICdsaXRlY29pbic6IHtcclxuXHRcdFx0XHQvLyBFeHRyYWVtb3MgbGEgZGlyZWNjacOzblxyXG5cdFx0XHRcdGNvbnN0IHsgYWRkcmVzczogcDJ3cGtoQWRkcmVzcyB9ID0gcGF5bWVudHMucDJ3cGtoKHsgcHVia2V5OiBrZXlQYWlyLnB1YmxpY0tleSwgbmV0d29yayB9KTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHDDumJsaWNhXHJcblx0XHRcdFx0Y29uc3QgcHVibGljS2V5ID0ga2V5UGFpci5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcclxuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQocDJ3cGtoQWRkcmVzcywga2V5UGFpci50b1dJRigpLCBwdWJsaWNLZXkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcclxuXHRcdFx0XHRcdHJldHVybiB7IGFkZHJlc3M6IHAyd3BraEFkZHJlc3MsIHB1YmxpY0tleSwgcHJpdmF0ZUtleToga2V5UGFpci50b1dJRigpIH07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzLCBwdWJsaWNLZXkgfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjYXNlICdldGhlcmV1bSc6IHtcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgZWwgd2FsbGV0XHJcblx0XHRcdFx0Y29uc3QgZXRoZXJldW1XYWxsZXQgPSBoZGtleS5mcm9tTWFzdGVyU2VlZCh0aGlzLnNlZWQpLmRlcml2ZVBhdGgoaGRQYXRoKS5kZXJpdmVDaGlsZChpbmRleCkuZ2V0V2FsbGV0KCk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxyXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9IGV0aGVyZXVtV2FsbGV0LmdldFB1YmxpY0tleVN0cmluZygpO1xyXG5cclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYVxyXG5cdFx0XHRcdGNvbnN0IHByaXZhdGVLZXk6IHN0cmluZyA9IGV0aGVyZXVtV2FsbGV0LmdldFByaXZhdGVLZXlTdHJpbmcoKTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCBhZGRyZXNzOiBzdHJpbmcgPSBldGhlcmV1bVdhbGxldC5nZXRBZGRyZXNzU3RyaW5nKCk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRcdFx0dGhpcy5wcmludFdhbGxldChhZGRyZXNzLCBwcml2YXRlS2V5LCBwdWJsaWNLZXkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcclxuXHRcdFx0XHRcdHJldHVybiB7IGFkZHJlc3MsIHB1YmxpY0tleSwgcHJpdmF0ZUtleSB9O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5IH07XHJcblx0XHRcdH1cclxuXHRcdFx0Y2FzZSAncmlwcGxlJzoge1xyXG5cdFx0XHRcdC8vIEV4dHJhZW1vcyBsYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgeyBhZGRyZXNzOiB4cnBBZGRyZXNzIH0gPSBwYXltZW50cy5wMnBraCh7IHB1YmtleToga2V5UGFpci5wdWJsaWNLZXkgfSk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxyXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9IGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGFcclxuXHRcdFx0XHRjb25zdCBwcml2YXRlS2V5OiBzdHJpbmcgPSBrZXlQYWlyLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xyXG5cclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgZGlyZWNjacOzblxyXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3MgPSB0aGlzLmNvbnZlcnRSaXBwbGVBZHJyKHhycEFkZHJlc3MpO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcclxuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoYWRkcmVzcywgcHJpdmF0ZUtleSwgcHVibGljS2V5KTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmluY2x1ZGVQcml2YXRlS2V5KSB7XHJcblx0XHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXksIHByaXZhdGVLZXkgfTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiB7IGFkZHJlc3MsIHB1YmxpY0tleSB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGNhc2UgJ3Ryb24nOiB7XHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHDDumJsaWNhIGVuIGZvcm1hdG8gZGUgZXRoZXJldW1cclxuXHRcdFx0XHRjb25zdCBldGhQdWJLZXk6IEJ1ZmZlciA9IGltcG9ydFB1YmxpYyhrZXlQYWlyLnB1YmxpY0tleSk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxyXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9IGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGFcclxuXHRcdFx0XHRjb25zdCBwcml2YXRlS2V5OiBzdHJpbmcgPSBrZXlQYWlyLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xyXG5cclxuXHRcdFx0XHQvLyBDbGF2ZSBww7pibGljYSBhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCBhZGRyZXNzQnVmZmVyOiBCdWZmZXIgPSBwdWJsaWNUb0FkZHJlc3MoZXRoUHViS2V5KTtcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgZGlyZWNjacOzblxyXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3M6IHN0cmluZyA9IGJpdGNvaW5qc0FkZHJlc3MudG9CYXNlNThDaGVjayhhZGRyZXNzQnVmZmVyLCAweDQxKTtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMubG9nKSB7XHJcblx0XHRcdFx0XHR0aGlzLnByaW50V2FsbGV0KGFkZHJlc3MsIHByaXZhdGVLZXksIGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5pbmNsdWRlUHJpdmF0ZUtleSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5LCBwcml2YXRlS2V5IH07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXkgfTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlIGJpcDMyIGV4dGVuZGVkIGtleSBieSByb290IGtleVxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0JJUDMySW50ZXJmYWNlfSBiaXAzMlJvb3RLZXlcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxyXG5cdCAqIEByZXR1cm4geyp9ICB7QklQMzJJbnRlcmZhY2V9XHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0cHJpdmF0ZSBjYWxjQmlwMzJFeHRlbmRlZEtleShiaXAzMlJvb3RLZXk6IEJJUDMySW50ZXJmYWNlLCBwYXRoOiBzdHJpbmcpOiBCSVAzMkludGVyZmFjZSB7XHJcblx0XHRsZXQgZXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlID0gYmlwMzJSb290S2V5O1xyXG5cdFx0Y29uc3QgcGF0aEJpdHM6IHN0cmluZ1tdID0gcGF0aC5zcGxpdCgnLycpO1xyXG5cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEJpdHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgYml0OiBzdHJpbmcgPSBwYXRoQml0c1tpXTtcclxuXHRcdFx0Y29uc3QgaW5kZXg6IG51bWJlciA9IHBhcnNlSW50KGJpdCk7XHJcblxyXG5cdFx0XHRpZiAoaXNOYU4oaW5kZXgpKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGhhcmRlbmVkOiBib29sZWFuID0gYml0W2JpdC5sZW5ndGggLSAxXSA9PT0gXCInXCI7XHJcblxyXG5cdFx0XHRpZiAoaGFyZGVuZWQpIHtcclxuXHRcdFx0XHRleHRlbmRlZEtleSA9IGV4dGVuZGVkS2V5LmRlcml2ZUhhcmRlbmVkKGluZGV4KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRleHRlbmRlZEtleSA9IGV4dGVuZGVkS2V5LmRlcml2ZShpbmRleCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZXh0ZW5kZWRLZXk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IGFkZHJlc3MgdG8gUmlwcGxlIGFkZHJlc3NcclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcclxuXHQgKiBAcmV0dXJuIHsqfSAge3N0cmluZ31cclxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcclxuXHQgKi9cclxuXHRwcml2YXRlIGNvbnZlcnRSaXBwbGVBZHJyKGFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gYmFzZXgoJ3Jwc2huYWYzOXdCVURORUdISktMTTRQUVJTVDdWV1hZWjJiY2RlQ2c2NWprbThvRnFpMXR1dkF4eXonKS5lbmNvZGUoXHJcblx0XHRcdGJhc2V4KCcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6JykuZGVjb2RlKGFkZHJlc3MpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJpbnQgd2FsbGV0XHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBydktleVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwdWJLZXlcclxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcclxuXHQgKi9cclxuXHRwcml2YXRlIHByaW50V2FsbGV0KGFkZHJlc3M6IHN0cmluZywgcHJ2S2V5OiBzdHJpbmcsIHB1YktleTogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRjb25zb2xlLmxvZygnQWRkcmVzczogJXMgXFxyXFxuUHJpdmF0ZSBLZXk6ICVzIFxcclxcblB1YmxpYyBLZXk6ICVzIFxcclxcbj09PT09PT09PT09PT09PT09PT09PT09PT1cXHJcXG5cXHJcXG4nLCBhZGRyZXNzLCBwcnZLZXksIHB1YktleSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIRFdhbGxldDtcclxuIl0sIm1hcHBpbmdzIjoiaXRDQVFBLEtBQU0sQ0FBQUEsUUFBUyxDQStDZDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFDQ0MsV0FBV0EsQ0FBQ0MsQ0FBZ0IsQ0FBRUMsQ0FBb0IsQ0FBRUMsQ0FBMEIsR0FBUSxDQUFFQyxDQUFZLEdBQVEs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