github.com/intfoundation/intchain@v0.0.0-20220727031208-4316ad31ca73/internal/jsre/deps/web3.js (about)

     1  require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
     2  module.exports=[
     3    {
     4      "constant": true,
     5      "inputs": [
     6        {
     7          "name": "_owner",
     8          "type": "address"
     9        }
    10      ],
    11      "name": "name",
    12      "outputs": [
    13        {
    14          "name": "o_name",
    15          "type": "bytes32"
    16        }
    17      ],
    18      "type": "function"
    19    },
    20    {
    21      "constant": true,
    22      "inputs": [
    23        {
    24          "name": "_name",
    25          "type": "bytes32"
    26        }
    27      ],
    28      "name": "owner",
    29      "outputs": [
    30        {
    31          "name": "",
    32          "type": "address"
    33        }
    34      ],
    35      "type": "function"
    36    },
    37    {
    38      "constant": true,
    39      "inputs": [
    40        {
    41          "name": "_name",
    42          "type": "bytes32"
    43        }
    44      ],
    45      "name": "content",
    46      "outputs": [
    47        {
    48          "name": "",
    49          "type": "bytes32"
    50        }
    51      ],
    52      "type": "function"
    53    },
    54    {
    55      "constant": true,
    56      "inputs": [
    57        {
    58          "name": "_name",
    59          "type": "bytes32"
    60        }
    61      ],
    62      "name": "addr",
    63      "outputs": [
    64        {
    65          "name": "",
    66          "type": "address"
    67        }
    68      ],
    69      "type": "function"
    70    },
    71    {
    72      "constant": false,
    73      "inputs": [
    74        {
    75          "name": "_name",
    76          "type": "bytes32"
    77        }
    78      ],
    79      "name": "reserve",
    80      "outputs": [],
    81      "type": "function"
    82    },
    83    {
    84      "constant": true,
    85      "inputs": [
    86        {
    87          "name": "_name",
    88          "type": "bytes32"
    89        }
    90      ],
    91      "name": "subRegistrar",
    92      "outputs": [
    93        {
    94          "name": "",
    95          "type": "address"
    96        }
    97      ],
    98      "type": "function"
    99    },
   100    {
   101      "constant": false,
   102      "inputs": [
   103        {
   104          "name": "_name",
   105          "type": "bytes32"
   106        },
   107        {
   108          "name": "_newOwner",
   109          "type": "address"
   110        }
   111      ],
   112      "name": "transfer",
   113      "outputs": [],
   114      "type": "function"
   115    },
   116    {
   117      "constant": false,
   118      "inputs": [
   119        {
   120          "name": "_name",
   121          "type": "bytes32"
   122        },
   123        {
   124          "name": "_registrar",
   125          "type": "address"
   126        }
   127      ],
   128      "name": "setSubRegistrar",
   129      "outputs": [],
   130      "type": "function"
   131    },
   132    {
   133      "constant": false,
   134      "inputs": [],
   135      "name": "Registrar",
   136      "outputs": [],
   137      "type": "function"
   138    },
   139    {
   140      "constant": false,
   141      "inputs": [
   142        {
   143          "name": "_name",
   144          "type": "bytes32"
   145        },
   146        {
   147          "name": "_a",
   148          "type": "address"
   149        },
   150        {
   151          "name": "_primary",
   152          "type": "bool"
   153        }
   154      ],
   155      "name": "setAddress",
   156      "outputs": [],
   157      "type": "function"
   158    },
   159    {
   160      "constant": false,
   161      "inputs": [
   162        {
   163          "name": "_name",
   164          "type": "bytes32"
   165        },
   166        {
   167          "name": "_content",
   168          "type": "bytes32"
   169        }
   170      ],
   171      "name": "setContent",
   172      "outputs": [],
   173      "type": "function"
   174    },
   175    {
   176      "constant": false,
   177      "inputs": [
   178        {
   179          "name": "_name",
   180          "type": "bytes32"
   181        }
   182      ],
   183      "name": "disown",
   184      "outputs": [],
   185      "type": "function"
   186    },
   187    {
   188      "anonymous": false,
   189      "inputs": [
   190        {
   191          "indexed": true,
   192          "name": "_name",
   193          "type": "bytes32"
   194        },
   195        {
   196          "indexed": false,
   197          "name": "_winner",
   198          "type": "address"
   199        }
   200      ],
   201      "name": "AuctionEnded",
   202      "type": "event"
   203    },
   204    {
   205      "anonymous": false,
   206      "inputs": [
   207        {
   208          "indexed": true,
   209          "name": "_name",
   210          "type": "bytes32"
   211        },
   212        {
   213          "indexed": false,
   214          "name": "_bidder",
   215          "type": "address"
   216        },
   217        {
   218          "indexed": false,
   219          "name": "_value",
   220          "type": "uint256"
   221        }
   222      ],
   223      "name": "NewBid",
   224      "type": "event"
   225    },
   226    {
   227      "anonymous": false,
   228      "inputs": [
   229        {
   230          "indexed": true,
   231          "name": "name",
   232          "type": "bytes32"
   233        }
   234      ],
   235      "name": "Changed",
   236      "type": "event"
   237    },
   238    {
   239      "anonymous": false,
   240      "inputs": [
   241        {
   242          "indexed": true,
   243          "name": "name",
   244          "type": "bytes32"
   245        },
   246        {
   247          "indexed": true,
   248          "name": "addr",
   249          "type": "address"
   250        }
   251      ],
   252      "name": "PrimaryChanged",
   253      "type": "event"
   254    }
   255  ]
   256  
   257  },{}],2:[function(require,module,exports){
   258  module.exports=[
   259    {
   260      "constant": true,
   261      "inputs": [
   262        {
   263          "name": "_name",
   264          "type": "bytes32"
   265        }
   266      ],
   267      "name": "owner",
   268      "outputs": [
   269        {
   270          "name": "",
   271          "type": "address"
   272        }
   273      ],
   274      "type": "function"
   275    },
   276    {
   277      "constant": false,
   278      "inputs": [
   279        {
   280          "name": "_name",
   281          "type": "bytes32"
   282        },
   283        {
   284          "name": "_refund",
   285          "type": "address"
   286        }
   287      ],
   288      "name": "disown",
   289      "outputs": [],
   290      "type": "function"
   291    },
   292    {
   293      "constant": true,
   294      "inputs": [
   295        {
   296          "name": "_name",
   297          "type": "bytes32"
   298        }
   299      ],
   300      "name": "addr",
   301      "outputs": [
   302        {
   303          "name": "",
   304          "type": "address"
   305        }
   306      ],
   307      "type": "function"
   308    },
   309    {
   310      "constant": false,
   311      "inputs": [
   312        {
   313          "name": "_name",
   314          "type": "bytes32"
   315        }
   316      ],
   317      "name": "reserve",
   318      "outputs": [],
   319      "type": "function"
   320    },
   321    {
   322      "constant": false,
   323      "inputs": [
   324        {
   325          "name": "_name",
   326          "type": "bytes32"
   327        },
   328        {
   329          "name": "_newOwner",
   330          "type": "address"
   331        }
   332      ],
   333      "name": "transfer",
   334      "outputs": [],
   335      "type": "function"
   336    },
   337    {
   338      "constant": false,
   339      "inputs": [
   340        {
   341          "name": "_name",
   342          "type": "bytes32"
   343        },
   344        {
   345          "name": "_a",
   346          "type": "address"
   347        }
   348      ],
   349      "name": "setAddr",
   350      "outputs": [],
   351      "type": "function"
   352    },
   353    {
   354      "anonymous": false,
   355      "inputs": [
   356        {
   357          "indexed": true,
   358          "name": "name",
   359          "type": "bytes32"
   360        }
   361      ],
   362      "name": "Changed",
   363      "type": "event"
   364    }
   365  ]
   366  
   367  },{}],3:[function(require,module,exports){
   368  module.exports=[
   369    {
   370      "constant": false,
   371      "inputs": [
   372        {
   373          "name": "from",
   374          "type": "bytes32"
   375        },
   376        {
   377          "name": "to",
   378          "type": "address"
   379        },
   380        {
   381          "name": "value",
   382          "type": "uint256"
   383        }
   384      ],
   385      "name": "transfer",
   386      "outputs": [],
   387      "type": "function"
   388    },
   389    {
   390      "constant": false,
   391      "inputs": [
   392        {
   393          "name": "from",
   394          "type": "bytes32"
   395        },
   396        {
   397          "name": "to",
   398          "type": "address"
   399        },
   400        {
   401          "name": "indirectId",
   402          "type": "bytes32"
   403        },
   404        {
   405          "name": "value",
   406          "type": "uint256"
   407        }
   408      ],
   409      "name": "icapTransfer",
   410      "outputs": [],
   411      "type": "function"
   412    },
   413    {
   414      "constant": false,
   415      "inputs": [
   416        {
   417          "name": "to",
   418          "type": "bytes32"
   419        }
   420      ],
   421      "name": "deposit",
   422      "outputs": [],
   423      "payable": true,
   424      "type": "function"
   425    },
   426    {
   427      "anonymous": false,
   428      "inputs": [
   429        {
   430          "indexed": true,
   431          "name": "from",
   432          "type": "address"
   433        },
   434        {
   435          "indexed": false,
   436          "name": "value",
   437          "type": "uint256"
   438        }
   439      ],
   440      "name": "AnonymousDeposit",
   441      "type": "event"
   442    },
   443    {
   444      "anonymous": false,
   445      "inputs": [
   446        {
   447          "indexed": true,
   448          "name": "from",
   449          "type": "address"
   450        },
   451        {
   452          "indexed": true,
   453          "name": "to",
   454          "type": "bytes32"
   455        },
   456        {
   457          "indexed": false,
   458          "name": "value",
   459          "type": "uint256"
   460        }
   461      ],
   462      "name": "Deposit",
   463      "type": "event"
   464    },
   465    {
   466      "anonymous": false,
   467      "inputs": [
   468        {
   469          "indexed": true,
   470          "name": "from",
   471          "type": "bytes32"
   472        },
   473        {
   474          "indexed": true,
   475          "name": "to",
   476          "type": "address"
   477        },
   478        {
   479          "indexed": false,
   480          "name": "value",
   481          "type": "uint256"
   482        }
   483      ],
   484      "name": "Transfer",
   485      "type": "event"
   486    },
   487    {
   488      "anonymous": false,
   489      "inputs": [
   490        {
   491          "indexed": true,
   492          "name": "from",
   493          "type": "bytes32"
   494        },
   495        {
   496          "indexed": true,
   497          "name": "to",
   498          "type": "address"
   499        },
   500        {
   501          "indexed": false,
   502          "name": "indirectId",
   503          "type": "bytes32"
   504        },
   505        {
   506          "indexed": false,
   507          "name": "value",
   508          "type": "uint256"
   509        }
   510      ],
   511      "name": "IcapTransfer",
   512      "type": "event"
   513    }
   514  ]
   515  
   516  },{}],4:[function(require,module,exports){
   517  var f = require('./formatters');
   518  var SolidityType = require('./type');
   519  
   520  /**
   521   * SolidityTypeAddress is a prootype that represents address type
   522   * It matches:
   523   * address
   524   * address[]
   525   * address[4]
   526   * address[][]
   527   * address[3][]
   528   * address[][6][], ...
   529   */
   530  var SolidityTypeAddress = function () {
   531      this._inputFormatter = f.formatInputInt;
   532      this._outputFormatter = f.formatOutputAddress;
   533  };
   534  
   535  SolidityTypeAddress.prototype = new SolidityType({});
   536  SolidityTypeAddress.prototype.constructor = SolidityTypeAddress;
   537  
   538  SolidityTypeAddress.prototype.isType = function (name) {
   539      return !!name.match(/address(\[([0-9]*)\])?/);
   540  };
   541  
   542  module.exports = SolidityTypeAddress;
   543  
   544  },{"./formatters":9,"./type":14}],5:[function(require,module,exports){
   545  var f = require('./formatters');
   546  var SolidityType = require('./type');
   547  
   548  /**
   549   * SolidityTypeBool is a prootype that represents bool type
   550   * It matches:
   551   * bool
   552   * bool[]
   553   * bool[4]
   554   * bool[][]
   555   * bool[3][]
   556   * bool[][6][], ...
   557   */
   558  var SolidityTypeBool = function () {
   559      this._inputFormatter = f.formatInputBool;
   560      this._outputFormatter = f.formatOutputBool;
   561  };
   562  
   563  SolidityTypeBool.prototype = new SolidityType({});
   564  SolidityTypeBool.prototype.constructor = SolidityTypeBool;
   565  
   566  SolidityTypeBool.prototype.isType = function (name) {
   567      return !!name.match(/^bool(\[([0-9]*)\])*$/);
   568  };
   569  
   570  module.exports = SolidityTypeBool;
   571  
   572  },{"./formatters":9,"./type":14}],6:[function(require,module,exports){
   573  var f = require('./formatters');
   574  var SolidityType = require('./type');
   575  
   576  /**
   577   * SolidityTypeBytes is a prototype that represents the bytes type.
   578   * It matches:
   579   * bytes
   580   * bytes[]
   581   * bytes[4]
   582   * bytes[][]
   583   * bytes[3][]
   584   * bytes[][6][], ...
   585   * bytes32
   586   * bytes8[4]
   587   * bytes[3][]
   588   */
   589  var SolidityTypeBytes = function () {
   590      this._inputFormatter = f.formatInputBytes;
   591      this._outputFormatter = f.formatOutputBytes;
   592  };
   593  
   594  SolidityTypeBytes.prototype = new SolidityType({});
   595  SolidityTypeBytes.prototype.constructor = SolidityTypeBytes;
   596  
   597  SolidityTypeBytes.prototype.isType = function (name) {
   598      return !!name.match(/^bytes([0-9]{1,})(\[([0-9]*)\])*$/);
   599  };
   600  
   601  module.exports = SolidityTypeBytes;
   602  
   603  },{"./formatters":9,"./type":14}],7:[function(require,module,exports){
   604  /*
   605      This file is part of web3.js.
   606  
   607      web3.js is free software: you can redistribute it and/or modify
   608      it under the terms of the GNU Lesser General Public License as published by
   609      the Free Software Foundation, either version 3 of the License, or
   610      (at your option) any later version.
   611  
   612      web3.js is distributed in the hope that it will be useful,
   613      but WITHOUT ANY WARRANTY; without even the implied warranty of
   614      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   615      GNU Lesser General Public License for more details.
   616  
   617      You should have received a copy of the GNU Lesser General Public License
   618      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
   619  */
   620  /**
   621   * @file coder.js
   622   * @author Marek Kotewicz <marek@ethdev.com>
   623   * @date 2015
   624   */
   625  
   626  var f = require('./formatters');
   627  
   628  var SolidityTypeAddress = require('./address');
   629  var SolidityTypeBool = require('./bool');
   630  var SolidityTypeInt = require('./int');
   631  var SolidityTypeUInt = require('./uint');
   632  var SolidityTypeDynamicBytes = require('./dynamicbytes');
   633  var SolidityTypeString = require('./string');
   634  var SolidityTypeReal = require('./real');
   635  var SolidityTypeUReal = require('./ureal');
   636  var SolidityTypeBytes = require('./bytes');
   637  
   638  var isDynamic = function (solidityType, type) {
   639     return solidityType.isDynamicType(type) ||
   640            solidityType.isDynamicArray(type);
   641  };
   642  
   643  /**
   644   * SolidityCoder prototype should be used to encode/decode solidity params of any type
   645   */
   646  var SolidityCoder = function (types) {
   647      this._types = types;
   648  };
   649  
   650  /**
   651   * This method should be used to transform type to SolidityType
   652   *
   653   * @method _requireType
   654   * @param {String} type
   655   * @returns {SolidityType}
   656   * @throws {Error} throws if no matching type is found
   657   */
   658  SolidityCoder.prototype._requireType = function (type) {
   659      var solidityType = this._types.filter(function (t) {
   660          return t.isType(type);
   661      })[0];
   662  
   663      if (!solidityType) {
   664          throw Error('invalid solidity type!: ' + type);
   665      }
   666  
   667      return solidityType;
   668  };
   669  
   670  /**
   671   * Should be used to encode plain param
   672   *
   673   * @method encodeParam
   674   * @param {String} type
   675   * @param {Object} plain param
   676   * @return {String} encoded plain param
   677   */
   678  SolidityCoder.prototype.encodeParam = function (type, param) {
   679      return this.encodeParams([type], [param]);
   680  };
   681  
   682  /**
   683   * Should be used to encode list of params
   684   *
   685   * @method encodeParams
   686   * @param {Array} types
   687   * @param {Array} params
   688   * @return {String} encoded list of params
   689   */
   690  SolidityCoder.prototype.encodeParams = function (types, params) {
   691      var solidityTypes = this.getSolidityTypes(types);
   692  
   693      var encodeds = solidityTypes.map(function (solidityType, index) {
   694          return solidityType.encode(params[index], types[index]);
   695      });
   696  
   697      var dynamicOffset = solidityTypes.reduce(function (acc, solidityType, index) {
   698          var staticPartLength = solidityType.staticPartLength(types[index]);
   699          var roundedStaticPartLength = Math.floor((staticPartLength + 31) / 32) * 32;
   700  
   701          return acc + (isDynamic(solidityTypes[index], types[index]) ?
   702              32 :
   703              roundedStaticPartLength);
   704      }, 0);
   705  
   706      var result = this.encodeMultiWithOffset(types, solidityTypes, encodeds, dynamicOffset);
   707  
   708      return result;
   709  };
   710  
   711  SolidityCoder.prototype.encodeMultiWithOffset = function (types, solidityTypes, encodeds, dynamicOffset) {
   712      var result = "";
   713      var self = this;
   714  
   715      types.forEach(function (type, i) {
   716          if (isDynamic(solidityTypes[i], types[i])) {
   717              result += f.formatInputInt(dynamicOffset).encode();
   718              var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);
   719              dynamicOffset += e.length / 2;
   720          } else {
   721              // don't add length to dynamicOffset. it's already counted
   722              result += self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);
   723          }
   724  
   725          // TODO: figure out nested arrays
   726      });
   727  
   728      types.forEach(function (type, i) {
   729          if (isDynamic(solidityTypes[i], types[i])) {
   730              var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);
   731              dynamicOffset += e.length / 2;
   732              result += e;
   733          }
   734      });
   735      return result;
   736  };
   737  
   738  // TODO: refactor whole encoding!
   739  SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded, offset) {
   740      var self = this;
   741      if (solidityType.isDynamicArray(type)) {
   742          return (function () {
   743              // offset was already set
   744              var nestedName = solidityType.nestedName(type);
   745              var nestedStaticPartLength = solidityType.staticPartLength(nestedName);
   746              var result = encoded[0];
   747  
   748              (function () {
   749                  var previousLength = 2; // in int
   750                  if (solidityType.isDynamicArray(nestedName)) {
   751                      for (var i = 1; i < encoded.length; i++) {
   752                          previousLength += +(encoded[i - 1])[0] || 0;
   753                          result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode();
   754                      }
   755                  }
   756              })();
   757  
   758              // first element is length, skip it
   759              (function () {
   760                  for (var i = 0; i < encoded.length - 1; i++) {
   761                      var additionalOffset = result / 2;
   762                      result += self.encodeWithOffset(nestedName, solidityType, encoded[i + 1], offset +  additionalOffset);
   763                  }
   764              })();
   765  
   766              return result;
   767          })();
   768  
   769      } else if (solidityType.isStaticArray(type)) {
   770          return (function () {
   771              var nestedName = solidityType.nestedName(type);
   772              var nestedStaticPartLength = solidityType.staticPartLength(nestedName);
   773              var result = "";
   774  
   775  
   776              if (solidityType.isDynamicArray(nestedName)) {
   777                  (function () {
   778                      var previousLength = 0; // in int
   779                      for (var i = 0; i < encoded.length; i++) {
   780                          // calculate length of previous item
   781                          previousLength += +(encoded[i - 1] || [])[0] || 0;
   782                          result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode();
   783                      }
   784                  })();
   785              }
   786  
   787              (function () {
   788                  for (var i = 0; i < encoded.length; i++) {
   789                      var additionalOffset = result / 2;
   790                      result += self.encodeWithOffset(nestedName, solidityType, encoded[i], offset + additionalOffset);
   791                  }
   792              })();
   793  
   794              return result;
   795          })();
   796      }
   797  
   798      return encoded;
   799  };
   800  
   801  /**
   802   * Should be used to decode bytes to plain param
   803   *
   804   * @method decodeParam
   805   * @param {String} type
   806   * @param {String} bytes
   807   * @return {Object} plain param
   808   */
   809  SolidityCoder.prototype.decodeParam = function (type, bytes) {
   810      return this.decodeParams([type], bytes)[0];
   811  };
   812  
   813  /**
   814   * Should be used to decode list of params
   815   *
   816   * @method decodeParam
   817   * @param {Array} types
   818   * @param {String} bytes
   819   * @return {Array} array of plain params
   820   */
   821  SolidityCoder.prototype.decodeParams = function (types, bytes) {
   822      var solidityTypes = this.getSolidityTypes(types);
   823      var offsets = this.getOffsets(types, solidityTypes);
   824  
   825      return solidityTypes.map(function (solidityType, index) {
   826          return solidityType.decode(bytes, offsets[index],  types[index], index);
   827      });
   828  };
   829  
   830  SolidityCoder.prototype.getOffsets = function (types, solidityTypes) {
   831      var lengths =  solidityTypes.map(function (solidityType, index) {
   832          return solidityType.staticPartLength(types[index]);
   833      });
   834  
   835      for (var i = 1; i < lengths.length; i++) {
   836           // sum with length of previous element
   837          lengths[i] += lengths[i - 1];
   838      }
   839  
   840      return lengths.map(function (length, index) {
   841          // remove the current length, so the length is sum of previous elements
   842          var staticPartLength = solidityTypes[index].staticPartLength(types[index]);
   843          return length - staticPartLength;
   844      });
   845  };
   846  
   847  SolidityCoder.prototype.getSolidityTypes = function (types) {
   848      var self = this;
   849      return types.map(function (type) {
   850          return self._requireType(type);
   851      });
   852  };
   853  
   854  var coder = new SolidityCoder([
   855      new SolidityTypeAddress(),
   856      new SolidityTypeBool(),
   857      new SolidityTypeInt(),
   858      new SolidityTypeUInt(),
   859      new SolidityTypeDynamicBytes(),
   860      new SolidityTypeBytes(),
   861      new SolidityTypeString(),
   862      new SolidityTypeReal(),
   863      new SolidityTypeUReal()
   864  ]);
   865  
   866  module.exports = coder;
   867  
   868  },{"./address":4,"./bool":5,"./bytes":6,"./dynamicbytes":8,"./formatters":9,"./int":10,"./real":12,"./string":13,"./uint":15,"./ureal":16}],8:[function(require,module,exports){
   869  var f = require('./formatters');
   870  var SolidityType = require('./type');
   871  
   872  var SolidityTypeDynamicBytes = function () {
   873      this._inputFormatter = f.formatInputDynamicBytes;
   874      this._outputFormatter = f.formatOutputDynamicBytes;
   875  };
   876  
   877  SolidityTypeDynamicBytes.prototype = new SolidityType({});
   878  SolidityTypeDynamicBytes.prototype.constructor = SolidityTypeDynamicBytes;
   879  
   880  SolidityTypeDynamicBytes.prototype.isType = function (name) {
   881      return !!name.match(/^bytes(\[([0-9]*)\])*$/);
   882  };
   883  
   884  SolidityTypeDynamicBytes.prototype.isDynamicType = function () {
   885      return true;
   886  };
   887  
   888  module.exports = SolidityTypeDynamicBytes;
   889  
   890  },{"./formatters":9,"./type":14}],9:[function(require,module,exports){
   891  /*
   892      This file is part of web3.js.
   893  
   894      web3.js is free software: you can redistribute it and/or modify
   895      it under the terms of the GNU Lesser General Public License as published by
   896      the Free Software Foundation, either version 3 of the License, or
   897      (at your option) any later version.
   898  
   899      web3.js is distributed in the hope that it will be useful,
   900      but WITHOUT ANY WARRANTY; without even the implied warranty of
   901      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   902      GNU Lesser General Public License for more details.
   903  
   904      You should have received a copy of the GNU Lesser General Public License
   905      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
   906  */
   907  /**
   908   * @file formatters.js
   909   * @author Marek Kotewicz <marek@ethdev.com>
   910   * @date 2015
   911   */
   912  
   913  var BigNumber = require('bignumber.js');
   914  var utils = require('../utils/utils');
   915  var c = require('../utils/config');
   916  var SolidityParam = require('./param');
   917  
   918  
   919  /**
   920   * Formats input value to byte representation of int
   921   * If value is negative, return it's two's complement
   922   * If the value is floating point, round it down
   923   *
   924   * @method formatInputInt
   925   * @param {String|Number|BigNumber} value that needs to be formatted
   926   * @returns {SolidityParam}
   927   */
   928  var formatInputInt = function (value) {
   929      BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE);
   930      var result = utils.padLeft(utils.toTwosComplement(value).toString(16), 64);
   931      return new SolidityParam(result);
   932  };
   933  
   934  /**
   935   * Formats input bytes
   936   *
   937   * @method formatInputBytes
   938   * @param {String}
   939   * @returns {SolidityParam}
   940   */
   941  var formatInputBytes = function (value) {
   942      var result = utils.toHex(value).substr(2);
   943      var l = Math.floor((result.length + 63) / 64);
   944      result = utils.padRight(result, l * 64);
   945      return new SolidityParam(result);
   946  };
   947  
   948  /**
   949   * Formats input bytes
   950   *
   951   * @method formatDynamicInputBytes
   952   * @param {String}
   953   * @returns {SolidityParam}
   954   */
   955  var formatInputDynamicBytes = function (value) {
   956      var result = utils.toHex(value).substr(2);
   957      var length = result.length / 2;
   958      var l = Math.floor((result.length + 63) / 64);
   959      result = utils.padRight(result, l * 64);
   960      return new SolidityParam(formatInputInt(length).value + result);
   961  };
   962  
   963  /**
   964   * Formats input value to byte representation of string
   965   *
   966   * @method formatInputString
   967   * @param {String}
   968   * @returns {SolidityParam}
   969   */
   970  var formatInputString = function (value) {
   971      var result = utils.fromUtf8(value).substr(2);
   972      var length = result.length / 2;
   973      var l = Math.floor((result.length + 63) / 64);
   974      result = utils.padRight(result, l * 64);
   975      return new SolidityParam(formatInputInt(length).value + result);
   976  };
   977  
   978  /**
   979   * Formats input value to byte representation of bool
   980   *
   981   * @method formatInputBool
   982   * @param {Boolean}
   983   * @returns {SolidityParam}
   984   */
   985  var formatInputBool = function (value) {
   986      var result = '000000000000000000000000000000000000000000000000000000000000000' + (value ?  '1' : '0');
   987      return new SolidityParam(result);
   988  };
   989  
   990  /**
   991   * Formats input value to byte representation of real
   992   * Values are multiplied by 2^m and encoded as integers
   993   *
   994   * @method formatInputReal
   995   * @param {String|Number|BigNumber}
   996   * @returns {SolidityParam}
   997   */
   998  var formatInputReal = function (value) {
   999      return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));
  1000  };
  1001  
  1002  /**
  1003   * Check if input value is negative
  1004   *
  1005   * @method signedIsNegative
  1006   * @param {String} value is hex format
  1007   * @returns {Boolean} true if it is negative, otherwise false
  1008   */
  1009  var signedIsNegative = function (value) {
  1010      return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1';
  1011  };
  1012  
  1013  /**
  1014   * Formats right-aligned output bytes to int
  1015   *
  1016   * @method formatOutputInt
  1017   * @param {SolidityParam} param
  1018   * @returns {BigNumber} right-aligned output bytes formatted to big number
  1019   */
  1020  var formatOutputInt = function (param) {
  1021      var value = param.staticPart() || "0";
  1022  
  1023      // check if it's negative number
  1024      // it is, return two's complement
  1025      if (signedIsNegative(value)) {
  1026          return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);
  1027      }
  1028      return new BigNumber(value, 16);
  1029  };
  1030  
  1031  /**
  1032   * Formats right-aligned output bytes to uint
  1033   *
  1034   * @method formatOutputUInt
  1035   * @param {SolidityParam}
  1036   * @returns {BigNumeber} right-aligned output bytes formatted to uint
  1037   */
  1038  var formatOutputUInt = function (param) {
  1039      var value = param.staticPart() || "0";
  1040      return new BigNumber(value, 16);
  1041  };
  1042  
  1043  /**
  1044   * Formats right-aligned output bytes to real
  1045   *
  1046   * @method formatOutputReal
  1047   * @param {SolidityParam}
  1048   * @returns {BigNumber} input bytes formatted to real
  1049   */
  1050  var formatOutputReal = function (param) {
  1051      return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128));
  1052  };
  1053  
  1054  /**
  1055   * Formats right-aligned output bytes to ureal
  1056   *
  1057   * @method formatOutputUReal
  1058   * @param {SolidityParam}
  1059   * @returns {BigNumber} input bytes formatted to ureal
  1060   */
  1061  var formatOutputUReal = function (param) {
  1062      return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128));
  1063  };
  1064  
  1065  /**
  1066   * Should be used to format output bool
  1067   *
  1068   * @method formatOutputBool
  1069   * @param {SolidityParam}
  1070   * @returns {Boolean} right-aligned input bytes formatted to bool
  1071   */
  1072  var formatOutputBool = function (param) {
  1073      return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false;
  1074  };
  1075  
  1076  /**
  1077   * Should be used to format output bytes
  1078   *
  1079   * @method formatOutputBytes
  1080   * @param {SolidityParam} left-aligned hex representation of string
  1081   * @param {String} name type name
  1082   * @returns {String} hex string
  1083   */
  1084  var formatOutputBytes = function (param, name) {
  1085      var matches = name.match(/^bytes([0-9]*)/);
  1086      var size = parseInt(matches[1]);
  1087      return '0x' + param.staticPart().slice(0, 2 * size);
  1088  };
  1089  
  1090  /**
  1091   * Should be used to format output bytes
  1092   *
  1093   * @method formatOutputDynamicBytes
  1094   * @param {SolidityParam} left-aligned hex representation of string
  1095   * @returns {String} hex string
  1096   */
  1097  var formatOutputDynamicBytes = function (param) {
  1098      var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
  1099      return '0x' + param.dynamicPart().substr(64, length);
  1100  };
  1101  
  1102  /**
  1103   * Should be used to format output string
  1104   *
  1105   * @method formatOutputString
  1106   * @param {SolidityParam} left-aligned hex representation of string
  1107   * @returns {String} ascii string
  1108   */
  1109  var formatOutputString = function (param) {
  1110      var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
  1111      return utils.toUtf8(param.dynamicPart().substr(64, length));
  1112  };
  1113  
  1114  /**
  1115   * Should be used to format output address
  1116   *
  1117   * @method formatOutputAddress
  1118   * @param {SolidityParam} right-aligned input bytes
  1119   * @returns {String} address
  1120   */
  1121  var formatOutputAddress = function (param) {
  1122      var value = param.staticPart();
  1123      return "0x" + value.slice(value.length - 40, value.length);
  1124  };
  1125  
  1126  module.exports = {
  1127      formatInputInt: formatInputInt,
  1128      formatInputBytes: formatInputBytes,
  1129      formatInputDynamicBytes: formatInputDynamicBytes,
  1130      formatInputString: formatInputString,
  1131      formatInputBool: formatInputBool,
  1132      formatInputReal: formatInputReal,
  1133      formatOutputInt: formatOutputInt,
  1134      formatOutputUInt: formatOutputUInt,
  1135      formatOutputReal: formatOutputReal,
  1136      formatOutputUReal: formatOutputUReal,
  1137      formatOutputBool: formatOutputBool,
  1138      formatOutputBytes: formatOutputBytes,
  1139      formatOutputDynamicBytes: formatOutputDynamicBytes,
  1140      formatOutputString: formatOutputString,
  1141      formatOutputAddress: formatOutputAddress
  1142  };
  1143  
  1144  },{"../utils/config":18,"../utils/utils":20,"./param":11,"bignumber.js":"bignumber.js"}],10:[function(require,module,exports){
  1145  var f = require('./formatters');
  1146  var SolidityType = require('./type');
  1147  
  1148  /**
  1149   * SolidityTypeInt is a prootype that represents int type
  1150   * It matches:
  1151   * int
  1152   * int[]
  1153   * int[4]
  1154   * int[][]
  1155   * int[3][]
  1156   * int[][6][], ...
  1157   * int32
  1158   * int64[]
  1159   * int8[4]
  1160   * int256[][]
  1161   * int[3][]
  1162   * int64[][6][], ...
  1163   */
  1164  var SolidityTypeInt = function () {
  1165      this._inputFormatter = f.formatInputInt;
  1166      this._outputFormatter = f.formatOutputInt;
  1167  };
  1168  
  1169  SolidityTypeInt.prototype = new SolidityType({});
  1170  SolidityTypeInt.prototype.constructor = SolidityTypeInt;
  1171  
  1172  SolidityTypeInt.prototype.isType = function (name) {
  1173      return !!name.match(/^int([0-9]*)?(\[([0-9]*)\])*$/);
  1174  };
  1175  
  1176  module.exports = SolidityTypeInt;
  1177  
  1178  },{"./formatters":9,"./type":14}],11:[function(require,module,exports){
  1179  /*
  1180      This file is part of web3.js.
  1181  
  1182      web3.js is free software: you can redistribute it and/or modify
  1183      it under the terms of the GNU Lesser General Public License as published by
  1184      the Free Software Foundation, either version 3 of the License, or
  1185      (at your option) any later version.
  1186  
  1187      web3.js is distributed in the hope that it will be useful,
  1188      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1189      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1190      GNU Lesser General Public License for more details.
  1191  
  1192      You should have received a copy of the GNU Lesser General Public License
  1193      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1194  */
  1195  /** 
  1196   * @file param.js
  1197   * @author Marek Kotewicz <marek@ethdev.com>
  1198   * @date 2015
  1199   */
  1200  
  1201  var utils = require('../utils/utils');
  1202  
  1203  /**
  1204   * SolidityParam object prototype.
  1205   * Should be used when encoding, decoding solidity bytes
  1206   */
  1207  var SolidityParam = function (value, offset) {
  1208      this.value = value || '';
  1209      this.offset = offset; // offset in bytes
  1210  };
  1211  
  1212  /**
  1213   * This method should be used to get length of params's dynamic part
  1214   * 
  1215   * @method dynamicPartLength
  1216   * @returns {Number} length of dynamic part (in bytes)
  1217   */
  1218  SolidityParam.prototype.dynamicPartLength = function () {
  1219      return this.dynamicPart().length / 2;
  1220  };
  1221  
  1222  /**
  1223   * This method should be used to create copy of solidity param with different offset
  1224   *
  1225   * @method withOffset
  1226   * @param {Number} offset length in bytes
  1227   * @returns {SolidityParam} new solidity param with applied offset
  1228   */
  1229  SolidityParam.prototype.withOffset = function (offset) {
  1230      return new SolidityParam(this.value, offset);
  1231  };
  1232  
  1233  /**
  1234   * This method should be used to combine solidity params together
  1235   * eg. when appending an array
  1236   *
  1237   * @method combine
  1238   * @param {SolidityParam} param with which we should combine
  1239   * @param {SolidityParam} result of combination
  1240   */
  1241  SolidityParam.prototype.combine = function (param) {
  1242      return new SolidityParam(this.value + param.value); 
  1243  };
  1244  
  1245  /**
  1246   * This method should be called to check if param has dynamic size.
  1247   * If it has, it returns true, otherwise false
  1248   *
  1249   * @method isDynamic
  1250   * @returns {Boolean}
  1251   */
  1252  SolidityParam.prototype.isDynamic = function () {
  1253      return this.offset !== undefined;
  1254  };
  1255  
  1256  /**
  1257   * This method should be called to transform offset to bytes
  1258   *
  1259   * @method offsetAsBytes
  1260   * @returns {String} bytes representation of offset
  1261   */
  1262  SolidityParam.prototype.offsetAsBytes = function () {
  1263      return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64);
  1264  };
  1265  
  1266  /**
  1267   * This method should be called to get static part of param
  1268   *
  1269   * @method staticPart
  1270   * @returns {String} offset if it is a dynamic param, otherwise value
  1271   */
  1272  SolidityParam.prototype.staticPart = function () {
  1273      if (!this.isDynamic()) {
  1274          return this.value; 
  1275      } 
  1276      return this.offsetAsBytes();
  1277  };
  1278  
  1279  /**
  1280   * This method should be called to get dynamic part of param
  1281   *
  1282   * @method dynamicPart
  1283   * @returns {String} returns a value if it is a dynamic param, otherwise empty string
  1284   */
  1285  SolidityParam.prototype.dynamicPart = function () {
  1286      return this.isDynamic() ? this.value : '';
  1287  };
  1288  
  1289  /**
  1290   * This method should be called to encode param
  1291   *
  1292   * @method encode
  1293   * @returns {String}
  1294   */
  1295  SolidityParam.prototype.encode = function () {
  1296      return this.staticPart() + this.dynamicPart();
  1297  };
  1298  
  1299  /**
  1300   * This method should be called to encode array of params
  1301   *
  1302   * @method encodeList
  1303   * @param {Array[SolidityParam]} params
  1304   * @returns {String}
  1305   */
  1306  SolidityParam.encodeList = function (params) {
  1307      
  1308      // updating offsets
  1309      var totalOffset = params.length * 32;
  1310      var offsetParams = params.map(function (param) {
  1311          if (!param.isDynamic()) {
  1312              return param;
  1313          }
  1314          var offset = totalOffset;
  1315          totalOffset += param.dynamicPartLength();
  1316          return param.withOffset(offset);
  1317      });
  1318  
  1319      // encode everything!
  1320      return offsetParams.reduce(function (result, param) {
  1321          return result + param.dynamicPart();
  1322      }, offsetParams.reduce(function (result, param) {
  1323          return result + param.staticPart();
  1324      }, ''));
  1325  };
  1326  
  1327  
  1328  
  1329  module.exports = SolidityParam;
  1330  
  1331  
  1332  },{"../utils/utils":20}],12:[function(require,module,exports){
  1333  var f = require('./formatters');
  1334  var SolidityType = require('./type');
  1335  
  1336  /**
  1337   * SolidityTypeReal is a prootype that represents real type
  1338   * It matches:
  1339   * real
  1340   * real[]
  1341   * real[4]
  1342   * real[][]
  1343   * real[3][]
  1344   * real[][6][], ...
  1345   * real32
  1346   * real64[]
  1347   * real8[4]
  1348   * real256[][]
  1349   * real[3][]
  1350   * real64[][6][], ...
  1351   */
  1352  var SolidityTypeReal = function () {
  1353      this._inputFormatter = f.formatInputReal;
  1354      this._outputFormatter = f.formatOutputReal;
  1355  };
  1356  
  1357  SolidityTypeReal.prototype = new SolidityType({});
  1358  SolidityTypeReal.prototype.constructor = SolidityTypeReal;
  1359  
  1360  SolidityTypeReal.prototype.isType = function (name) {
  1361      return !!name.match(/real([0-9]*)?(\[([0-9]*)\])?/);
  1362  };
  1363  
  1364  module.exports = SolidityTypeReal;
  1365  
  1366  },{"./formatters":9,"./type":14}],13:[function(require,module,exports){
  1367  var f = require('./formatters');
  1368  var SolidityType = require('./type');
  1369  
  1370  var SolidityTypeString = function () {
  1371      this._inputFormatter = f.formatInputString;
  1372      this._outputFormatter = f.formatOutputString;
  1373  };
  1374  
  1375  SolidityTypeString.prototype = new SolidityType({});
  1376  SolidityTypeString.prototype.constructor = SolidityTypeString;
  1377  
  1378  SolidityTypeString.prototype.isType = function (name) {
  1379      return !!name.match(/^string(\[([0-9]*)\])*$/);
  1380  };
  1381  
  1382  SolidityTypeString.prototype.isDynamicType = function () {
  1383      return true;
  1384  };
  1385  
  1386  module.exports = SolidityTypeString;
  1387  
  1388  },{"./formatters":9,"./type":14}],14:[function(require,module,exports){
  1389  var f = require('./formatters');
  1390  var SolidityParam = require('./param');
  1391  
  1392  /**
  1393   * SolidityType prototype is used to encode/decode solidity params of certain type
  1394   */
  1395  var SolidityType = function (config) {
  1396      this._inputFormatter = config.inputFormatter;
  1397      this._outputFormatter = config.outputFormatter;
  1398  };
  1399  
  1400  /**
  1401   * Should be used to determine if this SolidityType do match given name
  1402   *
  1403   * @method isType
  1404   * @param {String} name
  1405   * @return {Bool} true if type match this SolidityType, otherwise false
  1406   */
  1407  SolidityType.prototype.isType = function (name) {
  1408      throw "this method should be overrwritten for type " + name;
  1409  };
  1410  
  1411  /**
  1412   * Should be used to determine what is the length of static part in given type
  1413   *
  1414   * @method staticPartLength
  1415   * @param {String} name
  1416   * @return {Number} length of static part in bytes
  1417   */
  1418  SolidityType.prototype.staticPartLength = function (name) {
  1419      // If name isn't an array then treat it like a single element array.
  1420      return (this.nestedTypes(name) || ['[1]'])
  1421          .map(function (type) {
  1422              // the length of the nested array
  1423              return parseInt(type.slice(1, -1), 10) || 1;
  1424          })
  1425          .reduce(function (previous, current) {
  1426              return previous * current;
  1427          // all basic types are 32 bytes long
  1428          }, 32);
  1429  };
  1430  
  1431  /**
  1432   * Should be used to determine if type is dynamic array
  1433   * eg:
  1434   * "type[]" => true
  1435   * "type[4]" => false
  1436   *
  1437   * @method isDynamicArray
  1438   * @param {String} name
  1439   * @return {Bool} true if the type is dynamic array
  1440   */
  1441  SolidityType.prototype.isDynamicArray = function (name) {
  1442      var nestedTypes = this.nestedTypes(name);
  1443      return !!nestedTypes && !nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g);
  1444  };
  1445  
  1446  /**
  1447   * Should be used to determine if type is static array
  1448   * eg:
  1449   * "type[]" => false
  1450   * "type[4]" => true
  1451   *
  1452   * @method isStaticArray
  1453   * @param {String} name
  1454   * @return {Bool} true if the type is static array
  1455   */
  1456  SolidityType.prototype.isStaticArray = function (name) {
  1457      var nestedTypes = this.nestedTypes(name);
  1458      return !!nestedTypes && !!nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g);
  1459  };
  1460  
  1461  /**
  1462   * Should return length of static array
  1463   * eg.
  1464   * "int[32]" => 32
  1465   * "int256[14]" => 14
  1466   * "int[2][3]" => 3
  1467   * "int" => 1
  1468   * "int[1]" => 1
  1469   * "int[]" => 1
  1470   *
  1471   * @method staticArrayLength
  1472   * @param {String} name
  1473   * @return {Number} static array length
  1474   */
  1475  SolidityType.prototype.staticArrayLength = function (name) {
  1476      var nestedTypes = this.nestedTypes(name);
  1477      if (nestedTypes) {
  1478         return parseInt(nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g) || 1);
  1479      }
  1480      return 1;
  1481  };
  1482  
  1483  /**
  1484   * Should return nested type
  1485   * eg.
  1486   * "int[32]" => "int"
  1487   * "int256[14]" => "int256"
  1488   * "int[2][3]" => "int[2]"
  1489   * "int" => "int"
  1490   * "int[]" => "int"
  1491   *
  1492   * @method nestedName
  1493   * @param {String} name
  1494   * @return {String} nested name
  1495   */
  1496  SolidityType.prototype.nestedName = function (name) {
  1497      // remove last [] in name
  1498      var nestedTypes = this.nestedTypes(name);
  1499      if (!nestedTypes) {
  1500          return name;
  1501      }
  1502  
  1503      return name.substr(0, name.length - nestedTypes[nestedTypes.length - 1].length);
  1504  };
  1505  
  1506  /**
  1507   * Should return true if type has dynamic size by default
  1508   * such types are "string", "bytes"
  1509   *
  1510   * @method isDynamicType
  1511   * @param {String} name
  1512   * @return {Bool} true if is dynamic, otherwise false
  1513   */
  1514  SolidityType.prototype.isDynamicType = function () {
  1515      return false;
  1516  };
  1517  
  1518  /**
  1519   * Should return array of nested types
  1520   * eg.
  1521   * "int[2][3][]" => ["[2]", "[3]", "[]"]
  1522   * "int[] => ["[]"]
  1523   * "int" => null
  1524   *
  1525   * @method nestedTypes
  1526   * @param {String} name
  1527   * @return {Array} array of nested types
  1528   */
  1529  SolidityType.prototype.nestedTypes = function (name) {
  1530      // return list of strings eg. "[]", "[3]", "[]", "[2]"
  1531      return name.match(/(\[[0-9]*\])/g);
  1532  };
  1533  
  1534  /**
  1535   * Should be used to encode the value
  1536   *
  1537   * @method encode
  1538   * @param {Object} value
  1539   * @param {String} name
  1540   * @return {String} encoded value
  1541   */
  1542  SolidityType.prototype.encode = function (value, name) {
  1543      var self = this;
  1544      if (this.isDynamicArray(name)) {
  1545  
  1546          return (function () {
  1547              var length = value.length;                          // in int
  1548              var nestedName = self.nestedName(name);
  1549  
  1550              var result = [];
  1551              result.push(f.formatInputInt(length).encode());
  1552  
  1553              value.forEach(function (v) {
  1554                  result.push(self.encode(v, nestedName));
  1555              });
  1556  
  1557              return result;
  1558          })();
  1559  
  1560      } else if (this.isStaticArray(name)) {
  1561  
  1562          return (function () {
  1563              var length = self.staticArrayLength(name);          // in int
  1564              var nestedName = self.nestedName(name);
  1565  
  1566              var result = [];
  1567              for (var i = 0; i < length; i++) {
  1568                  result.push(self.encode(value[i], nestedName));
  1569              }
  1570  
  1571              return result;
  1572          })();
  1573  
  1574      }
  1575  
  1576      return this._inputFormatter(value, name).encode();
  1577  };
  1578  
  1579  /**
  1580   * Should be used to decode value from bytes
  1581   *
  1582   * @method decode
  1583   * @param {String} bytes
  1584   * @param {Number} offset in bytes
  1585   * @param {String} name type name
  1586   * @returns {Object} decoded value
  1587   */
  1588  SolidityType.prototype.decode = function (bytes, offset, name) {
  1589      var self = this;
  1590  
  1591      if (this.isDynamicArray(name)) {
  1592  
  1593          return (function () {
  1594              var arrayOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes
  1595              var length = parseInt('0x' + bytes.substr(arrayOffset * 2, 64)); // in int
  1596              var arrayStart = arrayOffset + 32; // array starts after length; // in bytes
  1597  
  1598              var nestedName = self.nestedName(name);
  1599              var nestedStaticPartLength = self.staticPartLength(nestedName);  // in bytes
  1600              var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;
  1601              var result = [];
  1602  
  1603              for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {
  1604                  result.push(self.decode(bytes, arrayStart + i, nestedName));
  1605              }
  1606  
  1607              return result;
  1608          })();
  1609  
  1610      } else if (this.isStaticArray(name)) {
  1611  
  1612          return (function () {
  1613              var length = self.staticArrayLength(name);                      // in int
  1614              var arrayStart = offset;                                        // in bytes
  1615  
  1616              var nestedName = self.nestedName(name);
  1617              var nestedStaticPartLength = self.staticPartLength(nestedName); // in bytes
  1618              var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;
  1619              var result = [];
  1620  
  1621              for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {
  1622                  result.push(self.decode(bytes, arrayStart + i, nestedName));
  1623              }
  1624  
  1625              return result;
  1626          })();
  1627      } else if (this.isDynamicType(name)) {
  1628  
  1629          return (function () {
  1630              var dynamicOffset = parseInt('0x' + bytes.substr(offset * 2, 64));      // in bytes
  1631              var length = parseInt('0x' + bytes.substr(dynamicOffset * 2, 64));      // in bytes
  1632              var roundedLength = Math.floor((length + 31) / 32);                     // in int
  1633              var param = new SolidityParam(bytes.substr(dynamicOffset * 2, ( 1 + roundedLength) * 64), 0);
  1634              return self._outputFormatter(param, name);
  1635          })();
  1636      }
  1637  
  1638      var length = this.staticPartLength(name);
  1639      var param = new SolidityParam(bytes.substr(offset * 2, length * 2));
  1640      return this._outputFormatter(param, name);
  1641  };
  1642  
  1643  module.exports = SolidityType;
  1644  
  1645  },{"./formatters":9,"./param":11}],15:[function(require,module,exports){
  1646  var f = require('./formatters');
  1647  var SolidityType = require('./type');
  1648  
  1649  /**
  1650   * SolidityTypeUInt is a prootype that represents uint type
  1651   * It matches:
  1652   * uint
  1653   * uint[]
  1654   * uint[4]
  1655   * uint[][]
  1656   * uint[3][]
  1657   * uint[][6][], ...
  1658   * uint32
  1659   * uint64[]
  1660   * uint8[4]
  1661   * uint256[][]
  1662   * uint[3][]
  1663   * uint64[][6][], ...
  1664   */
  1665  var SolidityTypeUInt = function () {
  1666      this._inputFormatter = f.formatInputInt;
  1667      this._outputFormatter = f.formatOutputUInt;
  1668  };
  1669  
  1670  SolidityTypeUInt.prototype = new SolidityType({});
  1671  SolidityTypeUInt.prototype.constructor = SolidityTypeUInt;
  1672  
  1673  SolidityTypeUInt.prototype.isType = function (name) {
  1674      return !!name.match(/^uint([0-9]*)?(\[([0-9]*)\])*$/);
  1675  };
  1676  
  1677  module.exports = SolidityTypeUInt;
  1678  
  1679  },{"./formatters":9,"./type":14}],16:[function(require,module,exports){
  1680  var f = require('./formatters');
  1681  var SolidityType = require('./type');
  1682  
  1683  /**
  1684   * SolidityTypeUReal is a prootype that represents ureal type
  1685   * It matches:
  1686   * ureal
  1687   * ureal[]
  1688   * ureal[4]
  1689   * ureal[][]
  1690   * ureal[3][]
  1691   * ureal[][6][], ...
  1692   * ureal32
  1693   * ureal64[]
  1694   * ureal8[4]
  1695   * ureal256[][]
  1696   * ureal[3][]
  1697   * ureal64[][6][], ...
  1698   */
  1699  var SolidityTypeUReal = function () {
  1700      this._inputFormatter = f.formatInputReal;
  1701      this._outputFormatter = f.formatOutputUReal;
  1702  };
  1703  
  1704  SolidityTypeUReal.prototype = new SolidityType({});
  1705  SolidityTypeUReal.prototype.constructor = SolidityTypeUReal;
  1706  
  1707  SolidityTypeUReal.prototype.isType = function (name) {
  1708      return !!name.match(/^ureal([0-9]*)?(\[([0-9]*)\])*$/);
  1709  };
  1710  
  1711  module.exports = SolidityTypeUReal;
  1712  
  1713  },{"./formatters":9,"./type":14}],17:[function(require,module,exports){
  1714  'use strict';
  1715  
  1716  // go env doesn't have and need XMLHttpRequest
  1717  if (typeof XMLHttpRequest === 'undefined') {
  1718      exports.XMLHttpRequest = {};
  1719  } else {
  1720      exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line
  1721  }
  1722  
  1723  
  1724  },{}],18:[function(require,module,exports){
  1725  /*
  1726      This file is part of web3.js.
  1727  
  1728      web3.js is free software: you can redistribute it and/or modify
  1729      it under the terms of the GNU Lesser General Public License as published by
  1730      the Free Software Foundation, either version 3 of the License, or
  1731      (at your option) any later version.
  1732  
  1733      web3.js is distributed in the hope that it will be useful,
  1734      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1735      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1736      GNU Lesser General Public License for more details.
  1737  
  1738      You should have received a copy of the GNU Lesser General Public License
  1739      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1740  */
  1741  /** @file config.js
  1742   * @authors:
  1743   *   Marek Kotewicz <marek@ethdev.com>
  1744   * @date 2015
  1745   */
  1746  
  1747  /**
  1748   * Utils
  1749   * 
  1750   * @module utils
  1751   */
  1752  
  1753  /**
  1754   * Utility functions
  1755   * 
  1756   * @class [utils] config
  1757   * @constructor
  1758   */
  1759  
  1760  
  1761  /// required to define ETH_BIGNUMBER_ROUNDING_MODE
  1762  var BigNumber = require('bignumber.js');
  1763  
  1764  var ETH_UNITS = [
  1765      'wei',
  1766      'kwei',
  1767      'Mwei',
  1768      'Gwei',
  1769      'szabo',
  1770      'finney',
  1771      'femtoether',
  1772      'picoether',
  1773      'nanoether',
  1774      'microether',
  1775      'milliether',
  1776      'nano',
  1777      'micro',
  1778      'milli',
  1779      'ether',
  1780      'grand',
  1781      'Mether',
  1782      'Gether',
  1783      'Tether',
  1784      'Pether',
  1785      'Eether',
  1786      'Zether',
  1787      'Yether',
  1788      'Nether',
  1789      'Dether',
  1790      'Vether',
  1791      'Uether'
  1792  ];
  1793  
  1794  module.exports = {
  1795      ETH_PADDING: 32,
  1796      ETH_SIGNATURE_LENGTH: 4,
  1797      ETH_UNITS: ETH_UNITS,
  1798      ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN },
  1799      ETH_POLLING_TIMEOUT: 1000/2,
  1800      defaultBlock: 'latest',
  1801      defaultAccount: undefined
  1802  };
  1803  
  1804  
  1805  },{"bignumber.js":"bignumber.js"}],19:[function(require,module,exports){
  1806  /*
  1807      This file is part of web3.js.
  1808  
  1809      web3.js is free software: you can redistribute it and/or modify
  1810      it under the terms of the GNU Lesser General Public License as published by
  1811      the Free Software Foundation, either version 3 of the License, or
  1812      (at your option) any later version.
  1813  
  1814      web3.js is distributed in the hope that it will be useful,
  1815      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1816      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1817      GNU Lesser General Public License for more details.
  1818  
  1819      You should have received a copy of the GNU Lesser General Public License
  1820      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1821  */
  1822  /** 
  1823   * @file sha3.js
  1824   * @author Marek Kotewicz <marek@ethdev.com>
  1825   * @date 2015
  1826   */
  1827  
  1828  var CryptoJS = require('crypto-js');
  1829  var sha3 = require('crypto-js/sha3');
  1830  
  1831  module.exports = function (value, options) {
  1832      if (options && options.encoding === 'hex') {
  1833          if (value.length > 2 && value.substr(0, 2) === '0x') {
  1834              value = value.substr(2);
  1835          }
  1836          value = CryptoJS.enc.Hex.parse(value);
  1837      }
  1838  
  1839      return sha3(value, {
  1840          outputLength: 256
  1841      }).toString();
  1842  };
  1843  
  1844  
  1845  },{"crypto-js":59,"crypto-js/sha3":80}],20:[function(require,module,exports){
  1846  /*
  1847      This file is part of web3.js.
  1848  
  1849      web3.js is free software: you can redistribute it and/or modify
  1850      it under the terms of the GNU Lesser General Public License as published by
  1851      the Free Software Foundation, either version 3 of the License, or
  1852      (at your option) any later version.
  1853  
  1854      web3.js is distributed in the hope that it will be useful,
  1855      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1856      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1857      GNU Lesser General Public License for more details.
  1858  
  1859      You should have received a copy of the GNU Lesser General Public License
  1860      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1861  */
  1862  /**
  1863   * @file utils.js
  1864   * @author Marek Kotewicz <marek@ethdev.com>
  1865   * @date 2015
  1866   */
  1867  
  1868  /**
  1869   * Utils
  1870   *
  1871   * @module utils
  1872   */
  1873  
  1874  /**
  1875   * Utility functions
  1876   *
  1877   * @class [utils] utils
  1878   * @constructor
  1879   */
  1880  
  1881  
  1882  var BigNumber = require('bignumber.js');
  1883  var sha3 = require('./sha3.js');
  1884  var utf8 = require('utf8');
  1885  
  1886  var unitMap = {
  1887      'noether':      '0',
  1888      'wei':          '1',
  1889      'kwei':         '1000',
  1890      'Kwei':         '1000',
  1891      'babbage':      '1000',
  1892      'femtoether':   '1000',
  1893      'mwei':         '1000000',
  1894      'Mwei':         '1000000',
  1895      'lovelace':     '1000000',
  1896      'picoether':    '1000000',
  1897      'gwei':         '1000000000',
  1898      'Gwei':         '1000000000',
  1899      'shannon':      '1000000000',
  1900      'nanoether':    '1000000000',
  1901      'nano':         '1000000000',
  1902      'szabo':        '1000000000000',
  1903      'microether':   '1000000000000',
  1904      'micro':        '1000000000000',
  1905      'finney':       '1000000000000000',
  1906      'milliether':    '1000000000000000',
  1907      'milli':         '1000000000000000',
  1908      'ether':        '1000000000000000000',
  1909      'int':        '1000000000000000000',
  1910      'kether':       '1000000000000000000000',
  1911      'kint':       '1000000000000000000000',
  1912      'grand':        '1000000000000000000000',
  1913      'mether':       '1000000000000000000000000',
  1914      'mint':       '1000000000000000000000000',
  1915      'gether':       '1000000000000000000000000000',
  1916      'gint':       '1000000000000000000000000000',
  1917      'tint':       '1000000000000000000000000000000',
  1918      'tether':       '1000000000000000000000000000000'
  1919  };
  1920  
  1921  /**
  1922   * Should be called to pad string to expected length
  1923   *
  1924   * @method padLeft
  1925   * @param {String} string to be padded
  1926   * @param {Number} characters that result string should have
  1927   * @param {String} sign, by default 0
  1928   * @returns {String} right aligned string
  1929   */
  1930  var padLeft = function (string, chars, sign) {
  1931      return new Array(chars - string.length + 1).join(sign ? sign : "0") + string;
  1932  };
  1933  
  1934  /**
  1935   * Should be called to pad string to expected length
  1936   *
  1937   * @method padRight
  1938   * @param {String} string to be padded
  1939   * @param {Number} characters that result string should have
  1940   * @param {String} sign, by default 0
  1941   * @returns {String} right aligned string
  1942   */
  1943  var padRight = function (string, chars, sign) {
  1944      return string + (new Array(chars - string.length + 1).join(sign ? sign : "0"));
  1945  };
  1946  
  1947  /**
  1948   * Should be called to get utf8 from it's hex representation
  1949   *
  1950   * @method toUtf8
  1951   * @param {String} string in hex
  1952   * @returns {String} ascii string representation of hex value
  1953   */
  1954  var toUtf8 = function(hex) {
  1955  // Find termination
  1956      var str = "";
  1957      var i = 0, l = hex.length;
  1958      if (hex.substring(0, 2) === '0x') {
  1959          i = 2;
  1960      }
  1961      for (; i < l; i+=2) {
  1962          var code = parseInt(hex.substr(i, 2), 16);
  1963          if (code === 0)
  1964              break;
  1965          str += String.fromCharCode(code);
  1966      }
  1967  
  1968      return utf8.decode(str);
  1969  };
  1970  
  1971  /**
  1972   * Should be called to get ascii from it's hex representation
  1973   *
  1974   * @method toAscii
  1975   * @param {String} string in hex
  1976   * @returns {String} ascii string representation of hex value
  1977   */
  1978  var toAscii = function(hex) {
  1979  // Find termination
  1980      var str = "";
  1981      var i = 0, l = hex.length;
  1982      if (hex.substring(0, 2) === '0x') {
  1983          i = 2;
  1984      }
  1985      for (; i < l; i+=2) {
  1986          var code = parseInt(hex.substr(i, 2), 16);
  1987          str += String.fromCharCode(code);
  1988      }
  1989  
  1990      return str;
  1991  };
  1992  
  1993  /**
  1994   * Should be called to get hex representation (prefixed by 0x) of utf8 string
  1995   *
  1996   * @method fromUtf8
  1997   * @param {String} string
  1998   * @param {Number} optional padding
  1999   * @returns {String} hex representation of input string
  2000   */
  2001  var fromUtf8 = function(str) {
  2002      str = utf8.encode(str);
  2003      var hex = "";
  2004      for(var i = 0; i < str.length; i++) {
  2005          var code = str.charCodeAt(i);
  2006          if (code === 0)
  2007              break;
  2008          var n = code.toString(16);
  2009          hex += n.length < 2 ? '0' + n : n;
  2010      }
  2011  
  2012      return "0x" + hex;
  2013  };
  2014  
  2015  /**
  2016   * Should be called to get hex representation (prefixed by 0x) of ascii string
  2017   *
  2018   * @method fromAscii
  2019   * @param {String} string
  2020   * @param {Number} optional padding
  2021   * @returns {String} hex representation of input string
  2022   */
  2023  var fromAscii = function(str) {
  2024      var hex = "";
  2025      for(var i = 0; i < str.length; i++) {
  2026          var code = str.charCodeAt(i);
  2027          var n = code.toString(16);
  2028          hex += n.length < 2 ? '0' + n : n;
  2029      }
  2030  
  2031      return "0x" + hex;
  2032  };
  2033  
  2034  /**
  2035   * Should be used to create full function/event name from json abi
  2036   *
  2037   * @method transformToFullName
  2038   * @param {Object} json-abi
  2039   * @return {String} full fnction/event name
  2040   */
  2041  var transformToFullName = function (json) {
  2042      if (json.name.indexOf('(') !== -1) {
  2043          return json.name;
  2044      }
  2045  
  2046      var typeName = json.inputs.map(function(i){return i.type; }).join();
  2047      return json.name + '(' + typeName + ')';
  2048  };
  2049  
  2050  /**
  2051   * Should be called to get display name of contract function
  2052   *
  2053   * @method extractDisplayName
  2054   * @param {String} name of function/event
  2055   * @returns {String} display name for function/event eg. multiply(uint256) -> multiply
  2056   */
  2057  var extractDisplayName = function (name) {
  2058      var length = name.indexOf('(');
  2059      return length !== -1 ? name.substr(0, length) : name;
  2060  };
  2061  
  2062  /// @returns overloaded part of function/event name
  2063  var extractTypeName = function (name) {
  2064      /// TODO: make it invulnerable
  2065      var length = name.indexOf('(');
  2066      return length !== -1 ? name.substr(length + 1, name.length - 1 - (length + 1)).replace(' ', '') : "";
  2067  };
  2068  
  2069  /**
  2070   * Converts value to it's decimal representation in string
  2071   *
  2072   * @method toDecimal
  2073   * @param {String|Number|BigNumber}
  2074   * @return {String}
  2075   */
  2076  var toDecimal = function (value) {
  2077      return toBigNumber(value).toNumber();
  2078  };
  2079  
  2080  /**
  2081   * Converts value to it's hex representation
  2082   *
  2083   * @method fromDecimal
  2084   * @param {String|Number|BigNumber}
  2085   * @return {String}
  2086   */
  2087  var fromDecimal = function (value) {
  2088      var number = toBigNumber(value);
  2089      var result = number.toString(16);
  2090  
  2091      return number.lessThan(0) ? '-0x' + result.substr(1) : '0x' + result;
  2092  };
  2093  
  2094  /**
  2095   * Auto converts any given value into it's hex representation.
  2096   *
  2097   * And even stringifys objects before.
  2098   *
  2099   * @method toHex
  2100   * @param {String|Number|BigNumber|Object}
  2101   * @return {String}
  2102   */
  2103  var toHex = function (val) {
  2104      /*jshint maxcomplexity: 8 */
  2105  
  2106      if (isBoolean(val))
  2107          return fromDecimal(+val);
  2108  
  2109      if (isBigNumber(val))
  2110          return fromDecimal(val);
  2111  
  2112      if (typeof val === 'object')
  2113          return fromUtf8(JSON.stringify(val));
  2114  
  2115      // if its a negative number, pass it through fromDecimal
  2116      if (isString(val)) {
  2117          if (val.indexOf('-0x') === 0)
  2118              return fromDecimal(val);
  2119          else if(val.indexOf('0x') === 0)
  2120              return val;
  2121          else if (!isFinite(val))
  2122              return fromAscii(val);
  2123      }
  2124  
  2125      return fromDecimal(val);
  2126  };
  2127  
  2128  /**
  2129   * Returns value of unit in Wei
  2130   *
  2131   * @method getValueOfUnit
  2132   * @param {String} unit the unit to convert to, default ether
  2133   * @returns {BigNumber} value of the unit (in Wei)
  2134   * @throws error if the unit is not correct:w
  2135   */
  2136  var getValueOfUnit = function (unit) {
  2137      unit = unit ? unit.toLowerCase() : 'ether';
  2138      var unitValue = unitMap[unit];
  2139      if (unitValue === undefined) {
  2140          throw new Error('This unit doesn\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2));
  2141      }
  2142      return new BigNumber(unitValue, 10);
  2143  };
  2144  
  2145  /**
  2146   * Takes a number of wei and converts it to any other ether unit.
  2147   *
  2148   * Possible units are:
  2149   *   SI Short   SI Full        Effigy       Other
  2150   * - kwei       femtoether     babbage
  2151   * - mwei       picoether      lovelace
  2152   * - gwei       nanoether      shannon      nano
  2153   * - --         microether     szabo        micro
  2154   * - --         milliether     finney       milli
  2155   * - ether      --             --
  2156   * - kether                    --           grand
  2157   * - mether
  2158   * - gether
  2159   * - tether
  2160   *
  2161   * @method fromWei
  2162   * @param {Number|String} number can be a number, number string or a HEX of a decimal
  2163   * @param {String} unit the unit to convert to, default ether
  2164   * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number
  2165  */
  2166  var fromWei = function(number, unit) {
  2167      var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit));
  2168  
  2169      return isBigNumber(number) ? returnValue : returnValue.toString(10);
  2170  };
  2171  
  2172  /**
  2173   * Takes a number of a unit and converts it to wei.
  2174   *
  2175   * Possible units are:
  2176   *   SI Short   SI Full        Effigy       Other
  2177   * - kwei       femtoether     babbage
  2178   * - mwei       picoether      lovelace
  2179   * - gwei       nanoether      shannon      nano
  2180   * - --         microether     szabo        micro
  2181   * - --         microether     szabo        micro
  2182   * - --         milliether     finney       milli
  2183   * - ether      --             --
  2184   * - kether                    --           grand
  2185   * - mether
  2186   * - gether
  2187   * - tether
  2188   *
  2189   * @method toWei
  2190   * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal
  2191   * @param {String} unit the unit to convert from, default ether
  2192   * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number
  2193  */
  2194  var toWei = function(number, unit) {
  2195      var returnValue = toBigNumber(number).times(getValueOfUnit(unit));
  2196  
  2197      return isBigNumber(number) ? returnValue : returnValue.toString(10);
  2198  };
  2199  
  2200  /**
  2201   * Takes an input and transforms it into a bignumber
  2202   *
  2203   * @method toBigNumber
  2204   * @param {Number|String|BigNumber} a number, string, HEX string or BigNumber
  2205   * @return {BigNumber} BigNumber
  2206  */
  2207  var toBigNumber = function(number) {
  2208      /*jshint maxcomplexity:5 */
  2209      number = number || 0;
  2210      if (isBigNumber(number))
  2211          return number;
  2212  
  2213      if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) {
  2214          return new BigNumber(number.replace('0x',''), 16);
  2215      }
  2216  
  2217      return new BigNumber(number.toString(10), 10);
  2218  };
  2219  
  2220  /**
  2221   * Takes and input transforms it into bignumber and if it is negative value, into two's complement
  2222   *
  2223   * @method toTwosComplement
  2224   * @param {Number|String|BigNumber}
  2225   * @return {BigNumber}
  2226   */
  2227  var toTwosComplement = function (number) {
  2228      var bigNumber = toBigNumber(number).round();
  2229      if (bigNumber.lessThan(0)) {
  2230          return new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(bigNumber).plus(1);
  2231      }
  2232      return bigNumber;
  2233  };
  2234  
  2235  /**
  2236   * Checks if the given string is strictly an address
  2237   *
  2238   * @method isStrictAddress
  2239   * @param {String} address the given HEX address
  2240   * @return {Boolean}
  2241  */
  2242  var isStrictAddress = function (address) {
  2243      return /^0x[0-9a-f]{40}$/i.test(address);
  2244  };
  2245  
  2246  /**
  2247   * Checks if the given string is an address
  2248   *
  2249   * @method isAddress
  2250   * @param {String} address the given HEX address
  2251   * @return {Boolean}
  2252  */
  2253  var isAddress = function (address) {
  2254      if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) {
  2255          // check if it has the basic requirements of an address
  2256          return false;
  2257      } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) {
  2258          // If it's all small caps or all caps, return true
  2259          return true;
  2260      } else {
  2261          // Otherwise check each case
  2262          return isChecksumAddress(address);
  2263      }
  2264  };
  2265  
  2266  /**
  2267   * Checks if the given string is a checksummed address
  2268   *
  2269   * @method isChecksumAddress
  2270   * @param {String} address the given HEX address
  2271   * @return {Boolean}
  2272  */
  2273  var isChecksumAddress = function (address) {
  2274      // Check each case
  2275      address = address.replace('0x','');
  2276      var addressHash = sha3(address.toLowerCase());
  2277  
  2278      for (var i = 0; i < 40; i++ ) {
  2279          // the nth letter should be uppercase if the nth digit of casemap is 1
  2280          if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) {
  2281              return false;
  2282          }
  2283      }
  2284      return true;
  2285  };
  2286  
  2287  
  2288  
  2289  /**
  2290   * Makes a checksum address
  2291   *
  2292   * @method toChecksumAddress
  2293   * @param {String} address the given HEX address
  2294   * @return {String}
  2295  */
  2296  var toChecksumAddress = function (address) {
  2297      if (typeof address === 'undefined') return '';
  2298  
  2299      address = address.toLowerCase().replace('0x','');
  2300      var addressHash = sha3(address);
  2301      var checksumAddress = '0x';
  2302  
  2303      for (var i = 0; i < address.length; i++ ) {
  2304          // If ith character is 9 to f then make it uppercase
  2305          if (parseInt(addressHash[i], 16) > 7) {
  2306            checksumAddress += address[i].toUpperCase();
  2307          } else {
  2308              checksumAddress += address[i];
  2309          }
  2310      }
  2311      return checksumAddress;
  2312  };
  2313  
  2314  /**
  2315   * Transforms given string to valid 20 bytes-length addres with 0x prefix
  2316   *
  2317   * @method toAddress
  2318   * @param {String} address
  2319   * @return {String} formatted address
  2320   */
  2321  var toAddress = function (address) {
  2322      if (isStrictAddress(address)) {
  2323          return address;
  2324      }
  2325  
  2326      if (/^[0-9a-f]{40}$/.test(address)) {
  2327          return '0x' + address;
  2328      }
  2329  
  2330      return '0x' + padLeft(toHex(address).substr(2), 40);
  2331  };
  2332  
  2333  /**
  2334   * Returns true if object is BigNumber, otherwise false
  2335   *
  2336   * @method isBigNumber
  2337   * @param {Object}
  2338   * @return {Boolean}
  2339   */
  2340  var isBigNumber = function (object) {
  2341      return object instanceof BigNumber ||
  2342          (object && object.constructor && object.constructor.name === 'BigNumber');
  2343  };
  2344  
  2345  /**
  2346   * Returns true if object is string, otherwise false
  2347   *
  2348   * @method isString
  2349   * @param {Object}
  2350   * @return {Boolean}
  2351   */
  2352  var isString = function (object) {
  2353      return typeof object === 'string' ||
  2354          (object && object.constructor && object.constructor.name === 'String');
  2355  };
  2356  
  2357  /**
  2358   * Returns true if object is function, otherwise false
  2359   *
  2360   * @method isFunction
  2361   * @param {Object}
  2362   * @return {Boolean}
  2363   */
  2364  var isFunction = function (object) {
  2365      return typeof object === 'function';
  2366  };
  2367  
  2368  /**
  2369   * Returns true if object is Objet, otherwise false
  2370   *
  2371   * @method isObject
  2372   * @param {Object}
  2373   * @return {Boolean}
  2374   */
  2375  var isObject = function (object) {
  2376      return object !== null && !(object instanceof Array) && typeof object === 'object';
  2377  };
  2378  
  2379  /**
  2380   * Returns true if object is boolean, otherwise false
  2381   *
  2382   * @method isBoolean
  2383   * @param {Object}
  2384   * @return {Boolean}
  2385   */
  2386  var isBoolean = function (object) {
  2387      return typeof object === 'boolean';
  2388  };
  2389  
  2390  /**
  2391   * Returns true if object is array, otherwise false
  2392   *
  2393   * @method isArray
  2394   * @param {Object}
  2395   * @return {Boolean}
  2396   */
  2397  var isArray = function (object) {
  2398      return object instanceof Array;
  2399  };
  2400  
  2401  /**
  2402   * Returns true if given string is valid json object
  2403   *
  2404   * @method isJson
  2405   * @param {String}
  2406   * @return {Boolean}
  2407   */
  2408  var isJson = function (str) {
  2409      try {
  2410          return !!JSON.parse(str);
  2411      } catch (e) {
  2412          return false;
  2413      }
  2414  };
  2415  
  2416  /**
  2417   * Returns true if given string is a valid Ethereum block header bloom.
  2418   *
  2419   * @method isBloom
  2420   * @param {String} hex encoded bloom filter
  2421   * @return {Boolean}
  2422   */
  2423  var isBloom = function (bloom) {
  2424      if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) {
  2425          return false;
  2426      } else if (/^(0x)?[0-9a-f]{512}$/.test(bloom) || /^(0x)?[0-9A-F]{512}$/.test(bloom)) {
  2427          return true;
  2428      }
  2429      return false;
  2430  };
  2431  
  2432  /**
  2433   * Returns true if given string is a valid log topic.
  2434   *
  2435   * @method isTopic
  2436   * @param {String} hex encoded topic
  2437   * @return {Boolean}
  2438   */
  2439  var isTopic = function (topic) {
  2440      if (!/^(0x)?[0-9a-f]{64}$/i.test(topic)) {
  2441          return false;
  2442      } else if (/^(0x)?[0-9a-f]{64}$/.test(topic) || /^(0x)?[0-9A-F]{64}$/.test(topic)) {
  2443          return true;
  2444      }
  2445      return false;
  2446  };
  2447  
  2448  module.exports = {
  2449      padLeft: padLeft,
  2450      padRight: padRight,
  2451      toHex: toHex,
  2452      toDecimal: toDecimal,
  2453      fromDecimal: fromDecimal,
  2454      toUtf8: toUtf8,
  2455      toAscii: toAscii,
  2456      fromUtf8: fromUtf8,
  2457      fromAscii: fromAscii,
  2458      transformToFullName: transformToFullName,
  2459      extractDisplayName: extractDisplayName,
  2460      extractTypeName: extractTypeName,
  2461      toWei: toWei,
  2462      fromWei: fromWei,
  2463      toBigNumber: toBigNumber,
  2464      toTwosComplement: toTwosComplement,
  2465      toAddress: toAddress,
  2466      isBigNumber: isBigNumber,
  2467      isStrictAddress: isStrictAddress,
  2468      isAddress: isAddress,
  2469      isChecksumAddress: isChecksumAddress,
  2470      toChecksumAddress: toChecksumAddress,
  2471      isFunction: isFunction,
  2472      isString: isString,
  2473      isObject: isObject,
  2474      isBoolean: isBoolean,
  2475      isArray: isArray,
  2476      isJson: isJson,
  2477      isBloom: isBloom,
  2478      isTopic: isTopic,
  2479  };
  2480  
  2481  },{"./sha3.js":19,"bignumber.js":"bignumber.js","utf8":85}],21:[function(require,module,exports){
  2482  module.exports={
  2483      "version": "0.20.1"
  2484  }
  2485  
  2486  },{}],22:[function(require,module,exports){
  2487  /*
  2488      This file is part of web3.js.
  2489  
  2490      web3.js is free software: you can redistribute it and/or modify
  2491      it under the terms of the GNU Lesser General Public License as published by
  2492      the Free Software Foundation, either version 3 of the License, or
  2493      (at your option) any later version.
  2494  
  2495      web3.js is distributed in the hope that it will be useful,
  2496      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2497      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2498      GNU Lesser General Public License for more details.
  2499  
  2500      You should have received a copy of the GNU Lesser General Public License
  2501      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2502  */
  2503  /**
  2504   * @file web3.js
  2505   * @authors:
  2506   *   Jeffrey Wilcke <jeff@ethdev.com>
  2507   *   Marek Kotewicz <marek@ethdev.com>
  2508   *   Marian Oancea <marian@ethdev.com>
  2509   *   Fabian Vogelsteller <fabian@ethdev.com>
  2510   *   Gav Wood <g@ethdev.com>
  2511   * @date 2014
  2512   */
  2513  
  2514  var RequestManager = require('./web3/requestmanager');
  2515  var Iban = require('./web3/iban');
  2516  var Eth = require('./web3/methods/eth');
  2517  var DB = require('./web3/methods/db');
  2518  var Shh = require('./web3/methods/shh');
  2519  var Net = require('./web3/methods/net');
  2520  var Personal = require('./web3/methods/personal');
  2521  var Swarm = require('./web3/methods/swarm');
  2522  var Settings = require('./web3/settings');
  2523  var version = require('./version.json');
  2524  var utils = require('./utils/utils');
  2525  var sha3 = require('./utils/sha3');
  2526  var extend = require('./web3/extend');
  2527  var Batch = require('./web3/batch');
  2528  var Property = require('./web3/property');
  2529  var HttpProvider = require('./web3/httpprovider');
  2530  var IpcProvider = require('./web3/ipcprovider');
  2531  var BigNumber = require('bignumber.js');
  2532  
  2533  
  2534  
  2535  function Web3 (provider) {
  2536      this._requestManager = new RequestManager(provider);
  2537      this.currentProvider = provider;
  2538      this.eth = new Eth(this);
  2539      this.int = new Eth(this);
  2540      this.db = new DB(this);
  2541      this.shh = new Shh(this);
  2542      this.net = new Net(this);
  2543      this.personal = new Personal(this);
  2544      this.bzz = new Swarm(this);
  2545      this.settings = new Settings();
  2546      this.version = {
  2547          api: version.version
  2548      };
  2549      this.providers = {
  2550          HttpProvider: HttpProvider,
  2551          IpcProvider: IpcProvider
  2552      };
  2553      this._extend = extend(this);
  2554      this._extend({
  2555          properties: properties()
  2556      });
  2557  }
  2558  
  2559  // expose providers on the class
  2560  Web3.providers = {
  2561      HttpProvider: HttpProvider,
  2562      IpcProvider: IpcProvider
  2563  };
  2564  
  2565  Web3.prototype.setProvider = function (provider) {
  2566      this._requestManager.setProvider(provider);
  2567      this.currentProvider = provider;
  2568  };
  2569  
  2570  Web3.prototype.reset = function (keepIsSyncing) {
  2571      this._requestManager.reset(keepIsSyncing);
  2572      this.settings = new Settings();
  2573  };
  2574  
  2575  Web3.prototype.BigNumber = BigNumber;
  2576  Web3.prototype.toHex = utils.toHex;
  2577  Web3.prototype.toAscii = utils.toAscii;
  2578  Web3.prototype.toUtf8 = utils.toUtf8;
  2579  Web3.prototype.fromAscii = utils.fromAscii;
  2580  Web3.prototype.fromUtf8 = utils.fromUtf8;
  2581  Web3.prototype.toDecimal = utils.toDecimal;
  2582  Web3.prototype.fromDecimal = utils.fromDecimal;
  2583  Web3.prototype.toBigNumber = utils.toBigNumber;
  2584  Web3.prototype.toWei = utils.toWei;
  2585  Web3.prototype.fromWei = utils.fromWei;
  2586  Web3.prototype.isAddress = utils.isAddress;
  2587  Web3.prototype.isChecksumAddress = utils.isChecksumAddress;
  2588  Web3.prototype.toChecksumAddress = utils.toChecksumAddress;
  2589  Web3.prototype.isIBAN = utils.isIBAN;
  2590  Web3.prototype.padLeft = utils.padLeft;
  2591  Web3.prototype.padRight = utils.padRight;
  2592  
  2593  
  2594  Web3.prototype.sha3 = function(string, options) {
  2595      return '0x' + sha3(string, options);
  2596  };
  2597  
  2598  Web3.prototype.getVoteHash =  function(from,pubKey,amount,salt){
  2599      if(pubKey.substr(0, 2) === '0x') pubKey = pubKey.substr(2);
  2600  
  2601      if( (typeof amount) == "string" && amount.substr(0, 2) === '0x'){
  2602          amount = amount.substr(2);
  2603      }else{
  2604          amount = amount.toString("16");
  2605      }
  2606      // like add on 2019,10,21
  2607      var fromCode = "";
  2608      for(var i =0; i < from.length; i++){
  2609          fromCode += from[i].charCodeAt().toString('16');
  2610      }
  2611      amount = (amount.length%2 == 0)?amount:("0"+amount);
  2612      var saltCode = "";
  2613      for(var i=0;i<salt.length;i++){
  2614           saltCode += salt[i].charCodeAt().toString("16");
  2615      }
  2616  
  2617      var  concatString = fromCode+pubKey+amount+saltCode;
  2618      return "0x" + sha3(concatString.toLowerCase(),{encoding: 'hex'});
  2619  };
  2620  
  2621  
  2622  
  2623  
  2624  
  2625  /**
  2626   * Transforms direct icap to address
  2627   */
  2628  Web3.prototype.fromICAP = function (icap) {
  2629      var iban = new Iban(icap);
  2630      return iban.address();
  2631  };
  2632  
  2633  var properties = function () {
  2634      return [
  2635          new Property({
  2636              name: 'version.node',
  2637              getter: 'web3_clientVersion'
  2638          }),
  2639          new Property({
  2640              name: 'version.network',
  2641              getter: 'net_version',
  2642              inputFormatter: utils.toDecimal
  2643          }),
  2644          new Property({
  2645              name: 'version.ethereum',
  2646              getter: 'eth_protocolVersion',
  2647              inputFormatter: utils.toDecimal
  2648          }),
  2649          new Property({
  2650              name: 'version.whisper',
  2651              getter: 'shh_version',
  2652              inputFormatter: utils.toDecimal
  2653          })
  2654      ];
  2655  };
  2656  
  2657  Web3.prototype.isConnected = function(){
  2658      return (this.currentProvider && this.currentProvider.isConnected());
  2659  };
  2660  
  2661  Web3.prototype.createBatch = function () {
  2662      return new Batch(this);
  2663  };
  2664  
  2665  module.exports = Web3;
  2666  
  2667  
  2668  },{"./utils/sha3":19,"./utils/utils":20,"./version.json":21,"./web3/batch":24,"./web3/extend":28,"./web3/httpprovider":32,"./web3/iban":33,"./web3/ipcprovider":34,"./web3/methods/db":37,"./web3/methods/eth":38,"./web3/methods/net":39,"./web3/methods/personal":40,"./web3/methods/shh":41,"./web3/methods/swarm":42,"./web3/property":45,"./web3/requestmanager":46,"./web3/settings":47,"bignumber.js":"bignumber.js"}],23:[function(require,module,exports){
  2669  /*
  2670      This file is part of web3.js.
  2671  
  2672      web3.js is free software: you can redistribute it and/or modify
  2673      it under the terms of the GNU Lesser General Public License as published by
  2674      the Free Software Foundation, either version 3 of the License, or
  2675      (at your option) any later version.
  2676  
  2677      web3.js is distributed in the hope that it will be useful,
  2678      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2679      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2680      GNU Lesser General Public License for more details.
  2681  
  2682      You should have received a copy of the GNU Lesser General Public License
  2683      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2684  */
  2685  /**
  2686   * @file allevents.js
  2687   * @author Marek Kotewicz <marek@ethdev.com>
  2688   * @date 2014
  2689   */
  2690  
  2691  var sha3 = require('../utils/sha3');
  2692  var SolidityEvent = require('./event');
  2693  var formatters = require('./formatters');
  2694  var utils = require('../utils/utils');
  2695  var Filter = require('./filter');
  2696  var watches = require('./methods/watches');
  2697  
  2698  var AllSolidityEvents = function (requestManager, json, address) {
  2699      this._requestManager = requestManager;
  2700      this._json = json;
  2701      this._address = address;
  2702  };
  2703  
  2704  AllSolidityEvents.prototype.encode = function (options) {
  2705      options = options || {};
  2706      var result = {};
  2707  
  2708      ['fromBlock', 'toBlock'].filter(function (f) {
  2709          return options[f] !== undefined;
  2710      }).forEach(function (f) {
  2711          result[f] = formatters.inputBlockNumberFormatter(options[f]);
  2712      });
  2713  
  2714      result.address = this._address;
  2715  
  2716      return result;
  2717  };
  2718  
  2719  AllSolidityEvents.prototype.decode = function (data) {
  2720      data.data = data.data || '';
  2721      data.topics = data.topics || [];
  2722  
  2723      var eventTopic = data.topics[0].slice(2);
  2724      var match = this._json.filter(function (j) {
  2725          return eventTopic === sha3(utils.transformToFullName(j));
  2726      })[0];
  2727  
  2728      if (!match) { // cannot find matching event?
  2729          console.warn('cannot find event for log');
  2730          return data;
  2731      }
  2732  
  2733      var event = new SolidityEvent(this._requestManager, match, this._address);
  2734      return event.decode(data);
  2735  };
  2736  
  2737  AllSolidityEvents.prototype.execute = function (options, callback) {
  2738  
  2739      if (utils.isFunction(arguments[arguments.length - 1])) {
  2740          callback = arguments[arguments.length - 1];
  2741          if(arguments.length === 1)
  2742              options = null;
  2743      }
  2744  
  2745      var o = this.encode(options);
  2746      var formatter = this.decode.bind(this);
  2747      return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback);
  2748  };
  2749  
  2750  AllSolidityEvents.prototype.attachToContract = function (contract) {
  2751      var execute = this.execute.bind(this);
  2752      contract.allEvents = execute;
  2753  };
  2754  
  2755  module.exports = AllSolidityEvents;
  2756  
  2757  
  2758  },{"../utils/sha3":19,"../utils/utils":20,"./event":27,"./filter":29,"./formatters":30,"./methods/watches":43}],24:[function(require,module,exports){
  2759  /*
  2760      This file is part of web3.js.
  2761  
  2762      web3.js is free software: you can redistribute it and/or modify
  2763      it under the terms of the GNU Lesser General Public License as published by
  2764      the Free Software Foundation, either version 3 of the License, or
  2765      (at your option) any later version.
  2766  
  2767      web3.js is distributed in the hope that it will be useful,
  2768      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2769      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2770      GNU Lesser General Public License for more details.
  2771  
  2772      You should have received a copy of the GNU Lesser General Public License
  2773      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2774  */
  2775  /** 
  2776   * @file batch.js
  2777   * @author Marek Kotewicz <marek@ethdev.com>
  2778   * @date 2015
  2779   */
  2780  
  2781  var Jsonrpc = require('./jsonrpc');
  2782  var errors = require('./errors');
  2783  
  2784  var Batch = function (web3) {
  2785      this.requestManager = web3._requestManager;
  2786      this.requests = [];
  2787  };
  2788  
  2789  /**
  2790   * Should be called to add create new request to batch request
  2791   *
  2792   * @method add
  2793   * @param {Object} jsonrpc requet object
  2794   */
  2795  Batch.prototype.add = function (request) {
  2796      this.requests.push(request);
  2797  };
  2798  
  2799  /**
  2800   * Should be called to execute batch request
  2801   *
  2802   * @method execute
  2803   */
  2804  Batch.prototype.execute = function () {
  2805      var requests = this.requests;
  2806      this.requestManager.sendBatch(requests, function (err, results) {
  2807          results = results || [];
  2808          requests.map(function (request, index) {
  2809              return results[index] || {};
  2810          }).forEach(function (result, index) {
  2811              if (requests[index].callback) {
  2812  
  2813                  if (!Jsonrpc.isValidResponse(result)) {
  2814                      return requests[index].callback(errors.InvalidResponse(result));
  2815                  }
  2816  
  2817                  requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result));
  2818              }
  2819          });
  2820      }); 
  2821  };
  2822  
  2823  module.exports = Batch;
  2824  
  2825  
  2826  },{"./errors":26,"./jsonrpc":35}],25:[function(require,module,exports){
  2827  /*
  2828      This file is part of web3.js.
  2829  
  2830      web3.js is free software: you can redistribute it and/or modify
  2831      it under the terms of the GNU Lesser General Public License as published by
  2832      the Free Software Foundation, either version 3 of the License, or
  2833      (at your option) any later version.
  2834  
  2835      web3.js is distributed in the hope that it will be useful,
  2836      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2837      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2838      GNU Lesser General Public License for more details.
  2839  
  2840      You should have received a copy of the GNU Lesser General Public License
  2841      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2842  */
  2843  /**
  2844   * @file contract.js
  2845   * @author Marek Kotewicz <marek@ethdev.com>
  2846   * @date 2014
  2847   */
  2848  
  2849  var utils = require('../utils/utils');
  2850  var coder = require('../solidity/coder');
  2851  var SolidityEvent = require('./event');
  2852  var SolidityFunction = require('./function');
  2853  var AllEvents = require('./allevents');
  2854  
  2855  /**
  2856   * Should be called to encode constructor params
  2857   *
  2858   * @method encodeConstructorParams
  2859   * @param {Array} abi
  2860   * @param {Array} constructor params
  2861   */
  2862  var encodeConstructorParams = function (abi, params) {
  2863      return abi.filter(function (json) {
  2864          return json.type === 'constructor' && json.inputs.length === params.length;
  2865      }).map(function (json) {
  2866          return json.inputs.map(function (input) {
  2867              return input.type;
  2868          });
  2869      }).map(function (types) {
  2870          return coder.encodeParams(types, params);
  2871      })[0] || '';
  2872  };
  2873  
  2874  /**
  2875   * Should be called to add functions to contract object
  2876   *
  2877   * @method addFunctionsToContract
  2878   * @param {Contract} contract
  2879   * @param {Array} abi
  2880   */
  2881  var addFunctionsToContract = function (contract) {
  2882      contract.abi.filter(function (json) {
  2883          return json.type === 'function';
  2884      }).map(function (json) {
  2885          return new SolidityFunction(contract._eth, json, contract.address);
  2886      }).forEach(function (f) {
  2887          f.attachToContract(contract);
  2888      });
  2889  };
  2890  
  2891  /**
  2892   * Should be called to add events to contract object
  2893   *
  2894   * @method addEventsToContract
  2895   * @param {Contract} contract
  2896   * @param {Array} abi
  2897   */
  2898  var addEventsToContract = function (contract) {
  2899      var events = contract.abi.filter(function (json) {
  2900          return json.type === 'event';
  2901      });
  2902  
  2903      var All = new AllEvents(contract._eth._requestManager, events, contract.address);
  2904      All.attachToContract(contract);
  2905  
  2906      events.map(function (json) {
  2907          return new SolidityEvent(contract._eth._requestManager, json, contract.address);
  2908      }).forEach(function (e) {
  2909          e.attachToContract(contract);
  2910      });
  2911  };
  2912  
  2913  
  2914  /**
  2915   * Should be called to check if the contract gets properly deployed on the blockchain.
  2916   *
  2917   * @method checkForContractAddress
  2918   * @param {Object} contract
  2919   * @param {Function} callback
  2920   * @returns {Undefined}
  2921   */
  2922  var checkForContractAddress = function(contract, callback){
  2923      var count = 0,
  2924          callbackFired = false;
  2925  
  2926      // wait for receipt
  2927      var filter = contract._eth.filter('latest', function(e){
  2928          if (!e && !callbackFired) {
  2929              count++;
  2930  
  2931              // stop watching after 50 blocks (timeout)
  2932              if (count > 50) {
  2933  
  2934                  filter.stopWatching(function() {});
  2935                  callbackFired = true;
  2936  
  2937                  if (callback)
  2938                      callback(new Error('Contract transaction couldn\'t be found after 50 blocks'));
  2939                  else
  2940                      throw new Error('Contract transaction couldn\'t be found after 50 blocks');
  2941  
  2942  
  2943              } else {
  2944  
  2945                  contract._eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){
  2946                      if(receipt && !callbackFired) {
  2947  
  2948                          contract._eth.getCode(receipt.contractAddress, function(e, code){
  2949                              /*jshint maxcomplexity: 6 */
  2950  
  2951                              if(callbackFired || !code)
  2952                                  return;
  2953  
  2954                              filter.stopWatching(function() {});
  2955                              callbackFired = true;
  2956  
  2957                              if(code.length > 3) {
  2958  
  2959                                  // console.log('Contract code deployed!');
  2960  
  2961                                  contract.address = receipt.contractAddress;
  2962  
  2963                                  // attach events and methods again after we have
  2964                                  addFunctionsToContract(contract);
  2965                                  addEventsToContract(contract);
  2966  
  2967                                  // call callback for the second time
  2968                                  if(callback)
  2969                                      callback(null, contract);
  2970  
  2971                              } else {
  2972                                  if(callback)
  2973                                      callback(new Error('The contract code couldn\'t be stored, please check your gas amount.'));
  2974                                  else
  2975                                      throw new Error('The contract code couldn\'t be stored, please check your gas amount.');
  2976                              }
  2977                          });
  2978                      }
  2979                  });
  2980              }
  2981          }
  2982      });
  2983  };
  2984  
  2985  /**
  2986   * Should be called to create new ContractFactory instance
  2987   *
  2988   * @method ContractFactory
  2989   * @param {Array} abi
  2990   */
  2991  var ContractFactory = function (eth, abi) {
  2992      this.eth = eth;
  2993      this.abi = abi;
  2994  
  2995      /**
  2996       * Should be called to create new contract on a blockchain
  2997       *
  2998       * @method new
  2999       * @param {Any} contract constructor param1 (optional)
  3000       * @param {Any} contract constructor param2 (optional)
  3001       * @param {Object} contract transaction object (required)
  3002       * @param {Function} callback
  3003       * @returns {Contract} returns contract instance
  3004       */
  3005      this.new = function () {
  3006          /*jshint maxcomplexity: 7 */
  3007          
  3008          var contract = new Contract(this.eth, this.abi);
  3009  
  3010          // parse arguments
  3011          var options = {}; // required!
  3012          var callback;
  3013  
  3014          var args = Array.prototype.slice.call(arguments);
  3015          if (utils.isFunction(args[args.length - 1])) {
  3016              callback = args.pop();
  3017          }
  3018  
  3019          var last = args[args.length - 1];
  3020          if (utils.isObject(last) && !utils.isArray(last)) {
  3021              options = args.pop();
  3022          }
  3023  
  3024          if (options.value > 0) {
  3025              var constructorAbi = abi.filter(function (json) {
  3026                  return json.type === 'constructor' && json.inputs.length === args.length;
  3027              })[0] || {};
  3028  
  3029              if (!constructorAbi.payable) {
  3030                  throw new Error('Cannot send value to non-payable constructor');
  3031              }
  3032          }
  3033  
  3034          var bytes = encodeConstructorParams(this.abi, args);
  3035          options.data += bytes;
  3036  
  3037          if (callback) {
  3038  
  3039              // wait for the contract address and check if the code was deployed
  3040              this.eth.sendTransaction(options, function (err, hash) {
  3041                  if (err) {
  3042                      callback(err);
  3043                  } else {
  3044                      // add the transaction hash
  3045                      contract.transactionHash = hash;
  3046  
  3047                      // call callback for the first time
  3048                      callback(null, contract);
  3049  
  3050                      checkForContractAddress(contract, callback);
  3051                  }
  3052              });
  3053          } else {
  3054              var hash = this.eth.sendTransaction(options);
  3055              // add the transaction hash
  3056              contract.transactionHash = hash;
  3057              checkForContractAddress(contract);
  3058          }
  3059  
  3060          return contract;
  3061      };
  3062  
  3063      this.new.getData = this.getData.bind(this);
  3064  };
  3065  
  3066  /**
  3067   * Should be called to create new ContractFactory
  3068   *
  3069   * @method contract
  3070   * @param {Array} abi
  3071   * @returns {ContractFactory} new contract factory
  3072   */
  3073  //var contract = function (abi) {
  3074      //return new ContractFactory(abi);
  3075  //};
  3076  
  3077  
  3078  
  3079  /**
  3080   * Should be called to get access to existing contract on a blockchain
  3081   *
  3082   * @method at
  3083   * @param {Address} contract address (required)
  3084   * @param {Function} callback {optional)
  3085   * @returns {Contract} returns contract if no callback was passed,
  3086   * otherwise calls callback function (err, contract)
  3087   */
  3088  ContractFactory.prototype.at = function (address, callback) {
  3089      var contract = new Contract(this.eth, this.abi, address);
  3090  
  3091      // this functions are not part of prototype,
  3092      // because we don't want to spoil the interface
  3093      addFunctionsToContract(contract);
  3094      addEventsToContract(contract);
  3095  
  3096      if (callback) {
  3097          callback(null, contract);
  3098      }
  3099      return contract;
  3100  };
  3101  
  3102  /**
  3103   * Gets the data, which is data to deploy plus constructor params
  3104   *
  3105   * @method getData
  3106   */
  3107  ContractFactory.prototype.getData = function () {
  3108      var options = {}; // required!
  3109      var args = Array.prototype.slice.call(arguments);
  3110  
  3111      var last = args[args.length - 1];
  3112      if (utils.isObject(last) && !utils.isArray(last)) {
  3113          options = args.pop();
  3114      }
  3115  
  3116      var bytes = encodeConstructorParams(this.abi, args);
  3117      options.data += bytes;
  3118  
  3119      return options.data;
  3120  };
  3121  
  3122  /**
  3123   * Should be called to create new contract instance
  3124   *
  3125   * @method Contract
  3126   * @param {Array} abi
  3127   * @param {Address} contract address
  3128   */
  3129  var Contract = function (eth, abi, address) {
  3130      this._eth = eth;
  3131      this.transactionHash = null;
  3132      this.address = address;
  3133      this.abi = abi;
  3134  };
  3135  
  3136  module.exports = ContractFactory;
  3137  
  3138  },{"../solidity/coder":7,"../utils/utils":20,"./allevents":23,"./event":27,"./function":31}],26:[function(require,module,exports){
  3139  /*
  3140      This file is part of web3.js.
  3141  
  3142      web3.js is free software: you can redistribute it and/or modify
  3143      it under the terms of the GNU Lesser General Public License as published by
  3144      the Free Software Foundation, either version 3 of the License, or
  3145      (at your option) any later version.
  3146  
  3147      web3.js is distributed in the hope that it will be useful,
  3148      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3149      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3150      GNU Lesser General Public License for more details.
  3151  
  3152      You should have received a copy of the GNU Lesser General Public License
  3153      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3154  */
  3155  /** 
  3156   * @file errors.js
  3157   * @author Marek Kotewicz <marek@ethdev.com>
  3158   * @date 2015
  3159   */
  3160  
  3161  module.exports = {
  3162      InvalidNumberOfSolidityArgs: function () {
  3163          return new Error('Invalid number of arguments to Solidity function');
  3164      },
  3165      InvalidNumberOfRPCParams: function () {
  3166          return new Error('Invalid number of input parameters to RPC method');
  3167      },
  3168      InvalidConnection: function (host){
  3169          return new Error('CONNECTION ERROR: Couldn\'t connect to node '+ host +'.');
  3170      },
  3171      InvalidProvider: function () {
  3172          return new Error('Provider not set or invalid');
  3173      },
  3174      InvalidResponse: function (result){
  3175          var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: ' + JSON.stringify(result);
  3176          return new Error(message);
  3177      },
  3178      ConnectionTimeout: function (ms){
  3179          return new Error('CONNECTION TIMEOUT: timeout of ' + ms + ' ms achived');
  3180      }
  3181  };
  3182  
  3183  },{}],27:[function(require,module,exports){
  3184  /*
  3185      This file is part of web3.js.
  3186  
  3187      web3.js is free software: you can redistribute it and/or modify
  3188      it under the terms of the GNU Lesser General Public License as published by
  3189      the Free Software Foundation, either version 3 of the License, or
  3190      (at your option) any later version.
  3191  
  3192      web3.js is distributed in the hope that it will be useful,
  3193      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3194      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3195      GNU Lesser General Public License for more details.
  3196  
  3197      You should have received a copy of the GNU Lesser General Public License
  3198      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3199  */
  3200  /**
  3201   * @file event.js
  3202   * @author Marek Kotewicz <marek@ethdev.com>
  3203   * @date 2014
  3204   */
  3205  
  3206  var utils = require('../utils/utils');
  3207  var coder = require('../solidity/coder');
  3208  var formatters = require('./formatters');
  3209  var sha3 = require('../utils/sha3');
  3210  var Filter = require('./filter');
  3211  var watches = require('./methods/watches');
  3212  
  3213  /**
  3214   * This prototype should be used to create event filters
  3215   */
  3216  var SolidityEvent = function (requestManager, json, address) {
  3217      this._requestManager = requestManager;
  3218      this._params = json.inputs;
  3219      this._name = utils.transformToFullName(json);
  3220      this._address = address;
  3221      this._anonymous = json.anonymous;
  3222  };
  3223  
  3224  /**
  3225   * Should be used to get filtered param types
  3226   *
  3227   * @method types
  3228   * @param {Bool} decide if returned typed should be indexed
  3229   * @return {Array} array of types
  3230   */
  3231  SolidityEvent.prototype.types = function (indexed) {
  3232      return this._params.filter(function (i) {
  3233          return i.indexed === indexed;
  3234      }).map(function (i) {
  3235          return i.type;
  3236      });
  3237  };
  3238  
  3239  /**
  3240   * Should be used to get event display name
  3241   *
  3242   * @method displayName
  3243   * @return {String} event display name
  3244   */
  3245  SolidityEvent.prototype.displayName = function () {
  3246      return utils.extractDisplayName(this._name);
  3247  };
  3248  
  3249  /**
  3250   * Should be used to get event type name
  3251   *
  3252   * @method typeName
  3253   * @return {String} event type name
  3254   */
  3255  SolidityEvent.prototype.typeName = function () {
  3256      return utils.extractTypeName(this._name);
  3257  };
  3258  
  3259  /**
  3260   * Should be used to get event signature
  3261   *
  3262   * @method signature
  3263   * @return {String} event signature
  3264   */
  3265  SolidityEvent.prototype.signature = function () {
  3266      return sha3(this._name);
  3267  };
  3268  
  3269  /**
  3270   * Should be used to encode indexed params and options to one final object
  3271   *
  3272   * @method encode
  3273   * @param {Object} indexed
  3274   * @param {Object} options
  3275   * @return {Object} everything combined together and encoded
  3276   */
  3277  SolidityEvent.prototype.encode = function (indexed, options) {
  3278      indexed = indexed || {};
  3279      options = options || {};
  3280      var result = {};
  3281  
  3282      ['fromBlock', 'toBlock'].filter(function (f) {
  3283          return options[f] !== undefined;
  3284      }).forEach(function (f) {
  3285          result[f] = formatters.inputBlockNumberFormatter(options[f]);
  3286      });
  3287  
  3288      result.topics = [];
  3289  
  3290      result.address = this._address;
  3291      if (!this._anonymous) {
  3292          result.topics.push('0x' + this.signature());
  3293      }
  3294  
  3295      var indexedTopics = this._params.filter(function (i) {
  3296          return i.indexed === true;
  3297      }).map(function (i) {
  3298          var value = indexed[i.name];
  3299          if (value === undefined || value === null) {
  3300              return null;
  3301          }
  3302  
  3303          if (utils.isArray(value)) {
  3304              return value.map(function (v) {
  3305                  return '0x' + coder.encodeParam(i.type, v);
  3306              });
  3307          }
  3308          return '0x' + coder.encodeParam(i.type, value);
  3309      });
  3310  
  3311      result.topics = result.topics.concat(indexedTopics);
  3312  
  3313      return result;
  3314  };
  3315  
  3316  /**
  3317   * Should be used to decode indexed params and options
  3318   *
  3319   * @method decode
  3320   * @param {Object} data
  3321   * @return {Object} result object with decoded indexed && not indexed params
  3322   */
  3323  SolidityEvent.prototype.decode = function (data) {
  3324  
  3325      data.data = data.data || '';
  3326      data.topics = data.topics || [];
  3327  
  3328      var argTopics = this._anonymous ? data.topics : data.topics.slice(1);
  3329      var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join("");
  3330      var indexedParams = coder.decodeParams(this.types(true), indexedData);
  3331  
  3332      var notIndexedData = data.data.slice(2);
  3333      var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData);
  3334  
  3335      var result = formatters.outputLogFormatter(data);
  3336      result.event = this.displayName();
  3337      result.address = data.address;
  3338  
  3339      result.args = this._params.reduce(function (acc, current) {
  3340          acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift();
  3341          return acc;
  3342      }, {});
  3343  
  3344      delete result.data;
  3345      delete result.topics;
  3346  
  3347      return result;
  3348  };
  3349  
  3350  /**
  3351   * Should be used to create new filter object from event
  3352   *
  3353   * @method execute
  3354   * @param {Object} indexed
  3355   * @param {Object} options
  3356   * @return {Object} filter object
  3357   */
  3358  SolidityEvent.prototype.execute = function (indexed, options, callback) {
  3359  
  3360      if (utils.isFunction(arguments[arguments.length - 1])) {
  3361          callback = arguments[arguments.length - 1];
  3362          if(arguments.length === 2)
  3363              options = null;
  3364          if(arguments.length === 1) {
  3365              options = null;
  3366              indexed = {};
  3367          }
  3368      }
  3369  
  3370      var o = this.encode(indexed, options);
  3371      var formatter = this.decode.bind(this);
  3372      return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback);
  3373  };
  3374  
  3375  /**
  3376   * Should be used to attach event to contract object
  3377   *
  3378   * @method attachToContract
  3379   * @param {Contract}
  3380   */
  3381  SolidityEvent.prototype.attachToContract = function (contract) {
  3382      var execute = this.execute.bind(this);
  3383      var displayName = this.displayName();
  3384      if (!contract[displayName]) {
  3385          contract[displayName] = execute;
  3386      }
  3387      contract[displayName][this.typeName()] = this.execute.bind(this, contract);
  3388  };
  3389  
  3390  module.exports = SolidityEvent;
  3391  
  3392  
  3393  },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./filter":29,"./formatters":30,"./methods/watches":43}],28:[function(require,module,exports){
  3394  var formatters = require('./formatters');
  3395  var utils = require('./../utils/utils');
  3396  var Method = require('./method');
  3397  var Property = require('./property');
  3398  
  3399  // TODO: refactor, so the input params are not altered.
  3400  // it's necessary to make same 'extension' work with multiple providers
  3401  var extend = function (web3) {
  3402      /* jshint maxcomplexity:5 */
  3403      var ex = function (extension) {
  3404  
  3405          var extendedObject;
  3406          if (extension.property) {
  3407              if (!web3[extension.property]) {
  3408                  web3[extension.property] = {};
  3409              }
  3410              extendedObject = web3[extension.property];
  3411          } else {
  3412              extendedObject = web3;
  3413          }
  3414  
  3415          if (extension.methods) {
  3416              extension.methods.forEach(function (method) {
  3417                  method.attachToObject(extendedObject);
  3418                  method.setRequestManager(web3._requestManager);
  3419              });
  3420          }
  3421  
  3422          if (extension.properties) {
  3423              extension.properties.forEach(function (property) {
  3424                  property.attachToObject(extendedObject);
  3425                  property.setRequestManager(web3._requestManager);
  3426              });
  3427          }
  3428      };
  3429  
  3430      ex.formatters = formatters; 
  3431      ex.utils = utils;
  3432      ex.Method = Method;
  3433      ex.Property = Property;
  3434  
  3435      return ex;
  3436  };
  3437  
  3438  
  3439  
  3440  module.exports = extend;
  3441  
  3442  
  3443  },{"./../utils/utils":20,"./formatters":30,"./method":36,"./property":45}],29:[function(require,module,exports){
  3444  /*
  3445      This file is part of web3.js.
  3446  
  3447      web3.js is free software: you can redistribute it and/or modify
  3448      it under the terms of the GNU Lesser General Public License as published by
  3449      the Free Software Foundation, either version 3 of the License, or
  3450      (at your option) any later version.
  3451  
  3452      web3.js is distributed in the hope that it will be useful,
  3453      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3454      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3455      GNU Lesser General Public License for more details.
  3456  
  3457      You should have received a copy of the GNU Lesser General Public License
  3458      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3459  */
  3460  /** @file filter.js
  3461   * @authors:
  3462   *   Jeffrey Wilcke <jeff@ethdev.com>
  3463   *   Marek Kotewicz <marek@ethdev.com>
  3464   *   Marian Oancea <marian@ethdev.com>
  3465   *   Fabian Vogelsteller <fabian@ethdev.com>
  3466   *   Gav Wood <g@ethdev.com>
  3467   * @date 2014
  3468   */
  3469  
  3470  var formatters = require('./formatters');
  3471  var utils = require('../utils/utils');
  3472  
  3473  /**
  3474  * Converts a given topic to a hex string, but also allows null values.
  3475  *
  3476  * @param {Mixed} value
  3477  * @return {String}
  3478  */
  3479  var toTopic = function(value){
  3480  
  3481      if(value === null || typeof value === 'undefined')
  3482          return null;
  3483  
  3484      value = String(value);
  3485  
  3486      if(value.indexOf('0x') === 0)
  3487          return value;
  3488      else
  3489          return utils.fromUtf8(value);
  3490  };
  3491  
  3492  /// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones
  3493  /// @param should be string or object
  3494  /// @returns options string or object
  3495  var getOptions = function (options, type) {
  3496      /*jshint maxcomplexity: 6 */
  3497  
  3498      if (utils.isString(options)) {
  3499          return options;
  3500      }
  3501  
  3502      options = options || {};
  3503  
  3504  
  3505      switch(type) {
  3506          case 'eth':
  3507  
  3508              // make sure topics, get converted to hex
  3509              options.topics = options.topics || [];
  3510              options.topics = options.topics.map(function(topic){
  3511                  return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic);
  3512              });
  3513  
  3514              return {
  3515                  topics: options.topics,
  3516                  from: options.from,
  3517                  to: options.to,
  3518                  address: options.address,
  3519                  fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock),
  3520                  toBlock: formatters.inputBlockNumberFormatter(options.toBlock)
  3521              };
  3522          case 'shh':
  3523              return options;
  3524      }
  3525  };
  3526  
  3527  /**
  3528  Adds the callback and sets up the methods, to iterate over the results.
  3529  
  3530  @method getLogsAtStart
  3531  @param {Object} self
  3532  @param {function} callback
  3533  */
  3534  var getLogsAtStart = function(self, callback){
  3535      // call getFilterLogs for the first watch callback start
  3536      if (!utils.isString(self.options)) {
  3537          self.get(function (err, messages) {
  3538              // don't send all the responses to all the watches again... just to self one
  3539              if (err) {
  3540                  callback(err);
  3541              }
  3542  
  3543              if(utils.isArray(messages)) {
  3544                  messages.forEach(function (message) {
  3545                      callback(null, message);
  3546                  });
  3547              }
  3548          });
  3549      }
  3550  };
  3551  
  3552  /**
  3553  Adds the callback and sets up the methods, to iterate over the results.
  3554  
  3555  @method pollFilter
  3556  @param {Object} self
  3557  */
  3558  var pollFilter = function(self) {
  3559  
  3560      var onMessage = function (error, messages) {
  3561          if (error) {
  3562              return self.callbacks.forEach(function (callback) {
  3563                  callback(error);
  3564              });
  3565          }
  3566  
  3567          if(utils.isArray(messages)) {
  3568              messages.forEach(function (message) {
  3569                  message = self.formatter ? self.formatter(message) : message;
  3570                  self.callbacks.forEach(function (callback) {
  3571                      callback(null, message);
  3572                  });
  3573              });
  3574          }
  3575      };
  3576  
  3577      self.requestManager.startPolling({
  3578          method: self.implementation.poll.call,
  3579          params: [self.filterId],
  3580      }, self.filterId, onMessage, self.stopWatching.bind(self));
  3581  
  3582  };
  3583  
  3584  var Filter = function (options, type, requestManager, methods, formatter, callback, filterCreationErrorCallback) {
  3585      var self = this;
  3586      var implementation = {};
  3587      methods.forEach(function (method) {
  3588          method.setRequestManager(requestManager);
  3589          method.attachToObject(implementation);
  3590      });
  3591      this.requestManager = requestManager;
  3592      this.options = getOptions(options, type);
  3593      this.implementation = implementation;
  3594      this.filterId = null;
  3595      this.callbacks = [];
  3596      this.getLogsCallbacks = [];
  3597      this.pollFilters = [];
  3598      this.formatter = formatter;
  3599      this.implementation.newFilter(this.options, function(error, id){
  3600          if(error) {
  3601              self.callbacks.forEach(function(cb){
  3602                  cb(error);
  3603              });
  3604              if (typeof filterCreationErrorCallback === 'function') {
  3605                filterCreationErrorCallback(error);
  3606              }
  3607          } else {
  3608              self.filterId = id;
  3609  
  3610              // check if there are get pending callbacks as a consequence
  3611              // of calling get() with filterId unassigned.
  3612              self.getLogsCallbacks.forEach(function (cb){
  3613                  self.get(cb);
  3614              });
  3615              self.getLogsCallbacks = [];
  3616  
  3617              // get filter logs for the already existing watch calls
  3618              self.callbacks.forEach(function(cb){
  3619                  getLogsAtStart(self, cb);
  3620              });
  3621              if(self.callbacks.length > 0)
  3622                  pollFilter(self);
  3623  
  3624              // start to watch immediately
  3625              if(typeof callback === 'function') {
  3626                  return self.watch(callback);
  3627              }
  3628          }
  3629      });
  3630  
  3631      return this;
  3632  };
  3633  
  3634  Filter.prototype.watch = function (callback) {
  3635      this.callbacks.push(callback);
  3636  
  3637      if(this.filterId) {
  3638          getLogsAtStart(this, callback);
  3639          pollFilter(this);
  3640      }
  3641  
  3642      return this;
  3643  };
  3644  
  3645  Filter.prototype.stopWatching = function (callback) {
  3646      this.requestManager.stopPolling(this.filterId);
  3647      this.callbacks = [];
  3648      // remove filter async
  3649      if (callback) {
  3650          this.implementation.uninstallFilter(this.filterId, callback);
  3651      } else {
  3652          return this.implementation.uninstallFilter(this.filterId);
  3653      }
  3654  };
  3655  
  3656  Filter.prototype.get = function (callback) {
  3657      var self = this;
  3658      if (utils.isFunction(callback)) {
  3659          if (this.filterId === null) {
  3660              // If filterId is not set yet, call it back
  3661              // when newFilter() assigns it.
  3662              this.getLogsCallbacks.push(callback);
  3663          } else {
  3664              this.implementation.getLogs(this.filterId, function(err, res){
  3665                  if (err) {
  3666                      callback(err);
  3667                  } else {
  3668                      callback(null, res.map(function (log) {
  3669                          return self.formatter ? self.formatter(log) : log;
  3670                      }));
  3671                  }
  3672              });
  3673          }
  3674      } else {
  3675          if (this.filterId === null) {
  3676              throw new Error('Filter ID Error: filter().get() can\'t be chained synchronous, please provide a callback for the get() method.');
  3677          }
  3678          var logs = this.implementation.getLogs(this.filterId);
  3679          return logs.map(function (log) {
  3680              return self.formatter ? self.formatter(log) : log;
  3681          });
  3682      }
  3683  
  3684      return this;
  3685  };
  3686  
  3687  module.exports = Filter;
  3688  
  3689  
  3690  },{"../utils/utils":20,"./formatters":30}],30:[function(require,module,exports){
  3691  'use strict'
  3692  
  3693  /*
  3694      This file is part of web3.js.
  3695  
  3696      web3.js is free software: you can redistribute it and/or modify
  3697      it under the terms of the GNU Lesser General Public License as published by
  3698      the Free Software Foundation, either version 3 of the License, or
  3699      (at your option) any later version.
  3700  
  3701      web3.js is distributed in the hope that it will be useful,
  3702      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3703      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3704      GNU Lesser General Public License for more details.
  3705  
  3706      You should have received a copy of the GNU Lesser General Public License
  3707      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3708  */
  3709  /**
  3710   * @file formatters.js
  3711   * @author Marek Kotewicz <marek@ethdev.com>
  3712   * @author Fabian Vogelsteller <fabian@ethdev.com>
  3713   * @date 2015
  3714   */
  3715  
  3716  var utils = require('../utils/utils');
  3717  var config = require('../utils/config');
  3718  var Iban = require('./iban');
  3719  
  3720  /**
  3721   * Should the format output to a big number
  3722   *
  3723   * @method outputBigNumberFormatter
  3724   * @param {String|Number|BigNumber}
  3725   * @returns {BigNumber} object
  3726   */
  3727  var outputBigNumberFormatter = function (number) {
  3728      return utils.toBigNumber(number);
  3729  };
  3730  
  3731  var isPredefinedBlockNumber = function (blockNumber) {
  3732      return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest';
  3733  };
  3734  
  3735  var inputDefaultBlockNumberFormatter = function (blockNumber) {
  3736      if (blockNumber === undefined) {
  3737          return config.defaultBlock;
  3738      }
  3739      return inputBlockNumberFormatter(blockNumber);
  3740  };
  3741  
  3742  var inputBlockNumberFormatter = function (blockNumber) {
  3743      if (blockNumber === undefined) {
  3744          return undefined;
  3745      } else if (isPredefinedBlockNumber(blockNumber)) {
  3746          return blockNumber;
  3747      }
  3748      return utils.toHex(blockNumber);
  3749  };
  3750  
  3751  /**
  3752   * Formats the input of a transaction and converts all values to HEX
  3753   *
  3754   * @method inputCallFormatter
  3755   * @param {Object} transaction options
  3756   * @returns object
  3757  */
  3758  var inputCallFormatter = function (options){
  3759  
  3760      options.from = options.from || config.defaultAccount;
  3761  
  3762      if (options.from) {
  3763          options.from = inputAddressFormatter(options.from);
  3764      }
  3765  
  3766      if (options.to) { // it might be contract creation
  3767          options.to = inputAddressFormatter(options.to);
  3768      }
  3769  
  3770      ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {
  3771          return options[key] !== undefined;
  3772      }).forEach(function(key){
  3773          options[key] = utils.fromDecimal(options[key]);
  3774      });
  3775  
  3776      return options;
  3777  };
  3778  
  3779  /**
  3780   * Formats the input of a transaction and converts all values to HEX
  3781   *
  3782   * @method inputTransactionFormatter
  3783   * @param {Object} transaction options
  3784   * @returns object
  3785  */
  3786  var inputTransactionFormatter = function (options){
  3787  
  3788      options.from = options.from || config.defaultAccount;
  3789      options.from = inputAddressFormatter(options.from);
  3790  
  3791      if (options.to) { // it might be contract creation
  3792          options.to = inputAddressFormatter(options.to);
  3793      }
  3794  
  3795      ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {
  3796          return options[key] !== undefined;
  3797      }).forEach(function(key){
  3798          options[key] = utils.fromDecimal(options[key]);
  3799      });
  3800  
  3801      return options;
  3802  };
  3803  
  3804  /**
  3805   * Formats the output of a transaction to its proper values
  3806   *
  3807   * @method outputTransactionFormatter
  3808   * @param {Object} tx
  3809   * @returns {Object}
  3810  */
  3811  var outputTransactionFormatter = function (tx){
  3812      if(tx.blockNumber !== null)
  3813          tx.blockNumber = utils.toDecimal(tx.blockNumber);
  3814      if(tx.transactionIndex !== null)
  3815          tx.transactionIndex = utils.toDecimal(tx.transactionIndex);
  3816      tx.nonce = utils.toDecimal(tx.nonce);
  3817      tx.gas = utils.toDecimal(tx.gas);
  3818      tx.gasPrice = utils.toBigNumber(tx.gasPrice);
  3819      if(tx.maxFeePerGas !== undefined) {
  3820        tx.maxFeePerGas = utils.toBigNumber(tx.maxFeePerGas);
  3821      }
  3822      if(tx.maxPriorityFeePerGas !== undefined) {
  3823        tx.maxPriorityFeePerGas = utils.toBigNumber(tx.maxPriorityFeePerGas);
  3824      }
  3825      tx.value = utils.toBigNumber(tx.value);
  3826      return tx;
  3827  };
  3828  
  3829  /**
  3830   * Formats the output of a transaction receipt to its proper values
  3831   *
  3832   * @method outputTransactionReceiptFormatter
  3833   * @param {Object} receipt
  3834   * @returns {Object}
  3835  */
  3836  var outputTransactionReceiptFormatter = function (receipt){
  3837      if(receipt.blockNumber !== null)
  3838          receipt.blockNumber = utils.toDecimal(receipt.blockNumber);
  3839      if(receipt.transactionIndex !== null)
  3840          receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex);
  3841      receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed);
  3842      receipt.gasUsed = utils.toDecimal(receipt.gasUsed);
  3843      if(receipt.effectiveGasPrice !== undefined) {
  3844        receipt.effectiveGasPrice = utils.toBigNumber(receipt.effectiveGasPrice);
  3845      }
  3846      if(utils.isArray(receipt.logs)) {
  3847          receipt.logs = receipt.logs.map(function(log){
  3848              return outputLogFormatter(log);
  3849          });
  3850      }
  3851  
  3852      return receipt;
  3853  };
  3854  
  3855  /**
  3856   * Formats the output of a block to its proper values
  3857   *
  3858   * @method outputBlockFormatter
  3859   * @param {Object} block
  3860   * @returns {Object}
  3861  */
  3862  var outputBlockFormatter = function(block) {
  3863      // transform to number
  3864      if (block.baseFeePerGas !== undefined) {
  3865        block.baseFeePerGas = utils.toBigNumber(block.baseFeePerGas);
  3866      }
  3867      block.gasLimit = utils.toDecimal(block.gasLimit);
  3868      block.gasUsed = utils.toDecimal(block.gasUsed);
  3869      block.size = utils.toDecimal(block.size);
  3870      block.timestamp = utils.toDecimal(block.timestamp);
  3871      if(block.number !== null)
  3872          block.number = utils.toDecimal(block.number);
  3873  
  3874      block.difficulty = utils.toBigNumber(block.difficulty);
  3875      block.totalDifficulty = utils.toBigNumber(block.totalDifficulty);
  3876  
  3877      if (utils.isArray(block.transactions)) {
  3878          block.transactions.forEach(function(item){
  3879              if(!utils.isString(item))
  3880                  return outputTransactionFormatter(item);
  3881          });
  3882      }
  3883  
  3884      return block;
  3885  };
  3886  
  3887  /**
  3888   * Formats the output of a log
  3889   *
  3890   * @method outputLogFormatter
  3891   * @param {Object} log object
  3892   * @returns {Object} log
  3893  */
  3894  var outputLogFormatter = function(log) {
  3895      if(log.blockNumber)
  3896          log.blockNumber = utils.toDecimal(log.blockNumber);
  3897      if(log.transactionIndex)
  3898          log.transactionIndex = utils.toDecimal(log.transactionIndex);
  3899      if(log.logIndex)
  3900          log.logIndex = utils.toDecimal(log.logIndex);
  3901  
  3902      return log;
  3903  };
  3904  
  3905  /**
  3906   * Formats the input of a whisper post and converts all values to HEX
  3907   *
  3908   * @method inputPostFormatter
  3909   * @param {Object} transaction object
  3910   * @returns {Object}
  3911  */
  3912  var inputPostFormatter = function(post) {
  3913  
  3914      // post.payload = utils.toHex(post.payload);
  3915      post.ttl = utils.fromDecimal(post.ttl);
  3916      post.workToProve = utils.fromDecimal(post.workToProve);
  3917      post.priority = utils.fromDecimal(post.priority);
  3918  
  3919      // fallback
  3920      if (!utils.isArray(post.topics)) {
  3921          post.topics = post.topics ? [post.topics] : [];
  3922      }
  3923  
  3924      // format the following options
  3925      post.topics = post.topics.map(function(topic){
  3926          // convert only if not hex
  3927          return (topic.indexOf('0x') === 0) ? topic : utils.fromUtf8(topic);
  3928      });
  3929  
  3930      return post;
  3931  };
  3932  
  3933  /**
  3934   * Formats the output of a received post message
  3935   *
  3936   * @method outputPostFormatter
  3937   * @param {Object}
  3938   * @returns {Object}
  3939   */
  3940  var outputPostFormatter = function(post){
  3941  
  3942      post.expiry = utils.toDecimal(post.expiry);
  3943      post.sent = utils.toDecimal(post.sent);
  3944      post.ttl = utils.toDecimal(post.ttl);
  3945      post.workProved = utils.toDecimal(post.workProved);
  3946      // post.payloadRaw = post.payload;
  3947      // post.payload = utils.toAscii(post.payload);
  3948  
  3949      // if (utils.isJson(post.payload)) {
  3950      //     post.payload = JSON.parse(post.payload);
  3951      // }
  3952  
  3953      // format the following options
  3954      if (!post.topics) {
  3955          post.topics = [];
  3956      }
  3957      post.topics = post.topics.map(function(topic){
  3958          return utils.toAscii(topic);
  3959      });
  3960  
  3961      return post;
  3962  };
  3963  
  3964  var inputAddressFormatter = function (address) {
  3965      var iban = new Iban(address);
  3966      if (iban.isValid() && iban.isDirect()) {
  3967          return '0x' + iban.address();
  3968      } else if (utils.isStrictAddress(address)) {
  3969          return address;
  3970      } else if (utils.isAddress(address)) {
  3971          return '0x' + address;
  3972      }
  3973      throw new Error('invalid address');
  3974  };
  3975  
  3976  
  3977  var outputSyncingFormatter = function(result) {
  3978      if (!result) {
  3979          return result;
  3980      }
  3981  
  3982      result.startingBlock = utils.toDecimal(result.startingBlock);
  3983      result.currentBlock = utils.toDecimal(result.currentBlock);
  3984      result.highestBlock = utils.toDecimal(result.highestBlock);
  3985      if (result.knownStates) {
  3986          result.knownStates = utils.toDecimal(result.knownStates);
  3987          result.pulledStates = utils.toDecimal(result.pulledStates);
  3988      }
  3989  
  3990      return result;
  3991  };
  3992  
  3993  module.exports = {
  3994      inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter,
  3995      inputBlockNumberFormatter: inputBlockNumberFormatter,
  3996      inputCallFormatter: inputCallFormatter,
  3997      inputTransactionFormatter: inputTransactionFormatter,
  3998      inputAddressFormatter: inputAddressFormatter,
  3999      inputPostFormatter: inputPostFormatter,
  4000      outputBigNumberFormatter: outputBigNumberFormatter,
  4001      outputTransactionFormatter: outputTransactionFormatter,
  4002      outputTransactionReceiptFormatter: outputTransactionReceiptFormatter,
  4003      outputBlockFormatter: outputBlockFormatter,
  4004      outputLogFormatter: outputLogFormatter,
  4005      outputPostFormatter: outputPostFormatter,
  4006      outputSyncingFormatter: outputSyncingFormatter
  4007  };
  4008  
  4009  
  4010  },{"../utils/config":18,"../utils/utils":20,"./iban":33}],31:[function(require,module,exports){
  4011  /*
  4012      This file is part of web3.js.
  4013  
  4014      web3.js is free software: you can redistribute it and/or modify
  4015      it under the terms of the GNU Lesser General Public License as published by
  4016      the Free Software Foundation, either version 3 of the License, or
  4017      (at your option) any later version.
  4018  
  4019      web3.js is distributed in the hope that it will be useful,
  4020      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4021      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4022      GNU Lesser General Public License for more details.
  4023  
  4024      You should have received a copy of the GNU Lesser General Public License
  4025      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4026  */
  4027  /**
  4028   * @file function.js
  4029   * @author Marek Kotewicz <marek@ethdev.com>
  4030   * @date 2015
  4031   */
  4032  
  4033  var coder = require('../solidity/coder');
  4034  var utils = require('../utils/utils');
  4035  var errors = require('./errors');
  4036  var formatters = require('./formatters');
  4037  var sha3 = require('../utils/sha3');
  4038  
  4039  /**
  4040   * This prototype should be used to call/sendTransaction to solidity functions
  4041   */
  4042  var SolidityFunction = function (eth, json, address) {
  4043      this._eth = eth;
  4044      this._inputTypes = json.inputs.map(function (i) {
  4045          return i.type;
  4046      });
  4047      this._outputTypes = json.outputs.map(function (i) {
  4048          return i.type;
  4049      });
  4050      this._constant = json.constant;
  4051      this._payable = json.payable;
  4052      this._name = utils.transformToFullName(json);
  4053      this._address = address;
  4054  };
  4055  
  4056  SolidityFunction.prototype.extractCallback = function (args) {
  4057      if (utils.isFunction(args[args.length - 1])) {
  4058          return args.pop(); // modify the args array!
  4059      }
  4060  };
  4061  
  4062  SolidityFunction.prototype.extractDefaultBlock = function (args) {
  4063      if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) {
  4064          return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array!
  4065      }
  4066  };
  4067  
  4068  /**
  4069   * Should be called to check if the number of arguments is correct
  4070   *
  4071   * @method validateArgs
  4072   * @param {Array} arguments
  4073   * @throws {Error} if it is not
  4074   */
  4075  SolidityFunction.prototype.validateArgs = function (args) {
  4076      var inputArgs = args.filter(function (a) {
  4077        // filter the options object but not arguments that are arrays
  4078        return !( (utils.isObject(a) === true) &&
  4079                  (utils.isArray(a) === false) &&
  4080                  (utils.isBigNumber(a) === false)
  4081                );
  4082      });
  4083      if (inputArgs.length !== this._inputTypes.length) {
  4084          throw errors.InvalidNumberOfSolidityArgs();
  4085      }
  4086  };
  4087  
  4088  /**
  4089   * Should be used to create payload from arguments
  4090   *
  4091   * @method toPayload
  4092   * @param {Array} solidity function params
  4093   * @param {Object} optional payload options
  4094   */
  4095  SolidityFunction.prototype.toPayload = function (args) {
  4096      var options = {};
  4097      if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) {
  4098          options = args[args.length - 1];
  4099      }
  4100      this.validateArgs(args);
  4101      options.to = this._address;
  4102      options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args);
  4103      return options;
  4104  };
  4105  
  4106  /**
  4107   * Should be used to get function signature
  4108   *
  4109   * @method signature
  4110   * @return {String} function signature
  4111   */
  4112  SolidityFunction.prototype.signature = function () {
  4113      return sha3(this._name).slice(0, 8);
  4114  };
  4115  
  4116  
  4117  SolidityFunction.prototype.unpackOutput = function (output) {
  4118      if (!output) {
  4119          return;
  4120      }
  4121  
  4122      output = output.length >= 2 ? output.slice(2) : output;
  4123      var result = coder.decodeParams(this._outputTypes, output);
  4124      return result.length === 1 ? result[0] : result;
  4125  };
  4126  
  4127  /**
  4128   * Calls a contract function.
  4129   *
  4130   * @method call
  4131   * @param {...Object} Contract function arguments
  4132   * @param {function} If the last argument is a function, the contract function
  4133   *   call will be asynchronous, and the callback will be passed the
  4134   *   error and result.
  4135   * @return {String} output bytes
  4136   */
  4137  SolidityFunction.prototype.call = function () {
  4138      var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
  4139      var callback = this.extractCallback(args);
  4140      var defaultBlock = this.extractDefaultBlock(args);
  4141      var payload = this.toPayload(args);
  4142  
  4143  
  4144      if (!callback) {
  4145          var output = this._eth.call(payload, defaultBlock);
  4146          return this.unpackOutput(output);
  4147      }
  4148  
  4149      var self = this;
  4150      this._eth.call(payload, defaultBlock, function (error, output) {
  4151          if (error) return callback(error, null);
  4152  
  4153          var unpacked = null;
  4154          try {
  4155              unpacked = self.unpackOutput(output);
  4156          }
  4157          catch (e) {
  4158              error = e;
  4159          }
  4160  
  4161          callback(error, unpacked);
  4162      });
  4163  };
  4164  
  4165  /**
  4166   * Should be used to sendTransaction to solidity function
  4167   *
  4168   * @method sendTransaction
  4169   */
  4170  SolidityFunction.prototype.sendTransaction = function () {
  4171      var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
  4172      var callback = this.extractCallback(args);
  4173      var payload = this.toPayload(args);
  4174  
  4175      if (payload.value > 0 && !this._payable) {
  4176          throw new Error('Cannot send value to non-payable function');
  4177      }
  4178  
  4179      if (!callback) {
  4180          return this._eth.sendTransaction(payload);
  4181      }
  4182  
  4183      this._eth.sendTransaction(payload, callback);
  4184  };
  4185  
  4186  /**
  4187   * Should be used to estimateGas of solidity function
  4188   *
  4189   * @method estimateGas
  4190   */
  4191  SolidityFunction.prototype.estimateGas = function () {
  4192      var args = Array.prototype.slice.call(arguments);
  4193      var callback = this.extractCallback(args);
  4194      var payload = this.toPayload(args);
  4195  
  4196      if (!callback) {
  4197          return this._eth.estimateGas(payload);
  4198      }
  4199  
  4200      this._eth.estimateGas(payload, callback);
  4201  };
  4202  
  4203  /**
  4204   * Return the encoded data of the call
  4205   *
  4206   * @method getData
  4207   * @return {String} the encoded data
  4208   */
  4209  SolidityFunction.prototype.getData = function () {
  4210      var args = Array.prototype.slice.call(arguments);
  4211      var payload = this.toPayload(args);
  4212  
  4213      return payload.data;
  4214  };
  4215  
  4216  /**
  4217   * Should be used to get function display name
  4218   *
  4219   * @method displayName
  4220   * @return {String} display name of the function
  4221   */
  4222  SolidityFunction.prototype.displayName = function () {
  4223      return utils.extractDisplayName(this._name);
  4224  };
  4225  
  4226  /**
  4227   * Should be used to get function type name
  4228   *
  4229   * @method typeName
  4230   * @return {String} type name of the function
  4231   */
  4232  SolidityFunction.prototype.typeName = function () {
  4233      return utils.extractTypeName(this._name);
  4234  };
  4235  
  4236  /**
  4237   * Should be called to get rpc requests from solidity function
  4238   *
  4239   * @method request
  4240   * @returns {Object}
  4241   */
  4242  SolidityFunction.prototype.request = function () {
  4243      var args = Array.prototype.slice.call(arguments);
  4244      var callback = this.extractCallback(args);
  4245      var payload = this.toPayload(args);
  4246      var format = this.unpackOutput.bind(this);
  4247  
  4248      return {
  4249          method: this._constant ? 'eth_call' : 'eth_sendTransaction',
  4250          callback: callback,
  4251          params: [payload],
  4252          format: format
  4253      };
  4254  };
  4255  
  4256  /**
  4257   * Should be called to execute function
  4258   *
  4259   * @method execute
  4260   */
  4261  SolidityFunction.prototype.execute = function () {
  4262      var transaction = !this._constant;
  4263  
  4264      // send transaction
  4265      if (transaction) {
  4266          return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));
  4267      }
  4268  
  4269      // call
  4270      return this.call.apply(this, Array.prototype.slice.call(arguments));
  4271  };
  4272  
  4273  /**
  4274   * Should be called to attach function to contract
  4275   *
  4276   * @method attachToContract
  4277   * @param {Contract}
  4278   */
  4279  SolidityFunction.prototype.attachToContract = function (contract) {
  4280      var execute = this.execute.bind(this);
  4281      execute.request = this.request.bind(this);
  4282      execute.call = this.call.bind(this);
  4283      execute.sendTransaction = this.sendTransaction.bind(this);
  4284      execute.estimateGas = this.estimateGas.bind(this);
  4285      execute.getData = this.getData.bind(this);
  4286      var displayName = this.displayName();
  4287      if (!contract[displayName]) {
  4288          contract[displayName] = execute;
  4289      }
  4290      contract[displayName][this.typeName()] = execute; // circular!!!!
  4291  };
  4292  
  4293  module.exports = SolidityFunction;
  4294  
  4295  },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./errors":26,"./formatters":30}],32:[function(require,module,exports){
  4296  /*
  4297      This file is part of web3.js.
  4298  
  4299      web3.js is free software: you can redistribute it and/or modify
  4300      it under the terms of the GNU Lesser General Public License as published by
  4301      the Free Software Foundation, either version 3 of the License, or
  4302      (at your option) any later version.
  4303  
  4304      web3.js is distributed in the hope that it will be useful,
  4305      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4306      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4307      GNU Lesser General Public License for more details.
  4308  
  4309      You should have received a copy of the GNU Lesser General Public License
  4310      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4311  */
  4312  /** @file httpprovider.js
  4313   * @authors:
  4314   *   Marek Kotewicz <marek@ethdev.com>
  4315   *   Marian Oancea <marian@ethdev.com>
  4316   *   Fabian Vogelsteller <fabian@ethdev.com>
  4317   * @date 2015
  4318   */
  4319  
  4320  var errors = require('./errors');
  4321  
  4322  // workaround to use httpprovider in different envs
  4323  
  4324  // browser
  4325  if (typeof window !== 'undefined' && window.XMLHttpRequest) {
  4326    XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line
  4327  // node
  4328  } else {
  4329    XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line
  4330  }
  4331  
  4332  var XHR2 = require('xhr2'); // jshint ignore: line
  4333  
  4334  /**
  4335   * HttpProvider should be used to send rpc calls over http
  4336   */
  4337  var HttpProvider = function (host, timeout, user, password) {
  4338    this.host = host || 'http://localhost:8545';
  4339    this.timeout = timeout || 0;
  4340    this.user = user;
  4341    this.password = password;
  4342  };
  4343  
  4344  /**
  4345   * Should be called to prepare new XMLHttpRequest
  4346   *
  4347   * @method prepareRequest
  4348   * @param {Boolean} true if request should be async
  4349   * @return {XMLHttpRequest} object
  4350   */
  4351  HttpProvider.prototype.prepareRequest = function (async) {
  4352    var request;
  4353  
  4354    if (async) {
  4355      request = new XHR2();
  4356      request.timeout = this.timeout;
  4357    } else {
  4358      request = new XMLHttpRequest();
  4359    }
  4360  
  4361    request.open('POST', this.host, async);
  4362    if (this.user && this.password) {
  4363      var auth = 'Basic ' + new Buffer(this.user + ':' + this.password).toString('base64');
  4364      request.setRequestHeader('Authorization', auth);
  4365    } request.setRequestHeader('Content-Type', 'application/json');
  4366    return request;
  4367  };
  4368  
  4369  /**
  4370   * Should be called to make sync request
  4371   *
  4372   * @method send
  4373   * @param {Object} payload
  4374   * @return {Object} result
  4375   */
  4376  HttpProvider.prototype.send = function (payload) {
  4377    var request = this.prepareRequest(false);
  4378  
  4379    try {
  4380      request.send(JSON.stringify(payload));
  4381    } catch (error) {
  4382      throw errors.InvalidConnection(this.host);
  4383    }
  4384  
  4385    var result = request.responseText;
  4386  
  4387    try {
  4388      result = JSON.parse(result);
  4389    } catch (e) {
  4390      throw errors.InvalidResponse(request.responseText);
  4391    }
  4392  
  4393    return result;
  4394  };
  4395  
  4396  /**
  4397   * Should be used to make async request
  4398   *
  4399   * @method sendAsync
  4400   * @param {Object} payload
  4401   * @param {Function} callback triggered on end with (err, result)
  4402   */
  4403  HttpProvider.prototype.sendAsync = function (payload, callback) {
  4404    var request = this.prepareRequest(true);
  4405  
  4406    request.onreadystatechange = function () {
  4407      if (request.readyState === 4 && request.timeout !== 1) {
  4408        var result = request.responseText;
  4409        var error = null;
  4410  
  4411        try {
  4412          result = JSON.parse(result);
  4413        } catch (e) {
  4414          error = errors.InvalidResponse(request.responseText);
  4415        }
  4416  
  4417        callback(error, result);
  4418      }
  4419    };
  4420  
  4421    request.ontimeout = function () {
  4422      callback(errors.ConnectionTimeout(this.timeout));
  4423    };
  4424  
  4425    try {
  4426      request.send(JSON.stringify(payload));
  4427    } catch (error) {
  4428      callback(errors.InvalidConnection(this.host));
  4429    }
  4430  };
  4431  
  4432  /**
  4433   * Synchronously tries to make Http request
  4434   *
  4435   * @method isConnected
  4436   * @return {Boolean} returns true if request haven't failed. Otherwise false
  4437   */
  4438  HttpProvider.prototype.isConnected = function () {
  4439    try {
  4440      this.send({
  4441        id: 9999999999,
  4442        jsonrpc: '2.0',
  4443        method: 'net_listening',
  4444        params: []
  4445      });
  4446      return true;
  4447    } catch (e) {
  4448      return false;
  4449    }
  4450  };
  4451  
  4452  module.exports = HttpProvider;
  4453  
  4454  },{"./errors":26,"xhr2":86,"xmlhttprequest":17}],33:[function(require,module,exports){
  4455  /*
  4456      This file is part of web3.js.
  4457  
  4458      web3.js is free software: you can redistribute it and/or modify
  4459      it under the terms of the GNU Lesser General Public License as published by
  4460      the Free Software Foundation, either version 3 of the License, or
  4461      (at your option) any later version.
  4462  
  4463      web3.js is distributed in the hope that it will be useful,
  4464      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4465      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4466      GNU Lesser General Public License for more details.
  4467  
  4468      You should have received a copy of the GNU Lesser General Public License
  4469      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4470  */
  4471  /** 
  4472   * @file iban.js
  4473   * @author Marek Kotewicz <marek@ethdev.com>
  4474   * @date 2015
  4475   */
  4476  
  4477  var BigNumber = require('bignumber.js');
  4478  
  4479  var padLeft = function (string, bytes) {
  4480      var result = string;
  4481      while (result.length < bytes * 2) {
  4482          result = '0' + result;
  4483      }
  4484      return result;
  4485  };
  4486  
  4487  /**
  4488   * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to
  4489   * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616.
  4490   *
  4491   * @method iso13616Prepare
  4492   * @param {String} iban the IBAN
  4493   * @returns {String} the prepared IBAN
  4494   */
  4495  var iso13616Prepare = function (iban) {
  4496      var A = 'A'.charCodeAt(0);
  4497      var Z = 'Z'.charCodeAt(0);
  4498  
  4499      iban = iban.toUpperCase();
  4500      iban = iban.substr(4) + iban.substr(0,4);
  4501  
  4502      return iban.split('').map(function(n){
  4503          var code = n.charCodeAt(0);
  4504          if (code >= A && code <= Z){
  4505              // A = 10, B = 11, ... Z = 35
  4506              return code - A + 10;
  4507          } else {
  4508              return n;
  4509          }
  4510      }).join('');
  4511  };
  4512  
  4513  /**
  4514   * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064.
  4515   *
  4516   * @method mod9710
  4517   * @param {String} iban
  4518   * @returns {Number}
  4519   */
  4520  var mod9710 = function (iban) {
  4521      var remainder = iban,
  4522          block;
  4523  
  4524      while (remainder.length > 2){
  4525          block = remainder.slice(0, 9);
  4526          remainder = parseInt(block, 10) % 97 + remainder.slice(block.length);
  4527      }
  4528  
  4529      return parseInt(remainder, 10) % 97;
  4530  };
  4531  
  4532  /**
  4533   * This prototype should be used to create iban object from iban correct string
  4534   *
  4535   * @param {String} iban
  4536   */
  4537  var Iban = function (iban) {
  4538      this._iban = iban;
  4539  };
  4540  
  4541  /**
  4542   * This method should be used to create iban object from ethereum address
  4543   *
  4544   * @method fromAddress
  4545   * @param {String} address
  4546   * @return {Iban} the IBAN object
  4547   */
  4548  Iban.fromAddress = function (address) {
  4549      var asBn = new BigNumber(address, 16);
  4550      var base36 = asBn.toString(36);
  4551      var padded = padLeft(base36, 15);
  4552      return Iban.fromBban(padded.toUpperCase());
  4553  };
  4554  
  4555  /**
  4556   * Convert the passed BBAN to an IBAN for this country specification.
  4557   * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>.
  4558   * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits
  4559   *
  4560   * @method fromBban
  4561   * @param {String} bban the BBAN to convert to IBAN
  4562   * @returns {Iban} the IBAN object
  4563   */
  4564  Iban.fromBban = function (bban) {
  4565      var countryCode = 'XE';
  4566  
  4567      var remainder = mod9710(iso13616Prepare(countryCode + '00' + bban));
  4568      var checkDigit = ('0' + (98 - remainder)).slice(-2);
  4569  
  4570      return new Iban(countryCode + checkDigit + bban);
  4571  };
  4572  
  4573  /**
  4574   * Should be used to create IBAN object for given institution and identifier
  4575   *
  4576   * @method createIndirect
  4577   * @param {Object} options, required options are "institution" and "identifier"
  4578   * @return {Iban} the IBAN object
  4579   */
  4580  Iban.createIndirect = function (options) {
  4581      return Iban.fromBban('ETH' + options.institution + options.identifier);
  4582  };
  4583  
  4584  /**
  4585   * Thos method should be used to check if given string is valid iban object
  4586   *
  4587   * @method isValid
  4588   * @param {String} iban string
  4589   * @return {Boolean} true if it is valid IBAN
  4590   */
  4591  Iban.isValid = function (iban) {
  4592      var i = new Iban(iban);
  4593      return i.isValid();
  4594  };
  4595  
  4596  /**
  4597   * Should be called to check if iban is correct
  4598   *
  4599   * @method isValid
  4600   * @returns {Boolean} true if it is, otherwise false
  4601   */
  4602  Iban.prototype.isValid = function () {
  4603      return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) &&
  4604          mod9710(iso13616Prepare(this._iban)) === 1;
  4605  };
  4606  
  4607  /**
  4608   * Should be called to check if iban number is direct
  4609   *
  4610   * @method isDirect
  4611   * @returns {Boolean} true if it is, otherwise false
  4612   */
  4613  Iban.prototype.isDirect = function () {
  4614      return this._iban.length === 34 || this._iban.length === 35;
  4615  };
  4616  
  4617  /**
  4618   * Should be called to check if iban number if indirect
  4619   *
  4620   * @method isIndirect
  4621   * @returns {Boolean} true if it is, otherwise false
  4622   */
  4623  Iban.prototype.isIndirect = function () {
  4624      return this._iban.length === 20;
  4625  };
  4626  
  4627  /**
  4628   * Should be called to get iban checksum
  4629   * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003)
  4630   *
  4631   * @method checksum
  4632   * @returns {String} checksum
  4633   */
  4634  Iban.prototype.checksum = function () {
  4635      return this._iban.substr(2, 2);
  4636  };
  4637  
  4638  /**
  4639   * Should be called to get institution identifier
  4640   * eg. XREG
  4641   *
  4642   * @method institution
  4643   * @returns {String} institution identifier
  4644   */
  4645  Iban.prototype.institution = function () {
  4646      return this.isIndirect() ? this._iban.substr(7, 4) : '';
  4647  };
  4648  
  4649  /**
  4650   * Should be called to get client identifier within institution
  4651   * eg. GAVOFYORK
  4652   *
  4653   * @method client
  4654   * @returns {String} client identifier
  4655   */
  4656  Iban.prototype.client = function () {
  4657      return this.isIndirect() ? this._iban.substr(11) : '';
  4658  };
  4659  
  4660  /**
  4661   * Should be called to get client direct address
  4662   *
  4663   * @method address
  4664   * @returns {String} client direct address
  4665   */
  4666  Iban.prototype.address = function () {
  4667      if (this.isDirect()) {
  4668          var base36 = this._iban.substr(4);
  4669          var asBn = new BigNumber(base36, 36);
  4670          return padLeft(asBn.toString(16), 20);
  4671      } 
  4672  
  4673      return '';
  4674  };
  4675  
  4676  Iban.prototype.toString = function () {
  4677      return this._iban;
  4678  };
  4679  
  4680  module.exports = Iban;
  4681  
  4682  
  4683  },{"bignumber.js":"bignumber.js"}],34:[function(require,module,exports){
  4684  /*
  4685      This file is part of web3.js.
  4686  
  4687      web3.js is free software: you can redistribute it and/or modify
  4688      it under the terms of the GNU Lesser General Public License as published by
  4689      the Free Software Foundation, either version 3 of the License, or
  4690      (at your option) any later version.
  4691  
  4692      web3.js is distributed in the hope that it will be useful,
  4693      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4694      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4695      GNU Lesser General Public License for more details.
  4696  
  4697      You should have received a copy of the GNU Lesser General Public License
  4698      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4699  */
  4700  /** @file ipcprovider.js
  4701   * @authors:
  4702   *   Fabian Vogelsteller <fabian@ethdev.com>
  4703   * @date 2015
  4704   */
  4705  
  4706  "use strict";
  4707  
  4708  var utils = require('../utils/utils');
  4709  var errors = require('./errors');
  4710  
  4711  
  4712  var IpcProvider = function (path, net) {
  4713      var _this = this;
  4714      this.responseCallbacks = {};
  4715      this.path = path;
  4716      
  4717      this.connection = net.connect({path: this.path});
  4718  
  4719      this.connection.on('error', function(e){
  4720          console.error('IPC Connection Error', e);
  4721          _this._timeout();
  4722      });
  4723  
  4724      this.connection.on('end', function(){
  4725          _this._timeout();
  4726      }); 
  4727  
  4728  
  4729      // LISTEN FOR CONNECTION RESPONSES
  4730      this.connection.on('data', function(data) {
  4731          /*jshint maxcomplexity: 6 */
  4732  
  4733          _this._parseResponse(data.toString()).forEach(function(result){
  4734  
  4735              var id = null;
  4736  
  4737              // get the id which matches the returned id
  4738              if(utils.isArray(result)) {
  4739                  result.forEach(function(load){
  4740                      if(_this.responseCallbacks[load.id])
  4741                          id = load.id;
  4742                  });
  4743              } else {
  4744                  id = result.id;
  4745              }
  4746  
  4747              // fire the callback
  4748              if(_this.responseCallbacks[id]) {
  4749                  _this.responseCallbacks[id](null, result);
  4750                  delete _this.responseCallbacks[id];
  4751              }
  4752          });
  4753      });
  4754  };
  4755  
  4756  /**
  4757  Will parse the response and make an array out of it.
  4758  
  4759  @method _parseResponse
  4760  @param {String} data
  4761  */
  4762  IpcProvider.prototype._parseResponse = function(data) {
  4763      var _this = this,
  4764          returnValues = [];
  4765      
  4766      // DE-CHUNKER
  4767      var dechunkedData = data
  4768          .replace(/\}[\n\r]?\{/g,'}|--|{') // }{
  4769          .replace(/\}\][\n\r]?\[\{/g,'}]|--|[{') // }][{
  4770          .replace(/\}[\n\r]?\[\{/g,'}|--|[{') // }[{
  4771          .replace(/\}\][\n\r]?\{/g,'}]|--|{') // }]{
  4772          .split('|--|');
  4773  
  4774      dechunkedData.forEach(function(data){
  4775  
  4776          // prepend the last chunk
  4777          if(_this.lastChunk)
  4778              data = _this.lastChunk + data;
  4779  
  4780          var result = null;
  4781  
  4782          try {
  4783              result = JSON.parse(data);
  4784  
  4785          } catch(e) {
  4786  
  4787              _this.lastChunk = data;
  4788  
  4789              // start timeout to cancel all requests
  4790              clearTimeout(_this.lastChunkTimeout);
  4791              _this.lastChunkTimeout = setTimeout(function(){
  4792                  _this._timeout();
  4793                  throw errors.InvalidResponse(data);
  4794              }, 1000 * 15);
  4795  
  4796              return;
  4797          }
  4798  
  4799          // cancel timeout and set chunk to null
  4800          clearTimeout(_this.lastChunkTimeout);
  4801          _this.lastChunk = null;
  4802  
  4803          if(result)
  4804              returnValues.push(result);
  4805      });
  4806  
  4807      return returnValues;
  4808  };
  4809  
  4810  
  4811  /**
  4812  Get the adds a callback to the responseCallbacks object,
  4813  which will be called if a response matching the response Id will arrive.
  4814  
  4815  @method _addResponseCallback
  4816  */
  4817  IpcProvider.prototype._addResponseCallback = function(payload, callback) {
  4818      var id = payload.id || payload[0].id;
  4819      var method = payload.method || payload[0].method;
  4820  
  4821      this.responseCallbacks[id] = callback;
  4822      this.responseCallbacks[id].method = method;
  4823  };
  4824  
  4825  /**
  4826  Timeout all requests when the end/error event is fired
  4827  
  4828  @method _timeout
  4829  */
  4830  IpcProvider.prototype._timeout = function() {
  4831      for(var key in this.responseCallbacks) {
  4832          if(this.responseCallbacks.hasOwnProperty(key)){
  4833              this.responseCallbacks[key](errors.InvalidConnection('on IPC'));
  4834              delete this.responseCallbacks[key];
  4835          }
  4836      }
  4837  };
  4838  
  4839  
  4840  /**
  4841  Check if the current connection is still valid.
  4842  
  4843  @method isConnected
  4844  */
  4845  IpcProvider.prototype.isConnected = function() {
  4846      var _this = this;
  4847  
  4848      // try reconnect, when connection is gone
  4849      if(!_this.connection.writable)
  4850          _this.connection.connect({path: _this.path});
  4851  
  4852      return !!this.connection.writable;
  4853  };
  4854  
  4855  IpcProvider.prototype.send = function (payload) {
  4856  
  4857      if(this.connection.writeSync) {
  4858          var result;
  4859  
  4860          // try reconnect, when connection is gone
  4861          if(!this.connection.writable)
  4862              this.connection.connect({path: this.path});
  4863  
  4864          var data = this.connection.writeSync(JSON.stringify(payload));
  4865  
  4866          try {
  4867              result = JSON.parse(data);
  4868          } catch(e) {
  4869              throw errors.InvalidResponse(data);                
  4870          }
  4871  
  4872          return result;
  4873  
  4874      } else {
  4875          throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.');
  4876      }
  4877  };
  4878  
  4879  IpcProvider.prototype.sendAsync = function (payload, callback) {
  4880      // try reconnect, when connection is gone
  4881      if(!this.connection.writable)
  4882          this.connection.connect({path: this.path});
  4883  
  4884  
  4885      this.connection.write(JSON.stringify(payload));
  4886      this._addResponseCallback(payload, callback);
  4887  };
  4888  
  4889  module.exports = IpcProvider;
  4890  
  4891  
  4892  },{"../utils/utils":20,"./errors":26}],35:[function(require,module,exports){
  4893  /*
  4894      This file is part of web3.js.
  4895  
  4896      web3.js is free software: you can redistribute it and/or modify
  4897      it under the terms of the GNU Lesser General Public License as published by
  4898      the Free Software Foundation, either version 3 of the License, or
  4899      (at your option) any later version.
  4900  
  4901      web3.js is distributed in the hope that it will be useful,
  4902      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4903      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4904      GNU Lesser General Public License for more details.
  4905  
  4906      You should have received a copy of the GNU Lesser General Public License
  4907      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4908  */
  4909  /** @file jsonrpc.js
  4910   * @authors:
  4911   *   Marek Kotewicz <marek@ethdev.com>
  4912   *   Aaron Kumavis <aaron@kumavis.me>
  4913   * @date 2015
  4914   */
  4915  
  4916  // Initialize Jsonrpc as a simple object with utility functions.
  4917  var Jsonrpc = {
  4918      messageId: 0
  4919  };
  4920  
  4921  /**
  4922   * Should be called to valid json create payload object
  4923   *
  4924   * @method toPayload
  4925   * @param {Function} method of jsonrpc call, required
  4926   * @param {Array} params, an array of method params, optional
  4927   * @returns {Object} valid jsonrpc payload object
  4928   */
  4929  Jsonrpc.toPayload = function (method, params) {
  4930      if (!method)
  4931          console.error('jsonrpc method should be specified!');
  4932  
  4933      // advance message ID
  4934      Jsonrpc.messageId++;
  4935  
  4936      return {
  4937          jsonrpc: '2.0',
  4938          id: Jsonrpc.messageId,
  4939          method: method,
  4940          params: params || []
  4941      };
  4942  };
  4943  
  4944  /**
  4945   * Should be called to check if jsonrpc response is valid
  4946   *
  4947   * @method isValidResponse
  4948   * @param {Object}
  4949   * @returns {Boolean} true if response is valid, otherwise false
  4950   */
  4951  Jsonrpc.isValidResponse = function (response) {
  4952      return Array.isArray(response) ? response.every(validateSingleMessage) : validateSingleMessage(response);
  4953  
  4954      function validateSingleMessage(message){
  4955        return !!message &&
  4956          !message.error &&
  4957          message.jsonrpc === '2.0' &&
  4958          typeof message.id === 'number' &&
  4959          message.result !== undefined; // only undefined is not valid json object
  4960      }
  4961  };
  4962  
  4963  /**
  4964   * Should be called to create batch payload object
  4965   *
  4966   * @method toBatchPayload
  4967   * @param {Array} messages, an array of objects with method (required) and params (optional) fields
  4968   * @returns {Array} batch payload
  4969   */
  4970  Jsonrpc.toBatchPayload = function (messages) {
  4971      return messages.map(function (message) {
  4972          return Jsonrpc.toPayload(message.method, message.params);
  4973      });
  4974  };
  4975  
  4976  module.exports = Jsonrpc;
  4977  
  4978  
  4979  },{}],36:[function(require,module,exports){
  4980  /*
  4981      This file is part of web3.js.
  4982  
  4983      web3.js is free software: you can redistribute it and/or modify
  4984      it under the terms of the GNU Lesser General Public License as published by
  4985      the Free Software Foundation, either version 3 of the License, or
  4986      (at your option) any later version.
  4987  
  4988      web3.js is distributed in the hope that it will be useful,
  4989      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4990      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4991      GNU Lesser General Public License for more details.
  4992  
  4993      You should have received a copy of the GNU Lesser General Public License
  4994      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4995  */
  4996  /**
  4997   * @file method.js
  4998   * @author Marek Kotewicz <marek@ethdev.com>
  4999   * @date 2015
  5000   */
  5001  
  5002  var utils = require('../utils/utils');
  5003  var errors = require('./errors');
  5004  
  5005  var Method = function (options) {
  5006      this.name = options.name;
  5007      this.call = options.call;
  5008      this.params = options.params || 0;
  5009      this.inputFormatter = options.inputFormatter;
  5010      this.outputFormatter = options.outputFormatter;
  5011      this.requestManager = null;
  5012  };
  5013  
  5014  Method.prototype.setRequestManager = function (rm) {
  5015      this.requestManager = rm;
  5016  };
  5017  
  5018  /**
  5019   * Should be used to determine name of the jsonrpc method based on arguments
  5020   *
  5021   * @method getCall
  5022   * @param {Array} arguments
  5023   * @return {String} name of jsonrpc method
  5024   */
  5025  Method.prototype.getCall = function (args) {
  5026      return utils.isFunction(this.call) ? this.call(args) : this.call;
  5027  };
  5028  
  5029  /**
  5030   * Should be used to extract callback from array of arguments. Modifies input param
  5031   *
  5032   * @method extractCallback
  5033   * @param {Array} arguments
  5034   * @return {Function|Null} callback, if exists
  5035   */
  5036  Method.prototype.extractCallback = function (args) {
  5037      if (utils.isFunction(args[args.length - 1])) {
  5038          return args.pop(); // modify the args array!
  5039      }
  5040  };
  5041  
  5042  /**
  5043   * Should be called to check if the number of arguments is correct
  5044   * 
  5045   * @method validateArgs
  5046   * @param {Array} arguments
  5047   * @throws {Error} if it is not
  5048   */
  5049  Method.prototype.validateArgs = function (args) {
  5050      if (args.length !== this.params) {
  5051          throw errors.InvalidNumberOfRPCParams();
  5052      }
  5053  };
  5054  
  5055  /**
  5056   * Should be called to format input args of method
  5057   * 
  5058   * @method formatInput
  5059   * @param {Array}
  5060   * @return {Array}
  5061   */
  5062  Method.prototype.formatInput = function (args) {
  5063      if (!this.inputFormatter) {
  5064          return args;
  5065      }
  5066  
  5067      return this.inputFormatter.map(function (formatter, index) {
  5068          return formatter ? formatter(args[index]) : args[index];
  5069      });
  5070  };
  5071  
  5072  /**
  5073   * Should be called to format output(result) of method
  5074   *
  5075   * @method formatOutput
  5076   * @param {Object}
  5077   * @return {Object}
  5078   */
  5079  Method.prototype.formatOutput = function (result) {
  5080      return this.outputFormatter && result ? this.outputFormatter(result) : result;
  5081  };
  5082  
  5083  /**
  5084   * Should create payload from given input args
  5085   *
  5086   * @method toPayload
  5087   * @param {Array} args
  5088   * @return {Object}
  5089   */
  5090  Method.prototype.toPayload = function (args) {
  5091      var call = this.getCall(args);
  5092      var callback = this.extractCallback(args);
  5093      var params = this.formatInput(args);
  5094      this.validateArgs(params);
  5095  
  5096      return {
  5097          method: call,
  5098          params: params,
  5099          callback: callback
  5100      };
  5101  };
  5102  
  5103  Method.prototype.attachToObject = function (obj) {
  5104      var func = this.buildCall();
  5105      func.call = this.call; // TODO!!! that's ugly. filter.js uses it
  5106      var name = this.name.split('.');
  5107      if (name.length > 1) {
  5108          obj[name[0]] = obj[name[0]] || {};
  5109          obj[name[0]][name[1]] = func;
  5110      } else {
  5111          obj[name[0]] = func; 
  5112      }
  5113  };
  5114  
  5115  Method.prototype.buildCall = function() {
  5116      var method = this;
  5117      var send = function () {
  5118          var payload = method.toPayload(Array.prototype.slice.call(arguments));
  5119          if (payload.callback) {
  5120              return method.requestManager.sendAsync(payload, function (err, result) {
  5121                  payload.callback(err, method.formatOutput(result));
  5122              });
  5123          }
  5124          return method.formatOutput(method.requestManager.send(payload));
  5125      };
  5126      send.request = this.request.bind(this);
  5127      return send;
  5128  };
  5129  
  5130  /**
  5131   * Should be called to create pure JSONRPC request which can be used in batch request
  5132   *
  5133   * @method request
  5134   * @param {...} params
  5135   * @return {Object} jsonrpc request
  5136   */
  5137  Method.prototype.request = function () {
  5138      var payload = this.toPayload(Array.prototype.slice.call(arguments));
  5139      payload.format = this.formatOutput.bind(this);
  5140      return payload;
  5141  };
  5142  
  5143  module.exports = Method;
  5144  
  5145  },{"../utils/utils":20,"./errors":26}],37:[function(require,module,exports){
  5146  /*
  5147      This file is part of web3.js.
  5148  
  5149      web3.js is free software: you can redistribute it and/or modify
  5150      it under the terms of the GNU Lesser General Public License as published by
  5151      the Free Software Foundation, either version 3 of the License, or
  5152      (at your option) any later version.
  5153  
  5154      web3.js is distributed in the hope that it will be useful,
  5155      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5156      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5157      GNU Lesser General Public License for more details.
  5158  
  5159      You should have received a copy of the GNU Lesser General Public License
  5160      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5161  */
  5162  /** @file db.js
  5163   * @authors:
  5164   *   Marek Kotewicz <marek@ethdev.com>
  5165   * @date 2015
  5166   */
  5167  
  5168  var Method = require('../method');
  5169  
  5170  var DB = function (web3) {
  5171      this._requestManager = web3._requestManager;
  5172  
  5173      var self = this;
  5174      
  5175      methods().forEach(function(method) { 
  5176          method.attachToObject(self);
  5177          method.setRequestManager(web3._requestManager);
  5178      });
  5179  };
  5180  
  5181  var methods = function () {
  5182      var putString = new Method({
  5183          name: 'putString',
  5184          call: 'db_putString',
  5185          params: 3
  5186      });
  5187  
  5188      var getString = new Method({
  5189          name: 'getString',
  5190          call: 'db_getString',
  5191          params: 2
  5192      });
  5193  
  5194      var putHex = new Method({
  5195          name: 'putHex',
  5196          call: 'db_putHex',
  5197          params: 3
  5198      });
  5199  
  5200      var getHex = new Method({
  5201          name: 'getHex',
  5202          call: 'db_getHex',
  5203          params: 2
  5204      });
  5205  
  5206      return [
  5207          putString, getString, putHex, getHex
  5208      ];
  5209  };
  5210  
  5211  module.exports = DB;
  5212  
  5213  },{"../method":36}],38:[function(require,module,exports){
  5214  /*
  5215      This file is part of web3.js.
  5216  
  5217      web3.js is free software: you can redistribute it and/or modify
  5218      it under the terms of the GNU Lesser General Public License as published by
  5219      the Free Software Foundation, either version 3 of the License, or
  5220      (at your option) any later version.
  5221  
  5222      web3.js is distributed in the hope that it will be useful,
  5223      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5224      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5225      GNU Lesser General Public License for more details.
  5226  
  5227      You should have received a copy of the GNU Lesser General Public License
  5228      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5229  */
  5230  /**
  5231   * @file eth.js
  5232   * @author Marek Kotewicz <marek@ethdev.com>
  5233   * @author Fabian Vogelsteller <fabian@ethdev.com>
  5234   * @date 2015
  5235   */
  5236  
  5237  "use strict";
  5238  
  5239  var formatters = require('../formatters');
  5240  var utils = require('../../utils/utils');
  5241  var Method = require('../method');
  5242  var Property = require('../property');
  5243  var c = require('../../utils/config');
  5244  var Contract = require('../contract');
  5245  var watches = require('./watches');
  5246  var Filter = require('../filter');
  5247  var IsSyncing = require('../syncing');
  5248  var namereg = require('../namereg');
  5249  var Iban = require('../iban');
  5250  var transfer = require('../transfer');
  5251  
  5252  var blockCall = function (args) {
  5253      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber";
  5254  };
  5255  
  5256  var transactionFromBlockCall = function (args) {
  5257      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex';
  5258  };
  5259  
  5260  var uncleCall = function (args) {
  5261      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex';
  5262  };
  5263  
  5264  var getBlockTransactionCountCall = function (args) {
  5265      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber';
  5266  };
  5267  
  5268  var uncleCountCall = function (args) {
  5269      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber';
  5270  };
  5271  
  5272  function Eth(web3) {
  5273      this._requestManager = web3._requestManager;
  5274  
  5275      var self = this;
  5276  
  5277      methods().forEach(function(method) {
  5278          method.attachToObject(self);
  5279          method.setRequestManager(self._requestManager);
  5280      });
  5281  
  5282      properties().forEach(function(p) {
  5283          p.attachToObject(self);
  5284          p.setRequestManager(self._requestManager);
  5285      });
  5286  
  5287  
  5288      this.iban = Iban;
  5289      this.sendIBANTransaction = transfer.bind(null, this);
  5290  }
  5291  
  5292  Object.defineProperty(Eth.prototype, 'defaultBlock', {
  5293      get: function () {
  5294          return c.defaultBlock;
  5295      },
  5296      set: function (val) {
  5297          c.defaultBlock = val;
  5298          return val;
  5299      }
  5300  });
  5301  
  5302  Object.defineProperty(Eth.prototype, 'defaultAccount', {
  5303      get: function () {
  5304          return c.defaultAccount;
  5305      },
  5306      set: function (val) {
  5307          c.defaultAccount = val;
  5308          return val;
  5309      }
  5310  });
  5311  
  5312  var methods = function () {
  5313      var getBalance = new Method({
  5314          name: 'getBalance',
  5315          call: 'eth_getBalance',
  5316          params: 2,
  5317          inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter],
  5318          outputFormatter: formatters.outputBigNumberFormatter
  5319      });
  5320  
  5321      var getStorageAt = new Method({
  5322          name: 'getStorageAt',
  5323          call: 'eth_getStorageAt',
  5324          params: 3,
  5325          inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter]
  5326      });
  5327  
  5328      var getCode = new Method({
  5329          name: 'getCode',
  5330          call: 'eth_getCode',
  5331          params: 2,
  5332          inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter]
  5333      });
  5334  
  5335      var getBlock = new Method({
  5336          name: 'getBlock',
  5337          call: blockCall,
  5338          params: 2,
  5339          inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }],
  5340          outputFormatter: formatters.outputBlockFormatter
  5341      });
  5342  
  5343      var getUncle = new Method({
  5344          name: 'getUncle',
  5345          call: uncleCall,
  5346          params: 2,
  5347          inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
  5348          outputFormatter: formatters.outputBlockFormatter,
  5349  
  5350      });
  5351  
  5352      var getCompilers = new Method({
  5353          name: 'getCompilers',
  5354          call: 'eth_getCompilers',
  5355          params: 0
  5356      });
  5357  
  5358      var getBlockTransactionCount = new Method({
  5359          name: 'getBlockTransactionCount',
  5360          call: getBlockTransactionCountCall,
  5361          params: 1,
  5362          inputFormatter: [formatters.inputBlockNumberFormatter],
  5363          outputFormatter: utils.toDecimal
  5364      });
  5365  
  5366      var getBlockUncleCount = new Method({
  5367          name: 'getBlockUncleCount',
  5368          call: uncleCountCall,
  5369          params: 1,
  5370          inputFormatter: [formatters.inputBlockNumberFormatter],
  5371          outputFormatter: utils.toDecimal
  5372      });
  5373  
  5374      var getTransaction = new Method({
  5375          name: 'getTransaction',
  5376          call: 'eth_getTransactionByHash',
  5377          params: 1,
  5378          outputFormatter: formatters.outputTransactionFormatter
  5379      });
  5380  
  5381      var getTransactionFromBlock = new Method({
  5382          name: 'getTransactionFromBlock',
  5383          call: transactionFromBlockCall,
  5384          params: 2,
  5385          inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
  5386          outputFormatter: formatters.outputTransactionFormatter
  5387      });
  5388  
  5389      var getTransactionReceipt = new Method({
  5390          name: 'getTransactionReceipt',
  5391          call: 'eth_getTransactionReceipt',
  5392          params: 1,
  5393          outputFormatter: formatters.outputTransactionReceiptFormatter
  5394      });
  5395  
  5396      var getTransactionCount = new Method({
  5397          name: 'getTransactionCount',
  5398          call: 'eth_getTransactionCount',
  5399          params: 2,
  5400          inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter],
  5401          outputFormatter: utils.toDecimal
  5402      });
  5403  
  5404      var sendRawTransaction = new Method({
  5405          name: 'sendRawTransaction',
  5406          call: 'eth_sendRawTransaction',
  5407          params: 1,
  5408          inputFormatter: [null]
  5409      });
  5410  
  5411      var sendTransaction = new Method({
  5412          name: 'sendTransaction',
  5413          call: 'eth_sendTransaction',
  5414          params: 1,
  5415          inputFormatter: [formatters.inputTransactionFormatter]
  5416      });
  5417  
  5418      var signTransaction = new Method({
  5419          name: 'signTransaction',
  5420          call: 'eth_signTransaction',
  5421          params: 1,
  5422          inputFormatter: [formatters.inputTransactionFormatter]
  5423      });
  5424  
  5425      var sign = new Method({
  5426          name: 'sign',
  5427          call: 'eth_sign',
  5428          params: 2,
  5429          inputFormatter: [formatters.inputAddressFormatter, null]
  5430      });
  5431  
  5432      var call = new Method({
  5433          name: 'call',
  5434          call: 'eth_call',
  5435          params: 2,
  5436          inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter]
  5437      });
  5438  
  5439      var estimateGas = new Method({
  5440          name: 'estimateGas',
  5441          call: 'eth_estimateGas',
  5442          params: 1,
  5443          inputFormatter: [formatters.inputCallFormatter],
  5444          outputFormatter: utils.toDecimal
  5445      });
  5446  
  5447      var compileSolidity = new Method({
  5448          name: 'compile.solidity',
  5449          call: 'eth_compileSolidity',
  5450          params: 1
  5451      });
  5452  
  5453      var compileLLL = new Method({
  5454          name: 'compile.lll',
  5455          call: 'eth_compileLLL',
  5456          params: 1
  5457      });
  5458  
  5459      var compileSerpent = new Method({
  5460          name: 'compile.serpent',
  5461          call: 'eth_compileSerpent',
  5462          params: 1
  5463      });
  5464  
  5465      var submitWork = new Method({
  5466          name: 'submitWork',
  5467          call: 'eth_submitWork',
  5468          params: 3
  5469      });
  5470  
  5471      var getWork = new Method({
  5472          name: 'getWork',
  5473          call: 'eth_getWork',
  5474          params: 0
  5475      });
  5476  
  5477      return [
  5478          getBalance,
  5479          getStorageAt,
  5480          getCode,
  5481          getBlock,
  5482          getUncle,
  5483          getCompilers,
  5484          getBlockTransactionCount,
  5485          getBlockUncleCount,
  5486          getTransaction,
  5487          getTransactionFromBlock,
  5488          getTransactionReceipt,
  5489          getTransactionCount,
  5490          call,
  5491          estimateGas,
  5492          sendRawTransaction,
  5493          signTransaction,
  5494          sendTransaction,
  5495          sign,
  5496          compileSolidity,
  5497          compileLLL,
  5498          compileSerpent,
  5499          submitWork,
  5500          getWork
  5501      ];
  5502  };
  5503  
  5504  
  5505  var properties = function () {
  5506      return [
  5507          new Property({
  5508              name: 'coinbase',
  5509              getter: 'eth_coinbase'
  5510          }),
  5511          new Property({
  5512              name: 'mining',
  5513              getter: 'eth_mining'
  5514          }),
  5515          new Property({
  5516              name: 'hashrate',
  5517              getter: 'eth_hashrate',
  5518              outputFormatter: utils.toDecimal
  5519          }),
  5520          new Property({
  5521              name: 'syncing',
  5522              getter: 'eth_syncing',
  5523              outputFormatter: formatters.outputSyncingFormatter
  5524          }),
  5525          new Property({
  5526              name: 'gasPrice',
  5527              getter: 'eth_gasPrice',
  5528              outputFormatter: formatters.outputBigNumberFormatter
  5529          }),
  5530          new Property({
  5531              name: 'accounts',
  5532              getter: 'eth_accounts'
  5533          }),
  5534          new Property({
  5535              name: 'blockNumber',
  5536              getter: 'eth_blockNumber',
  5537              outputFormatter: utils.toDecimal
  5538          }),
  5539          new Property({
  5540              name: 'protocolVersion',
  5541              getter: 'eth_protocolVersion'
  5542          })
  5543      ];
  5544  };
  5545  
  5546  Eth.prototype.contract = function (abi) {
  5547      var factory = new Contract(this, abi);
  5548      return factory;
  5549  };
  5550  
  5551  Eth.prototype.filter = function (options, callback, filterCreationErrorCallback) {
  5552      return new Filter(options, 'eth', this._requestManager, watches.eth(), formatters.outputLogFormatter, callback, filterCreationErrorCallback);
  5553  };
  5554  
  5555  Eth.prototype.namereg = function () {
  5556      return this.contract(namereg.global.abi).at(namereg.global.address);
  5557  };
  5558  
  5559  Eth.prototype.icapNamereg = function () {
  5560      return this.contract(namereg.icap.abi).at(namereg.icap.address);
  5561  };
  5562  
  5563  Eth.prototype.isSyncing = function (callback) {
  5564      return new IsSyncing(this._requestManager, callback);
  5565  };
  5566  
  5567  module.exports = Eth;
  5568  
  5569  },{"../../utils/config":18,"../../utils/utils":20,"../contract":25,"../filter":29,"../formatters":30,"../iban":33,"../method":36,"../namereg":44,"../property":45,"../syncing":48,"../transfer":49,"./watches":43}],39:[function(require,module,exports){
  5570  /*
  5571      This file is part of web3.js.
  5572  
  5573      web3.js is free software: you can redistribute it and/or modify
  5574      it under the terms of the GNU Lesser General Public License as published by
  5575      the Free Software Foundation, either version 3 of the License, or
  5576      (at your option) any later version.
  5577  
  5578      web3.js is distributed in the hope that it will be useful,
  5579      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5580      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5581      GNU Lesser General Public License for more details.
  5582  
  5583      You should have received a copy of the GNU Lesser General Public License
  5584      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5585  */
  5586  /** @file eth.js
  5587   * @authors:
  5588   *   Marek Kotewicz <marek@ethdev.com>
  5589   * @date 2015
  5590   */
  5591  
  5592  var utils = require('../../utils/utils');
  5593  var Property = require('../property');
  5594  
  5595  var Net = function (web3) {
  5596      this._requestManager = web3._requestManager;
  5597  
  5598      var self = this;
  5599  
  5600      properties().forEach(function(p) { 
  5601          p.attachToObject(self);
  5602          p.setRequestManager(web3._requestManager);
  5603      });
  5604  };
  5605  
  5606  /// @returns an array of objects describing web3.eth api properties
  5607  var properties = function () {
  5608      return [
  5609          new Property({
  5610              name: 'listening',
  5611              getter: 'net_listening'
  5612          }),
  5613          new Property({
  5614              name: 'peerCount',
  5615              getter: 'net_peerCount',
  5616              outputFormatter: utils.toDecimal
  5617          })
  5618      ];
  5619  };
  5620  
  5621  module.exports = Net;
  5622  
  5623  },{"../../utils/utils":20,"../property":45}],40:[function(require,module,exports){
  5624  /*
  5625      This file is part of web3.js.
  5626  
  5627      web3.js is free software: you can redistribute it and/or modify
  5628      it under the terms of the GNU Lesser General Public License as published by
  5629      the Free Software Foundation, either version 3 of the License, or
  5630      (at your option) any later version.
  5631  
  5632      web3.js is distributed in the hope that it will be useful,
  5633      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5634      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5635      GNU Lesser General Public License for more details.
  5636  
  5637      You should have received a copy of the GNU Lesser General Public License
  5638      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5639  */
  5640  /**
  5641   * @file eth.js
  5642   * @author Marek Kotewicz <marek@ethdev.com>
  5643   * @author Fabian Vogelsteller <fabian@ethdev.com>
  5644   * @date 2015
  5645   */
  5646  
  5647  "use strict";
  5648  
  5649  var Method = require('../method');
  5650  var Property = require('../property');
  5651  var formatters = require('../formatters');
  5652  
  5653  function Personal(web3) {
  5654      this._requestManager = web3._requestManager;
  5655  
  5656      var self = this;
  5657  
  5658      methods().forEach(function(method) {
  5659          method.attachToObject(self);
  5660          method.setRequestManager(self._requestManager);
  5661      });
  5662  
  5663      properties().forEach(function(p) {
  5664          p.attachToObject(self);
  5665          p.setRequestManager(self._requestManager);
  5666      });
  5667  }
  5668  
  5669  var methods = function () {
  5670      var newAccount = new Method({
  5671          name: 'newAccount',
  5672          call: 'personal_newAccount',
  5673          params: 1,
  5674          inputFormatter: [null]
  5675      });
  5676  
  5677      var importRawKey = new Method({
  5678          name: 'importRawKey',
  5679  		call: 'personal_importRawKey',
  5680  		params: 2
  5681      });
  5682  
  5683      var sign = new Method({
  5684          name: 'sign',
  5685  		call: 'personal_sign',
  5686  		params: 3,
  5687  		inputFormatter: [null, formatters.inputAddressFormatter, null]
  5688      });
  5689  
  5690      var ecRecover = new Method({
  5691          name: 'ecRecover',
  5692  		call: 'personal_ecRecover',
  5693  		params: 2
  5694      });
  5695  
  5696      var unlockAccount = new Method({
  5697          name: 'unlockAccount',
  5698          call: 'personal_unlockAccount',
  5699          params: 3,
  5700          inputFormatter: [formatters.inputAddressFormatter, null, null]
  5701      });
  5702  
  5703      var sendTransaction = new Method({
  5704          name: 'sendTransaction',
  5705          call: 'personal_sendTransaction',
  5706          params: 2,
  5707          inputFormatter: [formatters.inputTransactionFormatter, null]
  5708      });
  5709  
  5710      var lockAccount = new Method({
  5711          name: 'lockAccount',
  5712          call: 'personal_lockAccount',
  5713          params: 1,
  5714          inputFormatter: [formatters.inputAddressFormatter]
  5715      });
  5716  
  5717      return [
  5718          newAccount,
  5719          importRawKey,
  5720          unlockAccount,
  5721          ecRecover,
  5722          sign,
  5723          sendTransaction,
  5724          lockAccount
  5725      ];
  5726  };
  5727  
  5728  var properties = function () {
  5729      return [
  5730          new Property({
  5731              name: 'listAccounts',
  5732              getter: 'personal_listAccounts'
  5733          })
  5734      ];
  5735  };
  5736  
  5737  
  5738  module.exports = Personal;
  5739  
  5740  },{"../formatters":30,"../method":36,"../property":45}],41:[function(require,module,exports){
  5741  /*
  5742      This file is part of web3.js.
  5743  
  5744      web3.js is free software: you can redistribute it and/or modify
  5745      it under the terms of the GNU Lesser General Public License as published by
  5746      the Free Software Foundation, either version 3 of the License, or
  5747      (at your option) any later version.
  5748  
  5749      web3.js is distributed in the hope that it will be useful,
  5750      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5751      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5752      GNU Lesser General Public License for more details.
  5753  
  5754      You should have received a copy of the GNU Lesser General Public License
  5755      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5756  */
  5757  /** @file shh.js
  5758   * @authors:
  5759   *   Fabian Vogelsteller <fabian@ethereum.org>
  5760   *   Marek Kotewicz <marek@ethcore.io>
  5761   * @date 2017
  5762   */
  5763  
  5764  var Method = require('../method');
  5765  var Filter = require('../filter');
  5766  var watches = require('./watches');
  5767  
  5768  var Shh = function (web3) {
  5769      this._requestManager = web3._requestManager;
  5770  
  5771      var self = this;
  5772  
  5773      methods().forEach(function(method) {
  5774          method.attachToObject(self);
  5775          method.setRequestManager(self._requestManager);
  5776      });
  5777  };
  5778  
  5779  Shh.prototype.newMessageFilter = function (options, callback, filterCreationErrorCallback) {
  5780      return new Filter(options, 'shh', this._requestManager, watches.shh(), null, callback, filterCreationErrorCallback);
  5781  };
  5782  
  5783  var methods = function () {
  5784  
  5785      return [
  5786          new Method({
  5787              name: 'version',
  5788              call: 'shh_version',
  5789              params: 0
  5790          }),
  5791          new Method({
  5792              name: 'info',
  5793              call: 'shh_info',
  5794              params: 0
  5795          }),
  5796          new Method({
  5797              name: 'setMaxMessageSize',
  5798              call: 'shh_setMaxMessageSize',
  5799              params: 1
  5800          }),
  5801          new Method({
  5802              name: 'setMinPoW',
  5803              call: 'shh_setMinPoW',
  5804              params: 1
  5805          }),
  5806          new Method({
  5807              name: 'markTrustedPeer',
  5808              call: 'shh_markTrustedPeer',
  5809              params: 1
  5810          }),
  5811          new Method({
  5812              name: 'newKeyPair',
  5813              call: 'shh_newKeyPair',
  5814              params: 0
  5815          }),
  5816          new Method({
  5817              name: 'addPrivateKey',
  5818              call: 'shh_addPrivateKey',
  5819              params: 1
  5820          }),
  5821          new Method({
  5822              name: 'deleteKeyPair',
  5823              call: 'shh_deleteKeyPair',
  5824              params: 1
  5825          }),
  5826          new Method({
  5827              name: 'hasKeyPair',
  5828              call: 'shh_hasKeyPair',
  5829              params: 1
  5830          }),
  5831          new Method({
  5832              name: 'getPublicKey',
  5833              call: 'shh_getPublicKey',
  5834              params: 1
  5835          }),
  5836          new Method({
  5837              name: 'getPrivateKey',
  5838              call: 'shh_getPrivateKey',
  5839              params: 1
  5840          }),
  5841          new Method({
  5842              name: 'newSymKey',
  5843              call: 'shh_newSymKey',
  5844              params: 0
  5845          }),
  5846          new Method({
  5847              name: 'addSymKey',
  5848              call: 'shh_addSymKey',
  5849              params: 1
  5850          }),
  5851          new Method({
  5852              name: 'generateSymKeyFromPassword',
  5853              call: 'shh_generateSymKeyFromPassword',
  5854              params: 1
  5855          }),
  5856          new Method({
  5857              name: 'hasSymKey',
  5858              call: 'shh_hasSymKey',
  5859              params: 1
  5860          }),
  5861          new Method({
  5862              name: 'getSymKey',
  5863              call: 'shh_getSymKey',
  5864              params: 1
  5865          }),
  5866          new Method({
  5867              name: 'deleteSymKey',
  5868              call: 'shh_deleteSymKey',
  5869              params: 1
  5870          }),
  5871  
  5872          // subscribe and unsubscribe missing
  5873  
  5874          new Method({
  5875              name: 'post',
  5876              call: 'shh_post',
  5877              params: 1,
  5878              inputFormatter: [null]
  5879          })
  5880      ];
  5881  };
  5882  
  5883  module.exports = Shh;
  5884  
  5885  
  5886  },{"../filter":29,"../method":36,"./watches":43}],42:[function(require,module,exports){
  5887  /*
  5888      This file is part of web3.js.
  5889  
  5890      web3.js is free software: you can redistribute it and/or modify
  5891      it under the terms of the GNU Lesser General Public License as published by
  5892      the Free Software Foundation, either version 3 of the License, or
  5893      (at your option) any later version.
  5894  
  5895      web3.js is distributed in the hope that it will be useful,
  5896      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5897      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5898      GNU Lesser General Public License for more details.
  5899  
  5900      You should have received a copy of the GNU Lesser General Public License
  5901      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5902  */
  5903  /**
  5904   * @file bzz.js
  5905   * @author Alex Beregszaszi <alex@rtfs.hu>
  5906   * @date 2016
  5907   *
  5908   * Reference: https://github.com/ethereum/go-ethereum/blob/swarm/internal/web3ext/web3ext.go#L33
  5909   */
  5910  
  5911  "use strict";
  5912  
  5913  var Method = require('../method');
  5914  var Property = require('../property');
  5915  
  5916  function Swarm(web3) {
  5917      this._requestManager = web3._requestManager;
  5918  
  5919      var self = this;
  5920  
  5921      methods().forEach(function(method) {
  5922          method.attachToObject(self);
  5923          method.setRequestManager(self._requestManager);
  5924      });
  5925  
  5926      properties().forEach(function(p) {
  5927          p.attachToObject(self);
  5928          p.setRequestManager(self._requestManager);
  5929      });
  5930  }
  5931  
  5932  var methods = function () {
  5933      var blockNetworkRead = new Method({
  5934          name: 'blockNetworkRead',
  5935          call: 'bzz_blockNetworkRead',
  5936          params: 1,
  5937          inputFormatter: [null]
  5938      });
  5939  
  5940      var syncEnabled = new Method({
  5941          name: 'syncEnabled',
  5942          call: 'bzz_syncEnabled',
  5943          params: 1,
  5944          inputFormatter: [null]
  5945      });
  5946  
  5947      var swapEnabled = new Method({
  5948          name: 'swapEnabled',
  5949          call: 'bzz_swapEnabled',
  5950          params: 1,
  5951          inputFormatter: [null]
  5952      });
  5953  
  5954      var download = new Method({
  5955          name: 'download',
  5956          call: 'bzz_download',
  5957          params: 2,
  5958          inputFormatter: [null, null]
  5959      });
  5960  
  5961      var upload = new Method({
  5962          name: 'upload',
  5963          call: 'bzz_upload',
  5964          params: 2,
  5965          inputFormatter: [null, null]
  5966      });
  5967  
  5968      var retrieve = new Method({
  5969          name: 'retrieve',
  5970          call: 'bzz_retrieve',
  5971          params: 1,
  5972          inputFormatter: [null]
  5973      });
  5974  
  5975      var store = new Method({
  5976          name: 'store',
  5977          call: 'bzz_store',
  5978          params: 2,
  5979          inputFormatter: [null, null]
  5980      });
  5981  
  5982      var get = new Method({
  5983          name: 'get',
  5984          call: 'bzz_get',
  5985          params: 1,
  5986          inputFormatter: [null]
  5987      });
  5988  
  5989      var put = new Method({
  5990          name: 'put',
  5991          call: 'bzz_put',
  5992          params: 2,
  5993          inputFormatter: [null, null]
  5994      });
  5995  
  5996      var modify = new Method({
  5997          name: 'modify',
  5998          call: 'bzz_modify',
  5999          params: 4,
  6000          inputFormatter: [null, null, null, null]
  6001      });
  6002  
  6003      return [
  6004          blockNetworkRead,
  6005          syncEnabled,
  6006          swapEnabled,
  6007          download,
  6008          upload,
  6009          retrieve,
  6010          store,
  6011          get,
  6012          put,
  6013          modify
  6014      ];
  6015  };
  6016  
  6017  var properties = function () {
  6018      return [
  6019          new Property({
  6020              name: 'hive',
  6021              getter: 'bzz_hive'
  6022          }),
  6023          new Property({
  6024              name: 'info',
  6025              getter: 'bzz_info'
  6026          })
  6027      ];
  6028  };
  6029  
  6030  
  6031  module.exports = Swarm;
  6032  
  6033  },{"../method":36,"../property":45}],43:[function(require,module,exports){
  6034  /*
  6035      This file is part of web3.js.
  6036  
  6037      web3.js is free software: you can redistribute it and/or modify
  6038      it under the terms of the GNU Lesser General Public License as published by
  6039      the Free Software Foundation, either version 3 of the License, or
  6040      (at your option) any later version.
  6041  
  6042      web3.js is distributed in the hope that it will be useful,
  6043      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6044      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6045      GNU Lesser General Public License for more details.
  6046  
  6047      You should have received a copy of the GNU Lesser General Public License
  6048      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6049  */
  6050  /** @file watches.js
  6051   * @authors:
  6052   *   Marek Kotewicz <marek@ethdev.com>
  6053   * @date 2015
  6054   */
  6055  
  6056  var Method = require('../method');
  6057  
  6058  /// @returns an array of objects describing web3.eth.filter api methods
  6059  var eth = function () {
  6060      var newFilterCall = function (args) {
  6061          var type = args[0];
  6062  
  6063          switch(type) {
  6064              case 'latest':
  6065                  args.shift();
  6066                  this.params = 0;
  6067                  return 'eth_newBlockFilter';
  6068              case 'pending':
  6069                  args.shift();
  6070                  this.params = 0;
  6071                  return 'eth_newPendingTransactionFilter';
  6072              default:
  6073                  return 'eth_newFilter';
  6074          }
  6075      };
  6076  
  6077      var newFilter = new Method({
  6078          name: 'newFilter',
  6079          call: newFilterCall,
  6080          params: 1
  6081      });
  6082  
  6083      var uninstallFilter = new Method({
  6084          name: 'uninstallFilter',
  6085          call: 'eth_uninstallFilter',
  6086          params: 1
  6087      });
  6088  
  6089      var getLogs = new Method({
  6090          name: 'getLogs',
  6091          call: 'eth_getFilterLogs',
  6092          params: 1
  6093      });
  6094  
  6095      var poll = new Method({
  6096          name: 'poll',
  6097          call: 'eth_getFilterChanges',
  6098          params: 1
  6099      });
  6100  
  6101      return [
  6102          newFilter,
  6103          uninstallFilter,
  6104          getLogs,
  6105          poll
  6106      ];
  6107  };
  6108  
  6109  /// @returns an array of objects describing web3.shh.watch api methods
  6110  var shh = function () {
  6111  
  6112      return [
  6113          new Method({
  6114              name: 'newFilter',
  6115              call: 'shh_newMessageFilter',
  6116              params: 1
  6117          }),
  6118          new Method({
  6119              name: 'uninstallFilter',
  6120              call: 'shh_deleteMessageFilter',
  6121              params: 1
  6122          }),
  6123          new Method({
  6124              name: 'getLogs',
  6125              call: 'shh_getFilterMessages',
  6126              params: 1
  6127          }),
  6128          new Method({
  6129              name: 'poll',
  6130              call: 'shh_getFilterMessages',
  6131              params: 1
  6132          })
  6133      ];
  6134  };
  6135  
  6136  module.exports = {
  6137      eth: eth,
  6138      shh: shh
  6139  };
  6140  
  6141  
  6142  },{"../method":36}],44:[function(require,module,exports){
  6143  /*
  6144      This file is part of web3.js.
  6145  
  6146      web3.js is free software: you can redistribute it and/or modify
  6147      it under the terms of the GNU Lesser General Public License as published by
  6148      the Free Software Foundation, either version 3 of the License, or
  6149      (at your option) any later version.
  6150  
  6151      web3.js is distributed in the hope that it will be useful,
  6152      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6153      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6154      GNU Lesser General Public License for more details.
  6155  
  6156      You should have received a copy of the GNU Lesser General Public License
  6157      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6158  */
  6159  /** 
  6160   * @file namereg.js
  6161   * @author Marek Kotewicz <marek@ethdev.com>
  6162   * @date 2015
  6163   */
  6164  
  6165  var globalRegistrarAbi = require('../contracts/GlobalRegistrar.json');
  6166  var icapRegistrarAbi= require('../contracts/ICAPRegistrar.json');
  6167  
  6168  var globalNameregAddress = '0xc6d9d2cd449a754c494264e1809c50e34d64562b';
  6169  var icapNameregAddress = '0xa1a111bc074c9cfa781f0c38e63bd51c91b8af00';
  6170  
  6171  module.exports = {
  6172      global: {
  6173          abi: globalRegistrarAbi,
  6174          address: globalNameregAddress
  6175      },
  6176      icap: {
  6177          abi: icapRegistrarAbi,
  6178          address: icapNameregAddress
  6179      }
  6180  };
  6181  
  6182  
  6183  },{"../contracts/GlobalRegistrar.json":1,"../contracts/ICAPRegistrar.json":2}],45:[function(require,module,exports){
  6184  /*
  6185      This file is part of web3.js.
  6186  
  6187      web3.js is free software: you can redistribute it and/or modify
  6188      it under the terms of the GNU Lesser General Public License as published by
  6189      the Free Software Foundation, either version 3 of the License, or
  6190      (at your option) any later version.
  6191  
  6192      web3.js is distributed in the hope that it will be useful,
  6193      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6194      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6195      GNU Lesser General Public License for more details.
  6196  
  6197      You should have received a copy of the GNU Lesser General Public License
  6198      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6199  */
  6200  /**
  6201   * @file property.js
  6202   * @author Fabian Vogelsteller <fabian@frozeman.de>
  6203   * @author Marek Kotewicz <marek@ethdev.com>
  6204   * @date 2015
  6205   */
  6206  
  6207  var utils = require('../utils/utils');
  6208  
  6209  var Property = function (options) {
  6210      this.name = options.name;
  6211      this.getter = options.getter;
  6212      this.setter = options.setter;
  6213      this.outputFormatter = options.outputFormatter;
  6214      this.inputFormatter = options.inputFormatter;
  6215      this.requestManager = null;
  6216  };
  6217  
  6218  Property.prototype.setRequestManager = function (rm) {
  6219      this.requestManager = rm;
  6220  };
  6221  
  6222  /**
  6223   * Should be called to format input args of method
  6224   *
  6225   * @method formatInput
  6226   * @param {Array}
  6227   * @return {Array}
  6228   */
  6229  Property.prototype.formatInput = function (arg) {
  6230      return this.inputFormatter ? this.inputFormatter(arg) : arg;
  6231  };
  6232  
  6233  /**
  6234   * Should be called to format output(result) of method
  6235   *
  6236   * @method formatOutput
  6237   * @param {Object}
  6238   * @return {Object}
  6239   */
  6240  Property.prototype.formatOutput = function (result) {
  6241      return this.outputFormatter && result !== null && result !== undefined ? this.outputFormatter(result) : result;
  6242  };
  6243  
  6244  /**
  6245   * Should be used to extract callback from array of arguments. Modifies input param
  6246   *
  6247   * @method extractCallback
  6248   * @param {Array} arguments
  6249   * @return {Function|Null} callback, if exists
  6250   */
  6251  Property.prototype.extractCallback = function (args) {
  6252      if (utils.isFunction(args[args.length - 1])) {
  6253          return args.pop(); // modify the args array!
  6254      }
  6255  };
  6256  
  6257  
  6258  /**
  6259   * Should attach function to method
  6260   *
  6261   * @method attachToObject
  6262   * @param {Object}
  6263   * @param {Function}
  6264   */
  6265  Property.prototype.attachToObject = function (obj) {
  6266      var proto = {
  6267          get: this.buildGet(),
  6268          enumerable: true
  6269      };
  6270  
  6271      var names = this.name.split('.');
  6272      var name = names[0];
  6273      if (names.length > 1) {
  6274          obj[names[0]] = obj[names[0]] || {};
  6275          obj = obj[names[0]];
  6276          name = names[1];
  6277      }
  6278  
  6279      Object.defineProperty(obj, name, proto);
  6280      obj[asyncGetterName(name)] = this.buildAsyncGet();
  6281  };
  6282  
  6283  var asyncGetterName = function (name) {
  6284      return 'get' + name.charAt(0).toUpperCase() + name.slice(1);
  6285  };
  6286  
  6287  Property.prototype.buildGet = function () {
  6288      var property = this;
  6289      return function get() {
  6290          return property.formatOutput(property.requestManager.send({
  6291              method: property.getter
  6292          }));
  6293      };
  6294  };
  6295  
  6296  Property.prototype.buildAsyncGet = function () {
  6297      var property = this;
  6298      var get = function (callback) {
  6299          property.requestManager.sendAsync({
  6300              method: property.getter
  6301          }, function (err, result) {
  6302              callback(err, property.formatOutput(result));
  6303          });
  6304      };
  6305      get.request = this.request.bind(this);
  6306      return get;
  6307  };
  6308  
  6309  /**
  6310   * Should be called to create pure JSONRPC request which can be used in batch request
  6311   *
  6312   * @method request
  6313   * @param {...} params
  6314   * @return {Object} jsonrpc request
  6315   */
  6316  Property.prototype.request = function () {
  6317      var payload = {
  6318          method: this.getter,
  6319          params: [],
  6320          callback: this.extractCallback(Array.prototype.slice.call(arguments))
  6321      };
  6322      payload.format = this.formatOutput.bind(this);
  6323      return payload;
  6324  };
  6325  
  6326  module.exports = Property;
  6327  
  6328  
  6329  },{"../utils/utils":20}],46:[function(require,module,exports){
  6330  /*
  6331      This file is part of web3.js.
  6332  
  6333      web3.js is free software: you can redistribute it and/or modify
  6334      it under the terms of the GNU Lesser General Public License as published by
  6335      the Free Software Foundation, either version 3 of the License, or
  6336      (at your option) any later version.
  6337  
  6338      web3.js is distributed in the hope that it will be useful,
  6339      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6340      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6341      GNU Lesser General Public License for more details.
  6342  
  6343      You should have received a copy of the GNU Lesser General Public License
  6344      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6345  */
  6346  /** 
  6347   * @file requestmanager.js
  6348   * @author Jeffrey Wilcke <jeff@ethdev.com>
  6349   * @author Marek Kotewicz <marek@ethdev.com>
  6350   * @author Marian Oancea <marian@ethdev.com>
  6351   * @author Fabian Vogelsteller <fabian@ethdev.com>
  6352   * @author Gav Wood <g@ethdev.com>
  6353   * @date 2014
  6354   */
  6355  
  6356  var Jsonrpc = require('./jsonrpc');
  6357  var utils = require('../utils/utils');
  6358  var c = require('../utils/config');
  6359  var errors = require('./errors');
  6360  
  6361  /**
  6362   * It's responsible for passing messages to providers
  6363   * It's also responsible for polling the ethereum node for incoming messages
  6364   * Default poll timeout is 1 second
  6365   * Singleton
  6366   */
  6367  var RequestManager = function (provider) {
  6368      this.provider = provider;
  6369      this.polls = {};
  6370      this.timeout = null;
  6371  };
  6372  
  6373  /**
  6374   * Should be used to synchronously send request
  6375   *
  6376   * @method send
  6377   * @param {Object} data
  6378   * @return {Object}
  6379   */
  6380  RequestManager.prototype.send = function (data) {
  6381      if (!this.provider) {
  6382          console.error(errors.InvalidProvider());
  6383          return null;
  6384      }
  6385  
  6386      var payload = Jsonrpc.toPayload(data.method, data.params);
  6387      var result = this.provider.send(payload);
  6388  
  6389      if (!Jsonrpc.isValidResponse(result)) {
  6390          throw errors.InvalidResponse(result);
  6391      }
  6392  
  6393      return result.result;
  6394  };
  6395  
  6396  /**
  6397   * Should be used to asynchronously send request
  6398   *
  6399   * @method sendAsync
  6400   * @param {Object} data
  6401   * @param {Function} callback
  6402   */
  6403  RequestManager.prototype.sendAsync = function (data, callback) {
  6404      if (!this.provider) {
  6405          return callback(errors.InvalidProvider());
  6406      }
  6407  
  6408      var payload = Jsonrpc.toPayload(data.method, data.params);
  6409      this.provider.sendAsync(payload, function (err, result) {
  6410          if (err) {
  6411              return callback(err);
  6412          }
  6413          
  6414          if (!Jsonrpc.isValidResponse(result)) {
  6415              return callback(errors.InvalidResponse(result));
  6416          }
  6417  
  6418          callback(null, result.result);
  6419      });
  6420  };
  6421  
  6422  /**
  6423   * Should be called to asynchronously send batch request
  6424   *
  6425   * @method sendBatch
  6426   * @param {Array} batch data
  6427   * @param {Function} callback
  6428   */
  6429  RequestManager.prototype.sendBatch = function (data, callback) {
  6430      if (!this.provider) {
  6431          return callback(errors.InvalidProvider());
  6432      }
  6433  
  6434      var payload = Jsonrpc.toBatchPayload(data);
  6435  
  6436      this.provider.sendAsync(payload, function (err, results) {
  6437          if (err) {
  6438              return callback(err);
  6439          }
  6440  
  6441          if (!utils.isArray(results)) {
  6442              return callback(errors.InvalidResponse(results));
  6443          }
  6444  
  6445          callback(err, results);
  6446      }); 
  6447  };
  6448  
  6449  /**
  6450   * Should be used to set provider of request manager
  6451   *
  6452   * @method setProvider
  6453   * @param {Object}
  6454   */
  6455  RequestManager.prototype.setProvider = function (p) {
  6456      this.provider = p;
  6457  };
  6458  
  6459  /**
  6460   * Should be used to start polling
  6461   *
  6462   * @method startPolling
  6463   * @param {Object} data
  6464   * @param {Number} pollId
  6465   * @param {Function} callback
  6466   * @param {Function} uninstall
  6467   *
  6468   * @todo cleanup number of params
  6469   */
  6470  RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) {
  6471      this.polls[pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall};
  6472  
  6473  
  6474      // start polling
  6475      if (!this.timeout) {
  6476          this.poll();
  6477      }
  6478  };
  6479  
  6480  /**
  6481   * Should be used to stop polling for filter with given id
  6482   *
  6483   * @method stopPolling
  6484   * @param {Number} pollId
  6485   */
  6486  RequestManager.prototype.stopPolling = function (pollId) {
  6487      delete this.polls[pollId];
  6488  
  6489      // stop polling
  6490      if(Object.keys(this.polls).length === 0 && this.timeout) {
  6491          clearTimeout(this.timeout);
  6492          this.timeout = null;
  6493      }
  6494  };
  6495  
  6496  /**
  6497   * Should be called to reset the polling mechanism of the request manager
  6498   *
  6499   * @method reset
  6500   */
  6501  RequestManager.prototype.reset = function (keepIsSyncing) {
  6502      /*jshint maxcomplexity:5 */
  6503  
  6504      for (var key in this.polls) {
  6505          // remove all polls, except sync polls,
  6506          // they need to be removed manually by calling syncing.stopWatching()
  6507          if(!keepIsSyncing || key.indexOf('syncPoll_') === -1) {
  6508              this.polls[key].uninstall();
  6509              delete this.polls[key];
  6510          }
  6511      }
  6512  
  6513      // stop polling
  6514      if(Object.keys(this.polls).length === 0 && this.timeout) {
  6515          clearTimeout(this.timeout);
  6516          this.timeout = null;
  6517      }
  6518  };
  6519  
  6520  /**
  6521   * Should be called to poll for changes on filter with given id
  6522   *
  6523   * @method poll
  6524   */
  6525  RequestManager.prototype.poll = function () {
  6526      /*jshint maxcomplexity: 6 */
  6527      this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT);
  6528  
  6529      if (Object.keys(this.polls).length === 0) {
  6530          return;
  6531      }
  6532  
  6533      if (!this.provider) {
  6534          console.error(errors.InvalidProvider());
  6535          return;
  6536      }
  6537  
  6538      var pollsData = [];
  6539      var pollsIds = [];
  6540      for (var key in this.polls) {
  6541          pollsData.push(this.polls[key].data);
  6542          pollsIds.push(key);
  6543      }
  6544  
  6545      if (pollsData.length === 0) {
  6546          return;
  6547      }
  6548  
  6549      var payload = Jsonrpc.toBatchPayload(pollsData);
  6550      
  6551      // map the request id to they poll id
  6552      var pollsIdMap = {};
  6553      payload.forEach(function(load, index){
  6554          pollsIdMap[load.id] = pollsIds[index];
  6555      });
  6556  
  6557  
  6558      var self = this;
  6559      this.provider.sendAsync(payload, function (error, results) {
  6560  
  6561  
  6562          // TODO: console log?
  6563          if (error) {
  6564              return;
  6565          }
  6566  
  6567          if (!utils.isArray(results)) {
  6568              throw errors.InvalidResponse(results);
  6569          }
  6570          results.map(function (result) {
  6571              var id = pollsIdMap[result.id];
  6572  
  6573              // make sure the filter is still installed after arrival of the request
  6574              if (self.polls[id]) {
  6575                  result.callback = self.polls[id].callback;
  6576                  return result;
  6577              } else
  6578                  return false;
  6579          }).filter(function (result) {
  6580              return !!result; 
  6581          }).filter(function (result) {
  6582              var valid = Jsonrpc.isValidResponse(result);
  6583              if (!valid) {
  6584                  result.callback(errors.InvalidResponse(result));
  6585              }
  6586              return valid;
  6587          }).forEach(function (result) {
  6588              result.callback(null, result.result);
  6589          });
  6590      });
  6591  };
  6592  
  6593  module.exports = RequestManager;
  6594  
  6595  
  6596  },{"../utils/config":18,"../utils/utils":20,"./errors":26,"./jsonrpc":35}],47:[function(require,module,exports){
  6597  
  6598  
  6599  var Settings = function () {
  6600      this.defaultBlock = 'latest';
  6601      this.defaultAccount = undefined;
  6602  };
  6603  
  6604  module.exports = Settings;
  6605  
  6606  
  6607  },{}],48:[function(require,module,exports){
  6608  /*
  6609      This file is part of web3.js.
  6610  
  6611      web3.js is free software: you can redistribute it and/or modify
  6612      it under the terms of the GNU Lesser General Public License as published by
  6613      the Free Software Foundation, either version 3 of the License, or
  6614      (at your option) any later version.
  6615  
  6616      web3.js is distributed in the hope that it will be useful,
  6617      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6618      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6619      GNU Lesser General Public License for more details.
  6620  
  6621      You should have received a copy of the GNU Lesser General Public License
  6622      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6623  */
  6624  /** @file syncing.js
  6625   * @authors:
  6626   *   Fabian Vogelsteller <fabian@ethdev.com>
  6627   * @date 2015
  6628   */
  6629  
  6630  var formatters = require('./formatters');
  6631  var utils = require('../utils/utils');
  6632  
  6633  var count = 1;
  6634  
  6635  /**
  6636  Adds the callback and sets up the methods, to iterate over the results.
  6637  
  6638  @method pollSyncing
  6639  @param {Object} self
  6640  */
  6641  var pollSyncing = function(self) {
  6642  
  6643      var onMessage = function (error, sync) {
  6644          if (error) {
  6645              return self.callbacks.forEach(function (callback) {
  6646                  callback(error);
  6647              });
  6648          }
  6649  
  6650          if(utils.isObject(sync) && sync.startingBlock)
  6651              sync = formatters.outputSyncingFormatter(sync);
  6652  
  6653          self.callbacks.forEach(function (callback) {
  6654              if (self.lastSyncState !== sync) {
  6655                  
  6656                  // call the callback with true first so the app can stop anything, before receiving the sync data
  6657                  if(!self.lastSyncState && utils.isObject(sync))
  6658                      callback(null, true);
  6659                  
  6660                  // call on the next CPU cycle, so the actions of the sync stop can be processes first
  6661                  setTimeout(function() {
  6662                      callback(null, sync);
  6663                  }, 0);
  6664                  
  6665                  self.lastSyncState = sync;
  6666              }
  6667          });
  6668      };
  6669  
  6670      self.requestManager.startPolling({
  6671          method: 'eth_syncing',
  6672          params: [],
  6673      }, self.pollId, onMessage, self.stopWatching.bind(self));
  6674  
  6675  };
  6676  
  6677  var IsSyncing = function (requestManager, callback) {
  6678      this.requestManager = requestManager;
  6679      this.pollId = 'syncPoll_'+ count++;
  6680      this.callbacks = [];
  6681      this.addCallback(callback);
  6682      this.lastSyncState = false;
  6683      pollSyncing(this);
  6684  
  6685      return this;
  6686  };
  6687  
  6688  IsSyncing.prototype.addCallback = function (callback) {
  6689      if(callback)
  6690          this.callbacks.push(callback);
  6691      return this;
  6692  };
  6693  
  6694  IsSyncing.prototype.stopWatching = function () {
  6695      this.requestManager.stopPolling(this.pollId);
  6696      this.callbacks = [];
  6697  };
  6698  
  6699  module.exports = IsSyncing;
  6700  
  6701  
  6702  },{"../utils/utils":20,"./formatters":30}],49:[function(require,module,exports){
  6703  /*
  6704      This file is part of web3.js.
  6705  
  6706      web3.js is free software: you can redistribute it and/or modify
  6707      it under the terms of the GNU Lesser General Public License as published by
  6708      the Free Software Foundation, either version 3 of the License, or
  6709      (at your option) any later version.
  6710  
  6711      web3.js is distributed in the hope that it will be useful,
  6712      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6713      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6714      GNU Lesser General Public License for more details.
  6715  
  6716      You should have received a copy of the GNU Lesser General Public License
  6717      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6718  */
  6719  /** 
  6720   * @file transfer.js
  6721   * @author Marek Kotewicz <marek@ethdev.com>
  6722   * @date 2015
  6723   */
  6724  
  6725  var Iban = require('./iban');
  6726  var exchangeAbi = require('../contracts/SmartExchange.json');
  6727  
  6728  /**
  6729   * Should be used to make Iban transfer
  6730   *
  6731   * @method transfer
  6732   * @param {String} from
  6733   * @param {String} to iban
  6734   * @param {Value} value to be tranfered
  6735   * @param {Function} callback, callback
  6736   */
  6737  var transfer = function (eth, from, to, value, callback) {
  6738      var iban = new Iban(to); 
  6739      if (!iban.isValid()) {
  6740          throw new Error('invalid iban address');
  6741      }
  6742  
  6743      if (iban.isDirect()) {
  6744          return transferToAddress(eth, from, iban.address(), value, callback);
  6745      }
  6746      
  6747      if (!callback) {
  6748          var address = eth.icapNamereg().addr(iban.institution());
  6749          return deposit(eth, from, address, value, iban.client());
  6750      }
  6751  
  6752      eth.icapNamereg().addr(iban.institution(), function (err, address) {
  6753          return deposit(eth, from, address, value, iban.client(), callback);
  6754      });
  6755      
  6756  };
  6757  
  6758  /**
  6759   * Should be used to transfer funds to certain address
  6760   *
  6761   * @method transferToAddress
  6762   * @param {String} from
  6763   * @param {String} to
  6764   * @param {Value} value to be tranfered
  6765   * @param {Function} callback, callback
  6766   */
  6767  var transferToAddress = function (eth, from, to, value, callback) {
  6768      return eth.sendTransaction({
  6769          address: to,
  6770          from: from,
  6771          value: value
  6772      }, callback);
  6773  };
  6774  
  6775  /**
  6776   * Should be used to deposit funds to generic Exchange contract (must implement deposit(bytes32) method!)
  6777   *
  6778   * @method deposit
  6779   * @param {String} from
  6780   * @param {String} to
  6781   * @param {Value} value to be transferred
  6782   * @param {String} client unique identifier
  6783   * @param {Function} callback, callback
  6784   */
  6785  var deposit = function (eth, from, to, value, client, callback) {
  6786      var abi = exchangeAbi;
  6787      return eth.contract(abi).at(to).deposit(client, {
  6788          from: from,
  6789          value: value
  6790      }, callback);
  6791  };
  6792  
  6793  module.exports = transfer;
  6794  
  6795  
  6796  },{"../contracts/SmartExchange.json":3,"./iban":33}],50:[function(require,module,exports){
  6797  
  6798  },{}],51:[function(require,module,exports){
  6799  ;(function (root, factory, undef) {
  6800  	if (typeof exports === "object") {
  6801  		// CommonJS
  6802  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
  6803  	}
  6804  	else if (typeof define === "function" && define.amd) {
  6805  		// AMD
  6806  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
  6807  	}
  6808  	else {
  6809  		// Global (browser)
  6810  		factory(root.CryptoJS);
  6811  	}
  6812  }(this, function (CryptoJS) {
  6813  
  6814  	(function () {
  6815  	    // Shortcuts
  6816  	    var C = CryptoJS;
  6817  	    var C_lib = C.lib;
  6818  	    var BlockCipher = C_lib.BlockCipher;
  6819  	    var C_algo = C.algo;
  6820  
  6821  	    // Lookup tables
  6822  	    var SBOX = [];
  6823  	    var INV_SBOX = [];
  6824  	    var SUB_MIX_0 = [];
  6825  	    var SUB_MIX_1 = [];
  6826  	    var SUB_MIX_2 = [];
  6827  	    var SUB_MIX_3 = [];
  6828  	    var INV_SUB_MIX_0 = [];
  6829  	    var INV_SUB_MIX_1 = [];
  6830  	    var INV_SUB_MIX_2 = [];
  6831  	    var INV_SUB_MIX_3 = [];
  6832  
  6833  	    // Compute lookup tables
  6834  	    (function () {
  6835  	        // Compute double table
  6836  	        var d = [];
  6837  	        for (var i = 0; i < 256; i++) {
  6838  	            if (i < 128) {
  6839  	                d[i] = i << 1;
  6840  	            } else {
  6841  	                d[i] = (i << 1) ^ 0x11b;
  6842  	            }
  6843  	        }
  6844  
  6845  	        // Walk GF(2^8)
  6846  	        var x = 0;
  6847  	        var xi = 0;
  6848  	        for (var i = 0; i < 256; i++) {
  6849  	            // Compute sbox
  6850  	            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
  6851  	            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
  6852  	            SBOX[x] = sx;
  6853  	            INV_SBOX[sx] = x;
  6854  
  6855  	            // Compute multiplication
  6856  	            var x2 = d[x];
  6857  	            var x4 = d[x2];
  6858  	            var x8 = d[x4];
  6859  
  6860  	            // Compute sub bytes, mix columns tables
  6861  	            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
  6862  	            SUB_MIX_0[x] = (t << 24) | (t >>> 8);
  6863  	            SUB_MIX_1[x] = (t << 16) | (t >>> 16);
  6864  	            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);
  6865  	            SUB_MIX_3[x] = t;
  6866  
  6867  	            // Compute inv sub bytes, inv mix columns tables
  6868  	            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
  6869  	            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
  6870  	            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
  6871  	            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);
  6872  	            INV_SUB_MIX_3[sx] = t;
  6873  
  6874  	            // Compute next counter
  6875  	            if (!x) {
  6876  	                x = xi = 1;
  6877  	            } else {
  6878  	                x = x2 ^ d[d[d[x8 ^ x2]]];
  6879  	                xi ^= d[d[xi]];
  6880  	            }
  6881  	        }
  6882  	    }());
  6883  
  6884  	    // Precomputed Rcon lookup
  6885  	    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
  6886  
  6887  	    /**
  6888  	     * AES block cipher algorithm.
  6889  	     */
  6890  	    var AES = C_algo.AES = BlockCipher.extend({
  6891  	        _doReset: function () {
  6892  	            // Skip reset of nRounds has been set before and key did not change
  6893  	            if (this._nRounds && this._keyPriorReset === this._key) {
  6894  	                return;
  6895  	            }
  6896  
  6897  	            // Shortcuts
  6898  	            var key = this._keyPriorReset = this._key;
  6899  	            var keyWords = key.words;
  6900  	            var keySize = key.sigBytes / 4;
  6901  
  6902  	            // Compute number of rounds
  6903  	            var nRounds = this._nRounds = keySize + 6;
  6904  
  6905  	            // Compute number of key schedule rows
  6906  	            var ksRows = (nRounds + 1) * 4;
  6907  
  6908  	            // Compute key schedule
  6909  	            var keySchedule = this._keySchedule = [];
  6910  	            for (var ksRow = 0; ksRow < ksRows; ksRow++) {
  6911  	                if (ksRow < keySize) {
  6912  	                    keySchedule[ksRow] = keyWords[ksRow];
  6913  	                } else {
  6914  	                    var t = keySchedule[ksRow - 1];
  6915  
  6916  	                    if (!(ksRow % keySize)) {
  6917  	                        // Rot word
  6918  	                        t = (t << 8) | (t >>> 24);
  6919  
  6920  	                        // Sub word
  6921  	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
  6922  
  6923  	                        // Mix Rcon
  6924  	                        t ^= RCON[(ksRow / keySize) | 0] << 24;
  6925  	                    } else if (keySize > 6 && ksRow % keySize == 4) {
  6926  	                        // Sub word
  6927  	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
  6928  	                    }
  6929  
  6930  	                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
  6931  	                }
  6932  	            }
  6933  
  6934  	            // Compute inv key schedule
  6935  	            var invKeySchedule = this._invKeySchedule = [];
  6936  	            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
  6937  	                var ksRow = ksRows - invKsRow;
  6938  
  6939  	                if (invKsRow % 4) {
  6940  	                    var t = keySchedule[ksRow];
  6941  	                } else {
  6942  	                    var t = keySchedule[ksRow - 4];
  6943  	                }
  6944  
  6945  	                if (invKsRow < 4 || ksRow <= 4) {
  6946  	                    invKeySchedule[invKsRow] = t;
  6947  	                } else {
  6948  	                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
  6949  	                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
  6950  	                }
  6951  	            }
  6952  	        },
  6953  
  6954  	        encryptBlock: function (M, offset) {
  6955  	            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
  6956  	        },
  6957  
  6958  	        decryptBlock: function (M, offset) {
  6959  	            // Swap 2nd and 4th rows
  6960  	            var t = M[offset + 1];
  6961  	            M[offset + 1] = M[offset + 3];
  6962  	            M[offset + 3] = t;
  6963  
  6964  	            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
  6965  
  6966  	            // Inv swap 2nd and 4th rows
  6967  	            var t = M[offset + 1];
  6968  	            M[offset + 1] = M[offset + 3];
  6969  	            M[offset + 3] = t;
  6970  	        },
  6971  
  6972  	        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
  6973  	            // Shortcut
  6974  	            var nRounds = this._nRounds;
  6975  
  6976  	            // Get input, add round key
  6977  	            var s0 = M[offset]     ^ keySchedule[0];
  6978  	            var s1 = M[offset + 1] ^ keySchedule[1];
  6979  	            var s2 = M[offset + 2] ^ keySchedule[2];
  6980  	            var s3 = M[offset + 3] ^ keySchedule[3];
  6981  
  6982  	            // Key schedule row counter
  6983  	            var ksRow = 4;
  6984  
  6985  	            // Rounds
  6986  	            for (var round = 1; round < nRounds; round++) {
  6987  	                // Shift rows, sub bytes, mix columns, add round key
  6988  	                var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
  6989  	                var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
  6990  	                var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
  6991  	                var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
  6992  
  6993  	                // Update state
  6994  	                s0 = t0;
  6995  	                s1 = t1;
  6996  	                s2 = t2;
  6997  	                s3 = t3;
  6998  	            }
  6999  
  7000  	            // Shift rows, sub bytes, add round key
  7001  	            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
  7002  	            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
  7003  	            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
  7004  	            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
  7005  
  7006  	            // Set output
  7007  	            M[offset]     = t0;
  7008  	            M[offset + 1] = t1;
  7009  	            M[offset + 2] = t2;
  7010  	            M[offset + 3] = t3;
  7011  	        },
  7012  
  7013  	        keySize: 256/32
  7014  	    });
  7015  
  7016  	    /**
  7017  	     * Shortcut functions to the cipher's object interface.
  7018  	     *
  7019  	     * @example
  7020  	     *
  7021  	     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
  7022  	     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);
  7023  	     */
  7024  	    C.AES = BlockCipher._createHelper(AES);
  7025  	}());
  7026  
  7027  
  7028  	return CryptoJS.AES;
  7029  
  7030  }));
  7031  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],52:[function(require,module,exports){
  7032  ;(function (root, factory) {
  7033  	if (typeof exports === "object") {
  7034  		// CommonJS
  7035  		module.exports = exports = factory(require("./core"));
  7036  	}
  7037  	else if (typeof define === "function" && define.amd) {
  7038  		// AMD
  7039  		define(["./core"], factory);
  7040  	}
  7041  	else {
  7042  		// Global (browser)
  7043  		factory(root.CryptoJS);
  7044  	}
  7045  }(this, function (CryptoJS) {
  7046  
  7047  	/**
  7048  	 * Cipher core components.
  7049  	 */
  7050  	CryptoJS.lib.Cipher || (function (undefined) {
  7051  	    // Shortcuts
  7052  	    var C = CryptoJS;
  7053  	    var C_lib = C.lib;
  7054  	    var Base = C_lib.Base;
  7055  	    var WordArray = C_lib.WordArray;
  7056  	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
  7057  	    var C_enc = C.enc;
  7058  	    var Utf8 = C_enc.Utf8;
  7059  	    var Base64 = C_enc.Base64;
  7060  	    var C_algo = C.algo;
  7061  	    var EvpKDF = C_algo.EvpKDF;
  7062  
  7063  	    /**
  7064  	     * Abstract base cipher template.
  7065  	     *
  7066  	     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
  7067  	     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
  7068  	     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
  7069  	     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
  7070  	     */
  7071  	    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
  7072  	        /**
  7073  	         * Configuration options.
  7074  	         *
  7075  	         * @property {WordArray} iv The IV to use for this operation.
  7076  	         */
  7077  	        cfg: Base.extend(),
  7078  
  7079  	        /**
  7080  	         * Creates this cipher in encryption mode.
  7081  	         *
  7082  	         * @param {WordArray} key The key.
  7083  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7084  	         *
  7085  	         * @return {Cipher} A cipher instance.
  7086  	         *
  7087  	         * @static
  7088  	         *
  7089  	         * @example
  7090  	         *
  7091  	         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
  7092  	         */
  7093  	        createEncryptor: function (key, cfg) {
  7094  	            return this.create(this._ENC_XFORM_MODE, key, cfg);
  7095  	        },
  7096  
  7097  	        /**
  7098  	         * Creates this cipher in decryption mode.
  7099  	         *
  7100  	         * @param {WordArray} key The key.
  7101  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7102  	         *
  7103  	         * @return {Cipher} A cipher instance.
  7104  	         *
  7105  	         * @static
  7106  	         *
  7107  	         * @example
  7108  	         *
  7109  	         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
  7110  	         */
  7111  	        createDecryptor: function (key, cfg) {
  7112  	            return this.create(this._DEC_XFORM_MODE, key, cfg);
  7113  	        },
  7114  
  7115  	        /**
  7116  	         * Initializes a newly created cipher.
  7117  	         *
  7118  	         * @param {number} xformMode Either the encryption or decryption transormation mode constant.
  7119  	         * @param {WordArray} key The key.
  7120  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7121  	         *
  7122  	         * @example
  7123  	         *
  7124  	         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
  7125  	         */
  7126  	        init: function (xformMode, key, cfg) {
  7127  	            // Apply config defaults
  7128  	            this.cfg = this.cfg.extend(cfg);
  7129  
  7130  	            // Store transform mode and key
  7131  	            this._xformMode = xformMode;
  7132  	            this._key = key;
  7133  
  7134  	            // Set initial values
  7135  	            this.reset();
  7136  	        },
  7137  
  7138  	        /**
  7139  	         * Resets this cipher to its initial state.
  7140  	         *
  7141  	         * @example
  7142  	         *
  7143  	         *     cipher.reset();
  7144  	         */
  7145  	        reset: function () {
  7146  	            // Reset data buffer
  7147  	            BufferedBlockAlgorithm.reset.call(this);
  7148  
  7149  	            // Perform concrete-cipher logic
  7150  	            this._doReset();
  7151  	        },
  7152  
  7153  	        /**
  7154  	         * Adds data to be encrypted or decrypted.
  7155  	         *
  7156  	         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
  7157  	         *
  7158  	         * @return {WordArray} The data after processing.
  7159  	         *
  7160  	         * @example
  7161  	         *
  7162  	         *     var encrypted = cipher.process('data');
  7163  	         *     var encrypted = cipher.process(wordArray);
  7164  	         */
  7165  	        process: function (dataUpdate) {
  7166  	            // Append
  7167  	            this._append(dataUpdate);
  7168  
  7169  	            // Process available blocks
  7170  	            return this._process();
  7171  	        },
  7172  
  7173  	        /**
  7174  	         * Finalizes the encryption or decryption process.
  7175  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  7176  	         *
  7177  	         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
  7178  	         *
  7179  	         * @return {WordArray} The data after final processing.
  7180  	         *
  7181  	         * @example
  7182  	         *
  7183  	         *     var encrypted = cipher.finalize();
  7184  	         *     var encrypted = cipher.finalize('data');
  7185  	         *     var encrypted = cipher.finalize(wordArray);
  7186  	         */
  7187  	        finalize: function (dataUpdate) {
  7188  	            // Final data update
  7189  	            if (dataUpdate) {
  7190  	                this._append(dataUpdate);
  7191  	            }
  7192  
  7193  	            // Perform concrete-cipher logic
  7194  	            var finalProcessedData = this._doFinalize();
  7195  
  7196  	            return finalProcessedData;
  7197  	        },
  7198  
  7199  	        keySize: 128/32,
  7200  
  7201  	        ivSize: 128/32,
  7202  
  7203  	        _ENC_XFORM_MODE: 1,
  7204  
  7205  	        _DEC_XFORM_MODE: 2,
  7206  
  7207  	        /**
  7208  	         * Creates shortcut functions to a cipher's object interface.
  7209  	         *
  7210  	         * @param {Cipher} cipher The cipher to create a helper for.
  7211  	         *
  7212  	         * @return {Object} An object with encrypt and decrypt shortcut functions.
  7213  	         *
  7214  	         * @static
  7215  	         *
  7216  	         * @example
  7217  	         *
  7218  	         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
  7219  	         */
  7220  	        _createHelper: (function () {
  7221  	            function selectCipherStrategy(key) {
  7222  	                if (typeof key == 'string') {
  7223  	                    return PasswordBasedCipher;
  7224  	                } else {
  7225  	                    return SerializableCipher;
  7226  	                }
  7227  	            }
  7228  
  7229  	            return function (cipher) {
  7230  	                return {
  7231  	                    encrypt: function (message, key, cfg) {
  7232  	                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
  7233  	                    },
  7234  
  7235  	                    decrypt: function (ciphertext, key, cfg) {
  7236  	                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
  7237  	                    }
  7238  	                };
  7239  	            };
  7240  	        }())
  7241  	    });
  7242  
  7243  	    /**
  7244  	     * Abstract base stream cipher template.
  7245  	     *
  7246  	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
  7247  	     */
  7248  	    var StreamCipher = C_lib.StreamCipher = Cipher.extend({
  7249  	        _doFinalize: function () {
  7250  	            // Process partial blocks
  7251  	            var finalProcessedBlocks = this._process(!!'flush');
  7252  
  7253  	            return finalProcessedBlocks;
  7254  	        },
  7255  
  7256  	        blockSize: 1
  7257  	    });
  7258  
  7259  	    /**
  7260  	     * Mode namespace.
  7261  	     */
  7262  	    var C_mode = C.mode = {};
  7263  
  7264  	    /**
  7265  	     * Abstract base block cipher mode template.
  7266  	     */
  7267  	    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
  7268  	        /**
  7269  	         * Creates this mode for encryption.
  7270  	         *
  7271  	         * @param {Cipher} cipher A block cipher instance.
  7272  	         * @param {Array} iv The IV words.
  7273  	         *
  7274  	         * @static
  7275  	         *
  7276  	         * @example
  7277  	         *
  7278  	         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
  7279  	         */
  7280  	        createEncryptor: function (cipher, iv) {
  7281  	            return this.Encryptor.create(cipher, iv);
  7282  	        },
  7283  
  7284  	        /**
  7285  	         * Creates this mode for decryption.
  7286  	         *
  7287  	         * @param {Cipher} cipher A block cipher instance.
  7288  	         * @param {Array} iv The IV words.
  7289  	         *
  7290  	         * @static
  7291  	         *
  7292  	         * @example
  7293  	         *
  7294  	         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
  7295  	         */
  7296  	        createDecryptor: function (cipher, iv) {
  7297  	            return this.Decryptor.create(cipher, iv);
  7298  	        },
  7299  
  7300  	        /**
  7301  	         * Initializes a newly created mode.
  7302  	         *
  7303  	         * @param {Cipher} cipher A block cipher instance.
  7304  	         * @param {Array} iv The IV words.
  7305  	         *
  7306  	         * @example
  7307  	         *
  7308  	         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
  7309  	         */
  7310  	        init: function (cipher, iv) {
  7311  	            this._cipher = cipher;
  7312  	            this._iv = iv;
  7313  	        }
  7314  	    });
  7315  
  7316  	    /**
  7317  	     * Cipher Block Chaining mode.
  7318  	     */
  7319  	    var CBC = C_mode.CBC = (function () {
  7320  	        /**
  7321  	         * Abstract base CBC mode.
  7322  	         */
  7323  	        var CBC = BlockCipherMode.extend();
  7324  
  7325  	        /**
  7326  	         * CBC encryptor.
  7327  	         */
  7328  	        CBC.Encryptor = CBC.extend({
  7329  	            /**
  7330  	             * Processes the data block at offset.
  7331  	             *
  7332  	             * @param {Array} words The data words to operate on.
  7333  	             * @param {number} offset The offset where the block starts.
  7334  	             *
  7335  	             * @example
  7336  	             *
  7337  	             *     mode.processBlock(data.words, offset);
  7338  	             */
  7339  	            processBlock: function (words, offset) {
  7340  	                // Shortcuts
  7341  	                var cipher = this._cipher;
  7342  	                var blockSize = cipher.blockSize;
  7343  
  7344  	                // XOR and encrypt
  7345  	                xorBlock.call(this, words, offset, blockSize);
  7346  	                cipher.encryptBlock(words, offset);
  7347  
  7348  	                // Remember this block to use with next block
  7349  	                this._prevBlock = words.slice(offset, offset + blockSize);
  7350  	            }
  7351  	        });
  7352  
  7353  	        /**
  7354  	         * CBC decryptor.
  7355  	         */
  7356  	        CBC.Decryptor = CBC.extend({
  7357  	            /**
  7358  	             * Processes the data block at offset.
  7359  	             *
  7360  	             * @param {Array} words The data words to operate on.
  7361  	             * @param {number} offset The offset where the block starts.
  7362  	             *
  7363  	             * @example
  7364  	             *
  7365  	             *     mode.processBlock(data.words, offset);
  7366  	             */
  7367  	            processBlock: function (words, offset) {
  7368  	                // Shortcuts
  7369  	                var cipher = this._cipher;
  7370  	                var blockSize = cipher.blockSize;
  7371  
  7372  	                // Remember this block to use with next block
  7373  	                var thisBlock = words.slice(offset, offset + blockSize);
  7374  
  7375  	                // Decrypt and XOR
  7376  	                cipher.decryptBlock(words, offset);
  7377  	                xorBlock.call(this, words, offset, blockSize);
  7378  
  7379  	                // This block becomes the previous block
  7380  	                this._prevBlock = thisBlock;
  7381  	            }
  7382  	        });
  7383  
  7384  	        function xorBlock(words, offset, blockSize) {
  7385  	            // Shortcut
  7386  	            var iv = this._iv;
  7387  
  7388  	            // Choose mixing block
  7389  	            if (iv) {
  7390  	                var block = iv;
  7391  
  7392  	                // Remove IV for subsequent blocks
  7393  	                this._iv = undefined;
  7394  	            } else {
  7395  	                var block = this._prevBlock;
  7396  	            }
  7397  
  7398  	            // XOR blocks
  7399  	            for (var i = 0; i < blockSize; i++) {
  7400  	                words[offset + i] ^= block[i];
  7401  	            }
  7402  	        }
  7403  
  7404  	        return CBC;
  7405  	    }());
  7406  
  7407  	    /**
  7408  	     * Padding namespace.
  7409  	     */
  7410  	    var C_pad = C.pad = {};
  7411  
  7412  	    /**
  7413  	     * PKCS #5/7 padding strategy.
  7414  	     */
  7415  	    var Pkcs7 = C_pad.Pkcs7 = {
  7416  	        /**
  7417  	         * Pads data using the algorithm defined in PKCS #5/7.
  7418  	         *
  7419  	         * @param {WordArray} data The data to pad.
  7420  	         * @param {number} blockSize The multiple that the data should be padded to.
  7421  	         *
  7422  	         * @static
  7423  	         *
  7424  	         * @example
  7425  	         *
  7426  	         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);
  7427  	         */
  7428  	        pad: function (data, blockSize) {
  7429  	            // Shortcut
  7430  	            var blockSizeBytes = blockSize * 4;
  7431  
  7432  	            // Count padding bytes
  7433  	            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
  7434  
  7435  	            // Create padding word
  7436  	            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
  7437  
  7438  	            // Create padding
  7439  	            var paddingWords = [];
  7440  	            for (var i = 0; i < nPaddingBytes; i += 4) {
  7441  	                paddingWords.push(paddingWord);
  7442  	            }
  7443  	            var padding = WordArray.create(paddingWords, nPaddingBytes);
  7444  
  7445  	            // Add padding
  7446  	            data.concat(padding);
  7447  	        },
  7448  
  7449  	        /**
  7450  	         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
  7451  	         *
  7452  	         * @param {WordArray} data The data to unpad.
  7453  	         *
  7454  	         * @static
  7455  	         *
  7456  	         * @example
  7457  	         *
  7458  	         *     CryptoJS.pad.Pkcs7.unpad(wordArray);
  7459  	         */
  7460  	        unpad: function (data) {
  7461  	            // Get number of padding bytes from last byte
  7462  	            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
  7463  
  7464  	            // Remove padding
  7465  	            data.sigBytes -= nPaddingBytes;
  7466  	        }
  7467  	    };
  7468  
  7469  	    /**
  7470  	     * Abstract base block cipher template.
  7471  	     *
  7472  	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
  7473  	     */
  7474  	    var BlockCipher = C_lib.BlockCipher = Cipher.extend({
  7475  	        /**
  7476  	         * Configuration options.
  7477  	         *
  7478  	         * @property {Mode} mode The block mode to use. Default: CBC
  7479  	         * @property {Padding} padding The padding strategy to use. Default: Pkcs7
  7480  	         */
  7481  	        cfg: Cipher.cfg.extend({
  7482  	            mode: CBC,
  7483  	            padding: Pkcs7
  7484  	        }),
  7485  
  7486  	        reset: function () {
  7487  	            // Reset cipher
  7488  	            Cipher.reset.call(this);
  7489  
  7490  	            // Shortcuts
  7491  	            var cfg = this.cfg;
  7492  	            var iv = cfg.iv;
  7493  	            var mode = cfg.mode;
  7494  
  7495  	            // Reset block mode
  7496  	            if (this._xformMode == this._ENC_XFORM_MODE) {
  7497  	                var modeCreator = mode.createEncryptor;
  7498  	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
  7499  	                var modeCreator = mode.createDecryptor;
  7500  
  7501  	                // Keep at least one block in the buffer for unpadding
  7502  	                this._minBufferSize = 1;
  7503  	            }
  7504  	            this._mode = modeCreator.call(mode, this, iv && iv.words);
  7505  	        },
  7506  
  7507  	        _doProcessBlock: function (words, offset) {
  7508  	            this._mode.processBlock(words, offset);
  7509  	        },
  7510  
  7511  	        _doFinalize: function () {
  7512  	            // Shortcut
  7513  	            var padding = this.cfg.padding;
  7514  
  7515  	            // Finalize
  7516  	            if (this._xformMode == this._ENC_XFORM_MODE) {
  7517  	                // Pad data
  7518  	                padding.pad(this._data, this.blockSize);
  7519  
  7520  	                // Process final blocks
  7521  	                var finalProcessedBlocks = this._process(!!'flush');
  7522  	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
  7523  	                // Process final blocks
  7524  	                var finalProcessedBlocks = this._process(!!'flush');
  7525  
  7526  	                // Unpad data
  7527  	                padding.unpad(finalProcessedBlocks);
  7528  	            }
  7529  
  7530  	            return finalProcessedBlocks;
  7531  	        },
  7532  
  7533  	        blockSize: 128/32
  7534  	    });
  7535  
  7536  	    /**
  7537  	     * A collection of cipher parameters.
  7538  	     *
  7539  	     * @property {WordArray} ciphertext The raw ciphertext.
  7540  	     * @property {WordArray} key The key to this ciphertext.
  7541  	     * @property {WordArray} iv The IV used in the ciphering operation.
  7542  	     * @property {WordArray} salt The salt used with a key derivation function.
  7543  	     * @property {Cipher} algorithm The cipher algorithm.
  7544  	     * @property {Mode} mode The block mode used in the ciphering operation.
  7545  	     * @property {Padding} padding The padding scheme used in the ciphering operation.
  7546  	     * @property {number} blockSize The block size of the cipher.
  7547  	     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
  7548  	     */
  7549  	    var CipherParams = C_lib.CipherParams = Base.extend({
  7550  	        /**
  7551  	         * Initializes a newly created cipher params object.
  7552  	         *
  7553  	         * @param {Object} cipherParams An object with any of the possible cipher parameters.
  7554  	         *
  7555  	         * @example
  7556  	         *
  7557  	         *     var cipherParams = CryptoJS.lib.CipherParams.create({
  7558  	         *         ciphertext: ciphertextWordArray,
  7559  	         *         key: keyWordArray,
  7560  	         *         iv: ivWordArray,
  7561  	         *         salt: saltWordArray,
  7562  	         *         algorithm: CryptoJS.algo.AES,
  7563  	         *         mode: CryptoJS.mode.CBC,
  7564  	         *         padding: CryptoJS.pad.PKCS7,
  7565  	         *         blockSize: 4,
  7566  	         *         formatter: CryptoJS.format.OpenSSL
  7567  	         *     });
  7568  	         */
  7569  	        init: function (cipherParams) {
  7570  	            this.mixIn(cipherParams);
  7571  	        },
  7572  
  7573  	        /**
  7574  	         * Converts this cipher params object to a string.
  7575  	         *
  7576  	         * @param {Format} formatter (Optional) The formatting strategy to use.
  7577  	         *
  7578  	         * @return {string} The stringified cipher params.
  7579  	         *
  7580  	         * @throws Error If neither the formatter nor the default formatter is set.
  7581  	         *
  7582  	         * @example
  7583  	         *
  7584  	         *     var string = cipherParams + '';
  7585  	         *     var string = cipherParams.toString();
  7586  	         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);
  7587  	         */
  7588  	        toString: function (formatter) {
  7589  	            return (formatter || this.formatter).stringify(this);
  7590  	        }
  7591  	    });
  7592  
  7593  	    /**
  7594  	     * Format namespace.
  7595  	     */
  7596  	    var C_format = C.format = {};
  7597  
  7598  	    /**
  7599  	     * OpenSSL formatting strategy.
  7600  	     */
  7601  	    var OpenSSLFormatter = C_format.OpenSSL = {
  7602  	        /**
  7603  	         * Converts a cipher params object to an OpenSSL-compatible string.
  7604  	         *
  7605  	         * @param {CipherParams} cipherParams The cipher params object.
  7606  	         *
  7607  	         * @return {string} The OpenSSL-compatible string.
  7608  	         *
  7609  	         * @static
  7610  	         *
  7611  	         * @example
  7612  	         *
  7613  	         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
  7614  	         */
  7615  	        stringify: function (cipherParams) {
  7616  	            // Shortcuts
  7617  	            var ciphertext = cipherParams.ciphertext;
  7618  	            var salt = cipherParams.salt;
  7619  
  7620  	            // Format
  7621  	            if (salt) {
  7622  	                var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
  7623  	            } else {
  7624  	                var wordArray = ciphertext;
  7625  	            }
  7626  
  7627  	            return wordArray.toString(Base64);
  7628  	        },
  7629  
  7630  	        /**
  7631  	         * Converts an OpenSSL-compatible string to a cipher params object.
  7632  	         *
  7633  	         * @param {string} openSSLStr The OpenSSL-compatible string.
  7634  	         *
  7635  	         * @return {CipherParams} The cipher params object.
  7636  	         *
  7637  	         * @static
  7638  	         *
  7639  	         * @example
  7640  	         *
  7641  	         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
  7642  	         */
  7643  	        parse: function (openSSLStr) {
  7644  	            // Parse base64
  7645  	            var ciphertext = Base64.parse(openSSLStr);
  7646  
  7647  	            // Shortcut
  7648  	            var ciphertextWords = ciphertext.words;
  7649  
  7650  	            // Test for salt
  7651  	            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
  7652  	                // Extract salt
  7653  	                var salt = WordArray.create(ciphertextWords.slice(2, 4));
  7654  
  7655  	                // Remove salt from ciphertext
  7656  	                ciphertextWords.splice(0, 4);
  7657  	                ciphertext.sigBytes -= 16;
  7658  	            }
  7659  
  7660  	            return CipherParams.create({ ciphertext: ciphertext, salt: salt });
  7661  	        }
  7662  	    };
  7663  
  7664  	    /**
  7665  	     * A cipher wrapper that returns ciphertext as a serializable cipher params object.
  7666  	     */
  7667  	    var SerializableCipher = C_lib.SerializableCipher = Base.extend({
  7668  	        /**
  7669  	         * Configuration options.
  7670  	         *
  7671  	         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
  7672  	         */
  7673  	        cfg: Base.extend({
  7674  	            format: OpenSSLFormatter
  7675  	        }),
  7676  
  7677  	        /**
  7678  	         * Encrypts a message.
  7679  	         *
  7680  	         * @param {Cipher} cipher The cipher algorithm to use.
  7681  	         * @param {WordArray|string} message The message to encrypt.
  7682  	         * @param {WordArray} key The key.
  7683  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7684  	         *
  7685  	         * @return {CipherParams} A cipher params object.
  7686  	         *
  7687  	         * @static
  7688  	         *
  7689  	         * @example
  7690  	         *
  7691  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
  7692  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
  7693  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7694  	         */
  7695  	        encrypt: function (cipher, message, key, cfg) {
  7696  	            // Apply config defaults
  7697  	            cfg = this.cfg.extend(cfg);
  7698  
  7699  	            // Encrypt
  7700  	            var encryptor = cipher.createEncryptor(key, cfg);
  7701  	            var ciphertext = encryptor.finalize(message);
  7702  
  7703  	            // Shortcut
  7704  	            var cipherCfg = encryptor.cfg;
  7705  
  7706  	            // Create and return serializable cipher params
  7707  	            return CipherParams.create({
  7708  	                ciphertext: ciphertext,
  7709  	                key: key,
  7710  	                iv: cipherCfg.iv,
  7711  	                algorithm: cipher,
  7712  	                mode: cipherCfg.mode,
  7713  	                padding: cipherCfg.padding,
  7714  	                blockSize: cipher.blockSize,
  7715  	                formatter: cfg.format
  7716  	            });
  7717  	        },
  7718  
  7719  	        /**
  7720  	         * Decrypts serialized ciphertext.
  7721  	         *
  7722  	         * @param {Cipher} cipher The cipher algorithm to use.
  7723  	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
  7724  	         * @param {WordArray} key The key.
  7725  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7726  	         *
  7727  	         * @return {WordArray} The plaintext.
  7728  	         *
  7729  	         * @static
  7730  	         *
  7731  	         * @example
  7732  	         *
  7733  	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7734  	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7735  	         */
  7736  	        decrypt: function (cipher, ciphertext, key, cfg) {
  7737  	            // Apply config defaults
  7738  	            cfg = this.cfg.extend(cfg);
  7739  
  7740  	            // Convert string to CipherParams
  7741  	            ciphertext = this._parse(ciphertext, cfg.format);
  7742  
  7743  	            // Decrypt
  7744  	            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
  7745  
  7746  	            return plaintext;
  7747  	        },
  7748  
  7749  	        /**
  7750  	         * Converts serialized ciphertext to CipherParams,
  7751  	         * else assumed CipherParams already and returns ciphertext unchanged.
  7752  	         *
  7753  	         * @param {CipherParams|string} ciphertext The ciphertext.
  7754  	         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
  7755  	         *
  7756  	         * @return {CipherParams} The unserialized ciphertext.
  7757  	         *
  7758  	         * @static
  7759  	         *
  7760  	         * @example
  7761  	         *
  7762  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
  7763  	         */
  7764  	        _parse: function (ciphertext, format) {
  7765  	            if (typeof ciphertext == 'string') {
  7766  	                return format.parse(ciphertext, this);
  7767  	            } else {
  7768  	                return ciphertext;
  7769  	            }
  7770  	        }
  7771  	    });
  7772  
  7773  	    /**
  7774  	     * Key derivation function namespace.
  7775  	     */
  7776  	    var C_kdf = C.kdf = {};
  7777  
  7778  	    /**
  7779  	     * OpenSSL key derivation function.
  7780  	     */
  7781  	    var OpenSSLKdf = C_kdf.OpenSSL = {
  7782  	        /**
  7783  	         * Derives a key and IV from a password.
  7784  	         *
  7785  	         * @param {string} password The password to derive from.
  7786  	         * @param {number} keySize The size in words of the key to generate.
  7787  	         * @param {number} ivSize The size in words of the IV to generate.
  7788  	         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
  7789  	         *
  7790  	         * @return {CipherParams} A cipher params object with the key, IV, and salt.
  7791  	         *
  7792  	         * @static
  7793  	         *
  7794  	         * @example
  7795  	         *
  7796  	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
  7797  	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
  7798  	         */
  7799  	        execute: function (password, keySize, ivSize, salt) {
  7800  	            // Generate random salt
  7801  	            if (!salt) {
  7802  	                salt = WordArray.random(64/8);
  7803  	            }
  7804  
  7805  	            // Derive key and IV
  7806  	            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
  7807  
  7808  	            // Separate key and IV
  7809  	            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
  7810  	            key.sigBytes = keySize * 4;
  7811  
  7812  	            // Return params
  7813  	            return CipherParams.create({ key: key, iv: iv, salt: salt });
  7814  	        }
  7815  	    };
  7816  
  7817  	    /**
  7818  	     * A serializable cipher wrapper that derives the key from a password,
  7819  	     * and returns ciphertext as a serializable cipher params object.
  7820  	     */
  7821  	    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
  7822  	        /**
  7823  	         * Configuration options.
  7824  	         *
  7825  	         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
  7826  	         */
  7827  	        cfg: SerializableCipher.cfg.extend({
  7828  	            kdf: OpenSSLKdf
  7829  	        }),
  7830  
  7831  	        /**
  7832  	         * Encrypts a message using a password.
  7833  	         *
  7834  	         * @param {Cipher} cipher The cipher algorithm to use.
  7835  	         * @param {WordArray|string} message The message to encrypt.
  7836  	         * @param {string} password The password.
  7837  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7838  	         *
  7839  	         * @return {CipherParams} A cipher params object.
  7840  	         *
  7841  	         * @static
  7842  	         *
  7843  	         * @example
  7844  	         *
  7845  	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
  7846  	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
  7847  	         */
  7848  	        encrypt: function (cipher, message, password, cfg) {
  7849  	            // Apply config defaults
  7850  	            cfg = this.cfg.extend(cfg);
  7851  
  7852  	            // Derive key and other params
  7853  	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
  7854  
  7855  	            // Add IV to config
  7856  	            cfg.iv = derivedParams.iv;
  7857  
  7858  	            // Encrypt
  7859  	            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
  7860  
  7861  	            // Mix in derived params
  7862  	            ciphertext.mixIn(derivedParams);
  7863  
  7864  	            return ciphertext;
  7865  	        },
  7866  
  7867  	        /**
  7868  	         * Decrypts serialized ciphertext using a password.
  7869  	         *
  7870  	         * @param {Cipher} cipher The cipher algorithm to use.
  7871  	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
  7872  	         * @param {string} password The password.
  7873  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7874  	         *
  7875  	         * @return {WordArray} The plaintext.
  7876  	         *
  7877  	         * @static
  7878  	         *
  7879  	         * @example
  7880  	         *
  7881  	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
  7882  	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
  7883  	         */
  7884  	        decrypt: function (cipher, ciphertext, password, cfg) {
  7885  	            // Apply config defaults
  7886  	            cfg = this.cfg.extend(cfg);
  7887  
  7888  	            // Convert string to CipherParams
  7889  	            ciphertext = this._parse(ciphertext, cfg.format);
  7890  
  7891  	            // Derive key and other params
  7892  	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
  7893  
  7894  	            // Add IV to config
  7895  	            cfg.iv = derivedParams.iv;
  7896  
  7897  	            // Decrypt
  7898  	            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
  7899  
  7900  	            return plaintext;
  7901  	        }
  7902  	    });
  7903  	}());
  7904  
  7905  
  7906  }));
  7907  },{"./core":53}],53:[function(require,module,exports){
  7908  ;(function (root, factory) {
  7909  	if (typeof exports === "object") {
  7910  		// CommonJS
  7911  		module.exports = exports = factory();
  7912  	}
  7913  	else if (typeof define === "function" && define.amd) {
  7914  		// AMD
  7915  		define([], factory);
  7916  	}
  7917  	else {
  7918  		// Global (browser)
  7919  		root.CryptoJS = factory();
  7920  	}
  7921  }(this, function () {
  7922  
  7923  	/**
  7924  	 * CryptoJS core components.
  7925  	 */
  7926  	var CryptoJS = CryptoJS || (function (Math, undefined) {
  7927  	    /*
  7928  	     * Local polyfil of Object.create
  7929  	     */
  7930  	    var create = Object.create || (function () {
  7931  	        function F() {};
  7932  
  7933  	        return function (obj) {
  7934  	            var subtype;
  7935  
  7936  	            F.prototype = obj;
  7937  
  7938  	            subtype = new F();
  7939  
  7940  	            F.prototype = null;
  7941  
  7942  	            return subtype;
  7943  	        };
  7944  	    }())
  7945  
  7946  	    /**
  7947  	     * CryptoJS namespace.
  7948  	     */
  7949  	    var C = {};
  7950  
  7951  	    /**
  7952  	     * Library namespace.
  7953  	     */
  7954  	    var C_lib = C.lib = {};
  7955  
  7956  	    /**
  7957  	     * Base object for prototypal inheritance.
  7958  	     */
  7959  	    var Base = C_lib.Base = (function () {
  7960  
  7961  
  7962  	        return {
  7963  	            /**
  7964  	             * Creates a new object that inherits from this object.
  7965  	             *
  7966  	             * @param {Object} overrides Properties to copy into the new object.
  7967  	             *
  7968  	             * @return {Object} The new object.
  7969  	             *
  7970  	             * @static
  7971  	             *
  7972  	             * @example
  7973  	             *
  7974  	             *     var MyType = CryptoJS.lib.Base.extend({
  7975  	             *         field: 'value',
  7976  	             *
  7977  	             *         method: function () {
  7978  	             *         }
  7979  	             *     });
  7980  	             */
  7981  	            extend: function (overrides) {
  7982  	                // Spawn
  7983  	                var subtype = create(this);
  7984  
  7985  	                // Augment
  7986  	                if (overrides) {
  7987  	                    subtype.mixIn(overrides);
  7988  	                }
  7989  
  7990  	                // Create default initializer
  7991  	                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
  7992  	                    subtype.init = function () {
  7993  	                        subtype.$super.init.apply(this, arguments);
  7994  	                    };
  7995  	                }
  7996  
  7997  	                // Initializer's prototype is the subtype object
  7998  	                subtype.init.prototype = subtype;
  7999  
  8000  	                // Reference supertype
  8001  	                subtype.$super = this;
  8002  
  8003  	                return subtype;
  8004  	            },
  8005  
  8006  	            /**
  8007  	             * Extends this object and runs the init method.
  8008  	             * Arguments to create() will be passed to init().
  8009  	             *
  8010  	             * @return {Object} The new object.
  8011  	             *
  8012  	             * @static
  8013  	             *
  8014  	             * @example
  8015  	             *
  8016  	             *     var instance = MyType.create();
  8017  	             */
  8018  	            create: function () {
  8019  	                var instance = this.extend();
  8020  	                instance.init.apply(instance, arguments);
  8021  
  8022  	                return instance;
  8023  	            },
  8024  
  8025  	            /**
  8026  	             * Initializes a newly created object.
  8027  	             * Override this method to add some logic when your objects are created.
  8028  	             *
  8029  	             * @example
  8030  	             *
  8031  	             *     var MyType = CryptoJS.lib.Base.extend({
  8032  	             *         init: function () {
  8033  	             *             // ...
  8034  	             *         }
  8035  	             *     });
  8036  	             */
  8037  	            init: function () {
  8038  	            },
  8039  
  8040  	            /**
  8041  	             * Copies properties into this object.
  8042  	             *
  8043  	             * @param {Object} properties The properties to mix in.
  8044  	             *
  8045  	             * @example
  8046  	             *
  8047  	             *     MyType.mixIn({
  8048  	             *         field: 'value'
  8049  	             *     });
  8050  	             */
  8051  	            mixIn: function (properties) {
  8052  	                for (var propertyName in properties) {
  8053  	                    if (properties.hasOwnProperty(propertyName)) {
  8054  	                        this[propertyName] = properties[propertyName];
  8055  	                    }
  8056  	                }
  8057  
  8058  	                // IE won't copy toString using the loop above
  8059  	                if (properties.hasOwnProperty('toString')) {
  8060  	                    this.toString = properties.toString;
  8061  	                }
  8062  	            },
  8063  
  8064  	            /**
  8065  	             * Creates a copy of this object.
  8066  	             *
  8067  	             * @return {Object} The clone.
  8068  	             *
  8069  	             * @example
  8070  	             *
  8071  	             *     var clone = instance.clone();
  8072  	             */
  8073  	            clone: function () {
  8074  	                return this.init.prototype.extend(this);
  8075  	            }
  8076  	        };
  8077  	    }());
  8078  
  8079  	    /**
  8080  	     * An array of 32-bit words.
  8081  	     *
  8082  	     * @property {Array} words The array of 32-bit words.
  8083  	     * @property {number} sigBytes The number of significant bytes in this word array.
  8084  	     */
  8085  	    var WordArray = C_lib.WordArray = Base.extend({
  8086  	        /**
  8087  	         * Initializes a newly created word array.
  8088  	         *
  8089  	         * @param {Array} words (Optional) An array of 32-bit words.
  8090  	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
  8091  	         *
  8092  	         * @example
  8093  	         *
  8094  	         *     var wordArray = CryptoJS.lib.WordArray.create();
  8095  	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
  8096  	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
  8097  	         */
  8098  	        init: function (words, sigBytes) {
  8099  	            words = this.words = words || [];
  8100  
  8101  	            if (sigBytes != undefined) {
  8102  	                this.sigBytes = sigBytes;
  8103  	            } else {
  8104  	                this.sigBytes = words.length * 4;
  8105  	            }
  8106  	        },
  8107  
  8108  	        /**
  8109  	         * Converts this word array to a string.
  8110  	         *
  8111  	         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
  8112  	         *
  8113  	         * @return {string} The stringified word array.
  8114  	         *
  8115  	         * @example
  8116  	         *
  8117  	         *     var string = wordArray + '';
  8118  	         *     var string = wordArray.toString();
  8119  	         *     var string = wordArray.toString(CryptoJS.enc.Utf8);
  8120  	         */
  8121  	        toString: function (encoder) {
  8122  	            return (encoder || Hex).stringify(this);
  8123  	        },
  8124  
  8125  	        /**
  8126  	         * Concatenates a word array to this word array.
  8127  	         *
  8128  	         * @param {WordArray} wordArray The word array to append.
  8129  	         *
  8130  	         * @return {WordArray} This word array.
  8131  	         *
  8132  	         * @example
  8133  	         *
  8134  	         *     wordArray1.concat(wordArray2);
  8135  	         */
  8136  	        concat: function (wordArray) {
  8137  	            // Shortcuts
  8138  	            var thisWords = this.words;
  8139  	            var thatWords = wordArray.words;
  8140  	            var thisSigBytes = this.sigBytes;
  8141  	            var thatSigBytes = wordArray.sigBytes;
  8142  
  8143  	            // Clamp excess bits
  8144  	            this.clamp();
  8145  
  8146  	            // Concat
  8147  	            if (thisSigBytes % 4) {
  8148  	                // Copy one byte at a time
  8149  	                for (var i = 0; i < thatSigBytes; i++) {
  8150  	                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8151  	                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
  8152  	                }
  8153  	            } else {
  8154  	                // Copy one word at a time
  8155  	                for (var i = 0; i < thatSigBytes; i += 4) {
  8156  	                    thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
  8157  	                }
  8158  	            }
  8159  	            this.sigBytes += thatSigBytes;
  8160  
  8161  	            // Chainable
  8162  	            return this;
  8163  	        },
  8164  
  8165  	        /**
  8166  	         * Removes insignificant bits.
  8167  	         *
  8168  	         * @example
  8169  	         *
  8170  	         *     wordArray.clamp();
  8171  	         */
  8172  	        clamp: function () {
  8173  	            // Shortcuts
  8174  	            var words = this.words;
  8175  	            var sigBytes = this.sigBytes;
  8176  
  8177  	            // Clamp
  8178  	            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
  8179  	            words.length = Math.ceil(sigBytes / 4);
  8180  	        },
  8181  
  8182  	        /**
  8183  	         * Creates a copy of this word array.
  8184  	         *
  8185  	         * @return {WordArray} The clone.
  8186  	         *
  8187  	         * @example
  8188  	         *
  8189  	         *     var clone = wordArray.clone();
  8190  	         */
  8191  	        clone: function () {
  8192  	            var clone = Base.clone.call(this);
  8193  	            clone.words = this.words.slice(0);
  8194  
  8195  	            return clone;
  8196  	        },
  8197  
  8198  	        /**
  8199  	         * Creates a word array filled with random bytes.
  8200  	         *
  8201  	         * @param {number} nBytes The number of random bytes to generate.
  8202  	         *
  8203  	         * @return {WordArray} The random word array.
  8204  	         *
  8205  	         * @static
  8206  	         *
  8207  	         * @example
  8208  	         *
  8209  	         *     var wordArray = CryptoJS.lib.WordArray.random(16);
  8210  	         */
  8211  	        random: function (nBytes) {
  8212  	            var words = [];
  8213  
  8214  	            var r = (function (m_w) {
  8215  	                var m_w = m_w;
  8216  	                var m_z = 0x3ade68b1;
  8217  	                var mask = 0xffffffff;
  8218  
  8219  	                return function () {
  8220  	                    m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
  8221  	                    m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
  8222  	                    var result = ((m_z << 0x10) + m_w) & mask;
  8223  	                    result /= 0x100000000;
  8224  	                    result += 0.5;
  8225  	                    return result * (Math.random() > .5 ? 1 : -1);
  8226  	                }
  8227  	            });
  8228  
  8229  	            for (var i = 0, rcache; i < nBytes; i += 4) {
  8230  	                var _r = r((rcache || Math.random()) * 0x100000000);
  8231  
  8232  	                rcache = _r() * 0x3ade67b7;
  8233  	                words.push((_r() * 0x100000000) | 0);
  8234  	            }
  8235  
  8236  	            return new WordArray.init(words, nBytes);
  8237  	        }
  8238  	    });
  8239  
  8240  	    /**
  8241  	     * Encoder namespace.
  8242  	     */
  8243  	    var C_enc = C.enc = {};
  8244  
  8245  	    /**
  8246  	     * Hex encoding strategy.
  8247  	     */
  8248  	    var Hex = C_enc.Hex = {
  8249  	        /**
  8250  	         * Converts a word array to a hex string.
  8251  	         *
  8252  	         * @param {WordArray} wordArray The word array.
  8253  	         *
  8254  	         * @return {string} The hex string.
  8255  	         *
  8256  	         * @static
  8257  	         *
  8258  	         * @example
  8259  	         *
  8260  	         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);
  8261  	         */
  8262  	        stringify: function (wordArray) {
  8263  	            // Shortcuts
  8264  	            var words = wordArray.words;
  8265  	            var sigBytes = wordArray.sigBytes;
  8266  
  8267  	            // Convert
  8268  	            var hexChars = [];
  8269  	            for (var i = 0; i < sigBytes; i++) {
  8270  	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8271  	                hexChars.push((bite >>> 4).toString(16));
  8272  	                hexChars.push((bite & 0x0f).toString(16));
  8273  	            }
  8274  
  8275  	            return hexChars.join('');
  8276  	        },
  8277  
  8278  	        /**
  8279  	         * Converts a hex string to a word array.
  8280  	         *
  8281  	         * @param {string} hexStr The hex string.
  8282  	         *
  8283  	         * @return {WordArray} The word array.
  8284  	         *
  8285  	         * @static
  8286  	         *
  8287  	         * @example
  8288  	         *
  8289  	         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);
  8290  	         */
  8291  	        parse: function (hexStr) {
  8292  	            // Shortcut
  8293  	            var hexStrLength = hexStr.length;
  8294  
  8295  	            // Convert
  8296  	            var words = [];
  8297  	            for (var i = 0; i < hexStrLength; i += 2) {
  8298  	                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
  8299  	            }
  8300  
  8301  	            return new WordArray.init(words, hexStrLength / 2);
  8302  	        }
  8303  	    };
  8304  
  8305  	    /**
  8306  	     * Latin1 encoding strategy.
  8307  	     */
  8308  	    var Latin1 = C_enc.Latin1 = {
  8309  	        /**
  8310  	         * Converts a word array to a Latin1 string.
  8311  	         *
  8312  	         * @param {WordArray} wordArray The word array.
  8313  	         *
  8314  	         * @return {string} The Latin1 string.
  8315  	         *
  8316  	         * @static
  8317  	         *
  8318  	         * @example
  8319  	         *
  8320  	         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
  8321  	         */
  8322  	        stringify: function (wordArray) {
  8323  	            // Shortcuts
  8324  	            var words = wordArray.words;
  8325  	            var sigBytes = wordArray.sigBytes;
  8326  
  8327  	            // Convert
  8328  	            var latin1Chars = [];
  8329  	            for (var i = 0; i < sigBytes; i++) {
  8330  	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8331  	                latin1Chars.push(String.fromCharCode(bite));
  8332  	            }
  8333  
  8334  	            return latin1Chars.join('');
  8335  	        },
  8336  
  8337  	        /**
  8338  	         * Converts a Latin1 string to a word array.
  8339  	         *
  8340  	         * @param {string} latin1Str The Latin1 string.
  8341  	         *
  8342  	         * @return {WordArray} The word array.
  8343  	         *
  8344  	         * @static
  8345  	         *
  8346  	         * @example
  8347  	         *
  8348  	         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
  8349  	         */
  8350  	        parse: function (latin1Str) {
  8351  	            // Shortcut
  8352  	            var latin1StrLength = latin1Str.length;
  8353  
  8354  	            // Convert
  8355  	            var words = [];
  8356  	            for (var i = 0; i < latin1StrLength; i++) {
  8357  	                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
  8358  	            }
  8359  
  8360  	            return new WordArray.init(words, latin1StrLength);
  8361  	        }
  8362  	    };
  8363  
  8364  	    /**
  8365  	     * UTF-8 encoding strategy.
  8366  	     */
  8367  	    var Utf8 = C_enc.Utf8 = {
  8368  	        /**
  8369  	         * Converts a word array to a UTF-8 string.
  8370  	         *
  8371  	         * @param {WordArray} wordArray The word array.
  8372  	         *
  8373  	         * @return {string} The UTF-8 string.
  8374  	         *
  8375  	         * @static
  8376  	         *
  8377  	         * @example
  8378  	         *
  8379  	         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
  8380  	         */
  8381  	        stringify: function (wordArray) {
  8382  	            try {
  8383  	                return decodeURIComponent(escape(Latin1.stringify(wordArray)));
  8384  	            } catch (e) {
  8385  	                throw new Error('Malformed UTF-8 data');
  8386  	            }
  8387  	        },
  8388  
  8389  	        /**
  8390  	         * Converts a UTF-8 string to a word array.
  8391  	         *
  8392  	         * @param {string} utf8Str The UTF-8 string.
  8393  	         *
  8394  	         * @return {WordArray} The word array.
  8395  	         *
  8396  	         * @static
  8397  	         *
  8398  	         * @example
  8399  	         *
  8400  	         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
  8401  	         */
  8402  	        parse: function (utf8Str) {
  8403  	            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
  8404  	        }
  8405  	    };
  8406  
  8407  	    /**
  8408  	     * Abstract buffered block algorithm template.
  8409  	     *
  8410  	     * The property blockSize must be implemented in a concrete subtype.
  8411  	     *
  8412  	     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
  8413  	     */
  8414  	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
  8415  	        /**
  8416  	         * Resets this block algorithm's data buffer to its initial state.
  8417  	         *
  8418  	         * @example
  8419  	         *
  8420  	         *     bufferedBlockAlgorithm.reset();
  8421  	         */
  8422  	        reset: function () {
  8423  	            // Initial values
  8424  	            this._data = new WordArray.init();
  8425  	            this._nDataBytes = 0;
  8426  	        },
  8427  
  8428  	        /**
  8429  	         * Adds new data to this block algorithm's buffer.
  8430  	         *
  8431  	         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
  8432  	         *
  8433  	         * @example
  8434  	         *
  8435  	         *     bufferedBlockAlgorithm._append('data');
  8436  	         *     bufferedBlockAlgorithm._append(wordArray);
  8437  	         */
  8438  	        _append: function (data) {
  8439  	            // Convert string to WordArray, else assume WordArray already
  8440  	            if (typeof data == 'string') {
  8441  	                data = Utf8.parse(data);
  8442  	            }
  8443  
  8444  	            // Append
  8445  	            this._data.concat(data);
  8446  	            this._nDataBytes += data.sigBytes;
  8447  	        },
  8448  
  8449  	        /**
  8450  	         * Processes available data blocks.
  8451  	         *
  8452  	         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
  8453  	         *
  8454  	         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
  8455  	         *
  8456  	         * @return {WordArray} The processed data.
  8457  	         *
  8458  	         * @example
  8459  	         *
  8460  	         *     var processedData = bufferedBlockAlgorithm._process();
  8461  	         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');
  8462  	         */
  8463  	        _process: function (doFlush) {
  8464  	            // Shortcuts
  8465  	            var data = this._data;
  8466  	            var dataWords = data.words;
  8467  	            var dataSigBytes = data.sigBytes;
  8468  	            var blockSize = this.blockSize;
  8469  	            var blockSizeBytes = blockSize * 4;
  8470  
  8471  	            // Count blocks ready
  8472  	            var nBlocksReady = dataSigBytes / blockSizeBytes;
  8473  	            if (doFlush) {
  8474  	                // Round up to include partial blocks
  8475  	                nBlocksReady = Math.ceil(nBlocksReady);
  8476  	            } else {
  8477  	                // Round down to include only full blocks,
  8478  	                // less the number of blocks that must remain in the buffer
  8479  	                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
  8480  	            }
  8481  
  8482  	            // Count words ready
  8483  	            var nWordsReady = nBlocksReady * blockSize;
  8484  
  8485  	            // Count bytes ready
  8486  	            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
  8487  
  8488  	            // Process blocks
  8489  	            if (nWordsReady) {
  8490  	                for (var offset = 0; offset < nWordsReady; offset += blockSize) {
  8491  	                    // Perform concrete-algorithm logic
  8492  	                    this._doProcessBlock(dataWords, offset);
  8493  	                }
  8494  
  8495  	                // Remove processed words
  8496  	                var processedWords = dataWords.splice(0, nWordsReady);
  8497  	                data.sigBytes -= nBytesReady;
  8498  	            }
  8499  
  8500  	            // Return processed words
  8501  	            return new WordArray.init(processedWords, nBytesReady);
  8502  	        },
  8503  
  8504  	        /**
  8505  	         * Creates a copy of this object.
  8506  	         *
  8507  	         * @return {Object} The clone.
  8508  	         *
  8509  	         * @example
  8510  	         *
  8511  	         *     var clone = bufferedBlockAlgorithm.clone();
  8512  	         */
  8513  	        clone: function () {
  8514  	            var clone = Base.clone.call(this);
  8515  	            clone._data = this._data.clone();
  8516  
  8517  	            return clone;
  8518  	        },
  8519  
  8520  	        _minBufferSize: 0
  8521  	    });
  8522  
  8523  	    /**
  8524  	     * Abstract hasher template.
  8525  	     *
  8526  	     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
  8527  	     */
  8528  	    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
  8529  	        /**
  8530  	         * Configuration options.
  8531  	         */
  8532  	        cfg: Base.extend(),
  8533  
  8534  	        /**
  8535  	         * Initializes a newly created hasher.
  8536  	         *
  8537  	         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
  8538  	         *
  8539  	         * @example
  8540  	         *
  8541  	         *     var hasher = CryptoJS.algo.SHA256.create();
  8542  	         */
  8543  	        init: function (cfg) {
  8544  	            // Apply config defaults
  8545  	            this.cfg = this.cfg.extend(cfg);
  8546  
  8547  	            // Set initial values
  8548  	            this.reset();
  8549  	        },
  8550  
  8551  	        /**
  8552  	         * Resets this hasher to its initial state.
  8553  	         *
  8554  	         * @example
  8555  	         *
  8556  	         *     hasher.reset();
  8557  	         */
  8558  	        reset: function () {
  8559  	            // Reset data buffer
  8560  	            BufferedBlockAlgorithm.reset.call(this);
  8561  
  8562  	            // Perform concrete-hasher logic
  8563  	            this._doReset();
  8564  	        },
  8565  
  8566  	        /**
  8567  	         * Updates this hasher with a message.
  8568  	         *
  8569  	         * @param {WordArray|string} messageUpdate The message to append.
  8570  	         *
  8571  	         * @return {Hasher} This hasher.
  8572  	         *
  8573  	         * @example
  8574  	         *
  8575  	         *     hasher.update('message');
  8576  	         *     hasher.update(wordArray);
  8577  	         */
  8578  	        update: function (messageUpdate) {
  8579  	            // Append
  8580  	            this._append(messageUpdate);
  8581  
  8582  	            // Update the hash
  8583  	            this._process();
  8584  
  8585  	            // Chainable
  8586  	            return this;
  8587  	        },
  8588  
  8589  	        /**
  8590  	         * Finalizes the hash computation.
  8591  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  8592  	         *
  8593  	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
  8594  	         *
  8595  	         * @return {WordArray} The hash.
  8596  	         *
  8597  	         * @example
  8598  	         *
  8599  	         *     var hash = hasher.finalize();
  8600  	         *     var hash = hasher.finalize('message');
  8601  	         *     var hash = hasher.finalize(wordArray);
  8602  	         */
  8603  	        finalize: function (messageUpdate) {
  8604  	            // Final message update
  8605  	            if (messageUpdate) {
  8606  	                this._append(messageUpdate);
  8607  	            }
  8608  
  8609  	            // Perform concrete-hasher logic
  8610  	            var hash = this._doFinalize();
  8611  
  8612  	            return hash;
  8613  	        },
  8614  
  8615  	        blockSize: 512/32,
  8616  
  8617  	        /**
  8618  	         * Creates a shortcut function to a hasher's object interface.
  8619  	         *
  8620  	         * @param {Hasher} hasher The hasher to create a helper for.
  8621  	         *
  8622  	         * @return {Function} The shortcut function.
  8623  	         *
  8624  	         * @static
  8625  	         *
  8626  	         * @example
  8627  	         *
  8628  	         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
  8629  	         */
  8630  	        _createHelper: function (hasher) {
  8631  	            return function (message, cfg) {
  8632  	                return new hasher.init(cfg).finalize(message);
  8633  	            };
  8634  	        },
  8635  
  8636  	        /**
  8637  	         * Creates a shortcut function to the HMAC's object interface.
  8638  	         *
  8639  	         * @param {Hasher} hasher The hasher to use in this HMAC helper.
  8640  	         *
  8641  	         * @return {Function} The shortcut function.
  8642  	         *
  8643  	         * @static
  8644  	         *
  8645  	         * @example
  8646  	         *
  8647  	         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
  8648  	         */
  8649  	        _createHmacHelper: function (hasher) {
  8650  	            return function (message, key) {
  8651  	                return new C_algo.HMAC.init(hasher, key).finalize(message);
  8652  	            };
  8653  	        }
  8654  	    });
  8655  
  8656  	    /**
  8657  	     * Algorithm namespace.
  8658  	     */
  8659  	    var C_algo = C.algo = {};
  8660  
  8661  	    return C;
  8662  	}(Math));
  8663  
  8664  
  8665  	return CryptoJS;
  8666  
  8667  }));
  8668  },{}],54:[function(require,module,exports){
  8669  ;(function (root, factory) {
  8670  	if (typeof exports === "object") {
  8671  		// CommonJS
  8672  		module.exports = exports = factory(require("./core"));
  8673  	}
  8674  	else if (typeof define === "function" && define.amd) {
  8675  		// AMD
  8676  		define(["./core"], factory);
  8677  	}
  8678  	else {
  8679  		// Global (browser)
  8680  		factory(root.CryptoJS);
  8681  	}
  8682  }(this, function (CryptoJS) {
  8683  
  8684  	(function () {
  8685  	    // Shortcuts
  8686  	    var C = CryptoJS;
  8687  	    var C_lib = C.lib;
  8688  	    var WordArray = C_lib.WordArray;
  8689  	    var C_enc = C.enc;
  8690  
  8691  	    /**
  8692  	     * Base64 encoding strategy.
  8693  	     */
  8694  	    var Base64 = C_enc.Base64 = {
  8695  	        /**
  8696  	         * Converts a word array to a Base64 string.
  8697  	         *
  8698  	         * @param {WordArray} wordArray The word array.
  8699  	         *
  8700  	         * @return {string} The Base64 string.
  8701  	         *
  8702  	         * @static
  8703  	         *
  8704  	         * @example
  8705  	         *
  8706  	         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);
  8707  	         */
  8708  	        stringify: function (wordArray) {
  8709  	            // Shortcuts
  8710  	            var words = wordArray.words;
  8711  	            var sigBytes = wordArray.sigBytes;
  8712  	            var map = this._map;
  8713  
  8714  	            // Clamp excess bits
  8715  	            wordArray.clamp();
  8716  
  8717  	            // Convert
  8718  	            var base64Chars = [];
  8719  	            for (var i = 0; i < sigBytes; i += 3) {
  8720  	                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;
  8721  	                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
  8722  	                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
  8723  
  8724  	                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
  8725  
  8726  	                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
  8727  	                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
  8728  	                }
  8729  	            }
  8730  
  8731  	            // Add padding
  8732  	            var paddingChar = map.charAt(64);
  8733  	            if (paddingChar) {
  8734  	                while (base64Chars.length % 4) {
  8735  	                    base64Chars.push(paddingChar);
  8736  	                }
  8737  	            }
  8738  
  8739  	            return base64Chars.join('');
  8740  	        },
  8741  
  8742  	        /**
  8743  	         * Converts a Base64 string to a word array.
  8744  	         *
  8745  	         * @param {string} base64Str The Base64 string.
  8746  	         *
  8747  	         * @return {WordArray} The word array.
  8748  	         *
  8749  	         * @static
  8750  	         *
  8751  	         * @example
  8752  	         *
  8753  	         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);
  8754  	         */
  8755  	        parse: function (base64Str) {
  8756  	            // Shortcuts
  8757  	            var base64StrLength = base64Str.length;
  8758  	            var map = this._map;
  8759  	            var reverseMap = this._reverseMap;
  8760  
  8761  	            if (!reverseMap) {
  8762  	                    reverseMap = this._reverseMap = [];
  8763  	                    for (var j = 0; j < map.length; j++) {
  8764  	                        reverseMap[map.charCodeAt(j)] = j;
  8765  	                    }
  8766  	            }
  8767  
  8768  	            // Ignore padding
  8769  	            var paddingChar = map.charAt(64);
  8770  	            if (paddingChar) {
  8771  	                var paddingIndex = base64Str.indexOf(paddingChar);
  8772  	                if (paddingIndex !== -1) {
  8773  	                    base64StrLength = paddingIndex;
  8774  	                }
  8775  	            }
  8776  
  8777  	            // Convert
  8778  	            return parseLoop(base64Str, base64StrLength, reverseMap);
  8779  
  8780  	        },
  8781  
  8782  	        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  8783  	    };
  8784  
  8785  	    function parseLoop(base64Str, base64StrLength, reverseMap) {
  8786  	      var words = [];
  8787  	      var nBytes = 0;
  8788  	      for (var i = 0; i < base64StrLength; i++) {
  8789  	          if (i % 4) {
  8790  	              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
  8791  	              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
  8792  	              words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);
  8793  	              nBytes++;
  8794  	          }
  8795  	      }
  8796  	      return WordArray.create(words, nBytes);
  8797  	    }
  8798  	}());
  8799  
  8800  
  8801  	return CryptoJS.enc.Base64;
  8802  
  8803  }));
  8804  },{"./core":53}],55:[function(require,module,exports){
  8805  ;(function (root, factory) {
  8806  	if (typeof exports === "object") {
  8807  		// CommonJS
  8808  		module.exports = exports = factory(require("./core"));
  8809  	}
  8810  	else if (typeof define === "function" && define.amd) {
  8811  		// AMD
  8812  		define(["./core"], factory);
  8813  	}
  8814  	else {
  8815  		// Global (browser)
  8816  		factory(root.CryptoJS);
  8817  	}
  8818  }(this, function (CryptoJS) {
  8819  
  8820  	(function () {
  8821  	    // Shortcuts
  8822  	    var C = CryptoJS;
  8823  	    var C_lib = C.lib;
  8824  	    var WordArray = C_lib.WordArray;
  8825  	    var C_enc = C.enc;
  8826  
  8827  	    /**
  8828  	     * UTF-16 BE encoding strategy.
  8829  	     */
  8830  	    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
  8831  	        /**
  8832  	         * Converts a word array to a UTF-16 BE string.
  8833  	         *
  8834  	         * @param {WordArray} wordArray The word array.
  8835  	         *
  8836  	         * @return {string} The UTF-16 BE string.
  8837  	         *
  8838  	         * @static
  8839  	         *
  8840  	         * @example
  8841  	         *
  8842  	         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
  8843  	         */
  8844  	        stringify: function (wordArray) {
  8845  	            // Shortcuts
  8846  	            var words = wordArray.words;
  8847  	            var sigBytes = wordArray.sigBytes;
  8848  
  8849  	            // Convert
  8850  	            var utf16Chars = [];
  8851  	            for (var i = 0; i < sigBytes; i += 2) {
  8852  	                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
  8853  	                utf16Chars.push(String.fromCharCode(codePoint));
  8854  	            }
  8855  
  8856  	            return utf16Chars.join('');
  8857  	        },
  8858  
  8859  	        /**
  8860  	         * Converts a UTF-16 BE string to a word array.
  8861  	         *
  8862  	         * @param {string} utf16Str The UTF-16 BE string.
  8863  	         *
  8864  	         * @return {WordArray} The word array.
  8865  	         *
  8866  	         * @static
  8867  	         *
  8868  	         * @example
  8869  	         *
  8870  	         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
  8871  	         */
  8872  	        parse: function (utf16Str) {
  8873  	            // Shortcut
  8874  	            var utf16StrLength = utf16Str.length;
  8875  
  8876  	            // Convert
  8877  	            var words = [];
  8878  	            for (var i = 0; i < utf16StrLength; i++) {
  8879  	                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
  8880  	            }
  8881  
  8882  	            return WordArray.create(words, utf16StrLength * 2);
  8883  	        }
  8884  	    };
  8885  
  8886  	    /**
  8887  	     * UTF-16 LE encoding strategy.
  8888  	     */
  8889  	    C_enc.Utf16LE = {
  8890  	        /**
  8891  	         * Converts a word array to a UTF-16 LE string.
  8892  	         *
  8893  	         * @param {WordArray} wordArray The word array.
  8894  	         *
  8895  	         * @return {string} The UTF-16 LE string.
  8896  	         *
  8897  	         * @static
  8898  	         *
  8899  	         * @example
  8900  	         *
  8901  	         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
  8902  	         */
  8903  	        stringify: function (wordArray) {
  8904  	            // Shortcuts
  8905  	            var words = wordArray.words;
  8906  	            var sigBytes = wordArray.sigBytes;
  8907  
  8908  	            // Convert
  8909  	            var utf16Chars = [];
  8910  	            for (var i = 0; i < sigBytes; i += 2) {
  8911  	                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
  8912  	                utf16Chars.push(String.fromCharCode(codePoint));
  8913  	            }
  8914  
  8915  	            return utf16Chars.join('');
  8916  	        },
  8917  
  8918  	        /**
  8919  	         * Converts a UTF-16 LE string to a word array.
  8920  	         *
  8921  	         * @param {string} utf16Str The UTF-16 LE string.
  8922  	         *
  8923  	         * @return {WordArray} The word array.
  8924  	         *
  8925  	         * @static
  8926  	         *
  8927  	         * @example
  8928  	         *
  8929  	         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
  8930  	         */
  8931  	        parse: function (utf16Str) {
  8932  	            // Shortcut
  8933  	            var utf16StrLength = utf16Str.length;
  8934  
  8935  	            // Convert
  8936  	            var words = [];
  8937  	            for (var i = 0; i < utf16StrLength; i++) {
  8938  	                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
  8939  	            }
  8940  
  8941  	            return WordArray.create(words, utf16StrLength * 2);
  8942  	        }
  8943  	    };
  8944  
  8945  	    function swapEndian(word) {
  8946  	        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
  8947  	    }
  8948  	}());
  8949  
  8950  
  8951  	return CryptoJS.enc.Utf16;
  8952  
  8953  }));
  8954  },{"./core":53}],56:[function(require,module,exports){
  8955  ;(function (root, factory, undef) {
  8956  	if (typeof exports === "object") {
  8957  		// CommonJS
  8958  		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
  8959  	}
  8960  	else if (typeof define === "function" && define.amd) {
  8961  		// AMD
  8962  		define(["./core", "./sha1", "./hmac"], factory);
  8963  	}
  8964  	else {
  8965  		// Global (browser)
  8966  		factory(root.CryptoJS);
  8967  	}
  8968  }(this, function (CryptoJS) {
  8969  
  8970  	(function () {
  8971  	    // Shortcuts
  8972  	    var C = CryptoJS;
  8973  	    var C_lib = C.lib;
  8974  	    var Base = C_lib.Base;
  8975  	    var WordArray = C_lib.WordArray;
  8976  	    var C_algo = C.algo;
  8977  	    var MD5 = C_algo.MD5;
  8978  
  8979  	    /**
  8980  	     * This key derivation function is meant to conform with EVP_BytesToKey.
  8981  	     * www.openssl.org/docs/crypto/EVP_BytesToKey.html
  8982  	     */
  8983  	    var EvpKDF = C_algo.EvpKDF = Base.extend({
  8984  	        /**
  8985  	         * Configuration options.
  8986  	         *
  8987  	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
  8988  	         * @property {Hasher} hasher The hash algorithm to use. Default: MD5
  8989  	         * @property {number} iterations The number of iterations to perform. Default: 1
  8990  	         */
  8991  	        cfg: Base.extend({
  8992  	            keySize: 128/32,
  8993  	            hasher: MD5,
  8994  	            iterations: 1
  8995  	        }),
  8996  
  8997  	        /**
  8998  	         * Initializes a newly created key derivation function.
  8999  	         *
  9000  	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
  9001  	         *
  9002  	         * @example
  9003  	         *
  9004  	         *     var kdf = CryptoJS.algo.EvpKDF.create();
  9005  	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
  9006  	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
  9007  	         */
  9008  	        init: function (cfg) {
  9009  	            this.cfg = this.cfg.extend(cfg);
  9010  	        },
  9011  
  9012  	        /**
  9013  	         * Derives a key from a password.
  9014  	         *
  9015  	         * @param {WordArray|string} password The password.
  9016  	         * @param {WordArray|string} salt A salt.
  9017  	         *
  9018  	         * @return {WordArray} The derived key.
  9019  	         *
  9020  	         * @example
  9021  	         *
  9022  	         *     var key = kdf.compute(password, salt);
  9023  	         */
  9024  	        compute: function (password, salt) {
  9025  	            // Shortcut
  9026  	            var cfg = this.cfg;
  9027  
  9028  	            // Init hasher
  9029  	            var hasher = cfg.hasher.create();
  9030  
  9031  	            // Initial values
  9032  	            var derivedKey = WordArray.create();
  9033  
  9034  	            // Shortcuts
  9035  	            var derivedKeyWords = derivedKey.words;
  9036  	            var keySize = cfg.keySize;
  9037  	            var iterations = cfg.iterations;
  9038  
  9039  	            // Generate key
  9040  	            while (derivedKeyWords.length < keySize) {
  9041  	                if (block) {
  9042  	                    hasher.update(block);
  9043  	                }
  9044  	                var block = hasher.update(password).finalize(salt);
  9045  	                hasher.reset();
  9046  
  9047  	                // Iterations
  9048  	                for (var i = 1; i < iterations; i++) {
  9049  	                    block = hasher.finalize(block);
  9050  	                    hasher.reset();
  9051  	                }
  9052  
  9053  	                derivedKey.concat(block);
  9054  	            }
  9055  	            derivedKey.sigBytes = keySize * 4;
  9056  
  9057  	            return derivedKey;
  9058  	        }
  9059  	    });
  9060  
  9061  	    /**
  9062  	     * Derives a key from a password.
  9063  	     *
  9064  	     * @param {WordArray|string} password The password.
  9065  	     * @param {WordArray|string} salt A salt.
  9066  	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
  9067  	     *
  9068  	     * @return {WordArray} The derived key.
  9069  	     *
  9070  	     * @static
  9071  	     *
  9072  	     * @example
  9073  	     *
  9074  	     *     var key = CryptoJS.EvpKDF(password, salt);
  9075  	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
  9076  	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
  9077  	     */
  9078  	    C.EvpKDF = function (password, salt, cfg) {
  9079  	        return EvpKDF.create(cfg).compute(password, salt);
  9080  	    };
  9081  	}());
  9082  
  9083  
  9084  	return CryptoJS.EvpKDF;
  9085  
  9086  }));
  9087  },{"./core":53,"./hmac":58,"./sha1":77}],57:[function(require,module,exports){
  9088  ;(function (root, factory, undef) {
  9089  	if (typeof exports === "object") {
  9090  		// CommonJS
  9091  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9092  	}
  9093  	else if (typeof define === "function" && define.amd) {
  9094  		// AMD
  9095  		define(["./core", "./cipher-core"], factory);
  9096  	}
  9097  	else {
  9098  		// Global (browser)
  9099  		factory(root.CryptoJS);
  9100  	}
  9101  }(this, function (CryptoJS) {
  9102  
  9103  	(function (undefined) {
  9104  	    // Shortcuts
  9105  	    var C = CryptoJS;
  9106  	    var C_lib = C.lib;
  9107  	    var CipherParams = C_lib.CipherParams;
  9108  	    var C_enc = C.enc;
  9109  	    var Hex = C_enc.Hex;
  9110  	    var C_format = C.format;
  9111  
  9112  	    var HexFormatter = C_format.Hex = {
  9113  	        /**
  9114  	         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
  9115  	         *
  9116  	         * @param {CipherParams} cipherParams The cipher params object.
  9117  	         *
  9118  	         * @return {string} The hexadecimally encoded string.
  9119  	         *
  9120  	         * @static
  9121  	         *
  9122  	         * @example
  9123  	         *
  9124  	         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);
  9125  	         */
  9126  	        stringify: function (cipherParams) {
  9127  	            return cipherParams.ciphertext.toString(Hex);
  9128  	        },
  9129  
  9130  	        /**
  9131  	         * Converts a hexadecimally encoded ciphertext string to a cipher params object.
  9132  	         *
  9133  	         * @param {string} input The hexadecimally encoded string.
  9134  	         *
  9135  	         * @return {CipherParams} The cipher params object.
  9136  	         *
  9137  	         * @static
  9138  	         *
  9139  	         * @example
  9140  	         *
  9141  	         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);
  9142  	         */
  9143  	        parse: function (input) {
  9144  	            var ciphertext = Hex.parse(input);
  9145  	            return CipherParams.create({ ciphertext: ciphertext });
  9146  	        }
  9147  	    };
  9148  	}());
  9149  
  9150  
  9151  	return CryptoJS.format.Hex;
  9152  
  9153  }));
  9154  },{"./cipher-core":52,"./core":53}],58:[function(require,module,exports){
  9155  ;(function (root, factory) {
  9156  	if (typeof exports === "object") {
  9157  		// CommonJS
  9158  		module.exports = exports = factory(require("./core"));
  9159  	}
  9160  	else if (typeof define === "function" && define.amd) {
  9161  		// AMD
  9162  		define(["./core"], factory);
  9163  	}
  9164  	else {
  9165  		// Global (browser)
  9166  		factory(root.CryptoJS);
  9167  	}
  9168  }(this, function (CryptoJS) {
  9169  
  9170  	(function () {
  9171  	    // Shortcuts
  9172  	    var C = CryptoJS;
  9173  	    var C_lib = C.lib;
  9174  	    var Base = C_lib.Base;
  9175  	    var C_enc = C.enc;
  9176  	    var Utf8 = C_enc.Utf8;
  9177  	    var C_algo = C.algo;
  9178  
  9179  	    /**
  9180  	     * HMAC algorithm.
  9181  	     */
  9182  	    var HMAC = C_algo.HMAC = Base.extend({
  9183  	        /**
  9184  	         * Initializes a newly created HMAC.
  9185  	         *
  9186  	         * @param {Hasher} hasher The hash algorithm to use.
  9187  	         * @param {WordArray|string} key The secret key.
  9188  	         *
  9189  	         * @example
  9190  	         *
  9191  	         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
  9192  	         */
  9193  	        init: function (hasher, key) {
  9194  	            // Init hasher
  9195  	            hasher = this._hasher = new hasher.init();
  9196  
  9197  	            // Convert string to WordArray, else assume WordArray already
  9198  	            if (typeof key == 'string') {
  9199  	                key = Utf8.parse(key);
  9200  	            }
  9201  
  9202  	            // Shortcuts
  9203  	            var hasherBlockSize = hasher.blockSize;
  9204  	            var hasherBlockSizeBytes = hasherBlockSize * 4;
  9205  
  9206  	            // Allow arbitrary length keys
  9207  	            if (key.sigBytes > hasherBlockSizeBytes) {
  9208  	                key = hasher.finalize(key);
  9209  	            }
  9210  
  9211  	            // Clamp excess bits
  9212  	            key.clamp();
  9213  
  9214  	            // Clone key for inner and outer pads
  9215  	            var oKey = this._oKey = key.clone();
  9216  	            var iKey = this._iKey = key.clone();
  9217  
  9218  	            // Shortcuts
  9219  	            var oKeyWords = oKey.words;
  9220  	            var iKeyWords = iKey.words;
  9221  
  9222  	            // XOR keys with pad constants
  9223  	            for (var i = 0; i < hasherBlockSize; i++) {
  9224  	                oKeyWords[i] ^= 0x5c5c5c5c;
  9225  	                iKeyWords[i] ^= 0x36363636;
  9226  	            }
  9227  	            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
  9228  
  9229  	            // Set initial values
  9230  	            this.reset();
  9231  	        },
  9232  
  9233  	        /**
  9234  	         * Resets this HMAC to its initial state.
  9235  	         *
  9236  	         * @example
  9237  	         *
  9238  	         *     hmacHasher.reset();
  9239  	         */
  9240  	        reset: function () {
  9241  	            // Shortcut
  9242  	            var hasher = this._hasher;
  9243  
  9244  	            // Reset
  9245  	            hasher.reset();
  9246  	            hasher.update(this._iKey);
  9247  	        },
  9248  
  9249  	        /**
  9250  	         * Updates this HMAC with a message.
  9251  	         *
  9252  	         * @param {WordArray|string} messageUpdate The message to append.
  9253  	         *
  9254  	         * @return {HMAC} This HMAC instance.
  9255  	         *
  9256  	         * @example
  9257  	         *
  9258  	         *     hmacHasher.update('message');
  9259  	         *     hmacHasher.update(wordArray);
  9260  	         */
  9261  	        update: function (messageUpdate) {
  9262  	            this._hasher.update(messageUpdate);
  9263  
  9264  	            // Chainable
  9265  	            return this;
  9266  	        },
  9267  
  9268  	        /**
  9269  	         * Finalizes the HMAC computation.
  9270  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  9271  	         *
  9272  	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
  9273  	         *
  9274  	         * @return {WordArray} The HMAC.
  9275  	         *
  9276  	         * @example
  9277  	         *
  9278  	         *     var hmac = hmacHasher.finalize();
  9279  	         *     var hmac = hmacHasher.finalize('message');
  9280  	         *     var hmac = hmacHasher.finalize(wordArray);
  9281  	         */
  9282  	        finalize: function (messageUpdate) {
  9283  	            // Shortcut
  9284  	            var hasher = this._hasher;
  9285  
  9286  	            // Compute HMAC
  9287  	            var innerHash = hasher.finalize(messageUpdate);
  9288  	            hasher.reset();
  9289  	            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
  9290  
  9291  	            return hmac;
  9292  	        }
  9293  	    });
  9294  	}());
  9295  
  9296  
  9297  }));
  9298  },{"./core":53}],59:[function(require,module,exports){
  9299  ;(function (root, factory, undef) {
  9300  	if (typeof exports === "object") {
  9301  		// CommonJS
  9302  		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy"));
  9303  	}
  9304  	else if (typeof define === "function" && define.amd) {
  9305  		// AMD
  9306  		define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy"], factory);
  9307  	}
  9308  	else {
  9309  		// Global (browser)
  9310  		root.CryptoJS = factory(root.CryptoJS);
  9311  	}
  9312  }(this, function (CryptoJS) {
  9313  
  9314  	return CryptoJS;
  9315  
  9316  }));
  9317  },{"./aes":51,"./cipher-core":52,"./core":53,"./enc-base64":54,"./enc-utf16":55,"./evpkdf":56,"./format-hex":57,"./hmac":58,"./lib-typedarrays":60,"./md5":61,"./mode-cfb":62,"./mode-ctr":64,"./mode-ctr-gladman":63,"./mode-ecb":65,"./mode-ofb":66,"./pad-ansix923":67,"./pad-iso10126":68,"./pad-iso97971":69,"./pad-nopadding":70,"./pad-zeropadding":71,"./pbkdf2":72,"./rabbit":74,"./rabbit-legacy":73,"./rc4":75,"./ripemd160":76,"./sha1":77,"./sha224":78,"./sha256":79,"./sha3":80,"./sha384":81,"./sha512":82,"./tripledes":83,"./x64-core":84}],60:[function(require,module,exports){
  9318  ;(function (root, factory) {
  9319  	if (typeof exports === "object") {
  9320  		// CommonJS
  9321  		module.exports = exports = factory(require("./core"));
  9322  	}
  9323  	else if (typeof define === "function" && define.amd) {
  9324  		// AMD
  9325  		define(["./core"], factory);
  9326  	}
  9327  	else {
  9328  		// Global (browser)
  9329  		factory(root.CryptoJS);
  9330  	}
  9331  }(this, function (CryptoJS) {
  9332  
  9333  	(function () {
  9334  	    // Check if typed arrays are supported
  9335  	    if (typeof ArrayBuffer != 'function') {
  9336  	        return;
  9337  	    }
  9338  
  9339  	    // Shortcuts
  9340  	    var C = CryptoJS;
  9341  	    var C_lib = C.lib;
  9342  	    var WordArray = C_lib.WordArray;
  9343  
  9344  	    // Reference original init
  9345  	    var superInit = WordArray.init;
  9346  
  9347  	    // Augment WordArray.init to handle typed arrays
  9348  	    var subInit = WordArray.init = function (typedArray) {
  9349  	        // Convert buffers to uint8
  9350  	        if (typedArray instanceof ArrayBuffer) {
  9351  	            typedArray = new Uint8Array(typedArray);
  9352  	        }
  9353  
  9354  	        // Convert other array views to uint8
  9355  	        if (
  9356  	            typedArray instanceof Int8Array ||
  9357  	            (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
  9358  	            typedArray instanceof Int16Array ||
  9359  	            typedArray instanceof Uint16Array ||
  9360  	            typedArray instanceof Int32Array ||
  9361  	            typedArray instanceof Uint32Array ||
  9362  	            typedArray instanceof Float32Array ||
  9363  	            typedArray instanceof Float64Array
  9364  	        ) {
  9365  	            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
  9366  	        }
  9367  
  9368  	        // Handle Uint8Array
  9369  	        if (typedArray instanceof Uint8Array) {
  9370  	            // Shortcut
  9371  	            var typedArrayByteLength = typedArray.byteLength;
  9372  
  9373  	            // Extract bytes
  9374  	            var words = [];
  9375  	            for (var i = 0; i < typedArrayByteLength; i++) {
  9376  	                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
  9377  	            }
  9378  
  9379  	            // Initialize this word array
  9380  	            superInit.call(this, words, typedArrayByteLength);
  9381  	        } else {
  9382  	            // Else call normal init
  9383  	            superInit.apply(this, arguments);
  9384  	        }
  9385  	    };
  9386  
  9387  	    subInit.prototype = WordArray;
  9388  	}());
  9389  
  9390  
  9391  	return CryptoJS.lib.WordArray;
  9392  
  9393  }));
  9394  },{"./core":53}],61:[function(require,module,exports){
  9395  ;(function (root, factory) {
  9396  	if (typeof exports === "object") {
  9397  		// CommonJS
  9398  		module.exports = exports = factory(require("./core"));
  9399  	}
  9400  	else if (typeof define === "function" && define.amd) {
  9401  		// AMD
  9402  		define(["./core"], factory);
  9403  	}
  9404  	else {
  9405  		// Global (browser)
  9406  		factory(root.CryptoJS);
  9407  	}
  9408  }(this, function (CryptoJS) {
  9409  
  9410  	(function (Math) {
  9411  	    // Shortcuts
  9412  	    var C = CryptoJS;
  9413  	    var C_lib = C.lib;
  9414  	    var WordArray = C_lib.WordArray;
  9415  	    var Hasher = C_lib.Hasher;
  9416  	    var C_algo = C.algo;
  9417  
  9418  	    // Constants table
  9419  	    var T = [];
  9420  
  9421  	    // Compute constants
  9422  	    (function () {
  9423  	        for (var i = 0; i < 64; i++) {
  9424  	            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
  9425  	        }
  9426  	    }());
  9427  
  9428  	    /**
  9429  	     * MD5 hash algorithm.
  9430  	     */
  9431  	    var MD5 = C_algo.MD5 = Hasher.extend({
  9432  	        _doReset: function () {
  9433  	            this._hash = new WordArray.init([
  9434  	                0x67452301, 0xefcdab89,
  9435  	                0x98badcfe, 0x10325476
  9436  	            ]);
  9437  	        },
  9438  
  9439  	        _doProcessBlock: function (M, offset) {
  9440  	            // Swap endian
  9441  	            for (var i = 0; i < 16; i++) {
  9442  	                // Shortcuts
  9443  	                var offset_i = offset + i;
  9444  	                var M_offset_i = M[offset_i];
  9445  
  9446  	                M[offset_i] = (
  9447  	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
  9448  	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
  9449  	                );
  9450  	            }
  9451  
  9452  	            // Shortcuts
  9453  	            var H = this._hash.words;
  9454  
  9455  	            var M_offset_0  = M[offset + 0];
  9456  	            var M_offset_1  = M[offset + 1];
  9457  	            var M_offset_2  = M[offset + 2];
  9458  	            var M_offset_3  = M[offset + 3];
  9459  	            var M_offset_4  = M[offset + 4];
  9460  	            var M_offset_5  = M[offset + 5];
  9461  	            var M_offset_6  = M[offset + 6];
  9462  	            var M_offset_7  = M[offset + 7];
  9463  	            var M_offset_8  = M[offset + 8];
  9464  	            var M_offset_9  = M[offset + 9];
  9465  	            var M_offset_10 = M[offset + 10];
  9466  	            var M_offset_11 = M[offset + 11];
  9467  	            var M_offset_12 = M[offset + 12];
  9468  	            var M_offset_13 = M[offset + 13];
  9469  	            var M_offset_14 = M[offset + 14];
  9470  	            var M_offset_15 = M[offset + 15];
  9471  
  9472  	            // Working varialbes
  9473  	            var a = H[0];
  9474  	            var b = H[1];
  9475  	            var c = H[2];
  9476  	            var d = H[3];
  9477  
  9478  	            // Computation
  9479  	            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);
  9480  	            d = FF(d, a, b, c, M_offset_1,  12, T[1]);
  9481  	            c = FF(c, d, a, b, M_offset_2,  17, T[2]);
  9482  	            b = FF(b, c, d, a, M_offset_3,  22, T[3]);
  9483  	            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);
  9484  	            d = FF(d, a, b, c, M_offset_5,  12, T[5]);
  9485  	            c = FF(c, d, a, b, M_offset_6,  17, T[6]);
  9486  	            b = FF(b, c, d, a, M_offset_7,  22, T[7]);
  9487  	            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);
  9488  	            d = FF(d, a, b, c, M_offset_9,  12, T[9]);
  9489  	            c = FF(c, d, a, b, M_offset_10, 17, T[10]);
  9490  	            b = FF(b, c, d, a, M_offset_11, 22, T[11]);
  9491  	            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);
  9492  	            d = FF(d, a, b, c, M_offset_13, 12, T[13]);
  9493  	            c = FF(c, d, a, b, M_offset_14, 17, T[14]);
  9494  	            b = FF(b, c, d, a, M_offset_15, 22, T[15]);
  9495  
  9496  	            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);
  9497  	            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);
  9498  	            c = GG(c, d, a, b, M_offset_11, 14, T[18]);
  9499  	            b = GG(b, c, d, a, M_offset_0,  20, T[19]);
  9500  	            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);
  9501  	            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);
  9502  	            c = GG(c, d, a, b, M_offset_15, 14, T[22]);
  9503  	            b = GG(b, c, d, a, M_offset_4,  20, T[23]);
  9504  	            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);
  9505  	            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);
  9506  	            c = GG(c, d, a, b, M_offset_3,  14, T[26]);
  9507  	            b = GG(b, c, d, a, M_offset_8,  20, T[27]);
  9508  	            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);
  9509  	            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);
  9510  	            c = GG(c, d, a, b, M_offset_7,  14, T[30]);
  9511  	            b = GG(b, c, d, a, M_offset_12, 20, T[31]);
  9512  
  9513  	            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);
  9514  	            d = HH(d, a, b, c, M_offset_8,  11, T[33]);
  9515  	            c = HH(c, d, a, b, M_offset_11, 16, T[34]);
  9516  	            b = HH(b, c, d, a, M_offset_14, 23, T[35]);
  9517  	            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);
  9518  	            d = HH(d, a, b, c, M_offset_4,  11, T[37]);
  9519  	            c = HH(c, d, a, b, M_offset_7,  16, T[38]);
  9520  	            b = HH(b, c, d, a, M_offset_10, 23, T[39]);
  9521  	            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);
  9522  	            d = HH(d, a, b, c, M_offset_0,  11, T[41]);
  9523  	            c = HH(c, d, a, b, M_offset_3,  16, T[42]);
  9524  	            b = HH(b, c, d, a, M_offset_6,  23, T[43]);
  9525  	            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);
  9526  	            d = HH(d, a, b, c, M_offset_12, 11, T[45]);
  9527  	            c = HH(c, d, a, b, M_offset_15, 16, T[46]);
  9528  	            b = HH(b, c, d, a, M_offset_2,  23, T[47]);
  9529  
  9530  	            a = II(a, b, c, d, M_offset_0,  6,  T[48]);
  9531  	            d = II(d, a, b, c, M_offset_7,  10, T[49]);
  9532  	            c = II(c, d, a, b, M_offset_14, 15, T[50]);
  9533  	            b = II(b, c, d, a, M_offset_5,  21, T[51]);
  9534  	            a = II(a, b, c, d, M_offset_12, 6,  T[52]);
  9535  	            d = II(d, a, b, c, M_offset_3,  10, T[53]);
  9536  	            c = II(c, d, a, b, M_offset_10, 15, T[54]);
  9537  	            b = II(b, c, d, a, M_offset_1,  21, T[55]);
  9538  	            a = II(a, b, c, d, M_offset_8,  6,  T[56]);
  9539  	            d = II(d, a, b, c, M_offset_15, 10, T[57]);
  9540  	            c = II(c, d, a, b, M_offset_6,  15, T[58]);
  9541  	            b = II(b, c, d, a, M_offset_13, 21, T[59]);
  9542  	            a = II(a, b, c, d, M_offset_4,  6,  T[60]);
  9543  	            d = II(d, a, b, c, M_offset_11, 10, T[61]);
  9544  	            c = II(c, d, a, b, M_offset_2,  15, T[62]);
  9545  	            b = II(b, c, d, a, M_offset_9,  21, T[63]);
  9546  
  9547  	            // Intermediate hash value
  9548  	            H[0] = (H[0] + a) | 0;
  9549  	            H[1] = (H[1] + b) | 0;
  9550  	            H[2] = (H[2] + c) | 0;
  9551  	            H[3] = (H[3] + d) | 0;
  9552  	        },
  9553  
  9554  	        _doFinalize: function () {
  9555  	            // Shortcuts
  9556  	            var data = this._data;
  9557  	            var dataWords = data.words;
  9558  
  9559  	            var nBitsTotal = this._nDataBytes * 8;
  9560  	            var nBitsLeft = data.sigBytes * 8;
  9561  
  9562  	            // Add padding
  9563  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
  9564  
  9565  	            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
  9566  	            var nBitsTotalL = nBitsTotal;
  9567  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
  9568  	                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
  9569  	                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)
  9570  	            );
  9571  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
  9572  	                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
  9573  	                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)
  9574  	            );
  9575  
  9576  	            data.sigBytes = (dataWords.length + 1) * 4;
  9577  
  9578  	            // Hash final blocks
  9579  	            this._process();
  9580  
  9581  	            // Shortcuts
  9582  	            var hash = this._hash;
  9583  	            var H = hash.words;
  9584  
  9585  	            // Swap endian
  9586  	            for (var i = 0; i < 4; i++) {
  9587  	                // Shortcut
  9588  	                var H_i = H[i];
  9589  
  9590  	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
  9591  	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
  9592  	            }
  9593  
  9594  	            // Return final computed hash
  9595  	            return hash;
  9596  	        },
  9597  
  9598  	        clone: function () {
  9599  	            var clone = Hasher.clone.call(this);
  9600  	            clone._hash = this._hash.clone();
  9601  
  9602  	            return clone;
  9603  	        }
  9604  	    });
  9605  
  9606  	    function FF(a, b, c, d, x, s, t) {
  9607  	        var n = a + ((b & c) | (~b & d)) + x + t;
  9608  	        return ((n << s) | (n >>> (32 - s))) + b;
  9609  	    }
  9610  
  9611  	    function GG(a, b, c, d, x, s, t) {
  9612  	        var n = a + ((b & d) | (c & ~d)) + x + t;
  9613  	        return ((n << s) | (n >>> (32 - s))) + b;
  9614  	    }
  9615  
  9616  	    function HH(a, b, c, d, x, s, t) {
  9617  	        var n = a + (b ^ c ^ d) + x + t;
  9618  	        return ((n << s) | (n >>> (32 - s))) + b;
  9619  	    }
  9620  
  9621  	    function II(a, b, c, d, x, s, t) {
  9622  	        var n = a + (c ^ (b | ~d)) + x + t;
  9623  	        return ((n << s) | (n >>> (32 - s))) + b;
  9624  	    }
  9625  
  9626  	    /**
  9627  	     * Shortcut function to the hasher's object interface.
  9628  	     *
  9629  	     * @param {WordArray|string} message The message to hash.
  9630  	     *
  9631  	     * @return {WordArray} The hash.
  9632  	     *
  9633  	     * @static
  9634  	     *
  9635  	     * @example
  9636  	     *
  9637  	     *     var hash = CryptoJS.MD5('message');
  9638  	     *     var hash = CryptoJS.MD5(wordArray);
  9639  	     */
  9640  	    C.MD5 = Hasher._createHelper(MD5);
  9641  
  9642  	    /**
  9643  	     * Shortcut function to the HMAC's object interface.
  9644  	     *
  9645  	     * @param {WordArray|string} message The message to hash.
  9646  	     * @param {WordArray|string} key The secret key.
  9647  	     *
  9648  	     * @return {WordArray} The HMAC.
  9649  	     *
  9650  	     * @static
  9651  	     *
  9652  	     * @example
  9653  	     *
  9654  	     *     var hmac = CryptoJS.HmacMD5(message, key);
  9655  	     */
  9656  	    C.HmacMD5 = Hasher._createHmacHelper(MD5);
  9657  	}(Math));
  9658  
  9659  
  9660  	return CryptoJS.MD5;
  9661  
  9662  }));
  9663  },{"./core":53}],62:[function(require,module,exports){
  9664  ;(function (root, factory, undef) {
  9665  	if (typeof exports === "object") {
  9666  		// CommonJS
  9667  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9668  	}
  9669  	else if (typeof define === "function" && define.amd) {
  9670  		// AMD
  9671  		define(["./core", "./cipher-core"], factory);
  9672  	}
  9673  	else {
  9674  		// Global (browser)
  9675  		factory(root.CryptoJS);
  9676  	}
  9677  }(this, function (CryptoJS) {
  9678  
  9679  	/**
  9680  	 * Cipher Feedback block mode.
  9681  	 */
  9682  	CryptoJS.mode.CFB = (function () {
  9683  	    var CFB = CryptoJS.lib.BlockCipherMode.extend();
  9684  
  9685  	    CFB.Encryptor = CFB.extend({
  9686  	        processBlock: function (words, offset) {
  9687  	            // Shortcuts
  9688  	            var cipher = this._cipher;
  9689  	            var blockSize = cipher.blockSize;
  9690  
  9691  	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
  9692  
  9693  	            // Remember this block to use with next block
  9694  	            this._prevBlock = words.slice(offset, offset + blockSize);
  9695  	        }
  9696  	    });
  9697  
  9698  	    CFB.Decryptor = CFB.extend({
  9699  	        processBlock: function (words, offset) {
  9700  	            // Shortcuts
  9701  	            var cipher = this._cipher;
  9702  	            var blockSize = cipher.blockSize;
  9703  
  9704  	            // Remember this block to use with next block
  9705  	            var thisBlock = words.slice(offset, offset + blockSize);
  9706  
  9707  	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
  9708  
  9709  	            // This block becomes the previous block
  9710  	            this._prevBlock = thisBlock;
  9711  	        }
  9712  	    });
  9713  
  9714  	    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
  9715  	        // Shortcut
  9716  	        var iv = this._iv;
  9717  
  9718  	        // Generate keystream
  9719  	        if (iv) {
  9720  	            var keystream = iv.slice(0);
  9721  
  9722  	            // Remove IV for subsequent blocks
  9723  	            this._iv = undefined;
  9724  	        } else {
  9725  	            var keystream = this._prevBlock;
  9726  	        }
  9727  	        cipher.encryptBlock(keystream, 0);
  9728  
  9729  	        // Encrypt
  9730  	        for (var i = 0; i < blockSize; i++) {
  9731  	            words[offset + i] ^= keystream[i];
  9732  	        }
  9733  	    }
  9734  
  9735  	    return CFB;
  9736  	}());
  9737  
  9738  
  9739  	return CryptoJS.mode.CFB;
  9740  
  9741  }));
  9742  },{"./cipher-core":52,"./core":53}],63:[function(require,module,exports){
  9743  ;(function (root, factory, undef) {
  9744  	if (typeof exports === "object") {
  9745  		// CommonJS
  9746  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9747  	}
  9748  	else if (typeof define === "function" && define.amd) {
  9749  		// AMD
  9750  		define(["./core", "./cipher-core"], factory);
  9751  	}
  9752  	else {
  9753  		// Global (browser)
  9754  		factory(root.CryptoJS);
  9755  	}
  9756  }(this, function (CryptoJS) {
  9757  
  9758  	/** @preserve
  9759  	 * Counter block mode compatible with  Dr Brian Gladman fileenc.c
  9760  	 * derived from CryptoJS.mode.CTR
  9761  	 * Jan Hruby jhruby.web@gmail.com
  9762  	 */
  9763  	CryptoJS.mode.CTRGladman = (function () {
  9764  	    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
  9765  
  9766  		function incWord(word)
  9767  		{
  9768  			if (((word >> 24) & 0xff) === 0xff) { //overflow
  9769  			var b1 = (word >> 16)&0xff;
  9770  			var b2 = (word >> 8)&0xff;
  9771  			var b3 = word & 0xff;
  9772  
  9773  			if (b1 === 0xff) // overflow b1
  9774  			{
  9775  			b1 = 0;
  9776  			if (b2 === 0xff)
  9777  			{
  9778  				b2 = 0;
  9779  				if (b3 === 0xff)
  9780  				{
  9781  					b3 = 0;
  9782  				}
  9783  				else
  9784  				{
  9785  					++b3;
  9786  				}
  9787  			}
  9788  			else
  9789  			{
  9790  				++b2;
  9791  			}
  9792  			}
  9793  			else
  9794  			{
  9795  			++b1;
  9796  			}
  9797  
  9798  			word = 0;
  9799  			word += (b1 << 16);
  9800  			word += (b2 << 8);
  9801  			word += b3;
  9802  			}
  9803  			else
  9804  			{
  9805  			word += (0x01 << 24);
  9806  			}
  9807  			return word;
  9808  		}
  9809  
  9810  		function incCounter(counter)
  9811  		{
  9812  			if ((counter[0] = incWord(counter[0])) === 0)
  9813  			{
  9814  				// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8
  9815  				counter[1] = incWord(counter[1]);
  9816  			}
  9817  			return counter;
  9818  		}
  9819  
  9820  	    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
  9821  	        processBlock: function (words, offset) {
  9822  	            // Shortcuts
  9823  	            var cipher = this._cipher
  9824  	            var blockSize = cipher.blockSize;
  9825  	            var iv = this._iv;
  9826  	            var counter = this._counter;
  9827  
  9828  	            // Generate keystream
  9829  	            if (iv) {
  9830  	                counter = this._counter = iv.slice(0);
  9831  
  9832  	                // Remove IV for subsequent blocks
  9833  	                this._iv = undefined;
  9834  	            }
  9835  
  9836  				incCounter(counter);
  9837  
  9838  				var keystream = counter.slice(0);
  9839  	            cipher.encryptBlock(keystream, 0);
  9840  
  9841  	            // Encrypt
  9842  	            for (var i = 0; i < blockSize; i++) {
  9843  	                words[offset + i] ^= keystream[i];
  9844  	            }
  9845  	        }
  9846  	    });
  9847  
  9848  	    CTRGladman.Decryptor = Encryptor;
  9849  
  9850  	    return CTRGladman;
  9851  	}());
  9852  
  9853  
  9854  
  9855  
  9856  	return CryptoJS.mode.CTRGladman;
  9857  
  9858  }));
  9859  },{"./cipher-core":52,"./core":53}],64:[function(require,module,exports){
  9860  ;(function (root, factory, undef) {
  9861  	if (typeof exports === "object") {
  9862  		// CommonJS
  9863  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9864  	}
  9865  	else if (typeof define === "function" && define.amd) {
  9866  		// AMD
  9867  		define(["./core", "./cipher-core"], factory);
  9868  	}
  9869  	else {
  9870  		// Global (browser)
  9871  		factory(root.CryptoJS);
  9872  	}
  9873  }(this, function (CryptoJS) {
  9874  
  9875  	/**
  9876  	 * Counter block mode.
  9877  	 */
  9878  	CryptoJS.mode.CTR = (function () {
  9879  	    var CTR = CryptoJS.lib.BlockCipherMode.extend();
  9880  
  9881  	    var Encryptor = CTR.Encryptor = CTR.extend({
  9882  	        processBlock: function (words, offset) {
  9883  	            // Shortcuts
  9884  	            var cipher = this._cipher
  9885  	            var blockSize = cipher.blockSize;
  9886  	            var iv = this._iv;
  9887  	            var counter = this._counter;
  9888  
  9889  	            // Generate keystream
  9890  	            if (iv) {
  9891  	                counter = this._counter = iv.slice(0);
  9892  
  9893  	                // Remove IV for subsequent blocks
  9894  	                this._iv = undefined;
  9895  	            }
  9896  	            var keystream = counter.slice(0);
  9897  	            cipher.encryptBlock(keystream, 0);
  9898  
  9899  	            // Increment counter
  9900  	            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
  9901  
  9902  	            // Encrypt
  9903  	            for (var i = 0; i < blockSize; i++) {
  9904  	                words[offset + i] ^= keystream[i];
  9905  	            }
  9906  	        }
  9907  	    });
  9908  
  9909  	    CTR.Decryptor = Encryptor;
  9910  
  9911  	    return CTR;
  9912  	}());
  9913  
  9914  
  9915  	return CryptoJS.mode.CTR;
  9916  
  9917  }));
  9918  },{"./cipher-core":52,"./core":53}],65:[function(require,module,exports){
  9919  ;(function (root, factory, undef) {
  9920  	if (typeof exports === "object") {
  9921  		// CommonJS
  9922  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9923  	}
  9924  	else if (typeof define === "function" && define.amd) {
  9925  		// AMD
  9926  		define(["./core", "./cipher-core"], factory);
  9927  	}
  9928  	else {
  9929  		// Global (browser)
  9930  		factory(root.CryptoJS);
  9931  	}
  9932  }(this, function (CryptoJS) {
  9933  
  9934  	/**
  9935  	 * Electronic Codebook block mode.
  9936  	 */
  9937  	CryptoJS.mode.ECB = (function () {
  9938  	    var ECB = CryptoJS.lib.BlockCipherMode.extend();
  9939  
  9940  	    ECB.Encryptor = ECB.extend({
  9941  	        processBlock: function (words, offset) {
  9942  	            this._cipher.encryptBlock(words, offset);
  9943  	        }
  9944  	    });
  9945  
  9946  	    ECB.Decryptor = ECB.extend({
  9947  	        processBlock: function (words, offset) {
  9948  	            this._cipher.decryptBlock(words, offset);
  9949  	        }
  9950  	    });
  9951  
  9952  	    return ECB;
  9953  	}());
  9954  
  9955  
  9956  	return CryptoJS.mode.ECB;
  9957  
  9958  }));
  9959  },{"./cipher-core":52,"./core":53}],66:[function(require,module,exports){
  9960  ;(function (root, factory, undef) {
  9961  	if (typeof exports === "object") {
  9962  		// CommonJS
  9963  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9964  	}
  9965  	else if (typeof define === "function" && define.amd) {
  9966  		// AMD
  9967  		define(["./core", "./cipher-core"], factory);
  9968  	}
  9969  	else {
  9970  		// Global (browser)
  9971  		factory(root.CryptoJS);
  9972  	}
  9973  }(this, function (CryptoJS) {
  9974  
  9975  	/**
  9976  	 * Output Feedback block mode.
  9977  	 */
  9978  	CryptoJS.mode.OFB = (function () {
  9979  	    var OFB = CryptoJS.lib.BlockCipherMode.extend();
  9980  
  9981  	    var Encryptor = OFB.Encryptor = OFB.extend({
  9982  	        processBlock: function (words, offset) {
  9983  	            // Shortcuts
  9984  	            var cipher = this._cipher
  9985  	            var blockSize = cipher.blockSize;
  9986  	            var iv = this._iv;
  9987  	            var keystream = this._keystream;
  9988  
  9989  	            // Generate keystream
  9990  	            if (iv) {
  9991  	                keystream = this._keystream = iv.slice(0);
  9992  
  9993  	                // Remove IV for subsequent blocks
  9994  	                this._iv = undefined;
  9995  	            }
  9996  	            cipher.encryptBlock(keystream, 0);
  9997  
  9998  	            // Encrypt
  9999  	            for (var i = 0; i < blockSize; i++) {
 10000  	                words[offset + i] ^= keystream[i];
 10001  	            }
 10002  	        }
 10003  	    });
 10004  
 10005  	    OFB.Decryptor = Encryptor;
 10006  
 10007  	    return OFB;
 10008  	}());
 10009  
 10010  
 10011  	return CryptoJS.mode.OFB;
 10012  
 10013  }));
 10014  },{"./cipher-core":52,"./core":53}],67:[function(require,module,exports){
 10015  ;(function (root, factory, undef) {
 10016  	if (typeof exports === "object") {
 10017  		// CommonJS
 10018  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10019  	}
 10020  	else if (typeof define === "function" && define.amd) {
 10021  		// AMD
 10022  		define(["./core", "./cipher-core"], factory);
 10023  	}
 10024  	else {
 10025  		// Global (browser)
 10026  		factory(root.CryptoJS);
 10027  	}
 10028  }(this, function (CryptoJS) {
 10029  
 10030  	/**
 10031  	 * ANSI X.923 padding strategy.
 10032  	 */
 10033  	CryptoJS.pad.AnsiX923 = {
 10034  	    pad: function (data, blockSize) {
 10035  	        // Shortcuts
 10036  	        var dataSigBytes = data.sigBytes;
 10037  	        var blockSizeBytes = blockSize * 4;
 10038  
 10039  	        // Count padding bytes
 10040  	        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
 10041  
 10042  	        // Compute last byte position
 10043  	        var lastBytePos = dataSigBytes + nPaddingBytes - 1;
 10044  
 10045  	        // Pad
 10046  	        data.clamp();
 10047  	        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
 10048  	        data.sigBytes += nPaddingBytes;
 10049  	    },
 10050  
 10051  	    unpad: function (data) {
 10052  	        // Get number of padding bytes from last byte
 10053  	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
 10054  
 10055  	        // Remove padding
 10056  	        data.sigBytes -= nPaddingBytes;
 10057  	    }
 10058  	};
 10059  
 10060  
 10061  	return CryptoJS.pad.Ansix923;
 10062  
 10063  }));
 10064  },{"./cipher-core":52,"./core":53}],68:[function(require,module,exports){
 10065  ;(function (root, factory, undef) {
 10066  	if (typeof exports === "object") {
 10067  		// CommonJS
 10068  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10069  	}
 10070  	else if (typeof define === "function" && define.amd) {
 10071  		// AMD
 10072  		define(["./core", "./cipher-core"], factory);
 10073  	}
 10074  	else {
 10075  		// Global (browser)
 10076  		factory(root.CryptoJS);
 10077  	}
 10078  }(this, function (CryptoJS) {
 10079  
 10080  	/**
 10081  	 * ISO 10126 padding strategy.
 10082  	 */
 10083  	CryptoJS.pad.Iso10126 = {
 10084  	    pad: function (data, blockSize) {
 10085  	        // Shortcut
 10086  	        var blockSizeBytes = blockSize * 4;
 10087  
 10088  	        // Count padding bytes
 10089  	        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
 10090  
 10091  	        // Pad
 10092  	        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
 10093  	             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
 10094  	    },
 10095  
 10096  	    unpad: function (data) {
 10097  	        // Get number of padding bytes from last byte
 10098  	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
 10099  
 10100  	        // Remove padding
 10101  	        data.sigBytes -= nPaddingBytes;
 10102  	    }
 10103  	};
 10104  
 10105  
 10106  	return CryptoJS.pad.Iso10126;
 10107  
 10108  }));
 10109  },{"./cipher-core":52,"./core":53}],69:[function(require,module,exports){
 10110  ;(function (root, factory, undef) {
 10111  	if (typeof exports === "object") {
 10112  		// CommonJS
 10113  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10114  	}
 10115  	else if (typeof define === "function" && define.amd) {
 10116  		// AMD
 10117  		define(["./core", "./cipher-core"], factory);
 10118  	}
 10119  	else {
 10120  		// Global (browser)
 10121  		factory(root.CryptoJS);
 10122  	}
 10123  }(this, function (CryptoJS) {
 10124  
 10125  	/**
 10126  	 * ISO/IEC 9797-1 Padding Method 2.
 10127  	 */
 10128  	CryptoJS.pad.Iso97971 = {
 10129  	    pad: function (data, blockSize) {
 10130  	        // Add 0x80 byte
 10131  	        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
 10132  
 10133  	        // Zero pad the rest
 10134  	        CryptoJS.pad.ZeroPadding.pad(data, blockSize);
 10135  	    },
 10136  
 10137  	    unpad: function (data) {
 10138  	        // Remove zero padding
 10139  	        CryptoJS.pad.ZeroPadding.unpad(data);
 10140  
 10141  	        // Remove one more byte -- the 0x80 byte
 10142  	        data.sigBytes--;
 10143  	    }
 10144  	};
 10145  
 10146  
 10147  	return CryptoJS.pad.Iso97971;
 10148  
 10149  }));
 10150  },{"./cipher-core":52,"./core":53}],70:[function(require,module,exports){
 10151  ;(function (root, factory, undef) {
 10152  	if (typeof exports === "object") {
 10153  		// CommonJS
 10154  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10155  	}
 10156  	else if (typeof define === "function" && define.amd) {
 10157  		// AMD
 10158  		define(["./core", "./cipher-core"], factory);
 10159  	}
 10160  	else {
 10161  		// Global (browser)
 10162  		factory(root.CryptoJS);
 10163  	}
 10164  }(this, function (CryptoJS) {
 10165  
 10166  	/**
 10167  	 * A noop padding strategy.
 10168  	 */
 10169  	CryptoJS.pad.NoPadding = {
 10170  	    pad: function () {
 10171  	    },
 10172  
 10173  	    unpad: function () {
 10174  	    }
 10175  	};
 10176  
 10177  
 10178  	return CryptoJS.pad.NoPadding;
 10179  
 10180  }));
 10181  },{"./cipher-core":52,"./core":53}],71:[function(require,module,exports){
 10182  ;(function (root, factory, undef) {
 10183  	if (typeof exports === "object") {
 10184  		// CommonJS
 10185  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10186  	}
 10187  	else if (typeof define === "function" && define.amd) {
 10188  		// AMD
 10189  		define(["./core", "./cipher-core"], factory);
 10190  	}
 10191  	else {
 10192  		// Global (browser)
 10193  		factory(root.CryptoJS);
 10194  	}
 10195  }(this, function (CryptoJS) {
 10196  
 10197  	/**
 10198  	 * Zero padding strategy.
 10199  	 */
 10200  	CryptoJS.pad.ZeroPadding = {
 10201  	    pad: function (data, blockSize) {
 10202  	        // Shortcut
 10203  	        var blockSizeBytes = blockSize * 4;
 10204  
 10205  	        // Pad
 10206  	        data.clamp();
 10207  	        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
 10208  	    },
 10209  
 10210  	    unpad: function (data) {
 10211  	        // Shortcut
 10212  	        var dataWords = data.words;
 10213  
 10214  	        // Unpad
 10215  	        var i = data.sigBytes - 1;
 10216  	        while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
 10217  	            i--;
 10218  	        }
 10219  	        data.sigBytes = i + 1;
 10220  	    }
 10221  	};
 10222  
 10223  
 10224  	return CryptoJS.pad.ZeroPadding;
 10225  
 10226  }));
 10227  },{"./cipher-core":52,"./core":53}],72:[function(require,module,exports){
 10228  ;(function (root, factory, undef) {
 10229  	if (typeof exports === "object") {
 10230  		// CommonJS
 10231  		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
 10232  	}
 10233  	else if (typeof define === "function" && define.amd) {
 10234  		// AMD
 10235  		define(["./core", "./sha1", "./hmac"], factory);
 10236  	}
 10237  	else {
 10238  		// Global (browser)
 10239  		factory(root.CryptoJS);
 10240  	}
 10241  }(this, function (CryptoJS) {
 10242  
 10243  	(function () {
 10244  	    // Shortcuts
 10245  	    var C = CryptoJS;
 10246  	    var C_lib = C.lib;
 10247  	    var Base = C_lib.Base;
 10248  	    var WordArray = C_lib.WordArray;
 10249  	    var C_algo = C.algo;
 10250  	    var SHA1 = C_algo.SHA1;
 10251  	    var HMAC = C_algo.HMAC;
 10252  
 10253  	    /**
 10254  	     * Password-Based Key Derivation Function 2 algorithm.
 10255  	     */
 10256  	    var PBKDF2 = C_algo.PBKDF2 = Base.extend({
 10257  	        /**
 10258  	         * Configuration options.
 10259  	         *
 10260  	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
 10261  	         * @property {Hasher} hasher The hasher to use. Default: SHA1
 10262  	         * @property {number} iterations The number of iterations to perform. Default: 1
 10263  	         */
 10264  	        cfg: Base.extend({
 10265  	            keySize: 128/32,
 10266  	            hasher: SHA1,
 10267  	            iterations: 1
 10268  	        }),
 10269  
 10270  	        /**
 10271  	         * Initializes a newly created key derivation function.
 10272  	         *
 10273  	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
 10274  	         *
 10275  	         * @example
 10276  	         *
 10277  	         *     var kdf = CryptoJS.algo.PBKDF2.create();
 10278  	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
 10279  	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
 10280  	         */
 10281  	        init: function (cfg) {
 10282  	            this.cfg = this.cfg.extend(cfg);
 10283  	        },
 10284  
 10285  	        /**
 10286  	         * Computes the Password-Based Key Derivation Function 2.
 10287  	         *
 10288  	         * @param {WordArray|string} password The password.
 10289  	         * @param {WordArray|string} salt A salt.
 10290  	         *
 10291  	         * @return {WordArray} The derived key.
 10292  	         *
 10293  	         * @example
 10294  	         *
 10295  	         *     var key = kdf.compute(password, salt);
 10296  	         */
 10297  	        compute: function (password, salt) {
 10298  	            // Shortcut
 10299  	            var cfg = this.cfg;
 10300  
 10301  	            // Init HMAC
 10302  	            var hmac = HMAC.create(cfg.hasher, password);
 10303  
 10304  	            // Initial values
 10305  	            var derivedKey = WordArray.create();
 10306  	            var blockIndex = WordArray.create([0x00000001]);
 10307  
 10308  	            // Shortcuts
 10309  	            var derivedKeyWords = derivedKey.words;
 10310  	            var blockIndexWords = blockIndex.words;
 10311  	            var keySize = cfg.keySize;
 10312  	            var iterations = cfg.iterations;
 10313  
 10314  	            // Generate key
 10315  	            while (derivedKeyWords.length < keySize) {
 10316  	                var block = hmac.update(salt).finalize(blockIndex);
 10317  	                hmac.reset();
 10318  
 10319  	                // Shortcuts
 10320  	                var blockWords = block.words;
 10321  	                var blockWordsLength = blockWords.length;
 10322  
 10323  	                // Iterations
 10324  	                var intermediate = block;
 10325  	                for (var i = 1; i < iterations; i++) {
 10326  	                    intermediate = hmac.finalize(intermediate);
 10327  	                    hmac.reset();
 10328  
 10329  	                    // Shortcut
 10330  	                    var intermediateWords = intermediate.words;
 10331  
 10332  	                    // XOR intermediate with block
 10333  	                    for (var j = 0; j < blockWordsLength; j++) {
 10334  	                        blockWords[j] ^= intermediateWords[j];
 10335  	                    }
 10336  	                }
 10337  
 10338  	                derivedKey.concat(block);
 10339  	                blockIndexWords[0]++;
 10340  	            }
 10341  	            derivedKey.sigBytes = keySize * 4;
 10342  
 10343  	            return derivedKey;
 10344  	        }
 10345  	    });
 10346  
 10347  	    /**
 10348  	     * Computes the Password-Based Key Derivation Function 2.
 10349  	     *
 10350  	     * @param {WordArray|string} password The password.
 10351  	     * @param {WordArray|string} salt A salt.
 10352  	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
 10353  	     *
 10354  	     * @return {WordArray} The derived key.
 10355  	     *
 10356  	     * @static
 10357  	     *
 10358  	     * @example
 10359  	     *
 10360  	     *     var key = CryptoJS.PBKDF2(password, salt);
 10361  	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
 10362  	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
 10363  	     */
 10364  	    C.PBKDF2 = function (password, salt, cfg) {
 10365  	        return PBKDF2.create(cfg).compute(password, salt);
 10366  	    };
 10367  	}());
 10368  
 10369  
 10370  	return CryptoJS.PBKDF2;
 10371  
 10372  }));
 10373  },{"./core":53,"./hmac":58,"./sha1":77}],73:[function(require,module,exports){
 10374  ;(function (root, factory, undef) {
 10375  	if (typeof exports === "object") {
 10376  		// CommonJS
 10377  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10378  	}
 10379  	else if (typeof define === "function" && define.amd) {
 10380  		// AMD
 10381  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10382  	}
 10383  	else {
 10384  		// Global (browser)
 10385  		factory(root.CryptoJS);
 10386  	}
 10387  }(this, function (CryptoJS) {
 10388  
 10389  	(function () {
 10390  	    // Shortcuts
 10391  	    var C = CryptoJS;
 10392  	    var C_lib = C.lib;
 10393  	    var StreamCipher = C_lib.StreamCipher;
 10394  	    var C_algo = C.algo;
 10395  
 10396  	    // Reusable objects
 10397  	    var S  = [];
 10398  	    var C_ = [];
 10399  	    var G  = [];
 10400  
 10401  	    /**
 10402  	     * Rabbit stream cipher algorithm.
 10403  	     *
 10404  	     * This is a legacy version that neglected to convert the key to little-endian.
 10405  	     * This error doesn't affect the cipher's security,
 10406  	     * but it does affect its compatibility with other implementations.
 10407  	     */
 10408  	    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
 10409  	        _doReset: function () {
 10410  	            // Shortcuts
 10411  	            var K = this._key.words;
 10412  	            var iv = this.cfg.iv;
 10413  
 10414  	            // Generate initial state values
 10415  	            var X = this._X = [
 10416  	                K[0], (K[3] << 16) | (K[2] >>> 16),
 10417  	                K[1], (K[0] << 16) | (K[3] >>> 16),
 10418  	                K[2], (K[1] << 16) | (K[0] >>> 16),
 10419  	                K[3], (K[2] << 16) | (K[1] >>> 16)
 10420  	            ];
 10421  
 10422  	            // Generate initial counter values
 10423  	            var C = this._C = [
 10424  	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
 10425  	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
 10426  	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
 10427  	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
 10428  	            ];
 10429  
 10430  	            // Carry bit
 10431  	            this._b = 0;
 10432  
 10433  	            // Iterate the system four times
 10434  	            for (var i = 0; i < 4; i++) {
 10435  	                nextState.call(this);
 10436  	            }
 10437  
 10438  	            // Modify the counters
 10439  	            for (var i = 0; i < 8; i++) {
 10440  	                C[i] ^= X[(i + 4) & 7];
 10441  	            }
 10442  
 10443  	            // IV setup
 10444  	            if (iv) {
 10445  	                // Shortcuts
 10446  	                var IV = iv.words;
 10447  	                var IV_0 = IV[0];
 10448  	                var IV_1 = IV[1];
 10449  
 10450  	                // Generate four subvectors
 10451  	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
 10452  	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
 10453  	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
 10454  	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
 10455  
 10456  	                // Modify counter values
 10457  	                C[0] ^= i0;
 10458  	                C[1] ^= i1;
 10459  	                C[2] ^= i2;
 10460  	                C[3] ^= i3;
 10461  	                C[4] ^= i0;
 10462  	                C[5] ^= i1;
 10463  	                C[6] ^= i2;
 10464  	                C[7] ^= i3;
 10465  
 10466  	                // Iterate the system four times
 10467  	                for (var i = 0; i < 4; i++) {
 10468  	                    nextState.call(this);
 10469  	                }
 10470  	            }
 10471  	        },
 10472  
 10473  	        _doProcessBlock: function (M, offset) {
 10474  	            // Shortcut
 10475  	            var X = this._X;
 10476  
 10477  	            // Iterate the system
 10478  	            nextState.call(this);
 10479  
 10480  	            // Generate four keystream words
 10481  	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
 10482  	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
 10483  	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
 10484  	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
 10485  
 10486  	            for (var i = 0; i < 4; i++) {
 10487  	                // Swap endian
 10488  	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
 10489  	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
 10490  
 10491  	                // Encrypt
 10492  	                M[offset + i] ^= S[i];
 10493  	            }
 10494  	        },
 10495  
 10496  	        blockSize: 128/32,
 10497  
 10498  	        ivSize: 64/32
 10499  	    });
 10500  
 10501  	    function nextState() {
 10502  	        // Shortcuts
 10503  	        var X = this._X;
 10504  	        var C = this._C;
 10505  
 10506  	        // Save old counter values
 10507  	        for (var i = 0; i < 8; i++) {
 10508  	            C_[i] = C[i];
 10509  	        }
 10510  
 10511  	        // Calculate new counter values
 10512  	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
 10513  	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
 10514  	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
 10515  	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
 10516  	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
 10517  	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
 10518  	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
 10519  	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
 10520  	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
 10521  
 10522  	        // Calculate the g-values
 10523  	        for (var i = 0; i < 8; i++) {
 10524  	            var gx = X[i] + C[i];
 10525  
 10526  	            // Construct high and low argument for squaring
 10527  	            var ga = gx & 0xffff;
 10528  	            var gb = gx >>> 16;
 10529  
 10530  	            // Calculate high and low result of squaring
 10531  	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
 10532  	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
 10533  
 10534  	            // High XOR low
 10535  	            G[i] = gh ^ gl;
 10536  	        }
 10537  
 10538  	        // Calculate new state values
 10539  	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
 10540  	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
 10541  	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
 10542  	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
 10543  	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
 10544  	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
 10545  	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
 10546  	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
 10547  	    }
 10548  
 10549  	    /**
 10550  	     * Shortcut functions to the cipher's object interface.
 10551  	     *
 10552  	     * @example
 10553  	     *
 10554  	     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
 10555  	     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
 10556  	     */
 10557  	    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
 10558  	}());
 10559  
 10560  
 10561  	return CryptoJS.RabbitLegacy;
 10562  
 10563  }));
 10564  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],74:[function(require,module,exports){
 10565  ;(function (root, factory, undef) {
 10566  	if (typeof exports === "object") {
 10567  		// CommonJS
 10568  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10569  	}
 10570  	else if (typeof define === "function" && define.amd) {
 10571  		// AMD
 10572  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10573  	}
 10574  	else {
 10575  		// Global (browser)
 10576  		factory(root.CryptoJS);
 10577  	}
 10578  }(this, function (CryptoJS) {
 10579  
 10580  	(function () {
 10581  	    // Shortcuts
 10582  	    var C = CryptoJS;
 10583  	    var C_lib = C.lib;
 10584  	    var StreamCipher = C_lib.StreamCipher;
 10585  	    var C_algo = C.algo;
 10586  
 10587  	    // Reusable objects
 10588  	    var S  = [];
 10589  	    var C_ = [];
 10590  	    var G  = [];
 10591  
 10592  	    /**
 10593  	     * Rabbit stream cipher algorithm
 10594  	     */
 10595  	    var Rabbit = C_algo.Rabbit = StreamCipher.extend({
 10596  	        _doReset: function () {
 10597  	            // Shortcuts
 10598  	            var K = this._key.words;
 10599  	            var iv = this.cfg.iv;
 10600  
 10601  	            // Swap endian
 10602  	            for (var i = 0; i < 4; i++) {
 10603  	                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |
 10604  	                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);
 10605  	            }
 10606  
 10607  	            // Generate initial state values
 10608  	            var X = this._X = [
 10609  	                K[0], (K[3] << 16) | (K[2] >>> 16),
 10610  	                K[1], (K[0] << 16) | (K[3] >>> 16),
 10611  	                K[2], (K[1] << 16) | (K[0] >>> 16),
 10612  	                K[3], (K[2] << 16) | (K[1] >>> 16)
 10613  	            ];
 10614  
 10615  	            // Generate initial counter values
 10616  	            var C = this._C = [
 10617  	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
 10618  	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
 10619  	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
 10620  	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
 10621  	            ];
 10622  
 10623  	            // Carry bit
 10624  	            this._b = 0;
 10625  
 10626  	            // Iterate the system four times
 10627  	            for (var i = 0; i < 4; i++) {
 10628  	                nextState.call(this);
 10629  	            }
 10630  
 10631  	            // Modify the counters
 10632  	            for (var i = 0; i < 8; i++) {
 10633  	                C[i] ^= X[(i + 4) & 7];
 10634  	            }
 10635  
 10636  	            // IV setup
 10637  	            if (iv) {
 10638  	                // Shortcuts
 10639  	                var IV = iv.words;
 10640  	                var IV_0 = IV[0];
 10641  	                var IV_1 = IV[1];
 10642  
 10643  	                // Generate four subvectors
 10644  	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
 10645  	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
 10646  	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
 10647  	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
 10648  
 10649  	                // Modify counter values
 10650  	                C[0] ^= i0;
 10651  	                C[1] ^= i1;
 10652  	                C[2] ^= i2;
 10653  	                C[3] ^= i3;
 10654  	                C[4] ^= i0;
 10655  	                C[5] ^= i1;
 10656  	                C[6] ^= i2;
 10657  	                C[7] ^= i3;
 10658  
 10659  	                // Iterate the system four times
 10660  	                for (var i = 0; i < 4; i++) {
 10661  	                    nextState.call(this);
 10662  	                }
 10663  	            }
 10664  	        },
 10665  
 10666  	        _doProcessBlock: function (M, offset) {
 10667  	            // Shortcut
 10668  	            var X = this._X;
 10669  
 10670  	            // Iterate the system
 10671  	            nextState.call(this);
 10672  
 10673  	            // Generate four keystream words
 10674  	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
 10675  	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
 10676  	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
 10677  	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
 10678  
 10679  	            for (var i = 0; i < 4; i++) {
 10680  	                // Swap endian
 10681  	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
 10682  	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
 10683  
 10684  	                // Encrypt
 10685  	                M[offset + i] ^= S[i];
 10686  	            }
 10687  	        },
 10688  
 10689  	        blockSize: 128/32,
 10690  
 10691  	        ivSize: 64/32
 10692  	    });
 10693  
 10694  	    function nextState() {
 10695  	        // Shortcuts
 10696  	        var X = this._X;
 10697  	        var C = this._C;
 10698  
 10699  	        // Save old counter values
 10700  	        for (var i = 0; i < 8; i++) {
 10701  	            C_[i] = C[i];
 10702  	        }
 10703  
 10704  	        // Calculate new counter values
 10705  	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
 10706  	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
 10707  	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
 10708  	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
 10709  	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
 10710  	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
 10711  	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
 10712  	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
 10713  	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
 10714  
 10715  	        // Calculate the g-values
 10716  	        for (var i = 0; i < 8; i++) {
 10717  	            var gx = X[i] + C[i];
 10718  
 10719  	            // Construct high and low argument for squaring
 10720  	            var ga = gx & 0xffff;
 10721  	            var gb = gx >>> 16;
 10722  
 10723  	            // Calculate high and low result of squaring
 10724  	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
 10725  	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
 10726  
 10727  	            // High XOR low
 10728  	            G[i] = gh ^ gl;
 10729  	        }
 10730  
 10731  	        // Calculate new state values
 10732  	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
 10733  	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
 10734  	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
 10735  	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
 10736  	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
 10737  	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
 10738  	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
 10739  	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
 10740  	    }
 10741  
 10742  	    /**
 10743  	     * Shortcut functions to the cipher's object interface.
 10744  	     *
 10745  	     * @example
 10746  	     *
 10747  	     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
 10748  	     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
 10749  	     */
 10750  	    C.Rabbit = StreamCipher._createHelper(Rabbit);
 10751  	}());
 10752  
 10753  
 10754  	return CryptoJS.Rabbit;
 10755  
 10756  }));
 10757  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],75:[function(require,module,exports){
 10758  ;(function (root, factory, undef) {
 10759  	if (typeof exports === "object") {
 10760  		// CommonJS
 10761  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10762  	}
 10763  	else if (typeof define === "function" && define.amd) {
 10764  		// AMD
 10765  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10766  	}
 10767  	else {
 10768  		// Global (browser)
 10769  		factory(root.CryptoJS);
 10770  	}
 10771  }(this, function (CryptoJS) {
 10772  
 10773  	(function () {
 10774  	    // Shortcuts
 10775  	    var C = CryptoJS;
 10776  	    var C_lib = C.lib;
 10777  	    var StreamCipher = C_lib.StreamCipher;
 10778  	    var C_algo = C.algo;
 10779  
 10780  	    /**
 10781  	     * RC4 stream cipher algorithm.
 10782  	     */
 10783  	    var RC4 = C_algo.RC4 = StreamCipher.extend({
 10784  	        _doReset: function () {
 10785  	            // Shortcuts
 10786  	            var key = this._key;
 10787  	            var keyWords = key.words;
 10788  	            var keySigBytes = key.sigBytes;
 10789  
 10790  	            // Init sbox
 10791  	            var S = this._S = [];
 10792  	            for (var i = 0; i < 256; i++) {
 10793  	                S[i] = i;
 10794  	            }
 10795  
 10796  	            // Key setup
 10797  	            for (var i = 0, j = 0; i < 256; i++) {
 10798  	                var keyByteIndex = i % keySigBytes;
 10799  	                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
 10800  
 10801  	                j = (j + S[i] + keyByte) % 256;
 10802  
 10803  	                // Swap
 10804  	                var t = S[i];
 10805  	                S[i] = S[j];
 10806  	                S[j] = t;
 10807  	            }
 10808  
 10809  	            // Counters
 10810  	            this._i = this._j = 0;
 10811  	        },
 10812  
 10813  	        _doProcessBlock: function (M, offset) {
 10814  	            M[offset] ^= generateKeystreamWord.call(this);
 10815  	        },
 10816  
 10817  	        keySize: 256/32,
 10818  
 10819  	        ivSize: 0
 10820  	    });
 10821  
 10822  	    function generateKeystreamWord() {
 10823  	        // Shortcuts
 10824  	        var S = this._S;
 10825  	        var i = this._i;
 10826  	        var j = this._j;
 10827  
 10828  	        // Generate keystream word
 10829  	        var keystreamWord = 0;
 10830  	        for (var n = 0; n < 4; n++) {
 10831  	            i = (i + 1) % 256;
 10832  	            j = (j + S[i]) % 256;
 10833  
 10834  	            // Swap
 10835  	            var t = S[i];
 10836  	            S[i] = S[j];
 10837  	            S[j] = t;
 10838  
 10839  	            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
 10840  	        }
 10841  
 10842  	        // Update counters
 10843  	        this._i = i;
 10844  	        this._j = j;
 10845  
 10846  	        return keystreamWord;
 10847  	    }
 10848  
 10849  	    /**
 10850  	     * Shortcut functions to the cipher's object interface.
 10851  	     *
 10852  	     * @example
 10853  	     *
 10854  	     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
 10855  	     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
 10856  	     */
 10857  	    C.RC4 = StreamCipher._createHelper(RC4);
 10858  
 10859  	    /**
 10860  	     * Modified RC4 stream cipher algorithm.
 10861  	     */
 10862  	    var RC4Drop = C_algo.RC4Drop = RC4.extend({
 10863  	        /**
 10864  	         * Configuration options.
 10865  	         *
 10866  	         * @property {number} drop The number of keystream words to drop. Default 192
 10867  	         */
 10868  	        cfg: RC4.cfg.extend({
 10869  	            drop: 192
 10870  	        }),
 10871  
 10872  	        _doReset: function () {
 10873  	            RC4._doReset.call(this);
 10874  
 10875  	            // Drop
 10876  	            for (var i = this.cfg.drop; i > 0; i--) {
 10877  	                generateKeystreamWord.call(this);
 10878  	            }
 10879  	        }
 10880  	    });
 10881  
 10882  	    /**
 10883  	     * Shortcut functions to the cipher's object interface.
 10884  	     *
 10885  	     * @example
 10886  	     *
 10887  	     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
 10888  	     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
 10889  	     */
 10890  	    C.RC4Drop = StreamCipher._createHelper(RC4Drop);
 10891  	}());
 10892  
 10893  
 10894  	return CryptoJS.RC4;
 10895  
 10896  }));
 10897  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],76:[function(require,module,exports){
 10898  ;(function (root, factory) {
 10899  	if (typeof exports === "object") {
 10900  		// CommonJS
 10901  		module.exports = exports = factory(require("./core"));
 10902  	}
 10903  	else if (typeof define === "function" && define.amd) {
 10904  		// AMD
 10905  		define(["./core"], factory);
 10906  	}
 10907  	else {
 10908  		// Global (browser)
 10909  		factory(root.CryptoJS);
 10910  	}
 10911  }(this, function (CryptoJS) {
 10912  
 10913  	/** @preserve
 10914  	(c) 2012 by CĂ©dric Mesnil. All rights reserved.
 10915  
 10916  	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 10917  
 10918  	    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 10919  	    - 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.
 10920  
 10921  	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.
 10922  	*/
 10923  
 10924  	(function (Math) {
 10925  	    // Shortcuts
 10926  	    var C = CryptoJS;
 10927  	    var C_lib = C.lib;
 10928  	    var WordArray = C_lib.WordArray;
 10929  	    var Hasher = C_lib.Hasher;
 10930  	    var C_algo = C.algo;
 10931  
 10932  	    // Constants table
 10933  	    var _zl = WordArray.create([
 10934  	        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
 10935  	        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,
 10936  	        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,
 10937  	        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,
 10938  	        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);
 10939  	    var _zr = WordArray.create([
 10940  	        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,
 10941  	        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,
 10942  	        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,
 10943  	        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,
 10944  	        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);
 10945  	    var _sl = WordArray.create([
 10946  	         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,
 10947  	        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,
 10948  	        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,
 10949  	          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,
 10950  	        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);
 10951  	    var _sr = WordArray.create([
 10952  	        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,
 10953  	        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,
 10954  	        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,
 10955  	        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,
 10956  	        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);
 10957  
 10958  	    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
 10959  	    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
 10960  
 10961  	    /**
 10962  	     * RIPEMD160 hash algorithm.
 10963  	     */
 10964  	    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
 10965  	        _doReset: function () {
 10966  	            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
 10967  	        },
 10968  
 10969  	        _doProcessBlock: function (M, offset) {
 10970  
 10971  	            // Swap endian
 10972  	            for (var i = 0; i < 16; i++) {
 10973  	                // Shortcuts
 10974  	                var offset_i = offset + i;
 10975  	                var M_offset_i = M[offset_i];
 10976  
 10977  	                // Swap
 10978  	                M[offset_i] = (
 10979  	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
 10980  	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
 10981  	                );
 10982  	            }
 10983  	            // Shortcut
 10984  	            var H  = this._hash.words;
 10985  	            var hl = _hl.words;
 10986  	            var hr = _hr.words;
 10987  	            var zl = _zl.words;
 10988  	            var zr = _zr.words;
 10989  	            var sl = _sl.words;
 10990  	            var sr = _sr.words;
 10991  
 10992  	            // Working variables
 10993  	            var al, bl, cl, dl, el;
 10994  	            var ar, br, cr, dr, er;
 10995  
 10996  	            ar = al = H[0];
 10997  	            br = bl = H[1];
 10998  	            cr = cl = H[2];
 10999  	            dr = dl = H[3];
 11000  	            er = el = H[4];
 11001  	            // Computation
 11002  	            var t;
 11003  	            for (var i = 0; i < 80; i += 1) {
 11004  	                t = (al +  M[offset+zl[i]])|0;
 11005  	                if (i<16){
 11006  		            t +=  f1(bl,cl,dl) + hl[0];
 11007  	                } else if (i<32) {
 11008  		            t +=  f2(bl,cl,dl) + hl[1];
 11009  	                } else if (i<48) {
 11010  		            t +=  f3(bl,cl,dl) + hl[2];
 11011  	                } else if (i<64) {
 11012  		            t +=  f4(bl,cl,dl) + hl[3];
 11013  	                } else {// if (i<80) {
 11014  		            t +=  f5(bl,cl,dl) + hl[4];
 11015  	                }
 11016  	                t = t|0;
 11017  	                t =  rotl(t,sl[i]);
 11018  	                t = (t+el)|0;
 11019  	                al = el;
 11020  	                el = dl;
 11021  	                dl = rotl(cl, 10);
 11022  	                cl = bl;
 11023  	                bl = t;
 11024  
 11025  	                t = (ar + M[offset+zr[i]])|0;
 11026  	                if (i<16){
 11027  		            t +=  f5(br,cr,dr) + hr[0];
 11028  	                } else if (i<32) {
 11029  		            t +=  f4(br,cr,dr) + hr[1];
 11030  	                } else if (i<48) {
 11031  		            t +=  f3(br,cr,dr) + hr[2];
 11032  	                } else if (i<64) {
 11033  		            t +=  f2(br,cr,dr) + hr[3];
 11034  	                } else {// if (i<80) {
 11035  		            t +=  f1(br,cr,dr) + hr[4];
 11036  	                }
 11037  	                t = t|0;
 11038  	                t =  rotl(t,sr[i]) ;
 11039  	                t = (t+er)|0;
 11040  	                ar = er;
 11041  	                er = dr;
 11042  	                dr = rotl(cr, 10);
 11043  	                cr = br;
 11044  	                br = t;
 11045  	            }
 11046  	            // Intermediate hash value
 11047  	            t    = (H[1] + cl + dr)|0;
 11048  	            H[1] = (H[2] + dl + er)|0;
 11049  	            H[2] = (H[3] + el + ar)|0;
 11050  	            H[3] = (H[4] + al + br)|0;
 11051  	            H[4] = (H[0] + bl + cr)|0;
 11052  	            H[0] =  t;
 11053  	        },
 11054  
 11055  	        _doFinalize: function () {
 11056  	            // Shortcuts
 11057  	            var data = this._data;
 11058  	            var dataWords = data.words;
 11059  
 11060  	            var nBitsTotal = this._nDataBytes * 8;
 11061  	            var nBitsLeft = data.sigBytes * 8;
 11062  
 11063  	            // Add padding
 11064  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11065  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
 11066  	                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |
 11067  	                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)
 11068  	            );
 11069  	            data.sigBytes = (dataWords.length + 1) * 4;
 11070  
 11071  	            // Hash final blocks
 11072  	            this._process();
 11073  
 11074  	            // Shortcuts
 11075  	            var hash = this._hash;
 11076  	            var H = hash.words;
 11077  
 11078  	            // Swap endian
 11079  	            for (var i = 0; i < 5; i++) {
 11080  	                // Shortcut
 11081  	                var H_i = H[i];
 11082  
 11083  	                // Swap
 11084  	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
 11085  	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
 11086  	            }
 11087  
 11088  	            // Return final computed hash
 11089  	            return hash;
 11090  	        },
 11091  
 11092  	        clone: function () {
 11093  	            var clone = Hasher.clone.call(this);
 11094  	            clone._hash = this._hash.clone();
 11095  
 11096  	            return clone;
 11097  	        }
 11098  	    });
 11099  
 11100  
 11101  	    function f1(x, y, z) {
 11102  	        return ((x) ^ (y) ^ (z));
 11103  
 11104  	    }
 11105  
 11106  	    function f2(x, y, z) {
 11107  	        return (((x)&(y)) | ((~x)&(z)));
 11108  	    }
 11109  
 11110  	    function f3(x, y, z) {
 11111  	        return (((x) | (~(y))) ^ (z));
 11112  	    }
 11113  
 11114  	    function f4(x, y, z) {
 11115  	        return (((x) & (z)) | ((y)&(~(z))));
 11116  	    }
 11117  
 11118  	    function f5(x, y, z) {
 11119  	        return ((x) ^ ((y) |(~(z))));
 11120  
 11121  	    }
 11122  
 11123  	    function rotl(x,n) {
 11124  	        return (x<<n) | (x>>>(32-n));
 11125  	    }
 11126  
 11127  
 11128  	    /**
 11129  	     * Shortcut function to the hasher's object interface.
 11130  	     *
 11131  	     * @param {WordArray|string} message The message to hash.
 11132  	     *
 11133  	     * @return {WordArray} The hash.
 11134  	     *
 11135  	     * @static
 11136  	     *
 11137  	     * @example
 11138  	     *
 11139  	     *     var hash = CryptoJS.RIPEMD160('message');
 11140  	     *     var hash = CryptoJS.RIPEMD160(wordArray);
 11141  	     */
 11142  	    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
 11143  
 11144  	    /**
 11145  	     * Shortcut function to the HMAC's object interface.
 11146  	     *
 11147  	     * @param {WordArray|string} message The message to hash.
 11148  	     * @param {WordArray|string} key The secret key.
 11149  	     *
 11150  	     * @return {WordArray} The HMAC.
 11151  	     *
 11152  	     * @static
 11153  	     *
 11154  	     * @example
 11155  	     *
 11156  	     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);
 11157  	     */
 11158  	    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
 11159  	}(Math));
 11160  
 11161  
 11162  	return CryptoJS.RIPEMD160;
 11163  
 11164  }));
 11165  },{"./core":53}],77:[function(require,module,exports){
 11166  ;(function (root, factory) {
 11167  	if (typeof exports === "object") {
 11168  		// CommonJS
 11169  		module.exports = exports = factory(require("./core"));
 11170  	}
 11171  	else if (typeof define === "function" && define.amd) {
 11172  		// AMD
 11173  		define(["./core"], factory);
 11174  	}
 11175  	else {
 11176  		// Global (browser)
 11177  		factory(root.CryptoJS);
 11178  	}
 11179  }(this, function (CryptoJS) {
 11180  
 11181  	(function () {
 11182  	    // Shortcuts
 11183  	    var C = CryptoJS;
 11184  	    var C_lib = C.lib;
 11185  	    var WordArray = C_lib.WordArray;
 11186  	    var Hasher = C_lib.Hasher;
 11187  	    var C_algo = C.algo;
 11188  
 11189  	    // Reusable object
 11190  	    var W = [];
 11191  
 11192  	    /**
 11193  	     * SHA-1 hash algorithm.
 11194  	     */
 11195  	    var SHA1 = C_algo.SHA1 = Hasher.extend({
 11196  	        _doReset: function () {
 11197  	            this._hash = new WordArray.init([
 11198  	                0x67452301, 0xefcdab89,
 11199  	                0x98badcfe, 0x10325476,
 11200  	                0xc3d2e1f0
 11201  	            ]);
 11202  	        },
 11203  
 11204  	        _doProcessBlock: function (M, offset) {
 11205  	            // Shortcut
 11206  	            var H = this._hash.words;
 11207  
 11208  	            // Working variables
 11209  	            var a = H[0];
 11210  	            var b = H[1];
 11211  	            var c = H[2];
 11212  	            var d = H[3];
 11213  	            var e = H[4];
 11214  
 11215  	            // Computation
 11216  	            for (var i = 0; i < 80; i++) {
 11217  	                if (i < 16) {
 11218  	                    W[i] = M[offset + i] | 0;
 11219  	                } else {
 11220  	                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
 11221  	                    W[i] = (n << 1) | (n >>> 31);
 11222  	                }
 11223  
 11224  	                var t = ((a << 5) | (a >>> 27)) + e + W[i];
 11225  	                if (i < 20) {
 11226  	                    t += ((b & c) | (~b & d)) + 0x5a827999;
 11227  	                } else if (i < 40) {
 11228  	                    t += (b ^ c ^ d) + 0x6ed9eba1;
 11229  	                } else if (i < 60) {
 11230  	                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
 11231  	                } else /* if (i < 80) */ {
 11232  	                    t += (b ^ c ^ d) - 0x359d3e2a;
 11233  	                }
 11234  
 11235  	                e = d;
 11236  	                d = c;
 11237  	                c = (b << 30) | (b >>> 2);
 11238  	                b = a;
 11239  	                a = t;
 11240  	            }
 11241  
 11242  	            // Intermediate hash value
 11243  	            H[0] = (H[0] + a) | 0;
 11244  	            H[1] = (H[1] + b) | 0;
 11245  	            H[2] = (H[2] + c) | 0;
 11246  	            H[3] = (H[3] + d) | 0;
 11247  	            H[4] = (H[4] + e) | 0;
 11248  	        },
 11249  
 11250  	        _doFinalize: function () {
 11251  	            // Shortcuts
 11252  	            var data = this._data;
 11253  	            var dataWords = data.words;
 11254  
 11255  	            var nBitsTotal = this._nDataBytes * 8;
 11256  	            var nBitsLeft = data.sigBytes * 8;
 11257  
 11258  	            // Add padding
 11259  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11260  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
 11261  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
 11262  	            data.sigBytes = dataWords.length * 4;
 11263  
 11264  	            // Hash final blocks
 11265  	            this._process();
 11266  
 11267  	            // Return final computed hash
 11268  	            return this._hash;
 11269  	        },
 11270  
 11271  	        clone: function () {
 11272  	            var clone = Hasher.clone.call(this);
 11273  	            clone._hash = this._hash.clone();
 11274  
 11275  	            return clone;
 11276  	        }
 11277  	    });
 11278  
 11279  	    /**
 11280  	     * Shortcut function to the hasher's object interface.
 11281  	     *
 11282  	     * @param {WordArray|string} message The message to hash.
 11283  	     *
 11284  	     * @return {WordArray} The hash.
 11285  	     *
 11286  	     * @static
 11287  	     *
 11288  	     * @example
 11289  	     *
 11290  	     *     var hash = CryptoJS.SHA1('message');
 11291  	     *     var hash = CryptoJS.SHA1(wordArray);
 11292  	     */
 11293  	    C.SHA1 = Hasher._createHelper(SHA1);
 11294  
 11295  	    /**
 11296  	     * Shortcut function to the HMAC's object interface.
 11297  	     *
 11298  	     * @param {WordArray|string} message The message to hash.
 11299  	     * @param {WordArray|string} key The secret key.
 11300  	     *
 11301  	     * @return {WordArray} The HMAC.
 11302  	     *
 11303  	     * @static
 11304  	     *
 11305  	     * @example
 11306  	     *
 11307  	     *     var hmac = CryptoJS.HmacSHA1(message, key);
 11308  	     */
 11309  	    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
 11310  	}());
 11311  
 11312  
 11313  	return CryptoJS.SHA1;
 11314  
 11315  }));
 11316  },{"./core":53}],78:[function(require,module,exports){
 11317  ;(function (root, factory, undef) {
 11318  	if (typeof exports === "object") {
 11319  		// CommonJS
 11320  		module.exports = exports = factory(require("./core"), require("./sha256"));
 11321  	}
 11322  	else if (typeof define === "function" && define.amd) {
 11323  		// AMD
 11324  		define(["./core", "./sha256"], factory);
 11325  	}
 11326  	else {
 11327  		// Global (browser)
 11328  		factory(root.CryptoJS);
 11329  	}
 11330  }(this, function (CryptoJS) {
 11331  
 11332  	(function () {
 11333  	    // Shortcuts
 11334  	    var C = CryptoJS;
 11335  	    var C_lib = C.lib;
 11336  	    var WordArray = C_lib.WordArray;
 11337  	    var C_algo = C.algo;
 11338  	    var SHA256 = C_algo.SHA256;
 11339  
 11340  	    /**
 11341  	     * SHA-224 hash algorithm.
 11342  	     */
 11343  	    var SHA224 = C_algo.SHA224 = SHA256.extend({
 11344  	        _doReset: function () {
 11345  	            this._hash = new WordArray.init([
 11346  	                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
 11347  	                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
 11348  	            ]);
 11349  	        },
 11350  
 11351  	        _doFinalize: function () {
 11352  	            var hash = SHA256._doFinalize.call(this);
 11353  
 11354  	            hash.sigBytes -= 4;
 11355  
 11356  	            return hash;
 11357  	        }
 11358  	    });
 11359  
 11360  	    /**
 11361  	     * Shortcut function to the hasher's object interface.
 11362  	     *
 11363  	     * @param {WordArray|string} message The message to hash.
 11364  	     *
 11365  	     * @return {WordArray} The hash.
 11366  	     *
 11367  	     * @static
 11368  	     *
 11369  	     * @example
 11370  	     *
 11371  	     *     var hash = CryptoJS.SHA224('message');
 11372  	     *     var hash = CryptoJS.SHA224(wordArray);
 11373  	     */
 11374  	    C.SHA224 = SHA256._createHelper(SHA224);
 11375  
 11376  	    /**
 11377  	     * Shortcut function to the HMAC's object interface.
 11378  	     *
 11379  	     * @param {WordArray|string} message The message to hash.
 11380  	     * @param {WordArray|string} key The secret key.
 11381  	     *
 11382  	     * @return {WordArray} The HMAC.
 11383  	     *
 11384  	     * @static
 11385  	     *
 11386  	     * @example
 11387  	     *
 11388  	     *     var hmac = CryptoJS.HmacSHA224(message, key);
 11389  	     */
 11390  	    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
 11391  	}());
 11392  
 11393  
 11394  	return CryptoJS.SHA224;
 11395  
 11396  }));
 11397  },{"./core":53,"./sha256":79}],79:[function(require,module,exports){
 11398  ;(function (root, factory) {
 11399  	if (typeof exports === "object") {
 11400  		// CommonJS
 11401  		module.exports = exports = factory(require("./core"));
 11402  	}
 11403  	else if (typeof define === "function" && define.amd) {
 11404  		// AMD
 11405  		define(["./core"], factory);
 11406  	}
 11407  	else {
 11408  		// Global (browser)
 11409  		factory(root.CryptoJS);
 11410  	}
 11411  }(this, function (CryptoJS) {
 11412  
 11413  	(function (Math) {
 11414  	    // Shortcuts
 11415  	    var C = CryptoJS;
 11416  	    var C_lib = C.lib;
 11417  	    var WordArray = C_lib.WordArray;
 11418  	    var Hasher = C_lib.Hasher;
 11419  	    var C_algo = C.algo;
 11420  
 11421  	    // Initialization and round constants tables
 11422  	    var H = [];
 11423  	    var K = [];
 11424  
 11425  	    // Compute constants
 11426  	    (function () {
 11427  	        function isPrime(n) {
 11428  	            var sqrtN = Math.sqrt(n);
 11429  	            for (var factor = 2; factor <= sqrtN; factor++) {
 11430  	                if (!(n % factor)) {
 11431  	                    return false;
 11432  	                }
 11433  	            }
 11434  
 11435  	            return true;
 11436  	        }
 11437  
 11438  	        function getFractionalBits(n) {
 11439  	            return ((n - (n | 0)) * 0x100000000) | 0;
 11440  	        }
 11441  
 11442  	        var n = 2;
 11443  	        var nPrime = 0;
 11444  	        while (nPrime < 64) {
 11445  	            if (isPrime(n)) {
 11446  	                if (nPrime < 8) {
 11447  	                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
 11448  	                }
 11449  	                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
 11450  
 11451  	                nPrime++;
 11452  	            }
 11453  
 11454  	            n++;
 11455  	        }
 11456  	    }());
 11457  
 11458  	    // Reusable object
 11459  	    var W = [];
 11460  
 11461  	    /**
 11462  	     * SHA-256 hash algorithm.
 11463  	     */
 11464  	    var SHA256 = C_algo.SHA256 = Hasher.extend({
 11465  	        _doReset: function () {
 11466  	            this._hash = new WordArray.init(H.slice(0));
 11467  	        },
 11468  
 11469  	        _doProcessBlock: function (M, offset) {
 11470  	            // Shortcut
 11471  	            var H = this._hash.words;
 11472  
 11473  	            // Working variables
 11474  	            var a = H[0];
 11475  	            var b = H[1];
 11476  	            var c = H[2];
 11477  	            var d = H[3];
 11478  	            var e = H[4];
 11479  	            var f = H[5];
 11480  	            var g = H[6];
 11481  	            var h = H[7];
 11482  
 11483  	            // Computation
 11484  	            for (var i = 0; i < 64; i++) {
 11485  	                if (i < 16) {
 11486  	                    W[i] = M[offset + i] | 0;
 11487  	                } else {
 11488  	                    var gamma0x = W[i - 15];
 11489  	                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^
 11490  	                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^
 11491  	                                   (gamma0x >>> 3);
 11492  
 11493  	                    var gamma1x = W[i - 2];
 11494  	                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^
 11495  	                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^
 11496  	                                   (gamma1x >>> 10);
 11497  
 11498  	                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
 11499  	                }
 11500  
 11501  	                var ch  = (e & f) ^ (~e & g);
 11502  	                var maj = (a & b) ^ (a & c) ^ (b & c);
 11503  
 11504  	                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
 11505  	                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));
 11506  
 11507  	                var t1 = h + sigma1 + ch + K[i] + W[i];
 11508  	                var t2 = sigma0 + maj;
 11509  
 11510  	                h = g;
 11511  	                g = f;
 11512  	                f = e;
 11513  	                e = (d + t1) | 0;
 11514  	                d = c;
 11515  	                c = b;
 11516  	                b = a;
 11517  	                a = (t1 + t2) | 0;
 11518  	            }
 11519  
 11520  	            // Intermediate hash value
 11521  	            H[0] = (H[0] + a) | 0;
 11522  	            H[1] = (H[1] + b) | 0;
 11523  	            H[2] = (H[2] + c) | 0;
 11524  	            H[3] = (H[3] + d) | 0;
 11525  	            H[4] = (H[4] + e) | 0;
 11526  	            H[5] = (H[5] + f) | 0;
 11527  	            H[6] = (H[6] + g) | 0;
 11528  	            H[7] = (H[7] + h) | 0;
 11529  	        },
 11530  
 11531  	        _doFinalize: function () {
 11532  	            // Shortcuts
 11533  	            var data = this._data;
 11534  	            var dataWords = data.words;
 11535  
 11536  	            var nBitsTotal = this._nDataBytes * 8;
 11537  	            var nBitsLeft = data.sigBytes * 8;
 11538  
 11539  	            // Add padding
 11540  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11541  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
 11542  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
 11543  	            data.sigBytes = dataWords.length * 4;
 11544  
 11545  	            // Hash final blocks
 11546  	            this._process();
 11547  
 11548  	            // Return final computed hash
 11549  	            return this._hash;
 11550  	        },
 11551  
 11552  	        clone: function () {
 11553  	            var clone = Hasher.clone.call(this);
 11554  	            clone._hash = this._hash.clone();
 11555  
 11556  	            return clone;
 11557  	        }
 11558  	    });
 11559  
 11560  	    /**
 11561  	     * Shortcut function to the hasher's object interface.
 11562  	     *
 11563  	     * @param {WordArray|string} message The message to hash.
 11564  	     *
 11565  	     * @return {WordArray} The hash.
 11566  	     *
 11567  	     * @static
 11568  	     *
 11569  	     * @example
 11570  	     *
 11571  	     *     var hash = CryptoJS.SHA256('message');
 11572  	     *     var hash = CryptoJS.SHA256(wordArray);
 11573  	     */
 11574  	    C.SHA256 = Hasher._createHelper(SHA256);
 11575  
 11576  	    /**
 11577  	     * Shortcut function to the HMAC's object interface.
 11578  	     *
 11579  	     * @param {WordArray|string} message The message to hash.
 11580  	     * @param {WordArray|string} key The secret key.
 11581  	     *
 11582  	     * @return {WordArray} The HMAC.
 11583  	     *
 11584  	     * @static
 11585  	     *
 11586  	     * @example
 11587  	     *
 11588  	     *     var hmac = CryptoJS.HmacSHA256(message, key);
 11589  	     */
 11590  	    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
 11591  	}(Math));
 11592  
 11593  
 11594  	return CryptoJS.SHA256;
 11595  
 11596  }));
 11597  },{"./core":53}],80:[function(require,module,exports){
 11598  ;(function (root, factory, undef) {
 11599  	if (typeof exports === "object") {
 11600  		// CommonJS
 11601  		module.exports = exports = factory(require("./core"), require("./x64-core"));
 11602  	}
 11603  	else if (typeof define === "function" && define.amd) {
 11604  		// AMD
 11605  		define(["./core", "./x64-core"], factory);
 11606  	}
 11607  	else {
 11608  		// Global (browser)
 11609  		factory(root.CryptoJS);
 11610  	}
 11611  }(this, function (CryptoJS) {
 11612  
 11613  	(function (Math) {
 11614  	    // Shortcuts
 11615  	    var C = CryptoJS;
 11616  	    var C_lib = C.lib;
 11617  	    var WordArray = C_lib.WordArray;
 11618  	    var Hasher = C_lib.Hasher;
 11619  	    var C_x64 = C.x64;
 11620  	    var X64Word = C_x64.Word;
 11621  	    var C_algo = C.algo;
 11622  
 11623  	    // Constants tables
 11624  	    var RHO_OFFSETS = [];
 11625  	    var PI_INDEXES  = [];
 11626  	    var ROUND_CONSTANTS = [];
 11627  
 11628  	    // Compute Constants
 11629  	    (function () {
 11630  	        // Compute rho offset constants
 11631  	        var x = 1, y = 0;
 11632  	        for (var t = 0; t < 24; t++) {
 11633  	            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
 11634  
 11635  	            var newX = y % 5;
 11636  	            var newY = (2 * x + 3 * y) % 5;
 11637  	            x = newX;
 11638  	            y = newY;
 11639  	        }
 11640  
 11641  	        // Compute pi index constants
 11642  	        for (var x = 0; x < 5; x++) {
 11643  	            for (var y = 0; y < 5; y++) {
 11644  	                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
 11645  	            }
 11646  	        }
 11647  
 11648  	        // Compute round constants
 11649  	        var LFSR = 0x01;
 11650  	        for (var i = 0; i < 24; i++) {
 11651  	            var roundConstantMsw = 0;
 11652  	            var roundConstantLsw = 0;
 11653  
 11654  	            for (var j = 0; j < 7; j++) {
 11655  	                if (LFSR & 0x01) {
 11656  	                    var bitPosition = (1 << j) - 1;
 11657  	                    if (bitPosition < 32) {
 11658  	                        roundConstantLsw ^= 1 << bitPosition;
 11659  	                    } else /* if (bitPosition >= 32) */ {
 11660  	                        roundConstantMsw ^= 1 << (bitPosition - 32);
 11661  	                    }
 11662  	                }
 11663  
 11664  	                // Compute next LFSR
 11665  	                if (LFSR & 0x80) {
 11666  	                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
 11667  	                    LFSR = (LFSR << 1) ^ 0x71;
 11668  	                } else {
 11669  	                    LFSR <<= 1;
 11670  	                }
 11671  	            }
 11672  
 11673  	            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
 11674  	        }
 11675  	    }());
 11676  
 11677  	    // Reusable objects for temporary values
 11678  	    var T = [];
 11679  	    (function () {
 11680  	        for (var i = 0; i < 25; i++) {
 11681  	            T[i] = X64Word.create();
 11682  	        }
 11683  	    }());
 11684  
 11685  	    /**
 11686  	     * SHA-3 hash algorithm.
 11687  	     */
 11688  	    var SHA3 = C_algo.SHA3 = Hasher.extend({
 11689  	        /**
 11690  	         * Configuration options.
 11691  	         *
 11692  	         * @property {number} outputLength
 11693  	         *   The desired number of bits in the output hash.
 11694  	         *   Only values permitted are: 224, 256, 384, 512.
 11695  	         *   Default: 512
 11696  	         */
 11697  	        cfg: Hasher.cfg.extend({
 11698  	            outputLength: 512
 11699  	        }),
 11700  
 11701  	        _doReset: function () {
 11702  	            var state = this._state = []
 11703  	            for (var i = 0; i < 25; i++) {
 11704  	                state[i] = new X64Word.init();
 11705  	            }
 11706  
 11707  	            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
 11708  	        },
 11709  
 11710  	        _doProcessBlock: function (M, offset) {
 11711  	            // Shortcuts
 11712  	            var state = this._state;
 11713  	            var nBlockSizeLanes = this.blockSize / 2;
 11714  
 11715  	            // Absorb
 11716  	            for (var i = 0; i < nBlockSizeLanes; i++) {
 11717  	                // Shortcuts
 11718  	                var M2i  = M[offset + 2 * i];
 11719  	                var M2i1 = M[offset + 2 * i + 1];
 11720  
 11721  	                // Swap endian
 11722  	                M2i = (
 11723  	                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |
 11724  	                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)
 11725  	                );
 11726  	                M2i1 = (
 11727  	                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |
 11728  	                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)
 11729  	                );
 11730  
 11731  	                // Absorb message into state
 11732  	                var lane = state[i];
 11733  	                lane.high ^= M2i1;
 11734  	                lane.low  ^= M2i;
 11735  	            }
 11736  
 11737  	            // Rounds
 11738  	            for (var round = 0; round < 24; round++) {
 11739  	                // Theta
 11740  	                for (var x = 0; x < 5; x++) {
 11741  	                    // Mix column lanes
 11742  	                    var tMsw = 0, tLsw = 0;
 11743  	                    for (var y = 0; y < 5; y++) {
 11744  	                        var lane = state[x + 5 * y];
 11745  	                        tMsw ^= lane.high;
 11746  	                        tLsw ^= lane.low;
 11747  	                    }
 11748  
 11749  	                    // Temporary values
 11750  	                    var Tx = T[x];
 11751  	                    Tx.high = tMsw;
 11752  	                    Tx.low  = tLsw;
 11753  	                }
 11754  	                for (var x = 0; x < 5; x++) {
 11755  	                    // Shortcuts
 11756  	                    var Tx4 = T[(x + 4) % 5];
 11757  	                    var Tx1 = T[(x + 1) % 5];
 11758  	                    var Tx1Msw = Tx1.high;
 11759  	                    var Tx1Lsw = Tx1.low;
 11760  
 11761  	                    // Mix surrounding columns
 11762  	                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
 11763  	                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
 11764  	                    for (var y = 0; y < 5; y++) {
 11765  	                        var lane = state[x + 5 * y];
 11766  	                        lane.high ^= tMsw;
 11767  	                        lane.low  ^= tLsw;
 11768  	                    }
 11769  	                }
 11770  
 11771  	                // Rho Pi
 11772  	                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
 11773  	                    // Shortcuts
 11774  	                    var lane = state[laneIndex];
 11775  	                    var laneMsw = lane.high;
 11776  	                    var laneLsw = lane.low;
 11777  	                    var rhoOffset = RHO_OFFSETS[laneIndex];
 11778  
 11779  	                    // Rotate lanes
 11780  	                    if (rhoOffset < 32) {
 11781  	                        var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
 11782  	                        var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
 11783  	                    } else /* if (rhoOffset >= 32) */ {
 11784  	                        var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
 11785  	                        var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
 11786  	                    }
 11787  
 11788  	                    // Transpose lanes
 11789  	                    var TPiLane = T[PI_INDEXES[laneIndex]];
 11790  	                    TPiLane.high = tMsw;
 11791  	                    TPiLane.low  = tLsw;
 11792  	                }
 11793  
 11794  	                // Rho pi at x = y = 0
 11795  	                var T0 = T[0];
 11796  	                var state0 = state[0];
 11797  	                T0.high = state0.high;
 11798  	                T0.low  = state0.low;
 11799  
 11800  	                // Chi
 11801  	                for (var x = 0; x < 5; x++) {
 11802  	                    for (var y = 0; y < 5; y++) {
 11803  	                        // Shortcuts
 11804  	                        var laneIndex = x + 5 * y;
 11805  	                        var lane = state[laneIndex];
 11806  	                        var TLane = T[laneIndex];
 11807  	                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];
 11808  	                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];
 11809  
 11810  	                        // Mix rows
 11811  	                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
 11812  	                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);
 11813  	                    }
 11814  	                }
 11815  
 11816  	                // Iota
 11817  	                var lane = state[0];
 11818  	                var roundConstant = ROUND_CONSTANTS[round];
 11819  	                lane.high ^= roundConstant.high;
 11820  	                lane.low  ^= roundConstant.low;;
 11821  	            }
 11822  	        },
 11823  
 11824  	        _doFinalize: function () {
 11825  	            // Shortcuts
 11826  	            var data = this._data;
 11827  	            var dataWords = data.words;
 11828  	            var nBitsTotal = this._nDataBytes * 8;
 11829  	            var nBitsLeft = data.sigBytes * 8;
 11830  	            var blockSizeBits = this.blockSize * 32;
 11831  
 11832  	            // Add padding
 11833  	            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
 11834  	            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
 11835  	            data.sigBytes = dataWords.length * 4;
 11836  
 11837  	            // Hash final blocks
 11838  	            this._process();
 11839  
 11840  	            // Shortcuts
 11841  	            var state = this._state;
 11842  	            var outputLengthBytes = this.cfg.outputLength / 8;
 11843  	            var outputLengthLanes = outputLengthBytes / 8;
 11844  
 11845  	            // Squeeze
 11846  	            var hashWords = [];
 11847  	            for (var i = 0; i < outputLengthLanes; i++) {
 11848  	                // Shortcuts
 11849  	                var lane = state[i];
 11850  	                var laneMsw = lane.high;
 11851  	                var laneLsw = lane.low;
 11852  
 11853  	                // Swap endian
 11854  	                laneMsw = (
 11855  	                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |
 11856  	                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)
 11857  	                );
 11858  	                laneLsw = (
 11859  	                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |
 11860  	                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)
 11861  	                );
 11862  
 11863  	                // Squeeze state to retrieve hash
 11864  	                hashWords.push(laneLsw);
 11865  	                hashWords.push(laneMsw);
 11866  	            }
 11867  
 11868  	            // Return final computed hash
 11869  	            return new WordArray.init(hashWords, outputLengthBytes);
 11870  	        },
 11871  
 11872  	        clone: function () {
 11873  	            var clone = Hasher.clone.call(this);
 11874  
 11875  	            var state = clone._state = this._state.slice(0);
 11876  	            for (var i = 0; i < 25; i++) {
 11877  	                state[i] = state[i].clone();
 11878  	            }
 11879  
 11880  	            return clone;
 11881  	        }
 11882  	    });
 11883  
 11884  	    /**
 11885  	     * Shortcut function to the hasher's object interface.
 11886  	     *
 11887  	     * @param {WordArray|string} message The message to hash.
 11888  	     *
 11889  	     * @return {WordArray} The hash.
 11890  	     *
 11891  	     * @static
 11892  	     *
 11893  	     * @example
 11894  	     *
 11895  	     *     var hash = CryptoJS.SHA3('message');
 11896  	     *     var hash = CryptoJS.SHA3(wordArray);
 11897  	     */
 11898  	    C.SHA3 = Hasher._createHelper(SHA3);
 11899  
 11900  	    /**
 11901  	     * Shortcut function to the HMAC's object interface.
 11902  	     *
 11903  	     * @param {WordArray|string} message The message to hash.
 11904  	     * @param {WordArray|string} key The secret key.
 11905  	     *
 11906  	     * @return {WordArray} The HMAC.
 11907  	     *
 11908  	     * @static
 11909  	     *
 11910  	     * @example
 11911  	     *
 11912  	     *     var hmac = CryptoJS.HmacSHA3(message, key);
 11913  	     */
 11914  	    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
 11915  	}(Math));
 11916  
 11917  
 11918  	return CryptoJS.SHA3;
 11919  
 11920  }));
 11921  },{"./core":53,"./x64-core":84}],81:[function(require,module,exports){
 11922  ;(function (root, factory, undef) {
 11923  	if (typeof exports === "object") {
 11924  		// CommonJS
 11925  		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"));
 11926  	}
 11927  	else if (typeof define === "function" && define.amd) {
 11928  		// AMD
 11929  		define(["./core", "./x64-core", "./sha512"], factory);
 11930  	}
 11931  	else {
 11932  		// Global (browser)
 11933  		factory(root.CryptoJS);
 11934  	}
 11935  }(this, function (CryptoJS) {
 11936  
 11937  	(function () {
 11938  	    // Shortcuts
 11939  	    var C = CryptoJS;
 11940  	    var C_x64 = C.x64;
 11941  	    var X64Word = C_x64.Word;
 11942  	    var X64WordArray = C_x64.WordArray;
 11943  	    var C_algo = C.algo;
 11944  	    var SHA512 = C_algo.SHA512;
 11945  
 11946  	    /**
 11947  	     * SHA-384 hash algorithm.
 11948  	     */
 11949  	    var SHA384 = C_algo.SHA384 = SHA512.extend({
 11950  	        _doReset: function () {
 11951  	            this._hash = new X64WordArray.init([
 11952  	                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
 11953  	                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
 11954  	                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
 11955  	                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
 11956  	            ]);
 11957  	        },
 11958  
 11959  	        _doFinalize: function () {
 11960  	            var hash = SHA512._doFinalize.call(this);
 11961  
 11962  	            hash.sigBytes -= 16;
 11963  
 11964  	            return hash;
 11965  	        }
 11966  	    });
 11967  
 11968  	    /**
 11969  	     * Shortcut function to the hasher's object interface.
 11970  	     *
 11971  	     * @param {WordArray|string} message The message to hash.
 11972  	     *
 11973  	     * @return {WordArray} The hash.
 11974  	     *
 11975  	     * @static
 11976  	     *
 11977  	     * @example
 11978  	     *
 11979  	     *     var hash = CryptoJS.SHA384('message');
 11980  	     *     var hash = CryptoJS.SHA384(wordArray);
 11981  	     */
 11982  	    C.SHA384 = SHA512._createHelper(SHA384);
 11983  
 11984  	    /**
 11985  	     * Shortcut function to the HMAC's object interface.
 11986  	     *
 11987  	     * @param {WordArray|string} message The message to hash.
 11988  	     * @param {WordArray|string} key The secret key.
 11989  	     *
 11990  	     * @return {WordArray} The HMAC.
 11991  	     *
 11992  	     * @static
 11993  	     *
 11994  	     * @example
 11995  	     *
 11996  	     *     var hmac = CryptoJS.HmacSHA384(message, key);
 11997  	     */
 11998  	    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
 11999  	}());
 12000  
 12001  
 12002  	return CryptoJS.SHA384;
 12003  
 12004  }));
 12005  },{"./core":53,"./sha512":82,"./x64-core":84}],82:[function(require,module,exports){
 12006  ;(function (root, factory, undef) {
 12007  	if (typeof exports === "object") {
 12008  		// CommonJS
 12009  		module.exports = exports = factory(require("./core"), require("./x64-core"));
 12010  	}
 12011  	else if (typeof define === "function" && define.amd) {
 12012  		// AMD
 12013  		define(["./core", "./x64-core"], factory);
 12014  	}
 12015  	else {
 12016  		// Global (browser)
 12017  		factory(root.CryptoJS);
 12018  	}
 12019  }(this, function (CryptoJS) {
 12020  
 12021  	(function () {
 12022  	    // Shortcuts
 12023  	    var C = CryptoJS;
 12024  	    var C_lib = C.lib;
 12025  	    var Hasher = C_lib.Hasher;
 12026  	    var C_x64 = C.x64;
 12027  	    var X64Word = C_x64.Word;
 12028  	    var X64WordArray = C_x64.WordArray;
 12029  	    var C_algo = C.algo;
 12030  
 12031  	    function X64Word_create() {
 12032  	        return X64Word.create.apply(X64Word, arguments);
 12033  	    }
 12034  
 12035  	    // Constants
 12036  	    var K = [
 12037  	        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
 12038  	        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
 12039  	        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
 12040  	        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
 12041  	        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
 12042  	        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
 12043  	        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
 12044  	        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
 12045  	        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
 12046  	        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
 12047  	        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
 12048  	        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
 12049  	        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
 12050  	        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
 12051  	        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
 12052  	        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
 12053  	        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
 12054  	        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
 12055  	        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
 12056  	        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
 12057  	        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
 12058  	        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
 12059  	        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
 12060  	        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
 12061  	        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
 12062  	        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
 12063  	        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
 12064  	        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
 12065  	        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
 12066  	        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
 12067  	        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
 12068  	        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
 12069  	        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
 12070  	        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
 12071  	        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
 12072  	        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
 12073  	        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
 12074  	        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
 12075  	        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
 12076  	        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
 12077  	    ];
 12078  
 12079  	    // Reusable objects
 12080  	    var W = [];
 12081  	    (function () {
 12082  	        for (var i = 0; i < 80; i++) {
 12083  	            W[i] = X64Word_create();
 12084  	        }
 12085  	    }());
 12086  
 12087  	    /**
 12088  	     * SHA-512 hash algorithm.
 12089  	     */
 12090  	    var SHA512 = C_algo.SHA512 = Hasher.extend({
 12091  	        _doReset: function () {
 12092  	            this._hash = new X64WordArray.init([
 12093  	                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
 12094  	                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
 12095  	                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
 12096  	                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
 12097  	            ]);
 12098  	        },
 12099  
 12100  	        _doProcessBlock: function (M, offset) {
 12101  	            // Shortcuts
 12102  	            var H = this._hash.words;
 12103  
 12104  	            var H0 = H[0];
 12105  	            var H1 = H[1];
 12106  	            var H2 = H[2];
 12107  	            var H3 = H[3];
 12108  	            var H4 = H[4];
 12109  	            var H5 = H[5];
 12110  	            var H6 = H[6];
 12111  	            var H7 = H[7];
 12112  
 12113  	            var H0h = H0.high;
 12114  	            var H0l = H0.low;
 12115  	            var H1h = H1.high;
 12116  	            var H1l = H1.low;
 12117  	            var H2h = H2.high;
 12118  	            var H2l = H2.low;
 12119  	            var H3h = H3.high;
 12120  	            var H3l = H3.low;
 12121  	            var H4h = H4.high;
 12122  	            var H4l = H4.low;
 12123  	            var H5h = H5.high;
 12124  	            var H5l = H5.low;
 12125  	            var H6h = H6.high;
 12126  	            var H6l = H6.low;
 12127  	            var H7h = H7.high;
 12128  	            var H7l = H7.low;
 12129  
 12130  	            // Working variables
 12131  	            var ah = H0h;
 12132  	            var al = H0l;
 12133  	            var bh = H1h;
 12134  	            var bl = H1l;
 12135  	            var ch = H2h;
 12136  	            var cl = H2l;
 12137  	            var dh = H3h;
 12138  	            var dl = H3l;
 12139  	            var eh = H4h;
 12140  	            var el = H4l;
 12141  	            var fh = H5h;
 12142  	            var fl = H5l;
 12143  	            var gh = H6h;
 12144  	            var gl = H6l;
 12145  	            var hh = H7h;
 12146  	            var hl = H7l;
 12147  
 12148  	            // Rounds
 12149  	            for (var i = 0; i < 80; i++) {
 12150  	                // Shortcut
 12151  	                var Wi = W[i];
 12152  
 12153  	                // Extend message
 12154  	                if (i < 16) {
 12155  	                    var Wih = Wi.high = M[offset + i * 2]     | 0;
 12156  	                    var Wil = Wi.low  = M[offset + i * 2 + 1] | 0;
 12157  	                } else {
 12158  	                    // Gamma0
 12159  	                    var gamma0x  = W[i - 15];
 12160  	                    var gamma0xh = gamma0x.high;
 12161  	                    var gamma0xl = gamma0x.low;
 12162  	                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
 12163  	                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
 12164  
 12165  	                    // Gamma1
 12166  	                    var gamma1x  = W[i - 2];
 12167  	                    var gamma1xh = gamma1x.high;
 12168  	                    var gamma1xl = gamma1x.low;
 12169  	                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
 12170  	                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
 12171  
 12172  	                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
 12173  	                    var Wi7  = W[i - 7];
 12174  	                    var Wi7h = Wi7.high;
 12175  	                    var Wi7l = Wi7.low;
 12176  
 12177  	                    var Wi16  = W[i - 16];
 12178  	                    var Wi16h = Wi16.high;
 12179  	                    var Wi16l = Wi16.low;
 12180  
 12181  	                    var Wil = gamma0l + Wi7l;
 12182  	                    var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
 12183  	                    var Wil = Wil + gamma1l;
 12184  	                    var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
 12185  	                    var Wil = Wil + Wi16l;
 12186  	                    var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
 12187  
 12188  	                    Wi.high = Wih;
 12189  	                    Wi.low  = Wil;
 12190  	                }
 12191  
 12192  	                var chh  = (eh & fh) ^ (~eh & gh);
 12193  	                var chl  = (el & fl) ^ (~el & gl);
 12194  	                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
 12195  	                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
 12196  
 12197  	                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
 12198  	                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
 12199  	                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
 12200  	                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
 12201  
 12202  	                // t1 = h + sigma1 + ch + K[i] + W[i]
 12203  	                var Ki  = K[i];
 12204  	                var Kih = Ki.high;
 12205  	                var Kil = Ki.low;
 12206  
 12207  	                var t1l = hl + sigma1l;
 12208  	                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
 12209  	                var t1l = t1l + chl;
 12210  	                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
 12211  	                var t1l = t1l + Kil;
 12212  	                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
 12213  	                var t1l = t1l + Wil;
 12214  	                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
 12215  
 12216  	                // t2 = sigma0 + maj
 12217  	                var t2l = sigma0l + majl;
 12218  	                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
 12219  
 12220  	                // Update working variables
 12221  	                hh = gh;
 12222  	                hl = gl;
 12223  	                gh = fh;
 12224  	                gl = fl;
 12225  	                fh = eh;
 12226  	                fl = el;
 12227  	                el = (dl + t1l) | 0;
 12228  	                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
 12229  	                dh = ch;
 12230  	                dl = cl;
 12231  	                ch = bh;
 12232  	                cl = bl;
 12233  	                bh = ah;
 12234  	                bl = al;
 12235  	                al = (t1l + t2l) | 0;
 12236  	                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
 12237  	            }
 12238  
 12239  	            // Intermediate hash value
 12240  	            H0l = H0.low  = (H0l + al);
 12241  	            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
 12242  	            H1l = H1.low  = (H1l + bl);
 12243  	            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
 12244  	            H2l = H2.low  = (H2l + cl);
 12245  	            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
 12246  	            H3l = H3.low  = (H3l + dl);
 12247  	            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
 12248  	            H4l = H4.low  = (H4l + el);
 12249  	            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
 12250  	            H5l = H5.low  = (H5l + fl);
 12251  	            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
 12252  	            H6l = H6.low  = (H6l + gl);
 12253  	            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
 12254  	            H7l = H7.low  = (H7l + hl);
 12255  	            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
 12256  	        },
 12257  
 12258  	        _doFinalize: function () {
 12259  	            // Shortcuts
 12260  	            var data = this._data;
 12261  	            var dataWords = data.words;
 12262  
 12263  	            var nBitsTotal = this._nDataBytes * 8;
 12264  	            var nBitsLeft = data.sigBytes * 8;
 12265  
 12266  	            // Add padding
 12267  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 12268  	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
 12269  	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
 12270  	            data.sigBytes = dataWords.length * 4;
 12271  
 12272  	            // Hash final blocks
 12273  	            this._process();
 12274  
 12275  	            // Convert hash to 32-bit word array before returning
 12276  	            var hash = this._hash.toX32();
 12277  
 12278  	            // Return final computed hash
 12279  	            return hash;
 12280  	        },
 12281  
 12282  	        clone: function () {
 12283  	            var clone = Hasher.clone.call(this);
 12284  	            clone._hash = this._hash.clone();
 12285  
 12286  	            return clone;
 12287  	        },
 12288  
 12289  	        blockSize: 1024/32
 12290  	    });
 12291  
 12292  	    /**
 12293  	     * Shortcut function to the hasher's object interface.
 12294  	     *
 12295  	     * @param {WordArray|string} message The message to hash.
 12296  	     *
 12297  	     * @return {WordArray} The hash.
 12298  	     *
 12299  	     * @static
 12300  	     *
 12301  	     * @example
 12302  	     *
 12303  	     *     var hash = CryptoJS.SHA512('message');
 12304  	     *     var hash = CryptoJS.SHA512(wordArray);
 12305  	     */
 12306  	    C.SHA512 = Hasher._createHelper(SHA512);
 12307  
 12308  	    /**
 12309  	     * Shortcut function to the HMAC's object interface.
 12310  	     *
 12311  	     * @param {WordArray|string} message The message to hash.
 12312  	     * @param {WordArray|string} key The secret key.
 12313  	     *
 12314  	     * @return {WordArray} The HMAC.
 12315  	     *
 12316  	     * @static
 12317  	     *
 12318  	     * @example
 12319  	     *
 12320  	     *     var hmac = CryptoJS.HmacSHA512(message, key);
 12321  	     */
 12322  	    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
 12323  	}());
 12324  
 12325  
 12326  	return CryptoJS.SHA512;
 12327  
 12328  }));
 12329  },{"./core":53,"./x64-core":84}],83:[function(require,module,exports){
 12330  ;(function (root, factory, undef) {
 12331  	if (typeof exports === "object") {
 12332  		// CommonJS
 12333  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 12334  	}
 12335  	else if (typeof define === "function" && define.amd) {
 12336  		// AMD
 12337  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 12338  	}
 12339  	else {
 12340  		// Global (browser)
 12341  		factory(root.CryptoJS);
 12342  	}
 12343  }(this, function (CryptoJS) {
 12344  
 12345  	(function () {
 12346  	    // Shortcuts
 12347  	    var C = CryptoJS;
 12348  	    var C_lib = C.lib;
 12349  	    var WordArray = C_lib.WordArray;
 12350  	    var BlockCipher = C_lib.BlockCipher;
 12351  	    var C_algo = C.algo;
 12352  
 12353  	    // Permuted Choice 1 constants
 12354  	    var PC1 = [
 12355  	        57, 49, 41, 33, 25, 17, 9,  1,
 12356  	        58, 50, 42, 34, 26, 18, 10, 2,
 12357  	        59, 51, 43, 35, 27, 19, 11, 3,
 12358  	        60, 52, 44, 36, 63, 55, 47, 39,
 12359  	        31, 23, 15, 7,  62, 54, 46, 38,
 12360  	        30, 22, 14, 6,  61, 53, 45, 37,
 12361  	        29, 21, 13, 5,  28, 20, 12, 4
 12362  	    ];
 12363  
 12364  	    // Permuted Choice 2 constants
 12365  	    var PC2 = [
 12366  	        14, 17, 11, 24, 1,  5,
 12367  	        3,  28, 15, 6,  21, 10,
 12368  	        23, 19, 12, 4,  26, 8,
 12369  	        16, 7,  27, 20, 13, 2,
 12370  	        41, 52, 31, 37, 47, 55,
 12371  	        30, 40, 51, 45, 33, 48,
 12372  	        44, 49, 39, 56, 34, 53,
 12373  	        46, 42, 50, 36, 29, 32
 12374  	    ];
 12375  
 12376  	    // Cumulative bit shift constants
 12377  	    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
 12378  
 12379  	    // SBOXes and round permutation constants
 12380  	    var SBOX_P = [
 12381  	        {
 12382  	            0x0: 0x808200,
 12383  	            0x10000000: 0x8000,
 12384  	            0x20000000: 0x808002,
 12385  	            0x30000000: 0x2,
 12386  	            0x40000000: 0x200,
 12387  	            0x50000000: 0x808202,
 12388  	            0x60000000: 0x800202,
 12389  	            0x70000000: 0x800000,
 12390  	            0x80000000: 0x202,
 12391  	            0x90000000: 0x800200,
 12392  	            0xa0000000: 0x8200,
 12393  	            0xb0000000: 0x808000,
 12394  	            0xc0000000: 0x8002,
 12395  	            0xd0000000: 0x800002,
 12396  	            0xe0000000: 0x0,
 12397  	            0xf0000000: 0x8202,
 12398  	            0x8000000: 0x0,
 12399  	            0x18000000: 0x808202,
 12400  	            0x28000000: 0x8202,
 12401  	            0x38000000: 0x8000,
 12402  	            0x48000000: 0x808200,
 12403  	            0x58000000: 0x200,
 12404  	            0x68000000: 0x808002,
 12405  	            0x78000000: 0x2,
 12406  	            0x88000000: 0x800200,
 12407  	            0x98000000: 0x8200,
 12408  	            0xa8000000: 0x808000,
 12409  	            0xb8000000: 0x800202,
 12410  	            0xc8000000: 0x800002,
 12411  	            0xd8000000: 0x8002,
 12412  	            0xe8000000: 0x202,
 12413  	            0xf8000000: 0x800000,
 12414  	            0x1: 0x8000,
 12415  	            0x10000001: 0x2,
 12416  	            0x20000001: 0x808200,
 12417  	            0x30000001: 0x800000,
 12418  	            0x40000001: 0x808002,
 12419  	            0x50000001: 0x8200,
 12420  	            0x60000001: 0x200,
 12421  	            0x70000001: 0x800202,
 12422  	            0x80000001: 0x808202,
 12423  	            0x90000001: 0x808000,
 12424  	            0xa0000001: 0x800002,
 12425  	            0xb0000001: 0x8202,
 12426  	            0xc0000001: 0x202,
 12427  	            0xd0000001: 0x800200,
 12428  	            0xe0000001: 0x8002,
 12429  	            0xf0000001: 0x0,
 12430  	            0x8000001: 0x808202,
 12431  	            0x18000001: 0x808000,
 12432  	            0x28000001: 0x800000,
 12433  	            0x38000001: 0x200,
 12434  	            0x48000001: 0x8000,
 12435  	            0x58000001: 0x800002,
 12436  	            0x68000001: 0x2,
 12437  	            0x78000001: 0x8202,
 12438  	            0x88000001: 0x8002,
 12439  	            0x98000001: 0x800202,
 12440  	            0xa8000001: 0x202,
 12441  	            0xb8000001: 0x808200,
 12442  	            0xc8000001: 0x800200,
 12443  	            0xd8000001: 0x0,
 12444  	            0xe8000001: 0x8200,
 12445  	            0xf8000001: 0x808002
 12446  	        },
 12447  	        {
 12448  	            0x0: 0x40084010,
 12449  	            0x1000000: 0x4000,
 12450  	            0x2000000: 0x80000,
 12451  	            0x3000000: 0x40080010,
 12452  	            0x4000000: 0x40000010,
 12453  	            0x5000000: 0x40084000,
 12454  	            0x6000000: 0x40004000,
 12455  	            0x7000000: 0x10,
 12456  	            0x8000000: 0x84000,
 12457  	            0x9000000: 0x40004010,
 12458  	            0xa000000: 0x40000000,
 12459  	            0xb000000: 0x84010,
 12460  	            0xc000000: 0x80010,
 12461  	            0xd000000: 0x0,
 12462  	            0xe000000: 0x4010,
 12463  	            0xf000000: 0x40080000,
 12464  	            0x800000: 0x40004000,
 12465  	            0x1800000: 0x84010,
 12466  	            0x2800000: 0x10,
 12467  	            0x3800000: 0x40004010,
 12468  	            0x4800000: 0x40084010,
 12469  	            0x5800000: 0x40000000,
 12470  	            0x6800000: 0x80000,
 12471  	            0x7800000: 0x40080010,
 12472  	            0x8800000: 0x80010,
 12473  	            0x9800000: 0x0,
 12474  	            0xa800000: 0x4000,
 12475  	            0xb800000: 0x40080000,
 12476  	            0xc800000: 0x40000010,
 12477  	            0xd800000: 0x84000,
 12478  	            0xe800000: 0x40084000,
 12479  	            0xf800000: 0x4010,
 12480  	            0x10000000: 0x0,
 12481  	            0x11000000: 0x40080010,
 12482  	            0x12000000: 0x40004010,
 12483  	            0x13000000: 0x40084000,
 12484  	            0x14000000: 0x40080000,
 12485  	            0x15000000: 0x10,
 12486  	            0x16000000: 0x84010,
 12487  	            0x17000000: 0x4000,
 12488  	            0x18000000: 0x4010,
 12489  	            0x19000000: 0x80000,
 12490  	            0x1a000000: 0x80010,
 12491  	            0x1b000000: 0x40000010,
 12492  	            0x1c000000: 0x84000,
 12493  	            0x1d000000: 0x40004000,
 12494  	            0x1e000000: 0x40000000,
 12495  	            0x1f000000: 0x40084010,
 12496  	            0x10800000: 0x84010,
 12497  	            0x11800000: 0x80000,
 12498  	            0x12800000: 0x40080000,
 12499  	            0x13800000: 0x4000,
 12500  	            0x14800000: 0x40004000,
 12501  	            0x15800000: 0x40084010,
 12502  	            0x16800000: 0x10,
 12503  	            0x17800000: 0x40000000,
 12504  	            0x18800000: 0x40084000,
 12505  	            0x19800000: 0x40000010,
 12506  	            0x1a800000: 0x40004010,
 12507  	            0x1b800000: 0x80010,
 12508  	            0x1c800000: 0x0,
 12509  	            0x1d800000: 0x4010,
 12510  	            0x1e800000: 0x40080010,
 12511  	            0x1f800000: 0x84000
 12512  	        },
 12513  	        {
 12514  	            0x0: 0x104,
 12515  	            0x100000: 0x0,
 12516  	            0x200000: 0x4000100,
 12517  	            0x300000: 0x10104,
 12518  	            0x400000: 0x10004,
 12519  	            0x500000: 0x4000004,
 12520  	            0x600000: 0x4010104,
 12521  	            0x700000: 0x4010000,
 12522  	            0x800000: 0x4000000,
 12523  	            0x900000: 0x4010100,
 12524  	            0xa00000: 0x10100,
 12525  	            0xb00000: 0x4010004,
 12526  	            0xc00000: 0x4000104,
 12527  	            0xd00000: 0x10000,
 12528  	            0xe00000: 0x4,
 12529  	            0xf00000: 0x100,
 12530  	            0x80000: 0x4010100,
 12531  	            0x180000: 0x4010004,
 12532  	            0x280000: 0x0,
 12533  	            0x380000: 0x4000100,
 12534  	            0x480000: 0x4000004,
 12535  	            0x580000: 0x10000,
 12536  	            0x680000: 0x10004,
 12537  	            0x780000: 0x104,
 12538  	            0x880000: 0x4,
 12539  	            0x980000: 0x100,
 12540  	            0xa80000: 0x4010000,
 12541  	            0xb80000: 0x10104,
 12542  	            0xc80000: 0x10100,
 12543  	            0xd80000: 0x4000104,
 12544  	            0xe80000: 0x4010104,
 12545  	            0xf80000: 0x4000000,
 12546  	            0x1000000: 0x4010100,
 12547  	            0x1100000: 0x10004,
 12548  	            0x1200000: 0x10000,
 12549  	            0x1300000: 0x4000100,
 12550  	            0x1400000: 0x100,
 12551  	            0x1500000: 0x4010104,
 12552  	            0x1600000: 0x4000004,
 12553  	            0x1700000: 0x0,
 12554  	            0x1800000: 0x4000104,
 12555  	            0x1900000: 0x4000000,
 12556  	            0x1a00000: 0x4,
 12557  	            0x1b00000: 0x10100,
 12558  	            0x1c00000: 0x4010000,
 12559  	            0x1d00000: 0x104,
 12560  	            0x1e00000: 0x10104,
 12561  	            0x1f00000: 0x4010004,
 12562  	            0x1080000: 0x4000000,
 12563  	            0x1180000: 0x104,
 12564  	            0x1280000: 0x4010100,
 12565  	            0x1380000: 0x0,
 12566  	            0x1480000: 0x10004,
 12567  	            0x1580000: 0x4000100,
 12568  	            0x1680000: 0x100,
 12569  	            0x1780000: 0x4010004,
 12570  	            0x1880000: 0x10000,
 12571  	            0x1980000: 0x4010104,
 12572  	            0x1a80000: 0x10104,
 12573  	            0x1b80000: 0x4000004,
 12574  	            0x1c80000: 0x4000104,
 12575  	            0x1d80000: 0x4010000,
 12576  	            0x1e80000: 0x4,
 12577  	            0x1f80000: 0x10100
 12578  	        },
 12579  	        {
 12580  	            0x0: 0x80401000,
 12581  	            0x10000: 0x80001040,
 12582  	            0x20000: 0x401040,
 12583  	            0x30000: 0x80400000,
 12584  	            0x40000: 0x0,
 12585  	            0x50000: 0x401000,
 12586  	            0x60000: 0x80000040,
 12587  	            0x70000: 0x400040,
 12588  	            0x80000: 0x80000000,
 12589  	            0x90000: 0x400000,
 12590  	            0xa0000: 0x40,
 12591  	            0xb0000: 0x80001000,
 12592  	            0xc0000: 0x80400040,
 12593  	            0xd0000: 0x1040,
 12594  	            0xe0000: 0x1000,
 12595  	            0xf0000: 0x80401040,
 12596  	            0x8000: 0x80001040,
 12597  	            0x18000: 0x40,
 12598  	            0x28000: 0x80400040,
 12599  	            0x38000: 0x80001000,
 12600  	            0x48000: 0x401000,
 12601  	            0x58000: 0x80401040,
 12602  	            0x68000: 0x0,
 12603  	            0x78000: 0x80400000,
 12604  	            0x88000: 0x1000,
 12605  	            0x98000: 0x80401000,
 12606  	            0xa8000: 0x400000,
 12607  	            0xb8000: 0x1040,
 12608  	            0xc8000: 0x80000000,
 12609  	            0xd8000: 0x400040,
 12610  	            0xe8000: 0x401040,
 12611  	            0xf8000: 0x80000040,
 12612  	            0x100000: 0x400040,
 12613  	            0x110000: 0x401000,
 12614  	            0x120000: 0x80000040,
 12615  	            0x130000: 0x0,
 12616  	            0x140000: 0x1040,
 12617  	            0x150000: 0x80400040,
 12618  	            0x160000: 0x80401000,
 12619  	            0x170000: 0x80001040,
 12620  	            0x180000: 0x80401040,
 12621  	            0x190000: 0x80000000,
 12622  	            0x1a0000: 0x80400000,
 12623  	            0x1b0000: 0x401040,
 12624  	            0x1c0000: 0x80001000,
 12625  	            0x1d0000: 0x400000,
 12626  	            0x1e0000: 0x40,
 12627  	            0x1f0000: 0x1000,
 12628  	            0x108000: 0x80400000,
 12629  	            0x118000: 0x80401040,
 12630  	            0x128000: 0x0,
 12631  	            0x138000: 0x401000,
 12632  	            0x148000: 0x400040,
 12633  	            0x158000: 0x80000000,
 12634  	            0x168000: 0x80001040,
 12635  	            0x178000: 0x40,
 12636  	            0x188000: 0x80000040,
 12637  	            0x198000: 0x1000,
 12638  	            0x1a8000: 0x80001000,
 12639  	            0x1b8000: 0x80400040,
 12640  	            0x1c8000: 0x1040,
 12641  	            0x1d8000: 0x80401000,
 12642  	            0x1e8000: 0x400000,
 12643  	            0x1f8000: 0x401040
 12644  	        },
 12645  	        {
 12646  	            0x0: 0x80,
 12647  	            0x1000: 0x1040000,
 12648  	            0x2000: 0x40000,
 12649  	            0x3000: 0x20000000,
 12650  	            0x4000: 0x20040080,
 12651  	            0x5000: 0x1000080,
 12652  	            0x6000: 0x21000080,
 12653  	            0x7000: 0x40080,
 12654  	            0x8000: 0x1000000,
 12655  	            0x9000: 0x20040000,
 12656  	            0xa000: 0x20000080,
 12657  	            0xb000: 0x21040080,
 12658  	            0xc000: 0x21040000,
 12659  	            0xd000: 0x0,
 12660  	            0xe000: 0x1040080,
 12661  	            0xf000: 0x21000000,
 12662  	            0x800: 0x1040080,
 12663  	            0x1800: 0x21000080,
 12664  	            0x2800: 0x80,
 12665  	            0x3800: 0x1040000,
 12666  	            0x4800: 0x40000,
 12667  	            0x5800: 0x20040080,
 12668  	            0x6800: 0x21040000,
 12669  	            0x7800: 0x20000000,
 12670  	            0x8800: 0x20040000,
 12671  	            0x9800: 0x0,
 12672  	            0xa800: 0x21040080,
 12673  	            0xb800: 0x1000080,
 12674  	            0xc800: 0x20000080,
 12675  	            0xd800: 0x21000000,
 12676  	            0xe800: 0x1000000,
 12677  	            0xf800: 0x40080,
 12678  	            0x10000: 0x40000,
 12679  	            0x11000: 0x80,
 12680  	            0x12000: 0x20000000,
 12681  	            0x13000: 0x21000080,
 12682  	            0x14000: 0x1000080,
 12683  	            0x15000: 0x21040000,
 12684  	            0x16000: 0x20040080,
 12685  	            0x17000: 0x1000000,
 12686  	            0x18000: 0x21040080,
 12687  	            0x19000: 0x21000000,
 12688  	            0x1a000: 0x1040000,
 12689  	            0x1b000: 0x20040000,
 12690  	            0x1c000: 0x40080,
 12691  	            0x1d000: 0x20000080,
 12692  	            0x1e000: 0x0,
 12693  	            0x1f000: 0x1040080,
 12694  	            0x10800: 0x21000080,
 12695  	            0x11800: 0x1000000,
 12696  	            0x12800: 0x1040000,
 12697  	            0x13800: 0x20040080,
 12698  	            0x14800: 0x20000000,
 12699  	            0x15800: 0x1040080,
 12700  	            0x16800: 0x80,
 12701  	            0x17800: 0x21040000,
 12702  	            0x18800: 0x40080,
 12703  	            0x19800: 0x21040080,
 12704  	            0x1a800: 0x0,
 12705  	            0x1b800: 0x21000000,
 12706  	            0x1c800: 0x1000080,
 12707  	            0x1d800: 0x40000,
 12708  	            0x1e800: 0x20040000,
 12709  	            0x1f800: 0x20000080
 12710  	        },
 12711  	        {
 12712  	            0x0: 0x10000008,
 12713  	            0x100: 0x2000,
 12714  	            0x200: 0x10200000,
 12715  	            0x300: 0x10202008,
 12716  	            0x400: 0x10002000,
 12717  	            0x500: 0x200000,
 12718  	            0x600: 0x200008,
 12719  	            0x700: 0x10000000,
 12720  	            0x800: 0x0,
 12721  	            0x900: 0x10002008,
 12722  	            0xa00: 0x202000,
 12723  	            0xb00: 0x8,
 12724  	            0xc00: 0x10200008,
 12725  	            0xd00: 0x202008,
 12726  	            0xe00: 0x2008,
 12727  	            0xf00: 0x10202000,
 12728  	            0x80: 0x10200000,
 12729  	            0x180: 0x10202008,
 12730  	            0x280: 0x8,
 12731  	            0x380: 0x200000,
 12732  	            0x480: 0x202008,
 12733  	            0x580: 0x10000008,
 12734  	            0x680: 0x10002000,
 12735  	            0x780: 0x2008,
 12736  	            0x880: 0x200008,
 12737  	            0x980: 0x2000,
 12738  	            0xa80: 0x10002008,
 12739  	            0xb80: 0x10200008,
 12740  	            0xc80: 0x0,
 12741  	            0xd80: 0x10202000,
 12742  	            0xe80: 0x202000,
 12743  	            0xf80: 0x10000000,
 12744  	            0x1000: 0x10002000,
 12745  	            0x1100: 0x10200008,
 12746  	            0x1200: 0x10202008,
 12747  	            0x1300: 0x2008,
 12748  	            0x1400: 0x200000,
 12749  	            0x1500: 0x10000000,
 12750  	            0x1600: 0x10000008,
 12751  	            0x1700: 0x202000,
 12752  	            0x1800: 0x202008,
 12753  	            0x1900: 0x0,
 12754  	            0x1a00: 0x8,
 12755  	            0x1b00: 0x10200000,
 12756  	            0x1c00: 0x2000,
 12757  	            0x1d00: 0x10002008,
 12758  	            0x1e00: 0x10202000,
 12759  	            0x1f00: 0x200008,
 12760  	            0x1080: 0x8,
 12761  	            0x1180: 0x202000,
 12762  	            0x1280: 0x200000,
 12763  	            0x1380: 0x10000008,
 12764  	            0x1480: 0x10002000,
 12765  	            0x1580: 0x2008,
 12766  	            0x1680: 0x10202008,
 12767  	            0x1780: 0x10200000,
 12768  	            0x1880: 0x10202000,
 12769  	            0x1980: 0x10200008,
 12770  	            0x1a80: 0x2000,
 12771  	            0x1b80: 0x202008,
 12772  	            0x1c80: 0x200008,
 12773  	            0x1d80: 0x0,
 12774  	            0x1e80: 0x10000000,
 12775  	            0x1f80: 0x10002008
 12776  	        },
 12777  	        {
 12778  	            0x0: 0x100000,
 12779  	            0x10: 0x2000401,
 12780  	            0x20: 0x400,
 12781  	            0x30: 0x100401,
 12782  	            0x40: 0x2100401,
 12783  	            0x50: 0x0,
 12784  	            0x60: 0x1,
 12785  	            0x70: 0x2100001,
 12786  	            0x80: 0x2000400,
 12787  	            0x90: 0x100001,
 12788  	            0xa0: 0x2000001,
 12789  	            0xb0: 0x2100400,
 12790  	            0xc0: 0x2100000,
 12791  	            0xd0: 0x401,
 12792  	            0xe0: 0x100400,
 12793  	            0xf0: 0x2000000,
 12794  	            0x8: 0x2100001,
 12795  	            0x18: 0x0,
 12796  	            0x28: 0x2000401,
 12797  	            0x38: 0x2100400,
 12798  	            0x48: 0x100000,
 12799  	            0x58: 0x2000001,
 12800  	            0x68: 0x2000000,
 12801  	            0x78: 0x401,
 12802  	            0x88: 0x100401,
 12803  	            0x98: 0x2000400,
 12804  	            0xa8: 0x2100000,
 12805  	            0xb8: 0x100001,
 12806  	            0xc8: 0x400,
 12807  	            0xd8: 0x2100401,
 12808  	            0xe8: 0x1,
 12809  	            0xf8: 0x100400,
 12810  	            0x100: 0x2000000,
 12811  	            0x110: 0x100000,
 12812  	            0x120: 0x2000401,
 12813  	            0x130: 0x2100001,
 12814  	            0x140: 0x100001,
 12815  	            0x150: 0x2000400,
 12816  	            0x160: 0x2100400,
 12817  	            0x170: 0x100401,
 12818  	            0x180: 0x401,
 12819  	            0x190: 0x2100401,
 12820  	            0x1a0: 0x100400,
 12821  	            0x1b0: 0x1,
 12822  	            0x1c0: 0x0,
 12823  	            0x1d0: 0x2100000,
 12824  	            0x1e0: 0x2000001,
 12825  	            0x1f0: 0x400,
 12826  	            0x108: 0x100400,
 12827  	            0x118: 0x2000401,
 12828  	            0x128: 0x2100001,
 12829  	            0x138: 0x1,
 12830  	            0x148: 0x2000000,
 12831  	            0x158: 0x100000,
 12832  	            0x168: 0x401,
 12833  	            0x178: 0x2100400,
 12834  	            0x188: 0x2000001,
 12835  	            0x198: 0x2100000,
 12836  	            0x1a8: 0x0,
 12837  	            0x1b8: 0x2100401,
 12838  	            0x1c8: 0x100401,
 12839  	            0x1d8: 0x400,
 12840  	            0x1e8: 0x2000400,
 12841  	            0x1f8: 0x100001
 12842  	        },
 12843  	        {
 12844  	            0x0: 0x8000820,
 12845  	            0x1: 0x20000,
 12846  	            0x2: 0x8000000,
 12847  	            0x3: 0x20,
 12848  	            0x4: 0x20020,
 12849  	            0x5: 0x8020820,
 12850  	            0x6: 0x8020800,
 12851  	            0x7: 0x800,
 12852  	            0x8: 0x8020000,
 12853  	            0x9: 0x8000800,
 12854  	            0xa: 0x20800,
 12855  	            0xb: 0x8020020,
 12856  	            0xc: 0x820,
 12857  	            0xd: 0x0,
 12858  	            0xe: 0x8000020,
 12859  	            0xf: 0x20820,
 12860  	            0x80000000: 0x800,
 12861  	            0x80000001: 0x8020820,
 12862  	            0x80000002: 0x8000820,
 12863  	            0x80000003: 0x8000000,
 12864  	            0x80000004: 0x8020000,
 12865  	            0x80000005: 0x20800,
 12866  	            0x80000006: 0x20820,
 12867  	            0x80000007: 0x20,
 12868  	            0x80000008: 0x8000020,
 12869  	            0x80000009: 0x820,
 12870  	            0x8000000a: 0x20020,
 12871  	            0x8000000b: 0x8020800,
 12872  	            0x8000000c: 0x0,
 12873  	            0x8000000d: 0x8020020,
 12874  	            0x8000000e: 0x8000800,
 12875  	            0x8000000f: 0x20000,
 12876  	            0x10: 0x20820,
 12877  	            0x11: 0x8020800,
 12878  	            0x12: 0x20,
 12879  	            0x13: 0x800,
 12880  	            0x14: 0x8000800,
 12881  	            0x15: 0x8000020,
 12882  	            0x16: 0x8020020,
 12883  	            0x17: 0x20000,
 12884  	            0x18: 0x0,
 12885  	            0x19: 0x20020,
 12886  	            0x1a: 0x8020000,
 12887  	            0x1b: 0x8000820,
 12888  	            0x1c: 0x8020820,
 12889  	            0x1d: 0x20800,
 12890  	            0x1e: 0x820,
 12891  	            0x1f: 0x8000000,
 12892  	            0x80000010: 0x20000,
 12893  	            0x80000011: 0x800,
 12894  	            0x80000012: 0x8020020,
 12895  	            0x80000013: 0x20820,
 12896  	            0x80000014: 0x20,
 12897  	            0x80000015: 0x8020000,
 12898  	            0x80000016: 0x8000000,
 12899  	            0x80000017: 0x8000820,
 12900  	            0x80000018: 0x8020820,
 12901  	            0x80000019: 0x8000020,
 12902  	            0x8000001a: 0x8000800,
 12903  	            0x8000001b: 0x0,
 12904  	            0x8000001c: 0x20800,
 12905  	            0x8000001d: 0x820,
 12906  	            0x8000001e: 0x20020,
 12907  	            0x8000001f: 0x8020800
 12908  	        }
 12909  	    ];
 12910  
 12911  	    // Masks that select the SBOX input
 12912  	    var SBOX_MASK = [
 12913  	        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
 12914  	        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
 12915  	    ];
 12916  
 12917  	    /**
 12918  	     * DES block cipher algorithm.
 12919  	     */
 12920  	    var DES = C_algo.DES = BlockCipher.extend({
 12921  	        _doReset: function () {
 12922  	            // Shortcuts
 12923  	            var key = this._key;
 12924  	            var keyWords = key.words;
 12925  
 12926  	            // Select 56 bits according to PC1
 12927  	            var keyBits = [];
 12928  	            for (var i = 0; i < 56; i++) {
 12929  	                var keyBitPos = PC1[i] - 1;
 12930  	                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
 12931  	            }
 12932  
 12933  	            // Assemble 16 subkeys
 12934  	            var subKeys = this._subKeys = [];
 12935  	            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
 12936  	                // Create subkey
 12937  	                var subKey = subKeys[nSubKey] = [];
 12938  
 12939  	                // Shortcut
 12940  	                var bitShift = BIT_SHIFTS[nSubKey];
 12941  
 12942  	                // Select 48 bits according to PC2
 12943  	                for (var i = 0; i < 24; i++) {
 12944  	                    // Select from the left 28 key bits
 12945  	                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
 12946  
 12947  	                    // Select from the right 28 key bits
 12948  	                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
 12949  	                }
 12950  
 12951  	                // Since each subkey is applied to an expanded 32-bit input,
 12952  	                // the subkey can be broken into 8 values scaled to 32-bits,
 12953  	                // which allows the key to be used without expansion
 12954  	                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
 12955  	                for (var i = 1; i < 7; i++) {
 12956  	                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
 12957  	                }
 12958  	                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
 12959  	            }
 12960  
 12961  	            // Compute inverse subkeys
 12962  	            var invSubKeys = this._invSubKeys = [];
 12963  	            for (var i = 0; i < 16; i++) {
 12964  	                invSubKeys[i] = subKeys[15 - i];
 12965  	            }
 12966  	        },
 12967  
 12968  	        encryptBlock: function (M, offset) {
 12969  	            this._doCryptBlock(M, offset, this._subKeys);
 12970  	        },
 12971  
 12972  	        decryptBlock: function (M, offset) {
 12973  	            this._doCryptBlock(M, offset, this._invSubKeys);
 12974  	        },
 12975  
 12976  	        _doCryptBlock: function (M, offset, subKeys) {
 12977  	            // Get input
 12978  	            this._lBlock = M[offset];
 12979  	            this._rBlock = M[offset + 1];
 12980  
 12981  	            // Initial permutation
 12982  	            exchangeLR.call(this, 4,  0x0f0f0f0f);
 12983  	            exchangeLR.call(this, 16, 0x0000ffff);
 12984  	            exchangeRL.call(this, 2,  0x33333333);
 12985  	            exchangeRL.call(this, 8,  0x00ff00ff);
 12986  	            exchangeLR.call(this, 1,  0x55555555);
 12987  
 12988  	            // Rounds
 12989  	            for (var round = 0; round < 16; round++) {
 12990  	                // Shortcuts
 12991  	                var subKey = subKeys[round];
 12992  	                var lBlock = this._lBlock;
 12993  	                var rBlock = this._rBlock;
 12994  
 12995  	                // Feistel function
 12996  	                var f = 0;
 12997  	                for (var i = 0; i < 8; i++) {
 12998  	                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
 12999  	                }
 13000  	                this._lBlock = rBlock;
 13001  	                this._rBlock = lBlock ^ f;
 13002  	            }
 13003  
 13004  	            // Undo swap from last round
 13005  	            var t = this._lBlock;
 13006  	            this._lBlock = this._rBlock;
 13007  	            this._rBlock = t;
 13008  
 13009  	            // Final permutation
 13010  	            exchangeLR.call(this, 1,  0x55555555);
 13011  	            exchangeRL.call(this, 8,  0x00ff00ff);
 13012  	            exchangeRL.call(this, 2,  0x33333333);
 13013  	            exchangeLR.call(this, 16, 0x0000ffff);
 13014  	            exchangeLR.call(this, 4,  0x0f0f0f0f);
 13015  
 13016  	            // Set output
 13017  	            M[offset] = this._lBlock;
 13018  	            M[offset + 1] = this._rBlock;
 13019  	        },
 13020  
 13021  	        keySize: 64/32,
 13022  
 13023  	        ivSize: 64/32,
 13024  
 13025  	        blockSize: 64/32
 13026  	    });
 13027  
 13028  	    // Swap bits across the left and right words
 13029  	    function exchangeLR(offset, mask) {
 13030  	        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
 13031  	        this._rBlock ^= t;
 13032  	        this._lBlock ^= t << offset;
 13033  	    }
 13034  
 13035  	    function exchangeRL(offset, mask) {
 13036  	        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
 13037  	        this._lBlock ^= t;
 13038  	        this._rBlock ^= t << offset;
 13039  	    }
 13040  
 13041  	    /**
 13042  	     * Shortcut functions to the cipher's object interface.
 13043  	     *
 13044  	     * @example
 13045  	     *
 13046  	     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
 13047  	     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);
 13048  	     */
 13049  	    C.DES = BlockCipher._createHelper(DES);
 13050  
 13051  	    /**
 13052  	     * Triple-DES block cipher algorithm.
 13053  	     */
 13054  	    var TripleDES = C_algo.TripleDES = BlockCipher.extend({
 13055  	        _doReset: function () {
 13056  	            // Shortcuts
 13057  	            var key = this._key;
 13058  	            var keyWords = key.words;
 13059  
 13060  	            // Create DES instances
 13061  	            this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
 13062  	            this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
 13063  	            this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));
 13064  	        },
 13065  
 13066  	        encryptBlock: function (M, offset) {
 13067  	            this._des1.encryptBlock(M, offset);
 13068  	            this._des2.decryptBlock(M, offset);
 13069  	            this._des3.encryptBlock(M, offset);
 13070  	        },
 13071  
 13072  	        decryptBlock: function (M, offset) {
 13073  	            this._des3.decryptBlock(M, offset);
 13074  	            this._des2.encryptBlock(M, offset);
 13075  	            this._des1.decryptBlock(M, offset);
 13076  	        },
 13077  
 13078  	        keySize: 192/32,
 13079  
 13080  	        ivSize: 64/32,
 13081  
 13082  	        blockSize: 64/32
 13083  	    });
 13084  
 13085  	    /**
 13086  	     * Shortcut functions to the cipher's object interface.
 13087  	     *
 13088  	     * @example
 13089  	     *
 13090  	     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
 13091  	     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
 13092  	     */
 13093  	    C.TripleDES = BlockCipher._createHelper(TripleDES);
 13094  	}());
 13095  
 13096  
 13097  	return CryptoJS.TripleDES;
 13098  
 13099  }));
 13100  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],84:[function(require,module,exports){
 13101  ;(function (root, factory) {
 13102  	if (typeof exports === "object") {
 13103  		// CommonJS
 13104  		module.exports = exports = factory(require("./core"));
 13105  	}
 13106  	else if (typeof define === "function" && define.amd) {
 13107  		// AMD
 13108  		define(["./core"], factory);
 13109  	}
 13110  	else {
 13111  		// Global (browser)
 13112  		factory(root.CryptoJS);
 13113  	}
 13114  }(this, function (CryptoJS) {
 13115  
 13116  	(function (undefined) {
 13117  	    // Shortcuts
 13118  	    var C = CryptoJS;
 13119  	    var C_lib = C.lib;
 13120  	    var Base = C_lib.Base;
 13121  	    var X32WordArray = C_lib.WordArray;
 13122  
 13123  	    /**
 13124  	     * x64 namespace.
 13125  	     */
 13126  	    var C_x64 = C.x64 = {};
 13127  
 13128  	    /**
 13129  	     * A 64-bit word.
 13130  	     */
 13131  	    var X64Word = C_x64.Word = Base.extend({
 13132  	        /**
 13133  	         * Initializes a newly created 64-bit word.
 13134  	         *
 13135  	         * @param {number} high The high 32 bits.
 13136  	         * @param {number} low The low 32 bits.
 13137  	         *
 13138  	         * @example
 13139  	         *
 13140  	         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
 13141  	         */
 13142  	        init: function (high, low) {
 13143  	            this.high = high;
 13144  	            this.low = low;
 13145  	        }
 13146  
 13147  	        /**
 13148  	         * Bitwise NOTs this word.
 13149  	         *
 13150  	         * @return {X64Word} A new x64-Word object after negating.
 13151  	         *
 13152  	         * @example
 13153  	         *
 13154  	         *     var negated = x64Word.not();
 13155  	         */
 13156  	        // not: function () {
 13157  	            // var high = ~this.high;
 13158  	            // var low = ~this.low;
 13159  
 13160  	            // return X64Word.create(high, low);
 13161  	        // },
 13162  
 13163  	        /**
 13164  	         * Bitwise ANDs this word with the passed word.
 13165  	         *
 13166  	         * @param {X64Word} word The x64-Word to AND with this word.
 13167  	         *
 13168  	         * @return {X64Word} A new x64-Word object after ANDing.
 13169  	         *
 13170  	         * @example
 13171  	         *
 13172  	         *     var anded = x64Word.and(anotherX64Word);
 13173  	         */
 13174  	        // and: function (word) {
 13175  	            // var high = this.high & word.high;
 13176  	            // var low = this.low & word.low;
 13177  
 13178  	            // return X64Word.create(high, low);
 13179  	        // },
 13180  
 13181  	        /**
 13182  	         * Bitwise ORs this word with the passed word.
 13183  	         *
 13184  	         * @param {X64Word} word The x64-Word to OR with this word.
 13185  	         *
 13186  	         * @return {X64Word} A new x64-Word object after ORing.
 13187  	         *
 13188  	         * @example
 13189  	         *
 13190  	         *     var ored = x64Word.or(anotherX64Word);
 13191  	         */
 13192  	        // or: function (word) {
 13193  	            // var high = this.high | word.high;
 13194  	            // var low = this.low | word.low;
 13195  
 13196  	            // return X64Word.create(high, low);
 13197  	        // },
 13198  
 13199  	        /**
 13200  	         * Bitwise XORs this word with the passed word.
 13201  	         *
 13202  	         * @param {X64Word} word The x64-Word to XOR with this word.
 13203  	         *
 13204  	         * @return {X64Word} A new x64-Word object after XORing.
 13205  	         *
 13206  	         * @example
 13207  	         *
 13208  	         *     var xored = x64Word.xor(anotherX64Word);
 13209  	         */
 13210  	        // xor: function (word) {
 13211  	            // var high = this.high ^ word.high;
 13212  	            // var low = this.low ^ word.low;
 13213  
 13214  	            // return X64Word.create(high, low);
 13215  	        // },
 13216  
 13217  	        /**
 13218  	         * Shifts this word n bits to the left.
 13219  	         *
 13220  	         * @param {number} n The number of bits to shift.
 13221  	         *
 13222  	         * @return {X64Word} A new x64-Word object after shifting.
 13223  	         *
 13224  	         * @example
 13225  	         *
 13226  	         *     var shifted = x64Word.shiftL(25);
 13227  	         */
 13228  	        // shiftL: function (n) {
 13229  	            // if (n < 32) {
 13230  	                // var high = (this.high << n) | (this.low >>> (32 - n));
 13231  	                // var low = this.low << n;
 13232  	            // } else {
 13233  	                // var high = this.low << (n - 32);
 13234  	                // var low = 0;
 13235  	            // }
 13236  
 13237  	            // return X64Word.create(high, low);
 13238  	        // },
 13239  
 13240  	        /**
 13241  	         * Shifts this word n bits to the right.
 13242  	         *
 13243  	         * @param {number} n The number of bits to shift.
 13244  	         *
 13245  	         * @return {X64Word} A new x64-Word object after shifting.
 13246  	         *
 13247  	         * @example
 13248  	         *
 13249  	         *     var shifted = x64Word.shiftR(7);
 13250  	         */
 13251  	        // shiftR: function (n) {
 13252  	            // if (n < 32) {
 13253  	                // var low = (this.low >>> n) | (this.high << (32 - n));
 13254  	                // var high = this.high >>> n;
 13255  	            // } else {
 13256  	                // var low = this.high >>> (n - 32);
 13257  	                // var high = 0;
 13258  	            // }
 13259  
 13260  	            // return X64Word.create(high, low);
 13261  	        // },
 13262  
 13263  	        /**
 13264  	         * Rotates this word n bits to the left.
 13265  	         *
 13266  	         * @param {number} n The number of bits to rotate.
 13267  	         *
 13268  	         * @return {X64Word} A new x64-Word object after rotating.
 13269  	         *
 13270  	         * @example
 13271  	         *
 13272  	         *     var rotated = x64Word.rotL(25);
 13273  	         */
 13274  	        // rotL: function (n) {
 13275  	            // return this.shiftL(n).or(this.shiftR(64 - n));
 13276  	        // },
 13277  
 13278  	        /**
 13279  	         * Rotates this word n bits to the right.
 13280  	         *
 13281  	         * @param {number} n The number of bits to rotate.
 13282  	         *
 13283  	         * @return {X64Word} A new x64-Word object after rotating.
 13284  	         *
 13285  	         * @example
 13286  	         *
 13287  	         *     var rotated = x64Word.rotR(7);
 13288  	         */
 13289  	        // rotR: function (n) {
 13290  	            // return this.shiftR(n).or(this.shiftL(64 - n));
 13291  	        // },
 13292  
 13293  	        /**
 13294  	         * Adds this word with the passed word.
 13295  	         *
 13296  	         * @param {X64Word} word The x64-Word to add with this word.
 13297  	         *
 13298  	         * @return {X64Word} A new x64-Word object after adding.
 13299  	         *
 13300  	         * @example
 13301  	         *
 13302  	         *     var added = x64Word.add(anotherX64Word);
 13303  	         */
 13304  	        // add: function (word) {
 13305  	            // var low = (this.low + word.low) | 0;
 13306  	            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
 13307  	            // var high = (this.high + word.high + carry) | 0;
 13308  
 13309  	            // return X64Word.create(high, low);
 13310  	        // }
 13311  	    });
 13312  
 13313  	    /**
 13314  	     * An array of 64-bit words.
 13315  	     *
 13316  	     * @property {Array} words The array of CryptoJS.x64.Word objects.
 13317  	     * @property {number} sigBytes The number of significant bytes in this word array.
 13318  	     */
 13319  	    var X64WordArray = C_x64.WordArray = Base.extend({
 13320  	        /**
 13321  	         * Initializes a newly created word array.
 13322  	         *
 13323  	         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
 13324  	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
 13325  	         *
 13326  	         * @example
 13327  	         *
 13328  	         *     var wordArray = CryptoJS.x64.WordArray.create();
 13329  	         *
 13330  	         *     var wordArray = CryptoJS.x64.WordArray.create([
 13331  	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
 13332  	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
 13333  	         *     ]);
 13334  	         *
 13335  	         *     var wordArray = CryptoJS.x64.WordArray.create([
 13336  	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
 13337  	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
 13338  	         *     ], 10);
 13339  	         */
 13340  	        init: function (words, sigBytes) {
 13341  	            words = this.words = words || [];
 13342  
 13343  	            if (sigBytes != undefined) {
 13344  	                this.sigBytes = sigBytes;
 13345  	            } else {
 13346  	                this.sigBytes = words.length * 8;
 13347  	            }
 13348  	        },
 13349  
 13350  	        /**
 13351  	         * Converts this 64-bit word array to a 32-bit word array.
 13352  	         *
 13353  	         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
 13354  	         *
 13355  	         * @example
 13356  	         *
 13357  	         *     var x32WordArray = x64WordArray.toX32();
 13358  	         */
 13359  	        toX32: function () {
 13360  	            // Shortcuts
 13361  	            var x64Words = this.words;
 13362  	            var x64WordsLength = x64Words.length;
 13363  
 13364  	            // Convert
 13365  	            var x32Words = [];
 13366  	            for (var i = 0; i < x64WordsLength; i++) {
 13367  	                var x64Word = x64Words[i];
 13368  	                x32Words.push(x64Word.high);
 13369  	                x32Words.push(x64Word.low);
 13370  	            }
 13371  
 13372  	            return X32WordArray.create(x32Words, this.sigBytes);
 13373  	        },
 13374  
 13375  	        /**
 13376  	         * Creates a copy of this word array.
 13377  	         *
 13378  	         * @return {X64WordArray} The clone.
 13379  	         *
 13380  	         * @example
 13381  	         *
 13382  	         *     var clone = x64WordArray.clone();
 13383  	         */
 13384  	        clone: function () {
 13385  	            var clone = Base.clone.call(this);
 13386  
 13387  	            // Clone "words" array
 13388  	            var words = clone.words = this.words.slice(0);
 13389  
 13390  	            // Clone each X64Word object
 13391  	            var wordsLength = words.length;
 13392  	            for (var i = 0; i < wordsLength; i++) {
 13393  	                words[i] = words[i].clone();
 13394  	            }
 13395  
 13396  	            return clone;
 13397  	        }
 13398  	    });
 13399  	}());
 13400  
 13401  
 13402  	return CryptoJS;
 13403  
 13404  }));
 13405  },{"./core":53}],85:[function(require,module,exports){
 13406  /*! https://mths.be/utf8js v2.1.2 by @mathias */
 13407  ;(function(root) {
 13408  
 13409  	// Detect free variables `exports`
 13410  	var freeExports = typeof exports == 'object' && exports;
 13411  
 13412  	// Detect free variable `module`
 13413  	var freeModule = typeof module == 'object' && module &&
 13414  		module.exports == freeExports && module;
 13415  
 13416  	// Detect free variable `global`, from Node.js or Browserified code,
 13417  	// and use it as `root`
 13418  	var freeGlobal = typeof global == 'object' && global;
 13419  	if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
 13420  		root = freeGlobal;
 13421  	}
 13422  
 13423  	/*--------------------------------------------------------------------------*/
 13424  
 13425  	var stringFromCharCode = String.fromCharCode;
 13426  
 13427  	// Taken from https://mths.be/punycode
 13428  	function ucs2decode(string) {
 13429  		var output = [];
 13430  		var counter = 0;
 13431  		var length = string.length;
 13432  		var value;
 13433  		var extra;
 13434  		while (counter < length) {
 13435  			value = string.charCodeAt(counter++);
 13436  			if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
 13437  				// high surrogate, and there is a next character
 13438  				extra = string.charCodeAt(counter++);
 13439  				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
 13440  					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
 13441  				} else {
 13442  					// unmatched surrogate; only append this code unit, in case the next
 13443  					// code unit is the high surrogate of a surrogate pair
 13444  					output.push(value);
 13445  					counter--;
 13446  				}
 13447  			} else {
 13448  				output.push(value);
 13449  			}
 13450  		}
 13451  		return output;
 13452  	}
 13453  
 13454  	// Taken from https://mths.be/punycode
 13455  	function ucs2encode(array) {
 13456  		var length = array.length;
 13457  		var index = -1;
 13458  		var value;
 13459  		var output = '';
 13460  		while (++index < length) {
 13461  			value = array[index];
 13462  			if (value > 0xFFFF) {
 13463  				value -= 0x10000;
 13464  				output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
 13465  				value = 0xDC00 | value & 0x3FF;
 13466  			}
 13467  			output += stringFromCharCode(value);
 13468  		}
 13469  		return output;
 13470  	}
 13471  
 13472  	function checkScalarValue(codePoint) {
 13473  		if (codePoint >= 0xD800 && codePoint <= 0xDFFF) {
 13474  			throw Error(
 13475  				'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +
 13476  				' is not a scalar value'
 13477  			);
 13478  		}
 13479  	}
 13480  	/*--------------------------------------------------------------------------*/
 13481  
 13482  	function createByte(codePoint, shift) {
 13483  		return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);
 13484  	}
 13485  
 13486  	function encodeCodePoint(codePoint) {
 13487  		if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence
 13488  			return stringFromCharCode(codePoint);
 13489  		}
 13490  		var symbol = '';
 13491  		if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence
 13492  			symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);
 13493  		}
 13494  		else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence
 13495  			checkScalarValue(codePoint);
 13496  			symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);
 13497  			symbol += createByte(codePoint, 6);
 13498  		}
 13499  		else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence
 13500  			symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);
 13501  			symbol += createByte(codePoint, 12);
 13502  			symbol += createByte(codePoint, 6);
 13503  		}
 13504  		symbol += stringFromCharCode((codePoint & 0x3F) | 0x80);
 13505  		return symbol;
 13506  	}
 13507  
 13508  	function utf8encode(string) {
 13509  		var codePoints = ucs2decode(string);
 13510  		var length = codePoints.length;
 13511  		var index = -1;
 13512  		var codePoint;
 13513  		var byteString = '';
 13514  		while (++index < length) {
 13515  			codePoint = codePoints[index];
 13516  			byteString += encodeCodePoint(codePoint);
 13517  		}
 13518  		return byteString;
 13519  	}
 13520  
 13521  	/*--------------------------------------------------------------------------*/
 13522  
 13523  	function readContinuationByte() {
 13524  		if (byteIndex >= byteCount) {
 13525  			throw Error('Invalid byte index');
 13526  		}
 13527  
 13528  		var continuationByte = byteArray[byteIndex] & 0xFF;
 13529  		byteIndex++;
 13530  
 13531  		if ((continuationByte & 0xC0) == 0x80) {
 13532  			return continuationByte & 0x3F;
 13533  		}
 13534  
 13535  		// If we end up here, it’s not a continuation byte
 13536  		throw Error('Invalid continuation byte');
 13537  	}
 13538  
 13539  	function decodeSymbol() {
 13540  		var byte1;
 13541  		var byte2;
 13542  		var byte3;
 13543  		var byte4;
 13544  		var codePoint;
 13545  
 13546  		if (byteIndex > byteCount) {
 13547  			throw Error('Invalid byte index');
 13548  		}
 13549  
 13550  		if (byteIndex == byteCount) {
 13551  			return false;
 13552  		}
 13553  
 13554  		// Read first byte
 13555  		byte1 = byteArray[byteIndex] & 0xFF;
 13556  		byteIndex++;
 13557  
 13558  		// 1-byte sequence (no continuation bytes)
 13559  		if ((byte1 & 0x80) == 0) {
 13560  			return byte1;
 13561  		}
 13562  
 13563  		// 2-byte sequence
 13564  		if ((byte1 & 0xE0) == 0xC0) {
 13565  			byte2 = readContinuationByte();
 13566  			codePoint = ((byte1 & 0x1F) << 6) | byte2;
 13567  			if (codePoint >= 0x80) {
 13568  				return codePoint;
 13569  			} else {
 13570  				throw Error('Invalid continuation byte');
 13571  			}
 13572  		}
 13573  
 13574  		// 3-byte sequence (may include unpaired surrogates)
 13575  		if ((byte1 & 0xF0) == 0xE0) {
 13576  			byte2 = readContinuationByte();
 13577  			byte3 = readContinuationByte();
 13578  			codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;
 13579  			if (codePoint >= 0x0800) {
 13580  				checkScalarValue(codePoint);
 13581  				return codePoint;
 13582  			} else {
 13583  				throw Error('Invalid continuation byte');
 13584  			}
 13585  		}
 13586  
 13587  		// 4-byte sequence
 13588  		if ((byte1 & 0xF8) == 0xF0) {
 13589  			byte2 = readContinuationByte();
 13590  			byte3 = readContinuationByte();
 13591  			byte4 = readContinuationByte();
 13592  			codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |
 13593  				(byte3 << 0x06) | byte4;
 13594  			if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {
 13595  				return codePoint;
 13596  			}
 13597  		}
 13598  
 13599  		throw Error('Invalid UTF-8 detected');
 13600  	}
 13601  
 13602  	var byteArray;
 13603  	var byteCount;
 13604  	var byteIndex;
 13605  	function utf8decode(byteString) {
 13606  		byteArray = ucs2decode(byteString);
 13607  		byteCount = byteArray.length;
 13608  		byteIndex = 0;
 13609  		var codePoints = [];
 13610  		var tmp;
 13611  		while ((tmp = decodeSymbol()) !== false) {
 13612  			codePoints.push(tmp);
 13613  		}
 13614  		return ucs2encode(codePoints);
 13615  	}
 13616  
 13617  	/*--------------------------------------------------------------------------*/
 13618  
 13619  	var utf8 = {
 13620  		'version': '2.1.2',
 13621  		'encode': utf8encode,
 13622  		'decode': utf8decode
 13623  	};
 13624  
 13625  	// Some AMD build optimizers, like r.js, check for specific condition patterns
 13626  	// like the following:
 13627  	if (
 13628  		typeof define == 'function' &&
 13629  		typeof define.amd == 'object' &&
 13630  		define.amd
 13631  	) {
 13632  		define(function() {
 13633  			return utf8;
 13634  		});
 13635  	}	else if (freeExports && !freeExports.nodeType) {
 13636  		if (freeModule) { // in Node.js or RingoJS v0.8.0+
 13637  			freeModule.exports = utf8;
 13638  		} else { // in Narwhal or RingoJS v0.7.0-
 13639  			var object = {};
 13640  			var hasOwnProperty = object.hasOwnProperty;
 13641  			for (var key in utf8) {
 13642  				hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);
 13643  			}
 13644  		}
 13645  	} else { // in Rhino or a web browser
 13646  		root.utf8 = utf8;
 13647  	}
 13648  
 13649  }(this));
 13650  
 13651  },{}],86:[function(require,module,exports){
 13652  module.exports = XMLHttpRequest;
 13653  
 13654  },{}],"bignumber.js":[function(require,module,exports){
 13655  'use strict';
 13656  
 13657  module.exports = BigNumber; // jshint ignore:line
 13658  
 13659  
 13660  },{}],"web3":[function(require,module,exports){
 13661  var Web3 = require('./lib/web3');
 13662  
 13663  // don't override global variable
 13664  if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') {
 13665      window.Web3 = Web3;
 13666  }
 13667  
 13668  module.exports = Web3;
 13669  
 13670  },{"./lib/web3":22}]},{},["web3"])
 13671  //# sourceMappingURL=web3-light.js.map