bitaddress.org/paperwallet.smartcash.cc.html
2018-02-21 23:55:25 +11:00

8163 lines
823 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html>
<head>
<!--
Notice of Copyrights and Licenses:
***********************************
The bitaddress.org project, software and embedded resources are copyright bitaddress.org (pointbiz).
The bitaddress.org name and logo are not part of the open source license.
Portions of the all-in-one HTML document contain JavaScript codes that are the copyrights of others.
The individual copyrights are included throughout the document along with their licenses.
Included JavaScript libraries are separated with HTML script tags.
Summary of JavaScript functions with a redistributable license:
JavaScript function License
******************* ***************
window.Crypto BSD License
window.SecureRandom BSD License
window.EllipticCurve BSD License
window.BigInteger BSD License
window.QRCode MIT License
window.Bitcoin MIT License
window.Crypto_scrypt MIT License
The bitaddress.org software is available under The MIT License (MIT)
Copyright (c) 2011-2016 bitaddress.org (pointbiz)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject
to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
GitHub Repository: https://github.com/SmartCash/PaperWalletGenerator
-->
<title>smartcash.cc</title>
<link rel="icon" href="https://smartcash.cc/wp-content/uploads/2017/08/smartfavi.ico" type="image/x-icon">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script type="text/javascript">
if((location.href).match("http://paperwallet.smartcash.cc")) {
location.href = "https://paperwallet.smartcash.cc";
}
var hash_keccak = function(s) { return CryptoJS.SHA3(s, { outputLength: 256, asBytes: true }); }
var hash_sha256 = function(s) { return CryptoJS.SHA256(s, { asBytes: true }); }
var hash_ripemd160 = function(s) { return CryptoJS.RIPEMD160(s, { asBytes: true }); }
var create_keypair = function() {
var keypair = KEYUTIL.generateKeypair("EC", "secp256k1");
return {prvKey: keypair.prvKeyObj.prvKeyHex, pubKey: keypair.pubKeyObj.pubKeyHex};
}
function wordArrayToByteArray(wordArray) {
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
var u8 = new Uint8Array(sigBytes);
for (var i = 0; i < sigBytes; i++) {
var byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
u8[i]=byte;
}
return u8;
}
var prvKey_to_WIF = function(prvKey, compressed) {
prvKey = compressed ? prvKey+'01' : prvKey;
var baby = CryptoJS.enc.Hex.parse(prvKey);
var version = CryptoJS.enc.Hex.parse('BF');
var child = version.concat(baby);
var teenager = hash_keccak(child);
var checksum = CryptoJS.lib.WordArray.create(teenager.words.slice(0, 4), 4);
var adult = child.concat(checksum);
var bytes = wordArrayToByteArray(adult);
return bs58_encode(bytes);
}
var create_address = function(pubkey) {
var key = CryptoJS.enc.Hex.parse(pubkey);
var baby = hash_sha256(key);
var child = hash_ripemd160(baby);
var version = CryptoJS.enc.Hex.parse('3F');
version.concat(child);
var teenager = version;
var adult = hash_keccak(teenager);
var checksum = CryptoJS.lib.WordArray.create(adult.words.slice(0, 4), 4);
var pensioner = teenager;
pensioner.concat(checksum);
var bytes = wordArrayToByteArray(pensioner);
return bs58_encode(bytes);
}
function toggleClass(element, className){
if (!element || !className){ return; }
var classString = element.className, nameIndex = classString.indexOf(className);
if (nameIndex == -1) { classString += ' ' + className; }
else { classString = classString.substr(0, nameIndex) + classString.substr(nameIndex+className.length); }
element.className = classString;
}
function toggleSingelArt(hide) {
var SingleArt = document.getElementById('SingleArt');
toggleClass(SingleArt, 'removeImage');
}
</script>
<script type="text/javascript">
/*
* jsrsasign 4.2.2 (c) 2010-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
/*
yahoo-min.js
Copyright (c) 2011, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.com/yui/license.html
version: 2.9.0
*/
if(typeof YAHOO=="undefined"||!YAHOO){var YAHOO={};}YAHOO.namespace=function(){var b=arguments,g=null,e,c,f;for(e=0;e<b.length;e=e+1){f=(""+b[e]).split(".");g=YAHOO;for(c=(f[0]=="YAHOO")?1:0;c<f.length;c=c+1){g[f[c]]=g[f[c]]||{};g=g[f[c]];}}return g;};YAHOO.log=function(d,a,c){var b=YAHOO.widget.Logger;if(b&&b.log){return b.log(d,a,c);}else{return false;}};YAHOO.register=function(a,f,e){var k=YAHOO.env.modules,c,j,h,g,d;if(!k[a]){k[a]={versions:[],builds:[]};}c=k[a];j=e.version;h=e.build;g=YAHOO.env.listeners;c.name=a;c.version=j;c.build=h;c.versions.push(j);c.builds.push(h);c.mainClass=f;for(d=0;d<g.length;d=d+1){g[d](c);}if(f){f.VERSION=j;f.BUILD=h;}else{YAHOO.log("mainClass is undefined for module "+a,"warn");}};YAHOO.env=YAHOO.env||{modules:[],listeners:[]};YAHOO.env.getVersion=function(a){return YAHOO.env.modules[a]||null;};YAHOO.env.parseUA=function(d){var e=function(i){var j=0;return parseFloat(i.replace(/\./g,function(){return(j++==1)?"":".";}));},h=navigator,g={ie:0,opera:0,gecko:0,webkit:0,chrome:0,mobile:null,air:0,ipad:0,iphone:0,ipod:0,ios:null,android:0,webos:0,caja:h&&h.cajaVersion,secure:false,os:null},c=d||(navigator&&navigator.userAgent),f=window&&window.location,b=f&&f.href,a;g.secure=b&&(b.toLowerCase().indexOf("https")===0);if(c){if((/windows|win32/i).test(c)){g.os="windows";}else{if((/macintosh/i).test(c)){g.os="macintosh";}else{if((/rhino/i).test(c)){g.os="rhino";}}}if((/KHTML/).test(c)){g.webkit=1;}a=c.match(/AppleWebKit\/([^\s]*)/);if(a&&a[1]){g.webkit=e(a[1]);if(/ Mobile\//.test(c)){g.mobile="Apple";a=c.match(/OS ([^\s]*)/);if(a&&a[1]){a=e(a[1].replace("_","."));}g.ios=a;g.ipad=g.ipod=g.iphone=0;a=c.match(/iPad|iPod|iPhone/);if(a&&a[0]){g[a[0].toLowerCase()]=g.ios;}}else{a=c.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/);if(a){g.mobile=a[0];}if(/webOS/.test(c)){g.mobile="WebOS";a=c.match(/webOS\/([^\s]*);/);if(a&&a[1]){g.webos=e(a[1]);}}if(/ Android/.test(c)){g.mobile="Android";a=c.match(/Android ([^\s]*);/);if(a&&a[1]){g.android=e(a[1]);}}}a=c.match(/Chrome\/([^\s]*)/);if(a&&a[1]){g.chrome=e(a[1]);}else{a=c.match(/AdobeAIR\/([^\s]*)/);if(a){g.air=a[0];}}}if(!g.webkit){a=c.match(/Opera[\s\/]([^\s]*)/);if(a&&a[1]){g.opera=e(a[1]);a=c.match(/Version\/([^\s]*)/);if(a&&a[1]){g.opera=e(a[1]);}a=c.match(/Opera Mini[^;]*/);if(a){g.mobile=a[0];}}else{a=c.match(/MSIE\s([^;]*)/);if(a&&a[1]){g.ie=e(a[1]);}else{a=c.match(/Gecko\/([^\s]*)/);if(a){g.gecko=1;a=c.match(/rv:([^\s\)]*)/);if(a&&a[1]){g.gecko=e(a[1]);}}}}}}return g;};YAHOO.env.ua=YAHOO.env.parseUA();(function(){YAHOO.namespace("util","widget","example");if("undefined"!==typeof YAHOO_config){var b=YAHOO_config.listener,a=YAHOO.env.listeners,d=true,c;if(b){for(c=0;c<a.length;c++){if(a[c]==b){d=false;break;}}if(d){a.push(b);}}}})();YAHOO.lang=YAHOO.lang||{};(function(){var f=YAHOO.lang,a=Object.prototype,c="[object Array]",h="[object Function]",i="[object Object]",b=[],g={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;","`":"&#x60;"},d=["toString","valueOf"],e={isArray:function(j){return a.toString.apply(j)===c;},isBoolean:function(j){return typeof j==="boolean";},isFunction:function(j){return(typeof j==="function")||a.toString.apply(j)===h;},isNull:function(j){return j===null;},isNumber:function(j){return typeof j==="number"&&isFinite(j);},isObject:function(j){return(j&&(typeof j==="object"||f.isFunction(j)))||false;},isString:function(j){return typeof j==="string";},isUndefined:function(j){return typeof j==="undefined";},_IEEnumFix:(YAHOO.env.ua.ie)?function(l,k){var j,n,m;for(j=0;j<d.length;j=j+1){n=d[j];m=k[n];if(f.isFunction(m)&&m!=a[n]){l[n]=m;}}}:function(){},escapeHTML:function(j){return j.replace(/[&<>"'\/`]/g,function(k){return g[k];});},extend:function(m,n,l){if(!n||!m){throw new Error("extend failed, please check that "+"all dependencies are included.");}var k=function(){},j;k.prototype=n.prototype;m.prototype=new k();m.prototype.constructor=m;m.superclass=n.prototype;if(n.prototype.constructor==a.constructor){n.prototype.constructor=n;}if(l){for(j in l){if(f.hasOwnProperty(l,j)){m.prototype[j]=l[j];}}f._IEEnumFix(m.prototype,l);}},augmentObject:function(n,m){if(!m||!n){throw new Error("Absorb failed, verify dependencies.");}var j=arguments,l,o,k=j[2];if(k&&k!==true){for(l=2;l<j.length;l=l+1){n[j[l]]=m[j[l]];}}else{for(o in m){if(k||!(o in n)){n[o]=m[o];}}f._IEEnumFix(n,m);}return n;},augmentProto:function(m,l){if(!l||!m){throw new Error("Augment failed, verify dependencies.");}var j=[m.prototype,l.prototype],k;for(k=2;k<arguments.length;k=k+1){j.push(arguments[k]);}f.augmentObject.apply(this,j);return m;},dump:function(j,p){var l,n,r=[],t="{...}",k="f(){...}",q=", ",m=" => ";if(!f.isObject(j)){return j+"";}else{if(j instanceof Date||("nodeType" in j&&"tagName" in j)){return j;}else{if(f.isFunction(j)){return k;}}}p=(f.isNumber(p))?p:3;if(f.isArray(j)){r.push("[");for(l=0,n=j.length;l<n;l=l+1){if(f.isObject(j[l])){r.push((p>0)?f.dump(j[l],p-1):t);}else{r.push(j[l]);}r.push(q);}if(r.length>1){r.pop();}r.push("]");}else{r.push("{");for(l in j){if(f.hasOwnProperty(j,l)){r.push(l+m);if(f.isObject(j[l])){r.push((p>0)?f.dump(j[l],p-1):t);}else{r.push(j[l]);}r.push(q);}}if(r.length>1){r.pop();}r.push("}");}return r.join("");},substitute:function(x,y,E,l){var D,C,B,G,t,u,F=[],p,z=x.length,A="dump",r=" ",q="{",m="}",n,w;for(;;){D=x.lastIndexOf(q,z);if(D<0){break;}C=x.indexOf(m,D);if(D+1>C){break;}p=x.substring(D+1,C);G=p;u=null;B=G.indexOf(r);if(B>-1){u=G.substring(B+1);G=G.substring(0,B);}t=y[G];if(E){t=E(G,t,u);}if(f.isObject(t)){if(f.isArray(t)){t=f.dump(t,parseInt(u,10));}else{u=u||"";n=u.indexOf(A);if(n>-1){u=u.substring(4);}w=t.toString();if(w===i||n>-1){t=f.dump(t,parseInt(u,10));}else{t=w;}}}else{if(!f.isString(t)&&!f.isNumber(t)){t="~-"+F.length+"-~";F[F.length]=p;}}x=x.substring(0,D)+t+x.substring(C+1);if(l===false){z=D-1;}}for(D=F.length-1;D>=0;D=D-1){x=x.replace(new RegExp("~-"+D+"-~"),"{"+F[D]+"}","g");}return x;},trim:function(j){try{return j.replace(/^\s+|\s+$/g,"");}catch(k){return j;
}},merge:function(){var n={},k=arguments,j=k.length,m;for(m=0;m<j;m=m+1){f.augmentObject(n,k[m],true);}return n;},later:function(t,k,u,n,p){t=t||0;k=k||{};var l=u,s=n,q,j;if(f.isString(u)){l=k[u];}if(!l){throw new TypeError("method undefined");}if(!f.isUndefined(n)&&!f.isArray(s)){s=[n];}q=function(){l.apply(k,s||b);};j=(p)?setInterval(q,t):setTimeout(q,t);return{interval:p,cancel:function(){if(this.interval){clearInterval(j);}else{clearTimeout(j);}}};},isValue:function(j){return(f.isObject(j)||f.isString(j)||f.isNumber(j)||f.isBoolean(j));}};f.hasOwnProperty=(a.hasOwnProperty)?function(j,k){return j&&j.hasOwnProperty&&j.hasOwnProperty(k);}:function(j,k){return !f.isUndefined(j[k])&&j.constructor.prototype[k]!==j[k];};e.augmentObject(f,e,true);YAHOO.util.Lang=f;f.augment=f.augmentProto;YAHOO.augment=f.augmentProto;YAHOO.extend=f.extend;})();YAHOO.register("yahoo",YAHOO,{version:"2.9.0",build:"2800"});
/*! CryptoJS v3.1.2 core-fix.js
* code.google.com/p/crypto-js
* (c) 2009-2013 by Jeff Mott. All rights reserved.
* code.google.com/p/crypto-js/wiki/License
* THIS IS FIX of 'core.js' to fix Hmac issue.
* https://code.google.com/p/crypto-js/issues/detail?id=84
* https://crypto-js.googlecode.com/svn-history/r667/branches/3.x/src/core.js
*/
var CryptoJS=CryptoJS||(function(e,g){var a={};var b=a.lib={};var j=b.Base=(function(){function n(){}return{extend:function(p){n.prototype=this;var o=new n();if(p){o.mixIn(p)}if(!o.hasOwnProperty("init")){o.init=function(){o.$super.init.apply(this,arguments)}}o.init.prototype=o;o.$super=this;return o},create:function(){var o=this.extend();o.init.apply(o,arguments);return o},init:function(){},mixIn:function(p){for(var o in p){if(p.hasOwnProperty(o)){this[o]=p[o]}}if(p.hasOwnProperty("toString")){this.toString=p.toString}},clone:function(){return this.init.prototype.extend(this)}}}());var l=b.WordArray=j.extend({init:function(o,n){o=this.words=o||[];if(n!=g){this.sigBytes=n}else{this.sigBytes=o.length*4}},toString:function(n){return(n||h).stringify(this)},concat:function(t){var q=this.words;var p=t.words;var n=this.sigBytes;var s=t.sigBytes;this.clamp();if(n%4){for(var r=0;r<s;r++){var o=(p[r>>>2]>>>(24-(r%4)*8))&255;q[(n+r)>>>2]|=o<<(24-((n+r)%4)*8)}}else{for(var r=0;r<s;r+=4){q[(n+r)>>>2]=p[r>>>2]}}this.sigBytes+=s;return this},clamp:function(){var o=this.words;var n=this.sigBytes;o[n>>>2]&=4294967295<<(32-(n%4)*8);o.length=e.ceil(n/4)},clone:function(){var n=j.clone.call(this);n.words=this.words.slice(0);return n},random:function(p){var o=[];for(var n=0;n<p;n+=4){o.push((e.random()*4294967296)|0)}return new l.init(o,p)}});var m=a.enc={};var h=m.Hex={stringify:function(p){var r=p.words;var o=p.sigBytes;var q=[];for(var n=0;n<o;n++){var s=(r[n>>>2]>>>(24-(n%4)*8))&255;q.push((s>>>4).toString(16));q.push((s&15).toString(16))}return q.join("")},parse:function(p){var n=p.length;var q=[];for(var o=0;o<n;o+=2){q[o>>>3]|=parseInt(p.substr(o,2),16)<<(24-(o%8)*4)}return new l.init(q,n/2)}};var d=m.Latin1={stringify:function(q){var r=q.words;var p=q.sigBytes;var n=[];for(var o=0;o<p;o++){var s=(r[o>>>2]>>>(24-(o%4)*8))&255;n.push(String.fromCharCode(s))}return n.join("")},parse:function(p){var n=p.length;var q=[];for(var o=0;o<n;o++){q[o>>>2]|=(p.charCodeAt(o)&255)<<(24-(o%4)*8)}return new l.init(q,n)}};var c=m.Utf8={stringify:function(n){try{return decodeURIComponent(escape(d.stringify(n)))}catch(o){throw new Error("Malformed UTF-8 data")}},parse:function(n){return d.parse(unescape(encodeURIComponent(n)))}};var i=b.BufferedBlockAlgorithm=j.extend({reset:function(){this._data=new l.init();this._nDataBytes=0},_append:function(n){if(typeof n=="string"){n=c.parse(n)}this._data.concat(n);this._nDataBytes+=n.sigBytes},_process:function(w){var q=this._data;var x=q.words;var n=q.sigBytes;var t=this.blockSize;var v=t*4;var u=n/v;if(w){u=e.ceil(u)}else{u=e.max((u|0)-this._minBufferSize,0)}var s=u*t;var r=e.min(s*4,n);if(s){for(var p=0;p<s;p+=t){this._doProcessBlock(x,p)}var o=x.splice(0,s);q.sigBytes-=r}return new l.init(o,r)},clone:function(){var n=j.clone.call(this);n._data=this._data.clone();return n},_minBufferSize:0});var f=b.Hasher=i.extend({cfg:j.extend(),init:function(n){this.cfg=this.cfg.extend(n);this.reset()},reset:function(){i.reset.call(this);this._doReset()},update:function(n){this._append(n);this._process();return this},finalize:function(n){if(n){this._append(n)}var o=this._doFinalize();return o},blockSize:512/32,_createHelper:function(n){return function(p,o){return new n.init(o).finalize(p)}},_createHmacHelper:function(n){return function(p,o){return new k.HMAC.init(n,o).finalize(p)}}});var k=a.algo={};return a}(Math));/*
CryptoJS v3.1.2 x64-core-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(g){var a=CryptoJS,f=a.lib,e=f.Base,h=f.WordArray,a=a.x64={};a.Word=e.extend({init:function(b,c){this.high=b;this.low=c}});a.WordArray=e.extend({init:function(b,c){b=this.words=b||[];this.sigBytes=c!=g?c:8*b.length},toX32:function(){for(var b=this.words,c=b.length,a=[],d=0;d<c;d++){var e=b[d];a.push(e.high);a.push(e.low)}return h.create(a,this.sigBytes)},clone:function(){for(var b=e.clone.call(this),c=b.words=this.words.slice(0),a=c.length,d=0;d<a;d++)c[d]=c[d].clone();return b}})})();
/*
CryptoJS v3.1.2 hmac-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var c=CryptoJS,k=c.enc.Utf8;c.algo.HMAC=c.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=k.parse(b));var c=a.blockSize,e=4*c;b.sigBytes>e&&(b=a.finalize(b));b.clamp();for(var f=this._oKey=b.clone(),g=this._iKey=b.clone(),h=f.words,j=g.words,d=0;d<c;d++)h[d]^=1549556828,j[d]^=909522486;f.sigBytes=g.sigBytes=e;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=
this._hasher;a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
/*
CryptoJS v3.1.2 sha256-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(k){for(var g=CryptoJS,h=g.lib,v=h.WordArray,j=h.Hasher,h=g.algo,s=[],t=[],u=function(q){return 4294967296*(q-(q|0))|0},l=2,b=0;64>b;){var d;a:{d=l;for(var w=k.sqrt(d),r=2;r<=w;r++)if(!(d%r)){d=!1;break a}d=!0}d&&(8>b&&(s[b]=u(k.pow(l,0.5))),t[b]=u(k.pow(l,1/3)),b++);l++}var n=[],h=h.SHA256=j.extend({_doReset:function(){this._hash=new v.init(s.slice(0))},_doProcessBlock:function(q,h){for(var a=this._hash.words,c=a[0],d=a[1],b=a[2],k=a[3],f=a[4],g=a[5],j=a[6],l=a[7],e=0;64>e;e++){if(16>e)n[e]=
q[h+e]|0;else{var m=n[e-15],p=n[e-2];n[e]=((m<<25|m>>>7)^(m<<14|m>>>18)^m>>>3)+n[e-7]+((p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10)+n[e-16]}m=l+((f<<26|f>>>6)^(f<<21|f>>>11)^(f<<7|f>>>25))+(f&g^~f&j)+t[e]+n[e];p=((c<<30|c>>>2)^(c<<19|c>>>13)^(c<<10|c>>>22))+(c&d^c&b^d&b);l=j;j=g;g=f;f=k+m|0;k=b;b=d;d=c;c=m+p|0}a[0]=a[0]+c|0;a[1]=a[1]+d|0;a[2]=a[2]+b|0;a[3]=a[3]+k|0;a[4]=a[4]+f|0;a[5]=a[5]+g|0;a[6]=a[6]+j|0;a[7]=a[7]+l|0},_doFinalize:function(){var d=this._data,b=d.words,a=8*this._nDataBytes,c=8*d.sigBytes;
b[c>>>5]|=128<<24-c%32;b[(c+64>>>9<<4)+14]=k.floor(a/4294967296);b[(c+64>>>9<<4)+15]=a;d.sigBytes=4*b.length;this._process();return this._hash},clone:function(){var b=j.clone.call(this);b._hash=this._hash.clone();return b}});g.SHA256=j._createHelper(h);g.HmacSHA256=j._createHmacHelper(h)})(Math);
/*
CryptoJS v3.1.2 sha224-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var b=CryptoJS,d=b.lib.WordArray,a=b.algo,c=a.SHA256,a=a.SHA224=c.extend({_doReset:function(){this._hash=new d.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var a=c._doFinalize.call(this);a.sigBytes-=4;return a}});b.SHA224=c._createHelper(a);b.HmacSHA224=c._createHmacHelper(a)})();
/*
CryptoJS v3.1.2 sha512-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){function a(){return d.create.apply(d,arguments)}for(var n=CryptoJS,r=n.lib.Hasher,e=n.x64,d=e.Word,T=e.WordArray,e=n.algo,ea=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],v=[],w=0;80>w;w++)v[w]=a();e=e.SHA512=r.extend({_doReset:function(){this._hash=new T.init([new d.init(1779033703,4089235720),new d.init(3144134277,2227873595),new d.init(1013904242,4271175723),new d.init(2773480762,1595750129),new d.init(1359893119,2917565137),new d.init(2600822924,725511199),new d.init(528734635,4215389547),new d.init(1541459225,327033209)])},_doProcessBlock:function(a,d){for(var f=this._hash.words,
F=f[0],e=f[1],n=f[2],r=f[3],G=f[4],H=f[5],I=f[6],f=f[7],w=F.high,J=F.low,X=e.high,K=e.low,Y=n.high,L=n.low,Z=r.high,M=r.low,$=G.high,N=G.low,aa=H.high,O=H.low,ba=I.high,P=I.low,ca=f.high,Q=f.low,k=w,g=J,z=X,x=K,A=Y,y=L,U=Z,B=M,l=$,h=N,R=aa,C=O,S=ba,D=P,V=ca,E=Q,m=0;80>m;m++){var s=v[m];if(16>m)var j=s.high=a[d+2*m]|0,b=s.low=a[d+2*m+1]|0;else{var j=v[m-15],b=j.high,p=j.low,j=(b>>>1|p<<31)^(b>>>8|p<<24)^b>>>7,p=(p>>>1|b<<31)^(p>>>8|b<<24)^(p>>>7|b<<25),u=v[m-2],b=u.high,c=u.low,u=(b>>>19|c<<13)^(b<<
3|c>>>29)^b>>>6,c=(c>>>19|b<<13)^(c<<3|b>>>29)^(c>>>6|b<<26),b=v[m-7],W=b.high,t=v[m-16],q=t.high,t=t.low,b=p+b.low,j=j+W+(b>>>0<p>>>0?1:0),b=b+c,j=j+u+(b>>>0<c>>>0?1:0),b=b+t,j=j+q+(b>>>0<t>>>0?1:0);s.high=j;s.low=b}var W=l&R^~l&S,t=h&C^~h&D,s=k&z^k&A^z&A,T=g&x^g&y^x&y,p=(k>>>28|g<<4)^(k<<30|g>>>2)^(k<<25|g>>>7),u=(g>>>28|k<<4)^(g<<30|k>>>2)^(g<<25|k>>>7),c=ea[m],fa=c.high,da=c.low,c=E+((h>>>14|l<<18)^(h>>>18|l<<14)^(h<<23|l>>>9)),q=V+((l>>>14|h<<18)^(l>>>18|h<<14)^(l<<23|h>>>9))+(c>>>0<E>>>0?1:
0),c=c+t,q=q+W+(c>>>0<t>>>0?1:0),c=c+da,q=q+fa+(c>>>0<da>>>0?1:0),c=c+b,q=q+j+(c>>>0<b>>>0?1:0),b=u+T,s=p+s+(b>>>0<u>>>0?1:0),V=S,E=D,S=R,D=C,R=l,C=h,h=B+c|0,l=U+q+(h>>>0<B>>>0?1:0)|0,U=A,B=y,A=z,y=x,z=k,x=g,g=c+b|0,k=q+s+(g>>>0<c>>>0?1:0)|0}J=F.low=J+g;F.high=w+k+(J>>>0<g>>>0?1:0);K=e.low=K+x;e.high=X+z+(K>>>0<x>>>0?1:0);L=n.low=L+y;n.high=Y+A+(L>>>0<y>>>0?1:0);M=r.low=M+B;r.high=Z+U+(M>>>0<B>>>0?1:0);N=G.low=N+h;G.high=$+l+(N>>>0<h>>>0?1:0);O=H.low=O+C;H.high=aa+R+(O>>>0<C>>>0?1:0);P=I.low=P+D;
I.high=ba+S+(P>>>0<D>>>0?1:0);Q=f.low=Q+E;f.high=ca+V+(Q>>>0<E>>>0?1:0)},_doFinalize:function(){var a=this._data,d=a.words,f=8*this._nDataBytes,e=8*a.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+128>>>10<<5)+30]=Math.floor(f/4294967296);d[(e+128>>>10<<5)+31]=f;a.sigBytes=4*d.length;this._process();return this._hash.toX32()},clone:function(){var a=r.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});n.SHA512=r._createHelper(e);n.HmacSHA512=r._createHmacHelper(e)})();
/*
CryptoJS v3.1.2 sha384-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var c=CryptoJS,a=c.x64,b=a.Word,e=a.WordArray,a=c.algo,d=a.SHA512,a=a.SHA384=d.extend({_doReset:function(){this._hash=new e.init([new b.init(3418070365,3238371032),new b.init(1654270250,914150663),new b.init(2438529370,812702999),new b.init(355462360,4144912697),new b.init(1731405415,4290775857),new b.init(2394180231,1750603025),new b.init(3675008525,1694076839),new b.init(1203062813,3204075428)])},_doFinalize:function(){var a=d._doFinalize.call(this);a.sigBytes-=16;return a}});c.SHA384=
d._createHelper(a);c.HmacSHA384=d._createHmacHelper(a)})();
/*
CryptoJS v3.1.2 md5-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(E){function h(a,f,g,j,p,h,k){a=a+(f&g|~f&j)+p+k;return(a<<h|a>>>32-h)+f}function k(a,f,g,j,p,h,k){a=a+(f&j|g&~j)+p+k;return(a<<h|a>>>32-h)+f}function l(a,f,g,j,h,k,l){a=a+(f^g^j)+h+l;return(a<<k|a>>>32-k)+f}function n(a,f,g,j,h,k,l){a=a+(g^(f|~j))+h+l;return(a<<k|a>>>32-k)+f}for(var r=CryptoJS,q=r.lib,F=q.WordArray,s=q.Hasher,q=r.algo,a=[],t=0;64>t;t++)a[t]=4294967296*E.abs(E.sin(t+1))|0;q=q.MD5=s.extend({_doReset:function(){this._hash=new F.init([1732584193,4023233417,2562383102,271733878])},
_doProcessBlock:function(m,f){for(var g=0;16>g;g++){var j=f+g,p=m[j];m[j]=(p<<8|p>>>24)&16711935|(p<<24|p>>>8)&4278255360}var g=this._hash.words,j=m[f+0],p=m[f+1],q=m[f+2],r=m[f+3],s=m[f+4],t=m[f+5],u=m[f+6],v=m[f+7],w=m[f+8],x=m[f+9],y=m[f+10],z=m[f+11],A=m[f+12],B=m[f+13],C=m[f+14],D=m[f+15],b=g[0],c=g[1],d=g[2],e=g[3],b=h(b,c,d,e,j,7,a[0]),e=h(e,b,c,d,p,12,a[1]),d=h(d,e,b,c,q,17,a[2]),c=h(c,d,e,b,r,22,a[3]),b=h(b,c,d,e,s,7,a[4]),e=h(e,b,c,d,t,12,a[5]),d=h(d,e,b,c,u,17,a[6]),c=h(c,d,e,b,v,22,a[7]),
b=h(b,c,d,e,w,7,a[8]),e=h(e,b,c,d,x,12,a[9]),d=h(d,e,b,c,y,17,a[10]),c=h(c,d,e,b,z,22,a[11]),b=h(b,c,d,e,A,7,a[12]),e=h(e,b,c,d,B,12,a[13]),d=h(d,e,b,c,C,17,a[14]),c=h(c,d,e,b,D,22,a[15]),b=k(b,c,d,e,p,5,a[16]),e=k(e,b,c,d,u,9,a[17]),d=k(d,e,b,c,z,14,a[18]),c=k(c,d,e,b,j,20,a[19]),b=k(b,c,d,e,t,5,a[20]),e=k(e,b,c,d,y,9,a[21]),d=k(d,e,b,c,D,14,a[22]),c=k(c,d,e,b,s,20,a[23]),b=k(b,c,d,e,x,5,a[24]),e=k(e,b,c,d,C,9,a[25]),d=k(d,e,b,c,r,14,a[26]),c=k(c,d,e,b,w,20,a[27]),b=k(b,c,d,e,B,5,a[28]),e=k(e,b,
c,d,q,9,a[29]),d=k(d,e,b,c,v,14,a[30]),c=k(c,d,e,b,A,20,a[31]),b=l(b,c,d,e,t,4,a[32]),e=l(e,b,c,d,w,11,a[33]),d=l(d,e,b,c,z,16,a[34]),c=l(c,d,e,b,C,23,a[35]),b=l(b,c,d,e,p,4,a[36]),e=l(e,b,c,d,s,11,a[37]),d=l(d,e,b,c,v,16,a[38]),c=l(c,d,e,b,y,23,a[39]),b=l(b,c,d,e,B,4,a[40]),e=l(e,b,c,d,j,11,a[41]),d=l(d,e,b,c,r,16,a[42]),c=l(c,d,e,b,u,23,a[43]),b=l(b,c,d,e,x,4,a[44]),e=l(e,b,c,d,A,11,a[45]),d=l(d,e,b,c,D,16,a[46]),c=l(c,d,e,b,q,23,a[47]),b=n(b,c,d,e,j,6,a[48]),e=n(e,b,c,d,v,10,a[49]),d=n(d,e,b,c,
C,15,a[50]),c=n(c,d,e,b,t,21,a[51]),b=n(b,c,d,e,A,6,a[52]),e=n(e,b,c,d,r,10,a[53]),d=n(d,e,b,c,y,15,a[54]),c=n(c,d,e,b,p,21,a[55]),b=n(b,c,d,e,w,6,a[56]),e=n(e,b,c,d,D,10,a[57]),d=n(d,e,b,c,u,15,a[58]),c=n(c,d,e,b,B,21,a[59]),b=n(b,c,d,e,s,6,a[60]),e=n(e,b,c,d,z,10,a[61]),d=n(d,e,b,c,q,15,a[62]),c=n(c,d,e,b,x,21,a[63]);g[0]=g[0]+b|0;g[1]=g[1]+c|0;g[2]=g[2]+d|0;g[3]=g[3]+e|0},_doFinalize:function(){var a=this._data,f=a.words,g=8*this._nDataBytes,j=8*a.sigBytes;f[j>>>5]|=128<<24-j%32;var h=E.floor(g/
4294967296);f[(j+64>>>9<<4)+15]=(h<<8|h>>>24)&16711935|(h<<24|h>>>8)&4278255360;f[(j+64>>>9<<4)+14]=(g<<8|g>>>24)&16711935|(g<<24|g>>>8)&4278255360;a.sigBytes=4*(f.length+1);this._process();a=this._hash;f=a.words;for(g=0;4>g;g++)j=f[g],f[g]=(j<<8|j>>>24)&16711935|(j<<24|j>>>8)&4278255360;return a},clone:function(){var a=s.clone.call(this);a._hash=this._hash.clone();return a}});r.MD5=s._createHelper(q);r.HmacMD5=s._createHmacHelper(q)})(Math);
/*
CryptoJS v3.1.2 enc-base64-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d<
e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
/*
CryptoJS v3.1.2 cipher-core-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
CryptoJS.lib.Cipher||function(u){var g=CryptoJS,f=g.lib,k=f.Base,l=f.WordArray,q=f.BufferedBlockAlgorithm,r=g.enc.Base64,v=g.algo.EvpKDF,n=f.Cipher=q.extend({cfg:k.extend(),createEncryptor:function(a,b){return this.create(this._ENC_XFORM_MODE,a,b)},createDecryptor:function(a,b){return this.create(this._DEC_XFORM_MODE,a,b)},init:function(a,b,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=b;this.reset()},reset:function(){q.reset.call(this);this._doReset()},process:function(a){this._append(a);
return this._process()},finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(b,c,d){return("string"==typeof c?s:j).encrypt(a,b,c,d)},decrypt:function(b,c,d){return("string"==typeof c?s:j).decrypt(a,b,c,d)}}}});f.StreamCipher=n.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var m=g.mode={},t=function(a,b,c){var d=this._iv;d?this._iv=u:d=this._prevBlock;for(var e=
0;e<c;e++)a[b+e]^=d[e]},h=(f.BlockCipherMode=k.extend({createEncryptor:function(a,b){return this.Encryptor.create(a,b)},createDecryptor:function(a,b){return this.Decryptor.create(a,b)},init:function(a,b){this._cipher=a;this._iv=b}})).extend();h.Encryptor=h.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize;t.call(this,a,b,d);c.encryptBlock(a,b);this._prevBlock=a.slice(b,b+d)}});h.Decryptor=h.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize,e=a.slice(b,b+d);c.decryptBlock(a,
b);t.call(this,a,b,d);this._prevBlock=e}});m=m.CBC=h;h=(g.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,e=[],f=0;f<c;f+=4)e.push(d);c=l.create(e,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};f.BlockCipher=n.extend({cfg:n.cfg.extend({mode:m,padding:h}),reset:function(){n.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;
this._mode=c.call(a,this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var p=f.CipherParams=k.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),m=(g.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;
return(a?l.create([1398893684,1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=l.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return p.create({ciphertext:a,salt:c})}},j=f.SerializableCipher=k.extend({cfg:k.extend({format:m}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return p.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,
blockSize:a.blockSize,formatter:d.format})},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),g=(g.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=l.random(8));a=v.create({keySize:b+c}).compute(a,d);c=l.create(a.words.slice(b),4*c);a.sigBytes=4*b;return p.create({key:a,iv:c,salt:d})}},s=f.PasswordBasedCipher=j.extend({cfg:j.cfg.extend({kdf:g}),encrypt:function(a,
b,c,d){d=this.cfg.extend(d);c=d.kdf.execute(c,a.keySize,a.ivSize);d.iv=c.iv;a=j.encrypt.call(this,a,b,c.key,d);a.mixIn(c);return a},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);c=d.kdf.execute(c,a.keySize,a.ivSize,b.salt);d.iv=c.iv;return j.decrypt.call(this,a,b,c.key,d)}})}();
/*
CryptoJS v3.1.2 aes-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){for(var q=CryptoJS,x=q.lib.BlockCipher,r=q.algo,j=[],y=[],z=[],A=[],B=[],C=[],s=[],u=[],v=[],w=[],g=[],k=0;256>k;k++)g[k]=128>k?k<<1:k<<1^283;for(var n=0,l=0,k=0;256>k;k++){var f=l^l<<1^l<<2^l<<3^l<<4,f=f>>>8^f&255^99;j[n]=f;y[f]=n;var t=g[n],D=g[t],E=g[D],b=257*g[f]^16843008*f;z[n]=b<<24|b>>>8;A[n]=b<<16|b>>>16;B[n]=b<<8|b>>>24;C[n]=b;b=16843009*E^65537*D^257*t^16843008*n;s[f]=b<<24|b>>>8;u[f]=b<<16|b>>>16;v[f]=b<<8|b>>>24;w[f]=b;n?(n=t^g[g[g[E^t]]],l^=g[g[l]]):n=l=1}var F=[0,1,2,4,8,
16,32,64,128,27,54],r=r.AES=x.extend({_doReset:function(){for(var c=this._key,e=c.words,a=c.sigBytes/4,c=4*((this._nRounds=a+6)+1),b=this._keySchedule=[],h=0;h<c;h++)if(h<a)b[h]=e[h];else{var d=b[h-1];h%a?6<a&&4==h%a&&(d=j[d>>>24]<<24|j[d>>>16&255]<<16|j[d>>>8&255]<<8|j[d&255]):(d=d<<8|d>>>24,d=j[d>>>24]<<24|j[d>>>16&255]<<16|j[d>>>8&255]<<8|j[d&255],d^=F[h/a|0]<<24);b[h]=b[h-a]^d}e=this._invKeySchedule=[];for(a=0;a<c;a++)h=c-a,d=a%4?b[h]:b[h-4],e[a]=4>a||4>=h?d:s[j[d>>>24]]^u[j[d>>>16&255]]^v[j[d>>>
8&255]]^w[j[d&255]]},encryptBlock:function(c,e){this._doCryptBlock(c,e,this._keySchedule,z,A,B,C,j)},decryptBlock:function(c,e){var a=c[e+1];c[e+1]=c[e+3];c[e+3]=a;this._doCryptBlock(c,e,this._invKeySchedule,s,u,v,w,y);a=c[e+1];c[e+1]=c[e+3];c[e+3]=a},_doCryptBlock:function(c,e,a,b,h,d,j,m){for(var n=this._nRounds,f=c[e]^a[0],g=c[e+1]^a[1],k=c[e+2]^a[2],p=c[e+3]^a[3],l=4,t=1;t<n;t++)var q=b[f>>>24]^h[g>>>16&255]^d[k>>>8&255]^j[p&255]^a[l++],r=b[g>>>24]^h[k>>>16&255]^d[p>>>8&255]^j[f&255]^a[l++],s=
b[k>>>24]^h[p>>>16&255]^d[f>>>8&255]^j[g&255]^a[l++],p=b[p>>>24]^h[f>>>16&255]^d[g>>>8&255]^j[k&255]^a[l++],f=q,g=r,k=s;q=(m[f>>>24]<<24|m[g>>>16&255]<<16|m[k>>>8&255]<<8|m[p&255])^a[l++];r=(m[g>>>24]<<24|m[k>>>16&255]<<16|m[p>>>8&255]<<8|m[f&255])^a[l++];s=(m[k>>>24]<<24|m[p>>>16&255]<<16|m[f>>>8&255]<<8|m[g&255])^a[l++];p=(m[p>>>24]<<24|m[f>>>16&255]<<16|m[g>>>8&255]<<8|m[k&255])^a[l++];c[e]=q;c[e+1]=r;c[e+2]=s;c[e+3]=p},keySize:8});q.AES=x._createHelper(r)})();
/*
CryptoJS v3.1.2 tripledes-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){function j(b,c){var a=(this._lBlock>>>b^this._rBlock)&c;this._rBlock^=a;this._lBlock^=a<<b}function l(b,c){var a=(this._rBlock>>>b^this._lBlock)&c;this._lBlock^=a;this._rBlock^=a<<b}var h=CryptoJS,e=h.lib,n=e.WordArray,e=e.BlockCipher,g=h.algo,q=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],p=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,
55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],r=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],s=[{"0":8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,
2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,
1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{"0":1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,
75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,
276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{"0":260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,
14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,
17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{"0":2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,
98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,
1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{"0":128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,
10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,
83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{"0":268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,
2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{"0":1048576,
16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,
496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{"0":134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,
2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,
2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],t=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],m=g.DES=e.extend({_doReset:function(){for(var b=this._key.words,c=[],a=0;56>a;a++){var f=q[a]-1;c[a]=b[f>>>5]>>>31-f%32&1}b=this._subKeys=[];for(f=0;16>f;f++){for(var d=b[f]=[],e=r[f],a=0;24>a;a++)d[a/6|0]|=c[(p[a]-1+e)%28]<<31-a%6,d[4+(a/6|0)]|=c[28+(p[a+24]-1+e)%28]<<31-a%6;d[0]=d[0]<<1|d[0]>>>31;for(a=1;7>a;a++)d[a]>>>=
4*(a-1)+3;d[7]=d[7]<<5|d[7]>>>27}c=this._invSubKeys=[];for(a=0;16>a;a++)c[a]=b[15-a]},encryptBlock:function(b,c){this._doCryptBlock(b,c,this._subKeys)},decryptBlock:function(b,c){this._doCryptBlock(b,c,this._invSubKeys)},_doCryptBlock:function(b,c,a){this._lBlock=b[c];this._rBlock=b[c+1];j.call(this,4,252645135);j.call(this,16,65535);l.call(this,2,858993459);l.call(this,8,16711935);j.call(this,1,1431655765);for(var f=0;16>f;f++){for(var d=a[f],e=this._lBlock,h=this._rBlock,g=0,k=0;8>k;k++)g|=s[k][((h^
d[k])&t[k])>>>0];this._lBlock=h;this._rBlock=e^g}a=this._lBlock;this._lBlock=this._rBlock;this._rBlock=a;j.call(this,1,1431655765);l.call(this,8,16711935);l.call(this,2,858993459);j.call(this,16,65535);j.call(this,4,252645135);b[c]=this._lBlock;b[c+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});h.DES=e._createHelper(m);g=g.TripleDES=e.extend({_doReset:function(){var b=this._key.words;this._des1=m.createEncryptor(n.create(b.slice(0,2)));this._des2=m.createEncryptor(n.create(b.slice(2,4)));this._des3=
m.createEncryptor(n.create(b.slice(4,6)))},encryptBlock:function(b,c){this._des1.encryptBlock(b,c);this._des2.decryptBlock(b,c);this._des3.encryptBlock(b,c)},decryptBlock:function(b,c){this._des3.decryptBlock(b,c);this._des2.encryptBlock(b,c);this._des1.decryptBlock(b,c)},keySize:6,ivSize:2,blockSize:2});h.TripleDES=e._createHelper(g)})();
/*
CryptoJS v3.1.2 sha1-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var k=CryptoJS,b=k.lib,m=b.WordArray,l=b.Hasher,d=[],b=k.algo.SHA1=l.extend({_doReset:function(){this._hash=new m.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(n,p){for(var a=this._hash.words,e=a[0],f=a[1],h=a[2],j=a[3],b=a[4],c=0;80>c;c++){if(16>c)d[c]=n[p+c]|0;else{var g=d[c-3]^d[c-8]^d[c-14]^d[c-16];d[c]=g<<1|g>>>31}g=(e<<5|e>>>27)+b+d[c];g=20>c?g+((f&h|~f&j)+1518500249):40>c?g+((f^h^j)+1859775393):60>c?g+((f&h|f&j|h&j)-1894007588):g+((f^h^
j)-899497514);b=j;j=h;h=f<<30|f>>>2;f=e;e=g}a[0]=a[0]+e|0;a[1]=a[1]+f|0;a[2]=a[2]+h|0;a[3]=a[3]+j|0;a[4]=a[4]+b|0},_doFinalize:function(){var b=this._data,d=b.words,a=8*this._nDataBytes,e=8*b.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=Math.floor(a/4294967296);d[(e+64>>>9<<4)+15]=a;b.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var b=l.clone.call(this);b._hash=this._hash.clone();return b}});k.SHA1=l._createHelper(b);k.HmacSHA1=l._createHmacHelper(b)})();
/*
CryptoJS v3.1.2 ripemd160-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
/*
(c) 2012 by Cedric Mesnil. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function(){var q=CryptoJS,d=q.lib,n=d.WordArray,p=d.Hasher,d=q.algo,x=n.create([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]),y=n.create([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]),z=n.create([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]),A=n.create([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]),B=n.create([0,1518500249,1859775393,2400959708,2840853838]),C=n.create([1352829926,1548603684,1836072691,
2053994217,0]),d=d.RIPEMD160=p.extend({_doReset:function(){this._hash=n.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,v){for(var b=0;16>b;b++){var c=v+b,f=e[c];e[c]=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360}var c=this._hash.words,f=B.words,d=C.words,n=x.words,q=y.words,p=z.words,w=A.words,t,g,h,j,r,u,k,l,m,s;u=t=c[0];k=g=c[1];l=h=c[2];m=j=c[3];s=r=c[4];for(var a,b=0;80>b;b+=1)a=t+e[v+n[b]]|0,a=16>b?a+((g^h^j)+f[0]):32>b?a+((g&h|~g&j)+f[1]):48>b?
a+(((g|~h)^j)+f[2]):64>b?a+((g&j|h&~j)+f[3]):a+((g^(h|~j))+f[4]),a|=0,a=a<<p[b]|a>>>32-p[b],a=a+r|0,t=r,r=j,j=h<<10|h>>>22,h=g,g=a,a=u+e[v+q[b]]|0,a=16>b?a+((k^(l|~m))+d[0]):32>b?a+((k&m|l&~m)+d[1]):48>b?a+(((k|~l)^m)+d[2]):64>b?a+((k&l|~k&m)+d[3]):a+((k^l^m)+d[4]),a|=0,a=a<<w[b]|a>>>32-w[b],a=a+s|0,u=s,s=m,m=l<<10|l>>>22,l=k,k=a;a=c[1]+h+m|0;c[1]=c[2]+j+s|0;c[2]=c[3]+r+u|0;c[3]=c[4]+t+k|0;c[4]=c[0]+g+l|0;c[0]=a},_doFinalize:function(){var e=this._data,d=e.words,b=8*this._nDataBytes,c=8*e.sigBytes;
d[c>>>5]|=128<<24-c%32;d[(c+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;e.sigBytes=4*(d.length+1);this._process();e=this._hash;d=e.words;for(b=0;5>b;b++)c=d[b],d[b]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return e},clone:function(){var d=p.clone.call(this);d._hash=this._hash.clone();return d}});q.RIPEMD160=p._createHelper(d);q.HmacRIPEMD160=p._createHmacHelper(d)})(Math);
/*
CryptoJS v3.1.2 pbkdf2-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function(){var b=CryptoJS,a=b.lib,d=a.Base,m=a.WordArray,a=b.algo,q=a.HMAC,l=a.PBKDF2=d.extend({cfg:d.extend({keySize:4,hasher:a.SHA1,iterations:1}),init:function(a){this.cfg=this.cfg.extend(a)},compute:function(a,b){for(var c=this.cfg,f=q.create(c.hasher,a),g=m.create(),d=m.create([1]),l=g.words,r=d.words,n=c.keySize,c=c.iterations;l.length<n;){var h=f.update(b).finalize(d);f.reset();for(var j=h.words,s=j.length,k=h,p=1;p<c;p++){k=f.finalize(k);f.reset();for(var t=k.words,e=0;e<s;e++)j[e]^=t[e]}g.concat(h);
r[0]++}g.sigBytes=4*n;return g}});b.PBKDF2=function(a,b,c){return l.create(c).compute(a,b)}})();
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64pad="=";function hex2b64(d){var b;var e;var a="";for(b=0;b+3<=d.length;b+=3){e=parseInt(d.substring(b,b+3),16);a+=b64map.charAt(e>>6)+b64map.charAt(e&63)}if(b+1==d.length){e=parseInt(d.substring(b,b+1),16);a+=b64map.charAt(e<<2)}else{if(b+2==d.length){e=parseInt(d.substring(b,b+2),16);a+=b64map.charAt(e>>2)+b64map.charAt((e&3)<<4)}}if(b64pad){while((a.length&3)>0){a+=b64pad}}return a}function b64tohex(f){var d="";var e;var b=0;var c;var a;for(e=0;e<f.length;++e){if(f.charAt(e)==b64pad){break}a=b64map.indexOf(f.charAt(e));if(a<0){continue}if(b==0){d+=int2char(a>>2);c=a&3;b=1}else{if(b==1){d+=int2char((c<<2)|(a>>4));c=a&15;b=2}else{if(b==2){d+=int2char(c);d+=int2char(a>>2);c=a&3;b=3}else{d+=int2char((c<<2)|(a>>4));d+=int2char(a&15);b=0}}}}if(b==1){d+=int2char(c<<2)}return d}function b64toBA(e){var d=b64tohex(e);var c;var b=new Array();for(c=0;2*c<d.length;++c){b[c]=parseInt(d.substring(2*c,2*c+2),16)}return b};
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
var dbits;var canary=244837814094590;var j_lm=((canary&16777215)==15715070);function BigInteger(e,d,f){if(e!=null){if("number"==typeof e){this.fromNumber(e,d,f)}else{if(d==null&&"string"!=typeof e){this.fromString(e,256)}else{this.fromString(e,d)}}}}function nbi(){return new BigInteger(null)}function am1(f,a,b,e,h,g){while(--g>=0){var d=a*this[f++]+b[e]+h;h=Math.floor(d/67108864);b[e++]=d&67108863}return h}function am2(f,q,r,e,o,a){var k=q&32767,p=q>>15;while(--a>=0){var d=this[f]&32767;var g=this[f++]>>15;var b=p*d+g*k;d=k*d+((b&32767)<<15)+r[e]+(o&1073741823);o=(d>>>30)+(b>>>15)+p*g+(o>>>30);r[e++]=d&1073741823}return o}function am3(f,q,r,e,o,a){var k=q&16383,p=q>>14;while(--a>=0){var d=this[f]&16383;var g=this[f++]>>14;var b=p*d+g*k;d=k*d+((b&16383)<<14)+r[e]+o;o=(d>>28)+(b>>14)+p*g;r[e++]=d&268435455}return o}if(j_lm&&(navigator.appName=="Microsoft Internet Explorer")){BigInteger.prototype.am=am2;dbits=30}else{if(j_lm&&(navigator.appName!="Netscape")){BigInteger.prototype.am=am1;dbits=26}else{BigInteger.prototype.am=am3;dbits=28}}BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=((1<<dbits)-1);BigInteger.prototype.DV=(1<<dbits);var BI_FP=52;BigInteger.prototype.FV=Math.pow(2,BI_FP);BigInteger.prototype.F1=BI_FP-dbits;BigInteger.prototype.F2=2*dbits-BI_FP;var BI_RM="0123456789abcdefghijklmnopqrstuvwxyz";var BI_RC=new Array();var rr,vv;rr="0".charCodeAt(0);for(vv=0;vv<=9;++vv){BI_RC[rr++]=vv}rr="a".charCodeAt(0);for(vv=10;vv<36;++vv){BI_RC[rr++]=vv}rr="A".charCodeAt(0);for(vv=10;vv<36;++vv){BI_RC[rr++]=vv}function int2char(a){return BI_RM.charAt(a)}function intAt(b,a){var d=BI_RC[b.charCodeAt(a)];return(d==null)?-1:d}function bnpCopyTo(b){for(var a=this.t-1;a>=0;--a){b[a]=this[a]}b.t=this.t;b.s=this.s}function bnpFromInt(a){this.t=1;this.s=(a<0)?-1:0;if(a>0){this[0]=a}else{if(a<-1){this[0]=a+this.DV}else{this.t=0}}}function nbv(a){var b=nbi();b.fromInt(a);return b}function bnpFromString(h,c){var e;if(c==16){e=4}else{if(c==8){e=3}else{if(c==256){e=8}else{if(c==2){e=1}else{if(c==32){e=5}else{if(c==4){e=2}else{this.fromRadix(h,c);return}}}}}}this.t=0;this.s=0;var g=h.length,d=false,f=0;while(--g>=0){var a=(e==8)?h[g]&255:intAt(h,g);if(a<0){if(h.charAt(g)=="-"){d=true}continue}d=false;if(f==0){this[this.t++]=a}else{if(f+e>this.DB){this[this.t-1]|=(a&((1<<(this.DB-f))-1))<<f;this[this.t++]=(a>>(this.DB-f))}else{this[this.t-1]|=a<<f}}f+=e;if(f>=this.DB){f-=this.DB}}if(e==8&&(h[0]&128)!=0){this.s=-1;if(f>0){this[this.t-1]|=((1<<(this.DB-f))-1)<<f}}this.clamp();if(d){BigInteger.ZERO.subTo(this,this)}}function bnpClamp(){var a=this.s&this.DM;while(this.t>0&&this[this.t-1]==a){--this.t}}function bnToString(c){if(this.s<0){return"-"+this.negate().toString(c)}var e;if(c==16){e=4}else{if(c==8){e=3}else{if(c==2){e=1}else{if(c==32){e=5}else{if(c==4){e=2}else{return this.toRadix(c)}}}}}var g=(1<<e)-1,l,a=false,h="",f=this.t;var j=this.DB-(f*this.DB)%e;if(f-->0){if(j<this.DB&&(l=this[f]>>j)>0){a=true;h=int2char(l)}while(f>=0){if(j<e){l=(this[f]&((1<<j)-1))<<(e-j);l|=this[--f]>>(j+=this.DB-e)}else{l=(this[f]>>(j-=e))&g;if(j<=0){j+=this.DB;--f}}if(l>0){a=true}if(a){h+=int2char(l)}}}return a?h:"0"}function bnNegate(){var a=nbi();BigInteger.ZERO.subTo(this,a);return a}function bnAbs(){return(this.s<0)?this.negate():this}function bnCompareTo(b){var d=this.s-b.s;if(d!=0){return d}var c=this.t;d=c-b.t;if(d!=0){return(this.s<0)?-d:d}while(--c>=0){if((d=this[c]-b[c])!=0){return d}}return 0}function nbits(a){var c=1,b;if((b=a>>>16)!=0){a=b;c+=16}if((b=a>>8)!=0){a=b;c+=8}if((b=a>>4)!=0){a=b;c+=4}if((b=a>>2)!=0){a=b;c+=2}if((b=a>>1)!=0){a=b;c+=1}return c}function bnBitLength(){if(this.t<=0){return 0}return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM))}function bnpDLShiftTo(c,b){var a;for(a=this.t-1;a>=0;--a){b[a+c]=this[a]}for(a=c-1;a>=0;--a){b[a]=0}b.t=this.t+c;b.s=this.s}function bnpDRShiftTo(c,b){for(var a=c;a<this.t;++a){b[a-c]=this[a]}b.t=Math.max(this.t-c,0);b.s=this.s}function bnpLShiftTo(j,e){var b=j%this.DB;var a=this.DB-b;var g=(1<<a)-1;var f=Math.floor(j/this.DB),h=(this.s<<b)&this.DM,d;for(d=this.t-1;d>=0;--d){e[d+f+1]=(this[d]>>a)|h;h=(this[d]&g)<<b}for(d=f-1;d>=0;--d){e[d]=0}e[f]=h;e.t=this.t+f+1;e.s=this.s;e.clamp()}function bnpRShiftTo(g,d){d.s=this.s;var e=Math.floor(g/this.DB);if(e>=this.t){d.t=0;return}var b=g%this.DB;var a=this.DB-b;var f=(1<<b)-1;d[0]=this[e]>>b;for(var c=e+1;c<this.t;++c){d[c-e-1]|=(this[c]&f)<<a;d[c-e]=this[c]>>b}if(b>0){d[this.t-e-1]|=(this.s&f)<<a}d.t=this.t-e;d.clamp()}function bnpSubTo(d,f){var e=0,g=0,b=Math.min(d.t,this.t);while(e<b){g+=this[e]-d[e];f[e++]=g&this.DM;g>>=this.DB}if(d.t<this.t){g-=d.s;while(e<this.t){g+=this[e];f[e++]=g&this.DM;g>>=this.DB}g+=this.s}else{g+=this.s;while(e<d.t){g-=d[e];f[e++]=g&this.DM;g>>=this.DB}g-=d.s}f.s=(g<0)?-1:0;if(g<-1){f[e++]=this.DV+g}else{if(g>0){f[e++]=g}}f.t=e;f.clamp()}function bnpMultiplyTo(c,e){var b=this.abs(),f=c.abs();var d=b.t;e.t=d+f.t;while(--d>=0){e[d]=0}for(d=0;d<f.t;++d){e[d+b.t]=b.am(0,f[d],e,d,0,b.t)}e.s=0;e.clamp();if(this.s!=c.s){BigInteger.ZERO.subTo(e,e)}}function bnpSquareTo(d){var a=this.abs();var b=d.t=2*a.t;while(--b>=0){d[b]=0}for(b=0;b<a.t-1;++b){var e=a.am(b,a[b],d,2*b,0,1);if((d[b+a.t]+=a.am(b+1,2*a[b],d,2*b+1,e,a.t-b-1))>=a.DV){d[b+a.t]-=a.DV;d[b+a.t+1]=1}}if(d.t>0){d[d.t-1]+=a.am(b,a[b],d,2*b,0,1)}d.s=0;d.clamp()}function bnpDivRemTo(n,h,g){var w=n.abs();if(w.t<=0){return}var k=this.abs();if(k.t<w.t){if(h!=null){h.fromInt(0)}if(g!=null){this.copyTo(g)}return}if(g==null){g=nbi()}var d=nbi(),a=this.s,l=n.s;var v=this.DB-nbits(w[w.t-1]);if(v>0){w.lShiftTo(v,d);k.lShiftTo(v,g)}else{w.copyTo(d);k.copyTo(g)}var p=d.t;var b=d[p-1];if(b==0){return}var o=b*(1<<this.F1)+((p>1)?d[p-2]>>this.F2:0);var A=this.FV/o,z=(1<<this.F1)/o,x=1<<this.F2;var u=g.t,s=u-p,f=(h==null)?nbi():h;d.dlShiftTo(s,f);if(g.compareTo(f)>=0){g[g.t++]=1;g.subTo(f,g)}BigInteger.ONE.dlShiftTo(p,f);f.subTo(d,d);while(d.t<p){d[d.t++]=0}while(--s>=0){var c=(g[--u]==b)?this.DM:Math.floor(g[u]*A+(g[u-1]+x)*z);if((g[u]+=d.am(0,c,g,s,0,p))<c){d.dlShiftTo(s,f);g.subTo(f,g);while(g[u]<--c){g.subTo(f,g)}}}if(h!=null){g.drShiftTo(p,h);if(a!=l){BigInteger.ZERO.subTo(h,h)}}g.t=p;g.clamp();if(v>0){g.rShiftTo(v,g)}if(a<0){BigInteger.ZERO.subTo(g,g)}}function bnMod(b){var c=nbi();this.abs().divRemTo(b,null,c);if(this.s<0&&c.compareTo(BigInteger.ZERO)>0){b.subTo(c,c)}return c}function Classic(a){this.m=a}function cConvert(a){if(a.s<0||a.compareTo(this.m)>=0){return a.mod(this.m)}else{return a}}function cRevert(a){return a}function cReduce(a){a.divRemTo(this.m,null,a)}function cMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}function cSqrTo(a,b){a.squareTo(b);this.reduce(b)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1){return 0}var a=this[0];if((a&1)==0){return 0}var b=a&3;b=(b*(2-(a&15)*b))&15;b=(b*(2-(a&255)*b))&255;b=(b*(2-(((a&65535)*b)&65535)))&65535;b=(b*(2-a*b%this.DV))%this.DV;return(b>0)?this.DV-b:-b}function Montgomery(a){this.m=a;this.mp=a.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<(a.DB-15))-1;this.mt2=2*a.t}function montConvert(a){var b=nbi();a.abs().dlShiftTo(this.m.t,b);b.divRemTo(this.m,null,b);if(a.s<0&&b.compareTo(BigInteger.ZERO)>0){this.m.subTo(b,b)}return b}function montRevert(a){var b=nbi();a.copyTo(b);this.reduce(b);return b}function montReduce(a){while(a.t<=this.mt2){a[a.t++]=0}for(var c=0;c<this.m.t;++c){var b=a[c]&32767;var d=(b*this.mpl+(((b*this.mph+(a[c]>>15)*this.mpl)&this.um)<<15))&a.DM;b=c+this.m.t;a[b]+=this.m.am(0,d,a,c,0,this.m.t);while(a[b]>=a.DV){a[b]-=a.DV;a[++b]++}}a.clamp();a.drShiftTo(this.m.t,a);if(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function montSqrTo(a,b){a.squareTo(b);this.reduce(b)}function montMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)?(this[0]&1):this.s)==0}function bnpExp(h,j){if(h>4294967295||h<1){return BigInteger.ONE}var f=nbi(),a=nbi(),d=j.convert(this),c=nbits(h)-1;d.copyTo(f);while(--c>=0){j.sqrTo(f,a);if((h&(1<<c))>0){j.mulTo(a,d,f)}else{var b=f;f=a;a=b}}return j.revert(f)}function bnModPowInt(b,a){var c;if(b<256||a.isEven()){c=new Classic(a)}else{c=new Montgomery(a)}return this.exp(b,c)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function bnClone(){var a=nbi();this.copyTo(a);return a}function bnIntValue(){if(this.s<0){if(this.t==1){return this[0]-this.DV}else{if(this.t==0){return -1}}}else{if(this.t==1){return this[0]}else{if(this.t==0){return 0}}}return((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0]}function bnByteValue(){return(this.t==0)?this.s:(this[0]<<24)>>24}function bnShortValue(){return(this.t==0)?this.s:(this[0]<<16)>>16}function bnpChunkSize(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function bnSigNum(){if(this.s<0){return -1}else{if(this.t<=0||(this.t==1&&this[0]<=0)){return 0}else{return 1}}}function bnpToRadix(c){if(c==null){c=10}if(this.signum()==0||c<2||c>36){return"0"}var f=this.chunkSize(c);var e=Math.pow(c,f);var i=nbv(e),j=nbi(),h=nbi(),g="";this.divRemTo(i,j,h);while(j.signum()>0){g=(e+h.intValue()).toString(c).substr(1)+g;j.divRemTo(i,j,h)}return h.intValue().toString(c)+g}function bnpFromRadix(m,h){this.fromInt(0);if(h==null){h=10}var f=this.chunkSize(h);var g=Math.pow(h,f),e=false,a=0,l=0;for(var c=0;c<m.length;++c){var k=intAt(m,c);if(k<0){if(m.charAt(c)=="-"&&this.signum()==0){e=true}continue}l=h*l+k;if(++a>=f){this.dMultiply(g);this.dAddOffset(l,0);a=0;l=0}}if(a>0){this.dMultiply(Math.pow(h,a));this.dAddOffset(l,0)}if(e){BigInteger.ZERO.subTo(this,this)}}function bnpFromNumber(f,e,h){if("number"==typeof e){if(f<2){this.fromInt(1)}else{this.fromNumber(f,h);if(!this.testBit(f-1)){this.bitwiseTo(BigInteger.ONE.shiftLeft(f-1),op_or,this)}if(this.isEven()){this.dAddOffset(1,0)}while(!this.isProbablePrime(e)){this.dAddOffset(2,0);if(this.bitLength()>f){this.subTo(BigInteger.ONE.shiftLeft(f-1),this)}}}}else{var d=new Array(),g=f&7;d.length=(f>>3)+1;e.nextBytes(d);if(g>0){d[0]&=((1<<g)-1)}else{d[0]=0}this.fromString(d,256)}}function bnToByteArray(){var b=this.t,c=new Array();c[0]=this.s;var e=this.DB-(b*this.DB)%8,f,a=0;if(b-->0){if(e<this.DB&&(f=this[b]>>e)!=(this.s&this.DM)>>e){c[a++]=f|(this.s<<(this.DB-e))}while(b>=0){if(e<8){f=(this[b]&((1<<e)-1))<<(8-e);f|=this[--b]>>(e+=this.DB-8)}else{f=(this[b]>>(e-=8))&255;if(e<=0){e+=this.DB;--b}}if((f&128)!=0){f|=-256}if(a==0&&(this.s&128)!=(f&128)){++a}if(a>0||f!=this.s){c[a++]=f}}}return c}function bnEquals(b){return(this.compareTo(b)==0)}function bnMin(b){return(this.compareTo(b)<0)?this:b}function bnMax(b){return(this.compareTo(b)>0)?this:b}function bnpBitwiseTo(c,h,e){var d,g,b=Math.min(c.t,this.t);for(d=0;d<b;++d){e[d]=h(this[d],c[d])}if(c.t<this.t){g=c.s&this.DM;for(d=b;d<this.t;++d){e[d]=h(this[d],g)}e.t=this.t}else{g=this.s&this.DM;for(d=b;d<c.t;++d){e[d]=h(g,c[d])}e.t=c.t}e.s=h(this.s,c.s);e.clamp()}function op_and(a,b){return a&b}function bnAnd(b){var c=nbi();this.bitwiseTo(b,op_and,c);return c}function op_or(a,b){return a|b}function bnOr(b){var c=nbi();this.bitwiseTo(b,op_or,c);return c}function op_xor(a,b){return a^b}function bnXor(b){var c=nbi();this.bitwiseTo(b,op_xor,c);return c}function op_andnot(a,b){return a&~b}function bnAndNot(b){var c=nbi();this.bitwiseTo(b,op_andnot,c);return c}function bnNot(){var b=nbi();for(var a=0;a<this.t;++a){b[a]=this.DM&~this[a]}b.t=this.t;b.s=~this.s;return b}function bnShiftLeft(b){var a=nbi();if(b<0){this.rShiftTo(-b,a)}else{this.lShiftTo(b,a)}return a}function bnShiftRight(b){var a=nbi();if(b<0){this.lShiftTo(-b,a)}else{this.rShiftTo(b,a)}return a}function lbit(a){if(a==0){return -1}var b=0;if((a&65535)==0){a>>=16;b+=16}if((a&255)==0){a>>=8;b+=8}if((a&15)==0){a>>=4;b+=4}if((a&3)==0){a>>=2;b+=2}if((a&1)==0){++b}return b}function bnGetLowestSetBit(){for(var a=0;a<this.t;++a){if(this[a]!=0){return a*this.DB+lbit(this[a])}}if(this.s<0){return this.t*this.DB}return -1}function cbit(a){var b=0;while(a!=0){a&=a-1;++b}return b}function bnBitCount(){var c=0,a=this.s&this.DM;for(var b=0;b<this.t;++b){c+=cbit(this[b]^a)}return c}function bnTestBit(b){var a=Math.floor(b/this.DB);if(a>=this.t){return(this.s!=0)}return((this[a]&(1<<(b%this.DB)))!=0)}function bnpChangeBit(c,b){var a=BigInteger.ONE.shiftLeft(c);this.bitwiseTo(a,b,a);return a}function bnSetBit(a){return this.changeBit(a,op_or)}function bnClearBit(a){return this.changeBit(a,op_andnot)}function bnFlipBit(a){return this.changeBit(a,op_xor)}function bnpAddTo(d,f){var e=0,g=0,b=Math.min(d.t,this.t);while(e<b){g+=this[e]+d[e];f[e++]=g&this.DM;g>>=this.DB}if(d.t<this.t){g+=d.s;while(e<this.t){g+=this[e];f[e++]=g&this.DM;g>>=this.DB}g+=this.s}else{g+=this.s;while(e<d.t){g+=d[e];f[e++]=g&this.DM;g>>=this.DB}g+=d.s}f.s=(g<0)?-1:0;if(g>0){f[e++]=g}else{if(g<-1){f[e++]=this.DV+g}}f.t=e;f.clamp()}function bnAdd(b){var c=nbi();this.addTo(b,c);return c}function bnSubtract(b){var c=nbi();this.subTo(b,c);return c}function bnMultiply(b){var c=nbi();this.multiplyTo(b,c);return c}function bnSquare(){var a=nbi();this.squareTo(a);return a}function bnDivide(b){var c=nbi();this.divRemTo(b,c,null);return c}function bnRemainder(b){var c=nbi();this.divRemTo(b,null,c);return c}function bnDivideAndRemainder(b){var d=nbi(),c=nbi();this.divRemTo(b,d,c);return new Array(d,c)}function bnpDMultiply(a){this[this.t]=this.am(0,a-1,this,0,0,this.t);++this.t;this.clamp()}function bnpDAddOffset(b,a){if(b==0){return}while(this.t<=a){this[this.t++]=0}this[a]+=b;while(this[a]>=this.DV){this[a]-=this.DV;if(++a>=this.t){this[this.t++]=0}++this[a]}}function NullExp(){}function nNop(a){return a}function nMulTo(a,c,b){a.multiplyTo(c,b)}function nSqrTo(a,b){a.squareTo(b)}NullExp.prototype.convert=nNop;NullExp.prototype.revert=nNop;NullExp.prototype.mulTo=nMulTo;NullExp.prototype.sqrTo=nSqrTo;function bnPow(a){return this.exp(a,new NullExp())}function bnpMultiplyLowerTo(b,f,e){var d=Math.min(this.t+b.t,f);e.s=0;e.t=d;while(d>0){e[--d]=0}var c;for(c=e.t-this.t;d<c;++d){e[d+this.t]=this.am(0,b[d],e,d,0,this.t)}for(c=Math.min(b.t,f);d<c;++d){this.am(0,b[d],e,d,0,f-d)}e.clamp()}function bnpMultiplyUpperTo(b,e,d){--e;var c=d.t=this.t+b.t-e;d.s=0;while(--c>=0){d[c]=0}for(c=Math.max(e-this.t,0);c<b.t;++c){d[this.t+c-e]=this.am(e-c,b[c],d,0,0,this.t+c-e)}d.clamp();d.drShiftTo(1,d)}function Barrett(a){this.r2=nbi();this.q3=nbi();BigInteger.ONE.dlShiftTo(2*a.t,this.r2);this.mu=this.r2.divide(a);this.m=a}function barrettConvert(a){if(a.s<0||a.t>2*this.m.t){return a.mod(this.m)}else{if(a.compareTo(this.m)<0){return a}else{var b=nbi();a.copyTo(b);this.reduce(b);return b}}}function barrettRevert(a){return a}function barrettReduce(a){a.drShiftTo(this.m.t-1,this.r2);if(a.t>this.m.t+1){a.t=this.m.t+1;a.clamp()}this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);while(a.compareTo(this.r2)<0){a.dAddOffset(1,this.m.t+1)}a.subTo(this.r2,a);while(a.compareTo(this.m)>=0){a.subTo(this.m,a)}}function barrettSqrTo(a,b){a.squareTo(b);this.reduce(b)}function barrettMulTo(a,c,b){a.multiplyTo(c,b);this.reduce(b)}Barrett.prototype.convert=barrettConvert;Barrett.prototype.revert=barrettRevert;Barrett.prototype.reduce=barrettReduce;Barrett.prototype.mulTo=barrettMulTo;Barrett.prototype.sqrTo=barrettSqrTo;function bnModPow(q,f){var o=q.bitLength(),h,b=nbv(1),v;if(o<=0){return b}else{if(o<18){h=1}else{if(o<48){h=3}else{if(o<144){h=4}else{if(o<768){h=5}else{h=6}}}}}if(o<8){v=new Classic(f)}else{if(f.isEven()){v=new Barrett(f)}else{v=new Montgomery(f)}}var p=new Array(),d=3,s=h-1,a=(1<<h)-1;p[1]=v.convert(this);if(h>1){var A=nbi();v.sqrTo(p[1],A);while(d<=a){p[d]=nbi();v.mulTo(A,p[d-2],p[d]);d+=2}}var l=q.t-1,x,u=true,c=nbi(),y;o=nbits(q[l])-1;while(l>=0){if(o>=s){x=(q[l]>>(o-s))&a}else{x=(q[l]&((1<<(o+1))-1))<<(s-o);if(l>0){x|=q[l-1]>>(this.DB+o-s)}}d=h;while((x&1)==0){x>>=1;--d}if((o-=d)<0){o+=this.DB;--l}if(u){p[x].copyTo(b);u=false}else{while(d>1){v.sqrTo(b,c);v.sqrTo(c,b);d-=2}if(d>0){v.sqrTo(b,c)}else{y=b;b=c;c=y}v.mulTo(c,p[x],b)}while(l>=0&&(q[l]&(1<<o))==0){v.sqrTo(b,c);y=b;b=c;c=y;if(--o<0){o=this.DB-1;--l}}}return v.revert(b)}function bnGCD(c){var b=(this.s<0)?this.negate():this.clone();var h=(c.s<0)?c.negate():c.clone();if(b.compareTo(h)<0){var e=b;b=h;h=e}var d=b.getLowestSetBit(),f=h.getLowestSetBit();if(f<0){return b}if(d<f){f=d}if(f>0){b.rShiftTo(f,b);h.rShiftTo(f,h)}while(b.signum()>0){if((d=b.getLowestSetBit())>0){b.rShiftTo(d,b)}if((d=h.getLowestSetBit())>0){h.rShiftTo(d,h)}if(b.compareTo(h)>=0){b.subTo(h,b);b.rShiftTo(1,b)}else{h.subTo(b,h);h.rShiftTo(1,h)}}if(f>0){h.lShiftTo(f,h)}return h}function bnpModInt(e){if(e<=0){return 0}var c=this.DV%e,b=(this.s<0)?e-1:0;if(this.t>0){if(c==0){b=this[0]%e}else{for(var a=this.t-1;a>=0;--a){b=(c*b+this[a])%e}}}return b}function bnModInverse(f){var j=f.isEven();if((this.isEven()&&j)||f.signum()==0){return BigInteger.ZERO}var i=f.clone(),h=this.clone();var g=nbv(1),e=nbv(0),l=nbv(0),k=nbv(1);while(i.signum()!=0){while(i.isEven()){i.rShiftTo(1,i);if(j){if(!g.isEven()||!e.isEven()){g.addTo(this,g);e.subTo(f,e)}g.rShiftTo(1,g)}else{if(!e.isEven()){e.subTo(f,e)}}e.rShiftTo(1,e)}while(h.isEven()){h.rShiftTo(1,h);if(j){if(!l.isEven()||!k.isEven()){l.addTo(this,l);k.subTo(f,k)}l.rShiftTo(1,l)}else{if(!k.isEven()){k.subTo(f,k)}}k.rShiftTo(1,k)}if(i.compareTo(h)>=0){i.subTo(h,i);if(j){g.subTo(l,g)}e.subTo(k,e)}else{h.subTo(i,h);if(j){l.subTo(g,l)}k.subTo(e,k)}}if(h.compareTo(BigInteger.ONE)!=0){return BigInteger.ZERO}if(k.compareTo(f)>=0){return k.subtract(f)}if(k.signum()<0){k.addTo(f,k)}else{return k}if(k.signum()<0){return k.add(f)}else{return k}}var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];var lplim=(1<<26)/lowprimes[lowprimes.length-1];function bnIsProbablePrime(e){var d,b=this.abs();if(b.t==1&&b[0]<=lowprimes[lowprimes.length-1]){for(d=0;d<lowprimes.length;++d){if(b[0]==lowprimes[d]){return true}}return false}if(b.isEven()){return false}d=1;while(d<lowprimes.length){var a=lowprimes[d],c=d+1;while(c<lowprimes.length&&a<lplim){a*=lowprimes[c++]}a=b.modInt(a);while(d<c){if(a%lowprimes[d++]==0){return false}}}return b.millerRabin(e)}function bnpMillerRabin(f){var g=this.subtract(BigInteger.ONE);var c=g.getLowestSetBit();if(c<=0){return false}var h=g.shiftRight(c);f=(f+1)>>1;if(f>lowprimes.length){f=lowprimes.length}var b=nbi();for(var e=0;e<f;++e){b.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);var l=b.modPow(h,this);if(l.compareTo(BigInteger.ONE)!=0&&l.compareTo(g)!=0){var d=1;while(d++<c&&l.compareTo(g)!=0){l=l.modPowInt(2,this);if(l.compareTo(BigInteger.ONE)==0){return false}}if(l.compareTo(g)!=0){return false}}}return true}BigInteger.prototype.chunkSize=bnpChunkSize;BigInteger.prototype.toRadix=bnpToRadix;BigInteger.prototype.fromRadix=bnpFromRadix;BigInteger.prototype.fromNumber=bnpFromNumber;BigInteger.prototype.bitwiseTo=bnpBitwiseTo;BigInteger.prototype.changeBit=bnpChangeBit;BigInteger.prototype.addTo=bnpAddTo;BigInteger.prototype.dMultiply=bnpDMultiply;BigInteger.prototype.dAddOffset=bnpDAddOffset;BigInteger.prototype.multiplyLowerTo=bnpMultiplyLowerTo;BigInteger.prototype.multiplyUpperTo=bnpMultiplyUpperTo;BigInteger.prototype.modInt=bnpModInt;BigInteger.prototype.millerRabin=bnpMillerRabin;BigInteger.prototype.clone=bnClone;BigInteger.prototype.intValue=bnIntValue;BigInteger.prototype.byteValue=bnByteValue;BigInteger.prototype.shortValue=bnShortValue;BigInteger.prototype.signum=bnSigNum;BigInteger.prototype.toByteArray=bnToByteArray;BigInteger.prototype.equals=bnEquals;BigInteger.prototype.min=bnMin;BigInteger.prototype.max=bnMax;BigInteger.prototype.and=bnAnd;BigInteger.prototype.or=bnOr;BigInteger.prototype.xor=bnXor;BigInteger.prototype.andNot=bnAndNot;BigInteger.prototype.not=bnNot;BigInteger.prototype.shiftLeft=bnShiftLeft;BigInteger.prototype.shiftRight=bnShiftRight;BigInteger.prototype.getLowestSetBit=bnGetLowestSetBit;BigInteger.prototype.bitCount=bnBitCount;BigInteger.prototype.testBit=bnTestBit;BigInteger.prototype.setBit=bnSetBit;BigInteger.prototype.clearBit=bnClearBit;BigInteger.prototype.flipBit=bnFlipBit;BigInteger.prototype.add=bnAdd;BigInteger.prototype.subtract=bnSubtract;BigInteger.prototype.multiply=bnMultiply;BigInteger.prototype.divide=bnDivide;BigInteger.prototype.remainder=bnRemainder;BigInteger.prototype.divideAndRemainder=bnDivideAndRemainder;BigInteger.prototype.modPow=bnModPow;BigInteger.prototype.modInverse=bnModInverse;BigInteger.prototype.pow=bnPow;BigInteger.prototype.gcd=bnGCD;BigInteger.prototype.isProbablePrime=bnIsProbablePrime;BigInteger.prototype.square=bnSquare;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function Arcfour(){this.i=0;this.j=0;this.S=new Array()}function ARC4init(d){var c,a,b;for(c=0;c<256;++c){this.S[c]=c}a=0;for(c=0;c<256;++c){a=(a+this.S[c]+d[c%d.length])&255;b=this.S[c];this.S[c]=this.S[a];this.S[a]=b}this.i=0;this.j=0}function ARC4next(){var a;this.i=(this.i+1)&255;this.j=(this.j+this.S[this.i])&255;a=this.S[this.i];this.S[this.i]=this.S[this.j];this.S[this.j]=a;return this.S[(a+this.S[this.i])&255]}Arcfour.prototype.init=ARC4init;Arcfour.prototype.next=ARC4next;function prng_newstate(){return new Arcfour()}var rng_psize=256;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
var rng_state;var rng_pool;var rng_pptr;function rng_seed_int(a){rng_pool[rng_pptr++]^=a&255;rng_pool[rng_pptr++]^=(a>>8)&255;rng_pool[rng_pptr++]^=(a>>16)&255;rng_pool[rng_pptr++]^=(a>>24)&255;if(rng_pptr>=rng_psize){rng_pptr-=rng_psize}}function rng_seed_time(){rng_seed_int(new Date().getTime())}if(rng_pool==null){rng_pool=new Array();rng_pptr=0;var t;if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t<z.length;++t){rng_pool[rng_pptr++]=z.charCodeAt(t)&255}}while(rng_pptr<rng_psize){t=Math.floor(65536*Math.random());rng_pool[rng_pptr++]=t>>>8;rng_pool[rng_pptr++]=t&255}rng_pptr=0;rng_seed_time()}function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr<rng_pool.length;++rng_pptr){rng_pool[rng_pptr]=0}rng_pptr=0}return rng_state.next()}function rng_get_bytes(b){var a;for(a=0;a<b.length;++a){b[a]=rng_get_byte()}}function SecureRandom(){}SecureRandom.prototype.nextBytes=rng_get_bytes;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function parseBigInt(b,a){return new BigInteger(b,a)}function linebrk(c,d){var a="";var b=0;while(b+d<c.length){a+=c.substring(b,b+d)+"\n";b+=d}return a+c.substring(b,c.length)}function byte2Hex(a){if(a<16){return"0"+a.toString(16)}else{return a.toString(16)}}function pkcs1pad2(e,h){if(h<e.length+11){alert("Message too long for RSA");return null}var g=new Array();var d=e.length-1;while(d>=0&&h>0){var f=e.charCodeAt(d--);if(f<128){g[--h]=f}else{if((f>127)&&(f<2048)){g[--h]=(f&63)|128;g[--h]=(f>>6)|192}else{g[--h]=(f&63)|128;g[--h]=((f>>6)&63)|128;g[--h]=(f>>12)|224}}}g[--h]=0;var b=new SecureRandom();var a=new Array();while(h>2){a[0]=0;while(a[0]==0){b.nextBytes(a)}g[--h]=a[0]}g[--h]=2;g[--h]=0;return new BigInteger(g)}function oaep_mgf1_arr(c,a,e){var b="",d=0;while(b.length<a){b+=e(String.fromCharCode.apply(String,c.concat([(d&4278190080)>>24,(d&16711680)>>16,(d&65280)>>8,d&255])));d+=1}return b}var SHA1_SIZE=20;function oaep_pad(l,a,c){if(l.length+2*SHA1_SIZE+2>a){throw"Message too long for RSA"}var h="",d;for(d=0;d<a-l.length-2*SHA1_SIZE-2;d+=1){h+="\x00"}var e=rstr_sha1("")+h+"\x01"+l;var f=new Array(SHA1_SIZE);new SecureRandom().nextBytes(f);var g=oaep_mgf1_arr(f,e.length,c||rstr_sha1);var k=[];for(d=0;d<e.length;d+=1){k[d]=e.charCodeAt(d)^g.charCodeAt(d)}var j=oaep_mgf1_arr(k,f.length,rstr_sha1);var b=[0];for(d=0;d<f.length;d+=1){b[d+1]=f[d]^j.charCodeAt(d)}return new BigInteger(b.concat(k))}function RSAKey(){this.n=null;this.e=0;this.d=null;this.p=null;this.q=null;this.dmp1=null;this.dmq1=null;this.coeff=null}function RSASetPublic(b,a){this.isPublic=true;if(typeof b!=="string"){this.n=b;this.e=a}else{if(b!=null&&a!=null&&b.length>0&&a.length>0){this.n=parseBigInt(b,16);this.e=parseInt(a,16)}else{alert("Invalid RSA public key")}}}function RSADoPublic(a){return a.modPowInt(this.e,this.n)}function RSAEncrypt(d){var a=pkcs1pad2(d,(this.n.bitLength()+7)>>3);if(a==null){return null}var e=this.doPublic(a);if(e==null){return null}var b=e.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}function RSAEncryptOAEP(e,d){var a=oaep_pad(e,(this.n.bitLength()+7)>>3,d);if(a==null){return null}var f=this.doPublic(a);if(f==null){return null}var b=f.toString(16);if((b.length&1)==0){return b}else{return"0"+b}}RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt;RSAKey.prototype.encryptOAEP=RSAEncryptOAEP;RSAKey.prototype.type="RSA";
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function pkcs1unpad2(g,j){var a=g.toByteArray();var f=0;while(f<a.length&&a[f]==0){++f}if(a.length-f!=j-1||a[f]!=2){return null}++f;while(a[f]!=0){if(++f>=a.length){return null}}var e="";while(++f<a.length){var h=a[f]&255;if(h<128){e+=String.fromCharCode(h)}else{if((h>191)&&(h<224)){e+=String.fromCharCode(((h&31)<<6)|(a[f+1]&63));++f}else{e+=String.fromCharCode(((h&15)<<12)|((a[f+1]&63)<<6)|(a[f+2]&63));f+=2}}}return e}function oaep_mgf1_str(c,a,e){var b="",d=0;while(b.length<a){b+=e(c+String.fromCharCode.apply(String,[(d&4278190080)>>24,(d&16711680)>>16,(d&65280)>>8,d&255]));d+=1}return b}var SHA1_SIZE=20;function oaep_unpad(l,b,e){l=l.toByteArray();var f;for(f=0;f<l.length;f+=1){l[f]&=255}while(l.length<b){l.unshift(0)}l=String.fromCharCode.apply(String,l);if(l.length<2*SHA1_SIZE+2){throw"Cipher too short"}var c=l.substr(1,SHA1_SIZE);var o=l.substr(SHA1_SIZE+1);var m=oaep_mgf1_str(o,SHA1_SIZE,e||rstr_sha1);var h=[],f;for(f=0;f<c.length;f+=1){h[f]=c.charCodeAt(f)^m.charCodeAt(f)}var j=oaep_mgf1_str(String.fromCharCode.apply(String,h),l.length-SHA1_SIZE,rstr_sha1);var g=[];for(f=0;f<o.length;f+=1){g[f]=o.charCodeAt(f)^j.charCodeAt(f)}g=String.fromCharCode.apply(String,g);if(g.substr(0,SHA1_SIZE)!==rstr_sha1("")){throw"Hash mismatch"}g=g.substr(SHA1_SIZE);var a=g.indexOf("\x01");var k=(a!=-1)?g.substr(0,a).lastIndexOf("\x00"):-1;if(k+1!=a){throw"Malformed data"}return g.substr(a+1)}function RSASetPrivate(c,a,b){this.isPrivate=true;if(typeof c!=="string"){this.n=c;this.e=a;this.d=b}else{if(c!=null&&a!=null&&c.length>0&&a.length>0){this.n=parseBigInt(c,16);this.e=parseInt(a,16);this.d=parseBigInt(b,16)}else{alert("Invalid RSA private key")}}}function RSASetPrivateEx(g,d,e,c,b,a,h,f){this.isPrivate=true;if(g==null){throw"RSASetPrivateEx N == null"}if(d==null){throw"RSASetPrivateEx E == null"}if(g.length==0){throw"RSASetPrivateEx N.length == 0"}if(d.length==0){throw"RSASetPrivateEx E.length == 0"}if(g!=null&&d!=null&&g.length>0&&d.length>0){this.n=parseBigInt(g,16);this.e=parseInt(d,16);this.d=parseBigInt(e,16);this.p=parseBigInt(c,16);this.q=parseBigInt(b,16);this.dmp1=parseBigInt(a,16);this.dmq1=parseBigInt(h,16);this.coeff=parseBigInt(f,16)}else{alert("Invalid RSA private key in RSASetPrivateEx")}}function RSAGenerate(b,i){var a=new SecureRandom();var f=b>>1;this.e=parseInt(i,16);var c=new BigInteger(i,16);for(;;){for(;;){this.p=new BigInteger(b-f,1,a);if(this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.p.isProbablePrime(10)){break}}for(;;){this.q=new BigInteger(f,1,a);if(this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE)==0&&this.q.isProbablePrime(10)){break}}if(this.p.compareTo(this.q)<=0){var h=this.p;this.p=this.q;this.q=h}var g=this.p.subtract(BigInteger.ONE);var d=this.q.subtract(BigInteger.ONE);var e=g.multiply(d);if(e.gcd(c).compareTo(BigInteger.ONE)==0){this.n=this.p.multiply(this.q);this.d=c.modInverse(e);this.dmp1=this.d.mod(g);this.dmq1=this.d.mod(d);this.coeff=this.q.modInverse(this.p);break}}}function RSADoPrivate(a){if(this.p==null||this.q==null){return a.modPow(this.d,this.n)}var c=a.mod(this.p).modPow(this.dmp1,this.p);var b=a.mod(this.q).modPow(this.dmq1,this.q);while(c.compareTo(b)<0){c=c.add(this.p)}return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)}function RSADecrypt(b){var d=parseBigInt(b,16);var a=this.doPrivate(d);if(a==null){return null}return pkcs1unpad2(a,(this.n.bitLength()+7)>>3)}function RSADecryptOAEP(d,b){var e=parseBigInt(d,16);var a=this.doPrivate(e);if(a==null){return null}return oaep_unpad(a,(this.n.bitLength()+7)>>3,b)}RSAKey.prototype.doPrivate=RSADoPrivate;RSAKey.prototype.setPrivate=RSASetPrivate;RSAKey.prototype.setPrivateEx=RSASetPrivateEx;RSAKey.prototype.generate=RSAGenerate;RSAKey.prototype.decrypt=RSADecrypt;RSAKey.prototype.decryptOAEP=RSADecryptOAEP;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
function ECFieldElementFp(b,a){this.x=a;this.q=b}function feFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.x.equals(a.x))}function feFpToBigInteger(){return this.x}function feFpNegate(){return new ECFieldElementFp(this.q,this.x.negate().mod(this.q))}function feFpAdd(a){return new ECFieldElementFp(this.q,this.x.add(a.toBigInteger()).mod(this.q))}function feFpSubtract(a){return new ECFieldElementFp(this.q,this.x.subtract(a.toBigInteger()).mod(this.q))}function feFpMultiply(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger()).mod(this.q))}function feFpSquare(){return new ECFieldElementFp(this.q,this.x.square().mod(this.q))}function feFpDivide(a){return new ECFieldElementFp(this.q,this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q))}ECFieldElementFp.prototype.equals=feFpEquals;ECFieldElementFp.prototype.toBigInteger=feFpToBigInteger;ECFieldElementFp.prototype.negate=feFpNegate;ECFieldElementFp.prototype.add=feFpAdd;ECFieldElementFp.prototype.subtract=feFpSubtract;ECFieldElementFp.prototype.multiply=feFpMultiply;ECFieldElementFp.prototype.square=feFpSquare;ECFieldElementFp.prototype.divide=feFpDivide;function ECPointFp(c,a,d,b){this.curve=c;this.x=a;this.y=d;if(b==null){this.z=BigInteger.ONE}else{this.z=b}this.zinv=null}function pointFpGetX(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpGetY(){if(this.zinv==null){this.zinv=this.z.modInverse(this.curve.q)}return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))}function pointFpEquals(a){if(a==this){return true}if(this.isInfinity()){return a.isInfinity()}if(a.isInfinity()){return this.isInfinity()}var c,b;c=a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);if(!c.equals(BigInteger.ZERO)){return false}b=a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);return b.equals(BigInteger.ZERO)}function pointFpIsInfinity(){if((this.x==null)&&(this.y==null)){return true}return this.z.equals(BigInteger.ZERO)&&!this.y.toBigInteger().equals(BigInteger.ZERO)}function pointFpNegate(){return new ECPointFp(this.curve,this.x,this.y.negate(),this.z)}function pointFpAdd(l){if(this.isInfinity()){return l}if(l.isInfinity()){return this}var p=l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);var o=l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);if(BigInteger.ZERO.equals(o)){if(BigInteger.ZERO.equals(p)){return this.twice()}return this.curve.getInfinity()}var j=new BigInteger("3");var e=this.x.toBigInteger();var n=this.y.toBigInteger();var c=l.x.toBigInteger();var k=l.y.toBigInteger();var m=o.square();var i=m.multiply(o);var d=e.multiply(m);var g=p.square().multiply(this.z);var a=g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);var h=d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);var f=i.multiply(this.z).multiply(l.z).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(a),this.curve.fromBigInteger(h),f)}function pointFpTwice(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var g=new BigInteger("3");var c=this.x.toBigInteger();var h=this.y.toBigInteger();var e=h.multiply(this.z);var j=e.multiply(h).mod(this.curve.q);var i=this.curve.a.toBigInteger();var k=c.square().multiply(g);if(!BigInteger.ZERO.equals(i)){k=k.add(this.z.square().multiply(i))}k=k.mod(this.curve.q);var b=k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);var f=k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);var d=e.square().multiply(e).shiftLeft(3).mod(this.curve.q);return new ECPointFp(this.curve,this.curve.fromBigInteger(b),this.curve.fromBigInteger(f),d)}function pointFpMultiply(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add(a?this:l)}}return d}function pointFpMultiplyTwo(c,a,b){var d;if(c.bitLength()>b.bitLength()){d=c.bitLength()-1}else{d=b.bitLength()-1}var f=this.curve.getInfinity();var e=this.add(a);while(d>=0){f=f.twice();if(c.testBit(d)){if(b.testBit(d)){f=f.add(e)}else{f=f.add(this)}}else{if(b.testBit(d)){f=f.add(a)}}--d}return f}ECPointFp.prototype.getX=pointFpGetX;ECPointFp.prototype.getY=pointFpGetY;ECPointFp.prototype.equals=pointFpEquals;ECPointFp.prototype.isInfinity=pointFpIsInfinity;ECPointFp.prototype.negate=pointFpNegate;ECPointFp.prototype.add=pointFpAdd;ECPointFp.prototype.twice=pointFpTwice;ECPointFp.prototype.multiply=pointFpMultiply;ECPointFp.prototype.multiplyTwo=pointFpMultiplyTwo;function ECCurveFp(e,d,c){this.q=e;this.a=this.fromBigInteger(d);this.b=this.fromBigInteger(c);this.infinity=new ECPointFp(this,null,null)}function curveFpGetQ(){return this.q}function curveFpGetA(){return this.a}function curveFpGetB(){return this.b}function curveFpEquals(a){if(a==this){return true}return(this.q.equals(a.q)&&this.a.equals(a.a)&&this.b.equals(a.b))}function curveFpGetInfinity(){return this.infinity}function curveFpFromBigInteger(a){return new ECFieldElementFp(this.q,a)}function curveFpDecodePointHex(d){switch(parseInt(d.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var a=(d.length-2)/2;var c=d.substr(2,a);var b=d.substr(a+2,a);return new ECPointFp(this,this.fromBigInteger(new BigInteger(c,16)),this.fromBigInteger(new BigInteger(b,16)));default:return null}}ECCurveFp.prototype.getQ=curveFpGetQ;ECCurveFp.prototype.getA=curveFpGetA;ECCurveFp.prototype.getB=curveFpGetB;ECCurveFp.prototype.equals=curveFpEquals;ECCurveFp.prototype.getInfinity=curveFpGetInfinity;ECCurveFp.prototype.fromBigInteger=curveFpFromBigInteger;ECCurveFp.prototype.decodePointHex=curveFpDecodePointHex;
/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib
*/
ECFieldElementFp.prototype.getByteLength=function(){return Math.floor((this.toBigInteger().bitLength()+7)/8)};ECPointFp.prototype.getEncoded=function(c){var d=function(h,f){var g=h.toByteArrayUnsigned();if(f<g.length){g=g.slice(g.length-f)}else{while(f>g.length){g.unshift(0)}}return g};var a=this.getX().toBigInteger();var e=this.getY().toBigInteger();var b=d(a,32);if(c){if(e.isEven()){b.unshift(2)}else{b.unshift(3)}}else{b.unshift(4);b=b.concat(d(e,32))}return b};ECPointFp.decodeFrom=function(g,c){var f=c[0];var e=c.length-1;var d=c.slice(1,1+e/2);var b=c.slice(1+e/2,1+e);d.unshift(0);b.unshift(0);var a=new BigInteger(d);var h=new BigInteger(b);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.decodeFromHex=function(g,c){var f=c.substr(0,2);var e=c.length-2;var d=c.substr(2,e/2);var b=c.substr(2+e/2,e/2);var a=new BigInteger(d,16);var h=new BigInteger(b,16);return new ECPointFp(g,g.fromBigInteger(a),g.fromBigInteger(h))};ECPointFp.prototype.add2D=function(c){if(this.isInfinity()){return c}if(c.isInfinity()){return this}if(this.x.equals(c.x)){if(this.y.equals(c.y)){return this.twice()}return this.curve.getInfinity()}var g=c.x.subtract(this.x);var e=c.y.subtract(this.y);var a=e.divide(g);var d=a.square().subtract(this.x).subtract(c.x);var f=a.multiply(this.x.subtract(d)).subtract(this.y);return new ECPointFp(this.curve,d,f)};ECPointFp.prototype.twice2D=function(){if(this.isInfinity()){return this}if(this.y.toBigInteger().signum()==0){return this.curve.getInfinity()}var b=this.curve.fromBigInteger(BigInteger.valueOf(2));var e=this.curve.fromBigInteger(BigInteger.valueOf(3));var a=this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));var c=a.square().subtract(this.x.multiply(b));var d=a.multiply(this.x.subtract(c)).subtract(this.y);return new ECPointFp(this.curve,c,d)};ECPointFp.prototype.multiply2D=function(b){if(this.isInfinity()){return this}if(b.signum()==0){return this.curve.getInfinity()}var g=b;var f=g.multiply(new BigInteger("3"));var l=this.negate();var d=this;var c;for(c=f.bitLength()-2;c>0;--c){d=d.twice();var a=f.testBit(c);var j=g.testBit(c);if(a!=j){d=d.add2D(a?this:l)}}return d};ECPointFp.prototype.isOnCurve=function(){var d=this.getX().toBigInteger();var i=this.getY().toBigInteger();var f=this.curve.getA().toBigInteger();var c=this.curve.getB().toBigInteger();var h=this.curve.getQ();var e=i.multiply(i).mod(h);var g=d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);return e.equals(g)};ECPointFp.prototype.toString=function(){return"("+this.getX().toBigInteger().toString()+","+this.getY().toBigInteger().toString()+")"};ECPointFp.prototype.validate=function(){var c=this.curve.getQ();if(this.isInfinity()){throw new Error("Point is at infinity.")}var a=this.getX().toBigInteger();var b=this.getY().toBigInteger();if(a.compareTo(BigInteger.ONE)<0||a.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("x coordinate out of bounds")}if(b.compareTo(BigInteger.ONE)<0||b.compareTo(c.subtract(BigInteger.ONE))>0){throw new Error("y coordinate out of bounds")}if(!this.isOnCurve()){throw new Error("Point is not on the curve.")}if(this.multiply(c).isInfinity()){throw new Error("Point is not a scalar multiple of G.")}return true};
/*! asn1-1.0.6.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}KJUR.asn1.ASN1Util=new function(){this.integerToByteHex=function(a){var b=a.toString(16);if((b.length%2)==1){b="0"+b}return b};this.bigIntToMinTwosComplementsHex=function(j){var f=j.toString(16);if(f.substr(0,1)!="-"){if(f.length%2==1){f="0"+f}else{if(!f.match(/^[0-7]/)){f="00"+f}}}else{var a=f.substr(1);var e=a.length;if(e%2==1){e+=1}else{if(!f.match(/^[0-7]/)){e+=2}}var g="";for(var d=0;d<e;d++){g+="f"}var c=new BigInteger(g,16);var b=c.xor(j).add(BigInteger.ONE);f=b.toString(16).replace(/^-/,"")}return f};this.getPEMStringFromHex=function(a,b){var c=KJUR.asn1;var f=CryptoJS.enc.Hex.parse(a);var d=CryptoJS.enc.Base64.stringify(f);var e=d.replace(/(.{64})/g,"$1\r\n");e=e.replace(/\r\n$/,"");return"-----BEGIN "+b+"-----\r\n"+e+"\r\n-----END "+b+"-----\r\n"};this.newObject=function(b){var g=KJUR.asn1;var k=Object.keys(b);if(k.length!=1){throw"key of param shall be only one."}var j=k[0];if(":bool:int:bitstr:octstr:null:oid:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":"+j+":")==-1){throw"undefined key: "+j}if(j=="bool"){return new g.DERBoolean(b[j])}if(j=="int"){return new g.DERInteger(b[j])}if(j=="bitstr"){return new g.DERBitString(b[j])}if(j=="octstr"){return new g.DEROctetString(b[j])}if(j=="null"){return new g.DERNull(b[j])}if(j=="oid"){return new g.DERObjectIdentifier(b[j])}if(j=="utf8str"){return new g.DERUTF8String(b[j])}if(j=="numstr"){return new g.DERNumericString(b[j])}if(j=="prnstr"){return new g.DERPrintableString(b[j])}if(j=="telstr"){return new g.DERTeletexString(b[j])}if(j=="ia5str"){return new g.DERIA5String(b[j])}if(j=="utctime"){return new g.DERUTCTime(b[j])}if(j=="gentime"){return new g.DERGeneralizedTime(b[j])}if(j=="seq"){var m=b[j];var h=[];for(var e=0;e<m.length;e++){var l=g.ASN1Util.newObject(m[e]);h.push(l)}return new g.DERSequence({array:h})}if(j=="set"){var m=b[j];var h=[];for(var e=0;e<m.length;e++){var l=g.ASN1Util.newObject(m[e]);h.push(l)}return new g.DERSet({array:h})}if(j=="tag"){var c=b[j];if(Object.prototype.toString.call(c)==="[object Array]"&&c.length==3){var d=g.ASN1Util.newObject(c[2]);return new g.DERTaggedObject({tag:c[0],explicit:c[1],obj:d})}else{var f={};if(c.explicit!==undefined){f.explicit=c.explicit}if(c.tag!==undefined){f.tag=c.tag}if(c.obj===undefined){throw"obj shall be specified for 'tag'."}f.obj=g.ASN1Util.newObject(c.obj);return new g.DERTaggedObject(f)}}};this.jsonToASN1HEX=function(b){var a=this.newObject(b);return a.getEncodedHex()}};KJUR.asn1.ASN1Object=function(){var c=true;var b=null;var d="00";var e="00";var a="";this.getLengthHexFromValue=function(){if(typeof this.hV=="undefined"||this.hV==null){throw"this.hV is null or undefined."}if(this.hV.length%2==1){throw"value hex must be even length: n="+a.length+",v="+this.hV}var i=this.hV.length/2;var h=i.toString(16);if(h.length%2==1){h="0"+h}if(i<128){return h}else{var g=h.length/2;if(g>15){throw"ASN.1 length too long to represent by 8x: n = "+i.toString(16)}var f=128+g;return f.toString(16)+h}};this.getEncodedHex=function(){if(this.hTLV==null||this.isModified){this.hV=this.getFreshValueHex();this.hL=this.getLengthHexFromValue();this.hTLV=this.hT+this.hL+this.hV;this.isModified=false}return this.hTLV};this.getValueHex=function(){this.getEncodedHex();return this.hV};this.getFreshValueHex=function(){return""}};KJUR.asn1.DERAbstractString=function(c){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var b=null;var a=null;this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(this.s)};this.setStringHex=function(d){this.hTLV=null;this.isModified=true;this.s=null;this.hV=d};this.getFreshValueHex=function(){return this.hV};if(typeof c!="undefined"){if(typeof c=="string"){this.setString(c)}else{if(typeof c.str!="undefined"){this.setString(c.str)}else{if(typeof c.hex!="undefined"){this.setStringHex(c.hex)}}}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractString,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractTime=function(c){KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);var b=null;var a=null;this.localDateToUTC=function(f){utc=f.getTime()+(f.getTimezoneOffset()*60000);var e=new Date(utc);return e};this.formatDate=function(m,o,e){var g=this.zeroPadding;var n=this.localDateToUTC(m);var p=String(n.getFullYear());if(o=="utc"){p=p.substr(2,2)}var l=g(String(n.getMonth()+1),2);var q=g(String(n.getDate()),2);var h=g(String(n.getHours()),2);var i=g(String(n.getMinutes()),2);var j=g(String(n.getSeconds()),2);var r=p+l+q+h+i+j;if(e===true){var f=n.getMilliseconds();if(f!=0){var k=g(String(f),3);k=k.replace(/[0]+$/,"");r=r+"."+k}}return r+"Z"};this.zeroPadding=function(e,d){if(e.length>=d){return e}return new Array(d-e.length+1).join("0")+e};this.getString=function(){return this.s};this.setString=function(d){this.hTLV=null;this.isModified=true;this.s=d;this.hV=stohex(d)};this.setByDateValue=function(h,j,e,d,f,g){var i=new Date(Date.UTC(h,j-1,e,d,f,g,0));this.setByDate(i)};this.getFreshValueHex=function(){return this.hV}};YAHOO.lang.extend(KJUR.asn1.DERAbstractTime,KJUR.asn1.ASN1Object);KJUR.asn1.DERAbstractStructured=function(b){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);var a=null;this.setByASN1ObjectArray=function(c){this.hTLV=null;this.isModified=true;this.asn1Array=c};this.appendASN1Object=function(c){this.hTLV=null;this.isModified=true;this.asn1Array.push(c)};this.asn1Array=new Array();if(typeof b!="undefined"){if(typeof b.array!="undefined"){this.asn1Array=b.array}}};YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured,KJUR.asn1.ASN1Object);KJUR.asn1.DERBoolean=function(){KJUR.asn1.DERBoolean.superclass.constructor.call(this);this.hT="01";this.hTLV="0101ff"};YAHOO.lang.extend(KJUR.asn1.DERBoolean,KJUR.asn1.ASN1Object);KJUR.asn1.DERInteger=function(a){KJUR.asn1.DERInteger.superclass.constructor.call(this);this.hT="02";this.setByBigInteger=function(b){this.hTLV=null;this.isModified=true;this.hV=KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)};this.setByInteger=function(c){var b=new BigInteger(String(c),10);this.setByBigInteger(b)};this.setValueHex=function(b){this.hV=b};this.getFreshValueHex=function(){return this.hV};if(typeof a!="undefined"){if(typeof a.bigint!="undefined"){this.setByBigInteger(a.bigint)}else{if(typeof a["int"]!="undefined"){this.setByInteger(a["int"])}else{if(typeof a=="number"){this.setByInteger(a)}else{if(typeof a.hex!="undefined"){this.setValueHex(a.hex)}}}}}};YAHOO.lang.extend(KJUR.asn1.DERInteger,KJUR.asn1.ASN1Object);KJUR.asn1.DERBitString=function(a){KJUR.asn1.DERBitString.superclass.constructor.call(this);this.hT="03";this.setHexValueIncludingUnusedBits=function(b){this.hTLV=null;this.isModified=true;this.hV=b};this.setUnusedBitsAndHexValue=function(b,d){if(b<0||7<b){throw"unused bits shall be from 0 to 7: u = "+b}var c="0"+b;this.hTLV=null;this.isModified=true;this.hV=c+d};this.setByBinaryString=function(e){e=e.replace(/0+$/,"");var f=8-e.length%8;if(f==8){f=0}for(var g=0;g<=f;g++){e+="0"}var j="";for(var g=0;g<e.length-1;g+=8){var d=e.substr(g,8);var c=parseInt(d,2).toString(16);if(c.length==1){c="0"+c}j+=c}this.hTLV=null;this.isModified=true;this.hV="0"+f+j};this.setByBooleanArray=function(d){var c="";for(var b=0;b<d.length;b++){if(d[b]==true){c+="1"}else{c+="0"}}this.setByBinaryString(c)};this.newFalseArray=function(d){var b=new Array(d);for(var c=0;c<d;c++){b[c]=false}return b};this.getFreshValueHex=function(){return this.hV};if(typeof a!="undefined"){if(typeof a=="string"&&a.toLowerCase().match(/^[0-9a-f]+$/)){this.setHexValueIncludingUnusedBits(a)}else{if(typeof a.hex!="undefined"){this.setHexValueIncludingUnusedBits(a.hex)}else{if(typeof a.bin!="undefined"){this.setByBinaryString(a.bin)}else{if(typeof a.array!="undefined"){this.setByBooleanArray(a.array)}}}}}};YAHOO.lang.extend(KJUR.asn1.DERBitString,KJUR.asn1.ASN1Object);KJUR.asn1.DEROctetString=function(a){KJUR.asn1.DEROctetString.superclass.constructor.call(this,a);this.hT="04"};YAHOO.lang.extend(KJUR.asn1.DEROctetString,KJUR.asn1.DERAbstractString);KJUR.asn1.DERNull=function(){KJUR.asn1.DERNull.superclass.constructor.call(this);this.hT="05";this.hTLV="0500"};YAHOO.lang.extend(KJUR.asn1.DERNull,KJUR.asn1.ASN1Object);KJUR.asn1.DERObjectIdentifier=function(c){var b=function(d){var e=d.toString(16);if(e.length==1){e="0"+e}return e};var a=function(k){var j="";var e=new BigInteger(k,10);var d=e.toString(2);var f=7-d.length%7;if(f==7){f=0}var m="";for(var g=0;g<f;g++){m+="0"}d=m+d;for(var g=0;g<d.length-1;g+=7){var l=d.substr(g,7);if(g!=d.length-7){l="1"+l}j+=b(parseInt(l,2))}return j};KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);this.hT="06";this.setValueHex=function(d){this.hTLV=null;this.isModified=true;this.s=null;this.hV=d};this.setValueOidString=function(f){if(!f.match(/^[0-9.]+$/)){throw"malformed oid string: "+f}var g="";var d=f.split(".");var j=parseInt(d[0])*40+parseInt(d[1]);g+=b(j);d.splice(0,2);for(var e=0;e<d.length;e++){g+=a(d[e])}this.hTLV=null;this.isModified=true;this.s=null;this.hV=g};this.setValueName=function(e){if(typeof KJUR.asn1.x509.OID.name2oidList[e]!="undefined"){var d=KJUR.asn1.x509.OID.name2oidList[e];this.setValueOidString(d)}else{throw"DERObjectIdentifier oidName undefined: "+e}};this.getFreshValueHex=function(){return this.hV};if(typeof c!="undefined"){if(typeof c=="string"&&c.match(/^[0-2].[0-9.]+$/)){this.setValueOidString(c)}else{if(KJUR.asn1.x509.OID.name2oidList[c]!==undefined){this.setValueOidString(KJUR.asn1.x509.OID.name2oidList[c])}else{if(typeof c.oid!="undefined"){this.setValueOidString(c.oid)}else{if(typeof c.hex!="undefined"){this.setValueHex(c.hex)}else{if(typeof c.name!="undefined"){this.setValueName(c.name)}}}}}}};YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier,KJUR.asn1.ASN1Object);KJUR.asn1.DERUTF8String=function(a){KJUR.asn1.DERUTF8String.superclass.constructor.call(this,a);this.hT="0c"};YAHOO.lang.extend(KJUR.asn1.DERUTF8String,KJUR.asn1.DERAbstractString);KJUR.asn1.DERNumericString=function(a){KJUR.asn1.DERNumericString.superclass.constructor.call(this,a);this.hT="12"};YAHOO.lang.extend(KJUR.asn1.DERNumericString,KJUR.asn1.DERAbstractString);KJUR.asn1.DERPrintableString=function(a){KJUR.asn1.DERPrintableString.superclass.constructor.call(this,a);this.hT="13"};YAHOO.lang.extend(KJUR.asn1.DERPrintableString,KJUR.asn1.DERAbstractString);KJUR.asn1.DERTeletexString=function(a){KJUR.asn1.DERTeletexString.superclass.constructor.call(this,a);this.hT="14"};YAHOO.lang.extend(KJUR.asn1.DERTeletexString,KJUR.asn1.DERAbstractString);KJUR.asn1.DERIA5String=function(a){KJUR.asn1.DERIA5String.superclass.constructor.call(this,a);this.hT="16"};YAHOO.lang.extend(KJUR.asn1.DERIA5String,KJUR.asn1.DERAbstractString);KJUR.asn1.DERUTCTime=function(a){KJUR.asn1.DERUTCTime.superclass.constructor.call(this,a);this.hT="17";this.setByDate=function(b){this.hTLV=null;this.isModified=true;this.date=b;this.s=this.formatDate(this.date,"utc");this.hV=stohex(this.s)};this.getFreshValueHex=function(){if(typeof this.date=="undefined"&&typeof this.s=="undefined"){this.date=new Date();this.s=this.formatDate(this.date,"utc");this.hV=stohex(this.s)}return this.hV};if(typeof a!="undefined"){if(typeof a.str!="undefined"){this.setString(a.str)}else{if(typeof a=="string"&&a.match(/^[0-9]{12}Z$/)){this.setString(a)}else{if(typeof a.hex!="undefined"){this.setStringHex(a.hex)}else{if(typeof a.date!="undefined"){this.setByDate(a.date)}}}}}};YAHOO.lang.extend(KJUR.asn1.DERUTCTime,KJUR.asn1.DERAbstractTime);KJUR.asn1.DERGeneralizedTime=function(a){KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this,a);this.hT="18";this.withMillis=false;this.setByDate=function(b){this.hTLV=null;this.isModified=true;this.date=b;this.s=this.formatDate(this.date,"gen",this.withMillis);this.hV=stohex(this.s)};this.getFreshValueHex=function(){if(typeof this.date=="undefined"&&typeof this.s=="undefined"){this.date=new Date();this.s=this.formatDate(this.date,"gen",this.withMillis);this.hV=stohex(this.s)}return this.hV};if(typeof a!="undefined"){if(typeof a.str!="undefined"){this.setString(a.str)}else{if(typeof a=="string"&&a.match(/^[0-9]{14}Z$/)){this.setString(a)}else{if(typeof a.hex!="undefined"){this.setStringHex(a.hex)}else{if(typeof a.date!="undefined"){this.setByDate(a.date)}else{if(a.millis===true){this.withMillis=true}}}}}}};YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime,KJUR.asn1.DERAbstractTime);KJUR.asn1.DERSequence=function(a){KJUR.asn1.DERSequence.superclass.constructor.call(this,a);this.hT="30";this.getFreshValueHex=function(){var c="";for(var b=0;b<this.asn1Array.length;b++){var d=this.asn1Array[b];c+=d.getEncodedHex()}this.hV=c;return this.hV}};YAHOO.lang.extend(KJUR.asn1.DERSequence,KJUR.asn1.DERAbstractStructured);KJUR.asn1.DERSet=function(a){KJUR.asn1.DERSet.superclass.constructor.call(this,a);this.hT="31";this.sortFlag=true;this.getFreshValueHex=function(){var b=new Array();for(var c=0;c<this.asn1Array.length;c++){var d=this.asn1Array[c];b.push(d.getEncodedHex())}if(this.sortFlag==true){b.sort()}this.hV=b.join("");return this.hV};if(typeof a!="undefined"){if(typeof a.sortflag!="undefined"&&a.sortflag==false){this.sortFlag=false}}};YAHOO.lang.extend(KJUR.asn1.DERSet,KJUR.asn1.DERAbstractStructured);KJUR.asn1.DERTaggedObject=function(a){KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);this.hT="a0";this.hV="";this.isExplicit=true;this.asn1Object=null;this.setASN1Object=function(b,c,d){this.hT=c;this.isExplicit=b;this.asn1Object=d;if(this.isExplicit){this.hV=this.asn1Object.getEncodedHex();this.hTLV=null;this.isModified=true}else{this.hV=null;this.hTLV=d.getEncodedHex();this.hTLV=this.hTLV.replace(/^../,c);this.isModified=false}};this.getFreshValueHex=function(){return this.hV};if(typeof a!="undefined"){if(typeof a.tag!="undefined"){this.hT=a.tag}if(typeof a.explicit!="undefined"){this.isExplicit=a.explicit}if(typeof a.obj!="undefined"){this.asn1Object=a.obj;this.setASN1Object(this.isExplicit,this.hT,this.asn1Object)}}};YAHOO.lang.extend(KJUR.asn1.DERTaggedObject,KJUR.asn1.ASN1Object);
/*! asn1hex-1.1.5.js (c) 2012-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var ASN1HEX=new function(){this.getByteLengthOfL_AtObj=function(b,c){if(b.substring(c+2,c+3)!="8"){return 1}var a=parseInt(b.substring(c+3,c+4));if(a==0){return -1}if(0<a&&a<10){return a+1}return -2};this.getHexOfL_AtObj=function(b,c){var a=this.getByteLengthOfL_AtObj(b,c);if(a<1){return""}return b.substring(c+2,c+2+a*2)};this.getIntOfL_AtObj=function(c,d){var b=this.getHexOfL_AtObj(c,d);if(b==""){return -1}var a;if(parseInt(b.substring(0,1))<8){a=new BigInteger(b,16)}else{a=new BigInteger(b.substring(2),16)}return a.intValue()};this.getStartPosOfV_AtObj=function(b,c){var a=this.getByteLengthOfL_AtObj(b,c);if(a<0){return a}return c+(a+1)*2};this.getHexOfV_AtObj=function(c,d){var b=this.getStartPosOfV_AtObj(c,d);var a=this.getIntOfL_AtObj(c,d);return c.substring(b,b+a*2)};this.getHexOfTLV_AtObj=function(c,e){var b=c.substr(e,2);var d=this.getHexOfL_AtObj(c,e);var a=this.getHexOfV_AtObj(c,e);return b+d+a};this.getPosOfNextSibling_AtObj=function(c,d){var b=this.getStartPosOfV_AtObj(c,d);var a=this.getIntOfL_AtObj(c,d);return b+a*2};this.getPosArrayOfChildren_AtObj=function(f,j){var c=new Array();var i=this.getStartPosOfV_AtObj(f,j);c.push(i);var b=this.getIntOfL_AtObj(f,j);var g=i;var d=0;while(1){var e=this.getPosOfNextSibling_AtObj(f,g);if(e==null||(e-i>=(b*2))){break}if(d>=200){break}c.push(e);g=e;d++}return c};this.getNthChildIndex_AtObj=function(d,b,e){var c=this.getPosArrayOfChildren_AtObj(d,b);return c[e]};this.getDecendantIndexByNthList=function(e,d,c){if(c.length==0){return d}var f=c.shift();var b=this.getPosArrayOfChildren_AtObj(e,d);return this.getDecendantIndexByNthList(e,b[f],c)};this.getDecendantHexTLVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfTLV_AtObj(d,a)};this.getDecendantHexVByNthList=function(d,c,b){var a=this.getDecendantIndexByNthList(d,c,b);return this.getHexOfV_AtObj(d,a)}};ASN1HEX.getVbyList=function(d,c,b,e){var a=this.getDecendantIndexByNthList(d,c,b);if(a===undefined){throw"can't find nthList object"}if(e!==undefined){if(d.substr(a,2)!=e){throw"checking tag doesn't match: "+d.substr(a,2)+"!="+e}}return this.getHexOfV_AtObj(d,a)};ASN1HEX.hextooidstr=function(e){var h=function(b,a){if(b.length>=a){return b}return new Array(a-b.length+1).join("0")+b};var l=[];var o=e.substr(0,2);var f=parseInt(o,16);l[0]=new String(Math.floor(f/40));l[1]=new String(f%40);var m=e.substr(2);var k=[];for(var g=0;g<m.length/2;g++){k.push(parseInt(m.substr(g*2,2),16))}var j=[];var d="";for(var g=0;g<k.length;g++){if(k[g]&128){d=d+h((k[g]&127).toString(2),7)}else{d=d+h((k[g]&127).toString(2),7);j.push(new String(parseInt(d,2)));d=""}}var n=l.join(".");if(j.length>0){n=n+"."+j.join(".")}return n};
/*! asn1x509-1.0.9.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}if(typeof KJUR.asn1.x509=="undefined"||!KJUR.asn1.x509){KJUR.asn1.x509={}}KJUR.asn1.x509.Certificate=function(g){KJUR.asn1.x509.Certificate.superclass.constructor.call(this);var b=null;var d=null;var f=null;var c=null;var a=null;var e=null;this.setRsaPrvKeyByPEMandPass=function(i,k){var h=PKCS5PKEY.getDecryptedKeyHex(i,k);var j=new RSAKey();j.readPrivateKeyFromASN1HexString(h);this.prvKey=j};this.sign=function(){this.asn1SignatureAlg=this.asn1TBSCert.asn1SignatureAlg;sig=new KJUR.crypto.Signature({alg:"SHA1withRSA"});sig.init(this.prvKey);sig.updateHex(this.asn1TBSCert.getEncodedHex());this.hexSig=sig.sign();this.asn1Sig=new KJUR.asn1.DERBitString({hex:"00"+this.hexSig});var h=new KJUR.asn1.DERSequence({array:[this.asn1TBSCert,this.asn1SignatureAlg,this.asn1Sig]});this.hTLV=h.getEncodedHex();this.isModified=false};this.setSignatureHex=function(h){this.asn1SignatureAlg=this.asn1TBSCert.asn1SignatureAlg;this.hexSig=h;this.asn1Sig=new KJUR.asn1.DERBitString({hex:"00"+this.hexSig});var i=new KJUR.asn1.DERSequence({array:[this.asn1TBSCert,this.asn1SignatureAlg,this.asn1Sig]});this.hTLV=i.getEncodedHex();this.isModified=false};this.getEncodedHex=function(){if(this.isModified==false&&this.hTLV!=null){return this.hTLV}throw"not signed yet"};this.getPEMString=function(){var j=this.getEncodedHex();var h=CryptoJS.enc.Hex.parse(j);var i=CryptoJS.enc.Base64.stringify(h);var k=i.replace(/(.{64})/g,"$1\r\n");return"-----BEGIN CERTIFICATE-----\r\n"+k+"\r\n-----END CERTIFICATE-----\r\n"};if(typeof g!="undefined"){if(typeof g.tbscertobj!="undefined"){this.asn1TBSCert=g.tbscertobj}if(typeof g.prvkeyobj!="undefined"){this.prvKey=g.prvkeyobj}else{if(typeof g.rsaprvkey!="undefined"){this.prvKey=g.rsaprvkey}else{if((typeof g.rsaprvpem!="undefined")&&(typeof g.rsaprvpas!="undefined")){this.setRsaPrvKeyByPEMandPass(g.rsaprvpem,g.rsaprvpas)}}}}};YAHOO.lang.extend(KJUR.asn1.x509.Certificate,KJUR.asn1.ASN1Object);KJUR.asn1.x509.TBSCertificate=function(a){KJUR.asn1.x509.TBSCertificate.superclass.constructor.call(this);this._initialize=function(){this.asn1Array=new Array();this.asn1Version=new KJUR.asn1.DERTaggedObject({obj:new KJUR.asn1.DERInteger({"int":2})});this.asn1SerialNumber=null;this.asn1SignatureAlg=null;this.asn1Issuer=null;this.asn1NotBefore=null;this.asn1NotAfter=null;this.asn1Subject=null;this.asn1SubjPKey=null;this.extensionsArray=new Array()};this.setSerialNumberByParam=function(b){this.asn1SerialNumber=new KJUR.asn1.DERInteger(b)};this.setSignatureAlgByParam=function(b){this.asn1SignatureAlg=new KJUR.asn1.x509.AlgorithmIdentifier(b)};this.setIssuerByParam=function(b){this.asn1Issuer=new KJUR.asn1.x509.X500Name(b)};this.setNotBeforeByParam=function(b){this.asn1NotBefore=new KJUR.asn1.x509.Time(b)};this.setNotAfterByParam=function(b){this.asn1NotAfter=new KJUR.asn1.x509.Time(b)};this.setSubjectByParam=function(b){this.asn1Subject=new KJUR.asn1.x509.X500Name(b)};this.setSubjectPublicKeyByParam=function(b){this.asn1SubjPKey=new KJUR.asn1.x509.SubjectPublicKeyInfo(b)};this.setSubjectPublicKeyByGetKey=function(c){var b=KEYUTIL.getKey(c);this.asn1SubjPKey=new KJUR.asn1.x509.SubjectPublicKeyInfo(b)};this.appendExtension=function(b){this.extensionsArray.push(b)};this.appendExtensionByName=function(d,b){if(d.toLowerCase()=="basicconstraints"){var c=new KJUR.asn1.x509.BasicConstraints(b);this.appendExtension(c)}else{if(d.toLowerCase()=="keyusage"){var c=new KJUR.asn1.x509.KeyUsage(b);this.appendExtension(c)}else{if(d.toLowerCase()=="crldistributionpoints"){var c=new KJUR.asn1.x509.CRLDistributionPoints(b);this.appendExtension(c)}else{if(d.toLowerCase()=="extkeyusage"){var c=new KJUR.asn1.x509.ExtKeyUsage(b);this.appendExtension(c)}else{if(d.toLowerCase()=="authoritykeyidentifier"){var c=new KJUR.asn1.x509.AuthorityKeyIdentifier(b);this.appendExtension(c)}else{throw"unsupported extension name: "+d}}}}}};this.getEncodedHex=function(){if(this.asn1NotBefore==null||this.asn1NotAfter==null){throw"notBefore and/or notAfter not set"}var c=new KJUR.asn1.DERSequence({array:[this.asn1NotBefore,this.asn1NotAfter]});this.asn1Array=new Array();this.asn1Array.push(this.asn1Version);this.asn1Array.push(this.asn1SerialNumber);this.asn1Array.push(this.asn1SignatureAlg);this.asn1Array.push(this.asn1Issuer);this.asn1Array.push(c);this.asn1Array.push(this.asn1Subject);this.asn1Array.push(this.asn1SubjPKey);if(this.extensionsArray.length>0){var d=new KJUR.asn1.DERSequence({array:this.extensionsArray});var b=new KJUR.asn1.DERTaggedObject({explicit:true,tag:"a3",obj:d});this.asn1Array.push(b)}var e=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=e.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate,KJUR.asn1.ASN1Object);KJUR.asn1.x509.Extension=function(b){KJUR.asn1.x509.Extension.superclass.constructor.call(this);var a=null;this.getEncodedHex=function(){var f=new KJUR.asn1.DERObjectIdentifier({oid:this.oid});var e=new KJUR.asn1.DEROctetString({hex:this.getExtnValueHex()});var d=new Array();d.push(f);if(this.critical){d.push(new KJUR.asn1.DERBoolean())}d.push(e);var c=new KJUR.asn1.DERSequence({array:d});return c.getEncodedHex()};this.critical=false;if(typeof b!="undefined"){if(typeof b.critical!="undefined"){this.critical=b.critical}}};YAHOO.lang.extend(KJUR.asn1.x509.Extension,KJUR.asn1.ASN1Object);KJUR.asn1.x509.KeyUsage=function(a){KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.15";if(typeof a!="undefined"){if(typeof a.bin!="undefined"){this.asn1ExtnValue=new KJUR.asn1.DERBitString(a)}}};YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage,KJUR.asn1.x509.Extension);KJUR.asn1.x509.BasicConstraints=function(c){KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this,c);var a=false;var b=-1;this.getExtnValueHex=function(){var e=new Array();if(this.cA){e.push(new KJUR.asn1.DERBoolean())}if(this.pathLen>-1){e.push(new KJUR.asn1.DERInteger({"int":this.pathLen}))}var d=new KJUR.asn1.DERSequence({array:e});this.asn1ExtnValue=d;return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.19";this.cA=false;this.pathLen=-1;if(typeof c!="undefined"){if(typeof c.cA!="undefined"){this.cA=c.cA}if(typeof c.pathLen!="undefined"){this.pathLen=c.pathLen}}};YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.CRLDistributionPoints=function(a){KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this,a);this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.setByDPArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence({array:b})};this.setByOneURI=function(e){var b=new KJUR.asn1.x509.GeneralNames([{uri:e}]);var d=new KJUR.asn1.x509.DistributionPointName(b);var c=new KJUR.asn1.x509.DistributionPoint({dpobj:d});this.setByDPArray([c])};this.oid="2.5.29.31";if(typeof a!="undefined"){if(typeof a.array!="undefined"){this.setByDPArray(a.array)}else{if(typeof a.uri!="undefined"){this.setByOneURI(a.uri)}}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints,KJUR.asn1.x509.Extension);KJUR.asn1.x509.ExtKeyUsage=function(a){KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this,a);this.setPurposeArray=function(b){this.asn1ExtnValue=new KJUR.asn1.DERSequence();for(var c=0;c<b.length;c++){var d=new KJUR.asn1.DERObjectIdentifier(b[c]);this.asn1ExtnValue.appendASN1Object(d)}};this.getExtnValueHex=function(){return this.asn1ExtnValue.getEncodedHex()};this.oid="2.5.29.37";if(typeof a!="undefined"){if(typeof a.array!="undefined"){this.setPurposeArray(a.array)}}};YAHOO.lang.extend(KJUR.asn1.x509.ExtKeyUsage,KJUR.asn1.x509.Extension);KJUR.asn1.x509.AuthorityKeyIdentifier=function(a){KJUR.asn1.x509.AuthorityKeyIdentifier.superclass.constructor.call(this,a);this.asn1KID=null;this.asn1CertIssuer=null;this.asn1CertSN=null;this.getExtnValueHex=function(){var c=new Array();if(this.asn1KID){c.push(new KJUR.asn1.DERTaggedObject({explicit:false,tag:"80",obj:this.asn1KID}))}if(this.asn1CertIssuer){c.push(new KJUR.asn1.DERTaggedObject({explicit:false,tag:"a1",obj:this.asn1CertIssuer}))}if(this.asn1CertSN){c.push(new KJUR.asn1.DERTaggedObject({explicit:false,tag:"82",obj:this.asn1CertSN}))}var b=new KJUR.asn1.DERSequence({array:c});this.asn1ExtnValue=b;return this.asn1ExtnValue.getEncodedHex()};this.setKIDByParam=function(b){this.asn1KID=new KJUR.asn1.DEROctetString(b)};this.setCertIssuerByParam=function(b){this.asn1CertIssuer=new KJUR.asn1.x509.X500Name(b)};this.setCertSNByParam=function(b){this.asn1CertSN=new KJUR.asn1.DERInteger(b)};this.oid="2.5.29.35";if(typeof a!="undefined"){if(typeof a.kid!="undefined"){this.setKIDByParam(a.kid)}if(typeof a.issuer!="undefined"){this.setCertIssuerByParam(a.issuer)}if(typeof a.sn!="undefined"){this.setCertSNByParam(a.sn)}}};YAHOO.lang.extend(KJUR.asn1.x509.AuthorityKeyIdentifier,KJUR.asn1.x509.Extension);KJUR.asn1.x509.CRL=function(f){KJUR.asn1.x509.CRL.superclass.constructor.call(this);var a=null;var c=null;var e=null;var b=null;var d=null;this.setRsaPrvKeyByPEMandPass=function(h,j){var g=PKCS5PKEY.getDecryptedKeyHex(h,j);var i=new RSAKey();i.readPrivateKeyFromASN1HexString(g);this.rsaPrvKey=i};this.sign=function(){this.asn1SignatureAlg=this.asn1TBSCertList.asn1SignatureAlg;sig=new KJUR.crypto.Signature({alg:"SHA1withRSA",prov:"cryptojs/jsrsa"});sig.initSign(this.rsaPrvKey);sig.updateHex(this.asn1TBSCertList.getEncodedHex());this.hexSig=sig.sign();this.asn1Sig=new KJUR.asn1.DERBitString({hex:"00"+this.hexSig});var g=new KJUR.asn1.DERSequence({array:[this.asn1TBSCertList,this.asn1SignatureAlg,this.asn1Sig]});this.hTLV=g.getEncodedHex();this.isModified=false};this.getEncodedHex=function(){if(this.isModified==false&&this.hTLV!=null){return this.hTLV}throw"not signed yet"};this.getPEMString=function(){var i=this.getEncodedHex();var g=CryptoJS.enc.Hex.parse(i);var h=CryptoJS.enc.Base64.stringify(g);var j=h.replace(/(.{64})/g,"$1\r\n");return"-----BEGIN X509 CRL-----\r\n"+j+"\r\n-----END X509 CRL-----\r\n"};if(typeof f!="undefined"){if(typeof f.tbsobj!="undefined"){this.asn1TBSCertList=f.tbsobj}if(typeof f.rsaprvkey!="undefined"){this.rsaPrvKey=f.rsaprvkey}if((typeof f.rsaprvpem!="undefined")&&(typeof f.rsaprvpas!="undefined")){this.setRsaPrvKeyByPEMandPass(f.rsaprvpem,f.rsaprvpas)}}};YAHOO.lang.extend(KJUR.asn1.x509.CRL,KJUR.asn1.ASN1Object);KJUR.asn1.x509.TBSCertList=function(b){KJUR.asn1.x509.TBSCertList.superclass.constructor.call(this);var a=null;this.setSignatureAlgByParam=function(c){this.asn1SignatureAlg=new KJUR.asn1.x509.AlgorithmIdentifier(c)};this.setIssuerByParam=function(c){this.asn1Issuer=new KJUR.asn1.x509.X500Name(c)};this.setThisUpdateByParam=function(c){this.asn1ThisUpdate=new KJUR.asn1.x509.Time(c)};this.setNextUpdateByParam=function(c){this.asn1NextUpdate=new KJUR.asn1.x509.Time(c)};this.addRevokedCert=function(c,d){var f={};if(c!=undefined&&c!=null){f.sn=c}if(d!=undefined&&d!=null){f.time=d}var e=new KJUR.asn1.x509.CRLEntry(f);this.aRevokedCert.push(e)};this.getEncodedHex=function(){this.asn1Array=new Array();if(this.asn1Version!=null){this.asn1Array.push(this.asn1Version)}this.asn1Array.push(this.asn1SignatureAlg);this.asn1Array.push(this.asn1Issuer);this.asn1Array.push(this.asn1ThisUpdate);if(this.asn1NextUpdate!=null){this.asn1Array.push(this.asn1NextUpdate)}if(this.aRevokedCert.length>0){var c=new KJUR.asn1.DERSequence({array:this.aRevokedCert});this.asn1Array.push(c)}var d=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=d.getEncodedHex();this.isModified=false;return this.hTLV};this._initialize=function(){this.asn1Version=null;this.asn1SignatureAlg=null;this.asn1Issuer=null;this.asn1ThisUpdate=null;this.asn1NextUpdate=null;this.aRevokedCert=new Array()};this._initialize()};YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList,KJUR.asn1.ASN1Object);KJUR.asn1.x509.CRLEntry=function(c){KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);var b=null;var a=null;this.setCertSerial=function(d){this.sn=new KJUR.asn1.DERInteger(d)};this.setRevocationDate=function(d){this.time=new KJUR.asn1.x509.Time(d)};this.getEncodedHex=function(){var d=new KJUR.asn1.DERSequence({array:[this.sn,this.time]});this.TLV=d.getEncodedHex();return this.TLV};if(typeof c!="undefined"){if(typeof c.time!="undefined"){this.setRevocationDate(c.time)}if(typeof c.sn!="undefined"){this.setCertSerial(c.sn)}}};YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry,KJUR.asn1.ASN1Object);KJUR.asn1.x509.X500Name=function(b){KJUR.asn1.x509.X500Name.superclass.constructor.call(this);this.asn1Array=new Array();this.setByString=function(c){var d=c.split("/");d.shift();for(var e=0;e<d.length;e++){this.asn1Array.push(new KJUR.asn1.x509.RDN({str:d[e]}))}};this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}var c=new KJUR.asn1.DERSequence({array:this.asn1Array});this.hTLV=c.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.str!="undefined"){this.setByString(b.str)}if(typeof b.certissuer!="undefined"){var a=new X509();a.hex=X509.pemToHex(b.certissuer);this.hTLV=a.getIssuerHex()}if(typeof b.certsubject!="undefined"){var a=new X509();a.hex=X509.pemToHex(b.certsubject);this.hTLV=a.getSubjectHex()}}};YAHOO.lang.extend(KJUR.asn1.x509.X500Name,KJUR.asn1.ASN1Object);KJUR.asn1.x509.RDN=function(a){KJUR.asn1.x509.RDN.superclass.constructor.call(this);this.asn1Array=new Array();this.addByString=function(b){this.asn1Array.push(new KJUR.asn1.x509.AttributeTypeAndValue({str:b}))};this.getEncodedHex=function(){var b=new KJUR.asn1.DERSet({array:this.asn1Array});this.TLV=b.getEncodedHex();return this.TLV};if(typeof a!="undefined"){if(typeof a.str!="undefined"){this.addByString(a.str)}}};YAHOO.lang.extend(KJUR.asn1.x509.RDN,KJUR.asn1.ASN1Object);KJUR.asn1.x509.AttributeTypeAndValue=function(b){KJUR.asn1.x509.AttributeTypeAndValue.superclass.constructor.call(this);var d=null;var c=null;var a="utf8";this.setByString=function(e){if(e.match(/^([^=]+)=(.+)$/)){this.setByAttrTypeAndValueStr(RegExp.$1,RegExp.$2)}else{throw"malformed attrTypeAndValueStr: "+e}};this.setByAttrTypeAndValueStr=function(g,f){this.typeObj=KJUR.asn1.x509.OID.atype2obj(g);var e=a;if(g=="C"){e="prn"}this.valueObj=this.getValueObj(e,f)};this.getValueObj=function(f,e){if(f=="utf8"){return new KJUR.asn1.DERUTF8String({str:e})}if(f=="prn"){return new KJUR.asn1.DERPrintableString({str:e})}if(f=="tel"){return new KJUR.asn1.DERTeletexString({str:e})}if(f=="ia5"){return new KJUR.asn1.DERIA5String({str:e})}throw"unsupported directory string type: type="+f+" value="+e};this.getEncodedHex=function(){var e=new KJUR.asn1.DERSequence({array:[this.typeObj,this.valueObj]});this.TLV=e.getEncodedHex();return this.TLV};if(typeof b!="undefined"){if(typeof b.str!="undefined"){this.setByString(b.str)}}};YAHOO.lang.extend(KJUR.asn1.x509.AttributeTypeAndValue,KJUR.asn1.ASN1Object);KJUR.asn1.x509.SubjectPublicKeyInfo=function(d){KJUR.asn1.x509.SubjectPublicKeyInfo.superclass.constructor.call(this);var b=null;var c=null;var a=null;this.setRSAKey=function(e){if(!RSAKey.prototype.isPrototypeOf(e)){throw"argument is not RSAKey instance"}this.rsaKey=e;var g=new KJUR.asn1.DERInteger({bigint:e.n});var f=new KJUR.asn1.DERInteger({"int":e.e});var i=new KJUR.asn1.DERSequence({array:[g,f]});var h=i.getEncodedHex();this.asn1AlgId=new KJUR.asn1.x509.AlgorithmIdentifier({name:"rsaEncryption"});this.asn1SubjPKey=new KJUR.asn1.DERBitString({hex:"00"+h})};this.setRSAPEM=function(g){if(g.match(/-----BEGIN PUBLIC KEY-----/)){var n=g;n=n.replace(/^-----[^-]+-----/,"");n=n.replace(/-----[^-]+-----\s*$/,"");var m=n.replace(/\s+/g,"");var f=CryptoJS.enc.Base64.parse(m);var i=CryptoJS.enc.Hex.stringify(f);var k=_rsapem_getHexValueArrayOfChildrenFromHex(i);var h=k[1];var l=h.substr(2);var e=_rsapem_getHexValueArrayOfChildrenFromHex(l);var j=new RSAKey();j.setPublic(e[0],e[1]);this.setRSAKey(j)}else{throw"key not supported"}};this.getASN1Object=function(){if(this.asn1AlgId==null||this.asn1SubjPKey==null){throw"algId and/or subjPubKey not set"}var e=new KJUR.asn1.DERSequence({array:[this.asn1AlgId,this.asn1SubjPKey]});return e};this.getEncodedHex=function(){var e=this.getASN1Object();this.hTLV=e.getEncodedHex();return this.hTLV};this._setRSAKey=function(e){var g=KJUR.asn1.ASN1Util.newObject({seq:[{"int":{bigint:e.n}},{"int":{"int":e.e}}]});var f=g.getEncodedHex();this.asn1AlgId=new KJUR.asn1.x509.AlgorithmIdentifier({name:"rsaEncryption"});this.asn1SubjPKey=new KJUR.asn1.DERBitString({hex:"00"+f})};this._setEC=function(e){var f=new KJUR.asn1.DERObjectIdentifier({name:e.curveName});this.asn1AlgId=new KJUR.asn1.x509.AlgorithmIdentifier({name:"ecPublicKey",asn1params:f});this.asn1SubjPKey=new KJUR.asn1.DERBitString({hex:"00"+e.pubKeyHex})};this._setDSA=function(e){var f=new KJUR.asn1.ASN1Util.newObject({seq:[{"int":{bigint:e.p}},{"int":{bigint:e.q}},{"int":{bigint:e.g}}]});this.asn1AlgId=new KJUR.asn1.x509.AlgorithmIdentifier({name:"dsa",asn1params:f});var g=new KJUR.asn1.DERInteger({bigint:e.y});this.asn1SubjPKey=new KJUR.asn1.DERBitString({hex:"00"+g.getEncodedHex()})};if(typeof d!="undefined"){if(typeof RSAKey!="undefined"&&d instanceof RSAKey){this._setRSAKey(d)}else{if(typeof KJUR.crypto.ECDSA!="undefined"&&d instanceof KJUR.crypto.ECDSA){this._setEC(d)}else{if(typeof KJUR.crypto.DSA!="undefined"&&d instanceof KJUR.crypto.DSA){this._setDSA(d)}else{if(typeof d.rsakey!="undefined"){this.setRSAKey(d.rsakey)}else{if(typeof d.rsapem!="undefined"){this.setRSAPEM(d.rsapem)}}}}}}};YAHOO.lang.extend(KJUR.asn1.x509.SubjectPublicKeyInfo,KJUR.asn1.ASN1Object);KJUR.asn1.x509.Time=function(c){KJUR.asn1.x509.Time.superclass.constructor.call(this);var b=null;var a=null;this.setTimeParams=function(d){this.timeParams=d};this.getEncodedHex=function(){var d=null;if(this.timeParams!=null){if(this.type=="utc"){d=new KJUR.asn1.DERUTCTime(this.timeParams)}else{d=new KJUR.asn1.DERGeneralizedTime(this.timeParams)}}else{if(this.type=="utc"){d=new KJUR.asn1.DERUTCTime()}else{d=new KJUR.asn1.DERGeneralizedTime()}}this.TLV=d.getEncodedHex();return this.TLV};this.type="utc";if(typeof c!="undefined"){if(typeof c.type!="undefined"){this.type=c.type}else{if(typeof c.str!="undefined"){if(c.str.match(/^[0-9]{12}Z$/)){this.type="utc"}if(c.str.match(/^[0-9]{14}Z$/)){this.type="gen"}}}this.timeParams=c}};YAHOO.lang.extend(KJUR.asn1.x509.Time,KJUR.asn1.ASN1Object);KJUR.asn1.x509.AlgorithmIdentifier=function(e){KJUR.asn1.x509.AlgorithmIdentifier.superclass.constructor.call(this);var a=null;var d=null;var b=null;var c=false;this.getEncodedHex=function(){if(this.nameAlg==null&&this.asn1Alg==null){throw"algorithm not specified"}if(this.nameAlg!=null&&this.asn1Alg==null){this.asn1Alg=KJUR.asn1.x509.OID.name2obj(this.nameAlg)}var f=[this.asn1Alg];if(!this.paramEmpty){f.push(this.asn1Params)}var g=new KJUR.asn1.DERSequence({array:f});this.hTLV=g.getEncodedHex();return this.hTLV};if(typeof e!="undefined"){if(typeof e.name!="undefined"){this.nameAlg=e.name}if(typeof e.asn1params!="undefined"){this.asn1Params=e.asn1params}if(typeof e.paramempty!="undefined"){this.paramEmpty=e.paramempty}}if(this.asn1Params==null){this.asn1Params=new KJUR.asn1.DERNull()}};YAHOO.lang.extend(KJUR.asn1.x509.AlgorithmIdentifier,KJUR.asn1.ASN1Object);KJUR.asn1.x509.GeneralName=function(d){KJUR.asn1.x509.GeneralName.superclass.constructor.call(this);var c=null;var b=null;var a={rfc822:"81",dns:"82",uri:"86"};this.setByParam=function(g){var f=null;var e=null;if(typeof g.rfc822!="undefined"){this.type="rfc822";e=new KJUR.asn1.DERIA5String({str:g[this.type]})}if(typeof g.dns!="undefined"){this.type="dns";e=new KJUR.asn1.DERIA5String({str:g[this.type]})}if(typeof g.uri!="undefined"){this.type="uri";e=new KJUR.asn1.DERIA5String({str:g[this.type]})}if(this.type==null){throw"unsupported type in params="+g}this.asn1Obj=new KJUR.asn1.DERTaggedObject({explicit:false,tag:a[this.type],obj:e})};this.getEncodedHex=function(){return this.asn1Obj.getEncodedHex()};if(typeof d!="undefined"){this.setByParam(d)}};YAHOO.lang.extend(KJUR.asn1.x509.GeneralName,KJUR.asn1.ASN1Object);KJUR.asn1.x509.GeneralNames=function(b){KJUR.asn1.x509.GeneralNames.superclass.constructor.call(this);var a=null;this.setByParamArray=function(e){for(var c=0;c<e.length;c++){var d=new KJUR.asn1.x509.GeneralName(e[c]);this.asn1Array.push(d)}};this.getEncodedHex=function(){var c=new KJUR.asn1.DERSequence({array:this.asn1Array});return c.getEncodedHex()};this.asn1Array=new Array();if(typeof b!="undefined"){this.setByParamArray(b)}};YAHOO.lang.extend(KJUR.asn1.x509.GeneralNames,KJUR.asn1.ASN1Object);KJUR.asn1.x509.DistributionPointName=function(b){KJUR.asn1.x509.DistributionPointName.superclass.constructor.call(this);var e=null;var c=null;var a=null;var d=null;this.getEncodedHex=function(){if(this.type!="full"){throw"currently type shall be 'full': "+this.type}this.asn1Obj=new KJUR.asn1.DERTaggedObject({explicit:false,tag:this.tag,obj:this.asn1V});this.hTLV=this.asn1Obj.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(KJUR.asn1.x509.GeneralNames.prototype.isPrototypeOf(b)){this.type="full";this.tag="a0";this.asn1V=b}else{throw"This class supports GeneralNames only as argument"}}};YAHOO.lang.extend(KJUR.asn1.x509.DistributionPointName,KJUR.asn1.ASN1Object);KJUR.asn1.x509.DistributionPoint=function(b){KJUR.asn1.x509.DistributionPoint.superclass.constructor.call(this);var a=null;this.getEncodedHex=function(){var c=new KJUR.asn1.DERSequence();if(this.asn1DP!=null){var d=new KJUR.asn1.DERTaggedObject({explicit:true,tag:"a0",obj:this.asn1DP});c.appendASN1Object(d)}this.hTLV=c.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.dpobj!="undefined"){this.asn1DP=b.dpobj}}};YAHOO.lang.extend(KJUR.asn1.x509.DistributionPoint,KJUR.asn1.ASN1Object);KJUR.asn1.x509.OID=new function(a){this.atype2oidList={C:"2.5.4.6",O:"2.5.4.10",OU:"2.5.4.11",ST:"2.5.4.8",L:"2.5.4.7",CN:"2.5.4.3",DN:"2.5.4.49",DC:"0.9.2342.19200300.100.1.25",};this.name2oidList={sha1:"1.3.14.3.2.26",sha256:"2.16.840.1.101.3.4.2.1",sha384:"2.16.840.1.101.3.4.2.2",sha512:"2.16.840.1.101.3.4.2.3",sha224:"2.16.840.1.101.3.4.2.4",md5:"1.2.840.113549.2.5",md2:"1.3.14.7.2.2.1",ripemd160:"1.3.36.3.2.1",MD2withRSA:"1.2.840.113549.1.1.2",MD4withRSA:"1.2.840.113549.1.1.3",MD5withRSA:"1.2.840.113549.1.1.4",SHA1withRSA:"1.2.840.113549.1.1.5",SHA224withRSA:"1.2.840.113549.1.1.14",SHA256withRSA:"1.2.840.113549.1.1.11",SHA384withRSA:"1.2.840.113549.1.1.12",SHA512withRSA:"1.2.840.113549.1.1.13",SHA1withECDSA:"1.2.840.10045.4.1",SHA224withECDSA:"1.2.840.10045.4.3.1",SHA256withECDSA:"1.2.840.10045.4.3.2",SHA384withECDSA:"1.2.840.10045.4.3.3",SHA512withECDSA:"1.2.840.10045.4.3.4",dsa:"1.2.840.10040.4.1",SHA1withDSA:"1.2.840.10040.4.3",SHA224withDSA:"2.16.840.1.101.3.4.3.1",SHA256withDSA:"2.16.840.1.101.3.4.3.2",rsaEncryption:"1.2.840.113549.1.1.1",subjectKeyIdentifier:"2.5.29.14",countryName:"2.5.4.6",organization:"2.5.4.10",organizationalUnit:"2.5.4.11",stateOrProvinceName:"2.5.4.8",locality:"2.5.4.7",commonName:"2.5.4.3",keyUsage:"2.5.29.15",basicConstraints:"2.5.29.19",cRLDistributionPoints:"2.5.29.31",certificatePolicies:"2.5.29.32",authorityKeyIdentifier:"2.5.29.35",extKeyUsage:"2.5.29.37",anyExtendedKeyUsage:"2.5.29.37.0",serverAuth:"1.3.6.1.5.5.7.3.1",clientAuth:"1.3.6.1.5.5.7.3.2",codeSigning:"1.3.6.1.5.5.7.3.3",emailProtection:"1.3.6.1.5.5.7.3.4",timeStamping:"1.3.6.1.5.5.7.3.8",ocspSigning:"1.3.6.1.5.5.7.3.9",ecPublicKey:"1.2.840.10045.2.1",secp256r1:"1.2.840.10045.3.1.7",secp256k1:"1.3.132.0.10",secp384r1:"1.3.132.0.34",pkcs5PBES2:"1.2.840.113549.1.5.13",pkcs5PBKDF2:"1.2.840.113549.1.5.12","des-EDE3-CBC":"1.2.840.113549.3.7",data:"1.2.840.113549.1.7.1","signed-data":"1.2.840.113549.1.7.2","enveloped-data":"1.2.840.113549.1.7.3","digested-data":"1.2.840.113549.1.7.5","encrypted-data":"1.2.840.113549.1.7.6","authenticated-data":"1.2.840.113549.1.9.16.1.2",tstinfo:"1.2.840.113549.1.9.16.1.4",};this.objCache={};this.name2obj=function(b){if(typeof this.objCache[b]!="undefined"){return this.objCache[b]}if(typeof this.name2oidList[b]=="undefined"){throw"Name of ObjectIdentifier not defined: "+b}var c=this.name2oidList[b];var d=new KJUR.asn1.DERObjectIdentifier({oid:c});this.objCache[b]=d;return d};this.atype2obj=function(b){if(typeof this.objCache[b]!="undefined"){return this.objCache[b]}if(typeof this.atype2oidList[b]=="undefined"){throw"AttributeType name undefined: "+b}var c=this.atype2oidList[b];var d=new KJUR.asn1.DERObjectIdentifier({oid:c});this.objCache[b]=d;return d}};KJUR.asn1.x509.OID.oid2name=function(b){var c=KJUR.asn1.x509.OID.name2oidList;for(var a in c){if(c[a]==b){return a}}return""};KJUR.asn1.x509.X509Util=new function(){this.getPKCS8PubKeyPEMfromRSAKey=function(i){var h=null;var f=KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(i.n);var j=KJUR.asn1.ASN1Util.integerToByteHex(i.e);var a=new KJUR.asn1.DERInteger({hex:f});var g=new KJUR.asn1.DERInteger({hex:j});var l=new KJUR.asn1.DERSequence({array:[a,g]});var c=l.getEncodedHex();var d=new KJUR.asn1.x509.AlgorithmIdentifier({name:"rsaEncryption"});var b=new KJUR.asn1.DERBitString({hex:"00"+c});var k=new KJUR.asn1.DERSequence({array:[d,b]});var e=k.getEncodedHex();var h=KJUR.asn1.ASN1Util.getPEMStringFromHex(e,"PUBLIC KEY");return h}};KJUR.asn1.x509.X509Util.newCertPEM=function(f){var c=KJUR.asn1.x509;var e=new c.TBSCertificate();if(f.serial!==undefined){e.setSerialNumberByParam(f.serial)}else{throw"serial number undefined."}if(typeof f.sigalg.name=="string"){e.setSignatureAlgByParam(f.sigalg)}else{throw"unproper signature algorithm name"}if(f.issuer!==undefined){e.setIssuerByParam(f.issuer)}else{throw"issuer name undefined."}if(f.notbefore!==undefined){e.setNotBeforeByParam(f.notbefore)}else{throw"notbefore undefined."}if(f.notafter!==undefined){e.setNotAfterByParam(f.notafter)}else{throw"notafter undefined."}if(f.subject!==undefined){e.setSubjectByParam(f.subject)}else{throw"subject name undefined."}if(f.sbjpubkey!==undefined){e.setSubjectPublicKeyByGetKey(f.sbjpubkey)}else{throw"subject public key undefined."}if(f.ext!==undefined&&f.ext.length!==undefined){for(var b=0;b<f.ext.length;b++){for(key in f.ext[b]){e.appendExtensionByName(key,f.ext[b][key])}}}if(f.cakey===undefined&&f.sighex===undefined){throw"param cakey and sighex undefined."}var d=null;var a=null;if(f.cakey){d=KEYUTIL.getKey.apply(null,f.cakey);a=new c.Certificate({tbscertobj:e,prvkeyobj:d});a.sign()}if(f.sighex){a=new c.Certificate({tbscertobj:e});a.setSignatureHex(f.sighex)}return a.getPEMString()};
/*! asn1cms-1.0.2.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}if(typeof KJUR.asn1.cms=="undefined"||!KJUR.asn1.cms){KJUR.asn1.cms={}}KJUR.asn1.cms.Attribute=function(b){KJUR.asn1.cms.Attribute.superclass.constructor.call(this);var a=[];this.getEncodedHex=function(){var f,e,c;f=new KJUR.asn1.DERObjectIdentifier({oid:this.attrTypeOid});e=new KJUR.asn1.DERSet({array:this.valueList});try{e.getEncodedHex()}catch(d){throw"fail valueSet.getEncodedHex in Attribute(1)/"+d}c=new KJUR.asn1.DERSequence({array:[f,e]});try{this.hTLV=c.getEncodedHex()}catch(d){throw"failed seq.getEncodedHex in Attribute(2)/"+d}return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.Attribute,KJUR.asn1.ASN1Object);KJUR.asn1.cms.ContentType=function(b){KJUR.asn1.cms.ContentType.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.3";var a=null;if(typeof b!="undefined"){var a=new KJUR.asn1.DERObjectIdentifier(b);this.valueList=[a]}};YAHOO.lang.extend(KJUR.asn1.cms.ContentType,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.MessageDigest=function(e){KJUR.asn1.cms.MessageDigest.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.4";if(typeof e!="undefined"){if(e.eciObj instanceof KJUR.asn1.cms.EncapsulatedContentInfo&&typeof e.hashAlg=="string"){var b=e.eciObj.eContentValueHex;var a=e.hashAlg;var c=KJUR.crypto.Util.hashHex(b,a);var d=new KJUR.asn1.DEROctetString({hex:c});d.getEncodedHex();this.valueList=[d]}else{var d=new KJUR.asn1.DEROctetString(e);d.getEncodedHex();this.valueList=[d]}}};YAHOO.lang.extend(KJUR.asn1.cms.MessageDigest,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.SigningTime=function(c){KJUR.asn1.cms.SigningTime.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.5";if(typeof c!="undefined"){var a=new KJUR.asn1.x509.Time(c);try{a.getEncodedHex()}catch(b){throw"SigningTime.getEncodedHex() failed/"+b}this.valueList=[a]}};YAHOO.lang.extend(KJUR.asn1.cms.SigningTime,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.SigningCertificate=function(d){KJUR.asn1.cms.SigningCertificate.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.12";var a=KJUR.asn1;var c=KJUR.asn1.cms;var b=KJUR.crypto;this.setCerts=function(l){var j=[];for(var h=0;h<l.length;h++){var f=KEYUTIL.getHexFromPEM(l[h]);var e=b.Util.hashHex(f,"sha1");var m=new a.DEROctetString({hex:e});m.getEncodedHex();var k=new c.IssuerAndSerialNumber({cert:l[h]});k.getEncodedHex();var n=new a.DERSequence({array:[m,k]});n.getEncodedHex();j.push(n)}var g=new a.DERSequence({array:j});g.getEncodedHex();this.valueList=[g]};if(typeof d!="undefined"){if(typeof d.array=="object"){this.setCerts(d.array)}}};YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificate,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.SigningCertificateV2=function(e){KJUR.asn1.cms.SigningCertificateV2.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.47";var b=KJUR.asn1;var f=KJUR.asn1.x509;var d=KJUR.asn1.cms;var c=KJUR.crypto;this.setCerts=function(p,h){var n=[];for(var l=0;l<p.length;l++){var j=KEYUTIL.getHexFromPEM(p[l]);var r=[];if(h!="sha256"){r.push(new f.AlgorithmIdentifier({name:h}))}var g=c.Util.hashHex(j,h);var q=new b.DEROctetString({hex:g});q.getEncodedHex();r.push(q);var m=new d.IssuerAndSerialNumber({cert:p[l]});m.getEncodedHex();r.push(m);var o=new b.DERSequence({array:r});o.getEncodedHex();n.push(o)}var k=new b.DERSequence({array:n});k.getEncodedHex();this.valueList=[k]};if(typeof e!="undefined"){if(typeof e.array=="object"){var a="sha256";if(typeof e.hashAlg=="string"){a=e.hashAlg}this.setCerts(e.array,a)}}};YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificateV2,KJUR.asn1.cms.Attribute);KJUR.asn1.cms.IssuerAndSerialNumber=function(c){KJUR.asn1.cms.IssuerAndSerialNumber.superclass.constructor.call(this);var e=null;var b=null;var a=KJUR.asn1;var d=a.x509;this.setByCertPEM=function(i){var g=KEYUTIL.getHexFromPEM(i);var f=new X509();f.hex=g;var j=f.getIssuerHex();this.dIssuer=new d.X500Name();this.dIssuer.hTLV=j;var h=f.getSerialNumberHex();this.dSerial=new a.DERInteger({hex:h})};this.getEncodedHex=function(){var f=new KJUR.asn1.DERSequence({array:[this.dIssuer,this.dSerial]});this.hTLV=f.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c=="string"&&c.indexOf("-----BEGIN ")!=-1){this.setByCertPEM(c)}if(c.issuer&&c.serial){if(c.issuer instanceof KJUR.asn1.x509.X500Name){this.dIssuer=c.issuer}else{this.dIssuer=new KJUR.asn1.x509.X500Name(c.issuer)}if(c.serial instanceof KJUR.asn1.DERInteger){this.dSerial=c.serial}else{this.dSerial=new KJUR.asn1.DERInteger(c.serial)}}if(typeof c.cert=="string"){this.setByCertPEM(c.cert)}}};YAHOO.lang.extend(KJUR.asn1.cms.IssuerAndSerialNumber,KJUR.asn1.ASN1Object);KJUR.asn1.cms.AttributeList=function(a){KJUR.asn1.cms.AttributeList.superclass.constructor.call(this);this.list=new Array();this.sortFlag=true;this.add=function(b){if(b instanceof KJUR.asn1.cms.Attribute){this.list.push(b)}};this.length=function(){return this.list.length};this.clear=function(){this.list=new Array();this.hTLV=null;this.hV=null};this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}var b=new KJUR.asn1.DERSet({array:this.list,sortflag:this.sortFlag});this.hTLV=b.getEncodedHex();return this.hTLV};if(typeof a!="undefined"){if(typeof a.sortflag!="undefined"&&a.sortflag==false){this.sortFlag=false}}};YAHOO.lang.extend(KJUR.asn1.cms.AttributeList,KJUR.asn1.ASN1Object);KJUR.asn1.cms.SignerInfo=function(c){KJUR.asn1.cms.SignerInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dCMSVersion=new a.DERInteger({"int":1});this.dSignerIdentifier=null;this.dDigestAlgorithm=null;this.dSignedAttrs=new b.AttributeList();this.dSigAlg=null;this.dSig=null;this.dUnsignedAttrs=new b.AttributeList();this.setSignerIdentifier=function(f){if(typeof f=="string"&&f.indexOf("CERTIFICATE")!=-1&&f.indexOf("BEGIN")!=-1&&f.indexOf("END")!=-1){var e=f;this.dSignerIdentifier=new b.IssuerAndSerialNumber({cert:f})}};this.setForContentAndHash=function(e){if(typeof e!="undefined"){if(e.eciObj instanceof KJUR.asn1.cms.EncapsulatedContentInfo){this.dSignedAttrs.add(new b.ContentType({oid:"1.2.840.113549.1.7.1"}));this.dSignedAttrs.add(new b.MessageDigest({eciObj:e.eciObj,hashAlg:e.hashAlg}))}if(typeof e.sdObj!="undefined"&&e.sdObj instanceof KJUR.asn1.cms.SignedData){if(e.sdObj.digestAlgNameList.join(":").indexOf(e.hashAlg)==-1){e.sdObj.digestAlgNameList.push(e.hashAlg)}}if(typeof e.hashAlg=="string"){this.dDigestAlgorithm=new d.AlgorithmIdentifier({name:e.hashAlg})}}};this.sign=function(j,f){this.dSigAlg=new d.AlgorithmIdentifier({name:f});var g=this.dSignedAttrs.getEncodedHex();var e=KEYUTIL.getKey(j);var i=new KJUR.crypto.Signature({alg:f});i.init(e);i.updateHex(g);var h=i.sign();this.dSig=new a.DEROctetString({hex:h})};this.addUnsigned=function(e){this.hTLV=null;this.dUnsignedAttrs.hTLV=null;this.dUnsignedAttrs.add(e)};this.getEncodedHex=function(){if(this.dSignedAttrs instanceof KJUR.asn1.cms.AttributeList&&this.dSignedAttrs.length()==0){throw"SignedAttrs length = 0 (empty)"}var e=new a.DERTaggedObject({obj:this.dSignedAttrs,tag:"a0",explicit:false});var h=null;if(this.dUnsignedAttrs.length()>0){h=new a.DERTaggedObject({obj:this.dUnsignedAttrs,tag:"a1",explicit:false})}var g=[this.dCMSVersion,this.dSignerIdentifier,this.dDigestAlgorithm,e,this.dSigAlg,this.dSig,];if(h!=null){g.push(h)}var f=new a.DERSequence({array:g});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.EncapsulatedContentInfo=function(c){KJUR.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dEContentType=new a.DERObjectIdentifier({name:"data"});this.dEContent=null;this.isDetached=false;this.eContentValueHex=null;this.setContentType=function(e){if(e.match(/^[0-2][.][0-9.]+$/)){this.dEContentType=new a.DERObjectIdentifier({oid:e})}else{this.dEContentType=new a.DERObjectIdentifier({name:e})}};this.setContentValue=function(e){if(typeof e!="undefined"){if(typeof e.hex=="string"){this.eContentValueHex=e.hex}else{if(typeof e.str=="string"){this.eContentValueHex=utf8tohex(e.str)}}}};this.setContentValueHex=function(e){this.eContentValueHex=e};this.setContentValueStr=function(e){this.eContentValueHex=utf8tohex(e)};this.getEncodedHex=function(){if(typeof this.eContentValueHex!="string"){throw"eContentValue not yet set"}var g=new a.DEROctetString({hex:this.eContentValueHex});this.dEContent=new a.DERTaggedObject({obj:g,tag:"a0",explicit:true});var e=[this.dEContentType];if(!this.isDetached){e.push(this.dEContent)}var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV}};YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.ContentInfo=function(c){KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dContentType=null;this.dContent=null;this.setContentType=function(e){if(typeof e=="string"){this.dContentType=d.OID.name2obj(e)}};this.getEncodedHex=function(){var f=new a.DERTaggedObject({obj:this.dContent,tag:"a0",explicit:true});var e=new a.DERSequence({array:[this.dContentType,f]});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(c.type){this.setContentType(c.type)}if(c.obj&&c.obj instanceof a.ASN1Object){this.dContent=c.obj}}};YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo,KJUR.asn1.ASN1Object);KJUR.asn1.cms.SignedData=function(c){KJUR.asn1.cms.SignedData.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cms;var d=KJUR.asn1.x509;this.dCMSVersion=new a.DERInteger({"int":1});this.dDigestAlgs=null;this.digestAlgNameList=[];this.dEncapContentInfo=new b.EncapsulatedContentInfo();this.dCerts=null;this.certificateList=[];this.crlList=[];this.signerInfoList=[new b.SignerInfo()];this.addCertificatesByPEM=function(e){var f=KEYUTIL.getHexFromPEM(e);var g=new a.ASN1Object();g.hTLV=f;this.certificateList.push(g)};this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}if(this.dDigestAlgs==null){var k=[];for(var j=0;j<this.digestAlgNameList.length;j++){var h=this.digestAlgNameList[j];var m=new d.AlgorithmIdentifier({name:h});k.push(m)}this.dDigestAlgs=new a.DERSet({array:k})}var e=[this.dCMSVersion,this.dDigestAlgs,this.dEncapContentInfo];if(this.dCerts==null){if(this.certificateList.length>0){var l=new a.DERSet({array:this.certificateList});this.dCerts=new a.DERTaggedObject({obj:l,tag:"a0",explicit:false})}}if(this.dCerts!=null){e.push(this.dCerts)}var g=new a.DERSet({array:this.signerInfoList});e.push(g);var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV};this.getContentInfo=function(){this.getEncodedHex();var e=new b.ContentInfo({type:"signed-data",obj:this});return e};this.getContentInfoEncodedHex=function(){var e=this.getContentInfo();var f=e.getEncodedHex();return f};this.getPEM=function(){var e=this.getContentInfoEncodedHex();var f=a.ASN1Util.getPEMStringFromHex(e,"CMS");return f}};YAHOO.lang.extend(KJUR.asn1.cms.SignedData,KJUR.asn1.ASN1Object);KJUR.asn1.cms.CMSUtil=new function(){};KJUR.asn1.cms.CMSUtil.newSignedData=function(a){var h=KJUR.asn1.cms;var g=KJUR.asn1.cades;var f=new h.SignedData();f.dEncapContentInfo.setContentValue(a.content);if(typeof a.certs=="object"){for(var b=0;b<a.certs.length;b++){f.addCertificatesByPEM(a.certs[b])}}f.signerInfoList=[];for(var b=0;b<a.signerInfos.length;b++){var d=a.signerInfos[b];var c=new h.SignerInfo();c.setSignerIdentifier(d.signerCert);c.setForContentAndHash({sdObj:f,eciObj:f.dEncapContentInfo,hashAlg:d.hashAlg});for(attrName in d.sAttr){var j=d.sAttr[attrName];if(attrName=="SigningTime"){var e=new h.SigningTime(j);c.dSignedAttrs.add(e)}if(attrName=="SigningCertificate"){var e=new h.SigningCertificate(j);c.dSignedAttrs.add(e)}if(attrName=="SigningCertificateV2"){var e=new h.SigningCertificateV2(j);c.dSignedAttrs.add(e)}if(attrName=="SignaturePolicyIdentifier"){var e=new g.SignaturePolicyIdentifier(j);c.dSignedAttrs.add(e)}}c.sign(d.signerPrvKey,d.sigAlg);f.signerInfoList.push(c)}return f};
/*! asn1tsp-1.0.1.js (c) 2014 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}if(typeof KJUR.asn1.tsp=="undefined"||!KJUR.asn1.tsp){KJUR.asn1.tsp={}}KJUR.asn1.tsp.Accuracy=function(b){KJUR.asn1.tsp.Accuracy.superclass.constructor.call(this);var a=KJUR.asn1;this.seconds=null;this.millis=null;this.micros=null;this.getEncodedHex=function(){var e=null;var g=null;var i=null;var c=[];if(this.seconds!=null){e=new a.DERInteger({"int":this.seconds});c.push(e)}if(this.millis!=null){var h=new a.DERInteger({"int":this.millis});g=new a.DERTaggedObject({obj:h,tag:"80",explicit:false});c.push(g)}if(this.micros!=null){var f=new a.DERInteger({"int":this.micros});i=new a.DERTaggedObject({obj:f,tag:"81",explicit:false});c.push(i)}var d=new a.DERSequence({array:c});this.hTLV=d.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.seconds=="number"){this.seconds=b.seconds}if(typeof b.millis=="number"){this.millis=b.millis}if(typeof b.micros=="number"){this.micros=b.micros}}};YAHOO.lang.extend(KJUR.asn1.tsp.Accuracy,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.MessageImprint=function(b){KJUR.asn1.tsp.MessageImprint.superclass.constructor.call(this);var a=KJUR.asn1;var c=KJUR.asn1.x509;this.dHashAlg=null;this.dHashValue=null;this.getEncodedHex=function(){if(typeof this.hTLV=="string"){return this.hTLV}var d=new a.DERSequence({array:[this.dHashAlg,this.dHashValue]});return d.getEncodedHex()};if(typeof b!="undefined"){if(typeof b.hashAlg=="string"){this.dHashAlg=new c.AlgorithmIdentifier({name:b.hashAlg})}if(typeof b.hashValue=="string"){this.dHashValue=new a.DEROctetString({hex:b.hashValue})}}};YAHOO.lang.extend(KJUR.asn1.tsp.MessageImprint,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.TimeStampReq=function(c){KJUR.asn1.tsp.TimeStampReq.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;this.dVersion=new a.DERInteger({"int":1});this.dMessageImprint=null;this.dPolicy=null;this.dNonce=null;this.certReq=true;this.setMessageImprint=function(d){if(d instanceof KJUR.asn1.tsp.MessageImprint){this.dMessageImprint=d;return}if(typeof d=="object"){this.dMessageImprint=new b.MessageImprint(d)}};this.getEncodedHex=function(){if(this.dMessageImprint==null){throw"messageImprint shall be specified"}var d=[this.dVersion,this.dMessageImprint];if(this.dPolicy!=null){d.push(this.dPolicy)}if(this.dNonce!=null){d.push(this.dNonce)}if(this.certReq){d.push(new a.DERBoolean())}var e=new a.DERSequence({array:d});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c.mi=="object"){this.setMessageImprint(c.mi)}if(typeof c.policy=="object"){this.dPolicy=new a.DERObjectIdentifier(c.policy)}if(typeof c.nonce=="object"){this.dNonce=new a.DERInteger(c.nonce)}if(typeof c.certreq=="boolean"){this.certReq=c.certreq}}};YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampReq,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.TSTInfo=function(c){KJUR.asn1.tsp.TSTInfo.superclass.constructor.call(this);var a=KJUR.asn1;var d=KJUR.asn1.x509;var b=KJUR.asn1.tsp;this.dVersion=new a.DERInteger({"int":1});this.dPolicy=null;this.dMessageImprint=null;this.dSerialNumber=null;this.dGenTime=null;this.dAccuracy=null;this.dOrdering=null;this.dNonce=null;this.dTsa=null;this.getEncodedHex=function(){var e=[this.dVersion];if(this.dPolicy==null){throw"policy shall be specified."}e.push(this.dPolicy);if(this.dMessageImprint==null){throw"messageImprint shall be specified."}e.push(this.dMessageImprint);if(this.dSerialNumber==null){throw"serialNumber shall be specified."}e.push(this.dSerialNumber);if(this.dGenTime==null){throw"genTime shall be specified."}e.push(this.dGenTime);if(this.dAccuracy!=null){e.push(this.dAccuracy)}if(this.dOrdering!=null){e.push(this.dOrdering)}if(this.dNonce!=null){e.push(this.dNonce)}if(this.dTsa!=null){e.push(this.dTsa)}var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c.policy=="string"){if(!c.policy.match(/^[0-9.]+$/)){throw"policy shall be oid like 0.1.4.134"}this.dPolicy=new a.DERObjectIdentifier({oid:c.policy})}if(typeof c.messageImprint!="undefined"){this.dMessageImprint=new b.MessageImprint(c.messageImprint)}if(typeof c.serialNumber!="undefined"){this.dSerialNumber=new a.DERInteger(c.serialNumber)}if(typeof c.genTime!="undefined"){this.dGenTime=new a.DERGeneralizedTime(c.genTime)}if(typeof c.accuracy!="undefind"){this.dAccuracy=new b.Accuracy(c.accuracy)}if(typeof c.ordering!="undefined"&&c.ordering==true){this.dOrdering=new a.DERBoolean()}if(typeof c.nonce!="undefined"){this.dNonce=new a.DERInteger(c.nonce)}if(typeof c.tsa!="undefined"){this.dTsa=new d.X500Name(c.tsa)}}};YAHOO.lang.extend(KJUR.asn1.tsp.TSTInfo,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.TimeStampResp=function(c){KJUR.asn1.tsp.TimeStampResp.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;this.dStatus=null;this.dTST=null;this.getEncodedHex=function(){if(this.dStatus==null){throw"status shall be specified"}var d=[this.dStatus];if(this.dTST!=null){d.push(this.dTST)}var e=new a.DERSequence({array:d});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c.status=="object"){this.dStatus=new b.PKIStatusInfo(c.status)}if(typeof c.tst!="undefined"&&c.tst instanceof KJUR.asn1.ASN1Object){this.dTST=c.tst.getContentInfo()}}};YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampResp,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIStatusInfo=function(c){KJUR.asn1.tsp.PKIStatusInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;this.dStatus=null;this.dStatusString=null;this.dFailureInfo=null;this.getEncodedHex=function(){if(this.dStatus==null){throw"status shall be specified"}var d=[this.dStatus];if(this.dStatusString!=null){d.push(this.dStatusString)}if(this.dFailureInfo!=null){d.push(this.dFailureInfo)}var e=new a.DERSequence({array:d});this.hTLV=e.getEncodedHex();return this.hTLV};if(typeof c!="undefined"){if(typeof c.status=="object"){this.dStatus=new b.PKIStatus(c.status)}if(typeof c.statstr=="object"){this.dStatusString=new b.PKIFreeText({array:c.statstr})}if(typeof c.failinfo=="object"){this.dFailureInfo=new b.PKIFailureInfo(c.failinfo)}}};YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatusInfo,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIStatus=function(e){KJUR.asn1.tsp.PKIStatus.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;var d=null;this.getEncodedHex=function(){this.hTLV=this.dStatus.getEncodedHex();return this.hTLV};if(typeof e!="undefined"){if(typeof e.name!="undefined"){var c=b.PKIStatus.valueList;if(typeof c[e.name]=="undefined"){throw"name undefined: "+e.name}this.dStatus=new a.DERInteger({"int":c[e.name]})}else{this.dStatus=new a.DERInteger(e)}}};YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatus,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIStatus.valueList={granted:0,grantedWithMods:1,rejection:2,waiting:3,revocationWarning:4,revocationNotification:5};KJUR.asn1.tsp.PKIFreeText=function(b){KJUR.asn1.tsp.PKIFreeText.superclass.constructor.call(this);var a=KJUR.asn1;this.textList=[];this.getEncodedHex=function(){var c=[];for(var e=0;e<this.textList.length;e++){c.push(new a.DERUTF8String({str:this.textList[e]}))}var d=new a.DERSequence({array:c});this.hTLV=d.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.array=="object"){this.textList=b.array}}};YAHOO.lang.extend(KJUR.asn1.tsp.PKIFreeText,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIFailureInfo=function(d){KJUR.asn1.tsp.PKIFailureInfo.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.tsp;this.value=null;this.getEncodedHex=function(){if(this.value==null){throw"value shall be specified"}var e=new Number(this.value).toString(2);var f=new a.DERBitString();f.setByBinaryString(e);this.hTLV=f.getEncodedHex();return this.hTLV};if(typeof d!="undefined"){if(typeof d.name=="string"){var c=b.PKIFailureInfo.valueList;if(typeof c[d.name]=="undefined"){throw"name undefined: "+d.name}this.value=c[d.name]}else{if(typeof d["int"]=="number"){this.value=d["int"]}}}};YAHOO.lang.extend(KJUR.asn1.tsp.PKIFailureInfo,KJUR.asn1.ASN1Object);KJUR.asn1.tsp.PKIFailureInfo.valueList={badAlg:0,badRequest:2,badDataFormat:5,timeNotAvailable:14,unacceptedPolicy:15,unacceptedExtension:16,addInfoNotAvailable:17,systemFailure:25};KJUR.asn1.tsp.AbstractTSAAdapter=function(a){this.getTSTHex=function(c,b){throw"not implemented yet"}};KJUR.asn1.tsp.SimpleTSAAdapter=function(a){KJUR.asn1.tsp.SimpleTSAAdapter.superclass.constructor.call(this);this.params=null;this.serial=0;this.getTSTHex=function(c,b){var e=KJUR.crypto.Util.hashHex(c,b);this.params.tstInfo.messageImprint={hashAlg:b,hashValue:e};this.params.tstInfo.serialNumber={"int":this.serial++};var d=Math.floor(Math.random()*1000000000);this.params.tstInfo.nonce={"int":d};var f=KJUR.asn1.tsp.TSPUtil.newTimeStampToken(this.params);return f.getContentInfoEncodedHex()};if(typeof a!="undefined"){this.params=a}};YAHOO.lang.extend(KJUR.asn1.tsp.SimpleTSAAdapter,KJUR.asn1.tsp.AbstractTSAAdapter);KJUR.asn1.tsp.FixedTSAAdapter=function(a){KJUR.asn1.tsp.FixedTSAAdapter.superclass.constructor.call(this);this.params=null;this.getTSTHex=function(c,b){var d=KJUR.crypto.Util.hashHex(c,b);this.params.tstInfo.messageImprint={hashAlg:b,hashValue:d};var e=KJUR.asn1.tsp.TSPUtil.newTimeStampToken(this.params);return e.getContentInfoEncodedHex()};if(typeof a!="undefined"){this.params=a}};YAHOO.lang.extend(KJUR.asn1.tsp.FixedTSAAdapter,KJUR.asn1.tsp.AbstractTSAAdapter);KJUR.asn1.tsp.TSPUtil=new function(){};KJUR.asn1.tsp.TSPUtil.newTimeStampToken=function(b){var j=KJUR.asn1.cms;var a=KJUR.asn1.tsp;var g=new j.SignedData();var e=new a.TSTInfo(b.tstInfo);var f=e.getEncodedHex();g.dEncapContentInfo.setContentValue({hex:f});g.dEncapContentInfo.setContentType("tstinfo");if(typeof b.certs=="object"){for(var c=0;c<b.certs.length;c++){g.addCertificatesByPEM(b.certs[c])}}var d=g.signerInfoList[0];d.setSignerIdentifier(b.signerCert);d.setForContentAndHash({sdObj:g,eciObj:g.dEncapContentInfo,hashAlg:b.hashAlg});var h=new j.SigningCertificate({array:[b.signerCert]});d.dSignedAttrs.add(h);d.sign(b.signerPrvKey,b.sigAlg);return g};KJUR.asn1.tsp.TSPUtil.parseTimeStampReq=function(d){var f={};f.certreq=false;var h=ASN1HEX.getPosArrayOfChildren_AtObj(d,0);if(h.length<2){throw"TimeStampReq must have at least 2 items"}var c=ASN1HEX.getHexOfTLV_AtObj(d,h[1]);f.mi=KJUR.asn1.tsp.TSPUtil.parseMessageImprint(c);for(var e=2;e<h.length;e++){var b=h[e];var a=d.substr(b,2);if(a=="06"){var g=ASN1HEX.getHexOfV_AtObj(d,b);f.policy=ASN1HEX.hextooidstr(g)}if(a=="02"){f.nonce=ASN1HEX.getHexOfV_AtObj(d,b)}if(a=="01"){f.certreq=true}}return f};KJUR.asn1.tsp.TSPUtil.parseMessageImprint=function(c){var h={};if(c.substr(0,2)!="30"){throw"head of messageImprint hex shall be '30'"}var a=ASN1HEX.getPosArrayOfChildren_AtObj(c,0);var i=ASN1HEX.getDecendantIndexByNthList(c,0,[0,0]);var d=ASN1HEX.getHexOfV_AtObj(c,i);var e=ASN1HEX.hextooidstr(d);var g=KJUR.asn1.x509.OID.oid2name(e);if(g==""){throw"hashAlg name undefined: "+e}var b=g;var f=ASN1HEX.getDecendantIndexByNthList(c,0,[1]);h.hashAlg=b;h.hashValue=ASN1HEX.getHexOfV_AtObj(c,f);return h};
/*! asn1cades-1.0.0.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.asn1=="undefined"||!KJUR.asn1){KJUR.asn1={}}if(typeof KJUR.asn1.cades=="undefined"||!KJUR.asn1.cades){KJUR.asn1.cades={}}KJUR.asn1.cades.SignaturePolicyIdentifier=function(e){KJUR.asn1.cades.SignaturePolicyIdentifier.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.15";var b=KJUR.asn1;var d=KJUR.asn1.cades;if(typeof e!="undefined"){if(typeof e.oid=="string"&&typeof e.hash=="object"){var f=new b.DERObjectIdentifier({oid:e.oid});var a=new d.OtherHashAlgAndValue(e.hash);var c=new b.DERSequence({array:[f,a]});this.valueList=[c]}}};YAHOO.lang.extend(KJUR.asn1.cades.SignaturePolicyIdentifier,KJUR.asn1.cms.Attribute);KJUR.asn1.cades.OtherHashAlgAndValue=function(b){KJUR.asn1.cades.OtherHashAlgAndValue.superclass.constructor.call(this);var a=KJUR.asn1;var c=KJUR.asn1.x509;this.dAlg=null;this.dHash=null;this.getEncodedHex=function(){var d=new a.DERSequence({array:[this.dAlg,this.dHash]});this.hTLV=d.getEncodedHex();return this.hTLV};if(typeof b!="undefined"){if(typeof b.alg=="string"&&typeof b.hash=="string"){this.dAlg=new c.AlgorithmIdentifier({name:b.alg});this.dHash=new a.DEROctetString({hex:b.hash})}}};YAHOO.lang.extend(KJUR.asn1.cades.OtherHashAlgAndValue,KJUR.asn1.ASN1Object);KJUR.asn1.cades.SignatureTimeStamp=function(c){KJUR.asn1.cades.SignatureTimeStamp.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.14";this.tstHex=null;var a=KJUR.asn1;if(typeof c!="undefined"){if(typeof c.res!="undefined"){if(typeof c.res=="string"&&c.res.match(/^[0-9A-Fa-f]+$/)){}else{if(c.res instanceof KJUR.asn1.ASN1Object){}else{throw"res param shall be ASN1Object or hex string"}}}if(typeof c.tst!="undefined"){if(typeof c.tst=="string"&&c.tst.match(/^[0-9A-Fa-f]+$/)){var b=new a.ASN1Object();this.tstHex=c.tst;b.hTLV=this.tstHex;b.getEncodedHex();this.valueList=[b]}else{if(c.tst instanceof KJUR.asn1.ASN1Object){}else{throw"tst param shall be ASN1Object or hex string"}}}}};YAHOO.lang.extend(KJUR.asn1.cades.SignatureTimeStamp,KJUR.asn1.cms.Attribute);KJUR.asn1.cades.CompleteCertificateRefs=function(c){KJUR.asn1.cades.CompleteCertificateRefs.superclass.constructor.call(this);this.attrTypeOid="1.2.840.113549.1.9.16.2.21";var a=KJUR.asn1;var b=KJUR.asn1.cades;this.setByArray=function(d){this.valueList=[];for(var e=0;e<d.length;e++){var f=new b.OtherCertID(d[e]);this.valueList.push(f)}};if(typeof c!="undefined"){if(typeof c=="object"&&typeof c.length=="number"){this.setByArray(c)}}};YAHOO.lang.extend(KJUR.asn1.cades.CompleteCertificateRefs,KJUR.asn1.cms.Attribute);KJUR.asn1.cades.OtherCertID=function(d){KJUR.asn1.cades.OtherCertID.superclass.constructor.call(this);var a=KJUR.asn1;var c=KJUR.asn1.cms;var b=KJUR.asn1.cades;this.hasIssuerSerial=true;this.dOtherCertHash=null;this.dIssuerSerial=null;this.setByCertPEM=function(e){this.dOtherCertHash=new b.OtherHash(e);if(this.hasIssuerSerial){this.dIssuerSerial=new c.IssuerAndSerialNumber(e)}};this.getEncodedHex=function(){if(this.hTLV!=null){return this.hTLV}if(this.dOtherCertHash==null){throw"otherCertHash not set"}var e=[this.dOtherCertHash];if(this.dIssuerSerial!=null){e.push(this.dIssuerSerial)}var f=new a.DERSequence({array:e});this.hTLV=f.getEncodedHex();return this.hTLV};if(typeof d!="undefined"){if(typeof d=="string"&&d.indexOf("-----BEGIN ")!=-1){this.setByCertPEM(d)}if(typeof d=="object"){if(d.hasis===false){this.hasIssuerSerial=false}if(typeof d.cert=="string"){this.setByCertPEM(d.cert)}}}};YAHOO.lang.extend(KJUR.asn1.cades.OtherCertID,KJUR.asn1.ASN1Object);KJUR.asn1.cades.OtherHash=function(c){KJUR.asn1.cades.OtherHash.superclass.constructor.call(this);var a=KJUR.asn1;var b=KJUR.asn1.cades;this.alg="sha256";this.dOtherHash=null;this.setByCertPEM=function(d){if(d.indexOf("-----BEGIN ")==-1){throw"certPEM not to seem PEM format"}var e=X509.pemToHex(d);var f=KJUR.crypto.Util.hashHex(e,this.alg);this.dOtherHash=new b.OtherHashAlgAndValue({alg:this.alg,hash:f})};this.getEncodedHex=function(){if(this.dOtherHash==null){throw"OtherHash not set"}return this.dOtherHash.getEncodedHex()};if(typeof c!="undefined"){if(typeof c=="string"){if(c.indexOf("-----BEGIN ")!=-1){this.setByCertPEM(c)}else{if(c.match(/^[0-9A-Fa-f]+$/)){this.dOtherHash=new a.DEROctetString({hex:c})}else{throw"unsupported string value for params"}}}else{if(typeof c=="object"){if(typeof c.cert=="string"){if(typeof c.alg=="string"){this.alg=c.alg}this.setByCertPEM(c.cert)}else{this.dOtherHash=new b.OtherHashAlgAndValue(c)}}}}};YAHOO.lang.extend(KJUR.asn1.cades.OtherHash,KJUR.asn1.ASN1Object);KJUR.asn1.cades.CAdESUtil=new function(){};KJUR.asn1.cades.CAdESUtil.addSigTS=function(c,b,a){};KJUR.asn1.cades.CAdESUtil.parseSignedDataForAddingUnsigned=function(d){var q=KJUR.asn1;var p=KJUR.asn1.cms;var c=KJUR.asn1.cades.CAdESUtil;var a={};if(ASN1HEX.getDecendantHexTLVByNthList(d,0,[0])!="06092a864886f70d010702"){throw"hex is not CMS SignedData"}var s=ASN1HEX.getDecendantIndexByNthList(d,0,[1,0]);var b=ASN1HEX.getPosArrayOfChildren_AtObj(d,s);if(b.length<4){throw"num of SignedData elem shall be 4 at least"}var f=b.shift();a.version=ASN1HEX.getHexOfTLV_AtObj(d,f);var l=b.shift();a.algs=ASN1HEX.getHexOfTLV_AtObj(d,l);var m=b.shift();a.encapcontent=ASN1HEX.getHexOfTLV_AtObj(d,m);a.certs=null;a.revs=null;a.si=[];var n=b.shift();if(d.substr(n,2)=="a0"){a.certs=ASN1HEX.getHexOfTLV_AtObj(d,n);n=b.shift()}if(d.substr(n,2)=="a1"){a.revs=ASN1HEX.getHexOfTLV_AtObj(d,n);n=b.shift()}var k=n;if(d.substr(k,2)!="31"){throw"Can't find signerInfos"}var j=ASN1HEX.getPosArrayOfChildren_AtObj(d,k);for(var h=0;h<j.length;h++){var o=j[h];var e=c.parseSignerInfoForAddingUnsigned(d,o,h);a.si[h]=e}var g=null;a.obj=new p.SignedData();g=new q.ASN1Object();g.hTLV=a.version;a.obj.dCMSVersion=g;g=new q.ASN1Object();g.hTLV=a.algs;a.obj.dDigestAlgs=g;g=new q.ASN1Object();g.hTLV=a.encapcontent;a.obj.dEncapContentInfo=g;g=new q.ASN1Object();g.hTLV=a.certs;a.obj.dCerts=g;a.obj.signerInfoList=[];for(var h=0;h<a.si.length;h++){a.obj.signerInfoList.push(a.si[h].obj)}return a};KJUR.asn1.cades.CAdESUtil.parseSignerInfoForAddingUnsigned=function(d,k,a){var m=KJUR.asn1;var l=KJUR.asn1.cms;var b={};var e=ASN1HEX.getPosArrayOfChildren_AtObj(d,k);if(e.length!=6){throw"not supported items for SignerInfo (!=6)"}var f=e.shift();b.version=ASN1HEX.getHexOfTLV_AtObj(d,f);var n=e.shift();b.si=ASN1HEX.getHexOfTLV_AtObj(d,n);var h=e.shift();b.digalg=ASN1HEX.getHexOfTLV_AtObj(d,h);var c=e.shift();b.sattrs=ASN1HEX.getHexOfTLV_AtObj(d,c);var i=e.shift();b.sigalg=ASN1HEX.getHexOfTLV_AtObj(d,i);var j=e.shift();b.sig=ASN1HEX.getHexOfTLV_AtObj(d,j);b.sigval=ASN1HEX.getHexOfV_AtObj(d,j);var g=null;b.obj=new l.SignerInfo();g=new m.ASN1Object();g.hTLV=b.version;b.obj.dCMSVersion=g;g=new m.ASN1Object();g.hTLV=b.si;b.obj.dSignerIdentifier=g;g=new m.ASN1Object();g.hTLV=b.digalg;b.obj.dDigestAlgorithm=g;g=new m.ASN1Object();g.hTLV=b.sattrs;b.obj.dSignedAttrs=g;g=new m.ASN1Object();g.hTLV=b.sigalg;b.obj.dSigAlg=g;g=new m.ASN1Object();g.hTLV=b.sig;b.obj.dSig=g;b.obj.dUnsignedAttrs=new l.AttributeList();return b};
/*! base64x-1.1.3 (c) 2012-2014 Kenji Urushima | kjur.github.com/jsjws/license
*/
function Base64x(){}function stoBA(d){var b=new Array();for(var c=0;c<d.length;c++){b[c]=d.charCodeAt(c)}return b}function BAtos(b){var d="";for(var c=0;c<b.length;c++){d=d+String.fromCharCode(b[c])}return d}function BAtohex(b){var e="";for(var d=0;d<b.length;d++){var c=b[d].toString(16);if(c.length==1){c="0"+c}e=e+c}return e}function stohex(a){return BAtohex(stoBA(a))}function stob64(a){return hex2b64(stohex(a))}function stob64u(a){return b64tob64u(hex2b64(stohex(a)))}function b64utos(a){return BAtos(b64toBA(b64utob64(a)))}function b64tob64u(a){a=a.replace(/\=/g,"");a=a.replace(/\+/g,"-");a=a.replace(/\//g,"_");return a}function b64utob64(a){if(a.length%4==2){a=a+"=="}else{if(a.length%4==3){a=a+"="}}a=a.replace(/-/g,"+");a=a.replace(/_/g,"/");return a}function hextob64u(a){return b64tob64u(hex2b64(a))}function b64utohex(a){return b64tohex(b64utob64(a))}var utf8tob64u,b64utoutf8;if(typeof Buffer==="function"){utf8tob64u=function(a){return b64tob64u(new Buffer(a,"utf8").toString("base64"))};b64utoutf8=function(a){return new Buffer(b64utob64(a),"base64").toString("utf8")}}else{utf8tob64u=function(a){return hextob64u(uricmptohex(encodeURIComponentAll(a)))};b64utoutf8=function(a){return decodeURIComponent(hextouricmp(b64utohex(a)))}}function utf8tob64(a){return hex2b64(uricmptohex(encodeURIComponentAll(a)))}function b64toutf8(a){return decodeURIComponent(hextouricmp(b64tohex(a)))}function utf8tohex(a){return uricmptohex(encodeURIComponentAll(a))}function hextoutf8(a){return decodeURIComponent(hextouricmp(a))}function hextorstr(c){var b="";for(var a=0;a<c.length-1;a+=2){b+=String.fromCharCode(parseInt(c.substr(a,2),16))}return b}function rstrtohex(c){var a="";for(var b=0;b<c.length;b++){a+=("0"+c.charCodeAt(b).toString(16)).slice(-2)}return a}function hextob64(a){return hex2b64(a)}function hextob64nl(b){var a=hextob64(b);var c=a.replace(/(.{64})/g,"$1\r\n");c=c.replace(/\r\n$/,"");return c}function b64nltohex(b){var a=b.replace(/[^0-9A-Za-z\/+=]*/g,"");var c=b64tohex(a);return c}function uricmptohex(a){return a.replace(/%/g,"")}function hextouricmp(a){return a.replace(/(..)/g,"%$1")}function encodeURIComponentAll(a){var d=encodeURIComponent(a);var b="";for(var c=0;c<d.length;c++){if(d[c]=="%"){b=b+d.substr(c,3);c=c+2}else{b=b+"%"+stohex(d[c])}}return b}function newline_toUnix(a){a=a.replace(/\r\n/mg,"\n");return a}function newline_toDos(a){a=a.replace(/\r\n/mg,"\n");a=a.replace(/\n/mg,"\r\n");return a};
/*! crypto-1.1.5.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.Util=new function(){this.DIGESTINFOHEAD={sha1:"3021300906052b0e03021a05000414",sha224:"302d300d06096086480165030402040500041c",sha256:"3031300d060960864801650304020105000420",sha384:"3041300d060960864801650304020205000430",sha512:"3051300d060960864801650304020305000440",md2:"3020300c06082a864886f70d020205000410",md5:"3020300c06082a864886f70d020505000410",ripemd160:"3021300906052b2403020105000414",};this.DEFAULTPROVIDER={md5:"cryptojs",sha1:"cryptojs",sha224:"cryptojs",sha256:"cryptojs",sha384:"cryptojs",sha512:"cryptojs",ripemd160:"cryptojs",hmacmd5:"cryptojs",hmacsha1:"cryptojs",hmacsha224:"cryptojs",hmacsha256:"cryptojs",hmacsha384:"cryptojs",hmacsha512:"cryptojs",hmacripemd160:"cryptojs",MD5withRSA:"cryptojs/jsrsa",SHA1withRSA:"cryptojs/jsrsa",SHA224withRSA:"cryptojs/jsrsa",SHA256withRSA:"cryptojs/jsrsa",SHA384withRSA:"cryptojs/jsrsa",SHA512withRSA:"cryptojs/jsrsa",RIPEMD160withRSA:"cryptojs/jsrsa",MD5withECDSA:"cryptojs/jsrsa",SHA1withECDSA:"cryptojs/jsrsa",SHA224withECDSA:"cryptojs/jsrsa",SHA256withECDSA:"cryptojs/jsrsa",SHA384withECDSA:"cryptojs/jsrsa",SHA512withECDSA:"cryptojs/jsrsa",RIPEMD160withECDSA:"cryptojs/jsrsa",SHA1withDSA:"cryptojs/jsrsa",SHA224withDSA:"cryptojs/jsrsa",SHA256withDSA:"cryptojs/jsrsa",MD5withRSAandMGF1:"cryptojs/jsrsa",SHA1withRSAandMGF1:"cryptojs/jsrsa",SHA224withRSAandMGF1:"cryptojs/jsrsa",SHA256withRSAandMGF1:"cryptojs/jsrsa",SHA384withRSAandMGF1:"cryptojs/jsrsa",SHA512withRSAandMGF1:"cryptojs/jsrsa",RIPEMD160withRSAandMGF1:"cryptojs/jsrsa",};this.CRYPTOJSMESSAGEDIGESTNAME={md5:"CryptoJS.algo.MD5",sha1:"CryptoJS.algo.SHA1",sha224:"CryptoJS.algo.SHA224",sha256:"CryptoJS.algo.SHA256",sha384:"CryptoJS.algo.SHA384",sha512:"CryptoJS.algo.SHA512",ripemd160:"CryptoJS.algo.RIPEMD160"};this.getDigestInfoHex=function(a,b){if(typeof this.DIGESTINFOHEAD[b]=="undefined"){throw"alg not supported in Util.DIGESTINFOHEAD: "+b}return this.DIGESTINFOHEAD[b]+a};this.getPaddedDigestInfoHex=function(h,a,j){var c=this.getDigestInfoHex(h,a);var d=j/4;if(c.length+22>d){throw"key is too short for SigAlg: keylen="+j+","+a}var b="0001";var k="00"+c;var g="";var l=d-b.length-k.length;for(var f=0;f<l;f+=2){g+="ff"}var e=b+g+k;return e};this.hashString=function(a,c){var b=new KJUR.crypto.MessageDigest({alg:c});return b.digestString(a)};this.hashHex=function(b,c){var a=new KJUR.crypto.MessageDigest({alg:c});return a.digestHex(b)};this.sha1=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha1",prov:"cryptojs"});return b.digestString(a)};this.sha256=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha256",prov:"cryptojs"});return b.digestString(a)};this.sha256Hex=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha256",prov:"cryptojs"});return b.digestHex(a)};this.sha512=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha512",prov:"cryptojs"});return b.digestString(a)};this.sha512Hex=function(a){var b=new KJUR.crypto.MessageDigest({alg:"sha512",prov:"cryptojs"});return b.digestHex(a)};this.md5=function(a){var b=new KJUR.crypto.MessageDigest({alg:"md5",prov:"cryptojs"});return b.digestString(a)};this.ripemd160=function(a){var b=new KJUR.crypto.MessageDigest({alg:"ripemd160",prov:"cryptojs"});return b.digestString(a)};this.getCryptoJSMDByName=function(a){}};KJUR.crypto.MessageDigest=function(params){var md=null;var algName=null;var provName=null;this.setAlgAndProvider=function(alg,prov){if(alg!=null&&prov===undefined){prov=KJUR.crypto.Util.DEFAULTPROVIDER[alg]}if(":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(alg)!=-1&&prov=="cryptojs"){try{this.md=eval(KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[alg]).create()}catch(ex){throw"setAlgAndProvider hash alg set fail alg="+alg+"/"+ex}this.updateString=function(str){this.md.update(str)};this.updateHex=function(hex){var wHex=CryptoJS.enc.Hex.parse(hex);this.md.update(wHex)};this.digest=function(){var hash=this.md.finalize();return hash.toString(CryptoJS.enc.Hex)};this.digestString=function(str){this.updateString(str);return this.digest()};this.digestHex=function(hex){this.updateHex(hex);return this.digest()}}if(":sha256:".indexOf(alg)!=-1&&prov=="sjcl"){try{this.md=new sjcl.hash.sha256()}catch(ex){throw"setAlgAndProvider hash alg set fail alg="+alg+"/"+ex}this.updateString=function(str){this.md.update(str)};this.updateHex=function(hex){var baHex=sjcl.codec.hex.toBits(hex);this.md.update(baHex)};this.digest=function(){var hash=this.md.finalize();return sjcl.codec.hex.fromBits(hash)};this.digestString=function(str){this.updateString(str);return this.digest()};this.digestHex=function(hex){this.updateHex(hex);return this.digest()}}};this.updateString=function(str){throw"updateString(str) not supported for this alg/prov: "+this.algName+"/"+this.provName};this.updateHex=function(hex){throw"updateHex(hex) not supported for this alg/prov: "+this.algName+"/"+this.provName};this.digest=function(){throw"digest() not supported for this alg/prov: "+this.algName+"/"+this.provName};this.digestString=function(str){throw"digestString(str) not supported for this alg/prov: "+this.algName+"/"+this.provName};this.digestHex=function(hex){throw"digestHex(hex) not supported for this alg/prov: "+this.algName+"/"+this.provName};if(params!==undefined){if(params.alg!==undefined){this.algName=params.alg;if(params.prov===undefined){this.provName=KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]}this.setAlgAndProvider(this.algName,this.provName)}}};KJUR.crypto.Mac=function(params){var mac=null;var pass=null;var algName=null;var provName=null;var algProv=null;this.setAlgAndProvider=function(alg,prov){if(alg==null){alg="hmacsha1"}alg=alg.toLowerCase();if(alg.substr(0,4)!="hmac"){throw"setAlgAndProvider unsupported HMAC alg: "+alg}if(prov===undefined){prov=KJUR.crypto.Util.DEFAULTPROVIDER[alg]}this.algProv=alg+"/"+prov;var hashAlg=alg.substr(4);if(":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(hashAlg)!=-1&&prov=="cryptojs"){try{var mdObj=eval(KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[hashAlg]);this.mac=CryptoJS.algo.HMAC.create(mdObj,this.pass)}catch(ex){throw"setAlgAndProvider hash alg set fail hashAlg="+hashAlg+"/"+ex}this.updateString=function(str){this.mac.update(str)};this.updateHex=function(hex){var wHex=CryptoJS.enc.Hex.parse(hex);this.mac.update(wHex)};this.doFinal=function(){var hash=this.mac.finalize();return hash.toString(CryptoJS.enc.Hex)};this.doFinalString=function(str){this.updateString(str);return this.doFinal()};this.doFinalHex=function(hex){this.updateHex(hex);return this.doFinal()}}};this.updateString=function(str){throw"updateString(str) not supported for this alg/prov: "+this.algProv};this.updateHex=function(hex){throw"updateHex(hex) not supported for this alg/prov: "+this.algProv};this.doFinal=function(){throw"digest() not supported for this alg/prov: "+this.algProv};this.doFinalString=function(str){throw"digestString(str) not supported for this alg/prov: "+this.algProv};this.doFinalHex=function(hex){throw"digestHex(hex) not supported for this alg/prov: "+this.algProv};if(params!==undefined){if(params.pass!==undefined){this.pass=params.pass}if(params.alg!==undefined){this.algName=params.alg;if(params.prov===undefined){this.provName=KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]}this.setAlgAndProvider(this.algName,this.provName)}}};KJUR.crypto.Signature=function(o){var q=null;var n=null;var r=null;var c=null;var l=null;var d=null;var k=null;var h=null;var p=null;var e=null;var b=-1;var g=null;var j=null;var a=null;var i=null;var f=null;this._setAlgNames=function(){if(this.algName.match(/^(.+)with(.+)$/)){this.mdAlgName=RegExp.$1.toLowerCase();this.pubkeyAlgName=RegExp.$2.toLowerCase()}};this._zeroPaddingOfSignature=function(x,w){var v="";var t=w/4-x.length;for(var u=0;u<t;u++){v=v+"0"}return v+x};this.setAlgAndProvider=function(u,t){this._setAlgNames();if(t!="cryptojs/jsrsa"){throw"provider not supported: "+t}if(":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName)!=-1){try{this.md=new KJUR.crypto.MessageDigest({alg:this.mdAlgName})}catch(s){throw"setAlgAndProvider hash alg set fail alg="+this.mdAlgName+"/"+s}this.init=function(w,x){var y=null;try{if(x===undefined){y=KEYUTIL.getKey(w)}else{y=KEYUTIL.getKey(w,x)}}catch(v){throw"init failed:"+v}if(y.isPrivate===true){this.prvKey=y;this.state="SIGN"}else{if(y.isPublic===true){this.pubKey=y;this.state="VERIFY"}else{throw"init failed.:"+y}}};this.initSign=function(v){if(typeof v.ecprvhex=="string"&&typeof v.eccurvename=="string"){this.ecprvhex=v.ecprvhex;this.eccurvename=v.eccurvename}else{this.prvKey=v}this.state="SIGN"};this.initVerifyByPublicKey=function(v){if(typeof v.ecpubhex=="string"&&typeof v.eccurvename=="string"){this.ecpubhex=v.ecpubhex;this.eccurvename=v.eccurvename}else{if(v instanceof KJUR.crypto.ECDSA){this.pubKey=v}else{if(v instanceof RSAKey){this.pubKey=v}}}this.state="VERIFY"};this.initVerifyByCertificatePEM=function(v){var w=new X509();w.readCertPEM(v);this.pubKey=w.subjectPublicKeyRSA;this.state="VERIFY"};this.updateString=function(v){this.md.updateString(v)};this.updateHex=function(v){this.md.updateHex(v)};this.sign=function(){this.sHashHex=this.md.digest();if(typeof this.ecprvhex!="undefined"&&typeof this.eccurvename!="undefined"){var v=new KJUR.crypto.ECDSA({curve:this.eccurvename});this.hSign=v.signHex(this.sHashHex,this.ecprvhex)}else{if(this.pubkeyAlgName=="rsaandmgf1"){this.hSign=this.prvKey.signWithMessageHashPSS(this.sHashHex,this.mdAlgName,this.pssSaltLen)}else{if(this.pubkeyAlgName=="rsa"){this.hSign=this.prvKey.signWithMessageHash(this.sHashHex,this.mdAlgName)}else{if(this.prvKey instanceof KJUR.crypto.ECDSA){this.hSign=this.prvKey.signWithMessageHash(this.sHashHex)}else{if(this.prvKey instanceof KJUR.crypto.DSA){this.hSign=this.prvKey.signWithMessageHash(this.sHashHex)}else{throw"Signature: unsupported public key alg: "+this.pubkeyAlgName}}}}}return this.hSign};this.signString=function(v){this.updateString(v);this.sign()};this.signHex=function(v){this.updateHex(v);this.sign()};this.verify=function(v){this.sHashHex=this.md.digest();if(typeof this.ecpubhex!="undefined"&&typeof this.eccurvename!="undefined"){var w=new KJUR.crypto.ECDSA({curve:this.eccurvename});return w.verifyHex(this.sHashHex,v,this.ecpubhex)}else{if(this.pubkeyAlgName=="rsaandmgf1"){return this.pubKey.verifyWithMessageHashPSS(this.sHashHex,v,this.mdAlgName,this.pssSaltLen)}else{if(this.pubkeyAlgName=="rsa"){return this.pubKey.verifyWithMessageHash(this.sHashHex,v)}else{if(this.pubKey instanceof KJUR.crypto.ECDSA){return this.pubKey.verifyWithMessageHash(this.sHashHex,v)}else{if(this.pubKey instanceof KJUR.crypto.DSA){return this.pubKey.verifyWithMessageHash(this.sHashHex,v)}else{throw"Signature: unsupported public key alg: "+this.pubkeyAlgName}}}}}}}};this.init=function(s,t){throw"init(key, pass) not supported for this alg:prov="+this.algProvName};this.initVerifyByPublicKey=function(s){throw"initVerifyByPublicKey(rsaPubKeyy) not supported for this alg:prov="+this.algProvName};this.initVerifyByCertificatePEM=function(s){throw"initVerifyByCertificatePEM(certPEM) not supported for this alg:prov="+this.algProvName};this.initSign=function(s){throw"initSign(prvKey) not supported for this alg:prov="+this.algProvName};this.updateString=function(s){throw"updateString(str) not supported for this alg:prov="+this.algProvName};this.updateHex=function(s){throw"updateHex(hex) not supported for this alg:prov="+this.algProvName};this.sign=function(){throw"sign() not supported for this alg:prov="+this.algProvName};this.signString=function(s){throw"digestString(str) not supported for this alg:prov="+this.algProvName};this.signHex=function(s){throw"digestHex(hex) not supported for this alg:prov="+this.algProvName};this.verify=function(s){throw"verify(hSigVal) not supported for this alg:prov="+this.algProvName};this.initParams=o;if(o!==undefined){if(o.alg!==undefined){this.algName=o.alg;if(o.prov===undefined){this.provName=KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]}else{this.provName=o.prov}this.algProvName=this.algName+":"+this.provName;this.setAlgAndProvider(this.algName,this.provName);this._setAlgNames()}if(o.psssaltlen!==undefined){this.pssSaltLen=o.psssaltlen}if(o.prvkeypem!==undefined){if(o.prvkeypas!==undefined){throw"both prvkeypem and prvkeypas parameters not supported"}else{try{var q=new RSAKey();q.readPrivateKeyFromPEMString(o.prvkeypem);this.initSign(q)}catch(m){throw"fatal error to load pem private key: "+m}}}}};KJUR.crypto.OID=new function(){this.oidhex2name={"2a864886f70d010101":"rsaEncryption","2a8648ce3d0201":"ecPublicKey","2a8648ce380401":"dsa","2a8648ce3d030107":"secp256r1","2b8104001f":"secp192k1","2b81040021":"secp224r1","2b8104000a":"secp256k1","2b81040023":"secp521r1","2b81040022":"secp384r1","2a8648ce380403":"SHA1withDSA","608648016503040301":"SHA224withDSA","608648016503040302":"SHA256withDSA",}};
/*! ecdsa-modified-1.0.4.js (c) Stephan Thomas, Kenji Urushima | github.com/bitcoinjs/bitcoinjs-lib/blob/master/LICENSE
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.ECDSA=function(h){var e="secp256r1";var g=null;var b=null;var f=null;var a=new SecureRandom();var d=null;this.type="EC";function c(s,o,r,n){var j=Math.max(o.bitLength(),n.bitLength());var t=s.add2D(r);var q=s.curve.getInfinity();for(var p=j-1;p>=0;--p){q=q.twice2D();q.z=BigInteger.ONE;if(o.testBit(p)){if(n.testBit(p)){q=q.add2D(t)}else{q=q.add2D(s)}}else{if(n.testBit(p)){q=q.add2D(r)}}}return q}this.getBigRandom=function(i){return new BigInteger(i.bitLength(),a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE)};this.setNamedCurve=function(i){this.ecparams=KJUR.crypto.ECParameterDB.getByName(i);this.prvKeyHex=null;this.pubKeyHex=null;this.curveName=i};this.setPrivateKeyHex=function(i){this.isPrivate=true;this.prvKeyHex=i};this.setPublicKeyHex=function(i){this.isPublic=true;this.pubKeyHex=i};this.generateKeyPairHex=function(){var k=this.ecparams.n;var n=this.getBigRandom(k);var l=this.ecparams.G.multiply(n);var q=l.getX().toBigInteger();var o=l.getY().toBigInteger();var i=this.ecparams.keylen/4;var m=("0000000000"+n.toString(16)).slice(-i);var r=("0000000000"+q.toString(16)).slice(-i);var p=("0000000000"+o.toString(16)).slice(-i);var j="04"+r+p;this.setPrivateKeyHex(m);this.setPublicKeyHex(j);return{ecprvhex:m,ecpubhex:j}};this.signWithMessageHash=function(i){return this.signHex(i,this.prvKeyHex)};this.signHex=function(o,j){var t=new BigInteger(j,16);var l=this.ecparams.n;var q=new BigInteger(o,16);do{var m=this.getBigRandom(l);var u=this.ecparams.G;var p=u.multiply(m);var i=p.getX().toBigInteger().mod(l)}while(i.compareTo(BigInteger.ZERO)<=0);var v=m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i,v)};this.sign=function(m,u){var q=u;var j=this.ecparams.n;var p=BigInteger.fromByteArrayUnsigned(m);do{var l=this.getBigRandom(j);var t=this.ecparams.G;var o=t.multiply(l);var i=o.getX().toBigInteger().mod(j)}while(i.compareTo(BigInteger.ZERO)<=0);var v=l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);return this.serializeSig(i,v)};this.verifyWithMessageHash=function(j,i){return this.verifyHex(j,i,this.pubKeyHex)};this.verifyHex=function(m,i,p){var l,j;var o=KJUR.crypto.ECDSA.parseSigHex(i);l=o.r;j=o.s;var k;k=ECPointFp.decodeFromHex(this.ecparams.curve,p);var n=new BigInteger(m,16);return this.verifyRaw(n,l,j,k)};this.verify=function(o,p,j){var l,i;if(Bitcoin.Util.isArray(p)){var n=this.parseSig(p);l=n.r;i=n.s}else{if("object"===typeof p&&p.r&&p.s){l=p.r;i=p.s}else{throw"Invalid value for signature"}}var k;if(j instanceof ECPointFp){k=j}else{if(Bitcoin.Util.isArray(j)){k=ECPointFp.decodeFrom(this.ecparams.curve,j)}else{throw"Invalid format for pubkey value, must be byte array or ECPointFp"}}var m=BigInteger.fromByteArrayUnsigned(o);return this.verifyRaw(m,l,i,k)};this.verifyRaw=function(o,i,w,m){var l=this.ecparams.n;var u=this.ecparams.G;if(i.compareTo(BigInteger.ONE)<0||i.compareTo(l)>=0){return false}if(w.compareTo(BigInteger.ONE)<0||w.compareTo(l)>=0){return false}var p=w.modInverse(l);var k=o.multiply(p).mod(l);var j=i.multiply(p).mod(l);var q=u.multiply(k).add(m.multiply(j));var t=q.getX().toBigInteger().mod(l);return t.equals(i)};this.serializeSig=function(k,j){var l=k.toByteArraySigned();var i=j.toByteArraySigned();var m=[];m.push(2);m.push(l.length);m=m.concat(l);m.push(2);m.push(i.length);m=m.concat(i);m.unshift(m.length);m.unshift(48);return m};this.parseSig=function(n){var m;if(n[0]!=48){throw new Error("Signature not a valid DERSequence")}m=2;if(n[m]!=2){throw new Error("First element in signature must be a DERInteger")}var l=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];if(n[m]!=2){throw new Error("Second element in signature must be a DERInteger")}var i=n.slice(m+2,m+2+n[m+1]);m+=2+n[m+1];var k=BigInteger.fromByteArrayUnsigned(l);var j=BigInteger.fromByteArrayUnsigned(i);return{r:k,s:j}};this.parseSigCompact=function(m){if(m.length!==65){throw"Signature has the wrong length"}var j=m[0]-27;if(j<0||j>7){throw"Invalid signature type"}var o=this.ecparams.n;var l=BigInteger.fromByteArrayUnsigned(m.slice(1,33)).mod(o);var k=BigInteger.fromByteArrayUnsigned(m.slice(33,65)).mod(o);return{r:l,s:k,i:j}};if(h!==undefined){if(h.curve!==undefined){this.curveName=h.curve}}if(this.curveName===undefined){this.curveName=e}this.setNamedCurve(this.curveName);if(h!==undefined){if(h.prv!==undefined){this.setPrivateKeyHex(h.prv)}if(h.pub!==undefined){this.setPublicKeyHex(h.pub)}}};KJUR.crypto.ECDSA.parseSigHex=function(a){var b=KJUR.crypto.ECDSA.parseSigHexInHexRS(a);var d=new BigInteger(b.r,16);var c=new BigInteger(b.s,16);return{r:d,s:c}};KJUR.crypto.ECDSA.parseSigHexInHexRS=function(c){if(c.substr(0,2)!="30"){throw"signature is not a ASN.1 sequence"}var b=ASN1HEX.getPosArrayOfChildren_AtObj(c,0);if(b.length!=2){throw"number of signature ASN.1 sequence elements seem wrong"}var g=b[0];var f=b[1];if(c.substr(g,2)!="02"){throw"1st item of sequene of signature is not ASN.1 integer"}if(c.substr(f,2)!="02"){throw"2nd item of sequene of signature is not ASN.1 integer"}var e=ASN1HEX.getHexOfV_AtObj(c,g);var d=ASN1HEX.getHexOfV_AtObj(c,f);return{r:e,s:d}};KJUR.crypto.ECDSA.asn1SigToConcatSig=function(c){var d=KJUR.crypto.ECDSA.parseSigHexInHexRS(c);var b=d.r;var a=d.s;if(b.substr(0,2)=="00"&&(((b.length/2)*8)%(16*8))==8){b=b.substr(2)}if(a.substr(0,2)=="00"&&(((a.length/2)*8)%(16*8))==8){a=a.substr(2)}if((((b.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig r length error"}if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA sig s length error"}return b+a};KJUR.crypto.ECDSA.concatSigToASN1Sig=function(a){if((((a.length/2)*8)%(16*8))!=0){throw"unknown ECDSA concatinated r-s sig length error"}var c=a.substr(0,a.length/2);var b=a.substr(a.length/2);return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c,b)};KJUR.crypto.ECDSA.hexRSSigToASN1Sig=function(b,a){var d=new BigInteger(b,16);var c=new BigInteger(a,16);return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d,c)};KJUR.crypto.ECDSA.biRSSigToASN1Sig=function(e,c){var b=new KJUR.asn1.DERInteger({bigint:e});var a=new KJUR.asn1.DERInteger({bigint:c});var d=new KJUR.asn1.DERSequence({array:[b,a]});return d.getEncodedHex()};
/*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.ECParameterDB=new function(){var b={};var c={};function a(d){return new BigInteger(d,16)}this.getByName=function(e){var d=e;if(typeof c[d]!="undefined"){d=c[e]}if(typeof b[d]!="undefined"){return b[d]}throw"unregistered EC curve name: "+d};this.regist=function(A,l,o,g,m,e,j,f,k,u,d,x){b[A]={};var s=a(o);var z=a(g);var y=a(m);var t=a(e);var w=a(j);var r=new ECCurveFp(s,z,y);var q=r.decodePointHex("04"+f+k);b[A]["name"]=A;b[A]["keylen"]=l;b[A]["curve"]=r;b[A]["G"]=q;b[A]["n"]=t;b[A]["h"]=w;b[A]["oid"]=d;b[A]["info"]=x;for(var v=0;v<u.length;v++){c[u[v]]=A}}};KJUR.crypto.ECParameterDB.regist("secp128r1",128,"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF","FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC","E87579C11079F43DD824993C2CEE5ED3","FFFFFFFE0000000075A30D1B9038A115","1","161FF7528B899B2D0C28607CA52C5B86","CF5AC8395BAFEB13C02DA292DDED7A83",[],"","secp128r1 : SECG curve over a 128 bit prime field");KJUR.crypto.ECParameterDB.regist("secp160k1",160,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73","0","7","0100000000000000000001B8FA16DFAB9ACA16B6B3","1","3B4C382CE37AA192A4019E763036F4F5DD4D7EBB","938CF935318FDCED6BC28286531733C3F03C4FEE",[],"","secp160k1 : SECG curve over a 160 bit prime field");KJUR.crypto.ECParameterDB.regist("secp160r1",160,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC","1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45","0100000000000000000001F4C8F927AED3CA752257","1","4A96B5688EF573284664698968C38BB913CBFC82","23A628553168947D59DCC912042351377AC5FB32",[],"","secp160r1 : SECG curve over a 160 bit prime field");KJUR.crypto.ECParameterDB.regist("secp192k1",192,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37","0","3","FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D","1","DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D","9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",[]);KJUR.crypto.ECParameterDB.regist("secp192r1",192,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC","64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1","FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831","1","188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012","07192B95FFC8DA78631011ED6B24CDD573F977A11E794811",[]);KJUR.crypto.ECParameterDB.regist("secp224r1",224,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE","B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4","FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D","1","B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21","BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",[]);KJUR.crypto.ECParameterDB.regist("secp256k1",256,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F","0","7","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141","1","79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798","483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",[]);KJUR.crypto.ECParameterDB.regist("secp256r1",256,"FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF","FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC","5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B","FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551","1","6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296","4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",["NIST P-256","P-256","prime256v1"]);KJUR.crypto.ECParameterDB.regist("secp384r1",384,"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC","B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF","FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973","1","AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7","3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f",["NIST P-384","P-384"]);KJUR.crypto.ECParameterDB.regist("secp521r1",521,"1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF","1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC","051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00","1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409","1","C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66","011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",["NIST P-521","P-521"]);
/*! dsa-modified-1.0.1.js (c) Recurity Labs GmbH, Kenji Urushimma | github.com/openpgpjs/openpgpjs/blob/master/LICENSE
*/
if(typeof KJUR=="undefined"||!KJUR){KJUR={}}if(typeof KJUR.crypto=="undefined"||!KJUR.crypto){KJUR.crypto={}}KJUR.crypto.DSA=function(){this.p=null;this.q=null;this.g=null;this.y=null;this.x=null;this.type="DSA";this.setPrivate=function(z,w,v,A,u){this.isPrivate=true;this.p=z;this.q=w;this.g=v;this.y=A;this.x=u};this.setPublic=function(w,v,u,z){this.isPublic=true;this.p=w;this.q=v;this.g=u;this.y=z;this.x=null};this.signWithMessageHash=function(z){var v=this.p;var u=this.q;var C=this.g;var D=this.y;var E=this.x;var A=z.substr(0,u.bitLength()/4);var B=new BigInteger(z,16);var w=n(BigInteger.ONE.add(BigInteger.ONE),u.subtract(BigInteger.ONE));var G=(C.modPow(w,v)).mod(u);var F=(w.modInverse(u).multiply(B.add(E.multiply(G)))).mod(u);var H=KJUR.asn1.ASN1Util.jsonToASN1HEX({seq:[{"int":{bigint:G}},{"int":{bigint:F}}]});return H};this.verifyWithMessageHash=function(C,B){var z=this.p;var u=this.q;var G=this.g;var H=this.y;var E=this.parseASN1Signature(B);var K=E[0];var J=E[1];var C=C.substr(0,u.bitLength()/4);var D=new BigInteger(C,16);if(BigInteger.ZERO.compareTo(K)>0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){throw"invalid DSA signature"}var I=J.modInverse(u);var A=D.multiply(I).mod(u);var v=K.multiply(I).mod(u);var F=G.modPow(A,z).multiply(H.modPow(v,z)).mod(z).mod(u);return F.compareTo(K)==0};this.parseASN1Signature=function(u){try{var y=new BigInteger(ASN1HEX.getVbyList(u,0,[0],"02"),16);var v=new BigInteger(ASN1HEX.getVbyList(u,0,[1],"02"),16);return[y,v]}catch(w){throw"malformed DSA signature"}};function d(E,w,B,v,u,C){var z=KJUR.crypto.Util.hashString(w,E.toLowerCase());var z=z.substr(0,u.bitLength()/4);var A=new BigInteger(z,16);var y=n(BigInteger.ONE.add(BigInteger.ONE),u.subtract(BigInteger.ONE));var F=(B.modPow(y,v)).mod(u);var D=(y.modInverse(u).multiply(A.add(C.multiply(F)))).mod(u);var G=new Array();G[0]=F;G[1]=D;return G}function r(v){var u=openpgp.config.config.prefer_hash_algorithm;switch(Math.round(v.bitLength()/8)){case 20:if(u!=2&&u>11&&u!=10&&u<8){return 2}return u;case 28:if(u>11&&u<8){return 11}return u;case 32:if(u>10&&u<8){return 8}return u;default:util.print_debug("DSA select hash algorithm: returning null for an unknown length of q");return null}}this.select_hash_algorithm=r;function m(I,K,J,B,z,u,F,G){var C=KJUR.crypto.Util.hashString(B,I.toLowerCase());var C=C.substr(0,u.bitLength()/4);var D=new BigInteger(C,16);if(BigInteger.ZERO.compareTo(K)>0||K.compareTo(u)>0||BigInteger.ZERO.compareTo(J)>0||J.compareTo(u)>0){util.print_error("invalid DSA Signature");return null}var H=J.modInverse(u);var A=D.multiply(H).mod(u);var v=K.multiply(H).mod(u);var E=F.modPow(A,z).multiply(G.modPow(v,z)).mod(z).mod(u);return E.compareTo(K)==0}function a(z){var A=new BigInteger(z,primeCenterie);var y=j(q,512);var u=t(p,q,z);var v;do{v=new BigInteger(q.bitCount(),rand)}while(x.compareTo(BigInteger.ZERO)!=1&&x.compareTo(q)!=-1);var w=g.modPow(x,p);return{x:v,q:A,p:y,g:u,y:w}}function j(y,z,w){if(z%64!=0){return false}var u;var v;do{u=w(bitcount,true);v=u.subtract(BigInteger.ONE);u=u.subtract(v.remainder(y))}while(!u.isProbablePrime(primeCenterie)||u.bitLength()!=l);return u}function t(B,z,A,w){var u=B.subtract(BigInteger.ONE);var y=u.divide(z);var v;do{v=w(A)}while(v.compareTo(u)!=-1&&v.compareTo(BigInteger.ONE)!=1);return v.modPow(y,B)}function o(w,y,u){var v;do{v=u(y,false)}while(v.compareTo(w)!=-1&&v.compareTo(BigInteger.ZERO)!=1);return v}function i(v,w){k=o(v);var u=g.modPow(k,w).mod(v);return u}function h(B,w,y,v,z,u){var A=B(v);s=(w.modInverse(z).multiply(A.add(u.multiply(y)))).mod(z);return s}this.sign=d;this.verify=m;function n(w,u){if(u.compareTo(w)<=0){return}var v=u.subtract(w);var y=e(v.bitLength());while(y>v){y=e(v.bitLength())}return w.add(y)}function e(w){if(w<0){return null}var u=Math.floor((w+7)/8);var v=c(u);if(w%8>0){v=String.fromCharCode((Math.pow(2,w%8)-1)&v.charCodeAt(0))+v.substring(1)}return new BigInteger(f(v),16)}function c(w){var u="";for(var v=0;v<w;v++){u+=String.fromCharCode(b())}return u}function b(){var u=new Uint32Array(1);window.crypto.getRandomValues(u);return u[0]&255}function f(y){if(y==null){return""}var v=[];var w=y.length;var z=0;var u;while(z<w){u=y[z++].charCodeAt().toString(16);while(u.length<2){u="0"+u}v.push(""+u)}return v.join("")}this.getRandomBigIntegerInRange=n;this.getRandomBigInteger=e;this.getRandomBytes=c};
/*! pkcs5pkey-1.0.6.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var PKCS5PKEY=function(){var c=function(n,p,o){return i(CryptoJS.AES,n,p,o)};var d=function(n,p,o){return i(CryptoJS.TripleDES,n,p,o)};var i=function(q,v,s,o){var p=CryptoJS.enc.Hex.parse(v);var u=CryptoJS.enc.Hex.parse(s);var n=CryptoJS.enc.Hex.parse(o);var r={};r.key=u;r.iv=n;r.ciphertext=p;var t=q.decrypt(r,u,{iv:n});return CryptoJS.enc.Hex.stringify(t)};var j=function(n,p,o){return e(CryptoJS.AES,n,p,o)};var m=function(n,p,o){return e(CryptoJS.TripleDES,n,p,o)};var e=function(s,x,v,p){var r=CryptoJS.enc.Hex.parse(x);var w=CryptoJS.enc.Hex.parse(v);var o=CryptoJS.enc.Hex.parse(p);var n={};var u=s.encrypt(r,w,{iv:o});var q=CryptoJS.enc.Hex.parse(u.toString());var t=CryptoJS.enc.Base64.stringify(q);return t};var g={"AES-256-CBC":{proc:c,eproc:j,keylen:32,ivlen:16},"AES-192-CBC":{proc:c,eproc:j,keylen:24,ivlen:16},"AES-128-CBC":{proc:c,eproc:j,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:d,eproc:m,keylen:24,ivlen:8}};var b=function(n){return g[n]["proc"]};var k=function(n){var p=CryptoJS.lib.WordArray.random(n);var o=CryptoJS.enc.Hex.stringify(p);return o};var l=function(q){var r={};if(q.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){r.cipher=RegExp.$1;r.ivsalt=RegExp.$2}if(q.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){r.type=RegExp.$1}var p=-1;var t=0;if(q.indexOf("\r\n\r\n")!=-1){p=q.indexOf("\r\n\r\n");t=2}if(q.indexOf("\n\n")!=-1){p=q.indexOf("\n\n");t=1}var o=q.indexOf("-----END");if(p!=-1&&o!=-1){var n=q.substring(p+t*2,o-t);n=n.replace(/\s+/g,"");r.data=n}return r};var h=function(o,w,n){var t=n.substring(0,16);var r=CryptoJS.enc.Hex.parse(t);var p=CryptoJS.enc.Utf8.parse(w);var s=g[o]["keylen"]+g[o]["ivlen"];var v="";var u=null;for(;;){var q=CryptoJS.algo.MD5.create();if(u!=null){q.update(u)}q.update(p);q.update(r);u=q.finalize();v=v+CryptoJS.enc.Hex.stringify(u);if(v.length>=s*2){break}}var x={};x.keyhex=v.substr(0,g[o]["keylen"]*2);x.ivhex=v.substr(g[o]["keylen"]*2,g[o]["ivlen"]*2);return x};var a=function(n,t,p,u){var q=CryptoJS.enc.Base64.parse(n);var o=CryptoJS.enc.Hex.stringify(q);var s=g[t]["proc"];var r=s(o,p,u);return r};var f=function(n,q,o,s){var p=g[q]["eproc"];var r=p(n,o,s);return r};return{version:"1.0.5",getHexFromPEM:function(o,r){var p=o;if(p.indexOf("BEGIN "+r)==-1){throw"can't find PEM header: "+r}p=p.replace("-----BEGIN "+r+"-----","");p=p.replace("-----END "+r+"-----","");var q=p.replace(/\s+/g,"");var n=b64tohex(q);return n},getDecryptedKeyHexByKeyIV:function(o,r,q,p){var n=b(r);return n(o,q,p)},parsePKCS5PEM:function(n){return l(n)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(o,n,p){return h(o,n,p)},decryptKeyB64:function(n,p,o,q){return a(n,p,o,q)},getDecryptedKeyHex:function(w,v){var o=l(w);var r=o.type;var p=o.cipher;var n=o.ivsalt;var q=o.data;var u=h(p,v,n);var t=u.keyhex;var s=a(q,p,t,n);return s},getRSAKeyFromEncryptedPKCS5PEM:function(p,o){var q=this.getDecryptedKeyHex(p,o);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(q);return n},getEryptedPKCS5PEMFromPrvKeyHex:function(q,x,r,p){var n="";if(typeof r=="undefined"||r==null){r="AES-256-CBC"}if(typeof g[r]=="undefined"){throw"PKCS5PKEY unsupported algorithm: "+r}if(typeof p=="undefined"||p==null){var t=g[r]["ivlen"];var s=k(t);p=s.toUpperCase()}var w=h(r,x,p);var v=w.keyhex;var u=f(q,r,v,p);var o=u.replace(/(.{64})/g,"$1\r\n");var n="-----BEGIN RSA PRIVATE KEY-----\r\n";n+="Proc-Type: 4,ENCRYPTED\r\n";n+="DEK-Info: "+r+","+p+"\r\n";n+="\r\n";n+=o;n+="\r\n-----END RSA PRIVATE KEY-----\r\n";return n},getEryptedPKCS5PEMFromRSAKey:function(C,D,o,s){var A=new KJUR.asn1.DERInteger({"int":0});var v=new KJUR.asn1.DERInteger({bigint:C.n});var z=new KJUR.asn1.DERInteger({"int":C.e});var B=new KJUR.asn1.DERInteger({bigint:C.d});var t=new KJUR.asn1.DERInteger({bigint:C.p});var r=new KJUR.asn1.DERInteger({bigint:C.q});var y=new KJUR.asn1.DERInteger({bigint:C.dmp1});var u=new KJUR.asn1.DERInteger({bigint:C.dmq1});var x=new KJUR.asn1.DERInteger({bigint:C.coeff});var E=new KJUR.asn1.DERSequence({array:[A,v,z,B,t,r,y,u,x]});var w=E.getEncodedHex();return this.getEryptedPKCS5PEMFromPrvKeyHex(w,D,o,s)},newEncryptedPKCS5PEM:function(n,o,r,s){if(typeof o=="undefined"||o==null){o=1024}if(typeof r=="undefined"||r==null){r="10001"}var p=new RSAKey();p.generate(o,r);var q=null;if(typeof s=="undefined"||s==null){q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n)}else{q=this.getEncryptedPKCS5PEMFromRSAKey(pkey,n,s)}return q},getRSAKeyFromPlainPKCS8PEM:function(p){if(p.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var o=this.getHexFromPEM(p,"PRIVATE KEY");var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getRSAKeyFromPlainPKCS8Hex:function(q){var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"outer DERSequence shall have 3 elements: "+p.length}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);if(o!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+o}var o=ASN1HEX.getHexOfTLV_AtObj(q,p[1]);var r=ASN1HEX.getHexOfTLV_AtObj(q,p[2]);var s=ASN1HEX.getHexOfV_AtObj(r,0);var n=new RSAKey();n.readPrivateKeyFromASN1HexString(s);return n},parseHexOfEncryptedPKCS8:function(u){var q={};var p=ASN1HEX.getPosArrayOfChildren_AtObj(u,0);if(p.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+p.length}q.ciphertext=ASN1HEX.getHexOfV_AtObj(u,p[1]);var w=ASN1HEX.getPosArrayOfChildren_AtObj(u,p[0]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+w.length}if(ASN1HEX.getHexOfV_AtObj(u,w[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(u,w[1]);if(w.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+n.length}var o=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[1]);if(o.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+o.length}if(ASN1HEX.getHexOfV_AtObj(u,o[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}q.encryptionSchemeAlg="TripleDES";q.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(u,o[1]);var r=ASN1HEX.getPosArrayOfChildren_AtObj(u,n[0]);if(r.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+r.length}if(ASN1HEX.getHexOfV_AtObj(u,r[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var v=ASN1HEX.getPosArrayOfChildren_AtObj(u,r[1]);if(v.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+v.length}q.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(u,v[0]);var s=ASN1HEX.getHexOfV_AtObj(u,v[1]);try{q.pbkdf2Iter=parseInt(s,16)}catch(t){throw"malformed format pbkdf2Iter: "+s}return q},getPBKDF2KeyHexFromParam:function(s,n){var r=CryptoJS.enc.Hex.parse(s.pbkdf2Salt);var o=s.pbkdf2Iter;var q=CryptoJS.PBKDF2(n,r,{keySize:192/32,iterations:o});var p=CryptoJS.enc.Hex.stringify(q);return p},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(v,w){var p=this.getHexFromPEM(v,"ENCRYPTED PRIVATE KEY");var n=this.parseHexOfEncryptedPKCS8(p);var s=PKCS5PKEY.getPBKDF2KeyHexFromParam(n,w);var t={};t.ciphertext=CryptoJS.enc.Hex.parse(n.ciphertext);var r=CryptoJS.enc.Hex.parse(s);var q=CryptoJS.enc.Hex.parse(n.encryptionSchemeIV);var u=CryptoJS.TripleDES.decrypt(t,r,{iv:q});var o=CryptoJS.enc.Hex.stringify(u);return o},getRSAKeyFromEncryptedPKCS8PEM:function(q,p){var o=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,p);var n=this.getRSAKeyFromPlainPKCS8Hex(o);return n},getKeyFromEncryptedPKCS8PEM:function(q,o){var n=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(q,o);var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},parsePlainPrivatePKCS8Hex:function(q){var o={};o.algparam=null;if(q.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(q.substr(p[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,p[1]);if(n.length!=2){throw"malformed PKCS8 private key(code:004)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}o.keyidx=ASN1HEX.getStartPosOfV_AtObj(q,p[2]);return o},getKeyFromPlainPrivatePKCS8PEM:function(o){var n=this.getHexFromPEM(o,"PRIVATE KEY");var p=this.getKeyFromPlainPrivatePKCS8Hex(n);return p},getKeyFromPlainPrivatePKCS8Hex:function(n){var p=this.parsePlainPrivatePKCS8Hex(n);if(p.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(n,p);var o=p.key;var q=new RSAKey();q.setPrivateEx(o.n,o.e,o.d,o.p,o.q,o.dp,o.dq,o.co);return q}else{if(p.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(n,p);if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var r=KJUR.crypto.OID.oidhex2name[p.algparam];var q=new KJUR.crypto.ECDSA({curve:r,prv:p.key});return q}else{throw"unsupported private key algorithm"}}},getRSAKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getRSAKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8PEM:function(o){var p=this.getHexFromPEM(o,"PUBLIC KEY");var n=this.getKeyFromPublicPKCS8Hex(p);return n},getKeyFromPublicPKCS8Hex:function(o){var n=this.parsePublicPKCS8Hex(o);if(n.algoid=="2a864886f70d010101"){var r=this.parsePublicRawRSAKeyHex(n.key);var p=new RSAKey();p.setPublic(r.n,r.e);return p}else{if(n.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[n.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+n.algparam}var q=KJUR.crypto.OID.oidhex2name[n.algparam];var p=new KJUR.crypto.ECDSA({curve:q,pub:n.key});return p}else{throw"unsupported public key algorithm"}}},parsePublicRawRSAKeyHex:function(p){var n={};if(p.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var o=ASN1HEX.getPosArrayOfChildren_AtObj(p,0);if(o.length!=2){throw"malformed RSA key(code:002)"}if(p.substr(o[0],2)!="02"){throw"malformed RSA key(code:003)"}n.n=ASN1HEX.getHexOfV_AtObj(p,o[0]);if(p.substr(o[1],2)!="02"){throw"malformed RSA key(code:004)"}n.e=ASN1HEX.getHexOfV_AtObj(p,o[1]);return n},parsePrivateRawRSAKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed RSA private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=9){throw"malformed RSA private key(code:002)"}q.key={};q.key.n=ASN1HEX.getHexOfV_AtObj(o,n[1]);q.key.e=ASN1HEX.getHexOfV_AtObj(o,n[2]);q.key.d=ASN1HEX.getHexOfV_AtObj(o,n[3]);q.key.p=ASN1HEX.getHexOfV_AtObj(o,n[4]);q.key.q=ASN1HEX.getHexOfV_AtObj(o,n[5]);q.key.dp=ASN1HEX.getHexOfV_AtObj(o,n[6]);q.key.dq=ASN1HEX.getHexOfV_AtObj(o,n[7]);q.key.co=ASN1HEX.getHexOfV_AtObj(o,n[8])},parsePrivateRawECKeyHexAtObj:function(o,q){var p=q.keyidx;if(o.substr(p,2)!="30"){throw"malformed ECC private key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(o,p);if(n.length!=3){throw"malformed ECC private key(code:002)"}if(o.substr(n[1],2)!="04"){throw"malformed ECC private key(code:003)"}q.key=ASN1HEX.getHexOfV_AtObj(o,n[1])},parsePublicPKCS8Hex:function(q){var o={};o.algparam=null;var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,0);if(p.length!=2){throw"outer DERSequence shall have 2 elements: "+p.length}var r=p[0];if(q.substr(r,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var n=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(n.length!=2){throw"malformed PKCS8 public key(code:002)"}if(q.substr(n[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}o.algoid=ASN1HEX.getHexOfV_AtObj(q,n[0]);if(q.substr(n[1],2)=="06"){o.algparam=ASN1HEX.getHexOfV_AtObj(q,n[1])}if(q.substr(p[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}o.key=ASN1HEX.getHexOfV_AtObj(q,p[1]).substr(2);return o},getRSAKeyFromPublicPKCS8Hex:function(r){var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"outer DERSequence shall have 2 elements: "+q.length}var p=ASN1HEX.getHexOfTLV_AtObj(r,q[0]);if(p!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(r.substr(q[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var t=ASN1HEX.getStartPosOfV_AtObj(r,q[1])+2;if(r.substr(t,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var n=ASN1HEX.getPosArrayOfChildren_AtObj(r,t);if(n.length!=2){throw"inner DERSequence shall have 2 elements: "+n.length}if(r.substr(n[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(r.substr(n[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var u=ASN1HEX.getHexOfV_AtObj(r,n[0]);var s=ASN1HEX.getHexOfV_AtObj(r,n[1]);var o=new RSAKey();o.setPublic(u,s);return o},}}();
/*! keyutil-1.0.7.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var KEYUTIL=function(){var d=function(p,r,q){return k(CryptoJS.AES,p,r,q)};var e=function(p,r,q){return k(CryptoJS.TripleDES,p,r,q)};var a=function(p,r,q){return k(CryptoJS.DES,p,r,q)};var k=function(s,x,u,q){var r=CryptoJS.enc.Hex.parse(x);var w=CryptoJS.enc.Hex.parse(u);var p=CryptoJS.enc.Hex.parse(q);var t={};t.key=w;t.iv=p;t.ciphertext=r;var v=s.decrypt(t,w,{iv:p});return CryptoJS.enc.Hex.stringify(v)};var l=function(p,r,q){return g(CryptoJS.AES,p,r,q)};var o=function(p,r,q){return g(CryptoJS.TripleDES,p,r,q)};var f=function(p,r,q){return g(CryptoJS.DES,p,r,q)};var g=function(t,y,v,q){var s=CryptoJS.enc.Hex.parse(y);var x=CryptoJS.enc.Hex.parse(v);var p=CryptoJS.enc.Hex.parse(q);var w=t.encrypt(s,x,{iv:p});var r=CryptoJS.enc.Hex.parse(w.toString());var u=CryptoJS.enc.Base64.stringify(r);return u};var i={"AES-256-CBC":{proc:d,eproc:l,keylen:32,ivlen:16},"AES-192-CBC":{proc:d,eproc:l,keylen:24,ivlen:16},"AES-128-CBC":{proc:d,eproc:l,keylen:16,ivlen:16},"DES-EDE3-CBC":{proc:e,eproc:o,keylen:24,ivlen:8},"DES-CBC":{proc:a,eproc:f,keylen:8,ivlen:8}};var c=function(p){return i[p]["proc"]};var m=function(p){var r=CryptoJS.lib.WordArray.random(p);var q=CryptoJS.enc.Hex.stringify(r);return q};var n=function(t){var u={};if(t.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)","m"))){u.cipher=RegExp.$1;u.ivsalt=RegExp.$2}if(t.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"))){u.type=RegExp.$1}var r=-1;var v=0;if(t.indexOf("\r\n\r\n")!=-1){r=t.indexOf("\r\n\r\n");v=2}if(t.indexOf("\n\n")!=-1){r=t.indexOf("\n\n");v=1}var q=t.indexOf("-----END");if(r!=-1&&q!=-1){var p=t.substring(r+v*2,q-v);p=p.replace(/\s+/g,"");u.data=p}return u};var j=function(q,y,p){var v=p.substring(0,16);var t=CryptoJS.enc.Hex.parse(v);var r=CryptoJS.enc.Utf8.parse(y);var u=i[q]["keylen"]+i[q]["ivlen"];var x="";var w=null;for(;;){var s=CryptoJS.algo.MD5.create();if(w!=null){s.update(w)}s.update(r);s.update(t);w=s.finalize();x=x+CryptoJS.enc.Hex.stringify(w);if(x.length>=u*2){break}}var z={};z.keyhex=x.substr(0,i[q]["keylen"]*2);z.ivhex=x.substr(i[q]["keylen"]*2,i[q]["ivlen"]*2);return z};var b=function(p,v,r,w){var s=CryptoJS.enc.Base64.parse(p);var q=CryptoJS.enc.Hex.stringify(s);var u=i[v]["proc"];var t=u(q,r,w);return t};var h=function(p,s,q,u){var r=i[s]["eproc"];var t=r(p,q,u);return t};return{version:"1.0.0",getHexFromPEM:function(q,u){var r=q;if(r.indexOf("-----BEGIN ")==-1){throw"can't find PEM header: "+u}if(typeof u=="string"&&u!=""){r=r.replace("-----BEGIN "+u+"-----","");r=r.replace("-----END "+u+"-----","")}else{r=r.replace(/-----BEGIN [^-]+-----/,"");r=r.replace(/-----END [^-]+-----/,"")}var t=r.replace(/\s+/g,"");var p=b64tohex(t);return p},getDecryptedKeyHexByKeyIV:function(q,t,s,r){var p=c(t);return p(q,s,r)},parsePKCS5PEM:function(p){return n(p)},getKeyAndUnusedIvByPasscodeAndIvsalt:function(q,p,r){return j(q,p,r)},decryptKeyB64:function(p,r,q,s){return b(p,r,q,s)},getDecryptedKeyHex:function(y,x){var q=n(y);var t=q.type;var r=q.cipher;var p=q.ivsalt;var s=q.data;var w=j(r,x,p);var v=w.keyhex;var u=b(s,r,v,p);return u},getRSAKeyFromEncryptedPKCS5PEM:function(r,q){var s=this.getDecryptedKeyHex(r,q);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(s);return p},getEncryptedPKCS5PEMFromPrvKeyHex:function(x,s,A,t,r){var p="";if(typeof t=="undefined"||t==null){t="AES-256-CBC"}if(typeof i[t]=="undefined"){throw"KEYUTIL unsupported algorithm: "+t}if(typeof r=="undefined"||r==null){var v=i[t]["ivlen"];var u=m(v);r=u.toUpperCase()}var z=j(t,A,r);var y=z.keyhex;var w=h(s,t,y,r);var q=w.replace(/(.{64})/g,"$1\r\n");var p="-----BEGIN "+x+" PRIVATE KEY-----\r\n";p+="Proc-Type: 4,ENCRYPTED\r\n";p+="DEK-Info: "+t+","+r+"\r\n";p+="\r\n";p+=q;p+="\r\n-----END "+x+" PRIVATE KEY-----\r\n";return p},getEncryptedPKCS5PEMFromRSAKey:function(D,E,r,t){var B=new KJUR.asn1.DERInteger({"int":0});var w=new KJUR.asn1.DERInteger({bigint:D.n});var A=new KJUR.asn1.DERInteger({"int":D.e});var C=new KJUR.asn1.DERInteger({bigint:D.d});var u=new KJUR.asn1.DERInteger({bigint:D.p});var s=new KJUR.asn1.DERInteger({bigint:D.q});var z=new KJUR.asn1.DERInteger({bigint:D.dmp1});var v=new KJUR.asn1.DERInteger({bigint:D.dmq1});var y=new KJUR.asn1.DERInteger({bigint:D.coeff});var F=new KJUR.asn1.DERSequence({array:[B,w,A,C,u,s,z,v,y]});var x=F.getEncodedHex();return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",x,E,r,t)},newEncryptedPKCS5PEM:function(p,q,t,u){if(typeof q=="undefined"||q==null){q=1024}if(typeof t=="undefined"||t==null){t="10001"}var r=new RSAKey();r.generate(q,t);var s=null;if(typeof u=="undefined"||u==null){s=this.getEncryptedPKCS5PEMFromRSAKey(r,p)}else{s=this.getEncryptedPKCS5PEMFromRSAKey(r,p,u)}return s},getRSAKeyFromPlainPKCS8PEM:function(r){if(r.match(/ENCRYPTED/)){throw"pem shall be not ENCRYPTED"}var q=this.getHexFromPEM(r,"PRIVATE KEY");var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getRSAKeyFromPlainPKCS8Hex:function(s){var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"outer DERSequence shall have 3 elements: "+r.length}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);if(q!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmIdentifier is not rsaEnc: "+q}var q=ASN1HEX.getHexOfTLV_AtObj(s,r[1]);var t=ASN1HEX.getHexOfTLV_AtObj(s,r[2]);var u=ASN1HEX.getHexOfV_AtObj(t,0);var p=new RSAKey();p.readPrivateKeyFromASN1HexString(u);return p},parseHexOfEncryptedPKCS8:function(w){var s={};var r=ASN1HEX.getPosArrayOfChildren_AtObj(w,0);if(r.length!=2){throw"malformed format: SEQUENCE(0).items != 2: "+r.length}s.ciphertext=ASN1HEX.getHexOfV_AtObj(w,r[1]);var y=ASN1HEX.getPosArrayOfChildren_AtObj(w,r[0]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0).items != 2: "+y.length}if(ASN1HEX.getHexOfV_AtObj(w,y[0])!="2a864886f70d01050d"){throw"this only supports pkcs5PBES2"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(w,y[1]);if(y.length!=2){throw"malformed format: SEQUENCE(0.0.1).items != 2: "+p.length}var q=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[1]);if(q.length!=2){throw"malformed format: SEQUENCE(0.0.1.1).items != 2: "+q.length}if(ASN1HEX.getHexOfV_AtObj(w,q[0])!="2a864886f70d0307"){throw"this only supports TripleDES"}s.encryptionSchemeAlg="TripleDES";s.encryptionSchemeIV=ASN1HEX.getHexOfV_AtObj(w,q[1]);var t=ASN1HEX.getPosArrayOfChildren_AtObj(w,p[0]);if(t.length!=2){throw"malformed format: SEQUENCE(0.0.1.0).items != 2: "+t.length}if(ASN1HEX.getHexOfV_AtObj(w,t[0])!="2a864886f70d01050c"){throw"this only supports pkcs5PBKDF2"}var x=ASN1HEX.getPosArrayOfChildren_AtObj(w,t[1]);if(x.length<2){throw"malformed format: SEQUENCE(0.0.1.0.1).items < 2: "+x.length}s.pbkdf2Salt=ASN1HEX.getHexOfV_AtObj(w,x[0]);var u=ASN1HEX.getHexOfV_AtObj(w,x[1]);try{s.pbkdf2Iter=parseInt(u,16)}catch(v){throw"malformed format pbkdf2Iter: "+u}return s},getPBKDF2KeyHexFromParam:function(u,p){var t=CryptoJS.enc.Hex.parse(u.pbkdf2Salt);var q=u.pbkdf2Iter;var s=CryptoJS.PBKDF2(p,t,{keySize:192/32,iterations:q});var r=CryptoJS.enc.Hex.stringify(s);return r},getPlainPKCS8HexFromEncryptedPKCS8PEM:function(x,y){var r=this.getHexFromPEM(x,"ENCRYPTED PRIVATE KEY");var p=this.parseHexOfEncryptedPKCS8(r);var u=KEYUTIL.getPBKDF2KeyHexFromParam(p,y);var v={};v.ciphertext=CryptoJS.enc.Hex.parse(p.ciphertext);var t=CryptoJS.enc.Hex.parse(u);var s=CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);var w=CryptoJS.TripleDES.decrypt(v,t,{iv:s});var q=CryptoJS.enc.Hex.stringify(w);return q},getRSAKeyFromEncryptedPKCS8PEM:function(s,r){var q=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,r);var p=this.getRSAKeyFromPlainPKCS8Hex(q);return p},getKeyFromEncryptedPKCS8PEM:function(s,q){var p=this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s,q);var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},parsePlainPrivatePKCS8Hex:function(s){var q={};q.algparam=null;if(s.substr(0,2)!="30"){throw"malformed plain PKCS8 private key(code:001)"}var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=3){throw"malformed plain PKCS8 private key(code:002)"}if(s.substr(r[1],2)!="30"){throw"malformed PKCS8 private key(code:003)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,r[1]);if(p.length!=2){throw"malformed PKCS8 private key(code:004)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 private key(code:005)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}if(s.substr(r[2],2)!="04"){throw"malformed PKCS8 private key(code:006)"}q.keyidx=ASN1HEX.getStartPosOfV_AtObj(s,r[2]);return q},getKeyFromPlainPrivatePKCS8PEM:function(q){var p=this.getHexFromPEM(q,"PRIVATE KEY");var r=this.getKeyFromPlainPrivatePKCS8Hex(p);return r},getKeyFromPlainPrivatePKCS8Hex:function(p){var w=this.parsePlainPrivatePKCS8Hex(p);if(w.algoid=="2a864886f70d010101"){this.parsePrivateRawRSAKeyHexAtObj(p,w);var u=w.key;var z=new RSAKey();z.setPrivateEx(u.n,u.e,u.d,u.p,u.q,u.dp,u.dq,u.co);return z}else{if(w.algoid=="2a8648ce3d0201"){this.parsePrivateRawECKeyHexAtObj(p,w);if(KJUR.crypto.OID.oidhex2name[w.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+w.algparam}var v=KJUR.crypto.OID.oidhex2name[w.algparam];var z=new KJUR.crypto.ECDSA({curve:v});z.setPublicKeyHex(w.pubkey);z.setPrivateKeyHex(w.key);z.isPublic=false;return z}else{if(w.algoid=="2a8648ce380401"){var t=ASN1HEX.getVbyList(p,0,[1,1,0],"02");var s=ASN1HEX.getVbyList(p,0,[1,1,1],"02");var y=ASN1HEX.getVbyList(p,0,[1,1,2],"02");var B=ASN1HEX.getVbyList(p,0,[2,0],"02");var r=new BigInteger(t,16);var q=new BigInteger(s,16);var x=new BigInteger(y,16);var A=new BigInteger(B,16);var z=new KJUR.crypto.DSA();z.setPrivate(r,q,x,null,A);return z}else{throw"unsupported private key algorithm"}}}},getRSAKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getRSAKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8PEM:function(q){var r=this.getHexFromPEM(q,"PUBLIC KEY");var p=this.getKeyFromPublicPKCS8Hex(r);return p},getKeyFromPublicPKCS8Hex:function(q){var p=this.parsePublicPKCS8Hex(q);if(p.algoid=="2a864886f70d010101"){var u=this.parsePublicRawRSAKeyHex(p.key);var r=new RSAKey();r.setPublic(u.n,u.e);return r}else{if(p.algoid=="2a8648ce3d0201"){if(KJUR.crypto.OID.oidhex2name[p.algparam]===undefined){throw"KJUR.crypto.OID.oidhex2name undefined: "+p.algparam}var s=KJUR.crypto.OID.oidhex2name[p.algparam];var r=new KJUR.crypto.ECDSA({curve:s,pub:p.key});return r}else{if(p.algoid=="2a8648ce380401"){var t=p.algparam;var v=ASN1HEX.getHexOfV_AtObj(p.key,0);var r=new KJUR.crypto.DSA();r.setPublic(new BigInteger(t.p,16),new BigInteger(t.q,16),new BigInteger(t.g,16),new BigInteger(v,16));return r}else{throw"unsupported public key algorithm"}}}},parsePublicRawRSAKeyHex:function(r){var p={};if(r.substr(0,2)!="30"){throw"malformed RSA key(code:001)"}var q=ASN1HEX.getPosArrayOfChildren_AtObj(r,0);if(q.length!=2){throw"malformed RSA key(code:002)"}if(r.substr(q[0],2)!="02"){throw"malformed RSA key(code:003)"}p.n=ASN1HEX.getHexOfV_AtObj(r,q[0]);if(r.substr(q[1],2)!="02"){throw"malformed RSA key(code:004)"}p.e=ASN1HEX.getHexOfV_AtObj(r,q[1]);return p},parsePrivateRawRSAKeyHexAtObj:function(q,s){var r=s.keyidx;if(q.substr(r,2)!="30"){throw"malformed RSA private key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(q,r);if(p.length!=9){throw"malformed RSA private key(code:002)"}s.key={};s.key.n=ASN1HEX.getHexOfV_AtObj(q,p[1]);s.key.e=ASN1HEX.getHexOfV_AtObj(q,p[2]);s.key.d=ASN1HEX.getHexOfV_AtObj(q,p[3]);s.key.p=ASN1HEX.getHexOfV_AtObj(q,p[4]);s.key.q=ASN1HEX.getHexOfV_AtObj(q,p[5]);s.key.dp=ASN1HEX.getHexOfV_AtObj(q,p[6]);s.key.dq=ASN1HEX.getHexOfV_AtObj(q,p[7]);s.key.co=ASN1HEX.getHexOfV_AtObj(q,p[8])},parsePrivateRawECKeyHexAtObj:function(p,t){var q=t.keyidx;var r=ASN1HEX.getVbyList(p,q,[1],"04");var s=ASN1HEX.getVbyList(p,q,[2,0],"03").substr(2);t.key=r;t.pubkey=s},parsePublicPKCS8Hex:function(s){var q={};q.algparam=null;var r=ASN1HEX.getPosArrayOfChildren_AtObj(s,0);if(r.length!=2){throw"outer DERSequence shall have 2 elements: "+r.length}var t=r[0];if(s.substr(t,2)!="30"){throw"malformed PKCS8 public key(code:001)"}var p=ASN1HEX.getPosArrayOfChildren_AtObj(s,t);if(p.length!=2){throw"malformed PKCS8 public key(code:002)"}if(s.substr(p[0],2)!="06"){throw"malformed PKCS8 public key(code:003)"}q.algoid=ASN1HEX.getHexOfV_AtObj(s,p[0]);if(s.substr(p[1],2)=="06"){q.algparam=ASN1HEX.getHexOfV_AtObj(s,p[1])}else{if(s.substr(p[1],2)=="30"){q.algparam={};q.algparam.p=ASN1HEX.getVbyList(s,p[1],[0],"02");q.algparam.q=ASN1HEX.getVbyList(s,p[1],[1],"02");q.algparam.g=ASN1HEX.getVbyList(s,p[1],[2],"02")}}if(s.substr(r[1],2)!="03"){throw"malformed PKCS8 public key(code:004)"}q.key=ASN1HEX.getHexOfV_AtObj(s,r[1]).substr(2);return q},getRSAKeyFromPublicPKCS8Hex:function(t){var s=ASN1HEX.getPosArrayOfChildren_AtObj(t,0);if(s.length!=2){throw"outer DERSequence shall have 2 elements: "+s.length}var r=ASN1HEX.getHexOfTLV_AtObj(t,s[0]);if(r!="300d06092a864886f70d0101010500"){throw"PKCS8 AlgorithmId is not rsaEncryption"}if(t.substr(s[1],2)!="03"){throw"PKCS8 Public Key is not BITSTRING encapslated."}var v=ASN1HEX.getStartPosOfV_AtObj(t,s[1])+2;if(t.substr(v,2)!="30"){throw"PKCS8 Public Key is not SEQUENCE."}var p=ASN1HEX.getPosArrayOfChildren_AtObj(t,v);if(p.length!=2){throw"inner DERSequence shall have 2 elements: "+p.length}if(t.substr(p[0],2)!="02"){throw"N is not ASN.1 INTEGER"}if(t.substr(p[1],2)!="02"){throw"E is not ASN.1 INTEGER"}var w=ASN1HEX.getHexOfV_AtObj(t,p[0]);var u=ASN1HEX.getHexOfV_AtObj(t,p[1]);var q=new RSAKey();q.setPublic(w,u);return q},}}();KEYUTIL.getKey=function(c,o,i){if(typeof RSAKey!="undefined"&&c instanceof RSAKey){return c}if(typeof KJUR.crypto.ECDSA!="undefined"&&c instanceof KJUR.crypto.ECDSA){return c}if(typeof KJUR.crypto.DSA!="undefined"&&c instanceof KJUR.crypto.DSA){return c}if(c.xy!==undefined&&c.curve!==undefined){return new KJUR.crypto.ECDSA({prv:c.xy,curve:c.curve})}if(c.n!==undefined&&c.e!==undefined&&c.d!==undefined&&c.p!==undefined&&c.q!==undefined&&c.dp!==undefined&&c.dq!==undefined&&c.co!==undefined){var n=new RSAKey();n.setPrivateEx(c.n,c.e,c.d,c.p,c.q,c.dp,c.dq,c.co);return n}if(c.p!==undefined&&c.q!==undefined&&c.g!==undefined&&c.y!==undefined&&c.x!==undefined){var n=new KJUR.crypto.DSA();n.setPrivate(c.p,c.q,c.g,c.y,c.x);return n}if(c.d!==undefined&&c.curve!==undefined){return new KJUR.crypto.ECDSA({pub:c.d,curve:c.curve})}if(c.n!==undefined&&c.e){var n=new RSAKey();n.setPublic(c.n,c.e);return n}if(c.p!==undefined&&c.q!==undefined&&c.g!==undefined&&c.y!==undefined&&c.x===undefined){var n=new KJUR.crypto.DSA();n.setPublic(c.p,c.q,c.g,c.y);return n}if(c.indexOf("-END CERTIFICATE-",0)!=-1||c.indexOf("-END X509 CERTIFICATE-",0)!=-1||c.indexOf("-END TRUSTED CERTIFICATE-",0)!=-1){return X509.getPublicKeyFromCertPEM(c)}if(i==="pkcs8pub"){return KEYUTIL.getKeyFromPublicPKCS8Hex(c)}if(c.indexOf("-END PUBLIC KEY-")!=-1){return KEYUTIL.getKeyFromPublicPKCS8PEM(c)}if(i==="pkcs5prv"){var n=new RSAKey();n.readPrivateKeyFromASN1HexString(c);return n}if(i==="pkcs5prv"){var n=new RSAKey();n.readPrivateKeyFromASN1HexString(c);return n}if(c.indexOf("-END RSA PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")==-1){var n=new RSAKey();n.readPrivateKeyFromPEMString(c);return n}if(c.indexOf("-END DSA PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")==-1){var m=this.getHexFromPEM(c,"DSA PRIVATE KEY");var b=ASN1HEX.getVbyList(m,0,[1],"02");var a=ASN1HEX.getVbyList(m,0,[2],"02");var e=ASN1HEX.getVbyList(m,0,[3],"02");var k=ASN1HEX.getVbyList(m,0,[4],"02");var l=ASN1HEX.getVbyList(m,0,[5],"02");var n=new KJUR.crypto.DSA();n.setPrivate(new BigInteger(b,16),new BigInteger(a,16),new BigInteger(e,16),new BigInteger(k,16),new BigInteger(l,16));return n}if(c.indexOf("-END PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(c)}if(c.indexOf("-END RSA PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")!=-1){return KEYUTIL.getRSAKeyFromEncryptedPKCS5PEM(c,o)}if(c.indexOf("-END EC PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")!=-1){var m=KEYUTIL.getDecryptedKeyHex(c,o);var n=ASN1HEX.getVbyList(m,0,[1],"04");var j=ASN1HEX.getVbyList(m,0,[2,0],"06");var d=ASN1HEX.getVbyList(m,0,[3,0],"03").substr(2);var h="";if(KJUR.crypto.OID.oidhex2name[j]!==undefined){h=KJUR.crypto.OID.oidhex2name[j]}else{throw"undefined OID(hex) in KJUR.crypto.OID: "+j}var f=new KJUR.crypto.ECDSA({name:h});f.setPublicKeyHex(d);f.setPrivateKeyHex(n);f.isPublic=false;return f}if(c.indexOf("-END DSA PRIVATE KEY-")!=-1&&c.indexOf("4,ENCRYPTED")!=-1){var m=KEYUTIL.getDecryptedKeyHex(c,o);var b=ASN1HEX.getVbyList(m,0,[1],"02");var a=ASN1HEX.getVbyList(m,0,[2],"02");var e=ASN1HEX.getVbyList(m,0,[3],"02");var k=ASN1HEX.getVbyList(m,0,[4],"02");var l=ASN1HEX.getVbyList(m,0,[5],"02");var n=new KJUR.crypto.DSA();n.setPrivate(new BigInteger(b,16),new BigInteger(a,16),new BigInteger(e,16),new BigInteger(k,16),new BigInteger(l,16));return n}if(c.indexOf("-END ENCRYPTED PRIVATE KEY-")!=-1){return KEYUTIL.getKeyFromEncryptedPKCS8PEM(c,o)}throw"not supported argument"};KEYUTIL.generateKeypair=function(a,c){if(a=="RSA"){var b=c;var h=new RSAKey();h.generate(b,"10001");h.isPrivate=true;h.isPublic=true;var f=new RSAKey();var e=h.n.toString(16);var i=h.e.toString(16);f.setPublic(e,i);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{if(a=="EC"){var d=c;var g=new KJUR.crypto.ECDSA({curve:d});var j=g.generateKeyPairHex();var h=new KJUR.crypto.ECDSA({curve:d});h.setPrivateKeyHex(j.ecprvhex);h.isPrivate=true;h.isPublic=false;var f=new KJUR.crypto.ECDSA({curve:d});f.setPublicKeyHex(j.ecpubhex);f.isPrivate=false;f.isPublic=true;var k={};k.prvKeyObj=h;k.pubKeyObj=f;return k}else{throw"unknown algorithm: "+a}}};KEYUTIL.getPEM=function(a,r,o,g,j){var v=KJUR.asn1;var u=KJUR.crypto;function p(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.n}},{"int":s.e},{"int":{bigint:s.d}},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.dmp1}},{"int":{bigint:s.dmq1}},{"int":{bigint:s.coeff}}]});return w}function q(w){var s=KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:w.prvKeyHex}},{tag:["a0",true,{oid:{name:w.curveName}}]},{tag:["a1",true,{bitstr:{hex:"00"+w.pubKeyHex}}]}]});return s}function n(s){var w=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{"int":{bigint:s.p}},{"int":{bigint:s.q}},{"int":{bigint:s.g}},{"int":{bigint:s.y}},{"int":{bigint:s.x}}]});return w}if(((typeof RSAKey!="undefined"&&a instanceof RSAKey)||(typeof u.DSA!="undefined"&&a instanceof u.DSA)||(typeof u.ECDSA!="undefined"&&a instanceof u.ECDSA))&&a.isPublic==true&&(r===undefined||r=="PKCS8PUB")){var t=new KJUR.asn1.x509.SubjectPublicKeyInfo(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"PUBLIC KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o===undefined||o==null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"RSA PRIVATE KEY")}if(r=="PKCS1PRV"&&typeof RSAKey!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o===undefined||o==null)&&a.isPrivate==true){var f=new KJUR.asn1.DERObjectIdentifier({name:a.curveName});var l=f.getEncodedHex();var e=q(a);var k=e.getEncodedHex();var i="";i+=v.ASN1Util.getPEMStringFromHex(l,"EC PARAMETERS");i+=v.ASN1Util.getPEMStringFromHex(k,"EC PRIVATE KEY");return i}if(r=="PKCS1PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o===undefined||o==null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();return v.ASN1Util.getPEMStringFromHex(m,"DSA PRIVATE KEY")}if(r=="PKCS5PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=p(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=q(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC",m,o,g)}if(r=="PKCS5PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&(o!==undefined&&o!=null)&&a.isPrivate==true){var t=n(a);var m=t.getEncodedHex();if(g===undefined){g="DES-EDE3-CBC"}return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA",m,o,g)}var h=function(w,s){var y=b(w,s);var x=new KJUR.asn1.ASN1Util.newObject({seq:[{seq:[{oid:{name:"pkcs5PBES2"}},{seq:[{seq:[{oid:{name:"pkcs5PBKDF2"}},{seq:[{octstr:{hex:y.pbkdf2Salt}},{"int":y.pbkdf2Iter}]}]},{seq:[{oid:{name:"des-EDE3-CBC"}},{octstr:{hex:y.encryptionSchemeIV}}]}]}]},{octstr:{hex:y.ciphertext}}]});return x.getEncodedHex()};var b=function(D,E){var x=100;var C=CryptoJS.lib.WordArray.random(8);var B="DES-EDE3-CBC";var s=CryptoJS.lib.WordArray.random(8);var y=CryptoJS.PBKDF2(E,C,{keySize:192/32,iterations:x});var z=CryptoJS.enc.Hex.parse(D);var A=CryptoJS.TripleDES.encrypt(z,y,{iv:s})+"";var w={};w.ciphertext=A;w.pbkdf2Salt=CryptoJS.enc.Hex.stringify(C);w.pbkdf2Iter=x;w.encryptionSchemeAlg=B;w.encryptionSchemeIV=CryptoJS.enc.Hex.stringify(s);return w};if(r=="PKCS8PRV"&&typeof RSAKey!="undefined"&&a instanceof RSAKey&&a.isPrivate==true){var d=p(a);var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"rsaEncryption"}},{"null":true}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.ECDSA!="undefined"&&a instanceof KJUR.crypto.ECDSA&&a.isPrivate==true){var d=new KJUR.asn1.ASN1Util.newObject({seq:[{"int":1},{octstr:{hex:a.prvKeyHex}},{tag:["a1",true,{bitstr:{hex:"00"+a.pubKeyHex}}]}]});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"ecPublicKey"}},{oid:{name:a.curveName}}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}if(r=="PKCS8PRV"&&typeof KJUR.crypto.DSA!="undefined"&&a instanceof KJUR.crypto.DSA&&a.isPrivate==true){var d=new KJUR.asn1.DERInteger({bigint:a.x});var c=d.getEncodedHex();var t=KJUR.asn1.ASN1Util.newObject({seq:[{"int":0},{seq:[{oid:{name:"dsa"}},{seq:[{"int":{bigint:a.p}},{"int":{bigint:a.q}},{"int":{bigint:a.g}}]}]},{octstr:{hex:c}}]});var m=t.getEncodedHex();if(o===undefined||o==null){return v.ASN1Util.getPEMStringFromHex(m,"PRIVATE KEY")}else{var k=h(m,o);return v.ASN1Util.getPEMStringFromHex(k,"ENCRYPTED PRIVATE KEY")}}throw"unsupported object nor format"};KEYUTIL.getKeyFromCSRPEM=function(b){var a=KEYUTIL.getHexFromPEM(b,"CERTIFICATE REQUEST");var c=KEYUTIL.getKeyFromCSRHex(a);return c};KEYUTIL.getKeyFromCSRHex=function(a){var c=KEYUTIL.parseCSRHex(a);var b=KEYUTIL.getKey(c.p8pubkeyhex,null,"pkcs8pub");return b};KEYUTIL.parseCSRHex=function(c){var b={};var e=c;if(e.substr(0,2)!="30"){throw"malformed CSR(code:001)"}var d=ASN1HEX.getPosArrayOfChildren_AtObj(e,0);if(d.length<1){throw"malformed CSR(code:002)"}if(e.substr(d[0],2)!="30"){throw"malformed CSR(code:003)"}var a=ASN1HEX.getPosArrayOfChildren_AtObj(e,d[0]);if(a.length<3){throw"malformed CSR(code:004)"}b.p8pubkeyhex=ASN1HEX.getHexOfTLV_AtObj(e,a[2]);return b};
/*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
function _rsapem_pemToBase64(b){var a=b;a=a.replace("-----BEGIN RSA PRIVATE KEY-----","");a=a.replace("-----END RSA PRIVATE KEY-----","");a=a.replace(/[ \n]+/g,"");return a}function _rsapem_getPosArrayOfChildrenFromHex(d){var j=new Array();var k=ASN1HEX.getStartPosOfV_AtObj(d,0);var f=ASN1HEX.getPosOfNextSibling_AtObj(d,k);var h=ASN1HEX.getPosOfNextSibling_AtObj(d,f);var b=ASN1HEX.getPosOfNextSibling_AtObj(d,h);var l=ASN1HEX.getPosOfNextSibling_AtObj(d,b);var e=ASN1HEX.getPosOfNextSibling_AtObj(d,l);var g=ASN1HEX.getPosOfNextSibling_AtObj(d,e);var c=ASN1HEX.getPosOfNextSibling_AtObj(d,g);var i=ASN1HEX.getPosOfNextSibling_AtObj(d,c);j.push(k,f,h,b,l,e,g,c,i);return j}function _rsapem_getHexValueArrayOfChildrenFromHex(i){var o=_rsapem_getPosArrayOfChildrenFromHex(i);var r=ASN1HEX.getHexOfV_AtObj(i,o[0]);var f=ASN1HEX.getHexOfV_AtObj(i,o[1]);var j=ASN1HEX.getHexOfV_AtObj(i,o[2]);var k=ASN1HEX.getHexOfV_AtObj(i,o[3]);var c=ASN1HEX.getHexOfV_AtObj(i,o[4]);var b=ASN1HEX.getHexOfV_AtObj(i,o[5]);var h=ASN1HEX.getHexOfV_AtObj(i,o[6]);var g=ASN1HEX.getHexOfV_AtObj(i,o[7]);var l=ASN1HEX.getHexOfV_AtObj(i,o[8]);var m=new Array();m.push(r,f,j,k,c,b,h,g,l);return m}function _rsapem_readPrivateKeyFromASN1HexString(c){var b=_rsapem_getHexValueArrayOfChildrenFromHex(c);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}function _rsapem_readPrivateKeyFromPEMString(e){var c=_rsapem_pemToBase64(e);var d=b64tohex(c);var b=_rsapem_getHexValueArrayOfChildrenFromHex(d);this.setPrivateEx(b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8])}RSAKey.prototype.readPrivateKeyFromPEMString=_rsapem_readPrivateKeyFromPEMString;RSAKey.prototype.readPrivateKeyFromASN1HexString=_rsapem_readPrivateKeyFromASN1HexString;
/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
var _RE_HEXDECONLY=new RegExp("");_RE_HEXDECONLY.compile("[^0-9a-f]","gi");function _rsasign_getHexPaddedDigestInfoForString(d,e,a){var b=function(f){return KJUR.crypto.Util.hashString(f,a)};var c=b(d);return KJUR.crypto.Util.getPaddedDigestInfoHex(c,a,e)}function _zeroPaddingOfSignature(e,d){var c="";var a=d/4-e.length;for(var b=0;b<a;b++){c=c+"0"}return c+e}function _rsasign_signString(d,a){var b=function(e){return KJUR.crypto.Util.hashString(e,a)};var c=b(d);return this.signWithMessageHash(c,a)}function _rsasign_signWithMessageHash(e,c){var f=KJUR.crypto.Util.getPaddedDigestInfoHex(e,c,this.n.bitLength());var b=parseBigInt(f,16);var d=this.doPrivate(b);var a=d.toString(16);return _zeroPaddingOfSignature(a,this.n.bitLength())}function _rsasign_signStringWithSHA1(a){return _rsasign_signString.call(this,a,"sha1")}function _rsasign_signStringWithSHA256(a){return _rsasign_signString.call(this,a,"sha256")}function pss_mgf1_str(c,a,e){var b="",d=0;while(b.length<a){b+=hextorstr(e(rstrtohex(c+String.fromCharCode.apply(String,[(d&4278190080)>>24,(d&16711680)>>16,(d&65280)>>8,d&255]))));d+=1}return b}function _rsasign_signStringPSS(e,a,d){var c=function(f){return KJUR.crypto.Util.hashHex(f,a)};var b=c(rstrtohex(e));if(d===undefined){d=-1}return this.signWithMessageHashPSS(b,a,d)}function _rsasign_signWithMessageHashPSS(l,a,k){var b=hextorstr(l);var g=b.length;var m=this.n.bitLength()-1;var c=Math.ceil(m/8);var d;var o=function(i){return KJUR.crypto.Util.hashHex(i,a)};if(k===-1||k===undefined){k=g}else{if(k===-2){k=c-g-2}else{if(k<-2){throw"invalid salt length"}}}if(c<(g+k+2)){throw"data too long"}var f="";if(k>0){f=new Array(k);new SecureRandom().nextBytes(f);f=String.fromCharCode.apply(String,f)}var n=hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00"+b+f)));var j=[];for(d=0;d<c-k-g-2;d+=1){j[d]=0}var e=String.fromCharCode.apply(String,j)+"\x01"+f;var h=pss_mgf1_str(n,e.length,o);var q=[];for(d=0;d<e.length;d+=1){q[d]=e.charCodeAt(d)^h.charCodeAt(d)}var p=(65280>>(8*c-m))&255;q[0]&=~p;for(d=0;d<g;d++){q.push(n.charCodeAt(d))}q.push(188);return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16),this.n.bitLength())}function _rsasign_getDecryptSignatureBI(a,d,c){var b=new RSAKey();b.setPublic(d,c);var e=b.doPublic(a);return e}function _rsasign_getHexDigestInfoFromSig(a,c,b){var e=_rsasign_getDecryptSignatureBI(a,c,b);var d=e.toString(16).replace(/^1f+00/,"");return d}function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f){for(var e in KJUR.crypto.Util.DIGESTINFOHEAD){var d=KJUR.crypto.Util.DIGESTINFOHEAD[e];var b=d.length;if(f.substring(0,b)==d){var c=[e,f.substring(b)];return c}}return[]}function _rsasign_verifySignatureWithArgs(f,b,g,j){var e=_rsasign_getHexDigestInfoFromSig(b,g,j);var h=_rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if(h.length==0){return false}var d=h[0];var i=h[1];var a=function(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(i==c)}function _rsasign_verifyHexSignatureForMessage(c,b){var d=parseBigInt(c,16);var a=_rsasign_verifySignatureWithArgs(b,d,this.n.toString(16),this.e.toString(16));return a}function _rsasign_verifyString(f,j){j=j.replace(_RE_HEXDECONLY,"");j=j.replace(/[ \n]+/g,"");var b=parseBigInt(j,16);if(b.bitLength()>this.n.bitLength()){return 0}var i=this.doPublic(b);var e=i.toString(16).replace(/^1f+00/,"");var g=_rsasign_getAlgNameAndHashFromHexDisgestInfo(e);if(g.length==0){return false}var d=g[0];var h=g[1];var a=function(k){return KJUR.crypto.Util.hashString(k,d)};var c=a(f);return(h==c)}function _rsasign_verifyWithMessageHash(e,a){a=a.replace(_RE_HEXDECONLY,"");a=a.replace(/[ \n]+/g,"");var b=parseBigInt(a,16);if(b.bitLength()>this.n.bitLength()){return 0}var h=this.doPublic(b);var g=h.toString(16).replace(/^1f+00/,"");var c=_rsasign_getAlgNameAndHashFromHexDisgestInfo(g);if(c.length==0){return false}var d=c[0];var f=c[1];return(f==e)}function _rsasign_verifyStringPSS(c,b,a,f){var e=function(g){return KJUR.crypto.Util.hashHex(g,a)};var d=e(rstrtohex(c));if(f===undefined){f=-1}return this.verifyWithMessageHashPSS(d,b,a,f)}function _rsasign_verifyWithMessageHashPSS(f,s,l,c){var k=new BigInteger(s,16);if(k.bitLength()>this.n.bitLength()){return false}var r=function(i){return KJUR.crypto.Util.hashHex(i,l)};var j=hextorstr(f);var h=j.length;var g=this.n.bitLength()-1;var m=Math.ceil(g/8);var q;if(c===-1||c===undefined){c=h}else{if(c===-2){c=m-h-2}else{if(c<-2){throw"invalid salt length"}}}if(m<(h+c+2)){throw"data too long"}var a=this.doPublic(k).toByteArray();for(q=0;q<a.length;q+=1){a[q]&=255}while(a.length<m){a.unshift(0)}if(a[m-1]!==188){throw"encoded message does not end in 0xbc"}a=String.fromCharCode.apply(String,a);var d=a.substr(0,m-h-1);var e=a.substr(d.length,h);var p=(65280>>(8*m-g))&255;if((d.charCodeAt(0)&p)!==0){throw"bits beyond keysize not zero"}var n=pss_mgf1_str(e,d.length,r);var o=[];for(q=0;q<d.length;q+=1){o[q]=d.charCodeAt(q)^n.charCodeAt(q)}o[0]&=~p;var b=m-h-c-2;for(q=0;q<b;q+=1){if(o[q]!==0){throw"leftmost octets not zero"}}if(o[b]!==1){throw"0x01 marker not found"}return e===hextorstr(r(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00"+j+String.fromCharCode.apply(String,o.slice(-c)))))}RSAKey.prototype.signWithMessageHash=_rsasign_signWithMessageHash;RSAKey.prototype.signString=_rsasign_signString;RSAKey.prototype.signStringWithSHA1=_rsasign_signStringWithSHA1;RSAKey.prototype.signStringWithSHA256=_rsasign_signStringWithSHA256;RSAKey.prototype.sign=_rsasign_signString;RSAKey.prototype.signWithSHA1=_rsasign_signStringWithSHA1;RSAKey.prototype.signWithSHA256=_rsasign_signStringWithSHA256;RSAKey.prototype.signWithMessageHashPSS=_rsasign_signWithMessageHashPSS;RSAKey.prototype.signStringPSS=_rsasign_signStringPSS;RSAKey.prototype.signPSS=_rsasign_signStringPSS;RSAKey.SALT_LEN_HLEN=-1;RSAKey.SALT_LEN_MAX=-2;RSAKey.prototype.verifyWithMessageHash=_rsasign_verifyWithMessageHash;RSAKey.prototype.verifyString=_rsasign_verifyString;RSAKey.prototype.verifyHexSignatureForMessage=_rsasign_verifyHexSignatureForMessage;RSAKey.prototype.verify=_rsasign_verifyString;RSAKey.prototype.verifyHexSignatureForByteArrayMessage=_rsasign_verifyHexSignatureForMessage;RSAKey.prototype.verifyWithMessageHashPSS=_rsasign_verifyWithMessageHashPSS;RSAKey.prototype.verifyStringPSS=_rsasign_verifyStringPSS;RSAKey.prototype.verifyPSS=_rsasign_verifyStringPSS;RSAKey.SALT_LEN_RECOVER=-2;
/*! x509-1.1.3.js (c) 2012-2014 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
function X509(){this.subjectPublicKeyRSA=null;this.subjectPublicKeyRSA_hN=null;this.subjectPublicKeyRSA_hE=null;this.hex=null;this.getSerialNumberHex=function(){return ASN1HEX.getDecendantHexVByNthList(this.hex,0,[0,1])};this.getIssuerHex=function(){return ASN1HEX.getDecendantHexTLVByNthList(this.hex,0,[0,3])};this.getIssuerString=function(){return X509.hex2dn(ASN1HEX.getDecendantHexTLVByNthList(this.hex,0,[0,3]))};this.getSubjectHex=function(){return ASN1HEX.getDecendantHexTLVByNthList(this.hex,0,[0,5])};this.getSubjectString=function(){return X509.hex2dn(ASN1HEX.getDecendantHexTLVByNthList(this.hex,0,[0,5]))};this.getNotBefore=function(){var a=ASN1HEX.getDecendantHexVByNthList(this.hex,0,[0,4,0]);a=a.replace(/(..)/g,"%$1");a=decodeURIComponent(a);return a};this.getNotAfter=function(){var a=ASN1HEX.getDecendantHexVByNthList(this.hex,0,[0,4,1]);a=a.replace(/(..)/g,"%$1");a=decodeURIComponent(a);return a};this.readCertPEM=function(c){var e=X509.pemToHex(c);var b=X509.getPublicKeyHexArrayFromCertHex(e);var d=new RSAKey();d.setPublic(b[0],b[1]);this.subjectPublicKeyRSA=d;this.subjectPublicKeyRSA_hN=b[0];this.subjectPublicKeyRSA_hE=b[1];this.hex=e};this.readCertPEMWithoutRSAInit=function(c){var d=X509.pemToHex(c);var b=X509.getPublicKeyHexArrayFromCertHex(d);this.subjectPublicKeyRSA.setPublic(b[0],b[1]);this.subjectPublicKeyRSA_hN=b[0];this.subjectPublicKeyRSA_hE=b[1];this.hex=d}}X509.pemToBase64=function(a){var b=a;b=b.replace("-----BEGIN CERTIFICATE-----","");b=b.replace("-----END CERTIFICATE-----","");b=b.replace(/[ \n]+/g,"");return b};X509.pemToHex=function(a){var c=X509.pemToBase64(a);var b=b64tohex(c);return b};X509.getSubjectPublicKeyPosFromCertHex=function(f){var e=X509.getSubjectPublicKeyInfoPosFromCertHex(f);if(e==-1){return -1}var b=ASN1HEX.getPosArrayOfChildren_AtObj(f,e);if(b.length!=2){return -1}var d=b[1];if(f.substring(d,d+2)!="03"){return -1}var c=ASN1HEX.getStartPosOfV_AtObj(f,d);if(f.substring(c,c+2)!="00"){return -1}return c+2};X509.getSubjectPublicKeyInfoPosFromCertHex=function(d){var c=ASN1HEX.getStartPosOfV_AtObj(d,0);var b=ASN1HEX.getPosArrayOfChildren_AtObj(d,c);if(b.length<1){return -1}if(d.substring(b[0],b[0]+10)=="a003020102"){if(b.length<6){return -1}return b[6]}else{if(b.length<5){return -1}return b[5]}};X509.getPublicKeyHexArrayFromCertHex=function(f){var e=X509.getSubjectPublicKeyPosFromCertHex(f);var b=ASN1HEX.getPosArrayOfChildren_AtObj(f,e);if(b.length!=2){return[]}var d=ASN1HEX.getHexOfV_AtObj(f,b[0]);var c=ASN1HEX.getHexOfV_AtObj(f,b[1]);if(d!=null&&c!=null){return[d,c]}else{return[]}};X509.getHexTbsCertificateFromCert=function(b){var a=ASN1HEX.getStartPosOfV_AtObj(b,0);return a};X509.getPublicKeyHexArrayFromCertPEM=function(c){var d=X509.pemToHex(c);var b=X509.getPublicKeyHexArrayFromCertHex(d);return b};X509.hex2dn=function(e){var f="";var c=ASN1HEX.getPosArrayOfChildren_AtObj(e,0);for(var d=0;d<c.length;d++){var b=ASN1HEX.getHexOfTLV_AtObj(e,c[d]);f=f+"/"+X509.hex2rdn(b)}return f};X509.hex2rdn=function(a){var f=ASN1HEX.getDecendantHexTLVByNthList(a,0,[0,0]);var e=ASN1HEX.getDecendantHexVByNthList(a,0,[0,1]);var c="";try{c=X509.DN_ATTRHEX[f]}catch(b){c=f}e=e.replace(/(..)/g,"%$1");var d=decodeURIComponent(e);return c+"="+d};X509.DN_ATTRHEX={"0603550406":"C","060355040a":"O","060355040b":"OU","0603550403":"CN","0603550405":"SN","0603550408":"ST","0603550407":"L",};X509.getPublicKeyFromCertPEM=function(f){var c=X509.getPublicKeyInfoPropOfCertPEM(f);if(c.algoid=="2a864886f70d010101"){var i=KEYUTIL.parsePublicRawRSAKeyHex(c.keyhex);var j=new RSAKey();j.setPublic(i.n,i.e);return j}else{if(c.algoid=="2a8648ce3d0201"){var e=KJUR.crypto.OID.oidhex2name[c.algparam];var j=new KJUR.crypto.ECDSA({curve:e,info:c.keyhex});j.setPublicKeyHex(c.keyhex);return j}else{if(c.algoid=="2a8648ce380401"){var b=ASN1HEX.getVbyList(c.algparam,0,[0],"02");var a=ASN1HEX.getVbyList(c.algparam,0,[1],"02");var d=ASN1HEX.getVbyList(c.algparam,0,[2],"02");var h=ASN1HEX.getHexOfV_AtObj(c.keyhex,0);h=h.substr(2);var j=new KJUR.crypto.DSA();j.setPublic(new BigInteger(b,16),new BigInteger(a,16),new BigInteger(d,16),new BigInteger(h,16));return j}else{throw"unsupported key"}}}};X509.getPublicKeyInfoPropOfCertPEM=function(e){var c={};c.algparam=null;var g=X509.pemToHex(e);var d=ASN1HEX.getPosArrayOfChildren_AtObj(g,0);if(d.length!=3){throw"malformed X.509 certificate PEM (code:001)"}if(g.substr(d[0],2)!="30"){throw"malformed X.509 certificate PEM (code:002)"}var b=ASN1HEX.getPosArrayOfChildren_AtObj(g,d[0]);if(b.length<7){throw"malformed X.509 certificate PEM (code:003)"}var h=ASN1HEX.getPosArrayOfChildren_AtObj(g,b[6]);if(h.length!=2){throw"malformed X.509 certificate PEM (code:004)"}var f=ASN1HEX.getPosArrayOfChildren_AtObj(g,h[0]);if(f.length!=2){throw"malformed X.509 certificate PEM (code:005)"}c.algoid=ASN1HEX.getHexOfV_AtObj(g,f[0]);if(g.substr(f[1],2)=="06"){c.algparam=ASN1HEX.getHexOfV_AtObj(g,f[1])}else{if(g.substr(f[1],2)=="30"){c.algparam=ASN1HEX.getHexOfTLV_AtObj(g,f[1])}}if(g.substr(h[1],2)!="03"){throw"malformed X.509 certificate PEM (code:006)"}var a=ASN1HEX.getHexOfV_AtObj(g,h[1]);c.keyhex=a.substr(2);return c};
</script>
<script type="text/javascript">
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS=CryptoJS||function(v,p){var d={},u=d.lib={},r=function(){},f=u.Base={extend:function(a){r.prototype=this;var b=new r;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
s=u.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=p?b:4*a.length},toString:function(a){return(a||y).stringify(this)},concat:function(a){var b=this.words,c=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var n=0;n<a;n++)b[j+n>>>2]|=(c[n>>>2]>>>24-8*(n%4)&255)<<24-8*((j+n)%4);else if(65535<c.length)for(n=0;n<a;n+=4)b[j+n>>>2]=c[n>>>2];else b.push.apply(b,c);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
32-8*(b%4);a.length=v.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],c=0;c<a;c+=4)b.push(4294967296*v.random()|0);return new s.init(b,a)}}),x=d.enc={},y=x.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],j=0;j<a;j++){var n=b[j>>>2]>>>24-8*(j%4)&255;c.push((n>>>4).toString(16));c.push((n&15).toString(16))}return c.join("")},parse:function(a){for(var b=a.length,c=[],j=0;j<b;j+=2)c[j>>>3]|=parseInt(a.substr(j,
2),16)<<24-4*(j%8);return new s.init(c,b/2)}},e=x.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],j=0;j<a;j++)c.push(String.fromCharCode(b[j>>>2]>>>24-8*(j%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],j=0;j<b;j++)c[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new s.init(c,b)}},q=x.Utf8={stringify:function(a){try{return decodeURIComponent(escape(e.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return e.parse(unescape(encodeURIComponent(a)))}},
t=u.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new s.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=q.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,c=b.words,j=b.sigBytes,n=this.blockSize,e=j/(4*n),e=a?v.ceil(e):v.max((e|0)-this._minBufferSize,0);a=e*n;j=v.min(4*a,j);if(a){for(var f=0;f<a;f+=n)this._doProcessBlock(c,f);f=c.splice(0,a);b.sigBytes-=j}return new s.init(f,j)},clone:function(){var a=f.clone.call(this);
a._data=this._data.clone();return a},_minBufferSize:0});u.Hasher=t.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){t.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return(new w.HMAC.init(a,
c)).finalize(b)}}});var w=d.algo={};return d}(Math);
(function(v){var p=CryptoJS,d=p.lib,u=d.Base,r=d.WordArray,p=p.x64={};p.Word=u.extend({init:function(f,s){this.high=f;this.low=s}});p.WordArray=u.extend({init:function(f,s){f=this.words=f||[];this.sigBytes=s!=v?s:8*f.length},toX32:function(){for(var f=this.words,s=f.length,d=[],p=0;p<s;p++){var e=f[p];d.push(e.high);d.push(e.low)}return r.create(d,this.sigBytes)},clone:function(){for(var f=u.clone.call(this),d=f.words=this.words.slice(0),p=d.length,r=0;r<p;r++)d[r]=d[r].clone();return f}})})();
(function(v){for(var p=CryptoJS,d=p.lib,u=d.WordArray,r=d.Hasher,f=p.x64.Word,d=p.algo,s=[],x=[],y=[],e=1,q=0,t=0;24>t;t++){s[e+5*q]=(t+1)*(t+2)/2%64;var w=(2*e+3*q)%5,e=q%5,q=w}for(e=0;5>e;e++)for(q=0;5>q;q++)x[e+5*q]=q+5*((2*e+3*q)%5);e=1;for(q=0;24>q;q++){for(var a=w=t=0;7>a;a++){if(e&1){var b=(1<<a)-1;32>b?w^=1<<b:t^=1<<b-32}e=e&128?e<<1^113:e<<1}y[q]=f.create(t,w)}for(var c=[],e=0;25>e;e++)c[e]=f.create();d=d.SHA3=r.extend({cfg:r.cfg.extend({outputLength:512}),_doReset:function(){for(var a=this._state=
[],b=0;25>b;b++)a[b]=new f.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(a,b){for(var e=this._state,f=this.blockSize/2,h=0;h<f;h++){var l=a[b+2*h],m=a[b+2*h+1],l=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360,m=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360,g=e[h];g.high^=m;g.low^=l}for(f=0;24>f;f++){for(h=0;5>h;h++){for(var d=l=0,k=0;5>k;k++)g=e[h+5*k],l^=g.high,d^=g.low;g=c[h];g.high=l;g.low=d}for(h=0;5>h;h++){g=c[(h+4)%5];l=c[(h+1)%5];m=l.high;k=l.low;l=g.high^
(m<<1|k>>>31);d=g.low^(k<<1|m>>>31);for(k=0;5>k;k++)g=e[h+5*k],g.high^=l,g.low^=d}for(m=1;25>m;m++)g=e[m],h=g.high,g=g.low,k=s[m],32>k?(l=h<<k|g>>>32-k,d=g<<k|h>>>32-k):(l=g<<k-32|h>>>64-k,d=h<<k-32|g>>>64-k),g=c[x[m]],g.high=l,g.low=d;g=c[0];h=e[0];g.high=h.high;g.low=h.low;for(h=0;5>h;h++)for(k=0;5>k;k++)m=h+5*k,g=e[m],l=c[m],m=c[(h+1)%5+5*k],d=c[(h+2)%5+5*k],g.high=l.high^~m.high&d.high,g.low=l.low^~m.low&d.low;g=e[0];h=y[f];g.high^=h.high;g.low^=h.low}},_doFinalize:function(){var a=this._data,
b=a.words,c=8*a.sigBytes,e=32*this.blockSize;b[c>>>5]|=1<<24-c%32;b[(v.ceil((c+1)/e)*e>>>5)-1]|=128;a.sigBytes=4*b.length;this._process();for(var a=this._state,b=this.cfg.outputLength/8,c=b/8,e=[],h=0;h<c;h++){var d=a[h],f=d.high,d=d.low,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360,d=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;e.push(d);e.push(f)}return new u.init(e,b)},clone:function(){for(var a=r.clone.call(this),b=a._state=this._state.slice(0),c=0;25>c;c++)b[c]=b[c].clone();return a}});
p.SHA3=r._createHelper(d);p.HmacSHA3=r._createHmacHelper(d)})(Math);
</script>
<script type="text/javascript">
// Base58 encoding/decoding
// Originally written by Mike Hearn for BitcoinJ
// Copyright (c) 2011 Google Inc
// Ported to JavaScript by Stefan Thomas
// Merged Buffer refactorings from base58-native by Stephen Pair
// Copyright (c) 2013 BitPay Inc
var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
var ALPHABET_MAP = {}
for(var i = 0; i < ALPHABET.length; i++) {
ALPHABET_MAP[ALPHABET.charAt(i)] = i
}
var BASE = 58
function bs58_encode(buffer) {
if (buffer.length === 0) return ''
var i, j, digits = [0]
for (i = 0; i < buffer.length; i++) {
for (j = 0; j < digits.length; j++) digits[j] <<= 8
digits[digits.length - 1] += buffer[i]
var carry = 0
for (j = digits.length - 1; j >= 0; j--){
digits[j] += carry
carry = (digits[j] / BASE) | 0
digits[j] %= BASE
}
while (carry) {
digits.unshift(carry)
carry = (digits[0] / BASE) | 0
digits[0] %= BASE
}
}
// deal with leading zeros
for (i = 0; i < buffer.length - 1 && buffer[i] == 0; i++) digits.unshift(0)
return digits.map(function(digit) { return ALPHABET[digit] }).join('')
}
function bs58_decode(string) {
if (string.length === 0) return 0
var input = string.split('').map(function(c){
//assert.notEqual(ALPHABET_MAP[c], undefined, 'Non-base58 character')
return ALPHABET_MAP[c]
})
var i, j, bytes = [0]
for (i = 0; i < input.length; i++) {
for (j = 0; j < bytes.length; j++) bytes[j] *= BASE
bytes[bytes.length - 1] += input[i]
var carry = 0
for (j = bytes.length - 1; j >= 0; j--){
bytes[j] += carry
carry = bytes[j] >> 8
bytes[j] &= 0xff
}
while (carry) {
bytes.unshift(carry)
carry = bytes[0] >> 8
bytes[0] &= 0xff
}
}
// deal with leading zeros
for (i = 0; i < input.length - 1 && input[i] == 0; i++) bytes.unshift(0)
return bytes
}
</script>
<script type="text/javascript">
/*!
* Crypto-JS v2.5.4 Crypto.js
* http://code.google.com/p/crypto-js/
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
* http://code.google.com/p/crypto-js/wiki/License
*/
if (typeof Crypto == "undefined" || !Crypto.util) {
(function () {
var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// Global Crypto object
var Crypto = window.Crypto = {};
// Crypto utilities
var util = Crypto.util = {
// Bit-wise rotate left
rotl: function (n, b) {
return (n << b) | (n >>> (32 - b));
},
// Bit-wise rotate right
rotr: function (n, b) {
return (n << (32 - b)) | (n >>> b);
},
// Swap big-endian to little-endian and vice versa
endian: function (n) {
// If number given, swap endian
if (n.constructor == Number) {
return util.rotl(n, 8) & 0x00FF00FF |
util.rotl(n, 24) & 0xFF00FF00;
}
// Else, assume array and swap all items
for (var i = 0; i < n.length; i++)
n[i] = util.endian(n[i]);
return n;
},
// Generate an array of any length of random bytes
randomBytes: function (n) {
for (var bytes = []; n > 0; n--)
bytes.push(Math.floor(Math.random() * 256));
return bytes;
},
// Convert a byte array to big-endian 32-bit words
bytesToWords: function (bytes) {
for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
words[b >>> 5] |= (bytes[i] & 0xFF) << (24 - b % 32);
return words;
},
// Convert big-endian 32-bit words to a byte array
wordsToBytes: function (words) {
for (var bytes = [], b = 0; b < words.length * 32; b += 8)
bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
return bytes;
},
// Convert a byte array to a hex string
bytesToHex: function (bytes) {
for (var hex = [], i = 0; i < bytes.length; i++) {
hex.push((bytes[i] >>> 4).toString(16));
hex.push((bytes[i] & 0xF).toString(16));
}
return hex.join("");
},
// Convert a hex string to a byte array
hexToBytes: function (hex) {
for (var bytes = [], c = 0; c < hex.length; c += 2)
bytes.push(parseInt(hex.substr(c, 2), 16));
return bytes;
},
// Convert a byte array to a base-64 string
bytesToBase64: function (bytes) {
for (var base64 = [], i = 0; i < bytes.length; i += 3) {
var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
for (var j = 0; j < 4; j++) {
if (i * 8 + j * 6 <= bytes.length * 8)
base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));
else base64.push("=");
}
}
return base64.join("");
},
// Convert a base-64 string to a byte array
base64ToBytes: function (base64) {
// Remove non-base-64 characters
base64 = base64.replace(/[^A-Z0-9+\/]/ig, "");
for (var bytes = [], i = 0, imod4 = 0; i < base64.length; imod4 = ++i % 4) {
if (imod4 == 0) continue;
bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2)) |
(base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));
}
return bytes;
}
};
// Crypto character encodings
var charenc = Crypto.charenc = {};
// UTF-8 encoding
var UTF8 = charenc.UTF8 = {
// Convert a string to a byte array
stringToBytes: function (str) {
return Binary.stringToBytes(unescape(encodeURIComponent(str)));
},
// Convert a byte array to a string
bytesToString: function (bytes) {
return decodeURIComponent(escape(Binary.bytesToString(bytes)));
}
};
// Binary encoding
var Binary = charenc.Binary = {
// Convert a string to a byte array
stringToBytes: function (str) {
for (var bytes = [], i = 0; i < str.length; i++)
bytes.push(str.charCodeAt(i) & 0xFF);
return bytes;
},
// Convert a byte array to a string
bytesToString: function (bytes) {
for (var str = [], i = 0; i < bytes.length; i++)
str.push(String.fromCharCode(bytes[i]));
return str.join("");
}
};
})();
}
</script>
<script type="text/javascript">
/*!
* Crypto-JS v2.5.4 SHA256.js
* http://code.google.com/p/crypto-js/
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
* http://code.google.com/p/crypto-js/wiki/License
*/
(function () {
// Shortcuts
var C = Crypto,
util = C.util,
charenc = C.charenc,
UTF8 = charenc.UTF8,
Binary = charenc.Binary;
// Constants
var K = [0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2];
// Public API
var SHA256 = C.SHA256 = function (message, options) {
var digestbytes = util.wordsToBytes(SHA256._sha256(message));
return options && options.asBytes ? digestbytes :
options && options.asString ? Binary.bytesToString(digestbytes) :
util.bytesToHex(digestbytes);
};
// The core
SHA256._sha256 = function (message) {
// Convert to byte array
if (message.constructor == String) message = UTF8.stringToBytes(message);
/* else, assume byte array already */
var m = util.bytesToWords(message),
l = message.length * 8,
H = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19],
w = [],
a, b, c, d, e, f, g, h, i, j,
t1, t2;
// Padding
m[l >> 5] |= 0x80 << (24 - l % 32);
m[((l + 64 >> 9) << 4) + 15] = l;
for (var i = 0; i < m.length; i += 16) {
a = H[0];
b = H[1];
c = H[2];
d = H[3];
e = H[4];
f = H[5];
g = H[6];
h = H[7];
for (var j = 0; j < 64; j++) {
if (j < 16) w[j] = m[j + i];
else {
var gamma0x = w[j - 15],
gamma1x = w[j - 2],
gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
((gamma0x << 14) | (gamma0x >>> 18)) ^
(gamma0x >>> 3),
gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
((gamma1x << 13) | (gamma1x >>> 19)) ^
(gamma1x >>> 10);
w[j] = gamma0 + (w[j - 7] >>> 0) +
gamma1 + (w[j - 16] >>> 0);
}
var ch = e & f ^ ~e & g,
maj = a & b ^ a & c ^ b & c,
sigma0 = ((a << 30) | (a >>> 2)) ^
((a << 19) | (a >>> 13)) ^
((a << 10) | (a >>> 22)),
sigma1 = ((e << 26) | (e >>> 6)) ^
((e << 21) | (e >>> 11)) ^
((e << 7) | (e >>> 25));
t1 = (h >>> 0) + sigma1 + ch + (K[j]) + (w[j] >>> 0);
t2 = sigma0 + maj;
h = g;
g = f;
f = e;
e = (d + t1) >>> 0;
d = c;
c = b;
b = a;
a = (t1 + t2) >>> 0;
}
H[0] += a;
H[1] += b;
H[2] += c;
H[3] += d;
H[4] += e;
H[5] += f;
H[6] += g;
H[7] += h;
}
return H;
};
// Package private blocksize
SHA256._blocksize = 16;
SHA256._digestsize = 32;
})();
</script>
<script type="text/javascript">
/*!
* Crypto-JS v2.5.4 PBKDF2.js
* http://code.google.com/p/crypto-js/
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
* http://code.google.com/p/crypto-js/wiki/License
*/
(function () {
// Shortcuts
var C = Crypto,
util = C.util,
charenc = C.charenc,
UTF8 = charenc.UTF8,
Binary = charenc.Binary;
C.PBKDF2 = function (password, salt, keylen, options) {
// Convert to byte arrays
if (password.constructor == String) password = UTF8.stringToBytes(password);
if (salt.constructor == String) salt = UTF8.stringToBytes(salt);
/* else, assume byte arrays already */
// Defaults
var hasher = options && options.hasher || C.SHA1,
iterations = options && options.iterations || 1;
// Pseudo-random function
function PRF(password, salt) {
return C.HMAC(hasher, salt, password, { asBytes: true });
}
// Generate key
var derivedKeyBytes = [],
blockindex = 1;
while (derivedKeyBytes.length < keylen) {
var block = PRF(password, salt.concat(util.wordsToBytes([blockindex])));
for (var u = block, i = 1; i < iterations; i++) {
u = PRF(password, u);
for (var j = 0; j < block.length; j++) block[j] ^= u[j];
}
derivedKeyBytes = derivedKeyBytes.concat(block);
blockindex++;
}
// Truncate excess bytes
derivedKeyBytes.length = keylen;
return options && options.asBytes ? derivedKeyBytes :
options && options.asString ? Binary.bytesToString(derivedKeyBytes) :
util.bytesToHex(derivedKeyBytes);
};
})();
</script>
<script type="text/javascript">
/*!
* Crypto-JS v2.5.4 HMAC.js
* http://code.google.com/p/crypto-js/
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
* http://code.google.com/p/crypto-js/wiki/License
*/
(function () {
// Shortcuts
var C = Crypto,
util = C.util,
charenc = C.charenc,
UTF8 = charenc.UTF8,
Binary = charenc.Binary;
C.HMAC = function (hasher, message, key, options) {
// Convert to byte arrays
if (message.constructor == String) message = UTF8.stringToBytes(message);
if (key.constructor == String) key = UTF8.stringToBytes(key);
/* else, assume byte arrays already */
// Allow arbitrary length keys
if (key.length > hasher._blocksize * 4)
key = hasher(key, { asBytes: true });
// XOR keys with pad constants
var okey = key.slice(0),
ikey = key.slice(0);
for (var i = 0; i < hasher._blocksize * 4; i++) {
okey[i] ^= 0x5C;
ikey[i] ^= 0x36;
}
var hmacbytes = hasher(okey.concat(hasher(ikey.concat(message), { asBytes: true })), { asBytes: true });
return options && options.asBytes ? hmacbytes :
options && options.asString ? Binary.bytesToString(hmacbytes) :
util.bytesToHex(hmacbytes);
};
})();
</script>
<script type="text/javascript">
/*!
* Crypto-JS v2.5.4 AES.js
* http://code.google.com/p/crypto-js/
* Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
* http://code.google.com/p/crypto-js/wiki/License
*/
(function () {
// Shortcuts
var C = Crypto,
util = C.util,
charenc = C.charenc,
UTF8 = charenc.UTF8;
// Precomputed SBOX
var SBOX = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];
// Compute inverse SBOX lookup table
for (var INVSBOX = [], i = 0; i < 256; i++) INVSBOX[SBOX[i]] = i;
// Compute multiplication in GF(2^8) lookup tables
var MULT2 = [],
MULT3 = [],
MULT9 = [],
MULTB = [],
MULTD = [],
MULTE = [];
function xtime(a, b) {
for (var result = 0, i = 0; i < 8; i++) {
if (b & 1) result ^= a;
var hiBitSet = a & 0x80;
a = (a << 1) & 0xFF;
if (hiBitSet) a ^= 0x1b;
b >>>= 1;
}
return result;
}
for (var i = 0; i < 256; i++) {
MULT2[i] = xtime(i, 2);
MULT3[i] = xtime(i, 3);
MULT9[i] = xtime(i, 9);
MULTB[i] = xtime(i, 0xB);
MULTD[i] = xtime(i, 0xD);
MULTE[i] = xtime(i, 0xE);
}
// Precomputed RCon lookup
var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
// Inner state
var state = [[], [], [], []],
keylength,
nrounds,
keyschedule;
var AES = C.AES = {
/**
* Public API
*/
encrypt: function (message, password, options) {
options = options || {};
// Determine mode
var mode = options.mode || new C.mode.OFB;
// Allow mode to override options
if (mode.fixOptions) mode.fixOptions(options);
var
// Convert to bytes if message is a string
m = (
message.constructor == String ?
UTF8.stringToBytes(message) :
message
),
// Generate random IV
iv = options.iv || util.randomBytes(AES._blocksize * 4),
// Generate key
k = (
password.constructor == String ?
// Derive key from pass-phrase
C.PBKDF2(password, iv, 32, { asBytes: true }) :
// else, assume byte array representing cryptographic key
password
);
// Encrypt
AES._init(k);
mode.encrypt(AES, m, iv);
// Return ciphertext
m = options.iv ? m : iv.concat(m);
return (options && options.asBytes) ? m : util.bytesToBase64(m);
},
decrypt: function (ciphertext, password, options) {
options = options || {};
// Determine mode
var mode = options.mode || new C.mode.OFB;
// Allow mode to override options
if (mode.fixOptions) mode.fixOptions(options);
var
// Convert to bytes if ciphertext is a string
c = (
ciphertext.constructor == String ?
util.base64ToBytes(ciphertext) :
ciphertext
),
// Separate IV and message
iv = options.iv || c.splice(0, AES._blocksize * 4),
// Generate key
k = (
password.constructor == String ?
// Derive key from pass-phrase
C.PBKDF2(password, iv, 32, { asBytes: true }) :
// else, assume byte array representing cryptographic key
password
);
// Decrypt
AES._init(k);
mode.decrypt(AES, c, iv);
// Return plaintext
return (options && options.asBytes) ? c : UTF8.bytesToString(c);
},
/**
* Package private methods and properties
*/
_blocksize: 4,
_encryptblock: function (m, offset) {
// Set input
for (var row = 0; row < AES._blocksize; row++) {
for (var col = 0; col < 4; col++)
state[row][col] = m[offset + col * 4 + row];
}
// Add round key
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] ^= keyschedule[col][row];
}
for (var round = 1; round < nrounds; round++) {
// Sub bytes
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] = SBOX[state[row][col]];
}
// Shift rows
state[1].push(state[1].shift());
state[2].push(state[2].shift());
state[2].push(state[2].shift());
state[3].unshift(state[3].pop());
// Mix columns
for (var col = 0; col < 4; col++) {
var s0 = state[0][col],
s1 = state[1][col],
s2 = state[2][col],
s3 = state[3][col];
state[0][col] = MULT2[s0] ^ MULT3[s1] ^ s2 ^ s3;
state[1][col] = s0 ^ MULT2[s1] ^ MULT3[s2] ^ s3;
state[2][col] = s0 ^ s1 ^ MULT2[s2] ^ MULT3[s3];
state[3][col] = MULT3[s0] ^ s1 ^ s2 ^ MULT2[s3];
}
// Add round key
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] ^= keyschedule[round * 4 + col][row];
}
}
// Sub bytes
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] = SBOX[state[row][col]];
}
// Shift rows
state[1].push(state[1].shift());
state[2].push(state[2].shift());
state[2].push(state[2].shift());
state[3].unshift(state[3].pop());
// Add round key
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] ^= keyschedule[nrounds * 4 + col][row];
}
// Set output
for (var row = 0; row < AES._blocksize; row++) {
for (var col = 0; col < 4; col++)
m[offset + col * 4 + row] = state[row][col];
}
},
_decryptblock: function (c, offset) {
// Set input
for (var row = 0; row < AES._blocksize; row++) {
for (var col = 0; col < 4; col++)
state[row][col] = c[offset + col * 4 + row];
}
// Add round key
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] ^= keyschedule[nrounds * 4 + col][row];
}
for (var round = 1; round < nrounds; round++) {
// Inv shift rows
state[1].unshift(state[1].pop());
state[2].push(state[2].shift());
state[2].push(state[2].shift());
state[3].push(state[3].shift());
// Inv sub bytes
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] = INVSBOX[state[row][col]];
}
// Add round key
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] ^= keyschedule[(nrounds - round) * 4 + col][row];
}
// Inv mix columns
for (var col = 0; col < 4; col++) {
var s0 = state[0][col],
s1 = state[1][col],
s2 = state[2][col],
s3 = state[3][col];
state[0][col] = MULTE[s0] ^ MULTB[s1] ^ MULTD[s2] ^ MULT9[s3];
state[1][col] = MULT9[s0] ^ MULTE[s1] ^ MULTB[s2] ^ MULTD[s3];
state[2][col] = MULTD[s0] ^ MULT9[s1] ^ MULTE[s2] ^ MULTB[s3];
state[3][col] = MULTB[s0] ^ MULTD[s1] ^ MULT9[s2] ^ MULTE[s3];
}
}
// Inv shift rows
state[1].unshift(state[1].pop());
state[2].push(state[2].shift());
state[2].push(state[2].shift());
state[3].push(state[3].shift());
// Inv sub bytes
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] = INVSBOX[state[row][col]];
}
// Add round key
for (var row = 0; row < 4; row++) {
for (var col = 0; col < 4; col++)
state[row][col] ^= keyschedule[col][row];
}
// Set output
for (var row = 0; row < AES._blocksize; row++) {
for (var col = 0; col < 4; col++)
c[offset + col * 4 + row] = state[row][col];
}
},
/**
* Private methods
*/
_init: function (k) {
keylength = k.length / 4;
nrounds = keylength + 6;
AES._keyexpansion(k);
},
// Generate a key schedule
_keyexpansion: function (k) {
keyschedule = [];
for (var row = 0; row < keylength; row++) {
keyschedule[row] = [
k[row * 4],
k[row * 4 + 1],
k[row * 4 + 2],
k[row * 4 + 3]
];
}
for (var row = keylength; row < AES._blocksize * (nrounds + 1); row++) {
var temp = [
keyschedule[row - 1][0],
keyschedule[row - 1][1],
keyschedule[row - 1][2],
keyschedule[row - 1][3]
];
if (row % keylength == 0) {
// Rot word
temp.push(temp.shift());
// Sub word
temp[0] = SBOX[temp[0]];
temp[1] = SBOX[temp[1]];
temp[2] = SBOX[temp[2]];
temp[3] = SBOX[temp[3]];
temp[0] ^= RCON[row / keylength];
} else if (keylength > 6 && row % keylength == 4) {
// Sub word
temp[0] = SBOX[temp[0]];
temp[1] = SBOX[temp[1]];
temp[2] = SBOX[temp[2]];
temp[3] = SBOX[temp[3]];
}
keyschedule[row] = [
keyschedule[row - keylength][0] ^ temp[0],
keyschedule[row - keylength][1] ^ temp[1],
keyschedule[row - keylength][2] ^ temp[2],
keyschedule[row - keylength][3] ^ temp[3]
];
}
}
};
})();
</script>
<script type="text/javascript">
/*!
* Crypto-JS 2.5.4 BlockModes.js
* contribution from Simon Greatrix
*/
(function (C) {
// Create pad namespace
var C_pad = C.pad = {};
// Calculate the number of padding bytes required.
function _requiredPadding(cipher, message) {
var blockSizeInBytes = cipher._blocksize * 4;
var reqd = blockSizeInBytes - message.length % blockSizeInBytes;
return reqd;
}
// Remove padding when the final byte gives the number of padding bytes.
var _unpadLength = function (cipher, message, alg, padding) {
var pad = message.pop();
if (pad == 0) {
throw new Error("Invalid zero-length padding specified for " + alg
+ ". Wrong cipher specification or key used?");
}
var maxPad = cipher._blocksize * 4;
if (pad > maxPad) {
throw new Error("Invalid padding length of " + pad
+ " specified for " + alg
+ ". Wrong cipher specification or key used?");
}
for (var i = 1; i < pad; i++) {
var b = message.pop();
if (padding != undefined && padding != b) {
throw new Error("Invalid padding byte of 0x" + b.toString(16)
+ " specified for " + alg
+ ". Wrong cipher specification or key used?");
}
}
};
// No-operation padding, used for stream ciphers
C_pad.NoPadding = {
pad: function (cipher, message) { },
unpad: function (cipher, message) { }
};
// Zero Padding.
//
// If the message is not an exact number of blocks, the final block is
// completed with 0x00 bytes. There is no unpadding.
C_pad.ZeroPadding = {
pad: function (cipher, message) {
var blockSizeInBytes = cipher._blocksize * 4;
var reqd = message.length % blockSizeInBytes;
if (reqd != 0) {
for (reqd = blockSizeInBytes - reqd; reqd > 0; reqd--) {
message.push(0x00);
}
}
},
unpad: function (cipher, message) {
while (message[message.length - 1] == 0) {
message.pop();
}
}
};
// ISO/IEC 7816-4 padding.
//
// Pads the plain text with an 0x80 byte followed by as many 0x00
// bytes are required to complete the block.
C_pad.iso7816 = {
pad: function (cipher, message) {
var reqd = _requiredPadding(cipher, message);
message.push(0x80);
for (; reqd > 1; reqd--) {
message.push(0x00);
}
},
unpad: function (cipher, message) {
var padLength;
for (padLength = cipher._blocksize * 4; padLength > 0; padLength--) {
var b = message.pop();
if (b == 0x80) return;
if (b != 0x00) {
throw new Error("ISO-7816 padding byte must be 0, not 0x" + b.toString(16) + ". Wrong cipher specification or key used?");
}
}
throw new Error("ISO-7816 padded beyond cipher block size. Wrong cipher specification or key used?");
}
};
// ANSI X.923 padding
//
// The final block is padded with zeros except for the last byte of the
// last block which contains the number of padding bytes.
C_pad.ansix923 = {
pad: function (cipher, message) {
var reqd = _requiredPadding(cipher, message);
for (var i = 1; i < reqd; i++) {
message.push(0x00);
}
message.push(reqd);
},
unpad: function (cipher, message) {
_unpadLength(cipher, message, "ANSI X.923", 0);
}
};
// ISO 10126
//
// The final block is padded with random bytes except for the last
// byte of the last block which contains the number of padding bytes.
C_pad.iso10126 = {
pad: function (cipher, message) {
var reqd = _requiredPadding(cipher, message);
for (var i = 1; i < reqd; i++) {
message.push(Math.floor(Math.random() * 256));
}
message.push(reqd);
},
unpad: function (cipher, message) {
_unpadLength(cipher, message, "ISO 10126", undefined);
}
};
// PKCS7 padding
//
// PKCS7 is described in RFC 5652. Padding is in whole bytes. The
// value of each added byte is the number of bytes that are added,
// i.e. N bytes, each of value N are added.
C_pad.pkcs7 = {
pad: function (cipher, message) {
var reqd = _requiredPadding(cipher, message);
for (var i = 0; i < reqd; i++) {
message.push(reqd);
}
},
unpad: function (cipher, message) {
_unpadLength(cipher, message, "PKCS 7", message[message.length - 1]);
}
};
// Create mode namespace
var C_mode = C.mode = {};
/**
* Mode base "class".
*/
var Mode = C_mode.Mode = function (padding) {
if (padding) {
this._padding = padding;
}
};
Mode.prototype = {
encrypt: function (cipher, m, iv) {
this._padding.pad(cipher, m);
this._doEncrypt(cipher, m, iv);
},
decrypt: function (cipher, m, iv) {
this._doDecrypt(cipher, m, iv);
this._padding.unpad(cipher, m);
},
// Default padding
_padding: C_pad.iso7816
};
/**
* Electronic Code Book mode.
*
* ECB applies the cipher directly against each block of the input.
*
* ECB does not require an initialization vector.
*/
var ECB = C_mode.ECB = function () {
// Call parent constructor
Mode.apply(this, arguments);
};
// Inherit from Mode
var ECB_prototype = ECB.prototype = new Mode;
// Concrete steps for Mode template
ECB_prototype._doEncrypt = function (cipher, m, iv) {
var blockSizeInBytes = cipher._blocksize * 4;
// Encrypt each block
for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {
cipher._encryptblock(m, offset);
}
};
ECB_prototype._doDecrypt = function (cipher, c, iv) {
var blockSizeInBytes = cipher._blocksize * 4;
// Decrypt each block
for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {
cipher._decryptblock(c, offset);
}
};
// ECB never uses an IV
ECB_prototype.fixOptions = function (options) {
options.iv = [];
};
/**
* Cipher block chaining
*
* The first block is XORed with the IV. Subsequent blocks are XOR with the
* previous cipher output.
*/
var CBC = C_mode.CBC = function () {
// Call parent constructor
Mode.apply(this, arguments);
};
// Inherit from Mode
var CBC_prototype = CBC.prototype = new Mode;
// Concrete steps for Mode template
CBC_prototype._doEncrypt = function (cipher, m, iv) {
var blockSizeInBytes = cipher._blocksize * 4;
// Encrypt each block
for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {
if (offset == 0) {
// XOR first block using IV
for (var i = 0; i < blockSizeInBytes; i++)
m[i] ^= iv[i];
} else {
// XOR this block using previous crypted block
for (var i = 0; i < blockSizeInBytes; i++)
m[offset + i] ^= m[offset + i - blockSizeInBytes];
}
// Encrypt block
cipher._encryptblock(m, offset);
}
};
CBC_prototype._doDecrypt = function (cipher, c, iv) {
var blockSizeInBytes = cipher._blocksize * 4;
// At the start, the previously crypted block is the IV
var prevCryptedBlock = iv;
// Decrypt each block
for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {
// Save this crypted block
var thisCryptedBlock = c.slice(offset, offset + blockSizeInBytes);
// Decrypt block
cipher._decryptblock(c, offset);
// XOR decrypted block using previous crypted block
for (var i = 0; i < blockSizeInBytes; i++) {
c[offset + i] ^= prevCryptedBlock[i];
}
prevCryptedBlock = thisCryptedBlock;
}
};
/**
* Cipher feed back
*
* The cipher output is XORed with the plain text to produce the cipher output,
* which is then fed back into the cipher to produce a bit pattern to XOR the
* next block with.
*
* This is a stream cipher mode and does not require padding.
*/
var CFB = C_mode.CFB = function () {
// Call parent constructor
Mode.apply(this, arguments);
};
// Inherit from Mode
var CFB_prototype = CFB.prototype = new Mode;
// Override padding
CFB_prototype._padding = C_pad.NoPadding;
// Concrete steps for Mode template
CFB_prototype._doEncrypt = function (cipher, m, iv) {
var blockSizeInBytes = cipher._blocksize * 4,
keystream = iv.slice(0);
// Encrypt each byte
for (var i = 0; i < m.length; i++) {
var j = i % blockSizeInBytes;
if (j == 0) cipher._encryptblock(keystream, 0);
m[i] ^= keystream[j];
keystream[j] = m[i];
}
};
CFB_prototype._doDecrypt = function (cipher, c, iv) {
var blockSizeInBytes = cipher._blocksize * 4,
keystream = iv.slice(0);
// Encrypt each byte
for (var i = 0; i < c.length; i++) {
var j = i % blockSizeInBytes;
if (j == 0) cipher._encryptblock(keystream, 0);
var b = c[i];
c[i] ^= keystream[j];
keystream[j] = b;
}
};
/**
* Output feed back
*
* The cipher repeatedly encrypts its own output. The output is XORed with the
* plain text to produce the cipher text.
*
* This is a stream cipher mode and does not require padding.
*/
var OFB = C_mode.OFB = function () {
// Call parent constructor
Mode.apply(this, arguments);
};
// Inherit from Mode
var OFB_prototype = OFB.prototype = new Mode;
// Override padding
OFB_prototype._padding = C_pad.NoPadding;
// Concrete steps for Mode template
OFB_prototype._doEncrypt = function (cipher, m, iv) {
var blockSizeInBytes = cipher._blocksize * 4,
keystream = iv.slice(0);
// Encrypt each byte
for (var i = 0; i < m.length; i++) {
// Generate keystream
if (i % blockSizeInBytes == 0)
cipher._encryptblock(keystream, 0);
// Encrypt byte
m[i] ^= keystream[i % blockSizeInBytes];
}
};
OFB_prototype._doDecrypt = OFB_prototype._doEncrypt;
/**
* Counter
* @author Gergely Risko
*
* After every block the last 4 bytes of the IV is increased by one
* with carry and that IV is used for the next block.
*
* This is a stream cipher mode and does not require padding.
*/
var CTR = C_mode.CTR = function () {
// Call parent constructor
Mode.apply(this, arguments);
};
// Inherit from Mode
var CTR_prototype = CTR.prototype = new Mode;
// Override padding
CTR_prototype._padding = C_pad.NoPadding;
CTR_prototype._doEncrypt = function (cipher, m, iv) {
var blockSizeInBytes = cipher._blocksize * 4;
var counter = iv.slice(0);
for (var i = 0; i < m.length; ) {
// do not lose iv
var keystream = counter.slice(0);
// Generate keystream for next block
cipher._encryptblock(keystream, 0);
// XOR keystream with block
for (var j = 0; i < m.length && j < blockSizeInBytes; j++, i++) {
m[i] ^= keystream[j];
}
// Increase counter
if (++(counter[blockSizeInBytes - 1]) == 256) {
counter[blockSizeInBytes - 1] = 0;
if (++(counter[blockSizeInBytes - 2]) == 256) {
counter[blockSizeInBytes - 2] = 0;
if (++(counter[blockSizeInBytes - 3]) == 256) {
counter[blockSizeInBytes - 3] = 0;
++(counter[blockSizeInBytes - 4]);
}
}
}
}
};
CTR_prototype._doDecrypt = CTR_prototype._doEncrypt;
})(Crypto);
</script>
<script type="text/javascript">
/*!
* Crypto-JS v2.0.0 RIPEMD-160
* http://code.google.com/p/crypto-js/
* Copyright (c) 2009, Jeff Mott. All rights reserved.
* http://code.google.com/p/crypto-js/wiki/License
*
* A JavaScript implementation of the RIPEMD-160 Algorithm
* Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for details.
* Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
* Ported to Crypto-JS by Stefan Thomas.
*/
(function () {
// Shortcuts
var C = Crypto,
util = C.util,
charenc = C.charenc,
UTF8 = charenc.UTF8,
Binary = charenc.Binary;
// Convert a byte array to little-endian 32-bit words
util.bytesToLWords = function (bytes) {
var output = Array(bytes.length >> 2);
for (var i = 0; i < output.length; i++)
output[i] = 0;
for (var i = 0; i < bytes.length * 8; i += 8)
output[i >> 5] |= (bytes[i / 8] & 0xFF) << (i % 32);
return output;
};
// Convert little-endian 32-bit words to a byte array
util.lWordsToBytes = function (words) {
var output = [];
for (var i = 0; i < words.length * 32; i += 8)
output.push((words[i >> 5] >>> (i % 32)) & 0xff);
return output;
};
// Public API
var RIPEMD160 = C.RIPEMD160 = function (message, options) {
var digestbytes = util.lWordsToBytes(RIPEMD160._rmd160(message));
return options && options.asBytes ? digestbytes :
options && options.asString ? Binary.bytesToString(digestbytes) :
util.bytesToHex(digestbytes);
};
// The core
RIPEMD160._rmd160 = function (message) {
// Convert to byte array
if (message.constructor == String) message = UTF8.stringToBytes(message);
var x = util.bytesToLWords(message),
len = message.length * 8;
/* append padding */
x[len >> 5] |= 0x80 << (len % 32);
x[(((len + 64) >>> 9) << 4) + 14] = len;
var h0 = 0x67452301;
var h1 = 0xefcdab89;
var h2 = 0x98badcfe;
var h3 = 0x10325476;
var h4 = 0xc3d2e1f0;
for (var i = 0; i < x.length; i += 16) {
var T;
var A1 = h0, B1 = h1, C1 = h2, D1 = h3, E1 = h4;
var A2 = h0, B2 = h1, C2 = h2, D2 = h3, E2 = h4;
for (var j = 0; j <= 79; ++j) {
T = safe_add(A1, rmd160_f(j, B1, C1, D1));
T = safe_add(T, x[i + rmd160_r1[j]]);
T = safe_add(T, rmd160_K1(j));
T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
A1 = E1; E1 = D1; D1 = bit_rol(C1, 10); C1 = B1; B1 = T;
T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
T = safe_add(T, x[i + rmd160_r2[j]]);
T = safe_add(T, rmd160_K2(j));
T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
A2 = E2; E2 = D2; D2 = bit_rol(C2, 10); C2 = B2; B2 = T;
}
T = safe_add(h1, safe_add(C1, D2));
h1 = safe_add(h2, safe_add(D1, E2));
h2 = safe_add(h3, safe_add(E1, A2));
h3 = safe_add(h4, safe_add(A1, B2));
h4 = safe_add(h0, safe_add(B1, C2));
h0 = T;
}
return [h0, h1, h2, h3, h4];
}
function rmd160_f(j, x, y, z) {
return (0 <= j && j <= 15) ? (x ^ y ^ z) :
(16 <= j && j <= 31) ? (x & y) | (~x & z) :
(32 <= j && j <= 47) ? (x | ~y) ^ z :
(48 <= j && j <= 63) ? (x & z) | (y & ~z) :
(64 <= j && j <= 79) ? x ^ (y | ~z) :
"rmd160_f: j out of range";
}
function rmd160_K1(j) {
return (0 <= j && j <= 15) ? 0x00000000 :
(16 <= j && j <= 31) ? 0x5a827999 :
(32 <= j && j <= 47) ? 0x6ed9eba1 :
(48 <= j && j <= 63) ? 0x8f1bbcdc :
(64 <= j && j <= 79) ? 0xa953fd4e :
"rmd160_K1: j out of range";
}
function rmd160_K2(j) {
return (0 <= j && j <= 15) ? 0x50a28be6 :
(16 <= j && j <= 31) ? 0x5c4dd124 :
(32 <= j && j <= 47) ? 0x6d703ef3 :
(48 <= j && j <= 63) ? 0x7a6d76e9 :
(64 <= j && j <= 79) ? 0x00000000 :
"rmd160_K2: j out of range";
}
var rmd160_r1 = [
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
];
var rmd160_r2 = [
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
];
var rmd160_s1 = [
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
];
var rmd160_s2 = [
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
];
/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
function safe_add(x, y) {
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
/*
* Bitwise rotate a 32-bit number to the left.
*/
function bit_rol(num, cnt) {
return (num << cnt) | (num >>> (32 - cnt));
}
})();
</script>
<script type="text/javascript">
/*!
* Random number generator with ArcFour PRNG
*
* NOTE: For best results, put code like
* <body onclick='SecureRandom.seedTime();' onkeypress='SecureRandom.seedTime();'>
* in your main HTML document.
*
* Copyright Tom Wu, bitaddress.org BSD License.
* http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE
*/
(function () {
// Constructor function of Global SecureRandom object
var sr = window.SecureRandom = function () { };
// Properties
sr.state;
sr.pool;
sr.pptr;
sr.poolCopyOnInit;
// Pool size must be a multiple of 4 and greater than 32.
// An array of bytes the size of the pool will be passed to init()
sr.poolSize = 256;
// --- object methods ---
// public method
// ba: byte array
sr.prototype.nextBytes = function (ba) {
var i;
if (window.crypto && window.crypto.getRandomValues && window.Uint8Array) {
try {
var rvBytes = new Uint8Array(ba.length);
window.crypto.getRandomValues(rvBytes);
for (i = 0; i < ba.length; ++i)
ba[i] = sr.getByte() ^ rvBytes[i];
return;
} catch (e) {
alert(e);
}
}
for (i = 0; i < ba.length; ++i) ba[i] = sr.getByte();
};
// --- static methods ---
// Mix in the current time (w/milliseconds) into the pool
// NOTE: this method should be called from body click/keypress event handlers to increase entropy
sr.seedTime = function () {
sr.seedInt(new Date().getTime());
}
sr.getByte = function () {
if (sr.state == null) {
sr.seedTime();
sr.state = sr.ArcFour(); // Plug in your RNG constructor here
sr.state.init(sr.pool);
sr.poolCopyOnInit = [];
for (sr.pptr = 0; sr.pptr < sr.pool.length; ++sr.pptr)
sr.poolCopyOnInit[sr.pptr] = sr.pool[sr.pptr];
sr.pptr = 0;
}
// TODO: allow reseeding after first request
return sr.state.next();
}
// Mix in a 32-bit integer into the pool
sr.seedInt = function (x) {
sr.seedInt8(x);
sr.seedInt8((x >> 8));
sr.seedInt8((x >> 16));
sr.seedInt8((x >> 24));
}
// Mix in a 16-bit integer into the pool
sr.seedInt16 = function (x) {
sr.seedInt8(x);
sr.seedInt8((x >> 8));
}
// Mix in a 8-bit integer into the pool
sr.seedInt8 = function (x) {
sr.pool[sr.pptr++] ^= x & 255;
if (sr.pptr >= sr.poolSize) sr.pptr -= sr.poolSize;
}
// Arcfour is a PRNG
sr.ArcFour = function () {
function Arcfour() {
this.i = 0;
this.j = 0;
this.S = new Array();
}
// Initialize arcfour context from key, an array of ints, each from [0..255]
function ARC4init(key) {
var i, j, t;
for (i = 0; i < 256; ++i)
this.S[i] = i;
j = 0;
for (i = 0; i < 256; ++i) {
j = (j + this.S[i] + key[i % key.length]) & 255;
t = this.S[i];
this.S[i] = this.S[j];
this.S[j] = t;
}
this.i = 0;
this.j = 0;
}
function ARC4next() {
var t;
this.i = (this.i + 1) & 255;
this.j = (this.j + this.S[this.i]) & 255;
t = this.S[this.i];
this.S[this.i] = this.S[this.j];
this.S[this.j] = t;
return this.S[(t + this.S[this.i]) & 255];
}
Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;
return new Arcfour();
};
// Initialize the pool with junk if needed.
if (sr.pool == null) {
sr.pool = new Array();
sr.pptr = 0;
var t;
if (window.crypto && window.crypto.getRandomValues && window.Uint8Array) {
try {
// Use webcrypto if available
var ua = new Uint8Array(sr.poolSize);
window.crypto.getRandomValues(ua);
for (t = 0; t < sr.poolSize; ++t)
sr.pool[sr.pptr++] = ua[t];
} catch (e) { alert(e); }
}
while (sr.pptr < sr.poolSize) { // extract some randomness from Math.random()
t = Math.floor(65536 * Math.random());
sr.pool[sr.pptr++] = t >>> 8;
sr.pool[sr.pptr++] = t & 255;
}
sr.pptr = Math.floor(sr.poolSize * Math.random());
sr.seedTime();
// entropy
var entropyStr = "";
// screen size and color depth: ~4.8 to ~5.4 bits
entropyStr += (window.screen.height * window.screen.width * window.screen.colorDepth);
entropyStr += (window.screen.availHeight * window.screen.availWidth * window.screen.pixelDepth);
// time zone offset: ~4 bits
var dateObj = new Date();
var timeZoneOffset = dateObj.getTimezoneOffset();
entropyStr += timeZoneOffset;
// user agent: ~8.3 to ~11.6 bits
entropyStr += navigator.userAgent;
// browser plugin details: ~16.2 to ~21.8 bits
var pluginsStr = "";
for (var i = 0; i < navigator.plugins.length; i++) {
pluginsStr += navigator.plugins[i].name + " " + navigator.plugins[i].filename + " " + navigator.plugins[i].description + " " + navigator.plugins[i].version + ", ";
}
var mimeTypesStr = "";
for (var i = 0; i < navigator.mimeTypes.length; i++) {
mimeTypesStr += navigator.mimeTypes[i].description + " " + navigator.mimeTypes[i].type + " " + navigator.mimeTypes[i].suffixes + ", ";
}
entropyStr += pluginsStr + mimeTypesStr;
// cookies and storage: 1 bit
entropyStr += navigator.cookieEnabled + typeof (sessionStorage) + typeof (localStorage);
// language: ~7 bit
entropyStr += navigator.language;
// history: ~2 bit
entropyStr += window.history.length;
// location
entropyStr += window.location;
var entropyBytes = Crypto.SHA256(entropyStr, { asBytes: true });
for (var i = 0 ; i < entropyBytes.length ; i++) {
sr.seedInt8(entropyBytes[i]);
}
}
})();
</script>
<script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/faa10f0f6a1fff0b9a99fffb9bc30cee33b17212/src/ecdsa.js
/*!
* Basic Javascript Elliptic Curve implementation
* Ported loosely from BouncyCastle's Java EC code
* Only Fp curves implemented for now
*
* Copyright Tom Wu, bitaddress.org BSD License.
* http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE
*/
(function () {
// Constructor function of Global EllipticCurve object
var ec = window.EllipticCurve = function () { };
// ----------------
// ECFieldElementFp constructor
// q instanceof BigInteger
// x instanceof BigInteger
ec.FieldElementFp = function (q, x) {
this.x = x;
// TODO if(x.compareTo(q) >= 0) error
this.q = q;
};
ec.FieldElementFp.prototype.equals = function (other) {
if (other == this) return true;
return (this.q.equals(other.q) && this.x.equals(other.x));
};
ec.FieldElementFp.prototype.toBigInteger = function () {
return this.x;
};
ec.FieldElementFp.prototype.negate = function () {
return new ec.FieldElementFp(this.q, this.x.negate().mod(this.q));
};
ec.FieldElementFp.prototype.add = function (b) {
return new ec.FieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q));
};
ec.FieldElementFp.prototype.subtract = function (b) {
return new ec.FieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q));
};
ec.FieldElementFp.prototype.multiply = function (b) {
return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q));
};
ec.FieldElementFp.prototype.square = function () {
return new ec.FieldElementFp(this.q, this.x.square().mod(this.q));
};
ec.FieldElementFp.prototype.divide = function (b) {
return new ec.FieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q));
};
ec.FieldElementFp.prototype.getByteLength = function () {
return Math.floor((this.toBigInteger().bitLength() + 7) / 8);
};
// D.1.4 91
/**
* return a sqrt root - the routine verifies that the calculation
* returns the right value - if none exists it returns null.
*
* Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
* Ported to JavaScript by bitaddress.org
*/
ec.FieldElementFp.prototype.sqrt = function () {
if (!this.q.testBit(0)) throw new Error("even value of q");
// p mod 4 == 3
if (this.q.testBit(1)) {
// z = g^(u+1) + p, p = 4u + 3
var z = new ec.FieldElementFp(this.q, this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE), this.q));
return z.square().equals(this) ? z : null;
}
// p mod 4 == 1
var qMinusOne = this.q.subtract(BigInteger.ONE);
var legendreExponent = qMinusOne.shiftRight(1);
if (!(this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE))) return null;
var u = qMinusOne.shiftRight(2);
var k = u.shiftLeft(1).add(BigInteger.ONE);
var Q = this.x;
var fourQ = Q.shiftLeft(2).mod(this.q);
var U, V;
do {
var rand = new SecureRandom();
var P;
do {
P = new BigInteger(this.q.bitLength(), rand);
}
while (P.compareTo(this.q) >= 0 || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne)));
var result = ec.FieldElementFp.fastLucasSequence(this.q, P, Q, k);
U = result[0];
V = result[1];
if (V.multiply(V).mod(this.q).equals(fourQ)) {
// Integer division by 2, mod q
if (V.testBit(0)) {
V = V.add(this.q);
}
V = V.shiftRight(1);
return new ec.FieldElementFp(this.q, V);
}
}
while (U.equals(BigInteger.ONE) || U.equals(qMinusOne));
return null;
};
/*
* Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
* Ported to JavaScript by bitaddress.org
*/
ec.FieldElementFp.fastLucasSequence = function (p, P, Q, k) {
// TODO Research and apply "common-multiplicand multiplication here"
var n = k.bitLength();
var s = k.getLowestSetBit();
var Uh = BigInteger.ONE;
var Vl = BigInteger.TWO;
var Vh = P;
var Ql = BigInteger.ONE;
var Qh = BigInteger.ONE;
for (var j = n - 1; j >= s + 1; --j) {
Ql = Ql.multiply(Qh).mod(p);
if (k.testBit(j)) {
Qh = Ql.multiply(Q).mod(p);
Uh = Uh.multiply(Vh).mod(p);
Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);
Vh = Vh.multiply(Vh).subtract(Qh.shiftLeft(1)).mod(p);
}
else {
Qh = Ql;
Uh = Uh.multiply(Vl).subtract(Ql).mod(p);
Vh = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);
Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p);
}
}
Ql = Ql.multiply(Qh).mod(p);
Qh = Ql.multiply(Q).mod(p);
Uh = Uh.multiply(Vl).subtract(Ql).mod(p);
Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p);
Ql = Ql.multiply(Qh).mod(p);
for (var j = 1; j <= s; ++j) {
Uh = Uh.multiply(Vl).mod(p);
Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p);
Ql = Ql.multiply(Ql).mod(p);
}
return [Uh, Vl];
};
// ----------------
// ECPointFp constructor
ec.PointFp = function (curve, x, y, z, compressed) {
this.curve = curve;
this.x = x;
this.y = y;
// Projective coordinates: either zinv == null or z * zinv == 1
// z and zinv are just BigIntegers, not fieldElements
if (z == null) {
this.z = BigInteger.ONE;
}
else {
this.z = z;
}
this.zinv = null;
// compression flag
this.compressed = !!compressed;
};
ec.PointFp.prototype.getX = function () {
if (this.zinv == null) {
this.zinv = this.z.modInverse(this.curve.q);
}
var r = this.x.toBigInteger().multiply(this.zinv);
this.curve.reduce(r);
return this.curve.fromBigInteger(r);
};
ec.PointFp.prototype.getY = function () {
if (this.zinv == null) {
this.zinv = this.z.modInverse(this.curve.q);
}
var r = this.y.toBigInteger().multiply(this.zinv);
this.curve.reduce(r);
return this.curve.fromBigInteger(r);
};
ec.PointFp.prototype.equals = function (other) {
if (other == this) return true;
if (this.isInfinity()) return other.isInfinity();
if (other.isInfinity()) return this.isInfinity();
var u, v;
// u = Y2 * Z1 - Y1 * Z2
u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q);
if (!u.equals(BigInteger.ZERO)) return false;
// v = X2 * Z1 - X1 * Z2
v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q);
return v.equals(BigInteger.ZERO);
};
ec.PointFp.prototype.isInfinity = function () {
if ((this.x == null) && (this.y == null)) return true;
return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
};
ec.PointFp.prototype.negate = function () {
return new ec.PointFp(this.curve, this.x, this.y.negate(), this.z);
};
ec.PointFp.prototype.add = function (b) {
if (this.isInfinity()) return b;
if (b.isInfinity()) return this;
// u = Y2 * Z1 - Y1 * Z2
var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q);
// v = X2 * Z1 - X1 * Z2
var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q);
if (BigInteger.ZERO.equals(v)) {
if (BigInteger.ZERO.equals(u)) {
return this.twice(); // this == b, so double
}
return this.curve.getInfinity(); // this = -b, so infinity
}
var THREE = new BigInteger("3");
var x1 = this.x.toBigInteger();
var y1 = this.y.toBigInteger();
var x2 = b.x.toBigInteger();
var y2 = b.y.toBigInteger();
var v2 = v.square();
var v3 = v2.multiply(v);
var x1v2 = x1.multiply(v2);
var zu2 = u.square().multiply(this.z);
// x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3)
var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q);
// y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3
var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q);
// z3 = v^3 * z1 * z2
var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q);
return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
};
ec.PointFp.prototype.twice = function () {
if (this.isInfinity()) return this;
if (this.y.toBigInteger().signum() == 0) return this.curve.getInfinity();
// TODO: optimized handling of constants
var THREE = new BigInteger("3");
var x1 = this.x.toBigInteger();
var y1 = this.y.toBigInteger();
var y1z1 = y1.multiply(this.z);
var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q);
var a = this.curve.a.toBigInteger();
// w = 3 * x1^2 + a * z1^2
var w = x1.square().multiply(THREE);
if (!BigInteger.ZERO.equals(a)) {
w = w.add(this.z.square().multiply(a));
}
w = w.mod(this.curve.q);
//this.curve.reduce(w);
// x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1)
var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q);
// y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3
var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q);
// z3 = 8 * (y1 * z1)^3
var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q);
return new ec.PointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
};
// Simple NAF (Non-Adjacent Form) multiplication algorithm
// TODO: modularize the multiplication algorithm
ec.PointFp.prototype.multiply = function (k) {
if (this.isInfinity()) return this;
if (k.signum() == 0) return this.curve.getInfinity();
var e = k;
var h = e.multiply(new BigInteger("3"));
var neg = this.negate();
var R = this;
var i;
for (i = h.bitLength() - 2; i > 0; --i) {
R = R.twice();
var hBit = h.testBit(i);
var eBit = e.testBit(i);
if (hBit != eBit) {
R = R.add(hBit ? this : neg);
}
}
return R;
};
// Compute this*j + x*k (simultaneous multiplication)
ec.PointFp.prototype.multiplyTwo = function (j, x, k) {
var i;
if (j.bitLength() > k.bitLength())
i = j.bitLength() - 1;
else
i = k.bitLength() - 1;
var R = this.curve.getInfinity();
var both = this.add(x);
while (i >= 0) {
R = R.twice();
if (j.testBit(i)) {
if (k.testBit(i)) {
R = R.add(both);
}
else {
R = R.add(this);
}
}
else {
if (k.testBit(i)) {
R = R.add(x);
}
}
--i;
}
return R;
};
// patched by bitaddress.org and Casascius for use with Bitcoin.ECKey
// patched by coretechs to support compressed public keys
ec.PointFp.prototype.getEncoded = function (compressed) {
var x = this.getX().toBigInteger();
var y = this.getY().toBigInteger();
var len = 32; // integerToBytes will zero pad if integer is less than 32 bytes. 32 bytes length is required by the Bitcoin protocol.
var enc = ec.integerToBytes(x, len);
// when compressed prepend byte depending if y point is even or odd
if (compressed) {
if (y.isEven()) {
enc.unshift(0x02);
}
else {
enc.unshift(0x03);
}
}
else {
enc.unshift(0x04);
enc = enc.concat(ec.integerToBytes(y, len)); // uncompressed public key appends the bytes of the y point
}
return enc;
};
ec.PointFp.decodeFrom = function (curve, enc) {
var type = enc[0];
var dataLen = enc.length - 1;
// Extract x and y as byte arrays
var xBa = enc.slice(1, 1 + dataLen / 2);
var yBa = enc.slice(1 + dataLen / 2, 1 + dataLen);
// Prepend zero byte to prevent interpretation as negative integer
xBa.unshift(0);
yBa.unshift(0);
// Convert to BigIntegers
var x = new BigInteger(xBa);
var y = new BigInteger(yBa);
// Return point
return new ec.PointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y));
};
ec.PointFp.prototype.add2D = function (b) {
if (this.isInfinity()) return b;
if (b.isInfinity()) return this;
if (this.x.equals(b.x)) {
if (this.y.equals(b.y)) {
// this = b, i.e. this must be doubled
return this.twice();
}
// this = -b, i.e. the result is the point at infinity
return this.curve.getInfinity();
}
var x_x = b.x.subtract(this.x);
var y_y = b.y.subtract(this.y);
var gamma = y_y.divide(x_x);
var x3 = gamma.square().subtract(this.x).subtract(b.x);
var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y);
return new ec.PointFp(this.curve, x3, y3);
};
ec.PointFp.prototype.twice2D = function () {
if (this.isInfinity()) return this;
if (this.y.toBigInteger().signum() == 0) {
// if y1 == 0, then (x1, y1) == (x1, -y1)
// and hence this = -this and thus 2(x1, y1) == infinity
return this.curve.getInfinity();
}
var TWO = this.curve.fromBigInteger(BigInteger.valueOf(2));
var THREE = this.curve.fromBigInteger(BigInteger.valueOf(3));
var gamma = this.x.square().multiply(THREE).add(this.curve.a).divide(this.y.multiply(TWO));
var x3 = gamma.square().subtract(this.x.multiply(TWO));
var y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y);
return new ec.PointFp(this.curve, x3, y3);
};
ec.PointFp.prototype.multiply2D = function (k) {
if (this.isInfinity()) return this;
if (k.signum() == 0) return this.curve.getInfinity();
var e = k;
var h = e.multiply(new BigInteger("3"));
var neg = this.negate();
var R = this;
var i;
for (i = h.bitLength() - 2; i > 0; --i) {
R = R.twice();
var hBit = h.testBit(i);
var eBit = e.testBit(i);
if (hBit != eBit) {
R = R.add2D(hBit ? this : neg);
}
}
return R;
};
ec.PointFp.prototype.isOnCurve = function () {
var x = this.getX().toBigInteger();
var y = this.getY().toBigInteger();
var a = this.curve.getA().toBigInteger();
var b = this.curve.getB().toBigInteger();
var n = this.curve.getQ();
var lhs = y.multiply(y).mod(n);
var rhs = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(n);
return lhs.equals(rhs);
};
ec.PointFp.prototype.toString = function () {
return '(' + this.getX().toBigInteger().toString() + ',' + this.getY().toBigInteger().toString() + ')';
};
/**
* Validate an elliptic curve point.
*
* See SEC 1, section 3.2.2.1: Elliptic Curve Public Key Validation Primitive
*/
ec.PointFp.prototype.validate = function () {
var n = this.curve.getQ();
// Check Q != O
if (this.isInfinity()) {
throw new Error("Point is at infinity.");
}
// Check coordinate bounds
var x = this.getX().toBigInteger();
var y = this.getY().toBigInteger();
if (x.compareTo(BigInteger.ONE) < 0 || x.compareTo(n.subtract(BigInteger.ONE)) > 0) {
throw new Error('x coordinate out of bounds');
}
if (y.compareTo(BigInteger.ONE) < 0 || y.compareTo(n.subtract(BigInteger.ONE)) > 0) {
throw new Error('y coordinate out of bounds');
}
// Check y^2 = x^3 + ax + b (mod n)
if (!this.isOnCurve()) {
throw new Error("Point is not on the curve.");
}
// Check nQ = 0 (Q is a scalar multiple of G)
if (this.multiply(n).isInfinity()) {
// TODO: This check doesn't work - fix.
throw new Error("Point is not a scalar multiple of G.");
}
return true;
};
// ----------------
// ECCurveFp constructor
ec.CurveFp = function (q, a, b) {
this.q = q;
this.a = this.fromBigInteger(a);
this.b = this.fromBigInteger(b);
this.infinity = new ec.PointFp(this, null, null);
this.reducer = new Barrett(this.q);
}
ec.CurveFp.prototype.getQ = function () {
return this.q;
};
ec.CurveFp.prototype.getA = function () {
return this.a;
};
ec.CurveFp.prototype.getB = function () {
return this.b;
};
ec.CurveFp.prototype.equals = function (other) {
if (other == this) return true;
return (this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b));
};
ec.CurveFp.prototype.getInfinity = function () {
return this.infinity;
};
ec.CurveFp.prototype.fromBigInteger = function (x) {
return new ec.FieldElementFp(this.q, x);
};
ec.CurveFp.prototype.reduce = function (x) {
this.reducer.reduce(x);
};
// for now, work with hex strings because they're easier in JS
// compressed support added by bitaddress.org
ec.CurveFp.prototype.decodePointHex = function (s) {
var firstByte = parseInt(s.substr(0, 2), 16);
switch (firstByte) { // first byte
case 0:
return this.infinity;
case 2: // compressed
case 3: // compressed
var yTilde = firstByte & 1;
var xHex = s.substr(2, s.length - 2);
var X1 = new BigInteger(xHex, 16);
return this.decompressPoint(yTilde, X1);
case 4: // uncompressed
case 6: // hybrid
case 7: // hybrid
var len = (s.length - 2) / 2;
var xHex = s.substr(2, len);
var yHex = s.substr(len + 2, len);
return new ec.PointFp(this,
this.fromBigInteger(new BigInteger(xHex, 16)),
this.fromBigInteger(new BigInteger(yHex, 16)));
default: // unsupported
return null;
}
};
ec.CurveFp.prototype.encodePointHex = function (p) {
if (p.isInfinity()) return "00";
var xHex = p.getX().toBigInteger().toString(16);
var yHex = p.getY().toBigInteger().toString(16);
var oLen = this.getQ().toString(16).length;
if ((oLen % 2) != 0) oLen++;
while (xHex.length < oLen) {
xHex = "0" + xHex;
}
while (yHex.length < oLen) {
yHex = "0" + yHex;
}
return "04" + xHex + yHex;
};
/*
* Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
* Ported to JavaScript by bitaddress.org
*
* Number yTilde
* BigInteger X1
*/
ec.CurveFp.prototype.decompressPoint = function (yTilde, X1) {
var x = this.fromBigInteger(X1);
var alpha = x.multiply(x.square().add(this.getA())).add(this.getB());
var beta = alpha.sqrt();
// if we can't find a sqrt we haven't got a point on the curve - run!
if (beta == null) throw new Error("Invalid point compression");
var betaValue = beta.toBigInteger();
var bit0 = betaValue.testBit(0) ? 1 : 0;
if (bit0 != yTilde) {
// Use the other root
beta = this.fromBigInteger(this.getQ().subtract(betaValue));
}
return new ec.PointFp(this, x, beta, null, true);
};
ec.fromHex = function (s) { return new BigInteger(s, 16); };
ec.integerToBytes = function (i, len) {
var bytes = i.toByteArrayUnsigned();
if (len < bytes.length) {
bytes = bytes.slice(bytes.length - len);
} else while (len > bytes.length) {
bytes.unshift(0);
}
return bytes;
};
// Named EC curves
// ----------------
// X9ECParameters constructor
ec.X9Parameters = function (curve, g, n, h) {
this.curve = curve;
this.g = g;
this.n = n;
this.h = h;
}
ec.X9Parameters.prototype.getCurve = function () { return this.curve; };
ec.X9Parameters.prototype.getG = function () { return this.g; };
ec.X9Parameters.prototype.getN = function () { return this.n; };
ec.X9Parameters.prototype.getH = function () { return this.h; };
// secp256k1 is the Curve used by Bitcoin
ec.secNamedCurves = {
// used by Bitcoin
"secp256k1": function () {
// p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
var p = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F");
var a = BigInteger.ZERO;
var b = ec.fromHex("7");
var n = ec.fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141");
var h = BigInteger.ONE;
var curve = new ec.CurveFp(p, a, b);
var G = curve.decodePointHex("04"
+ "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
+ "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8");
return new ec.X9Parameters(curve, G, n, h);
}
};
// secp256k1 called by Bitcoin's ECKEY
ec.getSECCurveByName = function (name) {
if (ec.secNamedCurves[name] == undefined) return null;
return ec.secNamedCurves[name]();
}
})();
</script>
<script type="text/javascript">
// secrets.js - by Alexander Stetsyuk - released under MIT License
(function(exports, global){
var defaults = {
bits: 8, // default number of bits
radix: 16, // work with HEX by default
minBits: 3,
maxBits: 20, // this permits 1,048,575 shares, though going this high is NOT recommended in JS!
bytesPerChar: 2,
maxBytesPerChar: 6, // Math.pow(256,7) > Math.pow(2,53)
// Primitive polynomials (in decimal form) for Galois Fields GF(2^n), for 2 <= n <= 30
// The index of each term in the array corresponds to the n for that polynomial
// i.e. to get the polynomial for n=16, use primitivePolynomials[16]
primitivePolynomials: [null,null,1,3,3,5,3,3,29,17,9,5,83,27,43,3,45,9,39,39,9,5,3,33,27,9,71,39,9,5,83],
// warning for insecure PRNG
warning: 'WARNING:\nA secure random number generator was not found.\nUsing Math.random(), which is NOT cryptographically strong!'
};
// Protected settings object
var config = {};
/** @expose **/
exports.getConfig = function(){
return {
'bits': config.bits,
'unsafePRNG': config.unsafePRNG
};
};
function init(bits){
if(bits && (typeof bits !== 'number' || bits%1 !== 0 || bits<defaults.minBits || bits>defaults.maxBits)){
throw new Error('Number of bits must be an integer between ' + defaults.minBits + ' and ' + defaults.maxBits + ', inclusive.')
}
config.radix = defaults.radix;
config.bits = bits || defaults.bits;
config.size = Math.pow(2, config.bits);
config.max = config.size - 1;
// Construct the exp and log tables for multiplication.
var logs = [], exps = [], x = 1, primitive = defaults.primitivePolynomials[config.bits];
for(var i=0; i<config.size; i++){
exps[i] = x;
logs[x] = i;
x <<= 1;
if(x >= config.size){
x ^= primitive;
x &= config.max;
}
}
config.logs = logs;
config.exps = exps;
};
/** @expose **/
exports.init = init;
function isInited(){
if(!config.bits || !config.size || !config.max || !config.logs || !config.exps || config.logs.length !== config.size || config.exps.length !== config.size){
return false;
}
return true;
};
// Returns a pseudo-random number generator of the form function(bits){}
// which should output a random string of 1's and 0's of length `bits`
function getRNG(){
var randomBits, crypto;
function construct(bits, arr, radix, size){
var str = '',
i = 0,
len = arr.length-1;
while( i<len || (str.length < bits) ){
str += padLeft(parseInt(arr[i], radix).toString(2), size);
i++;
}
str = str.substr(-bits);
if( (str.match(/0/g)||[]).length === str.length){ // all zeros?
return null;
}else{
return str;
}
}
// node.js crypto.randomBytes()
if(typeof require === 'function' && (crypto=require('crypto')) && (randomBits=crypto['randomBytes'])){
return function(bits){
var bytes = Math.ceil(bits/8),
str = null;
while( str === null ){
str = construct(bits, randomBits(bytes).toString('hex'), 16, 4);
}
return str;
}
}
// browsers with window.crypto.getRandomValues()
if(global['crypto'] && typeof global['crypto']['getRandomValues'] === 'function' && typeof global['Uint32Array'] === 'function'){
crypto = global['crypto'];
return function(bits){
var elems = Math.ceil(bits/32),
str = null,
arr = new global['Uint32Array'](elems);
while( str === null ){
crypto['getRandomValues'](arr);
str = construct(bits, arr, 10, 32);
}
return str;
}
}
// A totally insecure RNG!!! (except in Safari)
// Will produce a warning every time it is called.
config.unsafePRNG = true;
warn();
var bitsPerNum = 32;
var max = Math.pow(2,bitsPerNum)-1;
return function(bits){
var elems = Math.ceil(bits/bitsPerNum);
var arr = [], str=null;
while(str===null){
for(var i=0; i<elems; i++){
arr[i] = Math.floor(Math.random() * max + 1);
}
str = construct(bits, arr, 10, bitsPerNum);
}
return str;
};
};
// Warn about using insecure rng.
// Called when Math.random() is being used.
function warn(){
global['console']['warn'](defaults.warning);
if(typeof global['alert'] === 'function' && config.alert){
global['alert'](defaults.warning);
}
}
// Set the PRNG to use. If no RNG function is supplied, pick a default using getRNG()
/** @expose **/
exports.setRNG = function(rng, alert){
if(!isInited()){
this.init();
}
config.unsafePRNG=false;
rng = rng || getRNG();
// test the RNG (5 times)
if(typeof rng !== 'function' || typeof rng(config.bits) !== 'string' || !parseInt(rng(config.bits),2) || rng(config.bits).length > config.bits || rng(config.bits).length < config.bits){
throw new Error("Random number generator is invalid. Supply an RNG of the form function(bits){} that returns a string containing 'bits' number of random 1's and 0's.")
}else{
config.rng = rng;
}
config.alert = !!alert;
return !!config.unsafePRNG;
};
function isSetRNG(){
return typeof config.rng === 'function';
};
// Generates a random bits-length number string using the PRNG
/** @expose **/
exports.random = function(bits){
if(!isSetRNG()){
this.setRNG();
}
if(typeof bits !== 'number' || bits%1 !== 0 || bits < 2){
throw new Error('Number of bits must be an integer greater than 1.')
}
if(config.unsafePRNG){
warn();
}
return bin2hex(config.rng(bits));
}
// Divides a `secret` number String str expressed in radix `inputRadix` (optional, default 16)
// into `numShares` shares, each expressed in radix `outputRadix` (optional, default to `inputRadix`),
// requiring `threshold` number of shares to reconstruct the secret.
// Optionally, zero-pads the secret to a length that is a multiple of padLength before sharing.
/** @expose **/
exports.share = function(secret, numShares, threshold, padLength, withoutPrefix){
if(!isInited()){
this.init();
}
if(!isSetRNG()){
this.setRNG();
}
padLength = padLength || 0;
if(typeof secret !== 'string'){
throw new Error('Secret must be a string.');
}
if(typeof numShares !== 'number' || numShares%1 !== 0 || numShares < 2){
throw new Error('Number of shares must be an integer between 2 and 2^bits-1 (' + config.max + '), inclusive.')
}
if(numShares > config.max){
var neededBits = Math.ceil(Math.log(numShares +1)/Math.LN2);
throw new Error('Number of shares must be an integer between 2 and 2^bits-1 (' + config.max + '), inclusive. To create ' + numShares + ' shares, use at least ' + neededBits + ' bits.')
}
if(typeof threshold !== 'number' || threshold%1 !== 0 || threshold < 2){
throw new Error('Threshold number of shares must be an integer between 2 and 2^bits-1 (' + config.max + '), inclusive.');
}
if(threshold > config.max){
var neededBits = Math.ceil(Math.log(threshold +1)/Math.LN2);
throw new Error('Threshold number of shares must be an integer between 2 and 2^bits-1 (' + config.max + '), inclusive. To use a threshold of ' + threshold + ', use at least ' + neededBits + ' bits.');
}
if(typeof padLength !== 'number' || padLength%1 !== 0 ){
throw new Error('Zero-pad length must be an integer greater than 1.');
}
if(config.unsafePRNG){
warn();
}
secret = '1' + hex2bin(secret); // append a 1 so that we can preserve the correct number of leading zeros in our secret
secret = split(secret, padLength);
var x = new Array(numShares), y = new Array(numShares);
for(var i=0, len = secret.length; i<len; i++){
var subShares = this._getShares(secret[i], numShares, threshold);
for(var j=0; j<numShares; j++){
x[j] = x[j] || subShares[j].x.toString(config.radix);
y[j] = padLeft(subShares[j].y.toString(2)) + (y[j] ? y[j] : '');
}
}
var padding = config.max.toString(config.radix).length;
if(withoutPrefix){
for(var i=0; i<numShares; i++){
x[i] = bin2hex(y[i]);
}
}else{
for(var i=0; i<numShares; i++){
x[i] = config.bits.toString(36).toUpperCase() + padLeft(x[i],padding) + bin2hex(y[i]);
}
}
return x;
};
// This is the basic polynomial generation and evaluation function
// for a `config.bits`-length secret (NOT an arbitrary length)
// Note: no error-checking at this stage! If `secrets` is NOT
// a NUMBER less than 2^bits-1, the output will be incorrect!
/** @expose **/
exports._getShares = function(secret, numShares, threshold){
var shares = [];
var coeffs = [secret];
for(var i=1; i<threshold; i++){
coeffs[i] = parseInt(config.rng(config.bits),2);
}
for(var i=1, len = numShares+1; i<len; i++){
shares[i-1] = {
x: i,
y: horner(i, coeffs)
}
}
return shares;
};
// Polynomial evaluation at `x` using Horner's Method
// TODO: this can possibly be sped up using other methods
// NOTE: fx=fx * x + coeff[i] -> exp(log(fx) + log(x)) + coeff[i],
// so if fx===0, just set fx to coeff[i] because
// using the exp/log form will result in incorrect value
function horner(x, coeffs){
var logx = config.logs[x];
var fx = 0;
for(var i=coeffs.length-1; i>=0; i--){
if(fx === 0){
fx = coeffs[i];
continue;
}
fx = config.exps[ (logx + config.logs[fx]) % config.max ] ^ coeffs[i];
}
return fx;
};
function inArray(arr,val){
for(var i = 0,len=arr.length; i < len; i++) {
if(arr[i] === val){
return true;
}
}
return false;
};
function processShare(share){
var bits = parseInt(share[0], 36);
if(bits && (typeof bits !== 'number' || bits%1 !== 0 || bits<defaults.minBits || bits>defaults.maxBits)){
throw new Error('Number of bits must be an integer between ' + defaults.minBits + ' and ' + defaults.maxBits + ', inclusive.')
}
var max = Math.pow(2, bits) - 1;
var idLength = max.toString(config.radix).length;
var id = parseInt(share.substr(1, idLength), config.radix);
if(typeof id !== 'number' || id%1 !== 0 || id<1 || id>max){
throw new Error('Share id must be an integer between 1 and ' + config.max + ', inclusive.');
}
share = share.substr(idLength + 1);
if(!share.length){
throw new Error('Invalid share: zero-length share.')
}
return {
'bits': bits,
'id': id,
'value': share
};
};
/** @expose **/
exports._processShare = processShare;
// Protected method that evaluates the Lagrange interpolation
// polynomial at x=`at` for individual config.bits-length
// segments of each share in the `shares` Array.
// Each share is expressed in base `inputRadix`. The output
// is expressed in base `outputRadix'
function combine(at, shares){
var setBits, share, x = [], y = [], result = '', idx;
for(var i=0, len = shares.length; i<len; i++){
share = processShare(shares[i]);
if(typeof setBits === 'undefined'){
setBits = share['bits'];
}else if(share['bits'] !== setBits){
throw new Error('Mismatched shares: Different bit settings.')
}
if(config.bits !== setBits){
init(setBits);
}
if(inArray(x, share['id'])){ // repeated x value?
continue;
}
idx = x.push(share['id']) - 1;
share = split(hex2bin(share['value']));
for(var j=0, len2 = share.length; j<len2; j++){
y[j] = y[j] || [];
y[j][idx] = share[j];
}
}
for(var i=0, len=y.length; i<len; i++){
result = padLeft(lagrange(at, x, y[i]).toString(2)) + result;
}
if(at===0){// reconstructing the secret
var idx = result.indexOf('1'); //find the first 1
return bin2hex(result.slice(idx+1));
}else{// generating a new share
return bin2hex(result);
}
};
// Combine `shares` Array into the original secret
/** @expose **/
exports.combine = function(shares){
return combine(0, shares);
};
// Generate a new share with id `id` (a number between 1 and 2^bits-1)
// `id` can be a Number or a String in the default radix (16)
/** @expose **/
exports.newShare = function(id, shares){
if(typeof id === 'string'){
id = parseInt(id, config.radix);
}
var share = processShare(shares[0]);
var max = Math.pow(2, share['bits']) - 1;
if(typeof id !== 'number' || id%1 !== 0 || id<1 || id>max){
throw new Error('Share id must be an integer between 1 and ' + config.max + ', inclusive.');
}
var padding = max.toString(config.radix).length;
return config.bits.toString(36).toUpperCase() + padLeft(id.toString(config.radix), padding) + combine(id, shares);
};
// Evaluate the Lagrange interpolation polynomial at x = `at`
// using x and y Arrays that are of the same length, with
// corresponding elements constituting points on the polynomial.
function lagrange(at, x, y){
var sum = 0,
product,
i, j;
for(var i=0, len = x.length; i<len; i++){
if(!y[i]){
continue;
}
product = config.logs[y[i]];
for(var j=0; j<len; j++){
if(i === j){ continue; }
if(at === x[j]){ // happens when computing a share that is in the list of shares used to compute it
product = -1; // fix for a zero product term, after which the sum should be sum^0 = sum, not sum^1
break;
}
product = ( product + config.logs[at ^ x[j]] - config.logs[x[i] ^ x[j]] + config.max/* to make sure it's not negative */ ) % config.max;
}
sum = product === -1 ? sum : sum ^ config.exps[product]; // though exps[-1]= undefined and undefined ^ anything = anything in chrome, this behavior may not hold everywhere, so do the check
}
return sum;
};
/** @expose **/
exports._lagrange = lagrange;
// Splits a number string `bits`-length segments, after first
// optionally zero-padding it to a length that is a multiple of `padLength.
// Returns array of integers (each less than 2^bits-1), with each element
// representing a `bits`-length segment of the input string from right to left,
// i.e. parts[0] represents the right-most `bits`-length segment of the input string.
function split(str, padLength){
if(padLength){
str = padLeft(str, padLength)
}
var parts = [];
for(var i=str.length; i>config.bits; i-=config.bits){
parts.push(parseInt(str.slice(i-config.bits, i), 2));
}
parts.push(parseInt(str.slice(0, i), 2));
return parts;
};
// Pads a string `str` with zeros on the left so that its length is a multiple of `bits`
function padLeft(str, bits){
bits = bits || config.bits
var missing = str.length % bits;
return (missing ? new Array(bits - missing + 1).join('0') : '') + str;
};
function hex2bin(str){
var bin = '', num;
for(var i=str.length - 1; i>=0; i--){
num = parseInt(str[i], 16)
if(isNaN(num)){
throw new Error('Invalid hex character.')
}
bin = padLeft(num.toString(2), 4) + bin;
}
return bin;
}
function bin2hex(str){
var hex = '', num;
str = padLeft(str, 4);
for(var i=str.length; i>=4; i-=4){
num = parseInt(str.slice(i-4, i), 2);
if(isNaN(num)){
throw new Error('Invalid binary character.')
}
hex = num.toString(16) + hex;
}
return hex;
}
// Converts a given UTF16 character string to the HEX representation.
// Each character of the input string is represented by
// `bytesPerChar` bytes in the output string.
/** @expose **/
exports.str2hex = function(str, bytesPerChar){
if(typeof str !== 'string'){
throw new Error('Input must be a character string.');
}
bytesPerChar = bytesPerChar || defaults.bytesPerChar;
if(typeof bytesPerChar !== 'number' || bytesPerChar%1 !== 0 || bytesPerChar<1 || bytesPerChar > defaults.maxBytesPerChar){
throw new Error('Bytes per character must be an integer between 1 and ' + defaults.maxBytesPerChar + ', inclusive.')
}
var hexChars = 2*bytesPerChar;
var max = Math.pow(16, hexChars) - 1;
var out = '', num;
for(var i=0, len=str.length; i<len; i++){
num = str[i].charCodeAt();
if(isNaN(num)){
throw new Error('Invalid character: ' + str[i]);
}else if(num > max){
var neededBytes = Math.ceil(Math.log(num+1)/Math.log(256));
throw new Error('Invalid character code (' + num +'). Maximum allowable is 256^bytes-1 (' + max + '). To convert this character, use at least ' + neededBytes + ' bytes.')
}else{
out = padLeft(num.toString(16), hexChars) + out;
}
}
return out;
};
// Converts a given HEX number string to a UTF16 character string.
/** @expose **/
exports.hex2str = function(str, bytesPerChar){
if(typeof str !== 'string'){
throw new Error('Input must be a hexadecimal string.');
}
bytesPerChar = bytesPerChar || defaults.bytesPerChar;
if(typeof bytesPerChar !== 'number' || bytesPerChar%1 !== 0 || bytesPerChar<1 || bytesPerChar > defaults.maxBytesPerChar){
throw new Error('Bytes per character must be an integer between 1 and ' + defaults.maxBytesPerChar + ', inclusive.')
}
var hexChars = 2*bytesPerChar;
var out = '';
str = padLeft(str, hexChars);
for(var i=0, len = str.length; i<len; i+=hexChars){
out = String.fromCharCode(parseInt(str.slice(i, i+hexChars),16)) + out;
}
return out;
};
// by default, initialize without an RNG
exports.init();
})(typeof module !== 'undefined' && module['exports'] ? module['exports'] : (window['secrets'] = {}), typeof GLOBAL !== 'undefined' ? GLOBAL : window );
</script>
<script type="text/javascript">
// Upstream 'BigInteger' here:
// Original Author: http://www-cs-students.stanford.edu/~tjw/jsbn/
// Follows 'jsbn' on Github: https://github.com/jasondavies/jsbn
// Review and Testing: https://github.com/cryptocoinjs/bigi/
/*!
* Basic JavaScript BN library - subset useful for RSA encryption. v1.4
*
* Copyright (c) 2005 Tom Wu
* All Rights Reserved.
* BSD License
* http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE
*
* Copyright Stephan Thomas
* Copyright pointbiz
*/
(function () {
// (public) Constructor function of Global BigInteger object
var BigInteger = window.BigInteger = function BigInteger(a, b, c) {
if (!(this instanceof BigInteger))
return new BigInteger(a, b, c);
if (a != null)
if ("number" == typeof a) this.fromNumber(a, b, c);
else if (b == null && "string" != typeof a) this.fromString(a, 256);
else this.fromString(a, b);
};
// Bits per digit
var dbits;
// JavaScript engine analysis
var canary = 0xdeadbeefcafe;
var j_lm = ((canary & 0xffffff) == 0xefcafe);
// return new, unset BigInteger
function nbi() { return new BigInteger(null); }
// am: Compute w_j += (x*this_i), propagate carries,
// c is initial carry, returns final carry.
// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
// We need to select the fastest one that works in this environment.
// am1: use a single mult and divide to get the high bits,
// max digit bits should be 26 because
// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
function am1(i, x, w, j, c, n) {
while (--n >= 0) {
var v = x * this[i++] + w[j] + c;
c = Math.floor(v / 0x4000000);
w[j++] = v & 0x3ffffff;
}
return c;
}
// am2 avoids a big mult-and-extract completely.
// Max digit bits should be <= 30 because we do bitwise ops
// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
function am2(i, x, w, j, c, n) {
var xl = x & 0x7fff, xh = x >> 15;
while (--n >= 0) {
var l = this[i] & 0x7fff;
var h = this[i++] >> 15;
var m = xh * l + h * xl;
l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);
c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);
w[j++] = l & 0x3fffffff;
}
return c;
}
// Alternately, set max digit bits to 28 since some
// browsers slow down when dealing with 32-bit numbers.
function am3(i, x, w, j, c, n) {
var xl = x & 0x3fff, xh = x >> 14;
while (--n >= 0) {
var l = this[i] & 0x3fff;
var h = this[i++] >> 14;
var m = xh * l + h * xl;
l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;
c = (l >> 28) + (m >> 14) + xh * h;
w[j++] = l & 0xfffffff;
}
return c;
}
if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
BigInteger.prototype.am = am2;
dbits = 30;
}
else if (j_lm && (navigator.appName != "Netscape")) {
BigInteger.prototype.am = am1;
dbits = 26;
}
else { // Mozilla/Netscape seems to prefer am3
BigInteger.prototype.am = am3;
dbits = 28;
}
BigInteger.prototype.DB = dbits;
BigInteger.prototype.DM = ((1 << dbits) - 1);
BigInteger.prototype.DV = (1 << dbits);
var BI_FP = 52;
BigInteger.prototype.FV = Math.pow(2, BI_FP);
BigInteger.prototype.F1 = BI_FP - dbits;
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
// Digit conversions
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC = new Array();
var rr, vv;
rr = "0".charCodeAt(0);
for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
rr = "a".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
rr = "A".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
function int2char(n) { return BI_RM.charAt(n); }
function intAt(s, i) {
var c = BI_RC[s.charCodeAt(i)];
return (c == null) ? -1 : c;
}
// return bigint initialized to value
function nbv(i) { var r = nbi(); r.fromInt(i); return r; }
// returns bit length of the integer x
function nbits(x) {
var r = 1, t;
if ((t = x >>> 16) != 0) { x = t; r += 16; }
if ((t = x >> 8) != 0) { x = t; r += 8; }
if ((t = x >> 4) != 0) { x = t; r += 4; }
if ((t = x >> 2) != 0) { x = t; r += 2; }
if ((t = x >> 1) != 0) { x = t; r += 1; }
return r;
}
// (protected) copy this to r
BigInteger.prototype.copyTo = function (r) {
for (var i = this.t - 1; i >= 0; --i) r[i] = this[i];
r.t = this.t;
r.s = this.s;
};
// (protected) set from integer value x, -DV <= x < DV
BigInteger.prototype.fromInt = function (x) {
this.t = 1;
this.s = (x < 0) ? -1 : 0;
if (x > 0) this[0] = x;
else if (x < -1) this[0] = x + this.DV;
else this.t = 0;
};
// (protected) set from string and radix
BigInteger.prototype.fromString = function (s, b) {
var k;
if (b == 16) k = 4;
else if (b == 8) k = 3;
else if (b == 256) k = 8; // byte array
else if (b == 2) k = 1;
else if (b == 32) k = 5;
else if (b == 4) k = 2;
else { this.fromRadix(s, b); return; }
this.t = 0;
this.s = 0;
var i = s.length, mi = false, sh = 0;
while (--i >= 0) {
var x = (k == 8) ? s[i] & 0xff : intAt(s, i);
if (x < 0) {
if (s.charAt(i) == "-") mi = true;
continue;
}
mi = false;
if (sh == 0)
this[this.t++] = x;
else if (sh + k > this.DB) {
this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;
this[this.t++] = (x >> (this.DB - sh));
}
else
this[this.t - 1] |= x << sh;
sh += k;
if (sh >= this.DB) sh -= this.DB;
}
if (k == 8 && (s[0] & 0x80) != 0) {
this.s = -1;
if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;
}
this.clamp();
if (mi) BigInteger.ZERO.subTo(this, this);
};
// (protected) clamp off excess high words
BigInteger.prototype.clamp = function () {
var c = this.s & this.DM;
while (this.t > 0 && this[this.t - 1] == c) --this.t;
};
// (protected) r = this << n*DB
BigInteger.prototype.dlShiftTo = function (n, r) {
var i;
for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i];
for (i = n - 1; i >= 0; --i) r[i] = 0;
r.t = this.t + n;
r.s = this.s;
};
// (protected) r = this >> n*DB
BigInteger.prototype.drShiftTo = function (n, r) {
for (var i = n; i < this.t; ++i) r[i - n] = this[i];
r.t = Math.max(this.t - n, 0);
r.s = this.s;
};
// (protected) r = this << n
BigInteger.prototype.lShiftTo = function (n, r) {
var bs = n % this.DB;
var cbs = this.DB - bs;
var bm = (1 << cbs) - 1;
var ds = Math.floor(n / this.DB), c = (this.s << bs) & this.DM, i;
for (i = this.t - 1; i >= 0; --i) {
r[i + ds + 1] = (this[i] >> cbs) | c;
c = (this[i] & bm) << bs;
}
for (i = ds - 1; i >= 0; --i) r[i] = 0;
r[ds] = c;
r.t = this.t + ds + 1;
r.s = this.s;
r.clamp();
};
// (protected) r = this >> n
BigInteger.prototype.rShiftTo = function (n, r) {
r.s = this.s;
var ds = Math.floor(n / this.DB);
if (ds >= this.t) { r.t = 0; return; }
var bs = n % this.DB;
var cbs = this.DB - bs;
var bm = (1 << bs) - 1;
r[0] = this[ds] >> bs;
for (var i = ds + 1; i < this.t; ++i) {
r[i - ds - 1] |= (this[i] & bm) << cbs;
r[i - ds] = this[i] >> bs;
}
if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs;
r.t = this.t - ds;
r.clamp();
};
// (protected) r = this - a
BigInteger.prototype.subTo = function (a, r) {
var i = 0, c = 0, m = Math.min(a.t, this.t);
while (i < m) {
c += this[i] - a[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
if (a.t < this.t) {
c -= a.s;
while (i < this.t) {
c += this[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
c += this.s;
}
else {
c += this.s;
while (i < a.t) {
c -= a[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
c -= a.s;
}
r.s = (c < 0) ? -1 : 0;
if (c < -1) r[i++] = this.DV + c;
else if (c > 0) r[i++] = c;
r.t = i;
r.clamp();
};
// (protected) r = this * a, r != this,a (HAC 14.12)
// "this" should be the larger one if appropriate.
BigInteger.prototype.multiplyTo = function (a, r) {
var x = this.abs(), y = a.abs();
var i = x.t;
r.t = i + y.t;
while (--i >= 0) r[i] = 0;
for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);
r.s = 0;
r.clamp();
if (this.s != a.s) BigInteger.ZERO.subTo(r, r);
};
// (protected) r = this^2, r != this (HAC 14.16)
BigInteger.prototype.squareTo = function (r) {
var x = this.abs();
var i = r.t = 2 * x.t;
while (--i >= 0) r[i] = 0;
for (i = 0; i < x.t - 1; ++i) {
var c = x.am(i, x[i], r, 2 * i, 0, 1);
if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {
r[i + x.t] -= x.DV;
r[i + x.t + 1] = 1;
}
}
if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);
r.s = 0;
r.clamp();
};
// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
// r != q, this != m. q or r may be null.
BigInteger.prototype.divRemTo = function (m, q, r) {
var pm = m.abs();
if (pm.t <= 0) return;
var pt = this.abs();
if (pt.t < pm.t) {
if (q != null) q.fromInt(0);
if (r != null) this.copyTo(r);
return;
}
if (r == null) r = nbi();
var y = nbi(), ts = this.s, ms = m.s;
var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus
if (nsh > 0) { pm.lShiftTo(nsh, y); pt.lShiftTo(nsh, r); }
else { pm.copyTo(y); pt.copyTo(r); }
var ys = y.t;
var y0 = y[ys - 1];
if (y0 == 0) return;
var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);
var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2;
var i = r.t, j = i - ys, t = (q == null) ? nbi() : q;
y.dlShiftTo(j, t);
if (r.compareTo(t) >= 0) {
r[r.t++] = 1;
r.subTo(t, r);
}
BigInteger.ONE.dlShiftTo(ys, t);
t.subTo(y, y); // "negative" y so we can replace sub with am later
while (y.t < ys) y[y.t++] = 0;
while (--j >= 0) {
// Estimate quotient digit
var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);
if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out
y.dlShiftTo(j, t);
r.subTo(t, r);
while (r[i] < --qd) r.subTo(t, r);
}
}
if (q != null) {
r.drShiftTo(ys, q);
if (ts != ms) BigInteger.ZERO.subTo(q, q);
}
r.t = ys;
r.clamp();
if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder
if (ts < 0) BigInteger.ZERO.subTo(r, r);
};
// (protected) return "-1/this % 2^DB"; useful for Mont. reduction
// justification:
// xy == 1 (mod m)
// xy = 1+km
// xy(2-xy) = (1+km)(1-km)
// x[y(2-xy)] = 1-k^2m^2
// x[y(2-xy)] == 1 (mod m^2)
// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
// JS multiply "overflows" differently from C/C++, so care is needed here.
BigInteger.prototype.invDigit = function () {
if (this.t < 1) return 0;
var x = this[0];
if ((x & 1) == 0) return 0;
var y = x & 3; // y == 1/x mod 2^2
y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8
y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16
// last step - calculate inverse mod DV directly;
// assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits
// we really want the negative inverse, and -DV < y < DV
return (y > 0) ? this.DV - y : -y;
};
// (protected) true iff this is even
BigInteger.prototype.isEven = function () { return ((this.t > 0) ? (this[0] & 1) : this.s) == 0; };
// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
BigInteger.prototype.exp = function (e, z) {
if (e > 0xffffffff || e < 1) return BigInteger.ONE;
var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e) - 1;
g.copyTo(r);
while (--i >= 0) {
z.sqrTo(r, r2);
if ((e & (1 << i)) > 0) z.mulTo(r2, g, r);
else { var t = r; r = r2; r2 = t; }
}
return z.revert(r);
};
// (public) return string representation in given radix
BigInteger.prototype.toString = function (b) {
if (this.s < 0) return "-" + this.negate().toString(b);
var k;
if (b == 16) k = 4;
else if (b == 8) k = 3;
else if (b == 2) k = 1;
else if (b == 32) k = 5;
else if (b == 4) k = 2;
else return this.toRadix(b);
var km = (1 << k) - 1, d, m = false, r = "", i = this.t;
var p = this.DB - (i * this.DB) % k;
if (i-- > 0) {
if (p < this.DB && (d = this[i] >> p) > 0) { m = true; r = int2char(d); }
while (i >= 0) {
if (p < k) {
d = (this[i] & ((1 << p) - 1)) << (k - p);
d |= this[--i] >> (p += this.DB - k);
}
else {
d = (this[i] >> (p -= k)) & km;
if (p <= 0) { p += this.DB; --i; }
}
if (d > 0) m = true;
if (m) r += int2char(d);
}
}
return m ? r : "0";
};
// (public) -this
BigInteger.prototype.negate = function () { var r = nbi(); BigInteger.ZERO.subTo(this, r); return r; };
// (public) |this|
BigInteger.prototype.abs = function () { return (this.s < 0) ? this.negate() : this; };
// (public) return + if this > a, - if this < a, 0 if equal
BigInteger.prototype.compareTo = function (a) {
var r = this.s - a.s;
if (r != 0) return r;
var i = this.t;
r = i - a.t;
if (r != 0) return (this.s < 0) ? -r : r;
while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r;
return 0;
}
// (public) return the number of bits in "this"
BigInteger.prototype.bitLength = function () {
if (this.t <= 0) return 0;
return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));
};
// (public) this mod a
BigInteger.prototype.mod = function (a) {
var r = nbi();
this.abs().divRemTo(a, null, r);
if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r);
return r;
}
// (public) this^e % m, 0 <= e < 2^32
BigInteger.prototype.modPowInt = function (e, m) {
var z;
if (e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
return this.exp(e, z);
};
// "constants"
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);
// Copyright (c) 2005-2009 Tom Wu
// All Rights Reserved.
// See "LICENSE" for details.
// Extended JavaScript BN functions, required for RSA private ops.
// Version 1.1: new BigInteger("0", 10) returns "proper" zero
// Version 1.2: square() API, isProbablePrime fix
// return index of lowest 1-bit in x, x < 2^31
function lbit(x) {
if (x == 0) return -1;
var r = 0;
if ((x & 0xffff) == 0) { x >>= 16; r += 16; }
if ((x & 0xff) == 0) { x >>= 8; r += 8; }
if ((x & 0xf) == 0) { x >>= 4; r += 4; }
if ((x & 3) == 0) { x >>= 2; r += 2; }
if ((x & 1) == 0) ++r;
return r;
}
// return number of 1 bits in x
function cbit(x) {
var r = 0;
while (x != 0) { x &= x - 1; ++r; }
return r;
}
var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
// (protected) return x s.t. r^x < DV
BigInteger.prototype.chunkSize = function (r) { return Math.floor(Math.LN2 * this.DB / Math.log(r)); };
// (protected) convert to radix string
BigInteger.prototype.toRadix = function (b) {
if (b == null) b = 10;
if (this.signum() == 0 || b < 2 || b > 36) return "0";
var cs = this.chunkSize(b);
var a = Math.pow(b, cs);
var d = nbv(a), y = nbi(), z = nbi(), r = "";
this.divRemTo(d, y, z);
while (y.signum() > 0) {
r = (a + z.intValue()).toString(b).substr(1) + r;
y.divRemTo(d, y, z);
}
return z.intValue().toString(b) + r;
};
// (protected) convert from radix string
BigInteger.prototype.fromRadix = function (s, b) {
this.fromInt(0);
if (b == null) b = 10;
var cs = this.chunkSize(b);
var d = Math.pow(b, cs), mi = false, j = 0, w = 0;
for (var i = 0; i < s.length; ++i) {
var x = intAt(s, i);
if (x < 0) {
if (s.charAt(i) == "-" && this.signum() == 0) mi = true;
continue;
}
w = b * w + x;
if (++j >= cs) {
this.dMultiply(d);
this.dAddOffset(w, 0);
j = 0;
w = 0;
}
}
if (j > 0) {
this.dMultiply(Math.pow(b, j));
this.dAddOffset(w, 0);
}
if (mi) BigInteger.ZERO.subTo(this, this);
};
// (protected) alternate constructor
BigInteger.prototype.fromNumber = function (a, b, c) {
if ("number" == typeof b) {
// new BigInteger(int,int,RNG)
if (a < 2) this.fromInt(1);
else {
this.fromNumber(a, c);
if (!this.testBit(a - 1)) // force MSB set
this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
if (this.isEven()) this.dAddOffset(1, 0); // force odd
while (!this.isProbablePrime(b)) {
this.dAddOffset(2, 0);
if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);
}
}
}
else {
// new BigInteger(int,RNG)
var x = new Array(), t = a & 7;
x.length = (a >> 3) + 1;
b.nextBytes(x);
if (t > 0) x[0] &= ((1 << t) - 1); else x[0] = 0;
this.fromString(x, 256);
}
};
// (protected) r = this op a (bitwise)
BigInteger.prototype.bitwiseTo = function (a, op, r) {
var i, f, m = Math.min(a.t, this.t);
for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]);
if (a.t < this.t) {
f = a.s & this.DM;
for (i = m; i < this.t; ++i) r[i] = op(this[i], f);
r.t = this.t;
}
else {
f = this.s & this.DM;
for (i = m; i < a.t; ++i) r[i] = op(f, a[i]);
r.t = a.t;
}
r.s = op(this.s, a.s);
r.clamp();
};
// (protected) this op (1<<n)
BigInteger.prototype.changeBit = function (n, op) {
var r = BigInteger.ONE.shiftLeft(n);
this.bitwiseTo(r, op, r);
return r;
};
// (protected) r = this + a
BigInteger.prototype.addTo = function (a, r) {
var i = 0, c = 0, m = Math.min(a.t, this.t);
while (i < m) {
c += this[i] + a[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
if (a.t < this.t) {
c += a.s;
while (i < this.t) {
c += this[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
c += this.s;
}
else {
c += this.s;
while (i < a.t) {
c += a[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
c += a.s;
}
r.s = (c < 0) ? -1 : 0;
if (c > 0) r[i++] = c;
else if (c < -1) r[i++] = this.DV + c;
r.t = i;
r.clamp();
};
// (protected) this *= n, this >= 0, 1 < n < DV
BigInteger.prototype.dMultiply = function (n) {
this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);
++this.t;
this.clamp();
};
// (protected) this += n << w words, this >= 0
BigInteger.prototype.dAddOffset = function (n, w) {
if (n == 0) return;
while (this.t <= w) this[this.t++] = 0;
this[w] += n;
while (this[w] >= this.DV) {
this[w] -= this.DV;
if (++w >= this.t) this[this.t++] = 0;
++this[w];
}
};
// (protected) r = lower n words of "this * a", a.t <= n
// "this" should be the larger one if appropriate.
BigInteger.prototype.multiplyLowerTo = function (a, n, r) {
var i = Math.min(this.t + a.t, n);
r.s = 0; // assumes a,this >= 0
r.t = i;
while (i > 0) r[--i] = 0;
var j;
for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);
for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i);
r.clamp();
};
// (protected) r = "this * a" without lower n words, n > 0
// "this" should be the larger one if appropriate.
BigInteger.prototype.multiplyUpperTo = function (a, n, r) {
--n;
var i = r.t = this.t + a.t - n;
r.s = 0; // assumes a,this >= 0
while (--i >= 0) r[i] = 0;
for (i = Math.max(n - this.t, 0); i < a.t; ++i)
r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);
r.clamp();
r.drShiftTo(1, r);
};
// (protected) this % n, n < 2^26
BigInteger.prototype.modInt = function (n) {
if (n <= 0) return 0;
var d = this.DV % n, r = (this.s < 0) ? n - 1 : 0;
if (this.t > 0)
if (d == 0) r = this[0] % n;
else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n;
return r;
};
// (protected) true if probably prime (HAC 4.24, Miller-Rabin)
BigInteger.prototype.millerRabin = function (t) {
var n1 = this.subtract(BigInteger.ONE);
var k = n1.getLowestSetBit();
if (k <= 0) return false;
var r = n1.shiftRight(k);
t = (t + 1) >> 1;
if (t > lowprimes.length) t = lowprimes.length;
var a = nbi();
for (var i = 0; i < t; ++i) {
//Pick bases at random, instead of starting at 2
a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
var y = a.modPow(r, this);
if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
var j = 1;
while (j++ < k && y.compareTo(n1) != 0) {
y = y.modPowInt(2, this);
if (y.compareTo(BigInteger.ONE) == 0) return false;
}
if (y.compareTo(n1) != 0) return false;
}
}
return true;
};
// (public)
BigInteger.prototype.clone = function () { var r = nbi(); this.copyTo(r); return r; };
// (public) return value as integer
BigInteger.prototype.intValue = function () {
if (this.s < 0) {
if (this.t == 1) return this[0] - this.DV;
else if (this.t == 0) return -1;
}
else if (this.t == 1) return this[0];
else if (this.t == 0) return 0;
// assumes 16 < DB < 32
return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];
};
// (public) return value as byte
BigInteger.prototype.byteValue = function () { return (this.t == 0) ? this.s : (this[0] << 24) >> 24; };
// (public) return value as short (assumes DB>=16)
BigInteger.prototype.shortValue = function () { return (this.t == 0) ? this.s : (this[0] << 16) >> 16; };
// (public) 0 if this == 0, 1 if this > 0
BigInteger.prototype.signum = function () {
if (this.s < 0) return -1;
else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;
else return 1;
};
// (public) convert to bigendian byte array
BigInteger.prototype.toByteArray = function () {
var i = this.t, r = new Array();
r[0] = this.s;
var p = this.DB - (i * this.DB) % 8, d, k = 0;
if (i-- > 0) {
if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p)
r[k++] = d | (this.s << (this.DB - p));
while (i >= 0) {
if (p < 8) {
d = (this[i] & ((1 << p) - 1)) << (8 - p);
d |= this[--i] >> (p += this.DB - 8);
}
else {
d = (this[i] >> (p -= 8)) & 0xff;
if (p <= 0) { p += this.DB; --i; }
}
if ((d & 0x80) != 0) d |= -256;
if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k;
if (k > 0 || d != this.s) r[k++] = d;
}
}
return r;
};
BigInteger.prototype.equals = function (a) { return (this.compareTo(a) == 0); };
BigInteger.prototype.min = function (a) { return (this.compareTo(a) < 0) ? this : a; };
BigInteger.prototype.max = function (a) { return (this.compareTo(a) > 0) ? this : a; };
// (public) this & a
function op_and(x, y) { return x & y; }
BigInteger.prototype.and = function (a) { var r = nbi(); this.bitwiseTo(a, op_and, r); return r; };
// (public) this | a
function op_or(x, y) { return x | y; }
BigInteger.prototype.or = function (a) { var r = nbi(); this.bitwiseTo(a, op_or, r); return r; };
// (public) this ^ a
function op_xor(x, y) { return x ^ y; }
BigInteger.prototype.xor = function (a) { var r = nbi(); this.bitwiseTo(a, op_xor, r); return r; };
// (public) this & ~a
function op_andnot(x, y) { return x & ~y; }
BigInteger.prototype.andNot = function (a) { var r = nbi(); this.bitwiseTo(a, op_andnot, r); return r; };
// (public) ~this
BigInteger.prototype.not = function () {
var r = nbi();
for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i];
r.t = this.t;
r.s = ~this.s;
return r;
};
// (public) this << n
BigInteger.prototype.shiftLeft = function (n) {
var r = nbi();
if (n < 0) this.rShiftTo(-n, r); else this.lShiftTo(n, r);
return r;
};
// (public) this >> n
BigInteger.prototype.shiftRight = function (n) {
var r = nbi();
if (n < 0) this.lShiftTo(-n, r); else this.rShiftTo(n, r);
return r;
};
// (public) returns index of lowest 1-bit (or -1 if none)
BigInteger.prototype.getLowestSetBit = function () {
for (var i = 0; i < this.t; ++i)
if (this[i] != 0) return i * this.DB + lbit(this[i]);
if (this.s < 0) return this.t * this.DB;
return -1;
};
// (public) return number of set bits
BigInteger.prototype.bitCount = function () {
var r = 0, x = this.s & this.DM;
for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x);
return r;
};
// (public) true iff nth bit is set
BigInteger.prototype.testBit = function (n) {
var j = Math.floor(n / this.DB);
if (j >= this.t) return (this.s != 0);
return ((this[j] & (1 << (n % this.DB))) != 0);
};
// (public) this | (1<<n)
BigInteger.prototype.setBit = function (n) { return this.changeBit(n, op_or); };
// (public) this & ~(1<<n)
BigInteger.prototype.clearBit = function (n) { return this.changeBit(n, op_andnot); };
// (public) this ^ (1<<n)
BigInteger.prototype.flipBit = function (n) { return this.changeBit(n, op_xor); };
// (public) this + a
BigInteger.prototype.add = function (a) { var r = nbi(); this.addTo(a, r); return r; };
// (public) this - a
BigInteger.prototype.subtract = function (a) { var r = nbi(); this.subTo(a, r); return r; };
// (public) this * a
BigInteger.prototype.multiply = function (a) { var r = nbi(); this.multiplyTo(a, r); return r; };
// (public) this / a
BigInteger.prototype.divide = function (a) { var r = nbi(); this.divRemTo(a, r, null); return r; };
// (public) this % a
BigInteger.prototype.remainder = function (a) { var r = nbi(); this.divRemTo(a, null, r); return r; };
// (public) [this/a,this%a]
BigInteger.prototype.divideAndRemainder = function (a) {
var q = nbi(), r = nbi();
this.divRemTo(a, q, r);
return new Array(q, r);
};
// (public) this^e % m (HAC 14.85)
BigInteger.prototype.modPow = function (e, m) {
var i = e.bitLength(), k, r = nbv(1), z;
if (i <= 0) return r;
else if (i < 18) k = 1;
else if (i < 48) k = 3;
else if (i < 144) k = 4;
else if (i < 768) k = 5;
else k = 6;
if (i < 8)
z = new Classic(m);
else if (m.isEven())
z = new Barrett(m);
else
z = new Montgomery(m);
// precomputation
var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1;
g[1] = z.convert(this);
if (k > 1) {
var g2 = nbi();
z.sqrTo(g[1], g2);
while (n <= km) {
g[n] = nbi();
z.mulTo(g2, g[n - 2], g[n]);
n += 2;
}
}
var j = e.t - 1, w, is1 = true, r2 = nbi(), t;
i = nbits(e[j]) - 1;
while (j >= 0) {
if (i >= k1) w = (e[j] >> (i - k1)) & km;
else {
w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
if (j > 0) w |= e[j - 1] >> (this.DB + i - k1);
}
n = k;
while ((w & 1) == 0) { w >>= 1; --n; }
if ((i -= n) < 0) { i += this.DB; --j; }
if (is1) { // ret == 1, don't bother squaring or multiplying it
g[w].copyTo(r);
is1 = false;
}
else {
while (n > 1) { z.sqrTo(r, r2); z.sqrTo(r2, r); n -= 2; }
if (n > 0) z.sqrTo(r, r2); else { t = r; r = r2; r2 = t; }
z.mulTo(r2, g[w], r);
}
while (j >= 0 && (e[j] & (1 << i)) == 0) {
z.sqrTo(r, r2); t = r; r = r2; r2 = t;
if (--i < 0) { i = this.DB - 1; --j; }
}
}
return z.revert(r);
};
// (public) 1/this % m (HAC 14.61)
BigInteger.prototype.modInverse = function (m) {
var ac = m.isEven();
if (this.signum() === 0) throw new Error('division by zero');
if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
var u = m.clone(), v = this.clone();
var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
while (u.signum() != 0) {
while (u.isEven()) {
u.rShiftTo(1, u);
if (ac) {
if (!a.isEven() || !b.isEven()) { a.addTo(this, a); b.subTo(m, b); }
a.rShiftTo(1, a);
}
else if (!b.isEven()) b.subTo(m, b);
b.rShiftTo(1, b);
}
while (v.isEven()) {
v.rShiftTo(1, v);
if (ac) {
if (!c.isEven() || !d.isEven()) { c.addTo(this, c); d.subTo(m, d); }
c.rShiftTo(1, c);
}
else if (!d.isEven()) d.subTo(m, d);
d.rShiftTo(1, d);
}
if (u.compareTo(v) >= 0) {
u.subTo(v, u);
if (ac) a.subTo(c, a);
b.subTo(d, b);
}
else {
v.subTo(u, v);
if (ac) c.subTo(a, c);
d.subTo(b, d);
}
}
if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
while (d.compareTo(m) >= 0) d.subTo(m, d);
while (d.signum() < 0) d.addTo(m, d);
return d;
};
// (public) this^e
BigInteger.prototype.pow = function (e) { return this.exp(e, new NullExp()); };
// (public) gcd(this,a) (HAC 14.54)
BigInteger.prototype.gcd = function (a) {
var x = (this.s < 0) ? this.negate() : this.clone();
var y = (a.s < 0) ? a.negate() : a.clone();
if (x.compareTo(y) < 0) { var t = x; x = y; y = t; }
var i = x.getLowestSetBit(), g = y.getLowestSetBit();
if (g < 0) return x;
if (i < g) g = i;
if (g > 0) {
x.rShiftTo(g, x);
y.rShiftTo(g, y);
}
while (x.signum() > 0) {
if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x);
if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y);
if (x.compareTo(y) >= 0) {
x.subTo(y, x);
x.rShiftTo(1, x);
}
else {
y.subTo(x, y);
y.rShiftTo(1, y);
}
}
if (g > 0) y.lShiftTo(g, y);
return y;
};
// (public) test primality with certainty >= 1-.5^t
BigInteger.prototype.isProbablePrime = function (t) {
var i, x = this.abs();
if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {
for (i = 0; i < lowprimes.length; ++i)
if (x[0] == lowprimes[i]) return true;
return false;
}
if (x.isEven()) return false;
i = 1;
while (i < lowprimes.length) {
var m = lowprimes[i], j = i + 1;
while (j < lowprimes.length && m < lplim) m *= lowprimes[j++];
m = x.modInt(m);
while (i < j) if (m % lowprimes[i++] == 0) return false;
}
return x.millerRabin(t);
};
// JSBN-specific extension
// (public) this^2
BigInteger.prototype.square = function () { var r = nbi(); this.squareTo(r); return r; };
// NOTE: BigInteger interfaces not implemented in jsbn:
// BigInteger(int signum, byte[] magnitude)
// double doubleValue()
// float floatValue()
// int hashCode()
// long longValue()
// static BigInteger valueOf(long val)
// Copyright Stephan Thomas (start) --- //
// https://raw.github.com/bitcoinjs/bitcoinjs-lib/07f9d55ccb6abd962efb6befdd37671f85ea4ff9/src/util.js
// BigInteger monkey patching
BigInteger.valueOf = nbv;
/**
* Returns a byte array representation of the big integer.
*
* This returns the absolute of the contained value in big endian
* form. A value of zero results in an empty array.
*/
BigInteger.prototype.toByteArrayUnsigned = function () {
var ba = this.abs().toByteArray();
if (ba.length) {
if (ba[0] == 0) {
ba = ba.slice(1);
}
return ba.map(function (v) {
return (v < 0) ? v + 256 : v;
});
} else {
// Empty array, nothing to do
return ba;
}
};
/**
* Turns a byte array into a big integer.
*
* This function will interpret a byte array as a big integer in big
* endian notation and ignore leading zeros.
*/
BigInteger.fromByteArrayUnsigned = function (ba) {
if (!ba.length) {
return ba.valueOf(0);
} else if (ba[0] & 0x80) {
// Prepend a zero so the BigInteger class doesn't mistake this
// for a negative integer.
return new BigInteger([0].concat(ba));
} else {
return new BigInteger(ba);
}
};
/**
* Converts big integer to signed byte representation.
*
* The format for this value uses a the most significant bit as a sign
* bit. If the most significant bit is already occupied by the
* absolute value, an extra byte is prepended and the sign bit is set
* there.
*
* Examples:
*
* 0 => 0x00
* 1 => 0x01
* -1 => 0x81
* 127 => 0x7f
* -127 => 0xff
* 128 => 0x0080
* -128 => 0x8080
* 255 => 0x00ff
* -255 => 0x80ff
* 16300 => 0x3fac
* -16300 => 0xbfac
* 62300 => 0x00f35c
* -62300 => 0x80f35c
*/
BigInteger.prototype.toByteArraySigned = function () {
var val = this.abs().toByteArrayUnsigned();
var neg = this.compareTo(BigInteger.ZERO) < 0;
if (neg) {
if (val[0] & 0x80) {
val.unshift(0x80);
} else {
val[0] |= 0x80;
}
} else {
if (val[0] & 0x80) {
val.unshift(0x00);
}
}
return val;
};
/**
* Parse a signed big integer byte representation.
*
* For details on the format please see BigInteger.toByteArraySigned.
*/
BigInteger.fromByteArraySigned = function (ba) {
// Check for negative value
if (ba[0] & 0x80) {
// Remove sign bit
ba[0] &= 0x7f;
return BigInteger.fromByteArrayUnsigned(ba).negate();
} else {
return BigInteger.fromByteArrayUnsigned(ba);
}
};
// Copyright Stephan Thomas (end) --- //
// ****** REDUCTION ******* //
// Modular reduction using "classic" algorithm
var Classic = window.Classic = function Classic(m) { this.m = m; }
Classic.prototype.convert = function (x) {
if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
else return x;
};
Classic.prototype.revert = function (x) { return x; };
Classic.prototype.reduce = function (x) { x.divRemTo(this.m, null, x); };
Classic.prototype.mulTo = function (x, y, r) { x.multiplyTo(y, r); this.reduce(r); };
Classic.prototype.sqrTo = function (x, r) { x.squareTo(r); this.reduce(r); };
// Montgomery reduction
var Montgomery = window.Montgomery = function Montgomery(m) {
this.m = m;
this.mp = m.invDigit();
this.mpl = this.mp & 0x7fff;
this.mph = this.mp >> 15;
this.um = (1 << (m.DB - 15)) - 1;
this.mt2 = 2 * m.t;
}
// xR mod m
Montgomery.prototype.convert = function (x) {
var r = nbi();
x.abs().dlShiftTo(this.m.t, r);
r.divRemTo(this.m, null, r);
if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r);
return r;
}
// x/R mod m
Montgomery.prototype.revert = function (x) {
var r = nbi();
x.copyTo(r);
this.reduce(r);
return r;
};
// x = x/R mod m (HAC 14.32)
Montgomery.prototype.reduce = function (x) {
while (x.t <= this.mt2) // pad x so am has enough room later
x[x.t++] = 0;
for (var i = 0; i < this.m.t; ++i) {
// faster way of calculating u0 = x[i]*mp mod DV
var j = x[i] & 0x7fff;
var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;
// use am to combine the multiply-shift-add into one call
j = i + this.m.t;
x[j] += this.m.am(0, u0, x, i, 0, this.m.t);
// propagate carry
while (x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }
}
x.clamp();
x.drShiftTo(this.m.t, x);
if (x.compareTo(this.m) >= 0) x.subTo(this.m, x);
};
// r = "xy/R mod m"; x,y != r
Montgomery.prototype.mulTo = function (x, y, r) { x.multiplyTo(y, r); this.reduce(r); };
// r = "x^2/R mod m"; x != r
Montgomery.prototype.sqrTo = function (x, r) { x.squareTo(r); this.reduce(r); };
// A "null" reducer
var NullExp = window.NullExp = function NullExp() { }
NullExp.prototype.convert = function (x) { return x; };
NullExp.prototype.revert = function (x) { return x; };
NullExp.prototype.mulTo = function (x, y, r) { x.multiplyTo(y, r); };
NullExp.prototype.sqrTo = function (x, r) { x.squareTo(r); };
// Barrett modular reduction
var Barrett = window.Barrett = function Barrett(m) {
// setup Barrett
this.r2 = nbi();
this.q3 = nbi();
BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);
this.mu = this.r2.divide(m);
this.m = m;
}
Barrett.prototype.convert = function (x) {
if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m);
else if (x.compareTo(this.m) < 0) return x;
else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
};
Barrett.prototype.revert = function (x) { return x; };
// x = x mod m (HAC 14.42)
Barrett.prototype.reduce = function (x) {
x.drShiftTo(this.m.t - 1, this.r2);
if (x.t > this.m.t + 1) { x.t = this.m.t + 1; x.clamp(); }
this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1);
x.subTo(this.r2, x);
while (x.compareTo(this.m) >= 0) x.subTo(this.m, x);
};
// r = x*y mod m; x,y != r
Barrett.prototype.mulTo = function (x, y, r) { x.multiplyTo(y, r); this.reduce(r); };
// r = x^2 mod m; x != r
Barrett.prototype.sqrTo = function (x, r) { x.squareTo(r); this.reduce(r); };
})();
</script>
<script type="text/javascript">
//---------------------------------------------------------------------
// QRCode for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
// http://www.opensource.org/licenses/mit-license.php
//
// The word "QR Code" is registered trademark of
// DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
(function () {
//---------------------------------------------------------------------
// QRCode
//---------------------------------------------------------------------
var QRCode = window.QRCode = function (typeNumber, errorCorrectLevel) {
this.typeNumber = typeNumber;
this.errorCorrectLevel = errorCorrectLevel;
this.modules = null;
this.moduleCount = 0;
this.dataCache = null;
this.dataList = new Array();
}
QRCode.prototype = {
addData: function (data) {
var newData = new QRCode.QR8bitByte(data);
this.dataList.push(newData);
this.dataCache = null;
},
isDark: function (row, col) {
if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {
throw new Error(row + "," + col);
}
return this.modules[row][col];
},
getModuleCount: function () {
return this.moduleCount;
},
make: function () {
this.makeImpl(false, this.getBestMaskPattern());
},
makeImpl: function (test, maskPattern) {
this.moduleCount = this.typeNumber * 4 + 17;
this.modules = new Array(this.moduleCount);
for (var row = 0; row < this.moduleCount; row++) {
this.modules[row] = new Array(this.moduleCount);
for (var col = 0; col < this.moduleCount; col++) {
this.modules[row][col] = null; //(col + row) % 3;
}
}
this.setupPositionProbePattern(0, 0);
this.setupPositionProbePattern(this.moduleCount - 7, 0);
this.setupPositionProbePattern(0, this.moduleCount - 7);
this.setupPositionAdjustPattern();
this.setupTimingPattern();
this.setupTypeInfo(test, maskPattern);
if (this.typeNumber >= 7) {
this.setupTypeNumber(test);
}
if (this.dataCache == null) {
this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);
}
this.mapData(this.dataCache, maskPattern);
},
setupPositionProbePattern: function (row, col) {
for (var r = -1; r <= 7; r++) {
if (row + r <= -1 || this.moduleCount <= row + r) continue;
for (var c = -1; c <= 7; c++) {
if (col + c <= -1 || this.moduleCount <= col + c) continue;
if ((0 <= r && r <= 6 && (c == 0 || c == 6))
|| (0 <= c && c <= 6 && (r == 0 || r == 6))
|| (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
this.modules[row + r][col + c] = true;
} else {
this.modules[row + r][col + c] = false;
}
}
}
},
getBestMaskPattern: function () {
var minLostPoint = 0;
var pattern = 0;
for (var i = 0; i < 8; i++) {
this.makeImpl(true, i);
var lostPoint = QRCode.Util.getLostPoint(this);
if (i == 0 || minLostPoint > lostPoint) {
minLostPoint = lostPoint;
pattern = i;
}
}
return pattern;
},
createMovieClip: function (target_mc, instance_name, depth) {
var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);
var cs = 1;
this.make();
for (var row = 0; row < this.modules.length; row++) {
var y = row * cs;
for (var col = 0; col < this.modules[row].length; col++) {
var x = col * cs;
var dark = this.modules[row][col];
if (dark) {
qr_mc.beginFill(0, 100);
qr_mc.moveTo(x, y);
qr_mc.lineTo(x + cs, y);
qr_mc.lineTo(x + cs, y + cs);
qr_mc.lineTo(x, y + cs);
qr_mc.endFill();
}
}
}
return qr_mc;
},
setupTimingPattern: function () {
for (var r = 8; r < this.moduleCount - 8; r++) {
if (this.modules[r][6] != null) {
continue;
}
this.modules[r][6] = (r % 2 == 0);
}
for (var c = 8; c < this.moduleCount - 8; c++) {
if (this.modules[6][c] != null) {
continue;
}
this.modules[6][c] = (c % 2 == 0);
}
},
setupPositionAdjustPattern: function () {
var pos = QRCode.Util.getPatternPosition(this.typeNumber);
for (var i = 0; i < pos.length; i++) {
for (var j = 0; j < pos.length; j++) {
var row = pos[i];
var col = pos[j];
if (this.modules[row][col] != null) {
continue;
}
for (var r = -2; r <= 2; r++) {
for (var c = -2; c <= 2; c++) {
if (r == -2 || r == 2 || c == -2 || c == 2
|| (r == 0 && c == 0)) {
this.modules[row + r][col + c] = true;
} else {
this.modules[row + r][col + c] = false;
}
}
}
}
}
},
setupTypeNumber: function (test) {
var bits = QRCode.Util.getBCHTypeNumber(this.typeNumber);
for (var i = 0; i < 18; i++) {
var mod = (!test && ((bits >> i) & 1) == 1);
this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
}
for (var i = 0; i < 18; i++) {
var mod = (!test && ((bits >> i) & 1) == 1);
this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
}
},
setupTypeInfo: function (test, maskPattern) {
var data = (this.errorCorrectLevel << 3) | maskPattern;
var bits = QRCode.Util.getBCHTypeInfo(data);
// vertical
for (var i = 0; i < 15; i++) {
var mod = (!test && ((bits >> i) & 1) == 1);
if (i < 6) {
this.modules[i][8] = mod;
} else if (i < 8) {
this.modules[i + 1][8] = mod;
} else {
this.modules[this.moduleCount - 15 + i][8] = mod;
}
}
// horizontal
for (var i = 0; i < 15; i++) {
var mod = (!test && ((bits >> i) & 1) == 1);
if (i < 8) {
this.modules[8][this.moduleCount - i - 1] = mod;
} else if (i < 9) {
this.modules[8][15 - i - 1 + 1] = mod;
} else {
this.modules[8][15 - i - 1] = mod;
}
}
// fixed module
this.modules[this.moduleCount - 8][8] = (!test);
},
mapData: function (data, maskPattern) {
var inc = -1;
var row = this.moduleCount - 1;
var bitIndex = 7;
var byteIndex = 0;
for (var col = this.moduleCount - 1; col > 0; col -= 2) {
if (col == 6) col--;
while (true) {
for (var c = 0; c < 2; c++) {
if (this.modules[row][col - c] == null) {
var dark = false;
if (byteIndex < data.length) {
dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
}
var mask = QRCode.Util.getMask(maskPattern, row, col - c);
if (mask) {
dark = !dark;
}
this.modules[row][col - c] = dark;
bitIndex--;
if (bitIndex == -1) {
byteIndex++;
bitIndex = 7;
}
}
}
row += inc;
if (row < 0 || this.moduleCount <= row) {
row -= inc;
inc = -inc;
break;
}
}
}
}
};
QRCode.PAD0 = 0xEC;
QRCode.PAD1 = 0x11;
QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) {
var rsBlocks = QRCode.RSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
var buffer = new QRCode.BitBuffer();
for (var i = 0; i < dataList.length; i++) {
var data = dataList[i];
buffer.put(data.mode, 4);
buffer.put(data.getLength(), QRCode.Util.getLengthInBits(data.mode, typeNumber));
data.write(buffer);
}
// calc num max data.
var totalDataCount = 0;
for (var i = 0; i < rsBlocks.length; i++) {
totalDataCount += rsBlocks[i].dataCount;
}
if (buffer.getLengthInBits() > totalDataCount * 8) {
throw new Error("code length overflow. ("
+ buffer.getLengthInBits()
+ ">"
+ totalDataCount * 8
+ ")");
}
// end code
if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
buffer.put(0, 4);
}
// padding
while (buffer.getLengthInBits() % 8 != 0) {
buffer.putBit(false);
}
// padding
while (true) {
if (buffer.getLengthInBits() >= totalDataCount * 8) {
break;
}
buffer.put(QRCode.PAD0, 8);
if (buffer.getLengthInBits() >= totalDataCount * 8) {
break;
}
buffer.put(QRCode.PAD1, 8);
}
return QRCode.createBytes(buffer, rsBlocks);
};
QRCode.createBytes = function (buffer, rsBlocks) {
var offset = 0;
var maxDcCount = 0;
var maxEcCount = 0;
var dcdata = new Array(rsBlocks.length);
var ecdata = new Array(rsBlocks.length);
for (var r = 0; r < rsBlocks.length; r++) {
var dcCount = rsBlocks[r].dataCount;
var ecCount = rsBlocks[r].totalCount - dcCount;
maxDcCount = Math.max(maxDcCount, dcCount);
maxEcCount = Math.max(maxEcCount, ecCount);
dcdata[r] = new Array(dcCount);
for (var i = 0; i < dcdata[r].length; i++) {
dcdata[r][i] = 0xff & buffer.buffer[i + offset];
}
offset += dcCount;
var rsPoly = QRCode.Util.getErrorCorrectPolynomial(ecCount);
var rawPoly = new QRCode.Polynomial(dcdata[r], rsPoly.getLength() - 1);
var modPoly = rawPoly.mod(rsPoly);
ecdata[r] = new Array(rsPoly.getLength() - 1);
for (var i = 0; i < ecdata[r].length; i++) {
var modIndex = i + modPoly.getLength() - ecdata[r].length;
ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
}
}
var totalCodeCount = 0;
for (var i = 0; i < rsBlocks.length; i++) {
totalCodeCount += rsBlocks[i].totalCount;
}
var data = new Array(totalCodeCount);
var index = 0;
for (var i = 0; i < maxDcCount; i++) {
for (var r = 0; r < rsBlocks.length; r++) {
if (i < dcdata[r].length) {
data[index++] = dcdata[r][i];
}
}
}
for (var i = 0; i < maxEcCount; i++) {
for (var r = 0; r < rsBlocks.length; r++) {
if (i < ecdata[r].length) {
data[index++] = ecdata[r][i];
}
}
}
return data;
};
//---------------------------------------------------------------------
// QR8bitByte
//---------------------------------------------------------------------
QRCode.QR8bitByte = function (data) {
this.mode = QRCode.Mode.MODE_8BIT_BYTE;
this.data = data;
}
QRCode.QR8bitByte.prototype = {
getLength: function (buffer) {
return this.data.length;
},
write: function (buffer) {
for (var i = 0; i < this.data.length; i++) {
// not JIS ...
buffer.put(this.data.charCodeAt(i), 8);
}
}
};
//---------------------------------------------------------------------
// QRMode
//---------------------------------------------------------------------
QRCode.Mode = {
MODE_NUMBER: 1 << 0,
MODE_ALPHA_NUM: 1 << 1,
MODE_8BIT_BYTE: 1 << 2,
MODE_KANJI: 1 << 3
};
//---------------------------------------------------------------------
// QRErrorCorrectLevel
//---------------------------------------------------------------------
QRCode.ErrorCorrectLevel = {
L: 1,
M: 0,
Q: 3,
H: 2
};
//---------------------------------------------------------------------
// QRMaskPattern
//---------------------------------------------------------------------
QRCode.MaskPattern = {
PATTERN000: 0,
PATTERN001: 1,
PATTERN010: 2,
PATTERN011: 3,
PATTERN100: 4,
PATTERN101: 5,
PATTERN110: 6,
PATTERN111: 7
};
//---------------------------------------------------------------------
// QRUtil
//---------------------------------------------------------------------
QRCode.Util = {
PATTERN_POSITION_TABLE: [
[],
[6, 18],
[6, 22],
[6, 26],
[6, 30],
[6, 34],
[6, 22, 38],
[6, 24, 42],
[6, 26, 46],
[6, 28, 50],
[6, 30, 54],
[6, 32, 58],
[6, 34, 62],
[6, 26, 46, 66],
[6, 26, 48, 70],
[6, 26, 50, 74],
[6, 30, 54, 78],
[6, 30, 56, 82],
[6, 30, 58, 86],
[6, 34, 62, 90],
[6, 28, 50, 72, 94],
[6, 26, 50, 74, 98],
[6, 30, 54, 78, 102],
[6, 28, 54, 80, 106],
[6, 32, 58, 84, 110],
[6, 30, 58, 86, 114],
[6, 34, 62, 90, 118],
[6, 26, 50, 74, 98, 122],
[6, 30, 54, 78, 102, 126],
[6, 26, 52, 78, 104, 130],
[6, 30, 56, 82, 108, 134],
[6, 34, 60, 86, 112, 138],
[6, 30, 58, 86, 114, 142],
[6, 34, 62, 90, 118, 146],
[6, 30, 54, 78, 102, 126, 150],
[6, 24, 50, 76, 102, 128, 154],
[6, 28, 54, 80, 106, 132, 158],
[6, 32, 58, 84, 110, 136, 162],
[6, 26, 54, 82, 110, 138, 166],
[6, 30, 58, 86, 114, 142, 170]
],
G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
getBCHTypeInfo: function (data) {
var d = data << 10;
while (QRCode.Util.getBCHDigit(d) - QRCode.Util.getBCHDigit(QRCode.Util.G15) >= 0) {
d ^= (QRCode.Util.G15 << (QRCode.Util.getBCHDigit(d) - QRCode.Util.getBCHDigit(QRCode.Util.G15)));
}
return ((data << 10) | d) ^ QRCode.Util.G15_MASK;
},
getBCHTypeNumber: function (data) {
var d = data << 12;
while (QRCode.Util.getBCHDigit(d) - QRCode.Util.getBCHDigit(QRCode.Util.G18) >= 0) {
d ^= (QRCode.Util.G18 << (QRCode.Util.getBCHDigit(d) - QRCode.Util.getBCHDigit(QRCode.Util.G18)));
}
return (data << 12) | d;
},
getBCHDigit: function (data) {
var digit = 0;
while (data != 0) {
digit++;
data >>>= 1;
}
return digit;
},
getPatternPosition: function (typeNumber) {
return QRCode.Util.PATTERN_POSITION_TABLE[typeNumber - 1];
},
getMask: function (maskPattern, i, j) {
switch (maskPattern) {
case QRCode.MaskPattern.PATTERN000: return (i + j) % 2 == 0;
case QRCode.MaskPattern.PATTERN001: return i % 2 == 0;
case QRCode.MaskPattern.PATTERN010: return j % 3 == 0;
case QRCode.MaskPattern.PATTERN011: return (i + j) % 3 == 0;
case QRCode.MaskPattern.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
case QRCode.MaskPattern.PATTERN101: return (i * j) % 2 + (i * j) % 3 == 0;
case QRCode.MaskPattern.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
case QRCode.MaskPattern.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
default:
throw new Error("bad maskPattern:" + maskPattern);
}
},
getErrorCorrectPolynomial: function (errorCorrectLength) {
var a = new QRCode.Polynomial([1], 0);
for (var i = 0; i < errorCorrectLength; i++) {
a = a.multiply(new QRCode.Polynomial([1, QRCode.Math.gexp(i)], 0));
}
return a;
},
getLengthInBits: function (mode, type) {
if (1 <= type && type < 10) {
// 1 - 9
switch (mode) {
case QRCode.Mode.MODE_NUMBER: return 10;
case QRCode.Mode.MODE_ALPHA_NUM: return 9;
case QRCode.Mode.MODE_8BIT_BYTE: return 8;
case QRCode.Mode.MODE_KANJI: return 8;
default:
throw new Error("mode:" + mode);
}
} else if (type < 27) {
// 10 - 26
switch (mode) {
case QRCode.Mode.MODE_NUMBER: return 12;
case QRCode.Mode.MODE_ALPHA_NUM: return 11;
case QRCode.Mode.MODE_8BIT_BYTE: return 16;
case QRCode.Mode.MODE_KANJI: return 10;
default:
throw new Error("mode:" + mode);
}
} else if (type < 41) {
// 27 - 40
switch (mode) {
case QRCode.Mode.MODE_NUMBER: return 14;
case QRCode.Mode.MODE_ALPHA_NUM: return 13;
case QRCode.Mode.MODE_8BIT_BYTE: return 16;
case QRCode.Mode.MODE_KANJI: return 12;
default:
throw new Error("mode:" + mode);
}
} else {
throw new Error("type:" + type);
}
},
getLostPoint: function (qrCode) {
var moduleCount = qrCode.getModuleCount();
var lostPoint = 0;
// LEVEL1
for (var row = 0; row < moduleCount; row++) {
for (var col = 0; col < moduleCount; col++) {
var sameCount = 0;
var dark = qrCode.isDark(row, col);
for (var r = -1; r <= 1; r++) {
if (row + r < 0 || moduleCount <= row + r) {
continue;
}
for (var c = -1; c <= 1; c++) {
if (col + c < 0 || moduleCount <= col + c) {
continue;
}
if (r == 0 && c == 0) {
continue;
}
if (dark == qrCode.isDark(row + r, col + c)) {
sameCount++;
}
}
}
if (sameCount > 5) {
lostPoint += (3 + sameCount - 5);
}
}
}
// LEVEL2
for (var row = 0; row < moduleCount - 1; row++) {
for (var col = 0; col < moduleCount - 1; col++) {
var count = 0;
if (qrCode.isDark(row, col)) count++;
if (qrCode.isDark(row + 1, col)) count++;
if (qrCode.isDark(row, col + 1)) count++;
if (qrCode.isDark(row + 1, col + 1)) count++;
if (count == 0 || count == 4) {
lostPoint += 3;
}
}
}
// LEVEL3
for (var row = 0; row < moduleCount; row++) {
for (var col = 0; col < moduleCount - 6; col++) {
if (qrCode.isDark(row, col)
&& !qrCode.isDark(row, col + 1)
&& qrCode.isDark(row, col + 2)
&& qrCode.isDark(row, col + 3)
&& qrCode.isDark(row, col + 4)
&& !qrCode.isDark(row, col + 5)
&& qrCode.isDark(row, col + 6)) {
lostPoint += 40;
}
}
}
for (var col = 0; col < moduleCount; col++) {
for (var row = 0; row < moduleCount - 6; row++) {
if (qrCode.isDark(row, col)
&& !qrCode.isDark(row + 1, col)
&& qrCode.isDark(row + 2, col)
&& qrCode.isDark(row + 3, col)
&& qrCode.isDark(row + 4, col)
&& !qrCode.isDark(row + 5, col)
&& qrCode.isDark(row + 6, col)) {
lostPoint += 40;
}
}
}
// LEVEL4
var darkCount = 0;
for (var col = 0; col < moduleCount; col++) {
for (var row = 0; row < moduleCount; row++) {
if (qrCode.isDark(row, col)) {
darkCount++;
}
}
}
var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
lostPoint += ratio * 10;
return lostPoint;
}
};
//---------------------------------------------------------------------
// QRMath
//---------------------------------------------------------------------
QRCode.Math = {
glog: function (n) {
if (n < 1) {
throw new Error("glog(" + n + ")");
}
return QRCode.Math.LOG_TABLE[n];
},
gexp: function (n) {
while (n < 0) {
n += 255;
}
while (n >= 256) {
n -= 255;
}
return QRCode.Math.EXP_TABLE[n];
},
EXP_TABLE: new Array(256),
LOG_TABLE: new Array(256)
};
for (var i = 0; i < 8; i++) {
QRCode.Math.EXP_TABLE[i] = 1 << i;
}
for (var i = 8; i < 256; i++) {
QRCode.Math.EXP_TABLE[i] = QRCode.Math.EXP_TABLE[i - 4]
^ QRCode.Math.EXP_TABLE[i - 5]
^ QRCode.Math.EXP_TABLE[i - 6]
^ QRCode.Math.EXP_TABLE[i - 8];
}
for (var i = 0; i < 255; i++) {
QRCode.Math.LOG_TABLE[QRCode.Math.EXP_TABLE[i]] = i;
}
//---------------------------------------------------------------------
// QRPolynomial
//---------------------------------------------------------------------
QRCode.Polynomial = function (num, shift) {
if (num.length == undefined) {
throw new Error(num.length + "/" + shift);
}
var offset = 0;
while (offset < num.length && num[offset] == 0) {
offset++;
}
this.num = new Array(num.length - offset + shift);
for (var i = 0; i < num.length - offset; i++) {
this.num[i] = num[i + offset];
}
}
QRCode.Polynomial.prototype = {
get: function (index) {
return this.num[index];
},
getLength: function () {
return this.num.length;
},
multiply: function (e) {
var num = new Array(this.getLength() + e.getLength() - 1);
for (var i = 0; i < this.getLength(); i++) {
for (var j = 0; j < e.getLength(); j++) {
num[i + j] ^= QRCode.Math.gexp(QRCode.Math.glog(this.get(i)) + QRCode.Math.glog(e.get(j)));
}
}
return new QRCode.Polynomial(num, 0);
},
mod: function (e) {
if (this.getLength() - e.getLength() < 0) {
return this;
}
var ratio = QRCode.Math.glog(this.get(0)) - QRCode.Math.glog(e.get(0));
var num = new Array(this.getLength());
for (var i = 0; i < this.getLength(); i++) {
num[i] = this.get(i);
}
for (var i = 0; i < e.getLength(); i++) {
num[i] ^= QRCode.Math.gexp(QRCode.Math.glog(e.get(i)) + ratio);
}
// recursive call
return new QRCode.Polynomial(num, 0).mod(e);
}
};
//---------------------------------------------------------------------
// QRRSBlock
//---------------------------------------------------------------------
QRCode.RSBlock = function (totalCount, dataCount) {
this.totalCount = totalCount;
this.dataCount = dataCount;
}
QRCode.RSBlock.RS_BLOCK_TABLE = [
// L
// M
// Q
// H
// 1
[1, 26, 19],
[1, 26, 16],
[1, 26, 13],
[1, 26, 9],
// 2
[1, 44, 34],
[1, 44, 28],
[1, 44, 22],
[1, 44, 16],
// 3
[1, 70, 55],
[1, 70, 44],
[2, 35, 17],
[2, 35, 13],
// 4
[1, 100, 80],
[2, 50, 32],
[2, 50, 24],
[4, 25, 9],
// 5
[1, 134, 108],
[2, 67, 43],
[2, 33, 15, 2, 34, 16],
[2, 33, 11, 2, 34, 12],
// 6
[2, 86, 68],
[4, 43, 27],
[4, 43, 19],
[4, 43, 15],
// 7
[2, 98, 78],
[4, 49, 31],
[2, 32, 14, 4, 33, 15],
[4, 39, 13, 1, 40, 14],
// 8
[2, 121, 97],
[2, 60, 38, 2, 61, 39],
[4, 40, 18, 2, 41, 19],
[4, 40, 14, 2, 41, 15],
// 9
[2, 146, 116],
[3, 58, 36, 2, 59, 37],
[4, 36, 16, 4, 37, 17],
[4, 36, 12, 4, 37, 13],
// 10
[2, 86, 68, 2, 87, 69],
[4, 69, 43, 1, 70, 44],
[6, 43, 19, 2, 44, 20],
[6, 43, 15, 2, 44, 16]
];
QRCode.RSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) {
var rsBlock = QRCode.RSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
if (rsBlock == undefined) {
throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
}
var length = rsBlock.length / 3;
var list = new Array();
for (var i = 0; i < length; i++) {
var count = rsBlock[i * 3 + 0];
var totalCount = rsBlock[i * 3 + 1];
var dataCount = rsBlock[i * 3 + 2];
for (var j = 0; j < count; j++) {
list.push(new QRCode.RSBlock(totalCount, dataCount));
}
}
return list;
};
QRCode.RSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) {
switch (errorCorrectLevel) {
case QRCode.ErrorCorrectLevel.L:
return QRCode.RSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
case QRCode.ErrorCorrectLevel.M:
return QRCode.RSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
case QRCode.ErrorCorrectLevel.Q:
return QRCode.RSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
case QRCode.ErrorCorrectLevel.H:
return QRCode.RSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
default:
return undefined;
}
};
//---------------------------------------------------------------------
// QRBitBuffer
//---------------------------------------------------------------------
QRCode.BitBuffer = function () {
this.buffer = new Array();
this.length = 0;
}
QRCode.BitBuffer.prototype = {
get: function (index) {
var bufIndex = Math.floor(index / 8);
return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1;
},
put: function (num, length) {
for (var i = 0; i < length; i++) {
this.putBit(((num >>> (length - i - 1)) & 1) == 1);
}
},
getLengthInBits: function () {
return this.length;
},
putBit: function (bit) {
var bufIndex = Math.floor(this.length / 8);
if (this.buffer.length <= bufIndex) {
this.buffer.push(0);
}
if (bit) {
this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
}
this.length++;
}
};
})();
</script>
<script type="text/javascript">
/*
Copyright (c) 2011 Stefan Thomas
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/1a7fc9d063f864058809d06ef4542af40be3558f/src/bitcoin.js
(function (exports) {
var Bitcoin = exports;
})(
'object' === typeof module ? module.exports : (window.Bitcoin = {})
);
</script>
<script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/c952aaeb3ee472e3776655b8ea07299ebed702c7/src/base58.js
(function (Bitcoin) {
Bitcoin.Base58 = {
alphabet: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",
validRegex: /^[1-9A-HJ-NP-Za-km-z]+$/,
base: BigInteger.valueOf(58),
/**
* Convert a byte array to a base58-encoded string.
*
* Written by Mike Hearn for BitcoinJ.
* Copyright (c) 2011 Google Inc.
*
* Ported to JavaScript by Stefan Thomas.
*/
encode: function (input) {
var bi = BigInteger.fromByteArrayUnsigned(input);
var chars = [];
while (bi.compareTo(B58.base) >= 0) {
var mod = bi.mod(B58.base);
chars.unshift(B58.alphabet[mod.intValue()]);
bi = bi.subtract(mod).divide(B58.base);
}
chars.unshift(B58.alphabet[bi.intValue()]);
// Convert leading zeros too.
for (var i = 0; i < input.length; i++) {
if (input[i] == 0x00) {
chars.unshift(B58.alphabet[0]);
} else break;
}
return chars.join('');
},
/**
* Convert a base58-encoded string to a byte array.
*
* Written by Mike Hearn for BitcoinJ.
* Copyright (c) 2011 Google Inc.
*
* Ported to JavaScript by Stefan Thomas.
*/
decode: function (input) {
var bi = BigInteger.valueOf(0);
var leadingZerosNum = 0;
for (var i = input.length - 1; i >= 0; i--) {
var alphaIndex = B58.alphabet.indexOf(input[i]);
if (alphaIndex < 0) {
throw "Invalid character";
}
bi = bi.add(BigInteger.valueOf(alphaIndex)
.multiply(B58.base.pow(input.length - 1 - i)));
// This counts leading zero bytes
if (input[i] == "1") leadingZerosNum++;
else leadingZerosNum = 0;
}
var bytes = bi.toByteArrayUnsigned();
// Add leading zeros
while (leadingZerosNum-- > 0) bytes.unshift(0);
return bytes;
}
};
var B58 = Bitcoin.Base58;
})(
'undefined' != typeof Bitcoin ? Bitcoin : module.exports
);
</script>
<script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/address.js
Bitcoin.Address = function (bytes) {
this.hash = bytes;
this.version = Bitcoin.Address.networkVersion;
};
Bitcoin.Address.networkVersion = 0x3F; // mainnet
/**
* Serialize this object as a standard Bitcoin address.
*
* Returns the address as a base58-encoded string in the standardized format.
*/
Bitcoin.Address.prototype.toString = function () {
// Get a copy of the hash
var hash = (this.hash).toString().toLowerCase();
return create_address(hash);
};
Bitcoin.Address.prototype.getHashBase64 = function () {
return Crypto.util.bytesToBase64(this.hash);
};
/**
* Parse a Bitcoin address contained in a string.
*/
Bitcoin.Address.decodeString = function (string) {
var bytes = Bitcoin.Base58.decode(string);
var hash = bytes.slice(0, 21);
var checksum = Crypto.SHA256(Crypto.SHA256(hash, { asBytes: true }), { asBytes: true });
if (checksum[0] != bytes[21] ||
checksum[1] != bytes[22] ||
checksum[2] != bytes[23] ||
checksum[3] != bytes[24]) {
throw "Checksum validation failed!";
}
var version = hash.shift();
if (version != 0) {
throw "Version " + version + " not supported!";
}
return hash;
};
</script>
<script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/e90780d3d3b8fc0d027d2bcb38b80479902f223e/src/ecdsa.js
Bitcoin.ECDSA = (function () {
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
var rng = new SecureRandom();
var P_OVER_FOUR = null;
function implShamirsTrick(P, k, Q, l) {
var m = Math.max(k.bitLength(), l.bitLength());
var Z = P.add2D(Q);
var R = P.curve.getInfinity();
for (var i = m - 1; i >= 0; --i) {
R = R.twice2D();
R.z = BigInteger.ONE;
if (k.testBit(i)) {
if (l.testBit(i)) {
R = R.add2D(Z);
} else {
R = R.add2D(P);
}
} else {
if (l.testBit(i)) {
R = R.add2D(Q);
}
}
}
return R;
};
var ECDSA = {
getBigRandom: function (limit) {
return new BigInteger(limit.bitLength(), rng)
.mod(limit.subtract(BigInteger.ONE))
.add(BigInteger.ONE);
},
sign: function (hash, priv) {
var d = priv;
var n = ecparams.getN();
var e = BigInteger.fromByteArrayUnsigned(hash);
do {
var k = ECDSA.getBigRandom(n);
var G = ecparams.getG();
var Q = G.multiply(k);
var r = Q.getX().toBigInteger().mod(n);
} while (r.compareTo(BigInteger.ZERO) <= 0);
var s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n);
return ECDSA.serializeSig(r, s);
},
verify: function (hash, sig, pubkey) {
var r, s;
if (Bitcoin.Util.isArray(sig)) {
var obj = ECDSA.parseSig(sig);
r = obj.r;
s = obj.s;
} else if ("object" === typeof sig && sig.r && sig.s) {
r = sig.r;
s = sig.s;
} else {
throw "Invalid value for signature";
}
var Q;
if (pubkey instanceof ec.PointFp) {
Q = pubkey;
} else if (Bitcoin.Util.isArray(pubkey)) {
Q = EllipticCurve.PointFp.decodeFrom(ecparams.getCurve(), pubkey);
} else {
throw "Invalid format for pubkey value, must be byte array or ec.PointFp";
}
var e = BigInteger.fromByteArrayUnsigned(hash);
return ECDSA.verifyRaw(e, r, s, Q);
},
verifyRaw: function (e, r, s, Q) {
var n = ecparams.getN();
var G = ecparams.getG();
if (r.compareTo(BigInteger.ONE) < 0 ||
r.compareTo(n) >= 0)
return false;
if (s.compareTo(BigInteger.ONE) < 0 ||
s.compareTo(n) >= 0)
return false;
var c = s.modInverse(n);
var u1 = e.multiply(c).mod(n);
var u2 = r.multiply(c).mod(n);
// TODO(!!!): For some reason Shamir's trick isn't working with
// signed message verification!? Probably an implementation
// error!
//var point = implShamirsTrick(G, u1, Q, u2);
var point = G.multiply(u1).add(Q.multiply(u2));
var v = point.getX().toBigInteger().mod(n);
return v.equals(r);
},
/**
* Serialize a signature into DER format.
*
* Takes two BigIntegers representing r and s and returns a byte array.
*/
serializeSig: function (r, s) {
var rBa = r.toByteArraySigned();
var sBa = s.toByteArraySigned();
var sequence = [];
sequence.push(0x02); // INTEGER
sequence.push(rBa.length);
sequence = sequence.concat(rBa);
sequence.push(0x02); // INTEGER
sequence.push(sBa.length);
sequence = sequence.concat(sBa);
sequence.unshift(sequence.length);
sequence.unshift(0x30); // SEQUENCE
return sequence;
},
/**
* Parses a byte array containing a DER-encoded signature.
*
* This function will return an object of the form:
*
* {
* r: BigInteger,
* s: BigInteger
* }
*/
parseSig: function (sig) {
var cursor;
if (sig[0] != 0x30)
throw new Error("Signature not a valid DERSequence");
cursor = 2;
if (sig[cursor] != 0x02)
throw new Error("First element in signature must be a DERInteger"); ;
var rBa = sig.slice(cursor + 2, cursor + 2 + sig[cursor + 1]);
cursor += 2 + sig[cursor + 1];
if (sig[cursor] != 0x02)
throw new Error("Second element in signature must be a DERInteger");
var sBa = sig.slice(cursor + 2, cursor + 2 + sig[cursor + 1]);
cursor += 2 + sig[cursor + 1];
//if (cursor != sig.length)
// throw new Error("Extra bytes in signature");
var r = BigInteger.fromByteArrayUnsigned(rBa);
var s = BigInteger.fromByteArrayUnsigned(sBa);
return { r: r, s: s };
},
parseSigCompact: function (sig) {
if (sig.length !== 65) {
throw "Signature has the wrong length";
}
// Signature is prefixed with a type byte storing three bits of
// information.
var i = sig[0] - 27;
if (i < 0 || i > 7) {
throw "Invalid signature type";
}
var n = ecparams.getN();
var r = BigInteger.fromByteArrayUnsigned(sig.slice(1, 33)).mod(n);
var s = BigInteger.fromByteArrayUnsigned(sig.slice(33, 65)).mod(n);
return { r: r, s: s, i: i };
},
/**
* Recover a public key from a signature.
*
* See SEC 1: Elliptic Curve Cryptography, section 4.1.6, "Public
* Key Recovery Operation".
*
* http://www.secg.org/download/aid-780/sec1-v2.pdf
*/
recoverPubKey: function (r, s, hash, i) {
// The recovery parameter i has two bits.
i = i & 3;
// The less significant bit specifies whether the y coordinate
// of the compressed point is even or not.
var isYEven = i & 1;
// The more significant bit specifies whether we should use the
// first or second candidate key.
var isSecondKey = i >> 1;
var n = ecparams.getN();
var G = ecparams.getG();
var curve = ecparams.getCurve();
var p = curve.getQ();
var a = curve.getA().toBigInteger();
var b = curve.getB().toBigInteger();
// We precalculate (p + 1) / 4 where p is if the field order
if (!P_OVER_FOUR) {
P_OVER_FOUR = p.add(BigInteger.ONE).divide(BigInteger.valueOf(4));
}
// 1.1 Compute x
var x = isSecondKey ? r.add(n) : r;
// 1.3 Convert x to point
var alpha = x.multiply(x).multiply(x).add(a.multiply(x)).add(b).mod(p);
var beta = alpha.modPow(P_OVER_FOUR, p);
var xorOdd = beta.isEven() ? (i % 2) : ((i + 1) % 2);
// If beta is even, but y isn't or vice versa, then convert it,
// otherwise we're done and y == beta.
var y = (beta.isEven() ? !isYEven : isYEven) ? beta : p.subtract(beta);
// 1.4 Check that nR is at infinity
var R = new EllipticCurve.PointFp(curve,
curve.fromBigInteger(x),
curve.fromBigInteger(y));
R.validate();
// 1.5 Compute e from M
var e = BigInteger.fromByteArrayUnsigned(hash);
var eNeg = BigInteger.ZERO.subtract(e).mod(n);
// 1.6 Compute Q = r^-1 (sR - eG)
var rInv = r.modInverse(n);
var Q = implShamirsTrick(R, s, G, eNeg).multiply(rInv);
Q.validate();
if (!ECDSA.verifyRaw(e, r, s, Q)) {
throw "Pubkey recovery unsuccessful";
}
var pubKey = new Bitcoin.ECKey();
pubKey.pub = Q;
return pubKey;
},
/**
* Calculate pubkey extraction parameter.
*
* When extracting a pubkey from a signature, we have to
* distinguish four different cases. Rather than putting this
* burden on the verifier, Bitcoin includes a 2-bit value with the
* signature.
*
* This function simply tries all four cases and returns the value
* that resulted in a successful pubkey recovery.
*/
calcPubkeyRecoveryParam: function (address, r, s, hash) {
for (var i = 0; i < 4; i++) {
try {
var pubkey = Bitcoin.ECDSA.recoverPubKey(r, s, hash, i);
if (pubkey.getBitcoinAddress().toString() == address) {
return i;
}
} catch (e) { }
}
throw "Unable to find valid recovery factor";
}
};
return ECDSA;
})();
</script>
<script type="text/javascript">
Bitcoin.KeyPool = (function () {
var KeyPool = function () {
this.keyArray = [];
this.push = function (item) {
if (item == null || item.priv == null) return;
var doAdd = true;
// prevent duplicates from being added to the array
for (var index in this.keyArray) {
var currentItem = this.keyArray[index];
if (currentItem != null && currentItem.priv != null && item.getBitcoinAddress() == currentItem.getBitcoinAddress()) {
doAdd = false;
break;
}
}
if (doAdd) this.keyArray.push(item);
};
this.reset = function () {
this.keyArray = [];
};
this.getArray = function () {
// copy array
return this.keyArray.slice(0);
};
this.setArray = function (ka) {
this.keyArray = ka;
};
this.length = function () {
return this.keyArray.length;
};
this.toString = function () {
var keyPoolString = "# = " + this.length() + "\n";
var pool = this.getArray();
for (var index in pool) {
var item = pool[index];
if (Bitcoin.Util.hasMethods(item, 'getBitcoinAddress', 'toString')) {
if (item != null) {
keyPoolString += "\"" + item.getBitcoinAddress() + "\"" + ", \"" + item.toString("wif") + "\"\n";
}
}
}
return keyPoolString;
};
return this;
};
return new KeyPool();
})();
Bitcoin.Bip38Key = (function () {
var Bip38 = function (address, encryptedKey) {
this.address = address;
this.priv = encryptedKey;
};
Bip38.prototype.getBitcoinAddress = function () {
return this.address;
};
Bip38.prototype.toString = function () {
return this.priv;
};
return Bip38;
})();
//https://raw.github.com/pointbiz/bitcoinjs-lib/9b2f94a028a7bc9bed94e0722563e9ff1d8e8db8/src/eckey.js
Bitcoin.ECKey = (function () {
var ECDSA = Bitcoin.ECDSA;
var KeyPool = Bitcoin.KeyPool;
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
var ECKey = function (input) {
if (!input) {
// Generate new key
var n = ecparams.getN();
this.priv = ECDSA.getBigRandom(n);
} else if (input instanceof BigInteger) {
// Input is a private key value
this.priv = input;
} else if (Bitcoin.Util.isArray(input)) {
// Prepend zero byte to prevent interpretation as negative integer
this.priv = BigInteger.fromByteArrayUnsigned(input);
} else if ("string" == typeof input) {
var bytes = null;
try{
if (ECKey.isWalletImportFormat(input)) {
bytes = ECKey.decodeWalletImportFormat(input);
} else if (ECKey.isCompressedWalletImportFormat(input)) {
bytes = ECKey.decodeCompressedWalletImportFormat(input);
this.compressed = true;
} else if (ECKey.isMiniFormat(input)) {
bytes = Crypto.SHA256(input, { asBytes: true });
} else if (ECKey.isHexFormat(input)) {
bytes = Crypto.util.hexToBytes(input);
} else if (ECKey.isBase64Format(input)) {
bytes = Crypto.util.base64ToBytes(input);
}
} catch (exc1) {
this.setError(exc1);
}
if (ECKey.isBase6Format(input)) {
this.priv = new BigInteger(input, 6);
} else if (bytes == null || bytes.length != 32) {
this.priv = null;
} else {
// Prepend zero byte to prevent interpretation as negative integer
this.priv = BigInteger.fromByteArrayUnsigned(bytes);
}
}
this.compressed = (this.compressed == undefined) ? !!ECKey.compressByDefault : this.compressed;
try {
// check not zero
if (this.priv != null && BigInteger.ZERO.compareTo(this.priv) == 0) this.setError("Error: BigInteger equal to zero.");
// valid range [0x1, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140])
var hexKeyRangeLimit = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140";
var rangeLimitBytes = Crypto.util.hexToBytes(hexKeyRangeLimit);
var limitBigInt = BigInteger.fromByteArrayUnsigned(rangeLimitBytes);
if (this.priv != null && limitBigInt.compareTo(this.priv) < 0) this.setError("Error: BigInteger outside of curve range.")
if (this.priv != null) {
KeyPool.push(this);
}
} catch (exc2) {
this.setError(exc2);
}
};
ECKey.privateKeyPrefix = 0xBF; // mainnet 0x80 testnet 0xEF
/**
* Whether public keys should be returned compressed by default.
*/
ECKey.compressByDefault = false;
/**
* Set whether the public key should be returned compressed or not.
*/
ECKey.prototype.setError = function (err) {
this.error = err;
this.priv = null;
return this;
};
/**
* Set whether the public key should be returned compressed or not.
*/
ECKey.prototype.setCompressed = function (v) {
this.compressed = !!v;
if (this.pubPoint) this.pubPoint.compressed = this.compressed;
return this;
};
/*
* Return public key as a byte array in DER encoding
*/
ECKey.prototype.getPub = function () {
if (this.compressed) {
if (this.pubComp) return this.pubComp;
return this.pubComp = this.getPubPoint().getEncoded(1);
} else {
if (this.pubUncomp) return this.pubUncomp;
return this.pubUncomp = this.getPubPoint().getEncoded(0);
}
};
/**
* Return public point as ECPoint object.
*/
ECKey.prototype.getPubPoint = function () {
if (!this.pubPoint) {
this.pubPoint = ecparams.getG().multiply(this.priv);
this.pubPoint.compressed = this.compressed;
}
return this.pubPoint;
};
ECKey.prototype.getPubKeyHex = function () {
if (this.compressed) {
if (this.pubKeyHexComp) return this.pubKeyHexComp;
return this.pubKeyHexComp = Crypto.util.bytesToHex(this.getPub()).toString().toUpperCase();
} else {
if (this.pubKeyHexUncomp) return this.pubKeyHexUncomp;
return this.pubKeyHexUncomp = Crypto.util.bytesToHex(this.getPub()).toString().toUpperCase();
}
};
/**
* Get the pubKeyHash for this key.
*
* This is calculated as RIPE160(SHA256([encoded pubkey])) and returned as
* a byte array.
*/
ECKey.prototype.getPubKeyHash = function () {
if (this.compressed) {
if (this.pubKeyHashComp) return this.pubKeyHashComp;
return this.pubKeyHashComp = Bitcoin.Util.sha256ripe160(this.getPub());
} else {
if (this.pubKeyHashUncomp) return this.pubKeyHashUncomp;
return this.pubKeyHashUncomp = Bitcoin.Util.sha256ripe160(this.getPub());
}
};
ECKey.prototype.getBitcoinAddress = function () {
var hash = this.getPubKeyHex();
var addr = new Bitcoin.Address(hash);
return addr.toString();
};
/*
* Takes a public point as a hex string or byte array
*/
ECKey.prototype.setPub = function (pub) {
// byte array
if (Bitcoin.Util.isArray(pub)) {
pub = Crypto.util.bytesToHex(pub).toString().toUpperCase();
}
var ecPoint = ecparams.getCurve().decodePointHex(pub);
this.setCompressed(ecPoint.compressed);
this.pubPoint = ecPoint;
return this;
};
// Sipa Private Key Wallet Import Format
ECKey.prototype.getBitcoinWalletImportFormat = function () {
var bytes = this.getBitcoinHexFormat().toLowerCase();
return prvKey_to_WIF(bytes, this.compressed);
};
// Private Key Hex Format
ECKey.prototype.getBitcoinHexFormat = function () {
return Crypto.util.bytesToHex(this.getBitcoinPrivateKeyByteArray()).toString().toUpperCase();
};
// Private Key Base64 Format
ECKey.prototype.getBitcoinBase64Format = function () {
return Crypto.util.bytesToBase64(this.getBitcoinPrivateKeyByteArray());
};
ECKey.prototype.getBitcoinPrivateKeyByteArray = function () {
if (this.priv == null) return null;
// Get a copy of private key as a byte array
var bytes = this.priv.toByteArrayUnsigned();
// zero pad if private key is less than 32 bytes
while (bytes.length < 32) bytes.unshift(0x00);
return bytes;
};
ECKey.prototype.toString = function (format) {
format = format || "";
if (format.toString().toLowerCase() == "base64" || format.toString().toLowerCase() == "b64") {
return this.getBitcoinBase64Format();
}
// Wallet Import Format
else if (format.toString().toLowerCase() == "wif") {
return this.getBitcoinWalletImportFormat();
}
else {
return this.getBitcoinHexFormat();
}
};
ECKey.prototype.sign = function (hash) {
return ECDSA.sign(hash, this.priv);
};
ECKey.prototype.verify = function (hash, sig) {
return ECDSA.verify(hash, sig, this.getPub());
};
/**
* Parse a wallet import format private key contained in a string.
*/
ECKey.decodeWalletImportFormat = function (privStr) {
var bytes = Bitcoin.Base58.decode(privStr);
var hash = bytes.slice(0, 33);
var checksum = Crypto.SHA256(Crypto.SHA256(hash, { asBytes: true }), { asBytes: true });
if (checksum[0] != bytes[33] ||
checksum[1] != bytes[34] ||
checksum[2] != bytes[35] ||
checksum[3] != bytes[36]) {
throw "Checksum validation failed!";
}
var version = hash.shift();
if (version != ECKey.privateKeyPrefix) {
throw "Version " + version + " not supported!";
}
return hash;
};
/**
* Parse a compressed wallet import format private key contained in a string.
*/
ECKey.decodeCompressedWalletImportFormat = function (privStr) {
var bytes = Bitcoin.Base58.decode(privStr);
var hash = bytes.slice(0, 34);
var checksum = Crypto.SHA256(Crypto.SHA256(hash, { asBytes: true }), { asBytes: true });
if (checksum[0] != bytes[34] ||
checksum[1] != bytes[35] ||
checksum[2] != bytes[36] ||
checksum[3] != bytes[37]) {
throw "Checksum validation failed!";
}
var version = hash.shift();
if (version != ECKey.privateKeyPrefix) {
throw "Version " + version + " not supported!";
}
hash.pop();
return hash;
};
// 64 characters [0-9A-F]
ECKey.isHexFormat = function (key) {
key = key.toString();
return /^[A-Fa-f0-9]{64}$/.test(key);
};
// 51 characters base58, always starts with a '5'
ECKey.isWalletImportFormat = function (key) {
key = key.toString();
return (ECKey.privateKeyPrefix == 0xBF) ?
(/^7[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{50}$/.test(key)) :
(/^6[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{50}$/.test(key));
};
// 52 characters base58
ECKey.isCompressedWalletImportFormat = function (key) {
key = key.toString();
return (ECKey.privateKeyPrefix == 0xBF) ?
(/^V[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(key)) :
(/^T[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{51}$/.test(key));
};
// 44 characters
ECKey.isBase64Format = function (key) {
key = key.toString();
return (/^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789=+\/]{44}$/.test(key));
};
// 99 characters, 1=1, if using dice convert 6 to 0
ECKey.isBase6Format = function (key) {
key = key.toString();
return (/^[012345]{99}$/.test(key));
};
// 22, 26 or 30 characters, always starts with an 'S'
ECKey.isMiniFormat = function (key) {
key = key.toString();
var validChars22 = /^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{21}$/.test(key);
var validChars26 = /^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{25}$/.test(key);
var validChars30 = /^S[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{29}$/.test(key);
var testBytes = Crypto.SHA256(key + "?", { asBytes: true });
return ((testBytes[0] === 0x00 || testBytes[0] === 0x01) && (validChars22 || validChars26 || validChars30));
};
return ECKey;
})();
</script>
<script type="text/javascript">
//https://raw.github.com/bitcoinjs/bitcoinjs-lib/09e8c6e184d6501a0c2c59d73ca64db5c0d3eb95/src/util.js
// Bitcoin utility functions
Bitcoin.Util = {
/**
* Cross-browser compatibility version of Array.isArray.
*/
isArray: Array.isArray || function (o) {
return Object.prototype.toString.call(o) === '[object Array]';
},
/**
* Create an array of a certain length filled with a specific value.
*/
makeFilledArray: function (len, val) {
var array = [];
var i = 0;
while (i < len) {
array[i++] = val;
}
return array;
},
/**
* Turn an integer into a "var_int".
*
* "var_int" is a variable length integer used by Bitcoin's binary format.
*
* Returns a byte array.
*/
numToVarInt: function (i) {
if (i < 0xfd) {
// unsigned char
return [i];
} else if (i <= 1 << 16) {
// unsigned short (LE)
return [0xfd, i >>> 8, i & 255];
} else if (i <= 1 << 32) {
// unsigned int (LE)
return [0xfe].concat(Crypto.util.wordsToBytes([i]));
} else {
// unsigned long long (LE)
return [0xff].concat(Crypto.util.wordsToBytes([i >>> 32, i]));
}
},
/**
* Parse a Bitcoin value byte array, returning a BigInteger.
*/
valueToBigInt: function (valueBuffer) {
if (valueBuffer instanceof BigInteger) return valueBuffer;
// Prepend zero byte to prevent interpretation as negative integer
return BigInteger.fromByteArrayUnsigned(valueBuffer);
},
/**
* Format a Bitcoin value as a string.
*
* Takes a BigInteger or byte-array and returns that amount of Bitcoins in a
* nice standard formatting.
*
* Examples:
* 12.3555
* 0.1234
* 900.99998888
* 34.00
*/
formatValue: function (valueBuffer) {
var value = this.valueToBigInt(valueBuffer).toString();
var integerPart = value.length > 8 ? value.substr(0, value.length - 8) : '0';
var decimalPart = value.length > 8 ? value.substr(value.length - 8) : value;
while (decimalPart.length < 8) decimalPart = "0" + decimalPart;
decimalPart = decimalPart.replace(/0*$/, '');
while (decimalPart.length < 2) decimalPart += "0";
return integerPart + "." + decimalPart;
},
/**
* Parse a floating point string as a Bitcoin value.
*
* Keep in mind that parsing user input is messy. You should always display
* the parsed value back to the user to make sure we understood his input
* correctly.
*/
parseValue: function (valueString) {
// TODO: Detect other number formats (e.g. comma as decimal separator)
var valueComp = valueString.split('.');
var integralPart = valueComp[0];
var fractionalPart = valueComp[1] || "0";
while (fractionalPart.length < 8) fractionalPart += "0";
fractionalPart = fractionalPart.replace(/^0+/g, '');
var value = BigInteger.valueOf(parseInt(integralPart));
value = value.multiply(BigInteger.valueOf(100000000));
value = value.add(BigInteger.valueOf(parseInt(fractionalPart)));
return value;
},
/**
* Calculate RIPEMD160(SHA256(data)).
*
* Takes an arbitrary byte array as inputs and returns the hash as a byte
* array.
*/
sha256ripe160: function (data) {
return Crypto.RIPEMD160(Crypto.SHA256(data, { asBytes: true }), { asBytes: true });
},
// double sha256
dsha256: function (data) {
return Crypto.SHA256(Crypto.SHA256(data, { asBytes: true }), { asBytes: true });
},
// duck typing method
hasMethods: function(obj /*, method list as strings */){
var i = 1, methodName;
while((methodName = arguments[i++])){
if(typeof obj[methodName] != 'function') {
return false;
}
}
return true;
}
};
</script>
<script type="text/javascript">
/*
* Copyright (c) 2010-2011 Intalio Pte, All Rights Reserved
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
// https://github.com/cheongwy/node-scrypt-js
(function () {
var MAX_VALUE = 2147483647;
var workerUrl = null;
//function scrypt(byte[] passwd, byte[] salt, int N, int r, int p, int dkLen)
/*
* N = Cpu cost
* r = Memory cost
* p = parallelization cost
*
*/
window.Crypto_scrypt = function (passwd, salt, N, r, p, dkLen, callback) {
if (N == 0 || (N & (N - 1)) != 0) throw Error("N must be > 0 and a power of 2");
if (N > MAX_VALUE / 128 / r) throw Error("Parameter N is too large");
if (r > MAX_VALUE / 128 / p) throw Error("Parameter r is too large");
var PBKDF2_opts = { iterations: 1, hasher: Crypto.SHA256, asBytes: true };
var B = Crypto.PBKDF2(passwd, salt, p * 128 * r, PBKDF2_opts);
try {
var i = 0;
var worksDone = 0;
var makeWorker = function () {
if (!workerUrl) {
var code = '(' + scryptCore.toString() + ')()';
var blob;
try {
blob = new Blob([code], { type: "text/javascript" });
} catch (e) {
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
blob = new BlobBuilder();
blob.append(code);
blob = blob.getBlob("text/javascript");
}
workerUrl = URL.createObjectURL(blob);
}
var worker = new Worker(workerUrl);
worker.onmessage = function (event) {
var Bi = event.data[0], Bslice = event.data[1];
worksDone++;
if (i < p) {
worker.postMessage([N, r, p, B, i++]);
}
var length = Bslice.length, destPos = Bi * 128 * r, srcPos = 0;
while (length--) {
B[destPos++] = Bslice[srcPos++];
}
if (worksDone == p) {
callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts));
}
};
return worker;
};
var workers = [makeWorker(), makeWorker()];
workers[0].postMessage([N, r, p, B, i++]);
if (p > 1) {
workers[1].postMessage([N, r, p, B, i++]);
}
} catch (e) {
window.setTimeout(function () {
scryptCore();
callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts));
}, 0);
}
// using this function to enclose everything needed to create a worker (but also invokable directly for synchronous use)
function scryptCore() {
var XY = [], V = [];
if (typeof B === 'undefined') {
onmessage = function (event) {
var data = event.data;
var N = data[0], r = data[1], p = data[2], B = data[3], i = data[4];
var Bslice = [];
arraycopy32(B, i * 128 * r, Bslice, 0, 128 * r);
smix(Bslice, 0, r, N, V, XY);
postMessage([i, Bslice]);
};
} else {
for (var i = 0; i < p; i++) {
smix(B, i * 128 * r, r, N, V, XY);
}
}
function smix(B, Bi, r, N, V, XY) {
var Xi = 0;
var Yi = 128 * r;
var i;
arraycopy32(B, Bi, XY, Xi, Yi);
for (i = 0; i < N; i++) {
arraycopy32(XY, Xi, V, i * Yi, Yi);
blockmix_salsa8(XY, Xi, Yi, r);
}
for (i = 0; i < N; i++) {
var j = integerify(XY, Xi, r) & (N - 1);
blockxor(V, j * Yi, XY, Xi, Yi);
blockmix_salsa8(XY, Xi, Yi, r);
}
arraycopy32(XY, Xi, B, Bi, Yi);
}
function blockmix_salsa8(BY, Bi, Yi, r) {
var X = [];
var i;
arraycopy32(BY, Bi + (2 * r - 1) * 64, X, 0, 64);
for (i = 0; i < 2 * r; i++) {
blockxor(BY, i * 64, X, 0, 64);
salsa20_8(X);
arraycopy32(X, 0, BY, Yi + (i * 64), 64);
}
for (i = 0; i < r; i++) {
arraycopy32(BY, Yi + (i * 2) * 64, BY, Bi + (i * 64), 64);
}
for (i = 0; i < r; i++) {
arraycopy32(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64);
}
}
function R(a, b) {
return (a << b) | (a >>> (32 - b));
}
function salsa20_8(B) {
var B32 = new Array(32);
var x = new Array(32);
var i;
for (i = 0; i < 16; i++) {
B32[i] = (B[i * 4 + 0] & 0xff) << 0;
B32[i] |= (B[i * 4 + 1] & 0xff) << 8;
B32[i] |= (B[i * 4 + 2] & 0xff) << 16;
B32[i] |= (B[i * 4 + 3] & 0xff) << 24;
}
arraycopy(B32, 0, x, 0, 16);
for (i = 8; i > 0; i -= 2) {
x[4] ^= R(x[0] + x[12], 7); x[8] ^= R(x[4] + x[0], 9);
x[12] ^= R(x[8] + x[4], 13); x[0] ^= R(x[12] + x[8], 18);
x[9] ^= R(x[5] + x[1], 7); x[13] ^= R(x[9] + x[5], 9);
x[1] ^= R(x[13] + x[9], 13); x[5] ^= R(x[1] + x[13], 18);
x[14] ^= R(x[10] + x[6], 7); x[2] ^= R(x[14] + x[10], 9);
x[6] ^= R(x[2] + x[14], 13); x[10] ^= R(x[6] + x[2], 18);
x[3] ^= R(x[15] + x[11], 7); x[7] ^= R(x[3] + x[15], 9);
x[11] ^= R(x[7] + x[3], 13); x[15] ^= R(x[11] + x[7], 18);
x[1] ^= R(x[0] + x[3], 7); x[2] ^= R(x[1] + x[0], 9);
x[3] ^= R(x[2] + x[1], 13); x[0] ^= R(x[3] + x[2], 18);
x[6] ^= R(x[5] + x[4], 7); x[7] ^= R(x[6] + x[5], 9);
x[4] ^= R(x[7] + x[6], 13); x[5] ^= R(x[4] + x[7], 18);
x[11] ^= R(x[10] + x[9], 7); x[8] ^= R(x[11] + x[10], 9);
x[9] ^= R(x[8] + x[11], 13); x[10] ^= R(x[9] + x[8], 18);
x[12] ^= R(x[15] + x[14], 7); x[13] ^= R(x[12] + x[15], 9);
x[14] ^= R(x[13] + x[12], 13); x[15] ^= R(x[14] + x[13], 18);
}
for (i = 0; i < 16; ++i) B32[i] = x[i] + B32[i];
for (i = 0; i < 16; i++) {
var bi = i * 4;
B[bi + 0] = (B32[i] >> 0 & 0xff);
B[bi + 1] = (B32[i] >> 8 & 0xff);
B[bi + 2] = (B32[i] >> 16 & 0xff);
B[bi + 3] = (B32[i] >> 24 & 0xff);
}
}
function blockxor(S, Si, D, Di, len) {
var i = len >> 6;
while (i--) {
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
D[Di++] ^= S[Si++]; D[Di++] ^= S[Si++];
}
}
function integerify(B, bi, r) {
var n;
bi += (2 * r - 1) * 64;
n = (B[bi + 0] & 0xff) << 0;
n |= (B[bi + 1] & 0xff) << 8;
n |= (B[bi + 2] & 0xff) << 16;
n |= (B[bi + 3] & 0xff) << 24;
return n;
}
function arraycopy(src, srcPos, dest, destPos, length) {
while (length--) {
dest[destPos++] = src[srcPos++];
}
}
function arraycopy32(src, srcPos, dest, destPos, length) {
var i = length >> 5;
while (i--) {
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++]; dest[destPos++] = src[srcPos++];
}
}
} // scryptCore
}; // window.Crypto_scrypt
})();
</script>
<style type="text/css">
.more { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDIvMTLltnQyAAAB1UlEQVQ4jYWTS04bQRCGv3q0x8gMYJCwknCGLDgLVwiH4grhLFaUXdhkQ0A8pBg/FOLpnmbhMYzxRKlNS1Vdf/31V5XknGnb+eXJCBjzbzu9OLu+azu845Opysej4wHmshF4uJ2TUrb3CV0gIBAKRboC5C2vdkDE9fdty6/xDegvXz+NgDbFUejZ+PjDgExmtpxS9vYwMe5u5iyX8RRoa5Ic+C4qx9KUN1MGu4E618yqJ5axAp44KA7ZL3eYzp/HKdVIw7WK8d6BuDvcod9TQlBEIOXEdPlElSoUJabIIs4Z7h9yNDwgqOMayLXw7epHVIBggrsgspZPUBQyiCgugRQji7TAVDF1XB2TlQoOYCqovkmpopS9fcoiM3ue0rOCYf8IU8NklWxiiOQ3EPXtWagIqo6KYWYEc4IGvMViA6RrnCJKVS9B8ypRHG1YKNa0Ur+C+MPt/I2BKWVZUO4FgvQ47PcptEDF+T2Z8TiZUMWIyGtpd+Bze5VTSqP57O/4YG+AN/RXbSiPkwmL5z/be/L+mM4vT2JKeUW7EXD1erMz/Lo4u77f0K9DDhdA1XG11jh9vWBb99Z9gAg5QZ2hzpmUa0RSW4f/gqSY0s3Vz+tufEjvHS8Tg6BXC7qVbQAAAABJRU5ErkJggg==)
no-repeat left center; width: 17px; height: 17px; display: inline-block; float: right; cursor: pointer; }
.less { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDEvMDIvMTLltnQyAAABuklEQVQ4ja2US25TQRBFT336OSEY5ESyBfEakNiLt0AW5S2QvQQxAiZIYBwSz/yByH7dxcB2bPMME+hJS/W5fetWVUtE8K/HfzdcXfdfqsr4onuGuRz4Jrdzcg6Gg9HfQYAxAqmlSMMlQJO5/oliE4AtQLcR++btZQ+wPVsvVXbTfXFGEMyWU9rVM0yMu/Gc5bJ+DdztxWcH3otKVzbPmyq5LnwfzSgEBMxlhqJEBFWVKKUgG66rur53oH7aOeWkUlJSRCBHZracssorlLXttHpCpzonaYukjmsiivDu08daAZIJ7oLIVg9BUQgQUVwSua5Z5AWmiqnj6pisVXAAU0F1J6WK0q6e024Fs4cplbXonFxgapisk00MkdiBqDd7oSKoOiqGmZHMSZrwPRYHIMfaKaKsyhI01oni6IaFYptSyiOIT27nOwaq5FyQrUAIC/nBhK+UErRSos55z4878CrneJyTnHOvquymf3mOb+hvy/jw+QuLh5/NORkORvsGrq77dc6xpr0RcH07y3oF8G04GN0f6HdEDhdA1XG1vXb6dsAa+3Z8AREiQwkoEeQoiBzocHDkf/wnvwC5IpRVsUDNUgAAAABJRU5ErkJggg==)
no-repeat left center; width: 17px; height: 17px; display: inline-block; float: right; }
a { position: relative; z-index: 20; }
.right { text-align: right; }
.walletarea { display: none; border: 2px solid #f4b517; }
hr { margin: 20px 0; border-top: 2px dashed #008000; }
.keyarea { height: 110px; text-align: left; position: relative; padding: 5px; }
.keyarea .public { float: left; }
.keyarea .pubaddress { display: inline-block; height: 40px; padding: 0 0 0 10px; float: left; }
.keyarea .privwif { margin: 0; float: right; text-align: right; padding: 0 20px 0 0; position: relative; }
.keyarea .label { font-weight: bold; }
.keyarea .output { display: block; font-family: monospace; font-size: 1.25em; }
.keyarea .qrcode_public { display: inline-block; float: left; }
.keyarea .qrcode_private { display: inline-block; position: relative; top: 28px; float: right; }
.pubkeyhex { word-wrap: break-word; }
.keyarea .public .pubaddress .output, .keyarea .private .privwif .output { text-align: center; }
#SinglePubAddressBG { background-color: white; width: 305px; }
#SinglePrivWifBG { background-color: white; width: 470px; left: 90px; }
.keyarea .public .qrcode_public canvas, .keyarea .private .qrcode_private canvas { background-color: white; padding: 0px; }
.imageSingle { width: 806px; height: 237px; top: -2px; left: 0px; display: block; float: left; overflow: hidden; position: absolute; z-index: -1; }
.removeImage { visibility: hidden; }
body { font-family: Arial; }
body, html { height: 99%; }
.faqs ol { padding: 0 0 0 25px; }
.faqs li { padding: 3px 0; }
.question { padding: 10px 15px; text-align: left; cursor: pointer; }
.question:hover, .expandable:hover { color: #77777A; }
.answer { padding: 0 15px 10px 25px; text-align: left; display: none; font-size: 80%; }
.faq { border: 0; border-top: 2px solid #f4b517; }
.button { margin-left: 5px; margin-right: 5px; }
input[type=checkbox] { position: relative; z-index: 20; }
#wallets { clear: both; }
#btcaddress, #btcprivwif, #detailaddress, #detailaddresscomp, #detailprivwif, #detailprivwifcomp { font-family: monospace; font-size: 1.25em; }
#seedpoolarea { display: none; }
#seedpooldisplay { font-family: monospace; font-size: 1em; width: 640px; padding: 15px 5px; word-wrap: break-word; }
.seedpoint { width: 6px; height: 6px; display: block; border-radius: 3px; background-color: #f4b517; position: absolute; z-index: 10; }
#generate { font-family: monospace; font-size: 1.25em; height: 305px; text-align: left; position: relative; padding: 5px; border: 2px solid #f4b517; clear: both; }
#generate span { padding: 5px 5px 0 5px; }
#generatekeyinput { position: relative; z-index: 20; }
#keyarea { height: 250px; }
#keyarea .pubaddress { float: none; display: block; padding: 0; height: auto; }
#keyarea .label { text-decoration: none; }
#keyarea .privwif { float: none; text-align: right; position: relative; padding: 0; }
#keyarea .qrcode_public { float: none; display: block; padding: 13px 11px 11px 11px; }
#keyarea .qrcode_private { float: none; display: block; top: 0; text-align: right; padding: 13px 11px 11px 11px; }
#keyarea .private { width: 30%; display: table-cell; }
#keyarea .public { width: 30%; display: table-cell; }
#singlearea { font-size: 90%; }
#singlesecret { position: relative; top: -130px; float: right; right: 200px; color: 000000; font-weight: bolder; font-size: 200%; }
#singleshare { position: relative; top: -110px; float: left; left: 160px; color: #000000; font-weight: bolder; font-size: 200%; }
#singlesafety { text-align: left; padding: 5px; border-top: 2px solid #f4b517; top: -25px; position: relative; }
#main { position: relative; text-align: center; margin: 0px auto; width: 808px; }
#logo { width: 583px; height: 164px; }
#paperarea { min-height: 120px; display: none; }
#paperarea .keyarea { border: 2px solid #f4b517; border-top: 0; }
#paperarea .keyarea.art { display: block; height: auto; border: 0; font-family: Ubuntu, Arial; padding: 0; margin: 0; }
#paperarea .artwallet .papersvg { width: 486px; height: 261px; border: 0; margin: 0; padding: 0; left: 0; }
#paperarea .artwallet .qrcode_public { top: 52px; left: 17px; z-index: 100; margin: 0; float: none; display: block; position: absolute; background-color: #FFFFFF;
padding: 5px 5px 2px 5px; }
#paperarea .artwallet .qrcode_private { top: 104px; left: 360px; z-index: 100; margin: 0; float: none; display: block; position: absolute; background-color: #FFFFFF;
padding: 5px 5px 2px 5px; }
#paperarea .artwallet .btcaddress
{
position: absolute; top: 240px; left: 139px; z-index: 100; font-size: 10px; background-color: transparent;
font-weight:bold; color: #000000; margin: 0;
-webkit-transform-origin:top left; -webkit-transform:rotate(-90deg);
-moz-transform-origin:top left; -moz-transform:rotate(-90deg);
-ms-transform-origin:top left; -ms-transform:rotate(-90deg);
-o-transform-origin:top left; -o-transform:rotate(-90deg);
transform-origin:top left; transform:rotate(-90deg);
}
#paperarea .artwallet .btcprivwif
{
position: absolute; top: 257px; left: 346px; z-index: 100; font-size: 7px; background-color: transparent;
font-weight:bold; color: #000000; margin: 0;
-webkit-transform-origin:top left; -webkit-transform:rotate(-90deg);
-moz-transform-origin:top left; -moz-transform:rotate(-90deg);
-ms-transform-origin:top left; -ms-transform:rotate(-90deg);
-o-transform-origin:top left; -o-transform:rotate(-90deg);
transform-origin:top left; transform:rotate(-90deg);
}
#paperarea .artwallet .btcencryptedkey
{
position: absolute; top: 174px; left: 332px; z-index: 100; font-size: 8px; background-color: transparent;
font-weight:bold; color: #000000; margin: 0;
-webkit-transform-origin:top left; -webkit-transform:rotate(-90deg);
-moz-transform-origin:top left; -moz-transform:rotate(-90deg);
-ms-transform-origin:top left; -ms-transform:rotate(-90deg);
-o-transform-origin:top left; -o-transform:rotate(-90deg);
transform-origin:top left; transform:rotate(-90deg);
}
#bulkarea .body { padding: 5px 0 0 0; }
#bulkarea .format { font-style: italic; font-size: 90%; }
#bulktextarea { font-size: 90%; width: 98%; margin: 4px 0 0 0; }
#brainarea .keyarea { visibility: hidden; min-height: 110px; }
#brainview { margin-left: 5px; }
#detailkeyarea { padding: 10px; }
#detailarea { margin: 0; text-align: left; }
#detailarea .notes { text-align: left; font-size: 80%; padding: 0 0 20px 0; }
#detailarea .pubqr .item .label { text-decoration: none; }
#detailarea .pubqr .item { float: left; margin: 10px 0; position: relative; }
#detailarea .pubqr .item.right { float: right; position: relative; top: 0; }
#detailarea .privqr .item .label { text-decoration: none; }
#detailarea .privqr .item { float: left; margin: 0; position: relative; }
#detailarea .privqr .item.right { float: right; position: relative; }
#detailarea .item { margin: 10px 0; position: relative; font-size: 90%; padding: 1px 0; }
#detailarea .item.clear { clear: both; padding-top: 10px; }
#detailarea .label { display: block; font-weight: bold; }
#detailarea .output { display: block; font-family: monospace; font-size: 1.25em; }
#detailarea #detailqrcodepublic { position: relative; float: left; margin: 0 10px 0 0; padding: 13px 11px 11px 11px; }
#detailarea #detailqrcodepubliccomp { position: relative; float: right; margin: 0 0 0 10px; padding: 13px 11px 11px 11px; }
#detailarea #detailqrcodeprivate { position: relative; float: left; margin: 0 10px 0 0; padding: 13px 11px 11px 11px; }
#detailarea #detailqrcodeprivatecomp { position: relative; float: right; margin: 0 0 0 10px; padding: 13px 11px 11px 11px; }
#detailarea #detailqrcodeprivatebip38 { position: relative; margin: 0 10px 0 0; padding: 13px 11px 11px 11px; }
#detailpubkey { width: 590px; }
#detailbip38commands { display: none; padding-top: 5px; }
#detailbip38toggle { padding-top: 5px; }
#vanityarea { text-align: left; }
#vanityarea .label { text-decoration: underline; }
#vanityarea .output { font-family: monospace; font-size: 1.25em; display: block; }
#vanityarea .notes { text-align: left; font-size: 80%; padding: 0 0 20px 0; }
#vanitystep1area { display: none; text-align: left; position: relative; padding: 15px; border-bottom: 2px solid #f4b517; }
#vanitystep1label { padding-left: 5px; }
#vanitystep2area { border-top: 2px solid #f4b517; display: block; padding: 15px; }
#vanitystep2inputs { padding: 0 15px 10px 15px; }
#vanitycalc { margin-top: 5px; }
#splitarea { text-align: left; }
#splitarea span { padding: 0; }
#splitcommands { padding: 10px 15px; text-align: left; }
#combinecommands { padding: 10px 15px; }
#splitstep1area { display: none; text-align: left; position: relative; padding: 0; border-bottom: 2px solid #f4b517; }
.splitsharerow { border-bottom: 2px solid #f4b517; padding: 15px; }
.splitsharerow:last-child { border-bottom: 0; }
#combinelabelprivatekey { text-decoration: underline; }
#splitarea .output { display: block; font-family: monospace; font-size: 1.25em; }
#splitarea span.output { display: inline; }
#splitstep2area { padding: 10px 15px; }
.englishjson { text-align: center; padding: 40px 0 20px 0; }
.unittests { text-align: center; }
.unittests div { width: 894px; font-family: monospace; text-align: left; margin: auto; padding: 5px; border: 1px solid black; }
#testnet { display: none; background-color: Orange; color: #000000; border-radius: 5px; font-weight: bold; padding: 10px 0; margin: 0 auto 20px auto; }
#busyblock { position: fixed; display: none; background: url("data:image/gif;base64,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") #ccc no-repeat center; opacity: 0.4; width: 100%; height: 100%; top: 0; left: 0; z-index: 5000; }
#busyblock.busy { display: block; }
.hide { display: none; }
.show { display: block; }
@media screen
{
#tagline { margin: 0 0 15px 0; font-style: italic; }
.menu
{
text-align: left; margin: 0; padding: 0; display: block;
background-color: #f4b517; /* # 009900 # 53c100 */
border-top-left-radius: 5px; border-top-right-radius: 5px;
}
.menu .tab
{
position: relative; display: inline-block; border: 0px solid red;
margin: 0; list-style: none; z-index: 110; cursor: pointer;
top: 1px; padding: 10px 20px; width: 360px; /* 120px */ text-align: center;
}
.menu .tab.selected
{
cursor: default;
background-color: #FFF; margin: 6px 16px; padding: 4px; border-radius: 5px;
}
.menu .tab:hover
{
background-color: #FFF; margin: 6px 16px; padding: 4px; border-radius: 5px;
}
.menu .tab.selected:hover { color: #000; }
.pagebreak { height: 50px; }
.commands { border-bottom: 2px solid #f4b517; padding: 10px 2px; margin-bottom: 0; }
.commands .row { padding: 0 0; text-align: left; }
.commands .row.extra { padding-top: 6px; }
.commands span { padding: 0 10px; }
.commands span.print { float: right; position: relative; z-index: 20; }
.commands span.right { float: right; }
.expandable { padding: 10px 15px; text-align: left; cursor: pointer; }
#menu { visibility: visible; font-size: 90%; }
#culturemenu { text-align: center; padding: 0 10px 5px 10px; margin-bottom: 3px; font-size: 90%; }
#culturemenu span { padding: 3px; }
#culturemenu .selected { text-decoration: none; color: #000000; }
.culturemenurow { padding: 2px 0; }
#braincommands .row .label { width: 200px; display: inline-block; }
#braincommands .notes { font-size: 80%; display: block; padding: 5px 10px; }
#brainpassphrase { width: 280px; position: relative; z-index: 20; }
#brainpassphraseconfirm { width: 280px; position: relative; z-index: 20; }
#brainpassphraseshow { position: relative; z-index: 20; }
#brainview { position: relative; z-index: 20; }
#brainwarning { }
#detailcommands { padding: 10px 0; }
#detailcommands span { padding: 0 10px; }
#detailprivkey { width: 460px; position: relative; z-index: 20; }
#detailprivkeypassphrase { width: 250px; position: relative; z-index: 20; }
#detailcommands .button { position: relative; z-index: 20; }
#detailbip38encryptspan { display: none; }
.paper .commands { border: 2px solid #f4b517; }
#bulkstartindex, #paperlimit, #paperlimitperpage { width: 35px; }
#bulklimit { width: 45px; }
.footer { font-size: 90%; clear: both; width: 770px; padding: 10px 0 10px 0; margin: 50px auto auto auto; }
.footer div span.item { padding: 10px; }
.footer .authorbtc { float: left; width: 470px; }
.footer .authorbtc span.item { text-align: left; display: block; padding: 0 20px; }
.footer .authorbtc div { position: relative; z-index: 100; }
.footer .authorpgp { position: relative; }
.footer .authorpgp span.item { text-align: right; display: block; padding: 0 20px; }
.footer .copyright { font-size: 80%; clear: both; padding: 5px 0; }
.footer .copyright span { padding: 10px 2px; }
.footer .tooltip { display: none; text-align: left; border: 2px solid green; background-color: #FFFFF6; margin: 5px; padding: 10px; top: 0px; position: relative; }
.footer .statusgood { color: green; font-weight: bold; }
.footer .statuswarn { color: orange; font-weight: bold; }
.footer .statusbad { color: red; font-weight: bold; }
.footer .statusicon { background-color: none; font-size: 120%; padding: 1px 2px; }
.footer .statusicon:hover { background-color: green; cursor: pointer; }
}
@media print
{
#main { width: auto; }
#singlearea { border: 0; }
#singlesafety { border: 0; }
#paperarea .keyarea:first-child { border-top: 2px solid #f4b517; }
#paperarea .keyarea.art:first-child { border: 0; }
.pagebreak { height: 1px; }
.paper #logo { display: none; }
.menu, .footer, .commands, #tagline, #faqs, #culturemenu { display: none; }
#detailprivwif { width: 285px; word-wrap: break-word; }
#detailprivwifcomp { width: 310px; word-wrap: break-word; text-align: right; }
#detailarea .privqr .item.right { width: 310px; }
#detailarea .privqr .item { width: 285px; }
#detailarea .notes { display: none; }
#seedpoolarea { display: none; }
.faq { display: none; }
}
</style>
</head>
<body onclick="SecureRandom.seedTime();" onmousemove="ninja.seeder.seed(event);">
<div id="busyblock"></div>
<div id="main">
<img alt="smartcash.cc" title="smartcash.cc" id="logo" src="data:image/png;base64,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AgtpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0nYWRvYmU6bnM6bWV0YS8nIHg6eG1wdGs9J0ltYWdlOjpFeGlmVG9vbCA5LjcxJz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJz4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0nJwogIHhtbG5zOnBkZj0naHR0cDovL25zLmFkb2JlLmNvbS9wZGYvMS4zLyc+CiAgPHBkZjpBdXRob3I+U29tbml1bTwvcGRmOkF1dGhvcj4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6eG1wPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvJz4KICA8eG1wOkNyZWF0b3JUb29sPkNhbnZhPC94bXA6Q3JlYXRvclRvb2w+CiA8L3JkZjpEZXNjcmlwdGlvbj4KPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0ncic/PgN+UnEAAAAASUVORK5CYII=" />
<div id="tagline">Open Source JavaScript Client-Side SmartCash Wallet Generator</div>
<div id="seedpoolarea"><textarea rows="16" cols="62" id="seedpool"></textarea></div>
<div id="testnet"></div>
<ul class="menu" id="menu">
<li class="tab" id="singlewallet" onclick="ninja.tab.select(this);">One Address Paper Wallet
<li class="tab" id="paperwallet" onclick="ninja.tab.select(this);">Multi Address Paper Wallet
</ul>
<div id="generate">
<span id="generatelabelbitcoinaddress">Generating SmartCash Address...</span><br />
<span id="generatelabelmovemouse">MOVE your mouse around to add some extra randomness... </span><span id="mousemovelimit"></span><br />
<span id="generatelabelkeypress">OR type some random characters into this textbox</span> <input type="text" id="generatekeyinput" onkeydown="ninja.seeder.seedKeyPress(event);" /><br />
<div id="seedpooldisplay"></div>
</div>
<div id="wallets">
<div id="singlearea" class="walletarea">
<div class="commands">
<div id="singlecommands" class="row">
<span><input type="button" id="newaddress" value="Generate New Address" onclick="ninja.wallets.singlewallet.generateNewAddressAndKey();" /></span>
<span><label id="singlelabelhideart" for="singleart">Hide Art?</label> <input type="checkbox" id="singleart" onchange="toggleSingelArt(this);" /></span>
<span class="print"><input type="button" name="print" value="Print" id="singleprint" onclick="window.print();" /></span>
</div>
</div>
<div class="body">
<div id="keyarea" class="keyarea">
<div class="keyareaImage">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA/gAAAE2CAYAAADVpjl6AAAACXBIWXMAABnWAAAZ1gEY0crtAAA6umlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTgtMDItMjFUMjI6MjQ6NTMrMTA6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOC0wMi0yMVQyMjozMzo1NCsxMDowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTgtMDItMjFUMjI6MzM6NTQrMTA6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+CiAgICAgICAgICAgIDxyZGY6QmFnPgogICAgICAgICAgICAgICA8cmRmOmxpPnhtcC5kaWQ6NWYyODEwZTktOTc1Zi01NjQ1LWEwYjItOWU2NDYwMjFmY2I5PC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOkJhZz4KICAgICAgICAgPC9waG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6ZWVhMWJhYWQtYTYyYi0zODRiLWEyYjgtOTYwZWMyNWQ4ZmRjPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NGIwMTYxYTctMTcwMy0xMWU4LThiMGMtZDZlNDAzN2M4M2EyPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6N2FjNzZmMmUtZDM3MS02NTQ0LTlkMmEtMzY3MmViOGE1MDZjPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjdhYzc2ZjJlLWQzNzEtNjU0NC05ZDJhLTM2NzJlYjhhNTA2Yzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxOC0wMi0yMVQyMjoyNDo1MysxMDowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDplZWExYmFhZC1hNjJiLTM4NGItYTJiOC05NjBlYzI1ZDhmZGM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTgtMDItMjFUMjI6MzM6NTQrMTA6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xNjgwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNjgwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMDE2PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMxMDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+cstZeAAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAGMc0lEQVR42uy9d5wcd33//5y67fZ2b6+fTjrpZEmW3LtxN7hgAzaY3kI1LcCXkELyTb5J+CX5hgRCAiEklCR8AQdTbTA2YMANd8tF1ZasXu50vW6b+vtjdnZn6+1V6aR5PR77mL292dndmc/MfJ7vKnzlK1+xbdticHCQ/v5+AHTdIBptIBQKc+jQQU5kBYMhIpEwyWSKw4cP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" alt="Single Wallet" class="imageSingle" id="SingleArt">
</div>
<div class="public">
<div class="pubaddress">
<span class="label" id="singlelabelbitcoinaddress">SmartCash Address</span>
</div>
<div id="qrcode_public" class="qrcode_public"></div>
<div class="pubaddress" id="SinglePubAddressBG">
<span class="output" id="btcaddress"></span>
</div>
<div id="singleshare">SHARE</div>
</div>
<div class="private">
<div class="privwif">
<span class="label" id="singlelabelprivatekey">Private Key</span>
</div>
<div id="qrcode_private" class="qrcode_private"></div>
<div class="privwif" id="SinglePrivWifBG">
<span class="output" id="btcprivwif"></span>
</div>
<div id="singlesecret">SECRET</div>
</div>
</div>
<div id="singlesafety">
<p id="singletip1"><b>A SmartCash wallet</b> is as simple as a single pairing of a SmartCash address with its corresponding SmartCash private key. Such a wallet has been generated for you in your web browser and is displayed above.</p>
<p id="singletip2"><b>To safeguard this wallet</b> you must print or otherwise record the SmartCash address and private key. It is important to make a backup copy of the private key and store it in a safe location. This site does not have knowledge of your private key. If you are familiar with PGP you can download this all-in-one HTML page and check that you have an authentic version from the author of this site by matching the SHA256 hash of this HTML with the SHA256 hash available in the signed version history document linked on the footer of this site. If you leave/refresh the site or press the "Generate New Address" button then a new private key will be generated and the previously displayed private key will not be retrievable. Your SmartCash private key should be kept a secret. Whomever you share the private key with has access to spend all the SmartCash associated with that address. If you print your wallet then store it in a zip lock bag to keep it safe from water. Treat a paper wallet like cash.</p>
<p id="singletip3"><b>Add funds</b> to this wallet by instructing others to send SmartCash to your SmartCash address.</p>
<p id="singletip4"><b>Check your balance</b> by going to explorer.smartcash.cc and entering your SmartCash address.</p>
<p id="singletip5"><b>Spend your SmartCash</b> by going to wallet.smartcash.cc and import the full balance of your private key into your account at their website. You can also spend your funds by downloading one of the popular SmartCash p2p clients and importing your private key to the p2p client wallet. Keep in mind when you import your single key to a SmartCash p2p client and spend funds your key will be bundled with other private keys in the p2p client wallet. When you perform a transaction your change will be sent to another SmartCash address within the p2p client wallet. You must then backup the p2p client wallet and keep it safe as your remaining SmartCash will be stored there. Satoshi advised that one should never delete a wallet.</p>
</div>
</div>
</div>
<div id="paperarea">
<div class="commands">
<div id="papercommands" class="row">
<span><label id="paperlabelhideart" for="paperart">Hide Art?</label> <input type="checkbox" id="paperart" onchange="ninja.wallets.paperwallet.toggleArt(this);" /></span>
<span><label id="paperlabeladdressestogenerate" for="paperlimit">Addresses to generate:</label> <input type="text" id="paperlimit" /></span>
<span><input type="button" id="papergenerate" value="Generate" onclick="ninja.wallets.paperwallet.build(document.getElementById('paperlimit').value * 1, document.getElementById('paperlimitperpage').value * 1, !document.getElementById('paperart').checked, document.getElementById('paperpassphrase').value);" /></span>
<span class="print"><input type="button" name="print" value="Print" id="paperprint" onclick="window.print();" /></span>
</div>
<div id="paperadvancedcommands" class="row extra">
<span style="display:none;"><label id="paperlabelencrypt" for="paperencrypt">BIP38 Encrypt?</label> <input type="hidden" id="paperencrypt" onchange="ninja.wallets.paperwallet.toggleEncrypt(this);" /></span>
<span style="display:none;"><label id="paperlabelBIPpassphrase" for="paperpassphrase">Passphrase:</label> <input type="hidden" id="paperpassphrase" /></span>
<span><label id="paperlabeladdressesperpage" for="paperlimitperpage">Addresses per page:</label> <input type="text" id="paperlimitperpage" /></span>
</div>
</div>
<div id="paperkeyarea"></div>
</div>
</div>
<div id="footer" class="footer">
<div class="tooltips">
<div class="tooltip" id="statuscryptogood">
<span class="statusgood" id="statuslabelcryptogood">&#10004; Good!</span>
<span id="statuslabelcryptogood1">Your browser can generate cryptographically random keys using window.crypto.getRandomValues</span>
<br /><br /><input type="button" value="OK" class="button" id="statusokcryptogood" onclick="document.getElementById('statuscryptogood').style.display = 'none';" />
</div>
<div class="tooltip" id="statuscryptobad">
<span class="statusbad" id="statuslabelcryptobad">&times; Oh no!</span>
<span id="statuslabelcryptobad1">Your browser does NOT support window.crypto.getRandomValues. You should use a more modern browser with this generator to increase the security of the keys generated.</span>
<br /><br /><input type="button" value="OK" class="button" id="statusokcryptobad" onclick="document.getElementById('statuscryptobad').style.display = 'none';" />
</div>
<div class="tooltip" id="statusunittestsgood">
<span class="statusgood" id="statuslabelunittestsgood">&#10004; Good!</span>
<span id="statuslabelunittestsgood1">All synchronous unit tests passed.</span>
<br /><br /><input type="button" value="OK" class="button" id="statusokunittestsgood" onclick="document.getElementById('statusunittestsgood').style.display = 'none';" />
</div>
<div class="tooltip" id="statusunittestsbad">
<span class="statusbad" id="statuslabelunittestsbad">&times; Oh no!</span>
<span id="statuslabelunittestsbad1">Some synchronous unit tests DID NOT pass. You should find another browser to use with this generator.</span>
<br /><br /><input type="button" value="OK" class="button" id="statusokunittestsbad" onclick="document.getElementById('statusunittestsbad').style.display = 'none';" />
</div>
<div class="tooltip" id="statusprotocolgood">
<span class="statusgood" id="statuslabelprotocolgood">&#10004; Good!</span>
<span id="statuslabelprotocolgood1">You are running this generator from your local computer. <br />Tip: Double check you are offline by trying </span>
<a href="http://www.google.com" target="_blank">www.google.com</a>
<br /><br /><input type="button" value="OK" class="button" id="statusokprotocolgood" onclick="document.getElementById('statusprotocolgood').style.display = 'none';" />
</div>
<div class="tooltip" id="statusprotocolbad">
<span class="statuswarn" id="statuslabelprotocolbad">&#9888; Think twice!</span>
<span id="statuslabelprotocolbad1">You appear to be running this generator online from a live website. For valuable wallets it is recommended to</span>
<a id="statuslabelprotocolbad2" href="https://github.com/SmartCash/PaperWalletGenerator/archive/master.zip">download</a>
<span id="statuslabelprotocolbad3">the zip file from GitHub and run this generator offline as a local html file.</span>
<br /><br /><input type="button" value="OK" class="button" id="statusokprotocolbad" onclick="document.getElementById('statusprotocolbad').style.display = 'none';" />
</div>
<div class="tooltip" id="statuskeypoolgood">
<span id="statuslabelkeypool1">This is a log of all the SmartCash Addresses and Private Keys you generated during your current session. Reloading the page will create a new session.</span>
<textarea rows="20" cols="102" id="keypooltextarea"></textarea>
<br /><br />
<input type="button" value="Refresh" class="button" id="statuskeypoolrefresh" onclick="ninja.status.showKeyPool();" />
<input type="button" value="OK" class="button" id="statusokkeypool" onclick="document.getElementById('statuskeypoolgood').style.display = 'none';" />
</div>
</div>
<div class="authorbtc">
<div>
<span class="item">
<span class="statusicon" id="statusprotocol" onclick="ninja.status.showProtocol();">...</span>
<span class="statusicon" id="statuscrypto" onclick="ninja.status.showCrypto();">...</span>
<span class="statusicon" id="statuskeypool" onclick="ninja.status.showKeyPool();">&#8803;</span>
</span>
<span class="item" id="footerlabeltranslatedby"></span>
<span class="item"><a href="https://github.com/SmartCash/PaperWalletGenerator" target="_blank" id="footerlabelgithub">GitHub Repository</a>
(<a href="https://github.com/SmartCash/PaperWalletGenerator/archive/master.zip" target="_blank" id="footerlabelgithubzip">zip</a>)</span>
</div>
</div>
<div class="authorpgp">
</div>
<div class="copyright">
<span id="footerlabelcopyright1">Copyright smartcash.cc.</span>
<span id="footerlabelcopyright2">JavaScript copyrights are included in the source.</span>
<span id="footerlabelnowarranty">No warranty.</span>
</div>
</div>
</div>
<script type="text/javascript">
var ninja = { wallets: {} };
ninja.privateKey = {
isPrivateKey: function (key) {
return (
Bitcoin.ECKey.isWalletImportFormat(key) ||
Bitcoin.ECKey.isCompressedWalletImportFormat(key) ||
Bitcoin.ECKey.isHexFormat(key) ||
Bitcoin.ECKey.isBase64Format(key) ||
Bitcoin.ECKey.isMiniFormat(key)
);
},
getECKeyFromAdding: function (privKey1, privKey2) {
var n = EllipticCurve.getSECCurveByName("secp256k1").getN();
var ecKey1 = new Bitcoin.ECKey(privKey1);
var ecKey2 = new Bitcoin.ECKey(privKey2);
// if both keys are the same return null
if (ecKey1.getBitcoinHexFormat() == ecKey2.getBitcoinHexFormat()) return null;
if (ecKey1 == null || ecKey2 == null) return null;
var combinedPrivateKey = new Bitcoin.ECKey(ecKey1.priv.add(ecKey2.priv).mod(n));
// compressed when both keys are compressed
if (ecKey1.compressed && ecKey2.compressed) combinedPrivateKey.setCompressed(true);
return combinedPrivateKey;
},
getECKeyFromMultiplying: function (privKey1, privKey2) {
var n = EllipticCurve.getSECCurveByName("secp256k1").getN();
var ecKey1 = new Bitcoin.ECKey(privKey1);
var ecKey2 = new Bitcoin.ECKey(privKey2);
// if both keys are the same return null
if (ecKey1.getBitcoinHexFormat() == ecKey2.getBitcoinHexFormat()) return null;
if (ecKey1 == null || ecKey2 == null) return null;
var combinedPrivateKey = new Bitcoin.ECKey(ecKey1.priv.multiply(ecKey2.priv).mod(n));
// compressed when both keys are compressed
if (ecKey1.compressed && ecKey2.compressed) combinedPrivateKey.setCompressed(true);
return combinedPrivateKey;
},
// 58 base58 characters starting with 6P
isBIP38Format: function (key) {
key = key.toString();
return (/^6P[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{56}$/.test(key));
},
BIP38EncryptedKeyToByteArrayAsync: function (base58Encrypted, passphrase, callback) {
var hex;
try {
hex = Bitcoin.Base58.decode(base58Encrypted);
} catch (e) {
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
return;
}
// 43 bytes: 2 bytes prefix, 37 bytes payload, 4 bytes checksum
if (hex.length != 43) {
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
return;
}
// first byte is always 0x01
else if (hex[0] != 0x01) {
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
return;
}
var expChecksum = hex.slice(-4);
hex = hex.slice(0, -4);
var checksum = Bitcoin.Util.dsha256(hex);
if (checksum[0] != expChecksum[0] || checksum[1] != expChecksum[1] || checksum[2] != expChecksum[2] || checksum[3] != expChecksum[3]) {
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
return;
}
var isCompPoint = false;
var isECMult = false;
var hasLotSeq = false;
// second byte for non-EC-multiplied key
if (hex[1] == 0x42) {
// key should use compression
if (hex[2] == 0xe0) {
isCompPoint = true;
}
// key should NOT use compression
else if (hex[2] != 0xc0) {
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
return;
}
}
// second byte for EC-multiplied key
else if (hex[1] == 0x43) {
isECMult = true;
isCompPoint = (hex[2] & 0x20) != 0;
hasLotSeq = (hex[2] & 0x04) != 0;
if ((hex[2] & 0x24) != hex[2]) {
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
return;
}
}
else {
callback(new Error(ninja.translator.get("detailalertnotvalidprivatekey")));
return;
}
var decrypted;
var AES_opts = { mode: new Crypto.mode.ECB(Crypto.pad.NoPadding), asBytes: true };
var verifyHashAndReturn = function () {
var tmpkey = new Bitcoin.ECKey(decrypted); // decrypted using closure
var base58AddrText = tmpkey.setCompressed(isCompPoint).getBitcoinAddress(); // isCompPoint using closure
checksum = Bitcoin.Util.dsha256(base58AddrText); // checksum using closure
if (checksum[0] != hex[3] || checksum[1] != hex[4] || checksum[2] != hex[5] || checksum[3] != hex[6]) {
callback(new Error(ninja.translator.get("bip38alertincorrectpassphrase"))); // callback using closure
return;
}
callback(tmpkey.getBitcoinPrivateKeyByteArray()); // callback using closure
};
if (!isECMult) {
var addresshash = hex.slice(3, 7);
Crypto_scrypt(passphrase, addresshash, 16384, 8, 8, 64, function (derivedBytes) {
var k = derivedBytes.slice(32, 32 + 32);
decrypted = Crypto.AES.decrypt(hex.slice(7, 7 + 32), k, AES_opts);
for (var x = 0; x < 32; x++) decrypted[x] ^= derivedBytes[x];
verifyHashAndReturn(); //TODO: pass in 'decrypted' as a param
});
}
else {
var ownerentropy = hex.slice(7, 7 + 8);
var ownersalt = !hasLotSeq ? ownerentropy : ownerentropy.slice(0, 4);
Crypto_scrypt(passphrase, ownersalt, 16384, 8, 8, 32, function (prefactorA) {
var passfactor;
if (!hasLotSeq) { // hasLotSeq using closure
passfactor = prefactorA;
} else {
var prefactorB = prefactorA.concat(ownerentropy); // ownerentropy using closure
passfactor = Bitcoin.Util.dsha256(prefactorB);
}
// remove this ECKey from the pool (because user does not see it)
var userKeyPool = Bitcoin.KeyPool.getArray();
var kp = new Bitcoin.ECKey(passfactor);
var passpoint = kp.setCompressed(true).getPub();
Bitcoin.KeyPool.setArray(userKeyPool);
var encryptedpart2 = hex.slice(23, 23 + 16);
var addresshashplusownerentropy = hex.slice(3, 3 + 12);
Crypto_scrypt(passpoint, addresshashplusownerentropy, 1024, 1, 1, 64, function (derived) {
var k = derived.slice(32);
var unencryptedpart2 = Crypto.AES.decrypt(encryptedpart2, k, AES_opts);
for (var i = 0; i < 16; i++) { unencryptedpart2[i] ^= derived[i + 16]; }
var encryptedpart1 = hex.slice(15, 15 + 8).concat(unencryptedpart2.slice(0, 0 + 8));
var unencryptedpart1 = Crypto.AES.decrypt(encryptedpart1, k, AES_opts);
for (var i = 0; i < 16; i++) { unencryptedpart1[i] ^= derived[i]; }
var seedb = unencryptedpart1.slice(0, 0 + 16).concat(unencryptedpart2.slice(8, 8 + 8));
var factorb = Bitcoin.Util.dsha256(seedb);
var ps = EllipticCurve.getSECCurveByName("secp256k1");
var privateKey = BigInteger.fromByteArrayUnsigned(passfactor).multiply(BigInteger.fromByteArrayUnsigned(factorb)).remainder(ps.getN());
decrypted = privateKey.toByteArrayUnsigned();
verifyHashAndReturn();
});
});
}
},
BIP38PrivateKeyToEncryptedKeyAsync: function (base58Key, passphrase, compressed, callback) {
var privKey = new Bitcoin.ECKey(base58Key);
var privKeyBytes = privKey.getBitcoinPrivateKeyByteArray();
var address = privKey.setCompressed(compressed).getBitcoinAddress();
// compute sha256(sha256(address)) and take first 4 bytes
var salt = Bitcoin.Util.dsha256(address).slice(0, 4);
// derive key using scrypt
var AES_opts = { mode: new Crypto.mode.ECB(Crypto.pad.NoPadding), asBytes: true };
Crypto_scrypt(passphrase, salt, 16384, 8, 8, 64, function (derivedBytes) {
for (var i = 0; i < 32; ++i) {
privKeyBytes[i] ^= derivedBytes[i];
}
// 0x01 0x42 + flagbyte + salt + encryptedhalf1 + encryptedhalf2
var flagByte = compressed ? 0xe0 : 0xc0;
var encryptedKey = [0x01, 0x42, flagByte].concat(salt);
encryptedKey = encryptedKey.concat(Crypto.AES.encrypt(privKeyBytes, derivedBytes.slice(32), AES_opts));
encryptedKey = encryptedKey.concat(Bitcoin.Util.dsha256(encryptedKey).slice(0, 4));
callback(Bitcoin.Base58.encode(encryptedKey));
});
},
BIP38GenerateIntermediatePointAsync: function (passphrase, lotNum, sequenceNum, callback) {
var noNumbers = lotNum === null || sequenceNum === null;
var rng = new SecureRandom();
var ownerEntropy, ownerSalt;
if (noNumbers) {
ownerSalt = ownerEntropy = new Array(8);
rng.nextBytes(ownerEntropy);
}
else {
// 1) generate 4 random bytes
ownerSalt = new Array(4);
rng.nextBytes(ownerSalt);
// 2) Encode the lot and sequence numbers as a 4 byte quantity (big-endian):
// lotnumber * 4096 + sequencenumber. Call these four bytes lotsequence.
var lotSequence = BigInteger(4096 * lotNum + sequenceNum).toByteArrayUnsigned();
// 3) Concatenate ownersalt + lotsequence and call this ownerentropy.
var ownerEntropy = ownerSalt.concat(lotSequence);
}
// 4) Derive a key from the passphrase using scrypt
Crypto_scrypt(passphrase, ownerSalt, 16384, 8, 8, 32, function (prefactor) {
// Take SHA256(SHA256(prefactor + ownerentropy)) and call this passfactor
var passfactorBytes = noNumbers ? prefactor : Bitcoin.Util.dsha256(prefactor.concat(ownerEntropy));
var passfactor = BigInteger.fromByteArrayUnsigned(passfactorBytes);
// 5) Compute the elliptic curve point G * passfactor, and convert the result to compressed notation (33 bytes)
var ellipticCurve = EllipticCurve.getSECCurveByName("secp256k1");
var passpoint = ellipticCurve.getG().multiply(passfactor).getEncoded(1);
// 6) Convey ownersalt and passpoint to the party generating the keys, along with a checksum to ensure integrity.
// magic bytes "2C E9 B3 E1 FF 39 E2 51" followed by ownerentropy, and then passpoint
var magicBytes = [0x2C, 0xE9, 0xB3, 0xE1, 0xFF, 0x39, 0xE2, 0x51];
if (noNumbers) magicBytes[7] = 0x53;
var intermediate = magicBytes.concat(ownerEntropy).concat(passpoint);
// base58check encode
intermediate = intermediate.concat(Bitcoin.Util.dsha256(intermediate).slice(0, 4));
callback(Bitcoin.Base58.encode(intermediate));
});
},
BIP38GenerateECAddressAsync: function (intermediate, compressed, callback) {
// decode IPS
var x = Bitcoin.Base58.decode(intermediate);
//if(x.slice(49, 4) !== Bitcoin.Util.dsha256(x.slice(0,49)).slice(0,4)) {
// callback({error: 'Invalid intermediate passphrase string'});
//}
var noNumbers = (x[7] === 0x53);
var ownerEntropy = x.slice(8, 8 + 8);
var passpoint = x.slice(16, 16 + 33);
// 1) Set flagbyte.
// set bit 0x20 for compressed key
// set bit 0x04 if ownerentropy contains a value for lotsequence
var flagByte = (compressed ? 0x20 : 0x00) | (noNumbers ? 0x00 : 0x04);
// 2) Generate 24 random bytes, call this seedb.
var seedB = new Array(24);
var rng = new SecureRandom();
rng.nextBytes(seedB);
// Take SHA256(SHA256(seedb)) to yield 32 bytes, call this factorb.
var factorB = Bitcoin.Util.dsha256(seedB);
// 3) ECMultiply passpoint by factorb. Use the resulting EC point as a public key and hash it into a Bitcoin
// address using either compressed or uncompressed public key methodology (specify which methodology is used
// inside flagbyte). This is the generated Bitcoin address, call it generatedaddress.
var ec = EllipticCurve.getSECCurveByName("secp256k1").getCurve();
var generatedPoint = ec.decodePointHex(ninja.publicKey.getHexFromByteArray(passpoint));
var generatedBytes = generatedPoint.multiply(BigInteger.fromByteArrayUnsigned(factorB)).getEncoded(compressed);
var generatedAddress = (new Bitcoin.Address(Bitcoin.Util.sha256ripe160(generatedBytes))).toString();
// 4) Take the first four bytes of SHA256(SHA256(generatedaddress)) and call it addresshash.
var addressHash = Bitcoin.Util.dsha256(generatedAddress).slice(0, 4);
// 5) Now we will encrypt seedb. Derive a second key from passpoint using scrypt
Crypto_scrypt(passpoint, addressHash.concat(ownerEntropy), 1024, 1, 1, 64, function (derivedBytes) {
// 6) Do AES256Encrypt(seedb[0...15]] xor derivedhalf1[0...15], derivedhalf2), call the 16-byte result encryptedpart1
for (var i = 0; i < 16; ++i) {
seedB[i] ^= derivedBytes[i];
}
var AES_opts = { mode: new Crypto.mode.ECB(Crypto.pad.NoPadding), asBytes: true };
var encryptedPart1 = Crypto.AES.encrypt(seedB.slice(0, 16), derivedBytes.slice(32), AES_opts);
// 7) Do AES256Encrypt((encryptedpart1[8...15] + seedb[16...23]) xor derivedhalf1[16...31], derivedhalf2), call the 16-byte result encryptedseedb.
var message2 = encryptedPart1.slice(8, 8 + 8).concat(seedB.slice(16, 16 + 8));
for (var i = 0; i < 16; ++i) {
message2[i] ^= derivedBytes[i + 16];
}
var encryptedSeedB = Crypto.AES.encrypt(message2, derivedBytes.slice(32), AES_opts);
// 0x01 0x43 + flagbyte + addresshash + ownerentropy + encryptedpart1[0...7] + encryptedpart2
var encryptedKey = [0x01, 0x43, flagByte].concat(addressHash).concat(ownerEntropy).concat(encryptedPart1.slice(0, 8)).concat(encryptedSeedB);
// base58check encode
encryptedKey = encryptedKey.concat(Bitcoin.Util.dsha256(encryptedKey).slice(0, 4));
callback(generatedAddress, Bitcoin.Base58.encode(encryptedKey));
});
}
};
ninja.publicKey = {
isPublicKeyHexFormat: function (key) {
key = key.toString();
return ninja.publicKey.isUncompressedPublicKeyHexFormat(key) || ninja.publicKey.isCompressedPublicKeyHexFormat(key);
},
// 130 characters [0-9A-F] starts with 04
isUncompressedPublicKeyHexFormat: function (key) {
key = key.toString();
return /^04[A-Fa-f0-9]{128}$/.test(key);
},
// 66 characters [0-9A-F] starts with 02 or 03
isCompressedPublicKeyHexFormat: function (key) {
key = key.toString();
return /^0[2-3][A-Fa-f0-9]{64}$/.test(key);
},
getBitcoinAddressFromByteArray: function (pubKeyByteArray) {
var pubKeyHash = Bitcoin.Util.sha256ripe160(pubKeyByteArray);
var addr = new Bitcoin.Address(pubKeyHash);
return addr.toString();
},
getHexFromByteArray: function (pubKeyByteArray) {
return Crypto.util.bytesToHex(pubKeyByteArray).toString().toUpperCase();
},
getByteArrayFromAdding: function (pubKeyHex1, pubKeyHex2) {
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
var curve = ecparams.getCurve();
var ecPoint1 = curve.decodePointHex(pubKeyHex1);
var ecPoint2 = curve.decodePointHex(pubKeyHex2);
// if both points are the same return null
if (ecPoint1.equals(ecPoint2)) return null;
var compressed = (ecPoint1.compressed && ecPoint2.compressed);
var pubKey = ecPoint1.add(ecPoint2).getEncoded(compressed);
return pubKey;
},
getByteArrayFromMultiplying: function (pubKeyHex, ecKey) {
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
var ecPoint = ecparams.getCurve().decodePointHex(pubKeyHex);
var compressed = (ecPoint.compressed && ecKey.compressed);
// if both points are the same return null
ecKey.setCompressed(false);
if (ecPoint.equals(ecKey.getPubPoint())) {
return null;
}
var bigInt = ecKey.priv;
var pubKey = ecPoint.multiply(bigInt).getEncoded(compressed);
return pubKey;
},
// used by unit test
getDecompressedPubKeyHex: function (pubKeyHexComp) {
var ecparams = EllipticCurve.getSECCurveByName("secp256k1");
var ecPoint = ecparams.getCurve().decodePointHex(pubKeyHexComp);
var pubByteArray = ecPoint.getEncoded(0);
var pubHexUncompressed = ninja.publicKey.getHexFromByteArray(pubByteArray);
return pubHexUncompressed;
}
};
</script>
<script type="text/javascript">
ninja.seeder = {
init: (function () {
document.getElementById("generatekeyinput").value = "";
})(),
// number of mouse movements to wait for
seedLimit: (function () {
var num = Crypto.util.randomBytes(12)[11];
return 200 + Math.floor(num);
})(),
seedCount: 0, // counter
lastInputTime: new Date().getTime(),
seedPoints: [],
isStillSeeding: true,
seederDependentWallets: ["singlewallet", "paperwallet"],
// seed function exists to wait for mouse movement to add more entropy before generating an address
seed: function (evt) {
if (!evt) var evt = window.event;
var timeStamp = new Date().getTime();
// seeding is over now we generate and display the address
if (ninja.seeder.seedCount == ninja.seeder.seedLimit) {
ninja.seeder.seedCount++;
ninja.seeder.seedingOver();
}
// seed mouse position X and Y when mouse movements are greater than 40ms apart.
else if ((ninja.seeder.seedCount < ninja.seeder.seedLimit) && evt && (timeStamp - ninja.seeder.lastInputTime) > 40) {
SecureRandom.seedTime();
SecureRandom.seedInt16((evt.clientX * evt.clientY));
ninja.seeder.showPoint(evt.clientX, evt.clientY);
ninja.seeder.seedCount++;
ninja.seeder.lastInputTime = new Date().getTime();
ninja.seeder.showPool();
}
},
// seed function exists to wait for mouse movement to add more entropy before generating an address
seedKeyPress: function (evt) {
if (!evt) var evt = window.event;
// seeding is over now we generate and display the address
if (ninja.seeder.seedCount == ninja.seeder.seedLimit) {
ninja.seeder.seedCount++;
ninja.seeder.seedingOver();
}
// seed key press character
else if ((ninja.seeder.seedCount < ninja.seeder.seedLimit) && evt.which) {
var timeStamp = new Date().getTime();
// seed a bunch (minimum seedLimit) of times
SecureRandom.seedTime();
SecureRandom.seedInt8(evt.which);
var keyPressTimeDiff = timeStamp - ninja.seeder.lastInputTime;
SecureRandom.seedInt8(keyPressTimeDiff);
ninja.seeder.seedCount++;
ninja.seeder.lastInputTime = new Date().getTime();
ninja.seeder.showPool();
}
},
showPool: function () {
var poolHex;
if (SecureRandom.poolCopyOnInit != null) {
poolHex = Crypto.util.bytesToHex(SecureRandom.poolCopyOnInit);
document.getElementById("seedpool").innerHTML = poolHex;
document.getElementById("seedpooldisplay").innerHTML = poolHex;
}
else {
poolHex = Crypto.util.bytesToHex(SecureRandom.pool);
document.getElementById("seedpool").innerHTML = poolHex;
document.getElementById("seedpooldisplay").innerHTML = poolHex;
}
var percentSeeded = Math.round((ninja.seeder.seedCount / ninja.seeder.seedLimit) * 100) + "%";
document.getElementById("mousemovelimit").innerHTML = percentSeeded;
for (var wIndex in ninja.seeder.seederDependentWallets) {
document.getElementById(ninja.seeder.seederDependentWallets[wIndex]).innerHTML = percentSeeded;
}
},
showPoint: function (x, y) {
var div = document.createElement("div");
div.setAttribute("class", "seedpoint");
div.style.top = y + "px";
div.style.left = x + "px";
document.body.appendChild(div);
ninja.seeder.seedPoints.push(div);
},
removePoints: function () {
for (var i = 0; i < ninja.seeder.seedPoints.length; i++) {
document.body.removeChild(ninja.seeder.seedPoints[i]);
}
ninja.seeder.seedPoints = [];
},
seedingOver: function () {
ninja.seeder.isStillSeeding = false;
// open selected tab
var walletType = ninja.tab.whichIsOpen();
if (walletType == null) {
ninja.tab.select("singlewallet");
} else {
ninja.tab.select(walletType)
}
document.getElementById("generate").style.display = "none";
document.getElementById("singlewallet").innerHTML = "One Address Paper Wallet";
document.getElementById("paperwallet").innerHTML = "Multi Address Paper Wallet";
ninja.seeder.removePoints();
}
};
</script>
<script type="text/javascript">
(function (ninja) {
var qrC = ninja.qrCode = {
// determine which type number is big enough for the input text length
getTypeNumber: function (text) {
var lengthCalculation = text.length * 8 + 12; // length as calculated by the QRCode
if (lengthCalculation < 72) { return 1; }
else if (lengthCalculation < 128) { return 2; }
else if (lengthCalculation < 208) { return 3; }
else if (lengthCalculation < 288) { return 4; }
else if (lengthCalculation < 368) { return 5; }
else if (lengthCalculation < 480) { return 6; }
else if (lengthCalculation < 528) { return 7; }
else if (lengthCalculation < 688) { return 8; }
else if (lengthCalculation < 800) { return 9; }
else if (lengthCalculation < 976) { return 10; }
return null;
},
createCanvas: function (text, sizeMultiplier) {
sizeMultiplier = (sizeMultiplier == undefined) ? 2 : sizeMultiplier; // default 2
// create the qrcode itself
var typeNumber = qrC.getTypeNumber(text);
var qrcode = new QRCode(typeNumber, QRCode.ErrorCorrectLevel.H);
qrcode.addData(text);
qrcode.make();
var width = qrcode.getModuleCount() * sizeMultiplier;
var height = qrcode.getModuleCount() * sizeMultiplier;
// create canvas element
var canvas = document.createElement('canvas');
var scale = 10.0;
canvas.width = width * scale;
canvas.height = height * scale;
canvas.style.width = width + 'px';
canvas.style.height = height + 'px';
var ctx = canvas.getContext('2d');
ctx.scale(scale, scale);
// compute tileW/tileH based on width/height
var tileW = width / qrcode.getModuleCount();
var tileH = height / qrcode.getModuleCount();
// draw in the canvas
for (var row = 0; row < qrcode.getModuleCount() ; row++) {
for (var col = 0; col < qrcode.getModuleCount() ; col++) {
ctx.fillStyle = qrcode.isDark(row, col) ? "#000000" : "#ffffff";
ctx.fillRect(col * tileW, row * tileH, tileW, tileH);
}
}
// return just built canvas
return canvas;
},
// show QRCodes with canvas
// parameter: keyValuePair
// example: { "id1": "string1", "id2": "string2"}
// "id1" is the id of a div element where you want a QRCode inserted.
// "string1" is the string you want encoded into the QRCode.
showQrCode: function (keyValuePair, sizeMultiplier) {
for (var key in keyValuePair) {
var value = keyValuePair[key];
try {
if (document.getElementById(key)) {
document.getElementById(key).innerHTML = "";
document.getElementById(key).appendChild(qrC.createCanvas(value, sizeMultiplier));
}
}
catch (e) { }
}
}
};
})(ninja);
</script>
<script type="text/javascript">
(function (ninja) {
var status = ninja.status = function() {
var cryptoCase = "";
if (window.crypto && window.crypto.getRandomValues) {
document.getElementById("statuscrypto").innerHTML = "&#10004;"; //✔
cryptoCase = "good";
}
else {
document.getElementById("statuscrypto").innerHTML = "&times;"; //×
cryptoCase = "bad";
}
var protocolCase = "";
switch (window.location.protocol) {
case 'file:':
document.getElementById("statusprotocol").innerHTML = "&#10004;"; //✔
protocolCase = "good";
break;
case 'http:':
case 'https:':
document.getElementById("statusprotocol").innerHTML = "&#9888;"; //⚠
protocolCase = "bad";
break;
default:
}
var showCrypto = function () {
document.getElementById('statuscrypto' + cryptoCase).style.display = 'block';
};
var showProtocol = function () {
document.getElementById('statusprotocol' + protocolCase).style.display = 'block';
};
var showKeyPool = function () {
document.getElementById('statuskeypoolgood').style.display = 'block';
document.getElementById("keypooltextarea").value = Bitcoin.KeyPool.toString();
};
return {
showCrypto: showCrypto, showProtocol: showProtocol, showKeyPool: showKeyPool
};
}();
})(ninja);
ninja.tab = {
select: function (walletTab) {
// detect type: normally an HtmlElement/object but when string then get the element
if (typeof walletTab === 'string') {
walletTab = document.getElementById(walletTab);
}
var walletType = walletTab.getAttribute("id");
if (walletTab.className.indexOf("selected") == -1) {
// unselect all tabs
for (var wType in ninja.wallets) {
document.getElementById(wType).className = "tab";
ninja.wallets[wType].close();
}
// don't open tab if entropy still being collected
// exceptions: brainwallet detailwallet
if (ninja.seeder.isStillSeeding == false || walletType == "brainwallet" || walletType == "detailwallet") {
walletTab.className += " selected";
document.getElementById("generate").style.display = "none";
ninja.wallets[walletTab.getAttribute("id")].open();
}
else if (ninja.seeder.isStillSeeding == true && !(walletType == "brainwallet" || walletType == "detailwallet")) {
document.getElementById("generate").style.display = "block";
}
}
},
whichIsOpen: function () {
var isOpen;
for (var wType in ninja.wallets) {
isOpen = ninja.wallets[wType].isOpen();
if (isOpen) {
return wType;
}
}
return null;
}
};
ninja.getQueryString = function () {
var result = {}, queryString = location.search.substring(1), re = /([^&=]+)=([^&]*)/g, m;
while (m = re.exec(queryString)) {
result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
}
return result;
};
// use when passing an Array of Functions
ninja.runSerialized = function (functions, onComplete) {
onComplete = onComplete || function () { };
if (functions.length === 0) onComplete();
else {
// run the first function, and make it call this
// function when finished with the rest of the list
var f = functions.shift();
f(function () { ninja.runSerialized(functions, onComplete); });
}
};
ninja.forSerialized = function (initial, max, whatToDo, onComplete) {
onComplete = onComplete || function () { };
if (initial === max) { onComplete(); }
else {
// same idea as runSerialized
whatToDo(initial, function () { ninja.forSerialized(++initial, max, whatToDo, onComplete); });
}
};
// use when passing an Object (dictionary) of Functions
ninja.foreachSerialized = function (collection, whatToDo, onComplete) {
var keys = [];
for (var name in collection) {
keys.push(name);
}
ninja.forSerialized(0, keys.length, function (i, callback) {
whatToDo(keys[i], callback);
}, onComplete);
};
</script>
<script type="text/javascript">
(function (wallets, qrCode) {
var single = wallets.singlewallet = {
isOpen: function () {
return (document.getElementById("singlewallet").className.indexOf("selected") != -1);
},
open: function () {
if (document.getElementById("btcaddress").innerHTML == "") {
single.generateNewAddressAndKey();
}
document.getElementById("singlearea").style.display = "block";
},
close: function () {
document.getElementById("singlearea").style.display = "none";
},
// generate bitcoin address and private key and update information in the HTML
generateNewAddressAndKey: function () {
try {
var key = new Bitcoin.ECKey(false);
key.setCompressed(true);
var bitcoinAddress = key.getBitcoinAddress();
var privateKeyWif = key.getBitcoinWalletImportFormat();
document.getElementById("btcaddress").innerHTML = bitcoinAddress;
document.getElementById("btcprivwif").innerHTML = privateKeyWif;
var keyValuePair = {
"qrcode_public": bitcoinAddress,
"qrcode_private": privateKeyWif
};
qrCode.showQrCode(keyValuePair, 4);
}
catch (e) {
// browser does not have sufficient JavaScript support to generate a bitcoin address
alert(e);
document.getElementById("btcaddress").innerHTML = "error";
document.getElementById("btcprivwif").innerHTML = "error";
document.getElementById("qrcode_public").innerHTML = "";
document.getElementById("qrcode_private").innerHTML = "";
}
}
};
})(ninja.wallets, ninja.qrCode);
</script>
<script type="text/javascript">
ninja.wallets.paperwallet = {
isOpen: function () {
return (document.getElementById("paperwallet").className.indexOf("selected") != -1);
},
open: function () {
document.getElementById("main").setAttribute("class", "paper"); // add 'paper' class to main div
var paperArea = document.getElementById("paperarea");
paperArea.style.display = "block";
var perPageLimitElement = document.getElementById("paperlimitperpage");
var limitElement = document.getElementById("paperlimit");
var pageBreakAt = (ninja.wallets.paperwallet.useArtisticWallet) ? ninja.wallets.paperwallet.pageBreakAtArtisticDefault : ninja.wallets.paperwallet.pageBreakAtDefault;
if (perPageLimitElement && perPageLimitElement.value < 1) {
perPageLimitElement.value = pageBreakAt;
}
if (limitElement && limitElement.value < 1) {
limitElement.value = pageBreakAt;
}
if (document.getElementById("paperkeyarea").innerHTML == "") {
document.getElementById("paperpassphrase").disabled = true;
document.getElementById("paperencrypt").checked = false;
ninja.wallets.paperwallet.encrypt = false;
ninja.wallets.paperwallet.build(pageBreakAt, pageBreakAt, !document.getElementById('paperart').checked, document.getElementById('paperpassphrase').value);
}
},
close: function () {
document.getElementById("paperarea").style.display = "none";
document.getElementById("main").setAttribute("class", ""); // remove 'paper' class from main div
},
remaining: null, // use to keep track of how many addresses are left to process when building the paper wallet
count: 0,
pageBreakAtDefault: 7,
pageBreakAtArtisticDefault: 3,
useArtisticWallet: true,
pageBreakAt: null,
build: function (numWallets, pageBreakAt, useArtisticWallet, passphrase) {
if (numWallets < 1) numWallets = 1;
if (pageBreakAt < 1) pageBreakAt = 1;
ninja.wallets.paperwallet.remaining = numWallets;
ninja.wallets.paperwallet.count = 0;
ninja.wallets.paperwallet.useArtisticWallet = useArtisticWallet;
ninja.wallets.paperwallet.pageBreakAt = pageBreakAt;
document.getElementById("paperkeyarea").innerHTML = "";
if (ninja.wallets.paperwallet.encrypt) {
if (passphrase == "") {
alert(ninja.translator.get("bip38alertpassphraserequired"));
return;
}
document.getElementById("busyblock").className = "busy";
ninja.privateKey.BIP38GenerateIntermediatePointAsync(passphrase, null, null, function (intermediate) {
ninja.wallets.paperwallet.intermediatePoint = intermediate;
document.getElementById("busyblock").className = "";
setTimeout(ninja.wallets.paperwallet.batch, 0);
});
}
else {
setTimeout(ninja.wallets.paperwallet.batch, 0);
}
},
batch: function () {
if (ninja.wallets.paperwallet.remaining > 0) {
var paperArea = document.getElementById("paperkeyarea");
ninja.wallets.paperwallet.count++;
var i = ninja.wallets.paperwallet.count;
var pageBreakAt = ninja.wallets.paperwallet.pageBreakAt;
var div = document.createElement("div");
div.setAttribute("id", "keyarea" + i);
if (ninja.wallets.paperwallet.useArtisticWallet) {
div.innerHTML = ninja.wallets.paperwallet.templateArtisticHtml(i);
div.setAttribute("class", "keyarea art");
}
else {
div.innerHTML = ninja.wallets.paperwallet.templateHtml(i);
div.setAttribute("class", "keyarea");
}
if (paperArea.innerHTML != "") {
// page break
if ((i - 1) % pageBreakAt == 0 && i >= pageBreakAt) {
var pBreak = document.createElement("div");
pBreak.setAttribute("class", "pagebreak");
document.getElementById("paperkeyarea").appendChild(pBreak);
div.style.pageBreakBefore = "always";
if (!ninja.wallets.paperwallet.useArtisticWallet) {
div.style.borderTop = "2px solid green";
}
}
}
document.getElementById("paperkeyarea").appendChild(div);
ninja.wallets.paperwallet.generateNewWallet(i);
ninja.wallets.paperwallet.remaining--;
setTimeout(ninja.wallets.paperwallet.batch, 0);
}
},
// generate bitcoin address, private key, QR Code and update information in the HTML
// idPostFix: 1, 2, 3, etc.
generateNewWallet: function (idPostFix) {
if (ninja.wallets.paperwallet.encrypt) {
var compressed = true;
ninja.privateKey.BIP38GenerateECAddressAsync(ninja.wallets.paperwallet.intermediatePoint, compressed, function (address, encryptedKey) {
Bitcoin.KeyPool.push(new Bitcoin.Bip38Key(address, encryptedKey));
if (ninja.wallets.paperwallet.useArtisticWallet) {
ninja.wallets.paperwallet.showArtisticWallet(idPostFix, address, encryptedKey);
}
else {
ninja.wallets.paperwallet.showWallet(idPostFix, address, encryptedKey);
}
});
}
else {
var key = new Bitcoin.ECKey(false);
key.setCompressed(true);
var bitcoinAddress = key.getBitcoinAddress();
var privateKeyWif = key.getBitcoinWalletImportFormat();
if (ninja.wallets.paperwallet.useArtisticWallet) {
ninja.wallets.paperwallet.showArtisticWallet(idPostFix, bitcoinAddress, privateKeyWif);
}
else {
ninja.wallets.paperwallet.showWallet(idPostFix, bitcoinAddress, privateKeyWif);
}
}
},
templateHtml: function (i) {
var privateKeyLabel = "Private Key:"
var walletHtml =
"<div class='public'>" +
"<div id='qrcode_public" + i + "' class='qrcode_public'></div>" +
"<div class='pubaddress'>" +
"<span class='label'>SmartCash Address:</span>" +
"<span class='output' id='btcaddress" + i + "'></span>" +
"</div>" +
"</div>" +
"<div class='private'>" +
"<div id='qrcode_private" + i + "' class='qrcode_private'></div>" +
"<div class='privwif'>" +
"<span class='label'>" + privateKeyLabel + "</span>" +
"<span class='output' id='btcprivwif" + i + "'></span>" +
"</div>" +
"</div>";
return walletHtml;
},
showWallet: function (idPostFix, bitcoinAddress, privateKey) {
document.getElementById("btcaddress" + idPostFix).innerHTML = bitcoinAddress;
document.getElementById("btcprivwif" + idPostFix).innerHTML = privateKey;
var keyValuePair = {};
keyValuePair["qrcode_public" + idPostFix] = bitcoinAddress;
keyValuePair["qrcode_private" + idPostFix] = privateKey;
ninja.qrCode.showQrCode(keyValuePair);
document.getElementById("keyarea" + idPostFix).style.display = "block";
},
templateArtisticHtml: function (i) {
var keyelement = 'btcprivwif';
var image = 'data:image/jpeg;base64,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';
if (ninja.wallets.paperwallet.encrypt) {
keyelement = 'btcencryptedkey'
}
var walletHtml =
"<div class='artwallet' id='artwallet" + i + "'>" +
//"<iframe src='bitcoin-wallet-01.svg' id='papersvg" + i + "' class='papersvg' ></iframe>" +
"<img id='papersvg" + i + "' class='papersvg' src='" + image + "' />" +
"<div id='qrcode_public" + i + "' class='qrcode_public'></div>" +
"<div id='qrcode_private" + i + "' class='qrcode_private'></div>" +
"<div class='btcaddress' id='btcaddress" + i + "'></div>" +
"<div class='" + keyelement + "' id='" + keyelement + i + "'></div>" +
"</div>";
return walletHtml;
},
showArtisticWallet: function (idPostFix, bitcoinAddress, privateKey) {
var keyValuePair = {};
keyValuePair["qrcode_public" + idPostFix] = bitcoinAddress;
keyValuePair["qrcode_private" + idPostFix] = privateKey;
ninja.qrCode.showQrCode(keyValuePair, 2.5);
document.getElementById("btcaddress" + idPostFix).innerHTML = bitcoinAddress;
if (ninja.wallets.paperwallet.encrypt) {
var half = privateKey.length / 2;
document.getElementById("btcencryptedkey" + idPostFix).innerHTML = privateKey.slice(0, half) + '<br />' + privateKey.slice(half);
}
else {
document.getElementById("btcprivwif" + idPostFix).innerHTML = privateKey;
}
// CODE to modify SVG DOM elements
//var paperSvg = document.getElementById("papersvg" + idPostFix);
//if (paperSvg) {
// svgDoc = paperSvg.contentDocument;
// if (svgDoc) {
// var bitcoinAddressElement = svgDoc.getElementById("bitcoinaddress");
// var privateKeyElement = svgDoc.getElementById("privatekey");
// if (bitcoinAddressElement && privateKeyElement) {
// bitcoinAddressElement.textContent = bitcoinAddress;
// privateKeyElement.textContent = privateKeyWif;
// }
// }
//}
},
toggleArt: function (element) {
ninja.wallets.paperwallet.resetLimits();
},
toggleEncrypt: function (element) {
// enable/disable passphrase textbox
document.getElementById("paperpassphrase").disabled = !element.checked;
ninja.wallets.paperwallet.encrypt = element.checked;
ninja.wallets.paperwallet.resetLimits();
},
resetLimits: function () {
var hideArt = document.getElementById("paperart");
var paperEncrypt = document.getElementById("paperencrypt");
var limit;
var limitperpage;
document.getElementById("paperkeyarea").style.fontSize = "100%";
if (!hideArt.checked) {
limit = ninja.wallets.paperwallet.pageBreakAtArtisticDefault;
limitperpage = ninja.wallets.paperwallet.pageBreakAtArtisticDefault;
}
else if (hideArt.checked && paperEncrypt.checked) {
limit = ninja.wallets.paperwallet.pageBreakAtDefault;
limitperpage = ninja.wallets.paperwallet.pageBreakAtDefault;
// reduce font size
document.getElementById("paperkeyarea").style.fontSize = "95%";
}
else if (hideArt.checked && !paperEncrypt.checked) {
limit = ninja.wallets.paperwallet.pageBreakAtDefault;
limitperpage = ninja.wallets.paperwallet.pageBreakAtDefault;
}
document.getElementById("paperlimitperpage").value = limitperpage;
document.getElementById("paperlimit").value = limit;
}
};
</script>
<script type="text/javascript">
(function (wallets, qrCode) {
var single = wallets.singlewallet = {
isOpen: function () {
return (document.getElementById("singlewallet").className.indexOf("selected") != -1);
},
open: function () {
if (document.getElementById("btcaddress").innerHTML == "") {
single.generateNewAddressAndKey();
}
document.getElementById("singlearea").style.display = "block";
},
close: function () {
document.getElementById("singlearea").style.display = "none";
},
// generate bitcoin address and private key and update information in the HTML
generateNewAddressAndKey: function () {
try {
var key = new Bitcoin.ECKey(false);
key.setCompressed(true);
var bitcoinAddress = key.getBitcoinAddress();
var privateKeyWif = key.getBitcoinWalletImportFormat();
document.getElementById("btcaddress").innerHTML = bitcoinAddress;
document.getElementById("btcprivwif").innerHTML = privateKeyWif;
var keyValuePair = {
"qrcode_public": bitcoinAddress,
"qrcode_private": privateKeyWif
};
qrCode.showQrCode(keyValuePair, 4);
}
catch (e) {
// browser does not have sufficient JavaScript support to generate a bitcoin address
alert(e);
document.getElementById("btcaddress").innerHTML = "error";
document.getElementById("btcprivwif").innerHTML = "error";
document.getElementById("qrcode_public").innerHTML = "";
document.getElementById("qrcode_private").innerHTML = "";
}
}
};
})(ninja.wallets, ninja.qrCode);
</script>
<script type="text/javascript">
if (ninja.getQueryString()["showseedpool"] == "true" || ninja.getQueryString()["showseedpool"] == "1") {
document.getElementById("seedpoolarea").style.display = "block";
}
</script>
</body>
</html>