diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,22 @@
+# Version 0.2
+
+* COMPILER ASSISTED BREAKING CHANGE — `Prv`, `prv`, `unPrv`, `prvToPub`, `Pub`,
+  `pub` and `unPub` are not exported from the `BIP32` module anymore. Instead,
+   this library now uses the corresponding types and functions from the
+   `Bitcoin.Keys` module of the `bitcoin-keys` library.
+
+* Add `indexNext`, `subsXPubXPub`, `subsPubPub`, `subsXPrvXPrv`, `subPrvPrv`,
+  `subsXPrvXPub`, `subsPubPub`.
+
+* Add field accessors to `XPub` and `XPrv`.
+
+* Depend on `bitcoin-keys`.
+
+* Improved `Show` instances.
+
+* Improved documentation.
+
+
 # Version 0.1.2
 
 * Depend on `bitcoin-hash`.
diff --git a/bip32.cabal b/bip32.cabal
--- a/bip32.cabal
+++ b/bip32.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.4
 name: bip32
-version: 0.1.2
+version: 0.2
 license: Apache-2.0
 license-file: LICENSE
 extra-source-files: README.md CHANGELOG.md
@@ -22,22 +22,18 @@
   default-language: Haskell2010
   ghc-options: -O2 -Wall -Werror=incomplete-patterns
   ghcjs-options: -O3 -Wall -Werror=incomplete-patterns
-  build-depends: base == 4.*, bytestring, base58-bytestring, binary
+  build-depends:
+    base == 4.*,
+    base58-bytestring,
+    binary,
+    bitcoin-keys,
+    bytestring,
 
 library
   import: basic
   hs-source-dirs: lib
   exposed-modules: BIP32
   build-depends: bitcoin-hash
-  if impl(ghcjs)
-    other-modules: BIP32.GHCJS
-    build-depends: ghcjs-base
-    js-sources:
-      -- This file is generated. See README.md.
-      js/index.compiled.js
-  else
-    other-modules: BIP32.GHC
-    build-depends: secp256k1-haskell
 
 test-suite test
   import: basic
diff --git a/js/index.compiled.js b/js/index.compiled.js
deleted file mode 100644
--- a/js/index.compiled.js
+++ /dev/null
@@ -1,1 +0,0 @@
-var h$bip32=function(e){var t={};function r(i){if(t[i])return t[i].exports;var f=t[i]={i:i,l:!1,exports:{}};return e[i].call(f.exports,f,f.exports,r),f.l=!0,f.exports}return r.m=e,r.c=t,r.d=function(e,t,i){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var f in e)r.d(i,f,function(t){return e[t]}.bind(null,f));return i},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=16)}([function(e,t,r){"use strict";var i=t,f=r(2),n=r(3),d=r(10);i.assert=n,i.toArray=d.toArray,i.zero2=d.zero2,i.toHex=d.toHex,i.encode=d.encode,i.getNAF=function(e,t,r){var i=new Array(Math.max(e.bitLength(),r)+1);i.fill(0);for(var f=1<<t+1,n=e.clone(),d=0;d<i.length;d++){var a,c=n.andln(f-1);n.isOdd()?(a=c>(f>>1)-1?(f>>1)-c:c,n.isubn(a)):a=0,i[d]=a,n.iushrn(1)}return i},i.getJSF=function(e,t){var r=[[],[]];e=e.clone(),t=t.clone();for(var i=0,f=0;e.cmpn(-i)>0||t.cmpn(-f)>0;){var n,d,a,c=e.andln(3)+i&3,s=t.andln(3)+f&3;if(3===c&&(c=-1),3===s&&(s=-1),0==(1&c))n=0;else n=3!==(a=e.andln(7)+i&7)&&5!==a||2!==s?c:-c;if(r[0].push(n),0==(1&s))d=0;else d=3!==(a=t.andln(7)+f&7)&&5!==a||2!==c?s:-s;r[1].push(d),2*i===n+1&&(i=1-i),2*f===d+1&&(f=1-f),e.iushrn(1),t.iushrn(1)}return r},i.cachedProperty=function(e,t,r){var i="_"+t;e.prototype[t]=function(){return void 0!==this[i]?this[i]:this[i]=r.call(this)}},i.parseBytes=function(e){return"string"==typeof e?i.toArray(e,"hex"):e},i.intFromLE=function(e){return new f(e,"hex","le")}},function(e,t,r){"use strict";var i=r(3),f=r(7);function n(e,t){return 55296==(64512&e.charCodeAt(t))&&(!(t<0||t+1>=e.length)&&56320==(64512&e.charCodeAt(t+1)))}function d(e){return(e>>>24|e>>>8&65280|e<<8&16711680|(255&e)<<24)>>>0}function a(e){return 1===e.length?"0"+e:e}function c(e){return 7===e.length?"0"+e:6===e.length?"00"+e:5===e.length?"000"+e:4===e.length?"0000"+e:3===e.length?"00000"+e:2===e.length?"000000"+e:1===e.length?"0000000"+e:e}t.inherits=f,t.toArray=function(e,t){if(Array.isArray(e))return e.slice();if(!e)return[];var r=[];if("string"==typeof e)if(t){if("hex"===t)for((e=e.replace(/[^a-z0-9]+/gi,"")).length%2!=0&&(e="0"+e),f=0;f<e.length;f+=2)r.push(parseInt(e[f]+e[f+1],16))}else for(var i=0,f=0;f<e.length;f++){var d=e.charCodeAt(f);d<128?r[i++]=d:d<2048?(r[i++]=d>>6|192,r[i++]=63&d|128):n(e,f)?(d=65536+((1023&d)<<10)+(1023&e.charCodeAt(++f)),r[i++]=d>>18|240,r[i++]=d>>12&63|128,r[i++]=d>>6&63|128,r[i++]=63&d|128):(r[i++]=d>>12|224,r[i++]=d>>6&63|128,r[i++]=63&d|128)}else for(f=0;f<e.length;f++)r[f]=0|e[f];return r},t.toHex=function(e){for(var t="",r=0;r<e.length;r++)t+=a(e[r].toString(16));return t},t.htonl=d,t.toHex32=function(e,t){for(var r="",i=0;i<e.length;i++){var f=e[i];"little"===t&&(f=d(f)),r+=c(f.toString(16))}return r},t.zero2=a,t.zero8=c,t.join32=function(e,t,r,f){var n=r-t;i(n%4==0);for(var d=new Array(n/4),a=0,c=t;a<d.length;a++,c+=4){var s;s="big"===f?e[c]<<24|e[c+1]<<16|e[c+2]<<8|e[c+3]:e[c+3]<<24|e[c+2]<<16|e[c+1]<<8|e[c],d[a]=s>>>0}return d},t.split32=function(e,t){for(var r=new Array(4*e.length),i=0,f=0;i<e.length;i++,f+=4){var n=e[i];"big"===t?(r[f]=n>>>24,r[f+1]=n>>>16&255,r[f+2]=n>>>8&255,r[f+3]=255&n):(r[f+3]=n>>>24,r[f+2]=n>>>16&255,r[f+1]=n>>>8&255,r[f]=255&n)}return r},t.rotr32=function(e,t){return e>>>t|e<<32-t},t.rotl32=function(e,t){return e<<t|e>>>32-t},t.sum32=function(e,t){return e+t>>>0},t.sum32_3=function(e,t,r){return e+t+r>>>0},t.sum32_4=function(e,t,r,i){return e+t+r+i>>>0},t.sum32_5=function(e,t,r,i,f){return e+t+r+i+f>>>0},t.sum64=function(e,t,r,i){var f=e[t],n=i+e[t+1]>>>0,d=(n<i?1:0)+r+f;e[t]=d>>>0,e[t+1]=n},t.sum64_hi=function(e,t,r,i){return(t+i>>>0<t?1:0)+e+r>>>0},t.sum64_lo=function(e,t,r,i){return t+i>>>0},t.sum64_4_hi=function(e,t,r,i,f,n,d,a){var c=0,s=t;return c+=(s=s+i>>>0)<t?1:0,c+=(s=s+n>>>0)<n?1:0,e+r+f+d+(c+=(s=s+a>>>0)<a?1:0)>>>0},t.sum64_4_lo=function(e,t,r,i,f,n,d,a){return t+i+n+a>>>0},t.sum64_5_hi=function(e,t,r,i,f,n,d,a,c,s){var o=0,h=t;return o+=(h=h+i>>>0)<t?1:0,o+=(h=h+n>>>0)<n?1:0,o+=(h=h+a>>>0)<a?1:0,e+r+f+d+c+(o+=(h=h+s>>>0)<s?1:0)>>>0},t.sum64_5_lo=function(e,t,r,i,f,n,d,a,c,s){return t+i+n+a+s>>>0},t.rotr64_hi=function(e,t,r){return(t<<32-r|e>>>r)>>>0},t.rotr64_lo=function(e,t,r){return(e<<32-r|t>>>r)>>>0},t.shr64_hi=function(e,t,r){return e>>>r},t.shr64_lo=function(e,t,r){return(e<<32-r|t>>>r)>>>0}},function(e,t,r){(function(e){!function(e,t){"use strict";function i(e,t){if(!e)throw new Error(t||"Assertion failed")}function f(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}function n(e,t,r){if(n.isBN(e))return e;this.negative=0,this.words=null,this.length=0,this.red=null,null!==e&&("le"!==t&&"be"!==t||(r=t,t=10),this._init(e||0,t||10,r||"be"))}var d;"object"==typeof e?e.exports=n:t.BN=n,n.BN=n,n.wordSize=26;try{d=r(22).Buffer}catch(e){}function a(e,t,r){for(var i=0,f=Math.min(e.length,r),n=t;n<f;n++){var d=e.charCodeAt(n)-48;i<<=4,i|=d>=49&&d<=54?d-49+10:d>=17&&d<=22?d-17+10:15&d}return i}function c(e,t,r,i){for(var f=0,n=Math.min(e.length,r),d=t;d<n;d++){var a=e.charCodeAt(d)-48;f*=i,f+=a>=49?a-49+10:a>=17?a-17+10:a}return f}n.isBN=function(e){return e instanceof n||null!==e&&"object"==typeof e&&e.constructor.wordSize===n.wordSize&&Array.isArray(e.words)},n.max=function(e,t){return e.cmp(t)>0?e:t},n.min=function(e,t){return e.cmp(t)<0?e:t},n.prototype._init=function(e,t,r){if("number"==typeof e)return this._initNumber(e,t,r);if("object"==typeof e)return this._initArray(e,t,r);"hex"===t&&(t=16),i(t===(0|t)&&t>=2&&t<=36);var f=0;"-"===(e=e.toString().replace(/\s+/g,""))[0]&&f++,16===t?this._parseHex(e,f):this._parseBase(e,t,f),"-"===e[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),t,r)},n.prototype._initNumber=function(e,t,r){e<0&&(this.negative=1,e=-e),e<67108864?(this.words=[67108863&e],this.length=1):e<4503599627370496?(this.words=[67108863&e,e/67108864&67108863],this.length=2):(i(e<9007199254740992),this.words=[67108863&e,e/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),t,r)},n.prototype._initArray=function(e,t,r){if(i("number"==typeof e.length),e.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(e.length/3),this.words=new Array(this.length);for(var f=0;f<this.length;f++)this.words[f]=0;var n,d,a=0;if("be"===r)for(f=e.length-1,n=0;f>=0;f-=3)d=e[f]|e[f-1]<<8|e[f-2]<<16,this.words[n]|=d<<a&67108863,this.words[n+1]=d>>>26-a&67108863,(a+=24)>=26&&(a-=26,n++);else if("le"===r)for(f=0,n=0;f<e.length;f+=3)d=e[f]|e[f+1]<<8|e[f+2]<<16,this.words[n]|=d<<a&67108863,this.words[n+1]=d>>>26-a&67108863,(a+=24)>=26&&(a-=26,n++);return this.strip()},n.prototype._parseHex=function(e,t){this.length=Math.ceil((e.length-t)/6),this.words=new Array(this.length);for(var r=0;r<this.length;r++)this.words[r]=0;var i,f,n=0;for(r=e.length-6,i=0;r>=t;r-=6)f=a(e,r,r+6),this.words[i]|=f<<n&67108863,this.words[i+1]|=f>>>26-n&4194303,(n+=24)>=26&&(n-=26,i++);r+6!==t&&(f=a(e,t,r+6),this.words[i]|=f<<n&67108863,this.words[i+1]|=f>>>26-n&4194303),this.strip()},n.prototype._parseBase=function(e,t,r){this.words=[0],this.length=1;for(var i=0,f=1;f<=67108863;f*=t)i++;i--,f=f/t|0;for(var n=e.length-r,d=n%i,a=Math.min(n,n-d)+r,s=0,o=r;o<a;o+=i)s=c(e,o,o+i,t),this.imuln(f),this.words[0]+s<67108864?this.words[0]+=s:this._iaddn(s);if(0!==d){var h=1;for(s=c(e,o,e.length,t),o=0;o<d;o++)h*=t;this.imuln(h),this.words[0]+s<67108864?this.words[0]+=s:this._iaddn(s)}},n.prototype.copy=function(e){e.words=new Array(this.length);for(var t=0;t<this.length;t++)e.words[t]=this.words[t];e.length=this.length,e.negative=this.negative,e.red=this.red},n.prototype.clone=function(){var e=new n(null);return this.copy(e),e},n.prototype._expand=function(e){for(;this.length<e;)this.words[this.length++]=0;return this},n.prototype.strip=function(){for(;this.length>1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var s=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],o=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function u(e,t,r){r.negative=t.negative^e.negative;var i=e.length+t.length|0;r.length=i,i=i-1|0;var f=0|e.words[0],n=0|t.words[0],d=f*n,a=67108863&d,c=d/67108864|0;r.words[0]=a;for(var s=1;s<i;s++){for(var o=c>>>26,h=67108863&c,u=Math.min(s,t.length-1),b=Math.max(0,s-e.length+1);b<=u;b++){var l=s-b|0;o+=(d=(f=0|e.words[l])*(n=0|t.words[b])+h)/67108864|0,h=67108863&d}r.words[s]=0|h,c=0|o}return 0!==c?r.words[s]=0|c:r.length--,r.strip()}n.prototype.toString=function(e,t){var r;if(t=0|t||1,16===(e=e||10)||"hex"===e){r="";for(var f=0,n=0,d=0;d<this.length;d++){var a=this.words[d],c=(16777215&(a<<f|n)).toString(16);r=0!==(n=a>>>24-f&16777215)||d!==this.length-1?s[6-c.length]+c+r:c+r,(f+=2)>=26&&(f-=26,d--)}for(0!==n&&(r=n.toString(16)+r);r.length%t!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(e===(0|e)&&e>=2&&e<=36){var u=o[e],b=h[e];r="";var l=this.clone();for(l.negative=0;!l.isZero();){var p=l.modn(b).toString(e);r=(l=l.idivn(b)).isZero()?p+r:s[u-p.length]+p+r}for(this.isZero()&&(r="0"+r);r.length%t!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}i(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var e=this.words[0];return 2===this.length?e+=67108864*this.words[1]:3===this.length&&1===this.words[2]?e+=4503599627370496+67108864*this.words[1]:this.length>2&&i(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-e:e},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(e,t){return i(void 0!==d),this.toArrayLike(d,e,t)},n.prototype.toArray=function(e,t){return this.toArrayLike(Array,e,t)},n.prototype.toArrayLike=function(e,t,r){var f=this.byteLength(),n=r||Math.max(1,f);i(f<=n,"byte array longer than desired length"),i(n>0,"Requested array length <= 0"),this.strip();var d,a,c="le"===t,s=new e(n),o=this.clone();if(c){for(a=0;!o.isZero();a++)d=o.andln(255),o.iushrn(8),s[a]=d;for(;a<n;a++)s[a]=0}else{for(a=0;a<n-f;a++)s[a]=0;for(a=0;!o.isZero();a++)d=o.andln(255),o.iushrn(8),s[n-a-1]=d}return s},Math.clz32?n.prototype._countBits=function(e){return 32-Math.clz32(e)}:n.prototype._countBits=function(e){var t=e,r=0;return t>=4096&&(r+=13,t>>>=13),t>=64&&(r+=7,t>>>=7),t>=8&&(r+=4,t>>>=4),t>=2&&(r+=2,t>>>=2),r+t},n.prototype._zeroBits=function(e){if(0===e)return 26;var t=e,r=0;return 0==(8191&t)&&(r+=13,t>>>=13),0==(127&t)&&(r+=7,t>>>=7),0==(15&t)&&(r+=4,t>>>=4),0==(3&t)&&(r+=2,t>>>=2),0==(1&t)&&r++,r},n.prototype.bitLength=function(){var e=this.words[this.length-1],t=this._countBits(e);return 26*(this.length-1)+t},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var e=0,t=0;t<this.length;t++){var r=this._zeroBits(this.words[t]);if(e+=r,26!==r)break}return e},n.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},n.prototype.toTwos=function(e){return 0!==this.negative?this.abs().inotn(e).iaddn(1):this.clone()},n.prototype.fromTwos=function(e){return this.testn(e-1)?this.notn(e).iaddn(1).ineg():this.clone()},n.prototype.isNeg=function(){return 0!==this.negative},n.prototype.neg=function(){return this.clone().ineg()},n.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},n.prototype.iuor=function(e){for(;this.length<e.length;)this.words[this.length++]=0;for(var t=0;t<e.length;t++)this.words[t]=this.words[t]|e.words[t];return this.strip()},n.prototype.ior=function(e){return i(0==(this.negative|e.negative)),this.iuor(e)},n.prototype.or=function(e){return this.length>e.length?this.clone().ior(e):e.clone().ior(this)},n.prototype.uor=function(e){return this.length>e.length?this.clone().iuor(e):e.clone().iuor(this)},n.prototype.iuand=function(e){var t;t=this.length>e.length?e:this;for(var r=0;r<t.length;r++)this.words[r]=this.words[r]&e.words[r];return this.length=t.length,this.strip()},n.prototype.iand=function(e){return i(0==(this.negative|e.negative)),this.iuand(e)},n.prototype.and=function(e){return this.length>e.length?this.clone().iand(e):e.clone().iand(this)},n.prototype.uand=function(e){return this.length>e.length?this.clone().iuand(e):e.clone().iuand(this)},n.prototype.iuxor=function(e){var t,r;this.length>e.length?(t=this,r=e):(t=e,r=this);for(var i=0;i<r.length;i++)this.words[i]=t.words[i]^r.words[i];if(this!==t)for(;i<t.length;i++)this.words[i]=t.words[i];return this.length=t.length,this.strip()},n.prototype.ixor=function(e){return i(0==(this.negative|e.negative)),this.iuxor(e)},n.prototype.xor=function(e){return this.length>e.length?this.clone().ixor(e):e.clone().ixor(this)},n.prototype.uxor=function(e){return this.length>e.length?this.clone().iuxor(e):e.clone().iuxor(this)},n.prototype.inotn=function(e){i("number"==typeof e&&e>=0);var t=0|Math.ceil(e/26),r=e%26;this._expand(t),r>0&&t--;for(var f=0;f<t;f++)this.words[f]=67108863&~this.words[f];return r>0&&(this.words[f]=~this.words[f]&67108863>>26-r),this.strip()},n.prototype.notn=function(e){return this.clone().inotn(e)},n.prototype.setn=function(e,t){i("number"==typeof e&&e>=0);var r=e/26|0,f=e%26;return this._expand(r+1),this.words[r]=t?this.words[r]|1<<f:this.words[r]&~(1<<f),this.strip()},n.prototype.iadd=function(e){var t,r,i;if(0!==this.negative&&0===e.negative)return this.negative=0,t=this.isub(e),this.negative^=1,this._normSign();if(0===this.negative&&0!==e.negative)return e.negative=0,t=this.isub(e),e.negative=1,t._normSign();this.length>e.length?(r=this,i=e):(r=e,i=this);for(var f=0,n=0;n<i.length;n++)t=(0|r.words[n])+(0|i.words[n])+f,this.words[n]=67108863&t,f=t>>>26;for(;0!==f&&n<r.length;n++)t=(0|r.words[n])+f,this.words[n]=67108863&t,f=t>>>26;if(this.length=r.length,0!==f)this.words[this.length]=f,this.length++;else if(r!==this)for(;n<r.length;n++)this.words[n]=r.words[n];return this},n.prototype.add=function(e){var t;return 0!==e.negative&&0===this.negative?(e.negative=0,t=this.sub(e),e.negative^=1,t):0===e.negative&&0!==this.negative?(this.negative=0,t=e.sub(this),this.negative=1,t):this.length>e.length?this.clone().iadd(e):e.clone().iadd(this)},n.prototype.isub=function(e){if(0!==e.negative){e.negative=0;var t=this.iadd(e);return e.negative=1,t._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(e),this.negative=1,this._normSign();var r,i,f=this.cmp(e);if(0===f)return this.negative=0,this.length=1,this.words[0]=0,this;f>0?(r=this,i=e):(r=e,i=this);for(var n=0,d=0;d<i.length;d++)n=(t=(0|r.words[d])-(0|i.words[d])+n)>>26,this.words[d]=67108863&t;for(;0!==n&&d<r.length;d++)n=(t=(0|r.words[d])+n)>>26,this.words[d]=67108863&t;if(0===n&&d<r.length&&r!==this)for(;d<r.length;d++)this.words[d]=r.words[d];return this.length=Math.max(this.length,d),r!==this&&(this.negative=1),this.strip()},n.prototype.sub=function(e){return this.clone().isub(e)};var b=function(e,t,r){var i,f,n,d=e.words,a=t.words,c=r.words,s=0,o=0|d[0],h=8191&o,u=o>>>13,b=0|d[1],l=8191&b,p=b>>>13,m=0|d[2],v=8191&m,y=m>>>13,g=0|d[3],w=8191&g,M=g>>>13,S=0|d[4],A=8191&S,_=S>>>13,x=0|d[5],I=8191&x,k=x>>>13,z=0|d[6],q=8191&z,R=z>>>13,P=0|d[7],E=8191&P,N=P>>>13,j=0|d[8],L=8191&j,B=j>>>13,O=0|d[9],K=8191&O,T=O>>>13,C=0|a[0],F=8191&C,Z=C>>>13,U=0|a[1],V=8191&U,J=U>>>13,H=0|a[2],X=8191&H,D=H>>>13,W=0|a[3],Y=8191&W,$=W>>>13,Q=0|a[4],G=8191&Q,ee=Q>>>13,te=0|a[5],re=8191&te,ie=te>>>13,fe=0|a[6],ne=8191&fe,de=fe>>>13,ae=0|a[7],ce=8191&ae,se=ae>>>13,oe=0|a[8],he=8191&oe,ue=oe>>>13,be=0|a[9],le=8191&be,pe=be>>>13;r.negative=e.negative^t.negative,r.length=19;var me=(s+(i=Math.imul(h,F))|0)+((8191&(f=(f=Math.imul(h,Z))+Math.imul(u,F)|0))<<13)|0;s=((n=Math.imul(u,Z))+(f>>>13)|0)+(me>>>26)|0,me&=67108863,i=Math.imul(l,F),f=(f=Math.imul(l,Z))+Math.imul(p,F)|0,n=Math.imul(p,Z);var ve=(s+(i=i+Math.imul(h,V)|0)|0)+((8191&(f=(f=f+Math.imul(h,J)|0)+Math.imul(u,V)|0))<<13)|0;s=((n=n+Math.imul(u,J)|0)+(f>>>13)|0)+(ve>>>26)|0,ve&=67108863,i=Math.imul(v,F),f=(f=Math.imul(v,Z))+Math.imul(y,F)|0,n=Math.imul(y,Z),i=i+Math.imul(l,V)|0,f=(f=f+Math.imul(l,J)|0)+Math.imul(p,V)|0,n=n+Math.imul(p,J)|0;var ye=(s+(i=i+Math.imul(h,X)|0)|0)+((8191&(f=(f=f+Math.imul(h,D)|0)+Math.imul(u,X)|0))<<13)|0;s=((n=n+Math.imul(u,D)|0)+(f>>>13)|0)+(ye>>>26)|0,ye&=67108863,i=Math.imul(w,F),f=(f=Math.imul(w,Z))+Math.imul(M,F)|0,n=Math.imul(M,Z),i=i+Math.imul(v,V)|0,f=(f=f+Math.imul(v,J)|0)+Math.imul(y,V)|0,n=n+Math.imul(y,J)|0,i=i+Math.imul(l,X)|0,f=(f=f+Math.imul(l,D)|0)+Math.imul(p,X)|0,n=n+Math.imul(p,D)|0;var ge=(s+(i=i+Math.imul(h,Y)|0)|0)+((8191&(f=(f=f+Math.imul(h,$)|0)+Math.imul(u,Y)|0))<<13)|0;s=((n=n+Math.imul(u,$)|0)+(f>>>13)|0)+(ge>>>26)|0,ge&=67108863,i=Math.imul(A,F),f=(f=Math.imul(A,Z))+Math.imul(_,F)|0,n=Math.imul(_,Z),i=i+Math.imul(w,V)|0,f=(f=f+Math.imul(w,J)|0)+Math.imul(M,V)|0,n=n+Math.imul(M,J)|0,i=i+Math.imul(v,X)|0,f=(f=f+Math.imul(v,D)|0)+Math.imul(y,X)|0,n=n+Math.imul(y,D)|0,i=i+Math.imul(l,Y)|0,f=(f=f+Math.imul(l,$)|0)+Math.imul(p,Y)|0,n=n+Math.imul(p,$)|0;var we=(s+(i=i+Math.imul(h,G)|0)|0)+((8191&(f=(f=f+Math.imul(h,ee)|0)+Math.imul(u,G)|0))<<13)|0;s=((n=n+Math.imul(u,ee)|0)+(f>>>13)|0)+(we>>>26)|0,we&=67108863,i=Math.imul(I,F),f=(f=Math.imul(I,Z))+Math.imul(k,F)|0,n=Math.imul(k,Z),i=i+Math.imul(A,V)|0,f=(f=f+Math.imul(A,J)|0)+Math.imul(_,V)|0,n=n+Math.imul(_,J)|0,i=i+Math.imul(w,X)|0,f=(f=f+Math.imul(w,D)|0)+Math.imul(M,X)|0,n=n+Math.imul(M,D)|0,i=i+Math.imul(v,Y)|0,f=(f=f+Math.imul(v,$)|0)+Math.imul(y,Y)|0,n=n+Math.imul(y,$)|0,i=i+Math.imul(l,G)|0,f=(f=f+Math.imul(l,ee)|0)+Math.imul(p,G)|0,n=n+Math.imul(p,ee)|0;var Me=(s+(i=i+Math.imul(h,re)|0)|0)+((8191&(f=(f=f+Math.imul(h,ie)|0)+Math.imul(u,re)|0))<<13)|0;s=((n=n+Math.imul(u,ie)|0)+(f>>>13)|0)+(Me>>>26)|0,Me&=67108863,i=Math.imul(q,F),f=(f=Math.imul(q,Z))+Math.imul(R,F)|0,n=Math.imul(R,Z),i=i+Math.imul(I,V)|0,f=(f=f+Math.imul(I,J)|0)+Math.imul(k,V)|0,n=n+Math.imul(k,J)|0,i=i+Math.imul(A,X)|0,f=(f=f+Math.imul(A,D)|0)+Math.imul(_,X)|0,n=n+Math.imul(_,D)|0,i=i+Math.imul(w,Y)|0,f=(f=f+Math.imul(w,$)|0)+Math.imul(M,Y)|0,n=n+Math.imul(M,$)|0,i=i+Math.imul(v,G)|0,f=(f=f+Math.imul(v,ee)|0)+Math.imul(y,G)|0,n=n+Math.imul(y,ee)|0,i=i+Math.imul(l,re)|0,f=(f=f+Math.imul(l,ie)|0)+Math.imul(p,re)|0,n=n+Math.imul(p,ie)|0;var Se=(s+(i=i+Math.imul(h,ne)|0)|0)+((8191&(f=(f=f+Math.imul(h,de)|0)+Math.imul(u,ne)|0))<<13)|0;s=((n=n+Math.imul(u,de)|0)+(f>>>13)|0)+(Se>>>26)|0,Se&=67108863,i=Math.imul(E,F),f=(f=Math.imul(E,Z))+Math.imul(N,F)|0,n=Math.imul(N,Z),i=i+Math.imul(q,V)|0,f=(f=f+Math.imul(q,J)|0)+Math.imul(R,V)|0,n=n+Math.imul(R,J)|0,i=i+Math.imul(I,X)|0,f=(f=f+Math.imul(I,D)|0)+Math.imul(k,X)|0,n=n+Math.imul(k,D)|0,i=i+Math.imul(A,Y)|0,f=(f=f+Math.imul(A,$)|0)+Math.imul(_,Y)|0,n=n+Math.imul(_,$)|0,i=i+Math.imul(w,G)|0,f=(f=f+Math.imul(w,ee)|0)+Math.imul(M,G)|0,n=n+Math.imul(M,ee)|0,i=i+Math.imul(v,re)|0,f=(f=f+Math.imul(v,ie)|0)+Math.imul(y,re)|0,n=n+Math.imul(y,ie)|0,i=i+Math.imul(l,ne)|0,f=(f=f+Math.imul(l,de)|0)+Math.imul(p,ne)|0,n=n+Math.imul(p,de)|0;var Ae=(s+(i=i+Math.imul(h,ce)|0)|0)+((8191&(f=(f=f+Math.imul(h,se)|0)+Math.imul(u,ce)|0))<<13)|0;s=((n=n+Math.imul(u,se)|0)+(f>>>13)|0)+(Ae>>>26)|0,Ae&=67108863,i=Math.imul(L,F),f=(f=Math.imul(L,Z))+Math.imul(B,F)|0,n=Math.imul(B,Z),i=i+Math.imul(E,V)|0,f=(f=f+Math.imul(E,J)|0)+Math.imul(N,V)|0,n=n+Math.imul(N,J)|0,i=i+Math.imul(q,X)|0,f=(f=f+Math.imul(q,D)|0)+Math.imul(R,X)|0,n=n+Math.imul(R,D)|0,i=i+Math.imul(I,Y)|0,f=(f=f+Math.imul(I,$)|0)+Math.imul(k,Y)|0,n=n+Math.imul(k,$)|0,i=i+Math.imul(A,G)|0,f=(f=f+Math.imul(A,ee)|0)+Math.imul(_,G)|0,n=n+Math.imul(_,ee)|0,i=i+Math.imul(w,re)|0,f=(f=f+Math.imul(w,ie)|0)+Math.imul(M,re)|0,n=n+Math.imul(M,ie)|0,i=i+Math.imul(v,ne)|0,f=(f=f+Math.imul(v,de)|0)+Math.imul(y,ne)|0,n=n+Math.imul(y,de)|0,i=i+Math.imul(l,ce)|0,f=(f=f+Math.imul(l,se)|0)+Math.imul(p,ce)|0,n=n+Math.imul(p,se)|0;var _e=(s+(i=i+Math.imul(h,he)|0)|0)+((8191&(f=(f=f+Math.imul(h,ue)|0)+Math.imul(u,he)|0))<<13)|0;s=((n=n+Math.imul(u,ue)|0)+(f>>>13)|0)+(_e>>>26)|0,_e&=67108863,i=Math.imul(K,F),f=(f=Math.imul(K,Z))+Math.imul(T,F)|0,n=Math.imul(T,Z),i=i+Math.imul(L,V)|0,f=(f=f+Math.imul(L,J)|0)+Math.imul(B,V)|0,n=n+Math.imul(B,J)|0,i=i+Math.imul(E,X)|0,f=(f=f+Math.imul(E,D)|0)+Math.imul(N,X)|0,n=n+Math.imul(N,D)|0,i=i+Math.imul(q,Y)|0,f=(f=f+Math.imul(q,$)|0)+Math.imul(R,Y)|0,n=n+Math.imul(R,$)|0,i=i+Math.imul(I,G)|0,f=(f=f+Math.imul(I,ee)|0)+Math.imul(k,G)|0,n=n+Math.imul(k,ee)|0,i=i+Math.imul(A,re)|0,f=(f=f+Math.imul(A,ie)|0)+Math.imul(_,re)|0,n=n+Math.imul(_,ie)|0,i=i+Math.imul(w,ne)|0,f=(f=f+Math.imul(w,de)|0)+Math.imul(M,ne)|0,n=n+Math.imul(M,de)|0,i=i+Math.imul(v,ce)|0,f=(f=f+Math.imul(v,se)|0)+Math.imul(y,ce)|0,n=n+Math.imul(y,se)|0,i=i+Math.imul(l,he)|0,f=(f=f+Math.imul(l,ue)|0)+Math.imul(p,he)|0,n=n+Math.imul(p,ue)|0;var xe=(s+(i=i+Math.imul(h,le)|0)|0)+((8191&(f=(f=f+Math.imul(h,pe)|0)+Math.imul(u,le)|0))<<13)|0;s=((n=n+Math.imul(u,pe)|0)+(f>>>13)|0)+(xe>>>26)|0,xe&=67108863,i=Math.imul(K,V),f=(f=Math.imul(K,J))+Math.imul(T,V)|0,n=Math.imul(T,J),i=i+Math.imul(L,X)|0,f=(f=f+Math.imul(L,D)|0)+Math.imul(B,X)|0,n=n+Math.imul(B,D)|0,i=i+Math.imul(E,Y)|0,f=(f=f+Math.imul(E,$)|0)+Math.imul(N,Y)|0,n=n+Math.imul(N,$)|0,i=i+Math.imul(q,G)|0,f=(f=f+Math.imul(q,ee)|0)+Math.imul(R,G)|0,n=n+Math.imul(R,ee)|0,i=i+Math.imul(I,re)|0,f=(f=f+Math.imul(I,ie)|0)+Math.imul(k,re)|0,n=n+Math.imul(k,ie)|0,i=i+Math.imul(A,ne)|0,f=(f=f+Math.imul(A,de)|0)+Math.imul(_,ne)|0,n=n+Math.imul(_,de)|0,i=i+Math.imul(w,ce)|0,f=(f=f+Math.imul(w,se)|0)+Math.imul(M,ce)|0,n=n+Math.imul(M,se)|0,i=i+Math.imul(v,he)|0,f=(f=f+Math.imul(v,ue)|0)+Math.imul(y,he)|0,n=n+Math.imul(y,ue)|0;var Ie=(s+(i=i+Math.imul(l,le)|0)|0)+((8191&(f=(f=f+Math.imul(l,pe)|0)+Math.imul(p,le)|0))<<13)|0;s=((n=n+Math.imul(p,pe)|0)+(f>>>13)|0)+(Ie>>>26)|0,Ie&=67108863,i=Math.imul(K,X),f=(f=Math.imul(K,D))+Math.imul(T,X)|0,n=Math.imul(T,D),i=i+Math.imul(L,Y)|0,f=(f=f+Math.imul(L,$)|0)+Math.imul(B,Y)|0,n=n+Math.imul(B,$)|0,i=i+Math.imul(E,G)|0,f=(f=f+Math.imul(E,ee)|0)+Math.imul(N,G)|0,n=n+Math.imul(N,ee)|0,i=i+Math.imul(q,re)|0,f=(f=f+Math.imul(q,ie)|0)+Math.imul(R,re)|0,n=n+Math.imul(R,ie)|0,i=i+Math.imul(I,ne)|0,f=(f=f+Math.imul(I,de)|0)+Math.imul(k,ne)|0,n=n+Math.imul(k,de)|0,i=i+Math.imul(A,ce)|0,f=(f=f+Math.imul(A,se)|0)+Math.imul(_,ce)|0,n=n+Math.imul(_,se)|0,i=i+Math.imul(w,he)|0,f=(f=f+Math.imul(w,ue)|0)+Math.imul(M,he)|0,n=n+Math.imul(M,ue)|0;var ke=(s+(i=i+Math.imul(v,le)|0)|0)+((8191&(f=(f=f+Math.imul(v,pe)|0)+Math.imul(y,le)|0))<<13)|0;s=((n=n+Math.imul(y,pe)|0)+(f>>>13)|0)+(ke>>>26)|0,ke&=67108863,i=Math.imul(K,Y),f=(f=Math.imul(K,$))+Math.imul(T,Y)|0,n=Math.imul(T,$),i=i+Math.imul(L,G)|0,f=(f=f+Math.imul(L,ee)|0)+Math.imul(B,G)|0,n=n+Math.imul(B,ee)|0,i=i+Math.imul(E,re)|0,f=(f=f+Math.imul(E,ie)|0)+Math.imul(N,re)|0,n=n+Math.imul(N,ie)|0,i=i+Math.imul(q,ne)|0,f=(f=f+Math.imul(q,de)|0)+Math.imul(R,ne)|0,n=n+Math.imul(R,de)|0,i=i+Math.imul(I,ce)|0,f=(f=f+Math.imul(I,se)|0)+Math.imul(k,ce)|0,n=n+Math.imul(k,se)|0,i=i+Math.imul(A,he)|0,f=(f=f+Math.imul(A,ue)|0)+Math.imul(_,he)|0,n=n+Math.imul(_,ue)|0;var ze=(s+(i=i+Math.imul(w,le)|0)|0)+((8191&(f=(f=f+Math.imul(w,pe)|0)+Math.imul(M,le)|0))<<13)|0;s=((n=n+Math.imul(M,pe)|0)+(f>>>13)|0)+(ze>>>26)|0,ze&=67108863,i=Math.imul(K,G),f=(f=Math.imul(K,ee))+Math.imul(T,G)|0,n=Math.imul(T,ee),i=i+Math.imul(L,re)|0,f=(f=f+Math.imul(L,ie)|0)+Math.imul(B,re)|0,n=n+Math.imul(B,ie)|0,i=i+Math.imul(E,ne)|0,f=(f=f+Math.imul(E,de)|0)+Math.imul(N,ne)|0,n=n+Math.imul(N,de)|0,i=i+Math.imul(q,ce)|0,f=(f=f+Math.imul(q,se)|0)+Math.imul(R,ce)|0,n=n+Math.imul(R,se)|0,i=i+Math.imul(I,he)|0,f=(f=f+Math.imul(I,ue)|0)+Math.imul(k,he)|0,n=n+Math.imul(k,ue)|0;var qe=(s+(i=i+Math.imul(A,le)|0)|0)+((8191&(f=(f=f+Math.imul(A,pe)|0)+Math.imul(_,le)|0))<<13)|0;s=((n=n+Math.imul(_,pe)|0)+(f>>>13)|0)+(qe>>>26)|0,qe&=67108863,i=Math.imul(K,re),f=(f=Math.imul(K,ie))+Math.imul(T,re)|0,n=Math.imul(T,ie),i=i+Math.imul(L,ne)|0,f=(f=f+Math.imul(L,de)|0)+Math.imul(B,ne)|0,n=n+Math.imul(B,de)|0,i=i+Math.imul(E,ce)|0,f=(f=f+Math.imul(E,se)|0)+Math.imul(N,ce)|0,n=n+Math.imul(N,se)|0,i=i+Math.imul(q,he)|0,f=(f=f+Math.imul(q,ue)|0)+Math.imul(R,he)|0,n=n+Math.imul(R,ue)|0;var Re=(s+(i=i+Math.imul(I,le)|0)|0)+((8191&(f=(f=f+Math.imul(I,pe)|0)+Math.imul(k,le)|0))<<13)|0;s=((n=n+Math.imul(k,pe)|0)+(f>>>13)|0)+(Re>>>26)|0,Re&=67108863,i=Math.imul(K,ne),f=(f=Math.imul(K,de))+Math.imul(T,ne)|0,n=Math.imul(T,de),i=i+Math.imul(L,ce)|0,f=(f=f+Math.imul(L,se)|0)+Math.imul(B,ce)|0,n=n+Math.imul(B,se)|0,i=i+Math.imul(E,he)|0,f=(f=f+Math.imul(E,ue)|0)+Math.imul(N,he)|0,n=n+Math.imul(N,ue)|0;var Pe=(s+(i=i+Math.imul(q,le)|0)|0)+((8191&(f=(f=f+Math.imul(q,pe)|0)+Math.imul(R,le)|0))<<13)|0;s=((n=n+Math.imul(R,pe)|0)+(f>>>13)|0)+(Pe>>>26)|0,Pe&=67108863,i=Math.imul(K,ce),f=(f=Math.imul(K,se))+Math.imul(T,ce)|0,n=Math.imul(T,se),i=i+Math.imul(L,he)|0,f=(f=f+Math.imul(L,ue)|0)+Math.imul(B,he)|0,n=n+Math.imul(B,ue)|0;var Ee=(s+(i=i+Math.imul(E,le)|0)|0)+((8191&(f=(f=f+Math.imul(E,pe)|0)+Math.imul(N,le)|0))<<13)|0;s=((n=n+Math.imul(N,pe)|0)+(f>>>13)|0)+(Ee>>>26)|0,Ee&=67108863,i=Math.imul(K,he),f=(f=Math.imul(K,ue))+Math.imul(T,he)|0,n=Math.imul(T,ue);var Ne=(s+(i=i+Math.imul(L,le)|0)|0)+((8191&(f=(f=f+Math.imul(L,pe)|0)+Math.imul(B,le)|0))<<13)|0;s=((n=n+Math.imul(B,pe)|0)+(f>>>13)|0)+(Ne>>>26)|0,Ne&=67108863;var je=(s+(i=Math.imul(K,le))|0)+((8191&(f=(f=Math.imul(K,pe))+Math.imul(T,le)|0))<<13)|0;return s=((n=Math.imul(T,pe))+(f>>>13)|0)+(je>>>26)|0,je&=67108863,c[0]=me,c[1]=ve,c[2]=ye,c[3]=ge,c[4]=we,c[5]=Me,c[6]=Se,c[7]=Ae,c[8]=_e,c[9]=xe,c[10]=Ie,c[11]=ke,c[12]=ze,c[13]=qe,c[14]=Re,c[15]=Pe,c[16]=Ee,c[17]=Ne,c[18]=je,0!==s&&(c[19]=s,r.length++),r};function l(e,t,r){return(new p).mulp(e,t,r)}function p(e,t){this.x=e,this.y=t}Math.imul||(b=u),n.prototype.mulTo=function(e,t){var r=this.length+e.length;return 10===this.length&&10===e.length?b(this,e,t):r<63?u(this,e,t):r<1024?function(e,t,r){r.negative=t.negative^e.negative,r.length=e.length+t.length;for(var i=0,f=0,n=0;n<r.length-1;n++){var d=f;f=0;for(var a=67108863&i,c=Math.min(n,t.length-1),s=Math.max(0,n-e.length+1);s<=c;s++){var o=n-s,h=(0|e.words[o])*(0|t.words[s]),u=67108863&h;a=67108863&(u=u+a|0),f+=(d=(d=d+(h/67108864|0)|0)+(u>>>26)|0)>>>26,d&=67108863}r.words[n]=a,i=d,d=f}return 0!==i?r.words[n]=i:r.length--,r.strip()}(this,e,t):l(this,e,t)},p.prototype.makeRBT=function(e){for(var t=new Array(e),r=n.prototype._countBits(e)-1,i=0;i<e;i++)t[i]=this.revBin(i,r,e);return t},p.prototype.revBin=function(e,t,r){if(0===e||e===r-1)return e;for(var i=0,f=0;f<t;f++)i|=(1&e)<<t-f-1,e>>=1;return i},p.prototype.permute=function(e,t,r,i,f,n){for(var d=0;d<n;d++)i[d]=t[e[d]],f[d]=r[e[d]]},p.prototype.transform=function(e,t,r,i,f,n){this.permute(n,e,t,r,i,f);for(var d=1;d<f;d<<=1)for(var a=d<<1,c=Math.cos(2*Math.PI/a),s=Math.sin(2*Math.PI/a),o=0;o<f;o+=a)for(var h=c,u=s,b=0;b<d;b++){var l=r[o+b],p=i[o+b],m=r[o+b+d],v=i[o+b+d],y=h*m-u*v;v=h*v+u*m,m=y,r[o+b]=l+m,i[o+b]=p+v,r[o+b+d]=l-m,i[o+b+d]=p-v,b!==a&&(y=c*h-s*u,u=c*u+s*h,h=y)}},p.prototype.guessLen13b=function(e,t){var r=1|Math.max(t,e),i=1&r,f=0;for(r=r/2|0;r;r>>>=1)f++;return 1<<f+1+i},p.prototype.conjugate=function(e,t,r){if(!(r<=1))for(var i=0;i<r/2;i++){var f=e[i];e[i]=e[r-i-1],e[r-i-1]=f,f=t[i],t[i]=-t[r-i-1],t[r-i-1]=-f}},p.prototype.normalize13b=function(e,t){for(var r=0,i=0;i<t/2;i++){var f=8192*Math.round(e[2*i+1]/t)+Math.round(e[2*i]/t)+r;e[i]=67108863&f,r=f<67108864?0:f/67108864|0}return e},p.prototype.convert13b=function(e,t,r,f){for(var n=0,d=0;d<t;d++)n+=0|e[d],r[2*d]=8191&n,n>>>=13,r[2*d+1]=8191&n,n>>>=13;for(d=2*t;d<f;++d)r[d]=0;i(0===n),i(0==(-8192&n))},p.prototype.stub=function(e){for(var t=new Array(e),r=0;r<e;r++)t[r]=0;return t},p.prototype.mulp=function(e,t,r){var i=2*this.guessLen13b(e.length,t.length),f=this.makeRBT(i),n=this.stub(i),d=new Array(i),a=new Array(i),c=new Array(i),s=new Array(i),o=new Array(i),h=new Array(i),u=r.words;u.length=i,this.convert13b(e.words,e.length,d,i),this.convert13b(t.words,t.length,s,i),this.transform(d,n,a,c,i,f),this.transform(s,n,o,h,i,f);for(var b=0;b<i;b++){var l=a[b]*o[b]-c[b]*h[b];c[b]=a[b]*h[b]+c[b]*o[b],a[b]=l}return this.conjugate(a,c,i),this.transform(a,c,u,n,i,f),this.conjugate(u,n,i),this.normalize13b(u,i),r.negative=e.negative^t.negative,r.length=e.length+t.length,r.strip()},n.prototype.mul=function(e){var t=new n(null);return t.words=new Array(this.length+e.length),this.mulTo(e,t)},n.prototype.mulf=function(e){var t=new n(null);return t.words=new Array(this.length+e.length),l(this,e,t)},n.prototype.imul=function(e){return this.clone().mulTo(e,this)},n.prototype.imuln=function(e){i("number"==typeof e),i(e<67108864);for(var t=0,r=0;r<this.length;r++){var f=(0|this.words[r])*e,n=(67108863&f)+(67108863&t);t>>=26,t+=f/67108864|0,t+=n>>>26,this.words[r]=67108863&n}return 0!==t&&(this.words[r]=t,this.length++),this},n.prototype.muln=function(e){return this.clone().imuln(e)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(e){var t=function(e){for(var t=new Array(e.bitLength()),r=0;r<t.length;r++){var i=r/26|0,f=r%26;t[r]=(e.words[i]&1<<f)>>>f}return t}(e);if(0===t.length)return new n(1);for(var r=this,i=0;i<t.length&&0===t[i];i++,r=r.sqr());if(++i<t.length)for(var f=r.sqr();i<t.length;i++,f=f.sqr())0!==t[i]&&(r=r.mul(f));return r},n.prototype.iushln=function(e){i("number"==typeof e&&e>=0);var t,r=e%26,f=(e-r)/26,n=67108863>>>26-r<<26-r;if(0!==r){var d=0;for(t=0;t<this.length;t++){var a=this.words[t]&n,c=(0|this.words[t])-a<<r;this.words[t]=c|d,d=a>>>26-r}d&&(this.words[t]=d,this.length++)}if(0!==f){for(t=this.length-1;t>=0;t--)this.words[t+f]=this.words[t];for(t=0;t<f;t++)this.words[t]=0;this.length+=f}return this.strip()},n.prototype.ishln=function(e){return i(0===this.negative),this.iushln(e)},n.prototype.iushrn=function(e,t,r){var f;i("number"==typeof e&&e>=0),f=t?(t-t%26)/26:0;var n=e%26,d=Math.min((e-n)/26,this.length),a=67108863^67108863>>>n<<n,c=r;if(f-=d,f=Math.max(0,f),c){for(var s=0;s<d;s++)c.words[s]=this.words[s];c.length=d}if(0===d);else if(this.length>d)for(this.length-=d,s=0;s<this.length;s++)this.words[s]=this.words[s+d];else this.words[0]=0,this.length=1;var o=0;for(s=this.length-1;s>=0&&(0!==o||s>=f);s--){var h=0|this.words[s];this.words[s]=o<<26-n|h>>>n,o=h&a}return c&&0!==o&&(c.words[c.length++]=o),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(e,t,r){return i(0===this.negative),this.iushrn(e,t,r)},n.prototype.shln=function(e){return this.clone().ishln(e)},n.prototype.ushln=function(e){return this.clone().iushln(e)},n.prototype.shrn=function(e){return this.clone().ishrn(e)},n.prototype.ushrn=function(e){return this.clone().iushrn(e)},n.prototype.testn=function(e){i("number"==typeof e&&e>=0);var t=e%26,r=(e-t)/26,f=1<<t;return!(this.length<=r)&&!!(this.words[r]&f)},n.prototype.imaskn=function(e){i("number"==typeof e&&e>=0);var t=e%26,r=(e-t)/26;if(i(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==t&&r++,this.length=Math.min(r,this.length),0!==t){var f=67108863^67108863>>>t<<t;this.words[this.length-1]&=f}return this.strip()},n.prototype.maskn=function(e){return this.clone().imaskn(e)},n.prototype.iaddn=function(e){return i("number"==typeof e),i(e<67108864),e<0?this.isubn(-e):0!==this.negative?1===this.length&&(0|this.words[0])<e?(this.words[0]=e-(0|this.words[0]),this.negative=0,this):(this.negative=0,this.isubn(e),this.negative=1,this):this._iaddn(e)},n.prototype._iaddn=function(e){this.words[0]+=e;for(var t=0;t<this.length&&this.words[t]>=67108864;t++)this.words[t]-=67108864,t===this.length-1?this.words[t+1]=1:this.words[t+1]++;return this.length=Math.max(this.length,t+1),this},n.prototype.isubn=function(e){if(i("number"==typeof e),i(e<67108864),e<0)return this.iaddn(-e);if(0!==this.negative)return this.negative=0,this.iaddn(e),this.negative=1,this;if(this.words[0]-=e,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var t=0;t<this.length&&this.words[t]<0;t++)this.words[t]+=67108864,this.words[t+1]-=1;return this.strip()},n.prototype.addn=function(e){return this.clone().iaddn(e)},n.prototype.subn=function(e){return this.clone().isubn(e)},n.prototype.iabs=function(){return this.negative=0,this},n.prototype.abs=function(){return this.clone().iabs()},n.prototype._ishlnsubmul=function(e,t,r){var f,n,d=e.length+r;this._expand(d);var a=0;for(f=0;f<e.length;f++){n=(0|this.words[f+r])+a;var c=(0|e.words[f])*t;a=((n-=67108863&c)>>26)-(c/67108864|0),this.words[f+r]=67108863&n}for(;f<this.length-r;f++)a=(n=(0|this.words[f+r])+a)>>26,this.words[f+r]=67108863&n;if(0===a)return this.strip();for(i(-1===a),a=0,f=0;f<this.length;f++)a=(n=-(0|this.words[f])+a)>>26,this.words[f]=67108863&n;return this.negative=1,this.strip()},n.prototype._wordDiv=function(e,t){var r=(this.length,e.length),i=this.clone(),f=e,d=0|f.words[f.length-1];0!==(r=26-this._countBits(d))&&(f=f.ushln(r),i.iushln(r),d=0|f.words[f.length-1]);var a,c=i.length-f.length;if("mod"!==t){(a=new n(null)).length=c+1,a.words=new Array(a.length);for(var s=0;s<a.length;s++)a.words[s]=0}var o=i.clone()._ishlnsubmul(f,1,c);0===o.negative&&(i=o,a&&(a.words[c]=1));for(var h=c-1;h>=0;h--){var u=67108864*(0|i.words[f.length+h])+(0|i.words[f.length+h-1]);for(u=Math.min(u/d|0,67108863),i._ishlnsubmul(f,u,h);0!==i.negative;)u--,i.negative=0,i._ishlnsubmul(f,1,h),i.isZero()||(i.negative^=1);a&&(a.words[h]=u)}return a&&a.strip(),i.strip(),"div"!==t&&0!==r&&i.iushrn(r),{div:a||null,mod:i}},n.prototype.divmod=function(e,t,r){return i(!e.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===e.negative?(a=this.neg().divmod(e,t),"mod"!==t&&(f=a.div.neg()),"div"!==t&&(d=a.mod.neg(),r&&0!==d.negative&&d.iadd(e)),{div:f,mod:d}):0===this.negative&&0!==e.negative?(a=this.divmod(e.neg(),t),"mod"!==t&&(f=a.div.neg()),{div:f,mod:a.mod}):0!=(this.negative&e.negative)?(a=this.neg().divmod(e.neg(),t),"div"!==t&&(d=a.mod.neg(),r&&0!==d.negative&&d.isub(e)),{div:a.div,mod:d}):e.length>this.length||this.cmp(e)<0?{div:new n(0),mod:this}:1===e.length?"div"===t?{div:this.divn(e.words[0]),mod:null}:"mod"===t?{div:null,mod:new n(this.modn(e.words[0]))}:{div:this.divn(e.words[0]),mod:new n(this.modn(e.words[0]))}:this._wordDiv(e,t);var f,d,a},n.prototype.div=function(e){return this.divmod(e,"div",!1).div},n.prototype.mod=function(e){return this.divmod(e,"mod",!1).mod},n.prototype.umod=function(e){return this.divmod(e,"mod",!0).mod},n.prototype.divRound=function(e){var t=this.divmod(e);if(t.mod.isZero())return t.div;var r=0!==t.div.negative?t.mod.isub(e):t.mod,i=e.ushrn(1),f=e.andln(1),n=r.cmp(i);return n<0||1===f&&0===n?t.div:0!==t.div.negative?t.div.isubn(1):t.div.iaddn(1)},n.prototype.modn=function(e){i(e<=67108863);for(var t=(1<<26)%e,r=0,f=this.length-1;f>=0;f--)r=(t*r+(0|this.words[f]))%e;return r},n.prototype.idivn=function(e){i(e<=67108863);for(var t=0,r=this.length-1;r>=0;r--){var f=(0|this.words[r])+67108864*t;this.words[r]=f/e|0,t=f%e}return this.strip()},n.prototype.divn=function(e){return this.clone().idivn(e)},n.prototype.egcd=function(e){i(0===e.negative),i(!e.isZero());var t=this,r=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var f=new n(1),d=new n(0),a=new n(0),c=new n(1),s=0;t.isEven()&&r.isEven();)t.iushrn(1),r.iushrn(1),++s;for(var o=r.clone(),h=t.clone();!t.isZero();){for(var u=0,b=1;0==(t.words[0]&b)&&u<26;++u,b<<=1);if(u>0)for(t.iushrn(u);u-- >0;)(f.isOdd()||d.isOdd())&&(f.iadd(o),d.isub(h)),f.iushrn(1),d.iushrn(1);for(var l=0,p=1;0==(r.words[0]&p)&&l<26;++l,p<<=1);if(l>0)for(r.iushrn(l);l-- >0;)(a.isOdd()||c.isOdd())&&(a.iadd(o),c.isub(h)),a.iushrn(1),c.iushrn(1);t.cmp(r)>=0?(t.isub(r),f.isub(a),d.isub(c)):(r.isub(t),a.isub(f),c.isub(d))}return{a:a,b:c,gcd:r.iushln(s)}},n.prototype._invmp=function(e){i(0===e.negative),i(!e.isZero());var t=this,r=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var f,d=new n(1),a=new n(0),c=r.clone();t.cmpn(1)>0&&r.cmpn(1)>0;){for(var s=0,o=1;0==(t.words[0]&o)&&s<26;++s,o<<=1);if(s>0)for(t.iushrn(s);s-- >0;)d.isOdd()&&d.iadd(c),d.iushrn(1);for(var h=0,u=1;0==(r.words[0]&u)&&h<26;++h,u<<=1);if(h>0)for(r.iushrn(h);h-- >0;)a.isOdd()&&a.iadd(c),a.iushrn(1);t.cmp(r)>=0?(t.isub(r),d.isub(a)):(r.isub(t),a.isub(d))}return(f=0===t.cmpn(1)?d:a).cmpn(0)<0&&f.iadd(e),f},n.prototype.gcd=function(e){if(this.isZero())return e.abs();if(e.isZero())return this.abs();var t=this.clone(),r=e.clone();t.negative=0,r.negative=0;for(var i=0;t.isEven()&&r.isEven();i++)t.iushrn(1),r.iushrn(1);for(;;){for(;t.isEven();)t.iushrn(1);for(;r.isEven();)r.iushrn(1);var f=t.cmp(r);if(f<0){var n=t;t=r,r=n}else if(0===f||0===r.cmpn(1))break;t.isub(r)}return r.iushln(i)},n.prototype.invm=function(e){return this.egcd(e).a.umod(e)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(e){return this.words[0]&e},n.prototype.bincn=function(e){i("number"==typeof e);var t=e%26,r=(e-t)/26,f=1<<t;if(this.length<=r)return this._expand(r+1),this.words[r]|=f,this;for(var n=f,d=r;0!==n&&d<this.length;d++){var a=0|this.words[d];n=(a+=n)>>>26,a&=67108863,this.words[d]=a}return 0!==n&&(this.words[d]=n,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(e){var t,r=e<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)t=1;else{r&&(e=-e),i(e<=67108863,"Number is too big");var f=0|this.words[0];t=f===e?0:f<e?-1:1}return 0!==this.negative?0|-t:t},n.prototype.cmp=function(e){if(0!==this.negative&&0===e.negative)return-1;if(0===this.negative&&0!==e.negative)return 1;var t=this.ucmp(e);return 0!==this.negative?0|-t:t},n.prototype.ucmp=function(e){if(this.length>e.length)return 1;if(this.length<e.length)return-1;for(var t=0,r=this.length-1;r>=0;r--){var i=0|this.words[r],f=0|e.words[r];if(i!==f){i<f?t=-1:i>f&&(t=1);break}}return t},n.prototype.gtn=function(e){return 1===this.cmpn(e)},n.prototype.gt=function(e){return 1===this.cmp(e)},n.prototype.gten=function(e){return this.cmpn(e)>=0},n.prototype.gte=function(e){return this.cmp(e)>=0},n.prototype.ltn=function(e){return-1===this.cmpn(e)},n.prototype.lt=function(e){return-1===this.cmp(e)},n.prototype.lten=function(e){return this.cmpn(e)<=0},n.prototype.lte=function(e){return this.cmp(e)<=0},n.prototype.eqn=function(e){return 0===this.cmpn(e)},n.prototype.eq=function(e){return 0===this.cmp(e)},n.red=function(e){return new S(e)},n.prototype.toRed=function(e){return i(!this.red,"Already a number in reduction context"),i(0===this.negative,"red works only with positives"),e.convertTo(this)._forceRed(e)},n.prototype.fromRed=function(){return i(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(e){return this.red=e,this},n.prototype.forceRed=function(e){return i(!this.red,"Already a number in reduction context"),this._forceRed(e)},n.prototype.redAdd=function(e){return i(this.red,"redAdd works only with red numbers"),this.red.add(this,e)},n.prototype.redIAdd=function(e){return i(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,e)},n.prototype.redSub=function(e){return i(this.red,"redSub works only with red numbers"),this.red.sub(this,e)},n.prototype.redISub=function(e){return i(this.red,"redISub works only with red numbers"),this.red.isub(this,e)},n.prototype.redShl=function(e){return i(this.red,"redShl works only with red numbers"),this.red.shl(this,e)},n.prototype.redMul=function(e){return i(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.mul(this,e)},n.prototype.redIMul=function(e){return i(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.imul(this,e)},n.prototype.redSqr=function(){return i(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return i(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return i(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return i(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return i(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(e){return i(this.red&&!e.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,e)};var m={k256:null,p224:null,p192:null,p25519:null};function v(e,t){this.name=e,this.p=new n(t,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function y(){v.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function g(){v.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){v.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){v.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function S(e){if("string"==typeof e){var t=n._prime(e);this.m=t.p,this.prime=t}else i(e.gtn(1),"modulus must be greater than 1"),this.m=e,this.prime=null}function A(e){S.call(this,e),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}v.prototype._tmp=function(){var e=new n(null);return e.words=new Array(Math.ceil(this.n/13)),e},v.prototype.ireduce=function(e){var t,r=e;do{this.split(r,this.tmp),t=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(t>this.n);var i=t<this.n?-1:r.ucmp(this.p);return 0===i?(r.words[0]=0,r.length=1):i>0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},v.prototype.split=function(e,t){e.iushrn(this.n,0,t)},v.prototype.imulK=function(e){return e.imul(this.k)},f(y,v),y.prototype.split=function(e,t){for(var r=Math.min(e.length,9),i=0;i<r;i++)t.words[i]=e.words[i];if(t.length=r,e.length<=9)return e.words[0]=0,void(e.length=1);var f=e.words[9];for(t.words[t.length++]=4194303&f,i=10;i<e.length;i++){var n=0|e.words[i];e.words[i-10]=(4194303&n)<<4|f>>>22,f=n}f>>>=22,e.words[i-10]=f,0===f&&e.length>10?e.length-=10:e.length-=9},y.prototype.imulK=function(e){e.words[e.length]=0,e.words[e.length+1]=0,e.length+=2;for(var t=0,r=0;r<e.length;r++){var i=0|e.words[r];t+=977*i,e.words[r]=67108863&t,t=64*i+(t/67108864|0)}return 0===e.words[e.length-1]&&(e.length--,0===e.words[e.length-1]&&e.length--),e},f(g,v),f(w,v),f(M,v),M.prototype.imulK=function(e){for(var t=0,r=0;r<e.length;r++){var i=19*(0|e.words[r])+t,f=67108863&i;i>>>=26,e.words[r]=f,t=i}return 0!==t&&(e.words[e.length++]=t),e},n._prime=function(e){if(m[e])return m[e];var t;if("k256"===e)t=new y;else if("p224"===e)t=new g;else if("p192"===e)t=new w;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new M}return m[e]=t,t},S.prototype._verify1=function(e){i(0===e.negative,"red works only with positives"),i(e.red,"red works only with red numbers")},S.prototype._verify2=function(e,t){i(0==(e.negative|t.negative),"red works only with positives"),i(e.red&&e.red===t.red,"red works only with red numbers")},S.prototype.imod=function(e){return this.prime?this.prime.ireduce(e)._forceRed(this):e.umod(this.m)._forceRed(this)},S.prototype.neg=function(e){return e.isZero()?e.clone():this.m.sub(e)._forceRed(this)},S.prototype.add=function(e,t){this._verify2(e,t);var r=e.add(t);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},S.prototype.iadd=function(e,t){this._verify2(e,t);var r=e.iadd(t);return r.cmp(this.m)>=0&&r.isub(this.m),r},S.prototype.sub=function(e,t){this._verify2(e,t);var r=e.sub(t);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},S.prototype.isub=function(e,t){this._verify2(e,t);var r=e.isub(t);return r.cmpn(0)<0&&r.iadd(this.m),r},S.prototype.shl=function(e,t){return this._verify1(e),this.imod(e.ushln(t))},S.prototype.imul=function(e,t){return this._verify2(e,t),this.imod(e.imul(t))},S.prototype.mul=function(e,t){return this._verify2(e,t),this.imod(e.mul(t))},S.prototype.isqr=function(e){return this.imul(e,e.clone())},S.prototype.sqr=function(e){return this.mul(e,e)},S.prototype.sqrt=function(e){if(e.isZero())return e.clone();var t=this.m.andln(3);if(i(t%2==1),3===t){var r=this.m.add(new n(1)).iushrn(2);return this.pow(e,r)}for(var f=this.m.subn(1),d=0;!f.isZero()&&0===f.andln(1);)d++,f.iushrn(1);i(!f.isZero());var a=new n(1).toRed(this),c=a.redNeg(),s=this.m.subn(1).iushrn(1),o=this.m.bitLength();for(o=new n(2*o*o).toRed(this);0!==this.pow(o,s).cmp(c);)o.redIAdd(c);for(var h=this.pow(o,f),u=this.pow(e,f.addn(1).iushrn(1)),b=this.pow(e,f),l=d;0!==b.cmp(a);){for(var p=b,m=0;0!==p.cmp(a);m++)p=p.redSqr();i(m<l);var v=this.pow(h,new n(1).iushln(l-m-1));u=u.redMul(v),h=v.redSqr(),b=b.redMul(h),l=m}return u},S.prototype.invm=function(e){var t=e._invmp(this.m);return 0!==t.negative?(t.negative=0,this.imod(t).redNeg()):this.imod(t)},S.prototype.pow=function(e,t){if(t.isZero())return new n(1).toRed(this);if(0===t.cmpn(1))return e.clone();var r=new Array(16);r[0]=new n(1).toRed(this),r[1]=e;for(var i=2;i<r.length;i++)r[i]=this.mul(r[i-1],e);var f=r[0],d=0,a=0,c=t.bitLength()%26;for(0===c&&(c=26),i=t.length-1;i>=0;i--){for(var s=t.words[i],o=c-1;o>=0;o--){var h=s>>o&1;f!==r[0]&&(f=this.sqr(f)),0!==h||0!==d?(d<<=1,d|=h,(4===++a||0===i&&0===o)&&(f=this.mul(f,r[d]),a=0,d=0)):a=0}c=26}return f},S.prototype.convertTo=function(e){var t=e.umod(this.m);return t===e?t.clone():t},S.prototype.convertFrom=function(e){var t=e.clone();return t.red=null,t},n.mont=function(e){return new A(e)},f(A,S),A.prototype.convertTo=function(e){return this.imod(e.ushln(this.shift))},A.prototype.convertFrom=function(e){var t=this.imod(e.mul(this.rinv));return t.red=null,t},A.prototype.imul=function(e,t){if(e.isZero()||t.isZero())return e.words[0]=0,e.length=1,e;var r=e.imul(t),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),f=r.isub(i).iushrn(this.shift),n=f;return f.cmp(this.m)>=0?n=f.isub(this.m):f.cmpn(0)<0&&(n=f.iadd(this.m)),n._forceRed(this)},A.prototype.mul=function(e,t){if(e.isZero()||t.isZero())return new n(0)._forceRed(this);var r=e.mul(t),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),f=r.isub(i).iushrn(this.shift),d=f;return f.cmp(this.m)>=0?d=f.isub(this.m):f.cmpn(0)<0&&(d=f.iadd(this.m)),d._forceRed(this)},A.prototype.invm=function(e){return this.imod(e._invmp(this.m).mul(this.r2))._forceRed(this)}}(e,this)}).call(this,r(21)(e))},function(e,t){function r(e,t){if(!e)throw new Error(t||"Assertion failed")}e.exports=r,r.equal=function(e,t,r){if(e!=t)throw new Error(r||"Assertion failed: "+e+" != "+t)}},function(e,t,r){e.exports=r(17)(r(18))},function(e,t,r){"use strict";var i=r(1),f=r(3);function n(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian="big",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}t.BlockHash=n,n.prototype.update=function(e,t){if(e=i.toArray(e,t),this.pending?this.pending=this.pending.concat(e):this.pending=e,this.pendingTotal+=e.length,this.pending.length>=this._delta8){var r=(e=this.pending).length%this._delta8;this.pending=e.slice(e.length-r,e.length),0===this.pending.length&&(this.pending=null),e=i.join32(e,0,e.length-r,this.endian);for(var f=0;f<e.length;f+=this._delta32)this._update(e,f,f+this._delta32)}return this},n.prototype.digest=function(e){return this.update(this._pad()),f(null===this.pending),this._digest(e)},n.prototype._pad=function(){var e=this.pendingTotal,t=this._delta8,r=t-(e+this.padLength)%t,i=new Array(r+this.padLength);i[0]=128;for(var f=1;f<r;f++)i[f]=0;if(e<<=3,"big"===this.endian){for(var n=8;n<this.padLength;n++)i[f++]=0;i[f++]=0,i[f++]=0,i[f++]=0,i[f++]=0,i[f++]=e>>>24&255,i[f++]=e>>>16&255,i[f++]=e>>>8&255,i[f++]=255&e}else for(i[f++]=255&e,i[f++]=e>>>8&255,i[f++]=e>>>16&255,i[f++]=e>>>24&255,i[f++]=0,i[f++]=0,i[f++]=0,i[f++]=0,n=8;n<this.padLength;n++)i[f++]=0;return i}},function(e,t,r){"use strict";var i=r(2),f=r(0),n=f.getNAF,d=f.getJSF,a=f.assert;function c(e,t){this.type=e,this.p=new i(t.p,16),this.red=t.prime?i.red(t.prime):i.mont(this.p),this.zero=new i(0).toRed(this.red),this.one=new i(1).toRed(this.red),this.two=new i(2).toRed(this.red),this.n=t.n&&new i(t.n,16),this.g=t.g&&this.pointFromJSON(t.g,t.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4),this._bitLength=this.n?this.n.bitLength():0;var r=this.n&&this.p.div(this.n);!r||r.cmpn(100)>0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function s(e,t){this.curve=e,this.type=t,this.precomputed=null}e.exports=c,c.prototype.point=function(){throw new Error("Not implemented")},c.prototype.validate=function(){throw new Error("Not implemented")},c.prototype._fixedNafMul=function(e,t){a(e.precomputed);var r=e._getDoubles(),i=n(t,1,this._bitLength),f=(1<<r.step+1)-(r.step%2==0?2:1);f/=3;for(var d=[],c=0;c<i.length;c+=r.step){var s=0;for(t=c+r.step-1;t>=c;t--)s=(s<<1)+i[t];d.push(s)}for(var o=this.jpoint(null,null,null),h=this.jpoint(null,null,null),u=f;u>0;u--){for(c=0;c<d.length;c++){(s=d[c])===u?h=h.mixedAdd(r.points[c]):s===-u&&(h=h.mixedAdd(r.points[c].neg()))}o=o.add(h)}return o.toP()},c.prototype._wnafMul=function(e,t){var r=4,i=e._getNAFPoints(r);r=i.wnd;for(var f=i.points,d=n(t,r,this._bitLength),c=this.jpoint(null,null,null),s=d.length-1;s>=0;s--){for(t=0;s>=0&&0===d[s];s--)t++;if(s>=0&&t++,c=c.dblp(t),s<0)break;var o=d[s];a(0!==o),c="affine"===e.type?o>0?c.mixedAdd(f[o-1>>1]):c.mixedAdd(f[-o-1>>1].neg()):o>0?c.add(f[o-1>>1]):c.add(f[-o-1>>1].neg())}return"affine"===e.type?c.toP():c},c.prototype._wnafMulAdd=function(e,t,r,i,f){for(var a=this._wnafT1,c=this._wnafT2,s=this._wnafT3,o=0,h=0;h<i;h++){var u=(x=t[h])._getNAFPoints(e);a[h]=u.wnd,c[h]=u.points}for(h=i-1;h>=1;h-=2){var b=h-1,l=h;if(1===a[b]&&1===a[l]){var p=[t[b],null,null,t[l]];0===t[b].y.cmp(t[l].y)?(p[1]=t[b].add(t[l]),p[2]=t[b].toJ().mixedAdd(t[l].neg())):0===t[b].y.cmp(t[l].y.redNeg())?(p[1]=t[b].toJ().mixedAdd(t[l]),p[2]=t[b].add(t[l].neg())):(p[1]=t[b].toJ().mixedAdd(t[l]),p[2]=t[b].toJ().mixedAdd(t[l].neg()));var m=[-3,-1,-5,-7,0,7,5,1,3],v=d(r[b],r[l]);o=Math.max(v[0].length,o),s[b]=new Array(o),s[l]=new Array(o);for(var y=0;y<o;y++){var g=0|v[0][y],w=0|v[1][y];s[b][y]=m[3*(g+1)+(w+1)],s[l][y]=0,c[b]=p}}else s[b]=n(r[b],a[b],this._bitLength),s[l]=n(r[l],a[l],this._bitLength),o=Math.max(s[b].length,o),o=Math.max(s[l].length,o)}var M=this.jpoint(null,null,null),S=this._wnafT4;for(h=o;h>=0;h--){for(var A=0;h>=0;){var _=!0;for(y=0;y<i;y++)S[y]=0|s[y][h],0!==S[y]&&(_=!1);if(!_)break;A++,h--}if(h>=0&&A++,M=M.dblp(A),h<0)break;for(y=0;y<i;y++){var x,I=S[y];0!==I&&(I>0?x=c[y][I-1>>1]:I<0&&(x=c[y][-I-1>>1].neg()),M="affine"===x.type?M.mixedAdd(x):M.add(x))}}for(h=0;h<i;h++)c[h]=null;return f?M:M.toP()},c.BasePoint=s,s.prototype.eq=function(){throw new Error("Not implemented")},s.prototype.validate=function(){return this.curve.validate(this)},c.prototype.decodePoint=function(e,t){e=f.toArray(e,t);var r=this.p.byteLength();if((4===e[0]||6===e[0]||7===e[0])&&e.length-1==2*r)return 6===e[0]?a(e[e.length-1]%2==0):7===e[0]&&a(e[e.length-1]%2==1),this.point(e.slice(1,1+r),e.slice(1+r,1+2*r));if((2===e[0]||3===e[0])&&e.length-1===r)return this.pointFromX(e.slice(1,1+r),3===e[0]);throw new Error("Unknown point format")},s.prototype.encodeCompressed=function(e){return this.encode(e,!0)},s.prototype._encode=function(e){var t=this.curve.p.byteLength(),r=this.getX().toArray("be",t);return e?[this.getY().isEven()?2:3].concat(r):[4].concat(r,this.getY().toArray("be",t))},s.prototype.encode=function(e,t){return f.encode(this._encode(t),e)},s.prototype.precompute=function(e){if(this.precomputed)return this;var t={doubles:null,naf:null,beta:null};return t.naf=this._getNAFPoints(8),t.doubles=this._getDoubles(4,e),t.beta=this._getBeta(),this.precomputed=t,this},s.prototype._hasDoubles=function(e){if(!this.precomputed)return!1;var t=this.precomputed.doubles;return!!t&&t.points.length>=Math.ceil((e.bitLength()+1)/t.step)},s.prototype._getDoubles=function(e,t){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var r=[this],i=this,f=0;f<t;f+=e){for(var n=0;n<e;n++)i=i.dbl();r.push(i)}return{step:e,points:r}},s.prototype._getNAFPoints=function(e){if(this.precomputed&&this.precomputed.naf)return this.precomputed.naf;for(var t=[this],r=(1<<e)-1,i=1===r?null:this.dbl(),f=1;f<r;f++)t[f]=t[f-1].add(i);return{wnd:e,points:t}},s.prototype._getBeta=function(){return null},s.prototype.dblp=function(e){for(var t=this,r=0;r<e;r++)t=t.dbl();return t}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e}}},function(e,t,r){"use strict";var i,f=t,n=r(9),d=r(12),a=r(0).assert;function c(e){"short"===e.type?this.curve=new d.short(e):"edwards"===e.type?this.curve=new d.edwards(e):this.curve=new d.mont(e),this.g=this.curve.g,this.n=this.curve.n,this.hash=e.hash,a(this.g.validate(),"Invalid curve"),a(this.g.mul(this.n).isInfinity(),"Invalid curve, G*N != O")}function s(e,t){Object.defineProperty(f,e,{configurable:!0,enumerable:!0,get:function(){var r=new c(t);return Object.defineProperty(f,e,{configurable:!0,enumerable:!0,value:r}),r}})}f.PresetCurve=c,s("p192",{type:"short",prime:"p192",p:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",a:"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",b:"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",n:"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",hash:n.sha256,gRed:!1,g:["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012","07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"]}),s("p224",{type:"short",prime:"p224",p:"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",a:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",b:"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",n:"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",hash:n.sha256,gRed:!1,g:["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21","bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"]}),s("p256",{type:"short",prime:null,p:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",a:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",b:"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",n:"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",hash:n.sha256,gRed:!1,g:["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296","4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"]}),s("p384",{type:"short",prime:null,p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff",a:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc",b:"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",n:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",hash:n.sha384,gRed:!1,g:["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7","3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"]}),s("p521",{type:"short",prime:null,p:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff",a:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc",b:"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",n:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",hash:n.sha512,gRed:!1,g:["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66","00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"]}),s("curve25519",{type:"mont",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"76d06",b:"1",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:n.sha256,gRed:!1,g:["9"]}),s("ed25519",{type:"edwards",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"-1",c:"1",d:"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:n.sha256,gRed:!1,g:["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a","6666666666666666666666666666666666666666666666666666666666666658"]});try{i=r(33)}catch(e){i=void 0}s("secp256k1",{type:"short",prime:"k256",p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",a:"0",b:"7",n:"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",h:"1",hash:n.sha256,beta:"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",lambda:"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",basis:[{a:"3086d221a7d46bcde86c90e49284eb15",b:"-e4437ed6010e88286f547fa90abfe4c3"},{a:"114ca50f7a8e2f3f657c1108d9d44cfd8",b:"3086d221a7d46bcde86c90e49284eb15"}],gRed:!1,g:["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",i]})},function(e,t,r){var i=t;i.utils=r(1),i.common=r(5),i.sha=r(27),i.ripemd=r(31),i.hmac=r(32),i.sha1=i.sha.sha1,i.sha256=i.sha.sha256,i.sha224=i.sha.sha224,i.sha384=i.sha.sha384,i.sha512=i.sha.sha512,i.ripemd160=i.ripemd.ripemd160},function(e,t,r){"use strict";var i=t;function f(e){return 1===e.length?"0"+e:e}function n(e){for(var t="",r=0;r<e.length;r++)t+=f(e[r].toString(16));return t}i.toArray=function(e,t){if(Array.isArray(e))return e.slice();if(!e)return[];var r=[];if("string"!=typeof e){for(var i=0;i<e.length;i++)r[i]=0|e[i];return r}if("hex"===t){(e=e.replace(/[^a-z0-9]+/gi,"")).length%2!=0&&(e="0"+e);for(i=0;i<e.length;i+=2)r.push(parseInt(e[i]+e[i+1],16))}else for(i=0;i<e.length;i++){var f=e.charCodeAt(i),n=f>>8,d=255&f;n?r.push(n,d):r.push(d)}return r},i.zero2=f,i.toHex=n,i.encode=function(e,t){return"hex"===t?n(e):e}},function(e,t,r){var i;function f(e){this.rand=e}if(e.exports=function(e){return i||(i=new f(null)),i.generate(e)},e.exports.Rand=f,f.prototype.generate=function(e){return this._rand(e)},f.prototype._rand=function(e){if(this.rand.getBytes)return this.rand.getBytes(e);for(var t=new Uint8Array(e),r=0;r<t.length;r++)t[r]=this.rand.getByte();return t},"object"==typeof self)self.crypto&&self.crypto.getRandomValues?f.prototype._rand=function(e){var t=new Uint8Array(e);return self.crypto.getRandomValues(t),t}:self.msCrypto&&self.msCrypto.getRandomValues?f.prototype._rand=function(e){var t=new Uint8Array(e);return self.msCrypto.getRandomValues(t),t}:"object"==typeof window&&(f.prototype._rand=function(){throw new Error("Not implemented yet")});else try{var n=r(23);if("function"!=typeof n.randomBytes)throw new Error("Not supported");f.prototype._rand=function(e){return n.randomBytes(e)}}catch(e){}},function(e,t,r){"use strict";var i=t;i.base=r(6),i.short=r(24),i.mont=r(25),i.edwards=r(26)},function(e,t,r){"use strict";var i=r(1).rotr32;function f(e,t,r){return e&t^~e&r}function n(e,t,r){return e&t^e&r^t&r}function d(e,t,r){return e^t^r}t.ft_1=function(e,t,r,i){return 0===e?f(t,r,i):1===e||3===e?d(t,r,i):2===e?n(t,r,i):void 0},t.ch32=f,t.maj32=n,t.p32=d,t.s0_256=function(e){return i(e,2)^i(e,13)^i(e,22)},t.s1_256=function(e){return i(e,6)^i(e,11)^i(e,25)},t.g0_256=function(e){return i(e,7)^i(e,18)^e>>>3},t.g1_256=function(e){return i(e,17)^i(e,19)^e>>>10}},function(e,t,r){"use strict";var i=r(1),f=r(5),n=r(13),d=r(3),a=i.sum32,c=i.sum32_4,s=i.sum32_5,o=n.ch32,h=n.maj32,u=n.s0_256,b=n.s1_256,l=n.g0_256,p=n.g1_256,m=f.BlockHash,v=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function y(){if(!(this instanceof y))return new y;m.call(this),this.h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.k=v,this.W=new Array(64)}i.inherits(y,m),e.exports=y,y.blockSize=512,y.outSize=256,y.hmacStrength=192,y.padLength=64,y.prototype._update=function(e,t){for(var r=this.W,i=0;i<16;i++)r[i]=e[t+i];for(;i<r.length;i++)r[i]=c(p(r[i-2]),r[i-7],l(r[i-15]),r[i-16]);var f=this.h[0],n=this.h[1],m=this.h[2],v=this.h[3],y=this.h[4],g=this.h[5],w=this.h[6],M=this.h[7];for(d(this.k.length===r.length),i=0;i<r.length;i++){var S=s(M,b(y),o(y,g,w),this.k[i],r[i]),A=a(u(f),h(f,n,m));M=w,w=g,g=y,y=a(v,S),v=m,m=n,n=f,f=a(S,A)}this.h[0]=a(this.h[0],f),this.h[1]=a(this.h[1],n),this.h[2]=a(this.h[2],m),this.h[3]=a(this.h[3],v),this.h[4]=a(this.h[4],y),this.h[5]=a(this.h[5],g),this.h[6]=a(this.h[6],w),this.h[7]=a(this.h[7],M)},y.prototype._digest=function(e){return"hex"===e?i.toHex32(this.h,"big"):i.split32(this.h,"big")}},function(e,t,r){"use strict";var i=r(1),f=r(5),n=r(3),d=i.rotr64_hi,a=i.rotr64_lo,c=i.shr64_hi,s=i.shr64_lo,o=i.sum64,h=i.sum64_hi,u=i.sum64_lo,b=i.sum64_4_hi,l=i.sum64_4_lo,p=i.sum64_5_hi,m=i.sum64_5_lo,v=f.BlockHash,y=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591];function g(){if(!(this instanceof g))return new g;v.call(this),this.h=[1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209],this.k=y,this.W=new Array(160)}function w(e,t,r,i,f){var n=e&r^~e&f;return n<0&&(n+=4294967296),n}function M(e,t,r,i,f,n){var d=t&i^~t&n;return d<0&&(d+=4294967296),d}function S(e,t,r,i,f){var n=e&r^e&f^r&f;return n<0&&(n+=4294967296),n}function A(e,t,r,i,f,n){var d=t&i^t&n^i&n;return d<0&&(d+=4294967296),d}function _(e,t){var r=d(e,t,28)^d(t,e,2)^d(t,e,7);return r<0&&(r+=4294967296),r}function x(e,t){var r=a(e,t,28)^a(t,e,2)^a(t,e,7);return r<0&&(r+=4294967296),r}function I(e,t){var r=d(e,t,14)^d(e,t,18)^d(t,e,9);return r<0&&(r+=4294967296),r}function k(e,t){var r=a(e,t,14)^a(e,t,18)^a(t,e,9);return r<0&&(r+=4294967296),r}function z(e,t){var r=d(e,t,1)^d(e,t,8)^c(e,t,7);return r<0&&(r+=4294967296),r}function q(e,t){var r=a(e,t,1)^a(e,t,8)^s(e,t,7);return r<0&&(r+=4294967296),r}function R(e,t){var r=d(e,t,19)^d(t,e,29)^c(e,t,6);return r<0&&(r+=4294967296),r}function P(e,t){var r=a(e,t,19)^a(t,e,29)^s(e,t,6);return r<0&&(r+=4294967296),r}i.inherits(g,v),e.exports=g,g.blockSize=1024,g.outSize=512,g.hmacStrength=192,g.padLength=128,g.prototype._prepareBlock=function(e,t){for(var r=this.W,i=0;i<32;i++)r[i]=e[t+i];for(;i<r.length;i+=2){var f=R(r[i-4],r[i-3]),n=P(r[i-4],r[i-3]),d=r[i-14],a=r[i-13],c=z(r[i-30],r[i-29]),s=q(r[i-30],r[i-29]),o=r[i-32],h=r[i-31];r[i]=b(f,n,d,a,c,s,o,h),r[i+1]=l(f,n,d,a,c,s,o,h)}},g.prototype._update=function(e,t){this._prepareBlock(e,t);var r=this.W,i=this.h[0],f=this.h[1],d=this.h[2],a=this.h[3],c=this.h[4],s=this.h[5],b=this.h[6],l=this.h[7],v=this.h[8],y=this.h[9],g=this.h[10],z=this.h[11],q=this.h[12],R=this.h[13],P=this.h[14],E=this.h[15];n(this.k.length===r.length);for(var N=0;N<r.length;N+=2){var j=P,L=E,B=I(v,y),O=k(v,y),K=w(v,y,g,z,q),T=M(v,y,g,z,q,R),C=this.k[N],F=this.k[N+1],Z=r[N],U=r[N+1],V=p(j,L,B,O,K,T,C,F,Z,U),J=m(j,L,B,O,K,T,C,F,Z,U);j=_(i,f),L=x(i,f),B=S(i,f,d,a,c),O=A(i,f,d,a,c,s);var H=h(j,L,B,O),X=u(j,L,B,O);P=q,E=R,q=g,R=z,g=v,z=y,v=h(b,l,V,J),y=u(l,l,V,J),b=c,l=s,c=d,s=a,d=i,a=f,i=h(V,J,H,X),f=u(V,J,H,X)}o(this.h,0,i,f),o(this.h,2,d,a),o(this.h,4,c,s),o(this.h,6,b,l),o(this.h,8,v,y),o(this.h,10,g,z),o(this.h,12,q,R),o(this.h,14,P,E)},g.prototype._digest=function(e){return"hex"===e?i.toHex32(this.h,"big"):i.split32(this.h,"big")}},function(e,t,r){"use strict";r.r(t),r.d(t,"secp256k1",(function(){return n}));var i=r(4),f=r.n(i);const n={addPrvTweak:function(e,t){const r=e.slice();try{return f.a.privateKeyTweakAdd(r,t,!0)}catch{return null}},addPubTweak:function(e,t){const r=e.slice();try{return f.a.publicKeyTweakAdd(r,t,!0)}catch{return null}},prvToPub:function(e){return f.a.publicKeyCreate(e,!0)},verifyPrv:f.a.privateKeyVerify,verifyPub:f.a.publicKeyVerify}},function(e,t){const r="Impossible case. Please create issue.",i="The tweak was out of range or the resulted private key is invalid",f="The tweak was out of range or equal to zero",n="Unknow error on context randomization",d="Private Key is invalid",a="Public Key could not be parsed",c="Public Key serialization error",s="The sum of the public keys is not valid",o="Signature could not be parsed",h="The nonce generation function failed, or the private key was invalid",u="Public key could not be recover",b="Scalar was invalid (zero or overflow)";function l(e,t){if(!e)throw new Error(t)}function p(e,t,r){if(l(t instanceof Uint8Array,`Expected ${e} to be an Uint8Array`),void 0!==r)if(Array.isArray(r)){const i=`Expected ${e} to be an Uint8Array with length [${r.join(", ")}]`;l(r.includes(t.length),i)}else{const i=`Expected ${e} to be an Uint8Array with length ${r}`;l(t.length===r,i)}}function m(e){l("Boolean"===y(e),"Expected compressed to be a Boolean")}function v(e=(e=>new Uint8Array(e)),t){return"function"==typeof e&&(e=e(t)),p("output",e,t),e}function y(e){return Object.prototype.toString.call(e).slice(8,-1)}e.exports=e=>({contextRandomize(t){switch(l(null===t||t instanceof Uint8Array,"Expected seed to be an Uint8Array or null"),null!==t&&p("seed",t,32),e.contextRandomize(t)){case 1:throw new Error(n)}},privateKeyVerify:t=>(p("private key",t,32),0===e.privateKeyVerify(t)),privateKeyNegate(t){switch(p("private key",t,32),e.privateKeyNegate(t)){case 0:return t;case 1:throw new Error(r)}},privateKeyTweakAdd(t,r){switch(p("private key",t,32),p("tweak",r,32),e.privateKeyTweakAdd(t,r)){case 0:return t;case 1:throw new Error(i)}},privateKeyTweakMul(t,r){switch(p("private key",t,32),p("tweak",r,32),e.privateKeyTweakMul(t,r)){case 0:return t;case 1:throw new Error(f)}},publicKeyVerify:t=>(p("public key",t,[33,65]),0===e.publicKeyVerify(t)),publicKeyCreate(t,r=!0,i){switch(p("private key",t,32),m(r),i=v(i,r?33:65),e.publicKeyCreate(i,t)){case 0:return i;case 1:throw new Error(d);case 2:throw new Error(c)}},publicKeyConvert(t,r=!0,i){switch(p("public key",t,[33,65]),m(r),i=v(i,r?33:65),e.publicKeyConvert(i,t)){case 0:return i;case 1:throw new Error(a);case 2:throw new Error(c)}},publicKeyNegate(t,i=!0,f){switch(p("public key",t,[33,65]),m(i),f=v(f,i?33:65),e.publicKeyNegate(f,t)){case 0:return f;case 1:throw new Error(a);case 2:throw new Error(r);case 3:throw new Error(c)}},publicKeyCombine(t,r=!0,i){l(Array.isArray(t),"Expected public keys to be an Array"),l(t.length>0,"Expected public keys array will have more than zero items");for(const e of t)p("public key",e,[33,65]);switch(m(r),i=v(i,r?33:65),e.publicKeyCombine(i,t)){case 0:return i;case 1:throw new Error(a);case 2:throw new Error(s);case 3:throw new Error(c)}},publicKeyTweakAdd(t,r,f=!0,n){switch(p("public key",t,[33,65]),p("tweak",r,32),m(f),n=v(n,f?33:65),e.publicKeyTweakAdd(n,t,r)){case 0:return n;case 1:throw new Error(a);case 2:throw new Error(i)}},publicKeyTweakMul(t,r,i=!0,n){switch(p("public key",t,[33,65]),p("tweak",r,32),m(i),n=v(n,i?33:65),e.publicKeyTweakMul(n,t,r)){case 0:return n;case 1:throw new Error(a);case 2:throw new Error(f)}},signatureNormalize(t){switch(p("signature",t,64),e.signatureNormalize(t)){case 0:return t;case 1:throw new Error(o)}},signatureExport(t,i){p("signature",t,64);const f={output:i=v(i,72),outputlen:72};switch(e.signatureExport(f,t)){case 0:return i.slice(0,f.outputlen);case 1:throw new Error(o);case 2:throw new Error(r)}},signatureImport(t,i){switch(p("signature",t),i=v(i,64),e.signatureImport(i,t)){case 0:return i;case 1:throw new Error(o);case 2:throw new Error(r)}},ecdsaSign(t,i,f={},n){p("message",t,32),p("private key",i,32),l("Object"===y(f),"Expected options to be an Object"),void 0!==f.data&&p("options.data",f.data),void 0!==f.noncefn&&l("Function"===y(f.noncefn),"Expected options.noncefn to be a Function");const d={signature:n=v(n,64),recid:null};switch(e.ecdsaSign(d,t,i,f.data,f.noncefn)){case 0:return d;case 1:throw new Error(h);case 2:throw new Error(r)}},ecdsaVerify(t,r,i){switch(p("signature",t,64),p("message",r,32),p("public key",i,[33,65]),e.ecdsaVerify(t,r,i)){case 0:return!0;case 3:return!1;case 1:throw new Error(o);case 2:throw new Error(a)}},ecdsaRecover(t,i,f,n=!0,d){switch(p("signature",t,64),l("Number"===y(i)&&i>=0&&i<=3,"Expected recovery id to be a Number within interval [0, 3]"),p("message",f,32),m(n),d=v(d,n?33:65),e.ecdsaRecover(d,t,i,f)){case 0:return d;case 1:throw new Error(o);case 2:throw new Error(u);case 3:throw new Error(r)}},ecdh(t,r,i={},f){switch(p("public key",t,[33,65]),p("private key",r,32),l("Object"===y(i),"Expected options to be an Object"),void 0!==i.data&&p("options.data",i.data),void 0!==i.hashfn?(l("Function"===y(i.hashfn),"Expected options.hashfn to be a Function"),void 0!==i.xbuf&&p("options.xbuf",i.xbuf,32),void 0!==i.ybuf&&p("options.ybuf",i.ybuf,32),p("output",f)):f=v(f,32),e.ecdh(f,t,r,i.data,i.hashfn,i.xbuf,i.ybuf)){case 0:return f;case 1:throw new Error(a);case 2:throw new Error(b)}}})},function(e,t,r){const i=new(0,r(19).ec)("secp256k1"),f=i.curve,n=f.n.constructor;function d(e){const t=e[0];switch(t){case 2:case 3:return 33!==e.length?null:function(e,t){let r=new n(t);if(r.cmp(f.p)>=0)return null;r=r.toRed(f.red);let d=r.redSqr().redIMul(r).redIAdd(f.b).redSqrt();return 3===e!==d.isOdd()&&(d=d.redNeg()),i.keyPair({pub:{x:r,y:d}})}(t,e.subarray(1,33));case 4:case 6:case 7:return 65!==e.length?null:function(e,t,r){let d=new n(t),a=new n(r);if(d.cmp(f.p)>=0||a.cmp(f.p)>=0)return null;if(d=d.toRed(f.red),a=a.toRed(f.red),(6===e||7===e)&&a.isOdd()!==(7===e))return null;const c=d.redSqr().redIMul(d);return a.redSqr().redISub(c.redIAdd(f.b)).isZero()?i.keyPair({pub:{x:d,y:a}}):null}(t,e.subarray(1,33),e.subarray(33,65));default:return null}}function a(e,t){const r=t.encode(null,33===e.length);for(let t=0;t<e.length;++t)e[t]=r[t]}e.exports={contextRandomize:()=>0,privateKeyVerify(e){const t=new n(e);return t.cmp(f.n)<0&&!t.isZero()?0:1},privateKeyNegate(e){const t=new n(e),r=f.n.sub(t).umod(f.n).toArrayLike(Uint8Array,"be",32);return e.set(r),0},privateKeyTweakAdd(e,t){const r=new n(t);if(r.cmp(f.n)>=0)return 1;if(r.iadd(new n(e)),r.cmp(f.n)>=0&&r.isub(f.n),r.isZero())return 1;const i=r.toArrayLike(Uint8Array,"be",32);return e.set(i),0},privateKeyTweakMul(e,t){let r=new n(t);if(r.cmp(f.n)>=0||r.isZero())return 1;r.imul(new n(e)),r.cmp(f.n)>=0&&(r=r.umod(f.n));const i=r.toArrayLike(Uint8Array,"be",32);return e.set(i),0},publicKeyVerify:e=>null===d(e)?1:0,publicKeyCreate(e,t){const r=new n(t);if(r.cmp(f.n)>=0||r.isZero())return 1;return a(e,i.keyFromPrivate(t).getPublic()),0},publicKeyConvert(e,t){const r=d(t);if(null===r)return 1;return a(e,r.getPublic()),0},publicKeyNegate(e,t){const r=d(t);if(null===r)return 1;const i=r.getPublic();return i.y=i.y.redNeg(),a(e,i),0},publicKeyCombine(e,t){const r=new Array(t.length);for(let e=0;e<t.length;++e)if(r[e]=d(t[e]),null===r[e])return 1;let i=r[0].getPublic();for(let e=1;e<r.length;++e)i=i.add(r[e].pub);return i.isInfinity()?2:(a(e,i),0)},publicKeyTweakAdd(e,t,r){const i=d(t);if(null===i)return 1;if((r=new n(r)).cmp(f.n)>=0)return 2;const c=i.getPublic().add(f.g.mul(r));return c.isInfinity()?2:(a(e,c),0)},publicKeyTweakMul(e,t,r){const i=d(t);if(null===i)return 1;if((r=new n(r)).cmp(f.n)>=0||r.isZero())return 2;return a(e,i.getPublic().mul(r)),0},signatureNormalize(e){const t=new n(e.subarray(0,32)),r=new n(e.subarray(32,64));return t.cmp(f.n)>=0||r.cmp(f.n)>=0?1:(1===r.cmp(i.nh)&&e.set(f.n.sub(r).toArrayLike(Uint8Array,"be",32),32),0)},signatureExport(e,t){const r=t.subarray(0,32),i=t.subarray(32,64);if(new n(r).cmp(f.n)>=0)return 1;if(new n(i).cmp(f.n)>=0)return 1;const{output:d}=e;let a=d.subarray(4,37);a[0]=0,a.set(r,1);let c=33,s=0;for(;c>1&&0===a[s]&&!(128&a[s+1]);--c,++s);if(a=a.subarray(s),128&a[0])return 1;if(c>1&&0===a[0]&&!(128&a[1]))return 1;let o=d.subarray(39,72);o[0]=0,o.set(i,1);let h=33,u=0;for(;h>1&&0===o[u]&&!(128&o[u+1]);--h,++u);return o=o.subarray(u),128&o[0]||h>1&&0===o[0]&&!(128&o[1])?1:(e.outputlen=6+c+h,d[0]=48,d[1]=e.outputlen-2,d[2]=2,d[3]=a.length,d.set(a,4),d[4+c]=2,d[5+c]=o.length,d.set(o,6+c),0)},signatureImport(e,t){if(t.length<8)return 1;if(t.length>72)return 1;if(48!==t[0])return 1;if(t[1]!==t.length-2)return 1;if(2!==t[2])return 1;const r=t[3];if(0===r)return 1;if(5+r>=t.length)return 1;if(2!==t[4+r])return 1;const i=t[5+r];if(0===i)return 1;if(6+r+i!==t.length)return 1;if(128&t[4])return 1;if(r>1&&0===t[4]&&!(128&t[5]))return 1;if(128&t[r+6])return 1;if(i>1&&0===t[r+6]&&!(128&t[r+7]))return 1;let d=t.subarray(4,4+r);if(33===d.length&&0===d[0]&&(d=d.subarray(1)),d.length>32)return 1;let a=t.subarray(6+r);if(33===a.length&&0===a[0]&&(a=a.slice(1)),a.length>32)throw new Error("S length is too long");let c=new n(d);c.cmp(f.n)>=0&&(c=new n(0));let s=new n(t.subarray(6+r));return s.cmp(f.n)>=0&&(s=new n(0)),e.set(c.toArrayLike(Uint8Array,"be",32),0),e.set(s.toArrayLike(Uint8Array,"be",32),32),0},ecdsaSign(e,t,r,d,a){if(a){const e=a;a=i=>{const f=e(t,r,null,d,i);if(!(f instanceof Uint8Array&&32===f.length))throw new Error("This is the way");return new n(f)}}const c=new n(r);if(c.cmp(f.n)>=0||c.isZero())return 1;let s;try{s=i.sign(t,r,{canonical:!0,k:a,pers:d})}catch(e){return 1}return e.signature.set(s.r.toArrayLike(Uint8Array,"be",32),0),e.signature.set(s.s.toArrayLike(Uint8Array,"be",32),32),e.recid=s.recoveryParam,0},ecdsaVerify(e,t,r){const a={r:e.subarray(0,32),s:e.subarray(32,64)},c=new n(a.r),s=new n(a.s);if(c.cmp(f.n)>=0||s.cmp(f.n)>=0)return 1;if(1===s.cmp(i.nh)||c.isZero()||s.isZero())return 3;const o=d(r);if(null===o)return 2;const h=o.getPublic();return i.verify(t,a,h)?0:3},ecdsaRecover(e,t,r,d){const c={r:t.slice(0,32),s:t.slice(32,64)},s=new n(c.r),o=new n(c.s);if(s.cmp(f.n)>=0||o.cmp(f.n)>=0)return 1;if(s.isZero()||o.isZero())return 2;let h;try{h=i.recoverPubKey(d,c,r)}catch(e){return 2}return a(e,h),0},ecdh(e,t,r,a,c,s,o){const h=d(t);if(null===h)return 1;const u=new n(r);if(u.cmp(f.n)>=0||u.isZero())return 2;const b=h.getPublic().mul(u);if(void 0===c){const t=b.encode(null,!0),r=i.hash().update(t).digest();for(let t=0;t<32;++t)e[t]=r[t]}else{s||(s=new Uint8Array(32));const t=b.getX().toArray("be",32);for(let e=0;e<32;++e)s[e]=t[e];o||(o=new Uint8Array(32));const r=b.getY().toArray("be",32);for(let e=0;e<32;++e)o[e]=r[e];const i=c(s,o,a);if(!(i instanceof Uint8Array&&i.length===e.length))return 2;e.set(i)}return 0}}},function(e,t,r){"use strict";var i=t;i.version=r(20).version,i.utils=r(0),i.rand=r(11),i.curve=r(12),i.curves=r(8),i.ec=r(34),i.eddsa=r(38)},function(e){e.exports=JSON.parse('{"_from":"elliptic@^6.5.2","_id":"elliptic@6.5.2","_inBundle":false,"_integrity":"sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==","_location":"/elliptic","_phantomChildren":{},"_requested":{"type":"range","registry":true,"raw":"elliptic@^6.5.2","name":"elliptic","escapedName":"elliptic","rawSpec":"^6.5.2","saveSpec":null,"fetchSpec":"^6.5.2"},"_requiredBy":["/browserify-sign","/create-ecdh","/secp256k1"],"_resolved":"https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz","_shasum":"05c5678d7173c049d8ca433552224a495d0e3762","_spec":"elliptic@^6.5.2","_where":"/home/k/q/bip32.git/bip32/node_modules/secp256k1","author":{"name":"Fedor Indutny","email":"fedor@indutny.com"},"bugs":{"url":"https://github.com/indutny/elliptic/issues"},"bundleDependencies":false,"dependencies":{"bn.js":"^4.4.0","brorand":"^1.0.1","hash.js":"^1.0.0","hmac-drbg":"^1.0.0","inherits":"^2.0.1","minimalistic-assert":"^1.0.0","minimalistic-crypto-utils":"^1.0.0"},"deprecated":false,"description":"EC cryptography","devDependencies":{"brfs":"^1.4.3","coveralls":"^3.0.8","grunt":"^1.0.4","grunt-browserify":"^5.0.0","grunt-cli":"^1.2.0","grunt-contrib-connect":"^1.0.0","grunt-contrib-copy":"^1.0.0","grunt-contrib-uglify":"^1.0.1","grunt-mocha-istanbul":"^3.0.1","grunt-saucelabs":"^9.0.1","istanbul":"^0.4.2","jscs":"^3.0.7","jshint":"^2.10.3","mocha":"^6.2.2"},"files":["lib"],"homepage":"https://github.com/indutny/elliptic","keywords":["EC","Elliptic","curve","Cryptography"],"license":"MIT","main":"lib/elliptic.js","name":"elliptic","repository":{"type":"git","url":"git+ssh://git@github.com/indutny/elliptic.git"},"scripts":{"jscs":"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js","jshint":"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js","lint":"npm run jscs && npm run jshint","test":"npm run lint && npm run unit","unit":"istanbul test _mocha --reporter=spec test/index.js","version":"grunt dist && git add dist/"},"version":"6.5.2"}')},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t){},function(e,t){},function(e,t,r){"use strict";var i=r(0),f=r(2),n=r(7),d=r(6),a=i.assert;function c(e){d.call(this,"short",e),this.a=new f(e.a,16).toRed(this.red),this.b=new f(e.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=0===this.a.fromRed().cmpn(0),this.threeA=0===this.a.fromRed().sub(this.p).cmpn(-3),this.endo=this._getEndomorphism(e),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}function s(e,t,r,i){d.BasePoint.call(this,e,"affine"),null===t&&null===r?(this.x=null,this.y=null,this.inf=!0):(this.x=new f(t,16),this.y=new f(r,16),i&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}function o(e,t,r,i){d.BasePoint.call(this,e,"jacobian"),null===t&&null===r&&null===i?(this.x=this.curve.one,this.y=this.curve.one,this.z=new f(0)):(this.x=new f(t,16),this.y=new f(r,16),this.z=new f(i,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}n(c,d),e.exports=c,c.prototype._getEndomorphism=function(e){if(this.zeroA&&this.g&&this.n&&1===this.p.modn(3)){var t,r;if(e.beta)t=new f(e.beta,16).toRed(this.red);else{var i=this._getEndoRoots(this.p);t=(t=i[0].cmp(i[1])<0?i[0]:i[1]).toRed(this.red)}if(e.lambda)r=new f(e.lambda,16);else{var n=this._getEndoRoots(this.n);0===this.g.mul(n[0]).x.cmp(this.g.x.redMul(t))?r=n[0]:(r=n[1],a(0===this.g.mul(r).x.cmp(this.g.x.redMul(t))))}return{beta:t,lambda:r,basis:e.basis?e.basis.map((function(e){return{a:new f(e.a,16),b:new f(e.b,16)}})):this._getEndoBasis(r)}}},c.prototype._getEndoRoots=function(e){var t=e===this.p?this.red:f.mont(e),r=new f(2).toRed(t).redInvm(),i=r.redNeg(),n=new f(3).toRed(t).redNeg().redSqrt().redMul(r);return[i.redAdd(n).fromRed(),i.redSub(n).fromRed()]},c.prototype._getEndoBasis=function(e){for(var t,r,i,n,d,a,c,s,o,h=this.n.ushrn(Math.floor(this.n.bitLength()/2)),u=e,b=this.n.clone(),l=new f(1),p=new f(0),m=new f(0),v=new f(1),y=0;0!==u.cmpn(0);){var g=b.div(u);s=b.sub(g.mul(u)),o=m.sub(g.mul(l));var w=v.sub(g.mul(p));if(!i&&s.cmp(h)<0)t=c.neg(),r=l,i=s.neg(),n=o;else if(i&&2==++y)break;c=s,b=u,u=s,m=l,l=o,v=p,p=w}d=s.neg(),a=o;var M=i.sqr().add(n.sqr());return d.sqr().add(a.sqr()).cmp(M)>=0&&(d=t,a=r),i.negative&&(i=i.neg(),n=n.neg()),d.negative&&(d=d.neg(),a=a.neg()),[{a:i,b:n},{a:d,b:a}]},c.prototype._endoSplit=function(e){var t=this.endo.basis,r=t[0],i=t[1],f=i.b.mul(e).divRound(this.n),n=r.b.neg().mul(e).divRound(this.n),d=f.mul(r.a),a=n.mul(i.a),c=f.mul(r.b),s=n.mul(i.b);return{k1:e.sub(d).sub(a),k2:c.add(s).neg()}},c.prototype.pointFromX=function(e,t){(e=new f(e,16)).red||(e=e.toRed(this.red));var r=e.redSqr().redMul(e).redIAdd(e.redMul(this.a)).redIAdd(this.b),i=r.redSqrt();if(0!==i.redSqr().redSub(r).cmp(this.zero))throw new Error("invalid point");var n=i.fromRed().isOdd();return(t&&!n||!t&&n)&&(i=i.redNeg()),this.point(e,i)},c.prototype.validate=function(e){if(e.inf)return!0;var t=e.x,r=e.y,i=this.a.redMul(t),f=t.redSqr().redMul(t).redIAdd(i).redIAdd(this.b);return 0===r.redSqr().redISub(f).cmpn(0)},c.prototype._endoWnafMulAdd=function(e,t,r){for(var i=this._endoWnafT1,f=this._endoWnafT2,n=0;n<e.length;n++){var d=this._endoSplit(t[n]),a=e[n],c=a._getBeta();d.k1.negative&&(d.k1.ineg(),a=a.neg(!0)),d.k2.negative&&(d.k2.ineg(),c=c.neg(!0)),i[2*n]=a,i[2*n+1]=c,f[2*n]=d.k1,f[2*n+1]=d.k2}for(var s=this._wnafMulAdd(1,i,f,2*n,r),o=0;o<2*n;o++)i[o]=null,f[o]=null;return s},n(s,d.BasePoint),c.prototype.point=function(e,t,r){return new s(this,e,t,r)},c.prototype.pointFromJSON=function(e,t){return s.fromJSON(this,e,t)},s.prototype._getBeta=function(){if(this.curve.endo){var e=this.precomputed;if(e&&e.beta)return e.beta;var t=this.curve.point(this.x.redMul(this.curve.endo.beta),this.y);if(e){var r=this.curve,i=function(e){return r.point(e.x.redMul(r.endo.beta),e.y)};e.beta=t,t.precomputed={beta:null,naf:e.naf&&{wnd:e.naf.wnd,points:e.naf.points.map(i)},doubles:e.doubles&&{step:e.doubles.step,points:e.doubles.points.map(i)}}}return t}},s.prototype.toJSON=function(){return this.precomputed?[this.x,this.y,this.precomputed&&{doubles:this.precomputed.doubles&&{step:this.precomputed.doubles.step,points:this.precomputed.doubles.points.slice(1)},naf:this.precomputed.naf&&{wnd:this.precomputed.naf.wnd,points:this.precomputed.naf.points.slice(1)}}]:[this.x,this.y]},s.fromJSON=function(e,t,r){"string"==typeof t&&(t=JSON.parse(t));var i=e.point(t[0],t[1],r);if(!t[2])return i;function f(t){return e.point(t[0],t[1],r)}var n=t[2];return i.precomputed={beta:null,doubles:n.doubles&&{step:n.doubles.step,points:[i].concat(n.doubles.points.map(f))},naf:n.naf&&{wnd:n.naf.wnd,points:[i].concat(n.naf.points.map(f))}},i},s.prototype.inspect=function(){return this.isInfinity()?"<EC Point Infinity>":"<EC Point x: "+this.x.fromRed().toString(16,2)+" y: "+this.y.fromRed().toString(16,2)+">"},s.prototype.isInfinity=function(){return this.inf},s.prototype.add=function(e){if(this.inf)return e;if(e.inf)return this;if(this.eq(e))return this.dbl();if(this.neg().eq(e))return this.curve.point(null,null);if(0===this.x.cmp(e.x))return this.curve.point(null,null);var t=this.y.redSub(e.y);0!==t.cmpn(0)&&(t=t.redMul(this.x.redSub(e.x).redInvm()));var r=t.redSqr().redISub(this.x).redISub(e.x),i=t.redMul(this.x.redSub(r)).redISub(this.y);return this.curve.point(r,i)},s.prototype.dbl=function(){if(this.inf)return this;var e=this.y.redAdd(this.y);if(0===e.cmpn(0))return this.curve.point(null,null);var t=this.curve.a,r=this.x.redSqr(),i=e.redInvm(),f=r.redAdd(r).redIAdd(r).redIAdd(t).redMul(i),n=f.redSqr().redISub(this.x.redAdd(this.x)),d=f.redMul(this.x.redSub(n)).redISub(this.y);return this.curve.point(n,d)},s.prototype.getX=function(){return this.x.fromRed()},s.prototype.getY=function(){return this.y.fromRed()},s.prototype.mul=function(e){return e=new f(e,16),this.isInfinity()?this:this._hasDoubles(e)?this.curve._fixedNafMul(this,e):this.curve.endo?this.curve._endoWnafMulAdd([this],[e]):this.curve._wnafMul(this,e)},s.prototype.mulAdd=function(e,t,r){var i=[this,t],f=[e,r];return this.curve.endo?this.curve._endoWnafMulAdd(i,f):this.curve._wnafMulAdd(1,i,f,2)},s.prototype.jmulAdd=function(e,t,r){var i=[this,t],f=[e,r];return this.curve.endo?this.curve._endoWnafMulAdd(i,f,!0):this.curve._wnafMulAdd(1,i,f,2,!0)},s.prototype.eq=function(e){return this===e||this.inf===e.inf&&(this.inf||0===this.x.cmp(e.x)&&0===this.y.cmp(e.y))},s.prototype.neg=function(e){if(this.inf)return this;var t=this.curve.point(this.x,this.y.redNeg());if(e&&this.precomputed){var r=this.precomputed,i=function(e){return e.neg()};t.precomputed={naf:r.naf&&{wnd:r.naf.wnd,points:r.naf.points.map(i)},doubles:r.doubles&&{step:r.doubles.step,points:r.doubles.points.map(i)}}}return t},s.prototype.toJ=function(){return this.inf?this.curve.jpoint(null,null,null):this.curve.jpoint(this.x,this.y,this.curve.one)},n(o,d.BasePoint),c.prototype.jpoint=function(e,t,r){return new o(this,e,t,r)},o.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var e=this.z.redInvm(),t=e.redSqr(),r=this.x.redMul(t),i=this.y.redMul(t).redMul(e);return this.curve.point(r,i)},o.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},o.prototype.add=function(e){if(this.isInfinity())return e;if(e.isInfinity())return this;var t=e.z.redSqr(),r=this.z.redSqr(),i=this.x.redMul(t),f=e.x.redMul(r),n=this.y.redMul(t.redMul(e.z)),d=e.y.redMul(r.redMul(this.z)),a=i.redSub(f),c=n.redSub(d);if(0===a.cmpn(0))return 0!==c.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var s=a.redSqr(),o=s.redMul(a),h=i.redMul(s),u=c.redSqr().redIAdd(o).redISub(h).redISub(h),b=c.redMul(h.redISub(u)).redISub(n.redMul(o)),l=this.z.redMul(e.z).redMul(a);return this.curve.jpoint(u,b,l)},o.prototype.mixedAdd=function(e){if(this.isInfinity())return e.toJ();if(e.isInfinity())return this;var t=this.z.redSqr(),r=this.x,i=e.x.redMul(t),f=this.y,n=e.y.redMul(t).redMul(this.z),d=r.redSub(i),a=f.redSub(n);if(0===d.cmpn(0))return 0!==a.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var c=d.redSqr(),s=c.redMul(d),o=r.redMul(c),h=a.redSqr().redIAdd(s).redISub(o).redISub(o),u=a.redMul(o.redISub(h)).redISub(f.redMul(s)),b=this.z.redMul(d);return this.curve.jpoint(h,u,b)},o.prototype.dblp=function(e){if(0===e)return this;if(this.isInfinity())return this;if(!e)return this.dbl();if(this.curve.zeroA||this.curve.threeA){for(var t=this,r=0;r<e;r++)t=t.dbl();return t}var i=this.curve.a,f=this.curve.tinv,n=this.x,d=this.y,a=this.z,c=a.redSqr().redSqr(),s=d.redAdd(d);for(r=0;r<e;r++){var o=n.redSqr(),h=s.redSqr(),u=h.redSqr(),b=o.redAdd(o).redIAdd(o).redIAdd(i.redMul(c)),l=n.redMul(h),p=b.redSqr().redISub(l.redAdd(l)),m=l.redISub(p),v=b.redMul(m);v=v.redIAdd(v).redISub(u);var y=s.redMul(a);r+1<e&&(c=c.redMul(u)),n=p,a=y,s=v}return this.curve.jpoint(n,s.redMul(f),a)},o.prototype.dbl=function(){return this.isInfinity()?this:this.curve.zeroA?this._zeroDbl():this.curve.threeA?this._threeDbl():this._dbl()},o.prototype._zeroDbl=function(){var e,t,r;if(this.zOne){var i=this.x.redSqr(),f=this.y.redSqr(),n=f.redSqr(),d=this.x.redAdd(f).redSqr().redISub(i).redISub(n);d=d.redIAdd(d);var a=i.redAdd(i).redIAdd(i),c=a.redSqr().redISub(d).redISub(d),s=n.redIAdd(n);s=(s=s.redIAdd(s)).redIAdd(s),e=c,t=a.redMul(d.redISub(c)).redISub(s),r=this.y.redAdd(this.y)}else{var o=this.x.redSqr(),h=this.y.redSqr(),u=h.redSqr(),b=this.x.redAdd(h).redSqr().redISub(o).redISub(u);b=b.redIAdd(b);var l=o.redAdd(o).redIAdd(o),p=l.redSqr(),m=u.redIAdd(u);m=(m=m.redIAdd(m)).redIAdd(m),e=p.redISub(b).redISub(b),t=l.redMul(b.redISub(e)).redISub(m),r=(r=this.y.redMul(this.z)).redIAdd(r)}return this.curve.jpoint(e,t,r)},o.prototype._threeDbl=function(){var e,t,r;if(this.zOne){var i=this.x.redSqr(),f=this.y.redSqr(),n=f.redSqr(),d=this.x.redAdd(f).redSqr().redISub(i).redISub(n);d=d.redIAdd(d);var a=i.redAdd(i).redIAdd(i).redIAdd(this.curve.a),c=a.redSqr().redISub(d).redISub(d);e=c;var s=n.redIAdd(n);s=(s=s.redIAdd(s)).redIAdd(s),t=a.redMul(d.redISub(c)).redISub(s),r=this.y.redAdd(this.y)}else{var o=this.z.redSqr(),h=this.y.redSqr(),u=this.x.redMul(h),b=this.x.redSub(o).redMul(this.x.redAdd(o));b=b.redAdd(b).redIAdd(b);var l=u.redIAdd(u),p=(l=l.redIAdd(l)).redAdd(l);e=b.redSqr().redISub(p),r=this.y.redAdd(this.z).redSqr().redISub(h).redISub(o);var m=h.redSqr();m=(m=(m=m.redIAdd(m)).redIAdd(m)).redIAdd(m),t=b.redMul(l.redISub(e)).redISub(m)}return this.curve.jpoint(e,t,r)},o.prototype._dbl=function(){var e=this.curve.a,t=this.x,r=this.y,i=this.z,f=i.redSqr().redSqr(),n=t.redSqr(),d=r.redSqr(),a=n.redAdd(n).redIAdd(n).redIAdd(e.redMul(f)),c=t.redAdd(t),s=(c=c.redIAdd(c)).redMul(d),o=a.redSqr().redISub(s.redAdd(s)),h=s.redISub(o),u=d.redSqr();u=(u=(u=u.redIAdd(u)).redIAdd(u)).redIAdd(u);var b=a.redMul(h).redISub(u),l=r.redAdd(r).redMul(i);return this.curve.jpoint(o,b,l)},o.prototype.trpl=function(){if(!this.curve.zeroA)return this.dbl().add(this);var e=this.x.redSqr(),t=this.y.redSqr(),r=this.z.redSqr(),i=t.redSqr(),f=e.redAdd(e).redIAdd(e),n=f.redSqr(),d=this.x.redAdd(t).redSqr().redISub(e).redISub(i),a=(d=(d=(d=d.redIAdd(d)).redAdd(d).redIAdd(d)).redISub(n)).redSqr(),c=i.redIAdd(i);c=(c=(c=c.redIAdd(c)).redIAdd(c)).redIAdd(c);var s=f.redIAdd(d).redSqr().redISub(n).redISub(a).redISub(c),o=t.redMul(s);o=(o=o.redIAdd(o)).redIAdd(o);var h=this.x.redMul(a).redISub(o);h=(h=h.redIAdd(h)).redIAdd(h);var u=this.y.redMul(s.redMul(c.redISub(s)).redISub(d.redMul(a)));u=(u=(u=u.redIAdd(u)).redIAdd(u)).redIAdd(u);var b=this.z.redAdd(d).redSqr().redISub(r).redISub(a);return this.curve.jpoint(h,u,b)},o.prototype.mul=function(e,t){return e=new f(e,t),this.curve._wnafMul(this,e)},o.prototype.eq=function(e){if("affine"===e.type)return this.eq(e.toJ());if(this===e)return!0;var t=this.z.redSqr(),r=e.z.redSqr();if(0!==this.x.redMul(r).redISub(e.x.redMul(t)).cmpn(0))return!1;var i=t.redMul(this.z),f=r.redMul(e.z);return 0===this.y.redMul(f).redISub(e.y.redMul(i)).cmpn(0)},o.prototype.eqXToP=function(e){var t=this.z.redSqr(),r=e.toRed(this.curve.red).redMul(t);if(0===this.x.cmp(r))return!0;for(var i=e.clone(),f=this.curve.redN.redMul(t);;){if(i.iadd(this.curve.n),i.cmp(this.curve.p)>=0)return!1;if(r.redIAdd(f),0===this.x.cmp(r))return!0}},o.prototype.inspect=function(){return this.isInfinity()?"<EC JPoint Infinity>":"<EC JPoint x: "+this.x.toString(16,2)+" y: "+this.y.toString(16,2)+" z: "+this.z.toString(16,2)+">"},o.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}},function(e,t,r){"use strict";var i=r(2),f=r(7),n=r(6),d=r(0);function a(e){n.call(this,"mont",e),this.a=new i(e.a,16).toRed(this.red),this.b=new i(e.b,16).toRed(this.red),this.i4=new i(4).toRed(this.red).redInvm(),this.two=new i(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function c(e,t,r){n.BasePoint.call(this,e,"projective"),null===t&&null===r?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new i(t,16),this.z=new i(r,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}f(a,n),e.exports=a,a.prototype.validate=function(e){var t=e.normalize().x,r=t.redSqr(),i=r.redMul(t).redAdd(r.redMul(this.a)).redAdd(t);return 0===i.redSqrt().redSqr().cmp(i)},f(c,n.BasePoint),a.prototype.decodePoint=function(e,t){return this.point(d.toArray(e,t),1)},a.prototype.point=function(e,t){return new c(this,e,t)},a.prototype.pointFromJSON=function(e){return c.fromJSON(this,e)},c.prototype.precompute=function(){},c.prototype._encode=function(){return this.getX().toArray("be",this.curve.p.byteLength())},c.fromJSON=function(e,t){return new c(e,t[0],t[1]||e.one)},c.prototype.inspect=function(){return this.isInfinity()?"<EC Point Infinity>":"<EC Point x: "+this.x.fromRed().toString(16,2)+" z: "+this.z.fromRed().toString(16,2)+">"},c.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},c.prototype.dbl=function(){var e=this.x.redAdd(this.z).redSqr(),t=this.x.redSub(this.z).redSqr(),r=e.redSub(t),i=e.redMul(t),f=r.redMul(t.redAdd(this.curve.a24.redMul(r)));return this.curve.point(i,f)},c.prototype.add=function(){throw new Error("Not supported on Montgomery curve")},c.prototype.diffAdd=function(e,t){var r=this.x.redAdd(this.z),i=this.x.redSub(this.z),f=e.x.redAdd(e.z),n=e.x.redSub(e.z).redMul(r),d=f.redMul(i),a=t.z.redMul(n.redAdd(d).redSqr()),c=t.x.redMul(n.redISub(d).redSqr());return this.curve.point(a,c)},c.prototype.mul=function(e){for(var t=e.clone(),r=this,i=this.curve.point(null,null),f=[];0!==t.cmpn(0);t.iushrn(1))f.push(t.andln(1));for(var n=f.length-1;n>=0;n--)0===f[n]?(r=r.diffAdd(i,this),i=i.dbl()):(i=r.diffAdd(i,this),r=r.dbl());return i},c.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},c.prototype.jumlAdd=function(){throw new Error("Not supported on Montgomery curve")},c.prototype.eq=function(e){return 0===this.getX().cmp(e.getX())},c.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},c.prototype.getX=function(){return this.normalize(),this.x.fromRed()}},function(e,t,r){"use strict";var i=r(0),f=r(2),n=r(7),d=r(6),a=i.assert;function c(e){this.twisted=1!=(0|e.a),this.mOneA=this.twisted&&-1==(0|e.a),this.extended=this.mOneA,d.call(this,"edwards",e),this.a=new f(e.a,16).umod(this.red.m),this.a=this.a.toRed(this.red),this.c=new f(e.c,16).toRed(this.red),this.c2=this.c.redSqr(),this.d=new f(e.d,16).toRed(this.red),this.dd=this.d.redAdd(this.d),a(!this.twisted||0===this.c.fromRed().cmpn(1)),this.oneC=1==(0|e.c)}function s(e,t,r,i,n){d.BasePoint.call(this,e,"projective"),null===t&&null===r&&null===i?(this.x=this.curve.zero,this.y=this.curve.one,this.z=this.curve.one,this.t=this.curve.zero,this.zOne=!0):(this.x=new f(t,16),this.y=new f(r,16),this.z=i?new f(i,16):this.curve.one,this.t=n&&new f(n,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.t&&!this.t.red&&(this.t=this.t.toRed(this.curve.red)),this.zOne=this.z===this.curve.one,this.curve.extended&&!this.t&&(this.t=this.x.redMul(this.y),this.zOne||(this.t=this.t.redMul(this.z.redInvm()))))}n(c,d),e.exports=c,c.prototype._mulA=function(e){return this.mOneA?e.redNeg():this.a.redMul(e)},c.prototype._mulC=function(e){return this.oneC?e:this.c.redMul(e)},c.prototype.jpoint=function(e,t,r,i){return this.point(e,t,r,i)},c.prototype.pointFromX=function(e,t){(e=new f(e,16)).red||(e=e.toRed(this.red));var r=e.redSqr(),i=this.c2.redSub(this.a.redMul(r)),n=this.one.redSub(this.c2.redMul(this.d).redMul(r)),d=i.redMul(n.redInvm()),a=d.redSqrt();if(0!==a.redSqr().redSub(d).cmp(this.zero))throw new Error("invalid point");var c=a.fromRed().isOdd();return(t&&!c||!t&&c)&&(a=a.redNeg()),this.point(e,a)},c.prototype.pointFromY=function(e,t){(e=new f(e,16)).red||(e=e.toRed(this.red));var r=e.redSqr(),i=r.redSub(this.c2),n=r.redMul(this.d).redMul(this.c2).redSub(this.a),d=i.redMul(n.redInvm());if(0===d.cmp(this.zero)){if(t)throw new Error("invalid point");return this.point(this.zero,e)}var a=d.redSqrt();if(0!==a.redSqr().redSub(d).cmp(this.zero))throw new Error("invalid point");return a.fromRed().isOdd()!==t&&(a=a.redNeg()),this.point(a,e)},c.prototype.validate=function(e){if(e.isInfinity())return!0;e.normalize();var t=e.x.redSqr(),r=e.y.redSqr(),i=t.redMul(this.a).redAdd(r),f=this.c2.redMul(this.one.redAdd(this.d.redMul(t).redMul(r)));return 0===i.cmp(f)},n(s,d.BasePoint),c.prototype.pointFromJSON=function(e){return s.fromJSON(this,e)},c.prototype.point=function(e,t,r,i){return new s(this,e,t,r,i)},s.fromJSON=function(e,t){return new s(e,t[0],t[1],t[2])},s.prototype.inspect=function(){return this.isInfinity()?"<EC Point Infinity>":"<EC Point x: "+this.x.fromRed().toString(16,2)+" y: "+this.y.fromRed().toString(16,2)+" z: "+this.z.fromRed().toString(16,2)+">"},s.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&(0===this.y.cmp(this.z)||this.zOne&&0===this.y.cmp(this.curve.c))},s.prototype._extDbl=function(){var e=this.x.redSqr(),t=this.y.redSqr(),r=this.z.redSqr();r=r.redIAdd(r);var i=this.curve._mulA(e),f=this.x.redAdd(this.y).redSqr().redISub(e).redISub(t),n=i.redAdd(t),d=n.redSub(r),a=i.redSub(t),c=f.redMul(d),s=n.redMul(a),o=f.redMul(a),h=d.redMul(n);return this.curve.point(c,s,h,o)},s.prototype._projDbl=function(){var e,t,r,i=this.x.redAdd(this.y).redSqr(),f=this.x.redSqr(),n=this.y.redSqr();if(this.curve.twisted){var d=(s=this.curve._mulA(f)).redAdd(n);if(this.zOne)e=i.redSub(f).redSub(n).redMul(d.redSub(this.curve.two)),t=d.redMul(s.redSub(n)),r=d.redSqr().redSub(d).redSub(d);else{var a=this.z.redSqr(),c=d.redSub(a).redISub(a);e=i.redSub(f).redISub(n).redMul(c),t=d.redMul(s.redSub(n)),r=d.redMul(c)}}else{var s=f.redAdd(n);a=this.curve._mulC(this.z).redSqr(),c=s.redSub(a).redSub(a);e=this.curve._mulC(i.redISub(s)).redMul(c),t=this.curve._mulC(s).redMul(f.redISub(n)),r=s.redMul(c)}return this.curve.point(e,t,r)},s.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},s.prototype._extAdd=function(e){var t=this.y.redSub(this.x).redMul(e.y.redSub(e.x)),r=this.y.redAdd(this.x).redMul(e.y.redAdd(e.x)),i=this.t.redMul(this.curve.dd).redMul(e.t),f=this.z.redMul(e.z.redAdd(e.z)),n=r.redSub(t),d=f.redSub(i),a=f.redAdd(i),c=r.redAdd(t),s=n.redMul(d),o=a.redMul(c),h=n.redMul(c),u=d.redMul(a);return this.curve.point(s,o,u,h)},s.prototype._projAdd=function(e){var t,r,i=this.z.redMul(e.z),f=i.redSqr(),n=this.x.redMul(e.x),d=this.y.redMul(e.y),a=this.curve.d.redMul(n).redMul(d),c=f.redSub(a),s=f.redAdd(a),o=this.x.redAdd(this.y).redMul(e.x.redAdd(e.y)).redISub(n).redISub(d),h=i.redMul(c).redMul(o);return this.curve.twisted?(t=i.redMul(s).redMul(d.redSub(this.curve._mulA(n))),r=c.redMul(s)):(t=i.redMul(s).redMul(d.redSub(n)),r=this.curve._mulC(c).redMul(s)),this.curve.point(h,t,r)},s.prototype.add=function(e){return this.isInfinity()?e:e.isInfinity()?this:this.curve.extended?this._extAdd(e):this._projAdd(e)},s.prototype.mul=function(e){return this._hasDoubles(e)?this.curve._fixedNafMul(this,e):this.curve._wnafMul(this,e)},s.prototype.mulAdd=function(e,t,r){return this.curve._wnafMulAdd(1,[this,t],[e,r],2,!1)},s.prototype.jmulAdd=function(e,t,r){return this.curve._wnafMulAdd(1,[this,t],[e,r],2,!0)},s.prototype.normalize=function(){if(this.zOne)return this;var e=this.z.redInvm();return this.x=this.x.redMul(e),this.y=this.y.redMul(e),this.t&&(this.t=this.t.redMul(e)),this.z=this.curve.one,this.zOne=!0,this},s.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},s.prototype.getX=function(){return this.normalize(),this.x.fromRed()},s.prototype.getY=function(){return this.normalize(),this.y.fromRed()},s.prototype.eq=function(e){return this===e||0===this.getX().cmp(e.getX())&&0===this.getY().cmp(e.getY())},s.prototype.eqXToP=function(e){var t=e.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(t))return!0;for(var r=e.clone(),i=this.curve.redN.redMul(this.z);;){if(r.iadd(this.curve.n),r.cmp(this.curve.p)>=0)return!1;if(t.redIAdd(i),0===this.x.cmp(t))return!0}},s.prototype.toP=s.prototype.normalize,s.prototype.mixedAdd=s.prototype.add},function(e,t,r){"use strict";t.sha1=r(28),t.sha224=r(29),t.sha256=r(14),t.sha384=r(30),t.sha512=r(15)},function(e,t,r){"use strict";var i=r(1),f=r(5),n=r(13),d=i.rotl32,a=i.sum32,c=i.sum32_5,s=n.ft_1,o=f.BlockHash,h=[1518500249,1859775393,2400959708,3395469782];function u(){if(!(this instanceof u))return new u;o.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.W=new Array(80)}i.inherits(u,o),e.exports=u,u.blockSize=512,u.outSize=160,u.hmacStrength=80,u.padLength=64,u.prototype._update=function(e,t){for(var r=this.W,i=0;i<16;i++)r[i]=e[t+i];for(;i<r.length;i++)r[i]=d(r[i-3]^r[i-8]^r[i-14]^r[i-16],1);var f=this.h[0],n=this.h[1],o=this.h[2],u=this.h[3],b=this.h[4];for(i=0;i<r.length;i++){var l=~~(i/20),p=c(d(f,5),s(l,n,o,u),b,r[i],h[l]);b=u,u=o,o=d(n,30),n=f,f=p}this.h[0]=a(this.h[0],f),this.h[1]=a(this.h[1],n),this.h[2]=a(this.h[2],o),this.h[3]=a(this.h[3],u),this.h[4]=a(this.h[4],b)},u.prototype._digest=function(e){return"hex"===e?i.toHex32(this.h,"big"):i.split32(this.h,"big")}},function(e,t,r){"use strict";var i=r(1),f=r(14);function n(){if(!(this instanceof n))return new n;f.call(this),this.h=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428]}i.inherits(n,f),e.exports=n,n.blockSize=512,n.outSize=224,n.hmacStrength=192,n.padLength=64,n.prototype._digest=function(e){return"hex"===e?i.toHex32(this.h.slice(0,7),"big"):i.split32(this.h.slice(0,7),"big")}},function(e,t,r){"use strict";var i=r(1),f=r(15);function n(){if(!(this instanceof n))return new n;f.call(this),this.h=[3418070365,3238371032,1654270250,914150663,2438529370,812702999,355462360,4144912697,1731405415,4290775857,2394180231,1750603025,3675008525,1694076839,1203062813,3204075428]}i.inherits(n,f),e.exports=n,n.blockSize=1024,n.outSize=384,n.hmacStrength=192,n.padLength=128,n.prototype._digest=function(e){return"hex"===e?i.toHex32(this.h.slice(0,12),"big"):i.split32(this.h.slice(0,12),"big")}},function(e,t,r){"use strict";var i=r(1),f=r(5),n=i.rotl32,d=i.sum32,a=i.sum32_3,c=i.sum32_4,s=f.BlockHash;function o(){if(!(this instanceof o))return new o;s.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.endian="little"}function h(e,t,r,i){return e<=15?t^r^i:e<=31?t&r|~t&i:e<=47?(t|~r)^i:e<=63?t&i|r&~i:t^(r|~i)}function u(e){return e<=15?0:e<=31?1518500249:e<=47?1859775393:e<=63?2400959708:2840853838}function b(e){return e<=15?1352829926:e<=31?1548603684:e<=47?1836072691:e<=63?2053994217:0}i.inherits(o,s),t.ripemd160=o,o.blockSize=512,o.outSize=160,o.hmacStrength=192,o.padLength=64,o.prototype._update=function(e,t){for(var r=this.h[0],i=this.h[1],f=this.h[2],s=this.h[3],o=this.h[4],y=r,g=i,w=f,M=s,S=o,A=0;A<80;A++){var _=d(n(c(r,h(A,i,f,s),e[l[A]+t],u(A)),m[A]),o);r=o,o=s,s=n(f,10),f=i,i=_,_=d(n(c(y,h(79-A,g,w,M),e[p[A]+t],b(A)),v[A]),S),y=S,S=M,M=n(w,10),w=g,g=_}_=a(this.h[1],f,M),this.h[1]=a(this.h[2],s,S),this.h[2]=a(this.h[3],o,y),this.h[3]=a(this.h[4],r,g),this.h[4]=a(this.h[0],i,w),this.h[0]=_},o.prototype._digest=function(e){return"hex"===e?i.toHex32(this.h,"little"):i.split32(this.h,"little")};var l=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],p=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],m=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],v=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]},function(e,t,r){"use strict";var i=r(1),f=r(3);function n(e,t,r){if(!(this instanceof n))return new n(e,t,r);this.Hash=e,this.blockSize=e.blockSize/8,this.outSize=e.outSize/8,this.inner=null,this.outer=null,this._init(i.toArray(t,r))}e.exports=n,n.prototype._init=function(e){e.length>this.blockSize&&(e=(new this.Hash).update(e).digest()),f(e.length<=this.blockSize);for(var t=e.length;t<this.blockSize;t++)e.push(0);for(t=0;t<e.length;t++)e[t]^=54;for(this.inner=(new this.Hash).update(e),t=0;t<e.length;t++)e[t]^=106;this.outer=(new this.Hash).update(e)},n.prototype.update=function(e,t){return this.inner.update(e,t),this},n.prototype.digest=function(e){return this.outer.update(this.inner.digest()),this.outer.digest(e)}},function(e,t){e.exports={doubles:{step:4,points:[["e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a","f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"],["8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508","11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"],["175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739","d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"],["363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640","4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"],["8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c","4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"],["723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda","96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"],["eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa","5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"],["100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0","cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"],["e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d","9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"],["feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d","e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"],["da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1","9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"],["53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0","5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"],["8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047","10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"],["385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862","283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"],["6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7","7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"],["3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd","56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"],["85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83","7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"],["948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a","53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"],["6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8","bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"],["e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d","4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"],["e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725","7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"],["213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754","4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"],["4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c","17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"],["fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6","6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"],["76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39","c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"],["c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891","893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"],["d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b","febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"],["b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03","2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"],["e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d","eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"],["a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070","7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"],["90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4","e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"],["8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da","662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"],["e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11","1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"],["8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e","efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"],["e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41","2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"],["b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef","67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"],["d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8","db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"],["324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d","648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"],["4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96","35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"],["9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd","ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"],["6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5","9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"],["a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266","40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"],["7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71","34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"],["928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac","c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"],["85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751","1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"],["ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e","493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"],["827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241","c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"],["eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3","be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"],["e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f","4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"],["1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19","aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"],["146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be","b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"],["fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9","6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"],["da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2","8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"],["a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13","7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"],["174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c","ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"],["959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba","2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"],["d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151","e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"],["64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073","d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"],["8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458","38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"],["13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b","69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"],["bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366","d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"],["8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa","40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"],["8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0","620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"],["dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787","7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"],["f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e","ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"]]},naf:{wnd:7,points:[["f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9","388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"],["2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4","d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"],["5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc","6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"],["acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe","cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"],["774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb","d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"],["f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8","ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"],["d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e","581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"],["defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34","4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"],["2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c","85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"],["352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5","321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"],["2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f","2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"],["9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714","73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"],["daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729","a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"],["c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db","2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"],["6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4","e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"],["1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5","b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"],["605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479","2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"],["62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d","80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"],["80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f","1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"],["7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb","d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"],["d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9","eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"],["49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963","758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"],["77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74","958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"],["f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530","e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"],["463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b","5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"],["f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247","cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"],["caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1","cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"],["2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120","4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"],["7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435","91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"],["754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18","673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"],["e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8","59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"],["186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb","3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"],["df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f","55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"],["5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143","efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"],["290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba","e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"],["af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45","f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"],["766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a","744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"],["59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e","c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"],["f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8","e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"],["7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c","30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"],["948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519","e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"],["7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab","100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"],["3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca","ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"],["d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf","8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"],["1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610","68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"],["733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4","f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"],["15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c","d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"],["a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940","edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"],["e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980","a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"],["311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3","66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"],["34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf","9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"],["f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63","4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"],["d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448","fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"],["32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf","5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"],["7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5","8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"],["ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6","8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"],["16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5","5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"],["eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99","f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"],["78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51","f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"],["494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5","42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"],["a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5","204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"],["c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997","4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"],["841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881","73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"],["5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5","39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"],["36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66","d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"],["336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726","ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"],["8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede","6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"],["1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94","60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"],["85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31","3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"],["29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51","b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"],["a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252","ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"],["4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5","cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"],["d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b","6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"],["ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4","322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"],["af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f","6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"],["e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889","2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"],["591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246","b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"],["11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984","998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"],["3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a","b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"],["cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030","bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"],["c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197","6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"],["c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593","c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"],["a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef","21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"],["347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38","60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"],["da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a","49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"],["c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111","5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"],["4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502","7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"],["3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea","be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"],["cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26","8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"],["b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986","39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"],["d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e","62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"],["48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4","25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"],["dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda","ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"],["6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859","cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"],["e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f","f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"],["eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c","6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"],["13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942","fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"],["ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a","1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"],["b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80","5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"],["ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d","438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"],["8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1","cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"],["52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63","c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"],["e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352","6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"],["7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193","ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"],["5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00","9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"],["32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58","ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"],["e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7","d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"],["8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8","c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"],["4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e","67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"],["3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d","cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"],["674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b","299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"],["d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f","f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"],["30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6","462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"],["be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297","62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"],["93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a","7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"],["b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c","ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"],["d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52","4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"],["d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb","bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"],["463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065","bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"],["7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917","603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"],["74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9","cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"],["30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3","553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"],["9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57","712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"],["176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66","ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"],["75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8","9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"],["809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721","9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"],["1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180","4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"]]}}},function(e,t,r){"use strict";var i=r(2),f=r(35),n=r(0),d=r(8),a=r(11),c=n.assert,s=r(36),o=r(37);function h(e){if(!(this instanceof h))return new h(e);"string"==typeof e&&(c(d.hasOwnProperty(e),"Unknown curve "+e),e=d[e]),e instanceof d.PresetCurve&&(e={curve:e}),this.curve=e.curve.curve,this.n=this.curve.n,this.nh=this.n.ushrn(1),this.g=this.curve.g,this.g=e.curve.g,this.g.precompute(e.curve.n.bitLength()+1),this.hash=e.hash||e.curve.hash}e.exports=h,h.prototype.keyPair=function(e){return new s(this,e)},h.prototype.keyFromPrivate=function(e,t){return s.fromPrivate(this,e,t)},h.prototype.keyFromPublic=function(e,t){return s.fromPublic(this,e,t)},h.prototype.genKeyPair=function(e){e||(e={});for(var t=new f({hash:this.hash,pers:e.pers,persEnc:e.persEnc||"utf8",entropy:e.entropy||a(this.hash.hmacStrength),entropyEnc:e.entropy&&e.entropyEnc||"utf8",nonce:this.n.toArray()}),r=this.n.byteLength(),n=this.n.sub(new i(2));;){var d=new i(t.generate(r));if(!(d.cmp(n)>0))return d.iaddn(1),this.keyFromPrivate(d)}},h.prototype._truncateToN=function(e,t){var r=8*e.byteLength()-this.n.bitLength();return r>0&&(e=e.ushrn(r)),!t&&e.cmp(this.n)>=0?e.sub(this.n):e},h.prototype.sign=function(e,t,r,n){"object"==typeof r&&(n=r,r=null),n||(n={}),t=this.keyFromPrivate(t,r),e=this._truncateToN(new i(e,16));for(var d=this.n.byteLength(),a=t.getPrivate().toArray("be",d),c=e.toArray("be",d),s=new f({hash:this.hash,entropy:a,nonce:c,pers:n.pers,persEnc:n.persEnc||"utf8"}),h=this.n.sub(new i(1)),u=0;;u++){var b=n.k?n.k(u):new i(s.generate(this.n.byteLength()));if(!((b=this._truncateToN(b,!0)).cmpn(1)<=0||b.cmp(h)>=0)){var l=this.g.mul(b);if(!l.isInfinity()){var p=l.getX(),m=p.umod(this.n);if(0!==m.cmpn(0)){var v=b.invm(this.n).mul(m.mul(t.getPrivate()).iadd(e));if(0!==(v=v.umod(this.n)).cmpn(0)){var y=(l.getY().isOdd()?1:0)|(0!==p.cmp(m)?2:0);return n.canonical&&v.cmp(this.nh)>0&&(v=this.n.sub(v),y^=1),new o({r:m,s:v,recoveryParam:y})}}}}}},h.prototype.verify=function(e,t,r,f){e=this._truncateToN(new i(e,16)),r=this.keyFromPublic(r,f);var n=(t=new o(t,"hex")).r,d=t.s;if(n.cmpn(1)<0||n.cmp(this.n)>=0)return!1;if(d.cmpn(1)<0||d.cmp(this.n)>=0)return!1;var a,c=d.invm(this.n),s=c.mul(e).umod(this.n),h=c.mul(n).umod(this.n);return this.curve._maxwellTrick?!(a=this.g.jmulAdd(s,r.getPublic(),h)).isInfinity()&&a.eqXToP(n):!(a=this.g.mulAdd(s,r.getPublic(),h)).isInfinity()&&0===a.getX().umod(this.n).cmp(n)},h.prototype.recoverPubKey=function(e,t,r,f){c((3&r)===r,"The recovery param is more than two bits"),t=new o(t,f);var n=this.n,d=new i(e),a=t.r,s=t.s,h=1&r,u=r>>1;if(a.cmp(this.curve.p.umod(this.curve.n))>=0&&u)throw new Error("Unable to find sencond key candinate");a=u?this.curve.pointFromX(a.add(this.curve.n),h):this.curve.pointFromX(a,h);var b=t.r.invm(n),l=n.sub(d).mul(b).umod(n),p=s.mul(b).umod(n);return this.g.mulAdd(l,a,p)},h.prototype.getKeyRecoveryParam=function(e,t,r,i){if(null!==(t=new o(t,i)).recoveryParam)return t.recoveryParam;for(var f=0;f<4;f++){var n;try{n=this.recoverPubKey(e,t,f)}catch(e){continue}if(n.eq(r))return f}throw new Error("Unable to find valid recovery factor")}},function(e,t,r){"use strict";var i=r(9),f=r(10),n=r(3);function d(e){if(!(this instanceof d))return new d(e);this.hash=e.hash,this.predResist=!!e.predResist,this.outLen=this.hash.outSize,this.minEntropy=e.minEntropy||this.hash.hmacStrength,this._reseed=null,this.reseedInterval=null,this.K=null,this.V=null;var t=f.toArray(e.entropy,e.entropyEnc||"hex"),r=f.toArray(e.nonce,e.nonceEnc||"hex"),i=f.toArray(e.pers,e.persEnc||"hex");n(t.length>=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(t,r,i)}e.exports=d,d.prototype._init=function(e,t,r){var i=e.concat(t).concat(r);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var f=0;f<this.V.length;f++)this.K[f]=0,this.V[f]=1;this._update(i),this._reseed=1,this.reseedInterval=281474976710656},d.prototype._hmac=function(){return new i.hmac(this.hash,this.K)},d.prototype._update=function(e){var t=this._hmac().update(this.V).update([0]);e&&(t=t.update(e)),this.K=t.digest(),this.V=this._hmac().update(this.V).digest(),e&&(this.K=this._hmac().update(this.V).update([1]).update(e).digest(),this.V=this._hmac().update(this.V).digest())},d.prototype.reseed=function(e,t,r,i){"string"!=typeof t&&(i=r,r=t,t=null),e=f.toArray(e,t),r=f.toArray(r,i),n(e.length>=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(e.concat(r||[])),this._reseed=1},d.prototype.generate=function(e,t,r,i){if(this._reseed>this.reseedInterval)throw new Error("Reseed is required");"string"!=typeof t&&(i=r,r=t,t=null),r&&(r=f.toArray(r,i||"hex"),this._update(r));for(var n=[];n.length<e;)this.V=this._hmac().update(this.V).digest(),n=n.concat(this.V);var d=n.slice(0,e);return this._update(r),this._reseed++,f.encode(d,t)}},function(e,t,r){"use strict";var i=r(2),f=r(0).assert;function n(e,t){this.ec=e,this.priv=null,this.pub=null,t.priv&&this._importPrivate(t.priv,t.privEnc),t.pub&&this._importPublic(t.pub,t.pubEnc)}e.exports=n,n.fromPublic=function(e,t,r){return t instanceof n?t:new n(e,{pub:t,pubEnc:r})},n.fromPrivate=function(e,t,r){return t instanceof n?t:new n(e,{priv:t,privEnc:r})},n.prototype.validate=function(){var e=this.getPublic();return e.isInfinity()?{result:!1,reason:"Invalid public key"}:e.validate()?e.mul(this.ec.curve.n).isInfinity()?{result:!0,reason:null}:{result:!1,reason:"Public key * N != O"}:{result:!1,reason:"Public key is not a point"}},n.prototype.getPublic=function(e,t){return"string"==typeof e&&(t=e,e=null),this.pub||(this.pub=this.ec.g.mul(this.priv)),t?this.pub.encode(t,e):this.pub},n.prototype.getPrivate=function(e){return"hex"===e?this.priv.toString(16,2):this.priv},n.prototype._importPrivate=function(e,t){this.priv=new i(e,t||16),this.priv=this.priv.umod(this.ec.curve.n)},n.prototype._importPublic=function(e,t){if(e.x||e.y)return"mont"===this.ec.curve.type?f(e.x,"Need x coordinate"):"short"!==this.ec.curve.type&&"edwards"!==this.ec.curve.type||f(e.x&&e.y,"Need both x and y coordinate"),void(this.pub=this.ec.curve.point(e.x,e.y));this.pub=this.ec.curve.decodePoint(e,t)},n.prototype.derive=function(e){return e.mul(this.priv).getX()},n.prototype.sign=function(e,t,r){return this.ec.sign(e,this,t,r)},n.prototype.verify=function(e,t){return this.ec.verify(e,t,this)},n.prototype.inspect=function(){return"<Key priv: "+(this.priv&&this.priv.toString(16,2))+" pub: "+(this.pub&&this.pub.inspect())+" >"}},function(e,t,r){"use strict";var i=r(2),f=r(0),n=f.assert;function d(e,t){if(e instanceof d)return e;this._importDER(e,t)||(n(e.r&&e.s,"Signature without r or s"),this.r=new i(e.r,16),this.s=new i(e.s,16),void 0===e.recoveryParam?this.recoveryParam=null:this.recoveryParam=e.recoveryParam)}function a(){this.place=0}function c(e,t){var r=e[t.place++];if(!(128&r))return r;for(var i=15&r,f=0,n=0,d=t.place;n<i;n++,d++)f<<=8,f|=e[d];return t.place=d,f}function s(e){for(var t=0,r=e.length-1;!e[t]&&!(128&e[t+1])&&t<r;)t++;return 0===t?e:e.slice(t)}function o(e,t){if(t<128)e.push(t);else{var r=1+(Math.log(t)/Math.LN2>>>3);for(e.push(128|r);--r;)e.push(t>>>(r<<3)&255);e.push(t)}}e.exports=d,d.prototype._importDER=function(e,t){e=f.toArray(e,t);var r=new a;if(48!==e[r.place++])return!1;if(c(e,r)+r.place!==e.length)return!1;if(2!==e[r.place++])return!1;var n=c(e,r),d=e.slice(r.place,n+r.place);if(r.place+=n,2!==e[r.place++])return!1;var s=c(e,r);if(e.length!==s+r.place)return!1;var o=e.slice(r.place,s+r.place);return 0===d[0]&&128&d[1]&&(d=d.slice(1)),0===o[0]&&128&o[1]&&(o=o.slice(1)),this.r=new i(d),this.s=new i(o),this.recoveryParam=null,!0},d.prototype.toDER=function(e){var t=this.r.toArray(),r=this.s.toArray();for(128&t[0]&&(t=[0].concat(t)),128&r[0]&&(r=[0].concat(r)),t=s(t),r=s(r);!(r[0]||128&r[1]);)r=r.slice(1);var i=[2];o(i,t.length),(i=i.concat(t)).push(2),o(i,r.length);var n=i.concat(r),d=[48];return o(d,n.length),d=d.concat(n),f.encode(d,e)}},function(e,t,r){"use strict";var i=r(9),f=r(8),n=r(0),d=n.assert,a=n.parseBytes,c=r(39),s=r(40);function o(e){if(d("ed25519"===e,"only tested with ed25519 so far"),!(this instanceof o))return new o(e);e=f[e].curve;this.curve=e,this.g=e.g,this.g.precompute(e.n.bitLength()+1),this.pointClass=e.point().constructor,this.encodingLength=Math.ceil(e.n.bitLength()/8),this.hash=i.sha512}e.exports=o,o.prototype.sign=function(e,t){e=a(e);var r=this.keyFromSecret(t),i=this.hashInt(r.messagePrefix(),e),f=this.g.mul(i),n=this.encodePoint(f),d=this.hashInt(n,r.pubBytes(),e).mul(r.priv()),c=i.add(d).umod(this.curve.n);return this.makeSignature({R:f,S:c,Rencoded:n})},o.prototype.verify=function(e,t,r){e=a(e),t=this.makeSignature(t);var i=this.keyFromPublic(r),f=this.hashInt(t.Rencoded(),i.pubBytes(),e),n=this.g.mul(t.S());return t.R().add(i.pub().mul(f)).eq(n)},o.prototype.hashInt=function(){for(var e=this.hash(),t=0;t<arguments.length;t++)e.update(arguments[t]);return n.intFromLE(e.digest()).umod(this.curve.n)},o.prototype.keyFromPublic=function(e){return c.fromPublic(this,e)},o.prototype.keyFromSecret=function(e){return c.fromSecret(this,e)},o.prototype.makeSignature=function(e){return e instanceof s?e:new s(this,e)},o.prototype.encodePoint=function(e){var t=e.getY().toArray("le",this.encodingLength);return t[this.encodingLength-1]|=e.getX().isOdd()?128:0,t},o.prototype.decodePoint=function(e){var t=(e=n.parseBytes(e)).length-1,r=e.slice(0,t).concat(-129&e[t]),i=0!=(128&e[t]),f=n.intFromLE(r);return this.curve.pointFromY(f,i)},o.prototype.encodeInt=function(e){return e.toArray("le",this.encodingLength)},o.prototype.decodeInt=function(e){return n.intFromLE(e)},o.prototype.isPoint=function(e){return e instanceof this.pointClass}},function(e,t,r){"use strict";var i=r(0),f=i.assert,n=i.parseBytes,d=i.cachedProperty;function a(e,t){this.eddsa=e,this._secret=n(t.secret),e.isPoint(t.pub)?this._pub=t.pub:this._pubBytes=n(t.pub)}a.fromPublic=function(e,t){return t instanceof a?t:new a(e,{pub:t})},a.fromSecret=function(e,t){return t instanceof a?t:new a(e,{secret:t})},a.prototype.secret=function(){return this._secret},d(a,"pubBytes",(function(){return this.eddsa.encodePoint(this.pub())})),d(a,"pub",(function(){return this._pubBytes?this.eddsa.decodePoint(this._pubBytes):this.eddsa.g.mul(this.priv())})),d(a,"privBytes",(function(){var e=this.eddsa,t=this.hash(),r=e.encodingLength-1,i=t.slice(0,e.encodingLength);return i[0]&=248,i[r]&=127,i[r]|=64,i})),d(a,"priv",(function(){return this.eddsa.decodeInt(this.privBytes())})),d(a,"hash",(function(){return this.eddsa.hash().update(this.secret()).digest()})),d(a,"messagePrefix",(function(){return this.hash().slice(this.eddsa.encodingLength)})),a.prototype.sign=function(e){return f(this._secret,"KeyPair can only verify"),this.eddsa.sign(e,this)},a.prototype.verify=function(e,t){return this.eddsa.verify(e,t,this)},a.prototype.getSecret=function(e){return f(this._secret,"KeyPair is public only"),i.encode(this.secret(),e)},a.prototype.getPublic=function(e){return i.encode(this.pubBytes(),e)},e.exports=a},function(e,t,r){"use strict";var i=r(2),f=r(0),n=f.assert,d=f.cachedProperty,a=f.parseBytes;function c(e,t){this.eddsa=e,"object"!=typeof t&&(t=a(t)),Array.isArray(t)&&(t={R:t.slice(0,e.encodingLength),S:t.slice(e.encodingLength)}),n(t.R&&t.S,"Signature without R or S"),e.isPoint(t.R)&&(this._R=t.R),t.S instanceof i&&(this._S=t.S),this._Rencoded=Array.isArray(t.R)?t.R:t.Rencoded,this._Sencoded=Array.isArray(t.S)?t.S:t.Sencoded}d(c,"S",(function(){return this.eddsa.decodeInt(this.Sencoded())})),d(c,"R",(function(){return this.eddsa.decodePoint(this.Rencoded())})),d(c,"Rencoded",(function(){return this.eddsa.encodePoint(this.R())})),d(c,"Sencoded",(function(){return this.eddsa.encodeInt(this.S())})),c.prototype.toBytes=function(){return this.Rencoded().concat(this.Sencoded())},c.prototype.toHex=function(){return f.encode(this.toBytes(),"hex").toUpperCase()},e.exports=c}]);
diff --git a/lib/BIP32.hs b/lib/BIP32.hs
--- a/lib/BIP32.hs
+++ b/lib/BIP32.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE StrictData #-}
 
 -- | [BIP-0032](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
 -- Hierarchical Deterministic Wallets, for bitcoin and other cryptocurrencies.
@@ -22,16 +23,27 @@
     -- * Private key
   , XPrv(..)
   , xprvToXPub
-  , I.Prv
-  , I.prv
-  , I.unPrv
-  , I.prvToPub
+    -- ** Single private subkey
+  , subXPrvXPrv
+  , subPrvPrv
+    -- ** Multiple private subkeys
+  , subsXPrvXPrv
+  , subsPrvPrv
+    -- ** Single public subkey
+  , subXPrvXPub
+  , subPrvPub
+    -- ** Multiple public subkeys
+  , subsXPrvXPub
+  , subsPrvPub
 
     -- * Public key
   , XPub(..)
-  , I.Pub
-  , I.pub
-  , I.unPub
+    -- ** Single public subkey
+  , subXPubXPub
+  , subPubPub
+    -- ** Multiple public subkeys
+  , subsXPubXPub
+  , subsPubPub
 
     -- * Chain code
   , Chain
@@ -41,15 +53,7 @@
     -- * Derivation path
   , Index(..)
   , indexIsHardened
-
-    -- * Subkeys
-  , subXPubXPub
-  , subXPrvXPrv
-  , subXPrvXPub
-    -- ** Bare
-  , subPubPub
-  , subPrvPrv
-  , subPrvPub
+  , indexNext
 
     -- * Depth
   , Depth(..)
@@ -73,51 +77,60 @@
 
 import Bitcoin.Hash (hash160, check32)
 import Bitcoin.Hash.Prim (hmacSHA512)
+import qualified Bitcoin.Keys as K
 import Control.Applicative
 import Control.Monad
 import Data.Bits
+import Data.Maybe
 import qualified Data.Binary.Get as Bin
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Base58 as B58
 import qualified Data.ByteString.Builder as BB
 import qualified Data.ByteString.Lazy as BL
+import qualified Data.ByteString.Lazy.Char8 as BL8
 import Data.Word
 
-#ifdef ghcjs_HOST_OS
-import qualified BIP32.GHCJS as I
-#else
-import qualified BIP32.GHC as I
-#endif
-
 --------------------------------------------------------------------------------
 
 -- | Extended private key.
-data XPrv = XPrv !Version !Depth !Fingerprint !Index !Chain !I.Prv
-  deriving (Eq, Show)
+data XPrv = XPrv
+  { xprv_version     :: Version
+  , xprv_depth       :: Depth
+  , xprv_fingerprint :: Fingerprint
+  , xprv_index       :: Index
+  , xprv_chain       :: Chain
+  , xprv_prv         :: K.Prv
+  } deriving (Eq, Show)
 
 -- | Obtain the 'XPub' corresponding to a particular 'XPrv', at a particular
 -- 'Version'.
 xprvToXPub :: Version -> XPrv -> XPub
-xprvToXPub v (XPrv _ d f i c prv) = XPub v d f i c (I.prvToPub prv)
+xprvToXPub v (XPrv _ d f i c prv) = XPub v d f i c (K.prvToPub prv)
 
 --------------------------------------------------------------------------------
 
 -- | Extended private key.
-data XPub = XPub !Version !Depth !Fingerprint !Index !Chain !I.Pub
-  deriving (Eq, Show)
+data XPub = XPub
+  { xpub_version     :: Version
+  , xpub_depth       :: Depth
+  , xpub_fingerprint :: Fingerprint
+  , xpub_index       :: Index
+  , xpub_chain       :: Chain
+  , xpub_pub         :: K.Pub
+  } deriving (Eq, Show)
 
 --------------------------------------------------------------------------------
 
--- | The 33-byte serialized contents of either 'I.Pub' or 'I.Prv'.
+-- | The 33-byte serialized contents of either 'K.Pub' or 'K.Prv'.
 newtype Key = Key B.ByteString
 
-keyPub :: I.Pub -> Key
+keyPub :: K.Pub -> Key
 {-# INLINE keyPub #-}
-keyPub = Key . I.unPub
+keyPub = Key . K.pubCompressed
 
-keyPrv :: I.Prv -> Key
+keyPrv :: K.Prv -> Key
 {-# INLINE keyPrv #-}
-keyPrv = Key . B.cons 0 . I.unPrv
+keyPrv = Key . B.cons 0 . K.prvRaw
 
 --------------------------------------------------------------------------------
 
@@ -187,11 +200,11 @@
 
 --------------------------------------------------------------------------------
 
--- | 4-byte fingerprint of a 'I.Pub' key.
+-- | 4-byte fingerprint of a 'K.Pub' key.
 newtype Fingerprint = Fingerprint { unFingerprint :: Word32 }
   deriving (Eq, Show)
 
-fingerprint :: I.Pub -> Fingerprint
+fingerprint :: K.Pub -> Fingerprint
 {-# INLINE fingerprint #-}
 fingerprint = fingerprint' . keyId
 
@@ -209,9 +222,9 @@
 -- | 20-byte key identifier.
 newtype KeyId = KeyId B.ByteString
 
-keyId :: I.Pub -> KeyId
+keyId :: K.Pub -> KeyId
 {-# INLINE keyId #-}
-keyId = KeyId . hash160 . I.unPub
+keyId = KeyId . hash160 . K.pubCompressed
 
 --------------------------------------------------------------------------------
 
@@ -224,7 +237,7 @@
 instance Show Chain where
   showsPrec n (Chain b) = showParen (n > 10) $
     showString "Chain " .
-    showsPrec 0 (BB.toLazyByteString (BB.byteStringHex b))
+    mappend (BL8.unpack (BB.toLazyByteString (BB.byteStringHex b)))
 
 -- | Construct a 'Chain' code.
 --
@@ -255,19 +268,29 @@
 {-# INLINE indexIsHardened #-}
 indexIsHardened (Index w) = w >= 0x80000000
 
+-- | Increment the given 'Index' by one, but only if doing so would result in a
+-- new 'Index' in the same index group (normal vs. hardened). Otherwise, returns
+-- 'Nothing'.
+indexNext :: Index -> Maybe Index
+{-# INLINE indexNext #-}
+indexNext (Index w) = case w of
+  0xffffffff -> Nothing -- Would be a normal to hardened transition
+  0x7fffffff -> Nothing -- Would be a hardened to normal transition
+  _          -> Just (Index (w + 1))
+
 --------------------------------------------------------------------------------
 
--- | Derive a child 'XPrv' subkey from a parent a parent 'XPrv' key.
+-- | Derive a 'XPrv' subkey from a parent 'XPrv' key.
 --
 -- Returns 'Nothing' if the given inputs result in an invalid key.
 subXPrvXPrv :: XPrv -> Index -> Maybe XPrv
 subXPrvXPrv (XPrv v d0 _ _ ch0 prv0) i1 = do
   d1 <- depthNext d0
   (ch1, prv1) <- subPrvPrv ch0 prv0 i1
-  let f1 = fingerprint (I.prvToPub prv0)
+  let f1 = fingerprint (K.prvToPub prv0)
   pure $ XPrv v d1 f1 i1 ch1 prv1
 
--- | Derive a child 'XPub' subkey from a parent a parent 'XPub' key.
+-- | Derive a 'XPub' subkey from a parent 'XPub' key.
 --
 -- The given 'Index' is expected to /not/ be hardened.
 --
@@ -279,7 +302,7 @@
   let f1 = fingerprint pub0
   pure $ XPub v d1 f1 i1 ch1 pub1
 
--- | Derive a child 'XPub' subkey from a parent a parent 'XPrv' key.
+-- | Derive 'XPub' subkey from a parent 'XPrv' key.
 --
 -- Notice that while @'subXPubXPub' ('xprvToXPub' v) xprv i@ will fail with a
 -- hardened 'Index', @'subXPrvXPub' v xprv i@ may succeed.
@@ -290,46 +313,127 @@
 
 --------------------------------------------------------------------------------
 
--- | Derive a child 'I.Prv' subkey and 'Chain' code at a particular 'Index' from
--- a parent 'I.Prv' and 'Chain' code.
---
--- Returns 'Nothing' if the given inputs result in an invalid key.
-subPrvPrv :: Chain -> I.Prv -> Index -> Maybe (Chain, I.Prv)
+-- | Behaves exactly like 'subXPrvXPrv', but deals with 'Chain' and
+-- 'K.Prv', rather than an 'XPrv'.
+subPrvPrv :: Chain -> K.Prv -> Index -> Maybe (Chain, K.Prv)
 subPrvPrv (Chain ch0) prv0 i1@(Index i1w) = do
-  let pub0 = I.prvToPub prv0
+  let pub0 = K.prvToPub prv0
       x = hmacSHA512 ch0 $ mconcat $ if indexIsHardened i1
-            then [B.singleton 0, I.unPrv prv0, word32BE i1w]
-            else [I.unPub pub0, word32BE i1w]
+            then [B.singleton 0, K.prvRaw prv0, word32BE i1w]
+            else [K.pubCompressed pub0, word32BE i1w]
       (xl, xr) = B.splitAt 32 x
-  prv1 <- I.addPrvTweak prv0 =<< I.tweak xl
+  prv1 <- flip K.prvAddTweak prv0 =<< K.parseTweak xl
   ch1 <- chain xr
   pure (ch1, prv1)
 
--- | Derive a child 'I.Pub' subkey and 'Chain' code at a particular 'Index' from
--- a parent 'I.Pub' and 'Chain' code.
---
--- The given 'Index' is expected to /not/ be hardened.
---
--- Returns 'Nothing' if the given inputs result in an invalid key.
-subPubPub :: Chain -> I.Pub -> Index -> Maybe (Chain, I.Pub)
+-- | Behaves exactly like 'subXPubXPub', but deals with 'Chain' and
+-- 'K.Pub', rather than an 'XPub'.
+subPubPub :: Chain -> K.Pub -> Index -> Maybe (Chain, K.Pub)
 subPubPub (Chain ch0) pub0 i1@(Index i1w) = do
   guard (not (indexIsHardened i1))
-  let x = hmacSHA512 ch0 (I.unPub pub0 <> word32BE i1w)
+  let x = hmacSHA512 ch0 (K.pubCompressed pub0 <> word32BE i1w)
       (xl, xr) = B.splitAt 32 x
-  pub1 <- I.addPubTweak pub0 =<< I.tweak xl
+  pub1 <- flip K.pubAddTweak pub0 =<< K.parseTweak xl
   ch1 <- chain xr
   pure (ch1, pub1)
 
--- | Derive a child 'I.Pub' subkey and 'Chain' code at a particular 'Index' from
--- a parent 'I.Prv' and 'Chain' code.
+-- | Behaves exactly like 'subXPrvXPub', but deals with 'Chain', 'K.Prv' and
+-- 'K.Pub', rather than an 'XPrv' and 'XPub'.
+subPrvPub :: Chain -> K.Prv -> Index -> Maybe (Chain, K.Pub)
+subPrvPub ch0 prv0 i1 = fmap K.prvToPub <$> subPrvPrv ch0 prv0 i1
+
+--------------------------------------------------------------------------------
+
+-- | Lazily derive all the child 'XPrv' subkeys from a parent's 'XPrv'.
 --
--- Notice that while @'subPubPub' ('I.prvToPub' prv) i@ will fail with a
--- hardened 'Index', @'subPrvPub' prv i@ may succeed.
+-- The first child returned is the one at the given 'Index', if any, and the
+-- subsequent childs are those immediately after it (see 'indexNext').
 --
--- Returns 'Nothing' if the given inputs result in an invalid key.
-subPrvPub :: Chain -> I.Prv -> Index -> Maybe (Chain, I.Pub)
-subPrvPub ch0 prv0 i1 = fmap I.prvToPub <$> subPrvPrv ch0 prv0 i1
+-- The returned 'Index'es are not necessarily consecutive, since not all
+-- 'XPrv' and 'Index' combinations are able to derive valid keys.
+-- However, the produced 'Index'es do increase monotonically.
+--
+-- If the given 'Index' is hardened, then all produced children will have
+-- hardened 'Index'es too. If the given 'Index' is normal, then all children
+-- will have normal 'Index'es too. That is, this function will never produce
+-- children with 'Index'es belonging to another group (normal vs. hardened).
+subsXPrvXPrv :: XPrv -> Index -> [XPrv]
+subsXPrvXPrv (XPrv v d0 _ _ ch0 prv0) i = do
+  d1 <- maybeToList $ depthNext d0
+  let f1 = fingerprint (K.prvToPub prv0)
+  (i1, ch1, prv1) <- subsPrvPrv ch0 prv0 i
+  pure $ XPrv v d1 f1 i1 ch1 prv1
 
+-- | Lazily derive all the 'XPub' subkeys from a parent's 'XPub'.
+--
+-- The first child returned is the one at the given 'Index', if any, and the
+-- subsequent childs are those immediately after it (see 'indexNext').
+--
+-- The returned 'Index'es are not necessarily consecutive, since not all
+-- 'XPub' and 'Index' combinations are able to derive valid keys.
+-- However, the produced 'Index'es do increase monotonically.
+--
+-- The produced list will never include a hardened 'Index'. If a hardened
+-- 'Index' is provided as input, the produced list will be empty.
+subsXPubXPub :: XPub -> Index -> [XPub]
+subsXPubXPub (XPub v d0 _ _ ch0 pub0) i = do
+  d1 <- maybeToList $ depthNext d0
+  let f1 = fingerprint pub0
+  (i1, ch1, pub1) <- subsPubPub ch0 pub0 i
+  pure $ XPub v d1 f1 i1 ch1 pub1
+
+-- | Lazily derive all the 'XPub' subkeys from a parent 'XPrv' key.
+--
+-- The first child returned is the one at the given 'Index', if any, and the
+-- subsequent childs are those immediately after it (see 'indexNext').
+--
+-- The returned 'Index'es are not necessarily consecutive, since not all
+-- 'XPrv' and 'Index' combinations are able to derive valid keys.
+-- However, the produced 'Index'es do increase monotonically.
+--
+-- If the given 'Index' is hardened, then all produced children will have
+-- hardened 'Index'es too. If the given 'Index' is normal, then all children
+-- will have normal 'Index'es too. That is, this function will never produce
+-- children with 'Index'es belonging to another group (normal vs. hardened).
+--
+-- /Notice/ that while @'subsXPubXPub' ('xprvToXPub' v) xprv i@ will fail with a
+-- hardened 'Index', @'subsXPrvXPub' v xprv i@ may succeed.
+subsXPrvXPub :: Version -> XPrv -> Index -> [XPub]
+subsXPrvXPub v xprv i1 = xprvToXPub v <$> subsXPrvXPrv xprv i1
+
+----------------------------------------------------------------------------------
+
+-- | Behaves exactly like 'subsXPrvXPrv', but deals with 'Chain' and
+-- 'K.Prv', rather than an 'XPrv'.
+subsPrvPrv :: Chain -> K.Prv -> Index -> [(Index, Chain, K.Prv)]
+subsPrvPrv ch0 prv0 = go
+  where
+    go :: Index -> [(Index, Chain, K.Prv)]
+    go i = let rest = maybe [] go (indexNext i)
+           in case subPrvPrv ch0 prv0 i of
+                Just (ch1, prv1) -> (i, ch1, prv1) : rest
+                Nothing          -> rest
+
+-- | Behaves exactly like 'subsXPubXPub', but deals with 'Chain' and
+-- 'K.Pub', rather than an 'XPub'.
+subsPubPub :: Chain -> K.Pub -> Index -> [(Index, Chain, K.Pub)]
+subsPubPub ch0 pub0 i0
+  | indexIsHardened i0 = []
+  | otherwise          = go i0
+  where
+    go :: Index -> [(Index, Chain, K.Pub)]
+    go i = let rest = maybe [] go (indexNext i)
+           in case subPubPub ch0 pub0 i of
+                Just (ch1, pub1) -> (i, ch1, pub1) : rest
+                Nothing          -> rest
+
+-- | Behaves exactly like 'subsXPrvXPub', but deals with 'Chain', 'K.Prv' and
+-- 'K.Pub', rather than an 'XPrv' and 'XPub'.
+subsPrvPub :: Chain -> K.Prv-> Index -> [(Index, Chain, K.Pub)]
+subsPrvPub ch0 prv0 i0 = do
+  (i1, ch1, prv1) <- subsPrvPrv ch0 prv0 i0
+  pure (i1, ch1, K.prvToPub prv1)
+
 --------------------------------------------------------------------------------
 
 -- | Obtain the Base58 representation for an 'XPub'.
@@ -443,18 +547,18 @@
     Left  k -> Left  (XPub v d f i c k)
     Right k -> Right (XPrv v d f i c k)
 
-getPrv :: Bin.Get I.Prv
+getPrv :: Bin.Get K.Prv
 getPrv = do
   0 <- Bin.getWord8
   a <- Bin.getByteString 32
-  case I.prv a of
+  case K.parsePrv a of
     Just b -> pure b
     Nothing -> fail "Bad private key"
 
-getPub :: Bin.Get I.Pub
+getPub :: Bin.Get K.Pub
 getPub = do
   a <- Bin.getByteString 33
-  case I.pub a of
+  case K.parsePub a of
     Just b -> pure b
     Nothing -> fail "Bad public key"
 
diff --git a/lib/BIP32/GHC.hs b/lib/BIP32/GHC.hs
deleted file mode 100644
--- a/lib/BIP32/GHC.hs
+++ /dev/null
@@ -1,104 +0,0 @@
--- | Implementation to be used when compiled with GHC
-module BIP32.GHC
-  ( Prv
-  , prv
-  , unPrv
-  , prvToPub
-  , addPrvTweak
-
-  , Pub
-  , pub
-  , unPub
-  , addPubTweak
-
-  , Tweak
-  , tweak
-  ) where
-
-import Control.Monad
-import qualified Crypto.Secp256k1 as K
-import qualified Data.ByteString as B
-
---------------------------------------------------------------------------------
-
--- | Private key.
---
--- Construct with 'prv'.
-newtype Prv = Prv K.SecKey
-  deriving (Eq, Show)
-
--- | Obtain the 32 raw bytes inside a 'Prv'. See 'prv'.
-unPrv :: Prv -> B.ByteString
-{-# INLINE unPrv #-}
-unPrv (Prv x) = K.getSecKey x
-
--- | Construct a 'Prv' key from its raw bytes.
---
--- * 32 bytes containing \(ser_{256}(k)\).
---
--- See Bitcoin's [BIP-0032](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
--- for details.
---
--- 'Nothing' if something is not satisfied.
-prv :: B.ByteString -> Maybe Prv
-{-# INLINE prv #-}
-prv x = Prv <$> K.secKey x
-
--- | Obtain the 'Pub' key for 'Prv'.
-prvToPub :: Prv -> Pub
-{-# INLINE prvToPub #-}
-prvToPub (Prv x) = Pub (K.derivePubKey x)
-
--- | Tweak a 'Prv'ate key by adding 'Tweak' times the generator to it.
-addPrvTweak :: Prv -> Tweak -> Maybe Prv
-{-# INLINE addPrvTweak #-}
-addPrvTweak (Prv p) (Tweak t) = Prv <$> K.tweakAddSecKey p t
-
---------------------------------------------------------------------------------
-
--- | Public key.
---
--- Construct with 'pub'.
-newtype Pub = Pub K.PubKey
-  deriving (Eq, Show)
-
--- | Obtain the 33 raw bytes inside a 'Pub'. See 'pub'.
---
--- Corresponds to BIP-0032's \(ser_{P}(P)\).
-unPub :: Pub -> B.ByteString
-{-# INLINE unPub #-}
-unPub (Pub x) = K.exportPubKey True x
-
--- | Construct a 'Pub' key from its raw bytes.
---
--- * 33 bytes in total, containing \(ser_{P}(P)\).
---
--- * The leftmost byte is either @0x02@ or @0x03@, depending on the parity
--- of the omitted @y@ coordinate.
---
--- * The remaining 32 bytes are \(ser_{256}(x)\).
---
--- See Bitcoin's [BIP-0032](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
--- for details.
---
--- 'Nothing' if something is not satisfied.
-pub :: B.ByteString -> Maybe Pub
-{-# INLINE pub #-}
-pub x = do
-  guard (B.length x == 33)
-  Pub <$> K.importPubKey x
-
--- | Tweak a 'Pub'lic key by adding 'Tweak' times the generator to it.
-addPubTweak :: Pub -> Tweak -> Maybe Pub
-{-# INLINE addPubTweak #-}
-addPubTweak (Pub p) (Tweak t) = Pub <$> K.tweakAddPubKey p t
-
---------------------------------------------------------------------------------
-
-newtype Tweak = Tweak K.Tweak
-
--- | Convert a 32-Byte 'B.ByteString' to a 'Tweak'.
-tweak :: B.ByteString -> Maybe Tweak
-{-# INLINE tweak #-}
-tweak x = Tweak <$> K.tweak x
-
diff --git a/lib/BIP32/GHCJS.hs b/lib/BIP32/GHCJS.hs
deleted file mode 100644
--- a/lib/BIP32/GHCJS.hs
+++ /dev/null
@@ -1,198 +0,0 @@
-{-# LANGUAGE KindSignatures #-}
-{-# LANGUAGE ForeignFunctionInterface #-}
-{-# LANGUAGE JavaScriptFFI #-}
-
--- | Implementation to be used when compiled with GHCJS
-module BIP32.GHCJS
-  ( Prv
-  , prv
-  , unPrv
-  , prvToPub
-  , addPrvTweak
-
-  , Pub
-  , pub
-  , unPub
-  , addPubTweak
-
-  , Tweak
-  , tweak
-  ) where
-
-import Control.Monad
-import qualified Data.ByteString as B
-import qualified Data.ByteString.Builder as BB
-import qualified GHCJS.Buffer as Buf
-import GHCJS.Types (JSVal)
-import GHCJS.Nullable
-import qualified JavaScript.TypedArray.ArrayBuffer as AB
-import qualified JavaScript.TypedArray as TA
-
---------------------------------------------------------------------------------
-
--- | Private key.
---
--- Construct with 'prv'.
-newtype Prv = Prv TA.Uint8Array
-
-instance Eq Prv where
-  Prv a == Prv b =
-    byteStringFromUint8Array a == byteStringFromUint8Array b
-
-instance Show Prv where
-  showsPrec n (Prv u) = showParen (n > 10) $
-    let b = byteStringFromUint8Array u
-    in showString "Prv " .
-       showsPrec 0 (BB.toLazyByteString (BB.byteStringHex b))
-
-
--- | Obtain the 32 raw bytes inside a 'Prv'. See 'prv'.
-unPrv :: Prv -> B.ByteString
-{-# INLINE unPrv #-}
-unPrv (Prv x) = byteStringFromUint8Array x
-
--- | Construct a 'Prv' key from its raw bytes.
---
--- * 32 bytes containing \(ser_{256}(k)\).
---
--- See Bitcoin's [BIP-0032](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
--- for details.
---
--- 'Nothing' if something is not satisfied.
-prv :: B.ByteString -> Maybe Prv
-prv b = do
-  guard (B.length b == 32)
-  let u = byteStringToUint8Array b
-  guard (js_secp256k1_verifyPrv u)
-  pure (Prv u)
-
-foreign import javascript unsafe
-  "h$bip32.secp256k1.verifyPrv($1)"
-  js_secp256k1_verifyPrv :: TA.Uint8Array -> Bool
-
--- | Obtain the 'Pub' key for 'Prv'.
-prvToPub :: Prv -> Pub
-{-# INLINE prvToPub #-}
-prvToPub (Prv x) = Pub (js_secp256k1_prvToPub x)
-
-foreign import javascript unsafe
-  "h$bip32.secp256k1.prvToPub($1)"
-  js_secp256k1_prvToPub :: TA.Uint8Array -> TA.Uint8Array
-
--- | Tweak a 'Prv'ate key by adding 'Tweak' times the generator to it.
-addPrvTweak :: Prv -> Tweak -> Maybe Prv
-{-# INLINE addPrvTweak #-}
-addPrvTweak (Prv p) (Tweak t) = do
-  jsv <- nullableToMaybe (js_secp256k1_addPrvTweak p t)
-  pure $ Prv (js_unsafe_JSVal_to_UInt8Array jsv)
-
-foreign import javascript unsafe
-  "h$bip32.secp256k1.addPrvTweak($1, $2)"
-  js_secp256k1_addPrvTweak :: TA.Uint8Array  -- ^ Private key.
-                           -> TA.Uint8Array  -- ^ Tweak.
-                           -> Nullable JSVal -- ^ Nullable Uint8Array
-
---------------------------------------------------------------------------------
-
--- | Public key.
---
--- Construct with 'pub'.
-newtype Pub = Pub TA.Uint8Array
-
-instance Eq Pub where
-  Pub a == Pub b =
-    byteStringFromUint8Array a == byteStringFromUint8Array b
-
-instance Show Pub where
-  showsPrec n (Pub u) = showParen (n > 10) $
-    let b = byteStringFromUint8Array u
-    in showString "Pub " .
-       showsPrec 0 (BB.toLazyByteString (BB.byteStringHex b))
-
--- | Obtain the 33 raw bytes inside a 'Pub'. See 'pub'.
---
--- Corresponds to BIP-0032's \(ser_{P}(P)\).
-unPub :: Pub -> B.ByteString
-{-# INLINE unPub #-}
-unPub (Pub x) = byteStringFromUint8Array x
-
--- | Construct a 'Pub' key from its raw bytes.
---
--- * 33 bytes in total, containing \(ser_{P}(P)\).
---
--- * The leftmost byte is either @0x02@ or @0x03@, depending on the parity
--- of the omitted @y@ coordinate.
---
--- * The remaining 32 bytes are \(ser_{256}(x)\).
---
--- See Bitcoin's [BIP-0032](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
--- for details.
---
--- 'Nothing' if something is not satisfied.
-pub :: B.ByteString -> Maybe Pub
-pub b = do
-  guard (B.length b == 33)
-  let u = byteStringToUint8Array b
-  guard (js_secp256k1_verifyPub u)
-  pure (Pub u)
-
-foreign import javascript unsafe
-  "h$bip32.secp256k1.verifyPub($1)"
-  js_secp256k1_verifyPub :: TA.Uint8Array -> Bool
-
--- | Tweak a 'Pub'lic key by adding 'Tweak' times the generator to it.
-addPubTweak :: Pub -> Tweak -> Maybe Pub
-{-# INLINE addPubTweak #-}
-addPubTweak (Pub p) (Tweak t) = do
-  jsv <- nullableToMaybe (js_secp256k1_addPubTweak p t)
-  pure $ Pub (js_unsafe_JSVal_to_UInt8Array jsv)
-
-foreign import javascript unsafe
-  "h$bip32.secp256k1.addPubTweak($1, $2)"
-  js_secp256k1_addPubTweak :: TA.Uint8Array  -- ^ Public key.
-                           -> TA.Uint8Array  -- ^ Tweak.
-                           -> Nullable JSVal -- ^ Nullable Uint8Array
-
---------------------------------------------------------------------------------
-
-newtype Tweak = Tweak TA.Uint8Array
-
--- | Convert a 32-Byte 'B.ByteString' to a 'Tweak'.
-tweak :: B.ByteString -> Maybe Tweak
-tweak b = do
-  guard (B.length b == 32)
-  pure $ Tweak (byteStringToUint8Array b)
-
---------------------------------------------------------------------------------
-
-byteStringToUint8Array :: B.ByteString -> TA.Uint8Array
-byteStringToUint8Array x
-  | B.length x == 0 = js_emptyUint8Array
-  | otherwise = let (buf, off, len) = Buf.fromByteString x
-                in js_newUint8Array (Buf.getArrayBuffer buf) off len
-
-foreign import javascript unsafe
-  "new Uint8Array($1, $2, $3)"
-  js_newUint8Array :: AB.ArrayBuffer
-                   -> Int  -- ^ Byte offset.
-                   -> Int  -- ^ Byte length.
-                   -> TA.Uint8Array
-
-foreign import javascript unsafe
-  "new Uint8Array(0)"
-  js_emptyUint8Array :: TA.Uint8Array
-
---------------------------------------------------------------------------------
-
-byteStringFromUint8Array :: TA.Uint8Array -> B.ByteString
-byteStringFromUint8Array x =
-  Buf.toByteString (TA.byteOffset x)
-                   (Just (TA.byteLength x))
-                   (Buf.createFromArrayBuffer (TA.buffer x))
-
---------------------------------------------------------------------------------
-
-foreign import javascript unsafe
-  "$r = $1;"
-  js_unsafe_JSVal_to_UInt8Array :: JSVal -> TA.Uint8Array
-
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -6,6 +6,7 @@
 
 module Main (main) where
 
+import qualified Bitcoin.Keys as K
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Base16 as B16
 import qualified Data.ByteString.Base58 as B58
@@ -91,7 +92,7 @@
       Just xprv === S.decodeXPrv xprvB
 
   , testCase "Pub invalid" $ do
-      Nothing @=? S.pub "\x03hxxqhlivzpapqhxguwpftplfduateosa"
+      Nothing @=? K.parsePub "\x03hxxqhlivzpapqhxguwpftplfduateosa"
 
   , testProperty "subPubPub with normal index" $ property $ do
       S.XPub v d f i c p <- forAll genXPub
@@ -109,6 +110,50 @@
       ih :: S.Index <- forAll genIndexHardened
       Nothing === S.subXPubXPub xpub ih
 
+  , testProperty "subsPubPub" $ property $ do
+      pubP :: K.Pub <- forAll genPub
+      i0 :: S.Index <- forAll genIndexNormal
+      chP :: S.Chain <- forAll genChain
+      let mindTheGap = do
+            (c0, pub0) <- S.subPubPub chP pubP i0
+            i1 <- S.indexNext i0
+            (c1, pub1) <- S.subPubPub chP pubP i1
+            i2 <- S.indexNext i1
+            (c2, pub2) <- S.subPubPub chP pubP i2
+            pure [(i0, c0, pub0), (i1, c1, pub1), (i2, c2, pub2)]
+      case mindTheGap of
+        Nothing -> pure () -- We found some gaps. Testing is hard. Skip.
+        Just x  -> x === take 3 (S.subsPubPub chP pubP i0)
+
+  , testCase "indexIsHardened" $ do
+      False @=? S.indexIsHardened (S.Index 0x00000000)
+      False @=? S.indexIsHardened (S.Index 0x00000001)
+      False @=? S.indexIsHardened (S.Index 0x7ffffffe)
+      False @=? S.indexIsHardened (S.Index 0x7fffffff)
+
+      True  @=? S.indexIsHardened (S.Index 0x80000000)
+      True  @=? S.indexIsHardened (S.Index 0x80000001)
+      True  @=? S.indexIsHardened (S.Index 0xfffffffe)
+      True  @=? S.indexIsHardened (S.Index 0xffffffff)
+
+  , testCase "indexNext" $ do
+      S.Index 0x00000000 @=? S.Index minBound
+      S.Index 0xffffffff @=? S.Index maxBound
+      -- Normal
+      Just (S.Index 0x00000001) @=? S.indexNext (S.Index 0x00000000)
+      Just (S.Index 0x00000002) @=? S.indexNext (S.Index 0x00000001)
+      Just (S.Index 0x7ffffffe) @=? S.indexNext (S.Index 0x7ffffffd)
+      Just (S.Index 0x7fffffff) @=? S.indexNext (S.Index 0x7ffffffe)
+      -- Normal upper bound
+      Nothing @=? S.indexNext (S.Index 0x7fffffff)
+      -- Hardened in bounds
+      Just (S.Index 0x80000001) @=? S.indexNext (S.Index 0x80000000)
+      Just (S.Index 0x80000002) @=? S.indexNext (S.Index 0x80000001)
+      Just (S.Index 0x7ffffffe) @=? S.indexNext (S.Index 0x7ffffffd)
+      Just (S.Index 0xffffffff) @=? S.indexNext (S.Index 0xfffffffe)
+      -- Hardened upper bound
+      Nothing @=? S.indexNext (S.Index 0xffffffff)
+
   , tt_vectors
   ]
 
@@ -192,12 +237,12 @@
                                  (S.chain (fromBase16 (tv_chain x)))
 
   , testCase "prv" $ do
-      Just (tv_prv x) @=? fmap (toBase16 . S.unPrv)
-                               (S.prv (fromBase16 (tv_prv x)))
+      Just (tv_prv x) @=? fmap (toBase16 . K.prvRaw)
+                               (K.parsePrv (fromBase16 (tv_prv x)))
 
   , testCase "pub" $ do
-      Just (tv_pub x) @=? fmap (toBase16 . S.unPub)
-                               (S.pub (fromBase16 (tv_pub x)))
+      Just (tv_pub x) @=? fmap (toBase16 . K.pubCompressed)
+                               (K.parsePub (fromBase16 (tv_pub x)))
 
   , testCase "xprvToXPub" $ do
       let Just xprv = S.decodeXPrv (tv_xprv x)
@@ -212,7 +257,7 @@
       f @?= S.Fingerprint (tv_fingerp x)
       i @?= S.Index (tv_index x)
       Just c @?= S.chain (fromBase16 ((tv_chain x)))
-      Just k @?= S.prv (fromBase16 (tv_prv x))
+      Just k @?= K.parsePrv (fromBase16 (tv_prv x))
 
   , testCase "xpub" $ do
       Just xpub@(S.XPub v d f i c k) <- pure $ S.decodeXPub (tv_xpub x)
@@ -222,7 +267,7 @@
       f @?= S.Fingerprint (tv_fingerp x)
       i @?= S.Index (tv_index x)
       Just c @?= S.chain (fromBase16 ((tv_chain x)))
-      Just k @?= S.pub (fromBase16 (tv_pub x))
+      Just k @?= K.parsePub (fromBase16 (tv_pub x))
 
   , testCase "subPubPub" $ do
       let Just xpub0@(S.XPub v0 d0 _ _ _ _) = S.decodeXPub (tv_xpub x)
@@ -234,6 +279,54 @@
         i1' @?= i1
         S.encodeXPub xpub1 @?= xpub1B
 
+  , testCase "subsPubPub" $ do
+      let Just xpub0@(S.XPub v0 d0 _ _ _ _) = S.decodeXPub (tv_xpub x)
+      case filter (not . S.indexIsHardened . S.Index . fst) (tv_subPrvPrvs x) of
+        [] -> pure ()
+        xxx -> do
+          let i0 = S.Index (minimum (fmap fst xxx))
+              subs = take 10 $ S.subsXPubXPub xpub0 i0
+          for_ (tv_subPubPubs x) $ \(i1w, xpub1B) -> do
+            let i1 = S.Index i1w
+                Just xpub1@(S.XPub v1 d1 _ i1' _ _) =
+                  find ((i1 ==) . S.xpub_index) subs
+            v1 @?= v0
+            d1 @?= S.Depth (1 + S.unDepth d0)
+            i1' @?= i1
+            S.encodeXPub xpub1 @?= xpub1B
+
+  , testCase "subsPrvPrv: hardened" $ do
+      let Just xprv0@(S.XPrv v0 d0 _ _ _ _) = S.decodeXPrv (tv_xprv x)
+      case filter (S.indexIsHardened . S.Index . fst) (tv_subPrvPrvs x) of
+        [] -> pure ()
+        xxx -> do
+          let i0 = S.Index (minimum (fmap fst xxx))
+              subs = take 10 $ S.subsXPrvXPrv xprv0 i0
+          for_ xxx $ \(i1w, xprv1B) -> do
+            let i1 = S.Index i1w
+                Just xprv1@(S.XPrv v1 d1 _ i1' _ _) =
+                  find ((i1 ==) . S.xprv_index) subs
+            v1 @?= v0
+            d1 @?= S.Depth (1 + S.unDepth d0)
+            i1' @?= i1
+            S.encodeXPrv xprv1 @?= xprv1B
+
+  , testCase "subsPrvPrv: normal" $ do
+      let Just xprv0@(S.XPrv v0 d0 _ _ _ _) = S.decodeXPrv (tv_xprv x)
+      case filter (not . S.indexIsHardened . S.Index . fst) (tv_subPrvPrvs x) of
+        [] -> pure ()
+        xxx -> do
+          let i0 = S.Index (minimum (fmap fst xxx))
+              subs = take 10 $ S.subsXPrvXPrv xprv0 i0
+          for_ xxx $ \(i1w, xprv1B) -> do
+            let i1 = S.Index i1w
+                Just xprv1@(S.XPrv v1 d1 _ i1' _ _) =
+                  find ((i1 ==) . S.xprv_index) subs
+            v1 @?= v0
+            d1 @?= S.Depth (1 + S.unDepth d0)
+            i1' @?= i1
+            S.encodeXPrv xprv1 @?= xprv1B
+
   , testCase "subPrvPrv" $ do
       let Just xprv0@(S.XPrv v0 d0 _ _ _ _) = S.decodeXPrv (tv_xprv x)
       for_ (tv_subPrvPrvs x) $ \(i1w, xprv1B) -> do
@@ -281,19 +374,19 @@
   let Just c = S.chain b
   pure c
 
-genPrv :: MonadGen m => m S.Prv
+genPrv :: MonadGen m => m K.Prv
 genPrv = do
   b <- Gen.bytes (Range.singleton 32)
-  let Just k = S.prv b
+  let Just k = K.parsePrv b
   pure k
 
-genPub :: MonadGen m => m S.Pub
+genPub :: MonadGen m => m K.Pub
 genPub = go 10000 where
   go 0 = error "genPub: too many attempts"
   go n = do
     h <- Gen.element [2, 3 :: Word8]
     b <- Gen.bytes (Range.singleton 32)
-    case S.pub (B.cons h b) of
+    case K.parsePub (B.cons h b) of
       Just k -> pure k
       Nothing -> go (n - 1)
 
