{
  "version": 3,
  "sources": [
    "node_modules/browserify/node_modules/browser-pack/_prelude.js",
    "lib/solidity/abi.js",
    "lib/solidity/coder.js",
    "lib/solidity/formatters.js",
    "lib/solidity/param.js",
    "lib/solidity/utils.js",
    "lib/utils/browser-xhr.js",
    "lib/utils/config.js",
    "lib/utils/utils.js",
    "lib/version.json",
    "lib/web3.js",
    "lib/web3/contract.js",
    "lib/web3/db.js",
    "lib/web3/errors.js",
    "lib/web3/eth.js",
    "lib/web3/event.js",
    "lib/web3/filter.js",
    "lib/web3/formatters.js",
    "lib/web3/function.js",
    "lib/web3/httpprovider.js",
    "lib/web3/jsonrpc.js",
    "lib/web3/method.js",
    "lib/web3/net.js",
    "lib/web3/property.js",
    "lib/web3/qtsync.js",
    "lib/web3/requestmanager.js",
    "lib/web3/shh.js",
    "lib/web3/watches.js",
    "node_modules/browserify/lib/_empty.js",
    "bignumber.js",
    "index.js"
  ],
  "names": [],
  "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1dA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3nFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
  "file": "generated.js",
  "sourceRoot": "",
  "sourcesContent": [
    "(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})",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file abi.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @author Gav Wood <g@ethdev.com>\n * @date 2014\n */\n\nvar coder = require('./coder');\nvar utils = require('./utils');\n\nvar formatConstructorParams = function (abi, params) {\n    var constructor = utils.getConstructor(abi, params.length);\n    if (!constructor) {\n        if (params.length > 0) {\n            console.warn(\"didn't found matching constructor, using default one\");\n        }\n        return '';\n    }\n\n    return coder.encodeParams(constructor.inputs.map(function (input) {\n        return input.type;\n    }), params);\n};\n\nmodule.exports = {\n    formatConstructorParams: formatConstructorParams\n};\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file coder.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar BigNumber = require('bignumber.js');\nvar utils = require('../utils/utils');\nvar f = require('./formatters');\nvar SolidityParam = require('./param');\n\n/**\n * Should be used to check if a type is an array type\n *\n * @method isArrayType\n * @param {String} type\n * @return {Bool} true is the type is an array, otherwise false\n */\nvar isArrayType = function (type) {\n    return type.slice(-2) === '[]';\n};\n\n/**\n * SolidityType prototype is used to encode/decode solidity params of certain type\n */\nvar SolidityType = function (config) {\n    this._name = config.name;\n    this._match = config.match;\n    this._mode = config.mode;\n    this._inputFormatter = config.inputFormatter;\n    this._outputFormatter = config.outputFormatter;\n};\n\n/**\n * Should be used to determine if this SolidityType do match given type\n *\n * @method isType\n * @param {String} name\n * @return {Bool} true if type match this SolidityType, otherwise false\n */\nSolidityType.prototype.isType = function (name) {\n    if (this._match === 'strict') {\n        return this._name === name || (name.indexOf(this._name) === 0 && name.slice(this._name.length) === '[]');\n    } else if (this._match === 'prefix') {\n        // TODO better type detection!\n        return name.indexOf(this._name) === 0;\n    }\n};\n\n/**\n * Should be used to transform plain param to SolidityParam object\n *\n * @method formatInput\n * @param {Object} param - plain object, or an array of objects\n * @param {Bool} arrayType - true if a param should be encoded as an array\n * @return {SolidityParam} encoded param wrapped in SolidityParam object \n */\nSolidityType.prototype.formatInput = function (param, arrayType) {\n    if (utils.isArray(param) && arrayType) { // TODO: should fail if this two are not the same\n        var self = this;\n        return param.map(function (p) {\n            return self._inputFormatter(p);\n        }).reduce(function (acc, current) {\n            return acc.combine(current);\n        }, f.formatInputInt(param.length)).withOffset(32);\n    } \n    return this._inputFormatter(param);\n};\n\n/**\n * Should be used to transoform SolidityParam to plain param\n *\n * @method formatOutput\n * @param {SolidityParam} byteArray\n * @param {Bool} arrayType - true if a param should be decoded as an array\n * @return {Object} plain decoded param\n */\nSolidityType.prototype.formatOutput = function (param, arrayType) {\n    if (arrayType) {\n        // let's assume, that we solidity will never return long arrays :P \n        var result = [];\n        var length = new BigNumber(param.dynamicPart().slice(0, 64), 16);\n        for (var i = 0; i < length * 64; i += 64) {\n            result.push(this._outputFormatter(new SolidityParam(param.dynamicPart().substr(i + 64, 64))));\n        }\n        return result;\n    }\n    return this._outputFormatter(param);\n};\n\n/**\n * Should be used to slice single param from bytes\n *\n * @method sliceParam\n * @param {String} bytes\n * @param {Number} index of param to slice\n * @param {String} type\n * @returns {SolidityParam} param\n */\nSolidityType.prototype.sliceParam = function (bytes, index, type) {\n    if (this._mode === 'bytes') {\n        return SolidityParam.decodeBytes(bytes, index);\n    } else if (isArrayType(type)) {\n        return SolidityParam.decodeArray(bytes, index);\n    }\n    return SolidityParam.decodeParam(bytes, index);\n};\n\n/**\n * SolidityCoder prototype should be used to encode/decode solidity params of any type\n */\nvar SolidityCoder = function (types) {\n    this._types = types;\n};\n\n/**\n * This method should be used to transform type to SolidityType\n *\n * @method _requireType\n * @param {String} type\n * @returns {SolidityType} \n * @throws {Error} throws if no matching type is found\n */\nSolidityCoder.prototype._requireType = function (type) {\n    var solidityType = this._types.filter(function (t) {\n        return t.isType(type);\n    })[0];\n\n    if (!solidityType) {\n        throw Error('invalid solidity type!: ' + type);\n    }\n\n    return solidityType;\n};\n\n/**\n * Should be used to transform plain param of given type to SolidityParam\n *\n * @method _formatInput\n * @param {String} type of param\n * @param {Object} plain param\n * @return {SolidityParam}\n */\nSolidityCoder.prototype._formatInput = function (type, param) {\n    return this._requireType(type).formatInput(param, isArrayType(type));\n};\n\n/**\n * Should be used to encode plain param\n *\n * @method encodeParam\n * @param {String} type\n * @param {Object} plain param\n * @return {String} encoded plain param\n */\nSolidityCoder.prototype.encodeParam = function (type, param) {\n    return this._formatInput(type, param).encode();\n};\n\n/**\n * Should be used to encode list of params\n *\n * @method encodeParams\n * @param {Array} types\n * @param {Array} params\n * @return {String} encoded list of params\n */\nSolidityCoder.prototype.encodeParams = function (types, params) {\n    var self = this;\n    var solidityParams = types.map(function (type, index) {\n        return self._formatInput(type, params[index]);\n    });\n\n    return SolidityParam.encodeList(solidityParams);\n};\n\n/**\n * Should be used to decode bytes to plain param\n *\n * @method decodeParam\n * @param {String} type\n * @param {String} bytes\n * @return {Object} plain param\n */\nSolidityCoder.prototype.decodeParam = function (type, bytes) {\n    return this.decodeParams([type], bytes)[0];\n};\n\n/**\n * Should be used to decode list of params\n *\n * @method decodeParam\n * @param {Array} types\n * @param {String} bytes\n * @return {Array} array of plain params\n */\nSolidityCoder.prototype.decodeParams = function (types, bytes) {\n    var self = this;\n    return types.map(function (type, index) {\n        var solidityType = self._requireType(type);\n        var p = solidityType.sliceParam(bytes, index, type);\n        return solidityType.formatOutput(p, isArrayType(type));\n    });\n};\n\nvar coder = new SolidityCoder([\n    new SolidityType({\n        name: 'address',\n        match: 'strict',\n        mode: 'value',\n        inputFormatter: f.formatInputInt,\n        outputFormatter: f.formatOutputAddress\n    }),\n    new SolidityType({\n        name: 'bool',\n        match: 'strict',\n        mode: 'value',\n        inputFormatter: f.formatInputBool,\n        outputFormatter: f.formatOutputBool\n    }),\n    new SolidityType({\n        name: 'int',\n        match: 'prefix',\n        mode: 'value',\n        inputFormatter: f.formatInputInt,\n        outputFormatter: f.formatOutputInt,\n    }),\n    new SolidityType({\n        name: 'uint',\n        match: 'prefix',\n        mode: 'value',\n        inputFormatter: f.formatInputInt,\n        outputFormatter: f.formatOutputUInt\n    }),\n    new SolidityType({\n        name: 'bytes',\n        match: 'strict',\n        mode: 'bytes',\n        inputFormatter: f.formatInputDynamicBytes,\n        outputFormatter: f.formatOutputDynamicBytes\n    }),\n    new SolidityType({\n        name: 'bytes',\n        match: 'prefix',\n        mode: 'value',\n        inputFormatter: f.formatInputBytes,\n        outputFormatter: f.formatOutputBytes\n    }),\n    new SolidityType({\n        name: 'real',\n        match: 'prefix',\n        mode: 'value',\n        inputFormatter: f.formatInputReal,\n        outputFormatter: f.formatOutputReal\n    }),\n    new SolidityType({\n        name: 'ureal',\n        match: 'prefix',\n        mode: 'value',\n        inputFormatter: f.formatInputReal,\n        outputFormatter: f.formatOutputUReal\n    })\n]);\n\nmodule.exports = coder;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file formatters.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar BigNumber = require('bignumber.js');\nvar utils = require('../utils/utils');\nvar c = require('../utils/config');\nvar SolidityParam = require('./param');\n\n\n/**\n * Formats input value to byte representation of int\n * If value is negative, return it's two's complement\n * If the value is floating point, round it down\n *\n * @method formatInputInt\n * @param {String|Number|BigNumber} value that needs to be formatted\n * @returns {SolidityParam}\n */\nvar formatInputInt = function (value) {\n    var padding = c.ETH_PADDING * 2;\n    BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE);\n    var result = utils.padLeft(utils.toTwosComplement(value).round().toString(16), padding);\n    return new SolidityParam(result);\n};\n\n/**\n * Formats input value to byte representation of string\n *\n * @method formatInputBytes\n * @param {String}\n * @returns {SolidityParam}\n */\nvar formatInputBytes = function (value) {\n    var result = utils.fromAscii(value, c.ETH_PADDING).substr(2);\n    return new SolidityParam(result);\n};\n\n/**\n * Formats input value to byte representation of string\n *\n * @method formatInputDynamicBytes\n * @param {String}\n * @returns {SolidityParam}\n */\nvar formatInputDynamicBytes = function (value) {\n    var result = utils.fromAscii(value, c.ETH_PADDING).substr(2);\n    return new SolidityParam(formatInputInt(value.length).value + result, 32);\n};\n\n/**\n * Formats input value to byte representation of bool\n *\n * @method formatInputBool\n * @param {Boolean}\n * @returns {SolidityParam}\n */\nvar formatInputBool = function (value) {\n    var result = '000000000000000000000000000000000000000000000000000000000000000' + (value ?  '1' : '0');\n    return new SolidityParam(result);\n};\n\n/**\n * Formats input value to byte representation of real\n * Values are multiplied by 2^m and encoded as integers\n *\n * @method formatInputReal\n * @param {String|Number|BigNumber}\n * @returns {SolidityParam}\n */\nvar formatInputReal = function (value) {\n    return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));\n};\n\n/**\n * Check if input value is negative\n *\n * @method signedIsNegative\n * @param {String} value is hex format\n * @returns {Boolean} true if it is negative, otherwise false\n */\nvar signedIsNegative = function (value) {\n    return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1';\n};\n\n/**\n * Formats right-aligned output bytes to int\n *\n * @method formatOutputInt\n * @param {SolidityParam} param\n * @returns {BigNumber} right-aligned output bytes formatted to big number\n */\nvar formatOutputInt = function (param) {\n    var value = param.staticPart() || \"0\";\n\n    // check if it's negative number\n    // it it is, return two's complement\n    if (signedIsNegative(value)) {\n        return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);\n    }\n    return new BigNumber(value, 16);\n};\n\n/**\n * Formats right-aligned output bytes to uint\n *\n * @method formatOutputUInt\n * @param {SolidityParam}\n * @returns {BigNumeber} right-aligned output bytes formatted to uint\n */\nvar formatOutputUInt = function (param) {\n    var value = param.staticPart() || \"0\";\n    return new BigNumber(value, 16);\n};\n\n/**\n * Formats right-aligned output bytes to real\n *\n * @method formatOutputReal\n * @param {SolidityParam}\n * @returns {BigNumber} input bytes formatted to real\n */\nvar formatOutputReal = function (param) {\n    return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128)); \n};\n\n/**\n * Formats right-aligned output bytes to ureal\n *\n * @method formatOutputUReal\n * @param {SolidityParam}\n * @returns {BigNumber} input bytes formatted to ureal\n */\nvar formatOutputUReal = function (param) {\n    return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128)); \n};\n\n/**\n * Should be used to format output bool\n *\n * @method formatOutputBool\n * @param {SolidityParam}\n * @returns {Boolean} right-aligned input bytes formatted to bool\n */\nvar formatOutputBool = function (param) {\n    return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false;\n};\n\n/**\n * Should be used to format output string\n *\n * @method formatOutputBytes\n * @param {SolidityParam} left-aligned hex representation of string\n * @returns {String} ascii string\n */\nvar formatOutputBytes = function (param) {\n    // length might also be important!\n    return utils.toAscii(param.staticPart());\n};\n\n/**\n * Should be used to format output string\n *\n * @method formatOutputDynamicBytes\n * @param {SolidityParam} left-aligned hex representation of string\n * @returns {String} ascii string\n */\nvar formatOutputDynamicBytes = function (param) {\n    // length might also be important!\n    return utils.toAscii(param.dynamicPart().slice(64));\n};\n\n/**\n * Should be used to format output address\n *\n * @method formatOutputAddress\n * @param {SolidityParam} right-aligned input bytes\n * @returns {String} address\n */\nvar formatOutputAddress = function (param) {\n    var value = param.staticPart();\n    return \"0x\" + value.slice(value.length - 40, value.length);\n};\n\nmodule.exports = {\n    formatInputInt: formatInputInt,\n    formatInputBytes: formatInputBytes,\n    formatInputDynamicBytes: formatInputDynamicBytes,\n    formatInputBool: formatInputBool,\n    formatInputReal: formatInputReal,\n    formatOutputInt: formatOutputInt,\n    formatOutputUInt: formatOutputUInt,\n    formatOutputReal: formatOutputReal,\n    formatOutputUReal: formatOutputUReal,\n    formatOutputBool: formatOutputBool,\n    formatOutputBytes: formatOutputBytes,\n    formatOutputDynamicBytes: formatOutputDynamicBytes,\n    formatOutputAddress: formatOutputAddress\n};\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file param.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar utils = require('../utils/utils');\n\n/**\n * SolidityParam object prototype.\n * Should be used when encoding, decoding solidity bytes\n */\nvar SolidityParam = function (value, offset) {\n    this.value = value || '';\n    this.offset = offset; // offset in bytes\n};\n\n/**\n * This method should be used to get length of params's dynamic part\n * \n * @method dynamicPartLength\n * @returns {Number} length of dynamic part (in bytes)\n */\nSolidityParam.prototype.dynamicPartLength = function () {\n    return this.dynamicPart().length / 2;\n};\n\n/**\n * This method should be used to create copy of solidity param with different offset\n *\n * @method withOffset\n * @param {Number} offset length in bytes\n * @returns {SolidityParam} new solidity param with applied offset\n */\nSolidityParam.prototype.withOffset = function (offset) {\n    return new SolidityParam(this.value, offset);\n};\n\n/**\n * This method should be used to combine solidity params together\n * eg. when appending an array\n *\n * @method combine\n * @param {SolidityParam} param with which we should combine\n * @param {SolidityParam} result of combination\n */\nSolidityParam.prototype.combine = function (param) {\n    return new SolidityParam(this.value + param.value); \n};\n\n/**\n * This method should be called to check if param has dynamic size.\n * If it has, it returns true, otherwise false\n *\n * @method isDynamic\n * @returns {Boolean}\n */\nSolidityParam.prototype.isDynamic = function () {\n    return this.value.length > 64;\n};\n\n/**\n * This method should be called to transform offset to bytes\n *\n * @method offsetAsBytes\n * @returns {String} bytes representation of offset\n */\nSolidityParam.prototype.offsetAsBytes = function () {\n    return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64);\n};\n\n/**\n * This method should be called to get static part of param\n *\n * @method staticPart\n * @returns {String} offset if it is a dynamic param, otherwise value\n */\nSolidityParam.prototype.staticPart = function () {\n    if (!this.isDynamic()) {\n        return this.value; \n    } \n    return this.offsetAsBytes();\n};\n\n/**\n * This method should be called to get dynamic part of param\n *\n * @method dynamicPart\n * @returns {String} returns a value if it is a dynamic param, otherwise empty string\n */\nSolidityParam.prototype.dynamicPart = function () {\n    return this.isDynamic() ? this.value : '';\n};\n\n/**\n * This method should be called to encode param\n *\n * @method encode\n * @returns {String}\n */\nSolidityParam.prototype.encode = function () {\n    return this.staticPart() + this.dynamicPart();\n};\n\n/**\n * This method should be called to encode array of params\n *\n * @method encodeList\n * @param {Array[SolidityParam]} params\n * @returns {String}\n */\nSolidityParam.encodeList = function (params) {\n    \n    // updating offsets\n    var totalOffset = params.length * 32;\n    var offsetParams = params.map(function (param) {\n        if (!param.isDynamic()) {\n            return param;\n        }\n        var offset = totalOffset;\n        totalOffset += param.dynamicPartLength();\n        return param.withOffset(offset);\n    });\n\n    // encode everything!\n    return offsetParams.reduce(function (result, param) {\n        return result + param.dynamicPart();\n    }, offsetParams.reduce(function (result, param) {\n        return result + param.staticPart();\n    }, ''));\n};\n\n/**\n * This method should be used to decode plain (static) solidity param at given index\n *\n * @method decodeParam\n * @param {String} bytes\n * @param {Number} index\n * @returns {SolidityParam}\n */\nSolidityParam.decodeParam = function (bytes, index) {\n    index = index || 0;\n    return new SolidityParam(bytes.substr(index * 64, 64)); \n};\n\n/**\n * This method should be called to get offset value from bytes at given index\n *\n * @method getOffset\n * @param {String} bytes\n * @param {Number} index\n * @returns {Number} offset as number\n */\nvar getOffset = function (bytes, index) {\n    // we can do this cause offset is rather small\n    return parseInt('0x' + bytes.substr(index * 64, 64));\n};\n\n/**\n * This method should be called to decode solidity bytes param at given index\n *\n * @method decodeBytes\n * @param {String} bytes\n * @param {Number} index\n * @returns {SolidityParam}\n */\nSolidityParam.decodeBytes = function (bytes, index) {\n    index = index || 0;\n    //TODO add support for strings longer than 32 bytes\n    //var length = parseInt('0x' + bytes.substr(offset * 64, 64));\n\n    var offset = getOffset(bytes, index);\n\n    // 2 * , cause we also parse length\n    return new SolidityParam(bytes.substr(offset * 2, 2 * 64));\n};\n\n/**\n * This method should be used to decode solidity array at given index\n *\n * @method decodeArray\n * @param {String} bytes\n * @param {Number} index\n * @returns {SolidityParam}\n */\nSolidityParam.decodeArray = function (bytes, index) {\n    index = index || 0;\n    var offset = getOffset(bytes, index);\n    var length = parseInt('0x' + bytes.substr(offset * 2, 64));\n    return new SolidityParam(bytes.substr(offset * 2, (length + 1) * 64));\n};\n\nmodule.exports = SolidityParam;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/**\n * @file utils.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\n/**\n * Returns the contstructor with matching number of arguments\n *\n * @method getConstructor\n * @param {Array} abi\n * @param {Number} numberOfArgs\n * @returns {Object} constructor function abi\n */\nvar getConstructor = function (abi, numberOfArgs) {\n    return abi.filter(function (f) {\n        return f.type === 'constructor' && f.inputs.length === numberOfArgs;\n    })[0];\n};\n\n//var getSupremeType = function (type) {\n    //return type.substr(0, type.indexOf('[')) + ']';\n//};\n\n\nmodule.exports = {\n    getConstructor: getConstructor\n};\n\n",
    "'use strict';\n\n// go env doesn't have and need XMLHttpRequest\nif (typeof XMLHttpRequest === 'undefined') {\n    exports.XMLHttpRequest = {};\n} else {\n    exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line\n}\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file config.js\n * @authors:\n *   Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\n/**\n * Utils\n * \n * @module utils\n */\n\n/**\n * Utility functions\n * \n * @class [utils] config\n * @constructor\n */\n\n/// required to define ETH_BIGNUMBER_ROUNDING_MODE\nvar BigNumber = require('bignumber.js');\n\nvar ETH_UNITS = [ \n    'wei', \n    'Kwei', \n    'Mwei', \n    'Gwei', \n    'szabo', \n    'finney', \n    'ether', \n    'grand', \n    'Mether', \n    'Gether', \n    'Tether', \n    'Pether', \n    'Eether', \n    'Zether', \n    'Yether', \n    'Nether', \n    'Dether', \n    'Vether', \n    'Uether' \n];\n\nmodule.exports = {\n    ETH_PADDING: 32,\n    ETH_SIGNATURE_LENGTH: 4,\n    ETH_UNITS: ETH_UNITS,\n    ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN },\n    ETH_POLLING_TIMEOUT: 1000,\n    defaultBlock: 'latest',\n    defaultAccount: undefined\n};\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file utils.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\n/**\n * Utils\n * \n * @module utils\n */\n\n/**\n * Utility functions\n * \n * @class [utils] utils\n * @constructor\n */\n\nvar BigNumber = require('bignumber.js');\n\nvar unitMap = {\n    'wei':      '1',\n    'kwei':     '1000',\n    'ada':      '1000',\n    'mwei':     '1000000',\n    'babbage':  '1000000',\n    'gwei':     '1000000000',\n    'shannon':  '1000000000',\n    'szabo':    '1000000000000',\n    'finney':   '1000000000000000',\n    'ether':    '1000000000000000000',\n    'kether':   '1000000000000000000000',\n    'grand':    '1000000000000000000000',\n    'einstein': '1000000000000000000000',\n    'mether':   '1000000000000000000000000',\n    'gether':   '1000000000000000000000000000',\n    'tether':   '1000000000000000000000000000000'\n};\n\n/**\n * Should be called to pad string to expected length\n *\n * @method padLeft\n * @param {String} string to be padded\n * @param {Number} characters that result string should have\n * @param {String} sign, by default 0\n * @returns {String} right aligned string\n */\nvar padLeft = function (string, chars, sign) {\n    return new Array(chars - string.length + 1).join(sign ? sign : \"0\") + string;\n};\n\n/** \n * Should be called to get sting from it's hex representation\n *\n * @method toAscii\n * @param {String} string in hex\n * @returns {String} ascii string representation of hex value\n */\nvar toAscii = function(hex) {\n// Find termination\n    var str = \"\";\n    var i = 0, l = hex.length;\n    if (hex.substring(0, 2) === '0x') {\n        i = 2;\n    }\n    for (; i < l; i+=2) {\n        var code = parseInt(hex.substr(i, 2), 16);\n        if (code === 0) {\n            break;\n        }\n\n        str += String.fromCharCode(code);\n    }\n\n    return str;\n};\n    \n/**\n * Shold be called to get hex representation (prefixed by 0x) of ascii string \n *\n * @method toHexNative\n * @param {String} string\n * @returns {String} hex representation of input string\n */\nvar toHexNative = function(str) {\n    var hex = \"\";\n    for(var i = 0; i < str.length; i++) {\n        var n = str.charCodeAt(i).toString(16);\n        hex += n.length < 2 ? '0' + n : n;\n    }\n\n    return hex;\n};\n\n/**\n * Shold be called to get hex representation (prefixed by 0x) of ascii string \n *\n * @method fromAscii\n * @param {String} string\n * @param {Number} optional padding\n * @returns {String} hex representation of input string\n */\nvar fromAscii = function(str, pad) {\n    pad = pad === undefined ? 0 : pad;\n    var hex = toHexNative(str);\n    while (hex.length < pad*2)\n        hex += \"00\";\n    return \"0x\" + hex;\n};\n\n/**\n * Should be used to create full function/event name from json abi\n *\n * @method transformToFullName\n * @param {Object} json-abi\n * @return {String} full fnction/event name\n */\nvar transformToFullName = function (json) {\n    if (json.name.indexOf('(') !== -1) {\n        return json.name;\n    }\n\n    var typeName = json.inputs.map(function(i){return i.type; }).join();\n    return json.name + '(' + typeName + ')';\n};\n\n/**\n * Should be called to get display name of contract function\n * \n * @method extractDisplayName\n * @param {String} name of function/event\n * @returns {String} display name for function/event eg. multiply(uint256) -> multiply\n */\nvar extractDisplayName = function (name) {\n    var length = name.indexOf('('); \n    return length !== -1 ? name.substr(0, length) : name;\n};\n\n/// @returns overloaded part of function/event name\nvar extractTypeName = function (name) {\n    /// TODO: make it invulnerable\n    var length = name.indexOf('(');\n    return length !== -1 ? name.substr(length + 1, name.length - 1 - (length + 1)).replace(' ', '') : \"\";\n};\n\n/**\n * Converts value to it's decimal representation in string\n *\n * @method toDecimal\n * @param {String|Number|BigNumber}\n * @return {String}\n */\nvar toDecimal = function (value) {\n    return toBigNumber(value).toNumber();\n};\n\n/**\n * Converts value to it's hex representation\n *\n * @method fromDecimal\n * @param {String|Number|BigNumber}\n * @return {String}\n */\nvar fromDecimal = function (value) {\n    var number = toBigNumber(value);\n    var result = number.toString(16);\n\n    return number.lessThan(0) ? '-0x' + result.substr(1) : '0x' + result;\n};\n\n/**\n * Auto converts any given value into it's hex representation.\n *\n * And even stringifys objects before.\n *\n * @method toHex\n * @param {String|Number|BigNumber|Object}\n * @return {String}\n */\nvar toHex = function (val) {\n    /*jshint maxcomplexity:7 */\n\n    if (isBoolean(val))\n        return fromDecimal(+val);\n\n    if (isBigNumber(val))\n        return fromDecimal(val);\n\n    if (isObject(val))\n        return fromAscii(JSON.stringify(val));\n\n    // if its a negative number, pass it through fromDecimal\n    if (isString(val)) {\n        if (val.indexOf('-0x') === 0)\n           return fromDecimal(val);\n        else if (!isFinite(val))\n            return fromAscii(val);\n    }\n\n    return fromDecimal(val);\n};\n\n/**\n * Returns value of unit in Wei\n *\n * @method getValueOfUnit\n * @param {String} unit the unit to convert to, default ether\n * @returns {BigNumber} value of the unit (in Wei)\n * @throws error if the unit is not correct:w\n */\nvar getValueOfUnit = function (unit) {\n    unit = unit ? unit.toLowerCase() : 'ether';\n    var unitValue = unitMap[unit];\n    if (unitValue === undefined) {\n        throw new Error('This unit doesn\\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2));\n    }\n    return new BigNumber(unitValue, 10);\n};\n\n/**\n * Takes a number of wei and converts it to any other ether unit.\n *\n * Possible units are:\n * - kwei/ada\n * - mwei/babbage\n * - gwei/shannon\n * - szabo\n * - finney\n * - ether\n * - kether/grand/einstein\n * - mether\n * - gether\n * - tether\n *\n * @method fromWei\n * @param {Number|String} number can be a number, number string or a HEX of a decimal\n * @param {String} unit the unit to convert to, default ether\n * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number\n*/\nvar fromWei = function(number, unit) {\n    var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit));\n\n    return isBigNumber(number) ? returnValue : returnValue.toString(10); \n};\n\n/**\n * Takes a number of a unit and converts it to wei.\n *\n * Possible units are:\n * - kwei/ada\n * - mwei/babbage\n * - gwei/shannon\n * - szabo\n * - finney\n * - ether\n * - kether/grand/einstein\n * - mether\n * - gether\n * - tether\n *\n * @method toWei\n * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal\n * @param {String} unit the unit to convert from, default ether\n * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number\n*/\nvar toWei = function(number, unit) {\n    var returnValue = toBigNumber(number).times(getValueOfUnit(unit));\n\n    return isBigNumber(number) ? returnValue : returnValue.toString(10); \n};\n\n/**\n * Takes an input and transforms it into an bignumber\n *\n * @method toBigNumber\n * @param {Number|String|BigNumber} a number, string, HEX string or BigNumber\n * @return {BigNumber} BigNumber\n*/\nvar toBigNumber = function(number) {\n    /*jshint maxcomplexity:5 */\n    number = number || 0;\n    if (isBigNumber(number))\n        return number;\n\n    if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) {\n        return new BigNumber(number.replace('0x',''), 16);\n    }\n   \n    return new BigNumber(number.toString(10), 10);\n};\n\n/**\n * Takes and input transforms it into bignumber and if it is negative value, into two's complement\n *\n * @method toTwosComplement\n * @param {Number|String|BigNumber}\n * @return {BigNumber}\n */\nvar toTwosComplement = function (number) {\n    var bigNumber = toBigNumber(number);\n    if (bigNumber.lessThan(0)) {\n        return new BigNumber(\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", 16).plus(bigNumber).plus(1);\n    }\n    return bigNumber;\n};\n\n/**\n * Checks if the given string is strictly an address\n *\n * @method isStrictAddress\n * @param {String} address the given HEX adress\n * @return {Boolean}\n*/\nvar isStrictAddress = function (address) {\n    return /^0x[0-9a-f]{40}$/.test(address);\n};\n\n/**\n * Checks if the given string is an address\n *\n * @method isAddress\n * @param {String} address the given HEX adress\n * @return {Boolean}\n*/\nvar isAddress = function (address) {\n    return /^(0x)?[0-9a-f]{40}$/.test(address);\n};\n\n/**\n * Transforms given string to valid 20 bytes-length addres with 0x prefix\n *\n * @method toAddress\n * @param {String} address\n * @return {String} formatted address\n */\nvar toAddress = function (address) {\n    if (isStrictAddress(address)) {\n        return address;\n    }\n    \n    if (/^[0-9a-f]{40}$/.test(address)) {\n        return '0x' + address;\n    }\n\n    return '0x' + padLeft(toHex(address).substr(2), 40);\n};\n\n/**\n * Returns true if object is BigNumber, otherwise false\n *\n * @method isBigNumber\n * @param {Object}\n * @return {Boolean} \n */\nvar isBigNumber = function (object) {\n    return object instanceof BigNumber ||\n        (object && object.constructor && object.constructor.name === 'BigNumber');\n};\n\n/**\n * Returns true if object is string, otherwise false\n * \n * @method isString\n * @param {Object}\n * @return {Boolean}\n */\nvar isString = function (object) {\n    return typeof object === 'string' ||\n        (object && object.constructor && object.constructor.name === 'String');\n};\n\n/**\n * Returns true if object is function, otherwise false\n *\n * @method isFunction\n * @param {Object}\n * @return {Boolean}\n */\nvar isFunction = function (object) {\n    return typeof object === 'function';\n};\n\n/**\n * Returns true if object is Objet, otherwise false\n *\n * @method isObject\n * @param {Object}\n * @return {Boolean}\n */\nvar isObject = function (object) {\n    return typeof object === 'object';\n};\n\n/**\n * Returns true if object is boolean, otherwise false\n *\n * @method isBoolean\n * @param {Object}\n * @return {Boolean}\n */\nvar isBoolean = function (object) {\n    return typeof object === 'boolean';\n};\n\n/**\n * Returns true if object is array, otherwise false\n *\n * @method isArray\n * @param {Object}\n * @return {Boolean}\n */\nvar isArray = function (object) {\n    return object instanceof Array; \n};\n\n/**\n * Returns true if given string is valid json object\n * \n * @method isJson\n * @param {String}\n * @return {Boolean}\n */\nvar isJson = function (str) {\n    try {\n        return !!JSON.parse(str);\n    } catch (e) {\n        return false;\n    }\n};\n\nmodule.exports = {\n    padLeft: padLeft,\n    toHex: toHex,\n    toDecimal: toDecimal,\n    fromDecimal: fromDecimal,\n    toAscii: toAscii,\n    fromAscii: fromAscii,\n    transformToFullName: transformToFullName,\n    extractDisplayName: extractDisplayName,\n    extractTypeName: extractTypeName,\n    toWei: toWei,\n    fromWei: fromWei,\n    toBigNumber: toBigNumber,\n    toTwosComplement: toTwosComplement,\n    toAddress: toAddress,\n    isBigNumber: isBigNumber,\n    isStrictAddress: isStrictAddress,\n    isAddress: isAddress,\n    isFunction: isFunction,\n    isString: isString,\n    isObject: isObject,\n    isBoolean: isBoolean,\n    isArray: isArray,\n    isJson: isJson\n};\n\n",
    "module.exports={\n    \"version\": \"0.3.6\"\n}\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file web3.js\n * @authors:\n *   Jeffrey Wilcke <jeff@ethdev.com>\n *   Marek Kotewicz <marek@ethdev.com>\n *   Marian Oancea <marian@ethdev.com>\n *   Fabian Vogelsteller <fabian@ethdev.com>\n *   Gav Wood <g@ethdev.com>\n * @date 2014\n */\n\nvar version = require('./version.json');\nvar net = require('./web3/net');\nvar eth = require('./web3/eth');\nvar db = require('./web3/db');\nvar shh = require('./web3/shh');\nvar watches = require('./web3/watches');\nvar Filter = require('./web3/filter');\nvar utils = require('./utils/utils');\nvar formatters = require('./web3/formatters');\nvar RequestManager = require('./web3/requestmanager');\nvar c = require('./utils/config');\nvar Method = require('./web3/method');\nvar Property = require('./web3/property');\n\nvar web3Methods = [\n    new Method({\n        name: 'sha3',\n        call: 'web3_sha3',\n        params: 1\n    })\n];\n\nvar web3Properties = [\n    new Property({\n        name: 'version.client',\n        getter: 'web3_clientVersion'\n    }),\n    new Property({\n        name: 'version.network',\n        getter: 'net_version',\n        inputFormatter: utils.toDecimal\n    }),\n    new Property({\n        name: 'version.ethereum',\n        getter: 'eth_protocolVersion',\n        inputFormatter: utils.toDecimal\n    }),\n    new Property({\n        name: 'version.whisper',\n        getter: 'shh_version',\n        inputFormatter: utils.toDecimal\n    })\n];\n\n/// creates methods in a given object based on method description on input\n/// setups api calls for these methods\nvar setupMethods = function (obj, methods) {\n    methods.forEach(function (method) {\n        method.attachToObject(obj);\n    });\n};\n\n/// creates properties in a given object based on properties description on input\n/// setups api calls for these properties\nvar setupProperties = function (obj, properties) {\n    properties.forEach(function (property) {\n        property.attachToObject(obj);\n    });\n};\n\n/// setups web3 object, and it's in-browser executed methods\nvar web3 = {};\nweb3.providers = {};\nweb3.version = {};\nweb3.version.api = version.version;\nweb3.eth = {};\n\n/*jshint maxparams:4 */\nweb3.eth.filter = function (fil, eventParams, options, formatter) {\n\n    // if its event, treat it differently\n    // TODO: simplify and remove\n    if (fil._isEvent) {\n        return fil(eventParams, options);\n    }\n\n    // what outputLogFormatter? that's wrong\n    //return new Filter(fil, watches.eth(), formatters.outputLogFormatter);\n    return new Filter(fil, watches.eth(), formatter || formatters.outputLogFormatter);\n};\n/*jshint maxparams:3 */\n\nweb3.shh = {};\nweb3.shh.filter = function (fil) {\n    return new Filter(fil, watches.shh(), formatters.outputPostFormatter);\n};\nweb3.net = {};\nweb3.db = {};\nweb3.setProvider = function (provider) {\n    RequestManager.getInstance().setProvider(provider);\n};\nweb3.reset = function () {\n    RequestManager.getInstance().reset();\n    c.defaultBlock = 'latest';\n    c.defaultAccount = undefined;\n};\nweb3.toHex = utils.toHex;\nweb3.toAscii = utils.toAscii;\nweb3.fromAscii = utils.fromAscii;\nweb3.toDecimal = utils.toDecimal;\nweb3.fromDecimal = utils.fromDecimal;\nweb3.toBigNumber = utils.toBigNumber;\nweb3.toWei = utils.toWei;\nweb3.fromWei = utils.fromWei;\nweb3.isAddress = utils.isAddress;\n\n// ADD defaultblock\nObject.defineProperty(web3.eth, 'defaultBlock', {\n    get: function () {\n        return c.defaultBlock;\n    },\n    set: function (val) {\n        c.defaultBlock = val;\n        return val;\n    }\n});\n\nObject.defineProperty(web3.eth, 'defaultAccount', {\n    get: function () {\n        return c.defaultAccount;\n    },\n    set: function (val) {\n        c.defaultAccount = val;\n        return val;\n    }\n});\n\n/// setups all api methods\nsetupMethods(web3, web3Methods);\nsetupProperties(web3, web3Properties);\nsetupMethods(web3.net, net.methods);\nsetupProperties(web3.net, net.properties);\nsetupMethods(web3.eth, eth.methods);\nsetupProperties(web3.eth, eth.properties);\nsetupMethods(web3.db, db.methods);\nsetupMethods(web3.shh, shh.methods);\n\nmodule.exports = web3;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file contract.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2014\n */\n\nvar web3 = require('../web3'); \nvar solAbi = require('../solidity/abi');\nvar utils = require('../utils/utils');\nvar SolidityEvent = require('./event');\nvar SolidityFunction = require('./function');\n\nvar addFunctionsToContract = function (contract, desc) {\n    desc.filter(function (json) {\n        return json.type === 'function';\n    }).map(function (json) {\n        return new SolidityFunction(json, contract.address);\n    }).forEach(function (f) {\n        f.attachToContract(contract);\n    });\n};\n\nvar addEventsToContract = function (contract, desc) {\n    desc.filter(function (json) {\n        return json.type === 'event';\n    }).map(function (json) {\n        return new SolidityEvent(json, contract.address);\n    }).forEach(function (e) {\n        e.attachToContract(contract);\n    });\n};\n\n/**\n * This method should be called when we want to call / transact some solidity method from javascript\n * it returns an object which has same methods available as solidity contract description\n * usage example: \n *\n * var abi = [{\n *      name: 'myMethod',\n *      inputs: [{ name: 'a', type: 'string' }],\n *      outputs: [{name: 'd', type: 'string' }]\n * }];  // contract abi\n *\n * var MyContract = web3.eth.contract(abi); // creation of contract prototype\n *\n * var contractInstance = new MyContract('0x0123123121');\n *\n * contractInstance.myMethod('this is test string param for call'); // myMethod call (implicit, default)\n * contractInstance.call().myMethod('this is test string param for call'); // myMethod call (explicit)\n * contractInstance.sendTransaction().myMethod('this is test string param for transact'); // myMethod sendTransaction\n *\n * @param abi - abi json description of the contract, which is being created\n * @returns contract object\n */\nvar contract = function (abi) {\n\n    // return prototype\n    return Contract.bind(null, abi);\n};\n\nvar Contract = function (abi, options) {\n\n    this.address = '';\n    if (utils.isAddress(options)) {\n        this.address = options;\n    } else { // is an object!\n        // TODO, parse the rest of the args\n        options = options || {};\n        var args = Array.prototype.slice.call(arguments, 2);\n        var bytes = solAbi.formatConstructorParams(abi, args);\n        options.data += bytes;\n        this.address = web3.eth.sendTransaction(options);\n    }\n\n    addFunctionsToContract(this, abi);\n    addEventsToContract(this, abi);\n};\n\nContract.prototype.call = function () {\n    console.error('contract.call is deprecated');\n    return this;\n};\n\nContract.prototype.sendTransaction = function () {\n    console.error('contract.sendTransact is deprecated');\n    return this;\n};\n\nmodule.exports = contract;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file db.js\n * @authors:\n *   Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar Method = require('./method');\n\nvar putString = new Method({\n    name: 'putString',\n    call: 'db_putString',\n    params: 3\n});\n\n\nvar getString = new Method({\n    name: 'getString',\n    call: 'db_getString',\n    params: 2\n});\n\nvar putHex = new Method({\n    name: 'putHex',\n    call: 'db_putHex',\n    params: 3\n});\n\nvar getHex = new Method({\n    name: 'getHex',\n    call: 'db_getHex',\n    params: 2\n});\n\nvar methods = [\n    putString, getString, putHex, getHex\n];\n\nmodule.exports = {\n    methods: methods\n};\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file errors.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nmodule.exports = {\n    InvalidNumberOfParams: function () {\n        return new Error('Invalid number of input parameters');\n    },\n    InvalidConnection: function (host){\n        return new Error('CONNECTION ERROR: Couldn\\'t connect to node '+ host +', is it running?');\n    },\n    InvalidProvider: function () {\n        return new Error('Providor not set or invalid');\n    },\n    InvalidResponse: function (result){\n        var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response';\n        return new Error(message);\n    }\n};\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/**\n * @file eth.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @author Fabian Vogelsteller <fabian@ethdev.com>\n * @date 2015\n */\n\n/**\n * Web3\n *\n * @module web3\n */\n\n/**\n * Eth methods and properties\n *\n * An example method object can look as follows:\n *\n *      {\n *      name: 'getBlock',\n *      call: blockCall,\n *      params: 2,\n *      outputFormatter: formatters.outputBlockFormatter,\n *      inputFormatter: [ // can be a formatter funciton or an array of functions. Where each item in the array will be used for one parameter\n *           utils.toHex, // formats paramter 1\n *           function(param){ return !!param; } // formats paramter 2\n *         ]\n *       },\n *\n * @class [web3] eth\n * @constructor\n */\n\n\"use strict\";\n\nvar formatters = require('./formatters');\nvar utils = require('../utils/utils');\nvar Method = require('./method');\nvar Property = require('./property');\n\nvar blockCall = function (args) {\n    return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? \"eth_getBlockByHash\" : \"eth_getBlockByNumber\";\n};\n\nvar transactionFromBlockCall = function (args) {\n    return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex';\n};\n\nvar uncleCall = function (args) {\n    return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex';\n};\n\nvar getBlockTransactionCountCall = function (args) {\n    return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber';\n};\n\nvar uncleCountCall = function (args) {\n    return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber';\n};\n\n/// @returns an array of objects describing web3.eth api methods\n\nvar getBalance = new Method({\n    name: 'getBalance',\n    call: 'eth_getBalance',\n    params: 2,\n    inputFormatter: [utils.toAddress, formatters.inputDefaultBlockNumberFormatter],\n    outputFormatter: formatters.outputBigNumberFormatter\n});\n\nvar getStorageAt = new Method({\n    name: 'getStorageAt',\n    call: 'eth_getStorageAt',\n    params: 3,\n    inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter]\n});\n\nvar getCode = new Method({\n    name: 'getCode',\n    call: 'eth_getCode',\n    params: 2,\n    inputFormatter: [utils.toAddress, formatters.inputDefaultBlockNumberFormatter]\n});\n\nvar getBlock = new Method({\n    name: 'getBlock',\n    call: blockCall,\n    params: 2,\n    inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }],\n    outputFormatter: formatters.outputBlockFormatter\n});\n\nvar getUncle = new Method({\n    name: 'getUncle',\n    call: uncleCall,\n    params: 2,\n    inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],\n    outputFormatter: formatters.outputBlockFormatter,\n\n});\n\nvar getCompilers = new Method({\n    name: 'getCompilers',\n    call: 'eth_getCompilers',\n    params: 0\n});\n\nvar getBlockTransactionCount = new Method({\n    name: 'getBlockTransactionCount',\n    call: getBlockTransactionCountCall,\n    params: 1,\n    inputFormatter: [formatters.inputBlockNumberFormatter],\n    outputFormatter: utils.toDecimal\n});\n\nvar getBlockUncleCount = new Method({\n    name: 'getBlockUncleCount',\n    call: uncleCountCall,\n    params: 1,\n    inputFormatter: [formatters.inputBlockNumberFormatter],\n    outputFormatter: utils.toDecimal\n});\n\nvar getTransaction = new Method({\n    name: 'getTransaction',\n    call: 'eth_getTransactionByHash',\n    params: 1,\n    outputFormatter: formatters.outputTransactionFormatter\n});\n\nvar getTransactionFromBlock = new Method({\n    name: 'getTransactionFromBlock',\n    call: transactionFromBlockCall,\n    params: 2,\n    inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],\n    outputFormatter: formatters.outputTransactionFormatter\n});\n\nvar getTransactionCount = new Method({\n    name: 'getTransactionCount',\n    call: 'eth_getTransactionCount',\n    params: 2,\n    inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter],\n    outputFormatter: utils.toDecimal\n});\n\nvar sendTransaction = new Method({\n    name: 'sendTransaction',\n    call: 'eth_sendTransaction',\n    params: 1,\n    inputFormatter: [formatters.inputTransactionFormatter]\n});\n\nvar call = new Method({\n    name: 'call',\n    call: 'eth_call',\n    params: 2,\n    inputFormatter: [formatters.inputTransactionFormatter, formatters.inputDefaultBlockNumberFormatter]\n});\n\nvar compileSolidity = new Method({\n    name: 'compile.solidity',\n    call: 'eth_compileSolidity',\n    params: 1\n});\n\nvar compileLLL = new Method({\n    name: 'compile.lll',\n    call: 'eth_compileLLL',\n    params: 1\n});\n\nvar compileSerpent = new Method({\n    name: 'compile.serpent',\n    call: 'eth_compileSerpent',\n    params: 1\n});\n\nvar methods = [\n    getBalance,\n    getStorageAt,\n    getCode,\n    getBlock,\n    getUncle,\n    getCompilers,\n    getBlockTransactionCount,\n    getBlockUncleCount,\n    getTransaction,\n    getTransactionFromBlock,\n    getTransactionCount,\n    call,\n    sendTransaction,\n    compileSolidity,\n    compileLLL,\n    compileSerpent,\n];\n\n/// @returns an array of objects describing web3.eth api properties\n\n\n\nvar properties = [\n    new Property({\n        name: 'coinbase',\n        getter: 'eth_coinbase'\n    }),\n    new Property({\n        name: 'mining',\n        getter: 'eth_mining'\n    }),\n    new Property({\n        name: 'hashrate',\n        getter: 'eth_hashrate',\n        outputFormatter: utils.toDecimal\n    }),\n    new Property({\n        name: 'gasPrice',\n        getter: 'eth_gasPrice',\n        outputFormatter: formatters.outputBigNumberFormatter\n    }),\n    new Property({\n        name: 'accounts',\n        getter: 'eth_accounts'\n    }),\n    new Property({\n        name: 'blockNumber',\n        getter: 'eth_blockNumber',\n        outputFormatter: utils.toDecimal\n    })\n];\n\nmodule.exports = {\n    methods: methods,\n    properties: properties\n};\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file event.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2014\n */\n\nvar utils = require('../utils/utils');\nvar coder = require('../solidity/coder');\nvar web3 = require('../web3');\nvar formatters = require('./formatters');\n\n/**\n * This prototype should be used to create event filters\n */\nvar SolidityEvent = function (json, address) {\n    this._params = json.inputs;\n    this._name = utils.transformToFullName(json);\n    this._address = address;\n    this._anonymous = json.anonymous;\n};\n\n/**\n * Should be used to get filtered param types\n *\n * @method types\n * @param {Bool} decide if returned typed should be indexed\n * @return {Array} array of types\n */\nSolidityEvent.prototype.types = function (indexed) {\n    return this._params.filter(function (i) {\n        return i.indexed === indexed;\n    }).map(function (i) {\n        return i.type;\n    });\n};\n\n/**\n * Should be used to get event display name\n *\n * @method displayName\n * @return {String} event display name\n */\nSolidityEvent.prototype.displayName = function () {\n    return utils.extractDisplayName(this._name);\n};\n\n/**\n * Should be used to get event type name\n *\n * @method typeName\n * @return {String} event type name\n */\nSolidityEvent.prototype.typeName = function () {\n    return utils.extractTypeName(this._name);\n};\n\n/**\n * Should be used to get event signature\n *\n * @method signature\n * @return {String} event signature\n */\nSolidityEvent.prototype.signature = function () {\n    return web3.sha3(web3.fromAscii(this._name)).slice(2);\n};\n\n/**\n * Should be used to encode indexed params and options to one final object\n * \n * @method encode\n * @param {Object} indexed\n * @param {Object} options\n * @return {Object} everything combined together and encoded\n */\nSolidityEvent.prototype.encode = function (indexed, options) {\n    indexed = indexed || {};\n    options = options || {};\n    var result = {};\n\n    ['fromBlock', 'toBlock'].filter(function (f) {\n        return options[f] !== undefined;\n    }).forEach(function (f) {\n        result[f] = formatters.inputBlockNumberFormatter(options[f]);\n    });\n\n    result.topics = [];\n\n    if (!this._anonymous) {\n        result.address = this._address;\n        result.topics.push('0x' + this.signature());\n    }\n\n    var indexedTopics = this._params.filter(function (i) {\n        return i.indexed === true;\n    }).map(function (i) {\n        var value = indexed[i.name];\n        if (value === undefined || value === null) {\n            return null;\n        }\n        \n        if (utils.isArray(value)) {\n            return value.map(function (v) {\n                return '0x' + coder.encodeParam(i.type, v);\n            });\n        }\n        return '0x' + coder.encodeParam(i.type, value);\n    });\n\n    result.topics = result.topics.concat(indexedTopics);\n\n    return result;\n};\n\n/**\n * Should be used to decode indexed params and options\n *\n * @method decode\n * @param {Object} data\n * @return {Object} result object with decoded indexed && not indexed params\n */\nSolidityEvent.prototype.decode = function (data) {\n \n    data.data = data.data || '';\n    data.topics = data.topics || [];\n\n    var argTopics = this._anonymous ? data.topics : data.topics.slice(1);\n    var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join(\"\");\n    var indexedParams = coder.decodeParams(this.types(true), indexedData); \n\n    var notIndexedData = data.data.slice(2);\n    var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData);\n    \n    var result = formatters.outputLogFormatter(data);\n    result.event = this.displayName();\n    result.address = data.address;\n\n    result.args = this._params.reduce(function (acc, current) {\n        acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift();\n        return acc;\n    }, {});\n\n    delete result.data;\n    delete result.topics;\n\n    return result;\n};\n\n/**\n * Should be used to create new filter object from event\n *\n * @method execute\n * @param {Object} indexed\n * @param {Object} options\n * @return {Object} filter object\n */\nSolidityEvent.prototype.execute = function (indexed, options) {\n    var o = this.encode(indexed, options);\n    var formatter = this.decode.bind(this);\n    return web3.eth.filter(o, undefined, undefined, formatter);\n};\n\n/**\n * Should be used to attach event to contract object\n *\n * @method attachToContract\n * @param {Contract}\n */\nSolidityEvent.prototype.attachToContract = function (contract) {\n    var execute = this.execute.bind(this);\n    var displayName = this.displayName();\n    if (!contract[displayName]) {\n        contract[displayName] = execute;\n    }\n    contract[displayName][this.typeName()] = this.execute.bind(this, contract);\n};\n\nmodule.exports = SolidityEvent;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file filter.js\n * @authors:\n *   Jeffrey Wilcke <jeff@ethdev.com>\n *   Marek Kotewicz <marek@ethdev.com>\n *   Marian Oancea <marian@ethdev.com>\n *   Fabian Vogelsteller <fabian@ethdev.com>\n *   Gav Wood <g@ethdev.com>\n * @date 2014\n */\n\nvar RequestManager = require('./requestmanager');\nvar formatters = require('./formatters');\nvar utils = require('../utils/utils');\n\n/**\n* Converts a given topic to a hex string, but also allows null values.\n*\n* @param {Mixed} value\n* @return {String}\n*/\nvar toTopic = function(value){\n\n    if(value === null || typeof value === 'undefined')\n        return null;\n\n    value = String(value);\n\n    if(value.indexOf('0x') === 0)\n        return value;\n    else\n        return utils.fromAscii(value);\n};\n\n/// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones\n/// @param should be string or object\n/// @returns options string or object\nvar getOptions = function (options) {\n\n    if (utils.isString(options)) {\n        return options;\n    } \n\n    options = options || {};\n\n    // make sure topics, get converted to hex\n    options.topics = options.topics || [];\n    options.topics = options.topics.map(function(topic){\n        return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic);\n    });\n\n    // lazy load\n    return {\n        topics: options.topics,\n        to: options.to,\n        address: options.address,\n        fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock),\n        toBlock: formatters.inputBlockNumberFormatter(options.toBlock) \n    }; \n};\n\nvar Filter = function (options, methods, formatter) {\n    var implementation = {};\n    methods.forEach(function (method) {\n        method.attachToObject(implementation);\n    });\n    this.options = getOptions(options);\n    this.implementation = implementation;\n    this.callbacks = [];\n    this.formatter = formatter;\n    this.filterId = this.implementation.newFilter(this.options);\n};\n\nFilter.prototype.watch = function (callback) {\n    this.callbacks.push(callback);\n    var self = this;\n\n    var onMessage = function (error, messages) {\n        if (error) {\n            return self.callbacks.forEach(function (callback) {\n                callback(error);\n            });\n        }\n\n        messages.forEach(function (message) {\n            message = self.formatter ? self.formatter(message) : message;\n            self.callbacks.forEach(function (callback) {\n                callback(null, message);\n            });\n        });\n    };\n\n    // call getFilterLogs on start\n    if (!utils.isString(this.options)) {\n        this.get(function (err, messages) {\n            // don't send all the responses to all the watches again... just to this one\n            if (err) {\n                callback(err);\n            }\n\n            messages.forEach(function (message) {\n                callback(null, message);\n            });\n        });\n    }\n\n    RequestManager.getInstance().startPolling({\n        method: this.implementation.poll.call,\n        params: [this.filterId],\n    }, this.filterId, onMessage, this.stopWatching.bind(this));\n};\n\nFilter.prototype.stopWatching = function () {\n    RequestManager.getInstance().stopPolling(this.filterId);\n    this.implementation.uninstallFilter(this.filterId);\n    this.callbacks = [];\n};\n\nFilter.prototype.get = function (callback) {\n    var self = this;\n    if (utils.isFunction(callback)) {\n        this.implementation.getLogs(this.filterId, function(err, res){\n            if (err) {\n                callback(err);\n            } else {\n                callback(null, res.map(function (log) {\n                    return self.formatter ? self.formatter(log) : log;\n                }));\n            }\n        });\n    } else {\n        var logs = this.implementation.getLogs(this.filterId);\n        return logs.map(function (log) {\n            return self.formatter ? self.formatter(log) : log;\n        });\n    }\n};\n\nmodule.exports = Filter;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file formatters.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @author Fabian Vogelsteller <fabian@ethdev.com>\n * @date 2015\n */\n\nvar utils = require('../utils/utils');\nvar config = require('../utils/config');\n\n/**\n * Should the format output to a big number\n *\n * @method outputBigNumberFormatter\n * @param {String|Number|BigNumber}\n * @returns {BigNumber} object\n */\nvar outputBigNumberFormatter = function (number) {\n    return utils.toBigNumber(number);\n};\n\nvar isPredefinedBlockNumber = function (blockNumber) {\n    return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest';\n};\n\nvar inputDefaultBlockNumberFormatter = function (blockNumber) {\n    if (blockNumber === undefined) {\n        return config.defaultBlock;\n    }\n    return inputBlockNumberFormatter(blockNumber);\n};\n\nvar inputBlockNumberFormatter = function (blockNumber) {\n    if (blockNumber === undefined) {\n        return undefined;\n    } else if (isPredefinedBlockNumber(blockNumber)) {\n        return blockNumber;\n    }\n    return utils.toHex(blockNumber);\n};\n\n/**\n * Formats the input of a transaction and converts all values to HEX\n *\n * @method inputTransactionFormatter\n * @param {Object} transaction options\n * @returns object\n*/\nvar inputTransactionFormatter = function (options){\n\n    options.from = options.from || config.defaultAccount;\n\n    // make code -> data\n    if (options.code) {\n        options.data = options.code;\n        delete options.code;\n    }\n\n    ['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {\n        return options[key] !== undefined;\n    }).forEach(function(key){\n        options[key] = utils.fromDecimal(options[key]);\n    });\n\n    return options; \n};\n\n/**\n * Formats the output of a transaction to its proper values\n * \n * @method outputTransactionFormatter\n * @param {Object} transaction\n * @returns {Object} transaction\n*/\nvar outputTransactionFormatter = function (tx){\n    tx.blockNumber = utils.toDecimal(tx.blockNumber);\n    tx.transactionIndex = utils.toDecimal(tx.transactionIndex);\n    tx.nonce = utils.toDecimal(tx.nonce);\n    tx.gas = utils.toDecimal(tx.gas);\n    tx.gasPrice = utils.toBigNumber(tx.gasPrice);\n    tx.value = utils.toBigNumber(tx.value);\n    return tx;\n};\n\n/**\n * Formats the output of a block to its proper values\n *\n * @method outputBlockFormatter\n * @param {Object} block object \n * @returns {Object} block object\n*/\nvar outputBlockFormatter = function(block) {\n\n    // transform to number\n    block.gasLimit = utils.toDecimal(block.gasLimit);\n    block.gasUsed = utils.toDecimal(block.gasUsed);\n    block.size = utils.toDecimal(block.size);\n    block.timestamp = utils.toDecimal(block.timestamp);\n    block.number = utils.toDecimal(block.number);\n\n    block.difficulty = utils.toBigNumber(block.difficulty);\n    block.totalDifficulty = utils.toBigNumber(block.totalDifficulty);\n\n    if (utils.isArray(block.transactions)) {\n        block.transactions.forEach(function(item){\n            if(!utils.isString(item))\n                return outputTransactionFormatter(item);\n        });\n    }\n\n    return block;\n};\n\n/**\n * Formats the output of a log\n * \n * @method outputLogFormatter\n * @param {Object} log object\n * @returns {Object} log\n*/\nvar outputLogFormatter = function(log) {\n    if (log === null) { // 'pending' && 'latest' filters are nulls\n        return null;\n    }\n\n    log.blockNumber = utils.toDecimal(log.blockNumber);\n    log.transactionIndex = utils.toDecimal(log.transactionIndex);\n    log.logIndex = utils.toDecimal(log.logIndex);\n\n    return log;\n};\n\n/**\n * Formats the input of a whisper post and converts all values to HEX\n *\n * @method inputPostFormatter\n * @param {Object} transaction object\n * @returns {Object}\n*/\nvar inputPostFormatter = function(post) {\n\n    post.payload = utils.toHex(post.payload);\n    post.ttl = utils.fromDecimal(post.ttl);\n    post.workToProve = utils.fromDecimal(post.workToProve);\n    post.priority = utils.fromDecimal(post.priority);\n\n    // fallback\n    if (!utils.isArray(post.topics)) {\n        post.topics = post.topics ? [post.topics] : [];\n    }\n\n    // format the following options\n    post.topics = post.topics.map(function(topic){\n        return utils.fromAscii(topic);\n    });\n\n    return post; \n};\n\n/**\n * Formats the output of a received post message\n *\n * @method outputPostFormatter\n * @param {Object}\n * @returns {Object}\n */\nvar outputPostFormatter = function(post){\n\n    post.expiry = utils.toDecimal(post.expiry);\n    post.sent = utils.toDecimal(post.sent);\n    post.ttl = utils.toDecimal(post.ttl);\n    post.workProved = utils.toDecimal(post.workProved);\n    post.payloadRaw = post.payload;\n    post.payload = utils.toAscii(post.payload);\n\n    if (utils.isJson(post.payload)) {\n        post.payload = JSON.parse(post.payload);\n    }\n\n    // format the following options\n    if (!post.topics) {\n        post.topics = [];\n    }\n    post.topics = post.topics.map(function(topic){\n        return utils.toAscii(topic);\n    });\n\n    return post;\n};\n\nmodule.exports = {\n    inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter,\n    inputBlockNumberFormatter: inputBlockNumberFormatter,\n    inputTransactionFormatter: inputTransactionFormatter,\n    inputPostFormatter: inputPostFormatter,\n    outputBigNumberFormatter: outputBigNumberFormatter,\n    outputTransactionFormatter: outputTransactionFormatter,\n    outputBlockFormatter: outputBlockFormatter,\n    outputLogFormatter: outputLogFormatter,\n    outputPostFormatter: outputPostFormatter\n};\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file function.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar web3 = require('../web3');\nvar coder = require('../solidity/coder');\nvar utils = require('../utils/utils');\n\n/**\n * This prototype should be used to call/sendTransaction to solidity functions\n */\nvar SolidityFunction = function (json, address) {\n    this._inputTypes = json.inputs.map(function (i) {\n        return i.type;\n    });\n    this._outputTypes = json.outputs.map(function (i) {\n        return i.type;\n    });\n    this._constant = json.constant;\n    this._name = utils.transformToFullName(json);\n    this._address = address;\n};\n\n/**\n * Should be used to create payload from arguments\n *\n * @method toPayload\n * @param {...} solidity function params\n * @param {Object} optional payload options\n */\nSolidityFunction.prototype.toPayload = function () {\n    var args = Array.prototype.slice.call(arguments);\n    var options = {};\n    if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) {\n        options = args.pop();\n    }\n    options.to = this._address;\n    options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args);\n    return options;\n};\n\n/**\n * Should be used to get function signature\n *\n * @method signature\n * @return {String} function signature\n */\nSolidityFunction.prototype.signature = function () {\n    return web3.sha3(web3.fromAscii(this._name)).slice(2, 10);\n};\n\n/**\n * Should be used to call function\n * \n * @method call\n * @param {Object} options\n * @return {String} output bytes\n */\nSolidityFunction.prototype.call = function () {\n    var payload = this.toPayload.apply(this, Array.prototype.slice.call(arguments));\n    var output = web3.eth.call(payload);\n    output = output.length >= 2 ? output.slice(2) : output;\n    var result = coder.decodeParams(this._outputTypes, output);\n    return result.length === 1 ? result[0] : result;\n};\n\n/**\n * Should be used to sendTransaction to solidity function\n *\n * @method sendTransaction\n * @param {Object} options\n */\nSolidityFunction.prototype.sendTransaction = function () {\n    var payload = this.toPayload.apply(this, Array.prototype.slice.call(arguments));\n    web3.eth.sendTransaction(payload);\n};\n\n/**\n * Should be used to get function display name\n *\n * @method displayName\n * @return {String} display name of the function\n */\nSolidityFunction.prototype.displayName = function () {\n    return utils.extractDisplayName(this._name);\n};\n\n/**\n * Should be used to get function type name\n * \n * @method typeName\n * @return {String} type name of the function\n */\nSolidityFunction.prototype.typeName = function () {\n    return utils.extractTypeName(this._name);\n};\n\n/**\n * Should be called to execute function\n *\n * @method execute\n */\nSolidityFunction.prototype.execute = function () {\n    var transaction = !this._constant;\n    \n    // send transaction\n    if (transaction) {\n        return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));\n    }\n\n    // call\n    return this.call.apply(this, Array.prototype.slice.call(arguments));\n};\n\n/**\n * Should be called to attach function to contract\n *\n * @method attachToContract\n * @param {Contract}\n */\nSolidityFunction.prototype.attachToContract = function (contract) {\n    var execute = this.execute.bind(this);\n    execute.call = this.call.bind(this);\n    execute.sendTransaction = this.sendTransaction.bind(this);\n    var displayName = this.displayName();\n    if (!contract[displayName]) {\n        contract[displayName] = execute;\n    }\n    contract[displayName][this.typeName()] = execute; // circular!!!!\n};\n\nmodule.exports = SolidityFunction;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file httpprovider.js\n * @authors:\n *   Marek Kotewicz <marek@ethdev.com>\n *   Marian Oancea <marian@ethdev.com>\n *   Fabian Vogelsteller <fabian@ethdev.com>\n * @date 2014\n */\n\n\"use strict\";\n\nvar XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore:line\nvar errors = require('./errors');\n\nvar HttpProvider = function (host) {\n    this.host = host || 'http://localhost:8545';\n};\n\nHttpProvider.prototype.send = function (payload) {\n    var request = new XMLHttpRequest();\n\n    request.open('POST', this.host, false);\n    \n    try {\n        request.send(JSON.stringify(payload));\n    } catch(error) {\n        throw errors.InvalidConnection(this.host);\n    }\n\n\n    // check request.status\n    // TODO: throw an error here! it cannot silently fail!!!\n    //if (request.status !== 200) {\n        //return;\n    //}\n\n    var result = request.responseText;\n\n    try {\n        result = JSON.parse(result);\n    } catch(e) {\n        throw errors.InvalidResponse(result);                \n    }\n\n    return result;\n};\n\nHttpProvider.prototype.sendAsync = function (payload, callback) {\n    var request = new XMLHttpRequest();\n    request.onreadystatechange = function() {\n        if (request.readyState === 4) {\n            var result = request.responseText;\n            var error = null;\n\n            try {\n                result = JSON.parse(result);\n            } catch(e) {\n                error = errors.InvalidResponse(result);                \n            }\n\n            callback(error, result);\n        }\n    };\n\n    request.open('POST', this.host, true);\n\n    try {\n        request.send(JSON.stringify(payload));\n    } catch(error) {\n        callback(errors.InvalidConnection(this.host));\n    }\n};\n\nmodule.exports = HttpProvider;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file jsonrpc.js\n * @authors:\n *   Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar Jsonrpc = function () {\n    // singleton pattern\n    if (arguments.callee._singletonInstance) {\n        return arguments.callee._singletonInstance;\n    }\n    arguments.callee._singletonInstance = this;\n\n    this.messageId = 1;\n};\n\n/**\n * @return {Jsonrpc} singleton\n */\nJsonrpc.getInstance = function () {\n    var instance = new Jsonrpc();\n    return instance;\n};\n\n/**\n * Should be called to valid json create payload object\n *\n * @method toPayload\n * @param {Function} method of jsonrpc call, required\n * @param {Array} params, an array of method params, optional\n * @returns {Object} valid jsonrpc payload object\n */\nJsonrpc.prototype.toPayload = function (method, params) {\n    if (!method)\n        console.error('jsonrpc method should be specified!');\n\n    return {\n        jsonrpc: '2.0',\n        method: method,\n        params: params || [],\n        id: this.messageId++\n    };\n};\n\n/**\n * Should be called to check if jsonrpc response is valid\n *\n * @method isValidResponse\n * @param {Object}\n * @returns {Boolean} true if response is valid, otherwise false\n */\nJsonrpc.prototype.isValidResponse = function (response) {\n    return !!response &&\n        !response.error &&\n        response.jsonrpc === '2.0' &&\n        typeof response.id === 'number' &&\n        response.result !== undefined; // only undefined is not valid json object\n};\n\n/**\n * Should be called to create batch payload object\n *\n * @method toBatchPayload\n * @param {Array} messages, an array of objects with method (required) and params (optional) fields\n * @returns {Array} batch payload\n */\nJsonrpc.prototype.toBatchPayload = function (messages) {\n    var self = this;\n    return messages.map(function (message) {\n        return self.toPayload(message.method, message.params);\n    });\n};\n\nmodule.exports = Jsonrpc;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/**\n * @file method.js\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar RequestManager = require('./requestmanager');\nvar utils = require('../utils/utils');\nvar errors = require('./errors');\n\nvar Method = function (options) {\n    this.name = options.name;\n    this.call = options.call;\n    this.params = options.params || 0;\n    this.inputFormatter = options.inputFormatter;\n    this.outputFormatter = options.outputFormatter;\n};\n\n/**\n * Should be used to determine name of the jsonrpc method based on arguments\n *\n * @method getCall\n * @param {Array} arguments\n * @return {String} name of jsonrpc method\n */\nMethod.prototype.getCall = function (args) {\n    return utils.isFunction(this.call) ? this.call(args) : this.call;\n};\n\n/**\n * Should be used to extract callback from array of arguments. Modifies input param\n *\n * @method extractCallback\n * @param {Array} arguments\n * @return {Function|Null} callback, if exists\n */\nMethod.prototype.extractCallback = function (args) {\n    if (utils.isFunction(args[args.length - 1])) {\n        return args.pop(); // modify the args array!\n    }\n    return null;\n};\n\n/**\n * Should be called to check if the number of arguments is correct\n * \n * @method validateArgs\n * @param {Array} arguments\n * @throws {Error} if it is not\n */\nMethod.prototype.validateArgs = function (args) {\n    if (args.length !== this.params) {\n        throw errors.InvalidNumberOfParams();\n    }\n};\n\n/**\n * Should be called to format input args of method\n * \n * @method formatInput\n * @param {Array}\n * @return {Array}\n */\nMethod.prototype.formatInput = function (args) {\n    if (!this.inputFormatter) {\n        return args;\n    }\n\n    return this.inputFormatter.map(function (formatter, index) {\n        return formatter ? formatter(args[index]) : args[index];\n    });\n};\n\n/**\n * Should be called to format output(result) of method\n *\n * @method formatOutput\n * @param {Object}\n * @return {Object}\n */\nMethod.prototype.formatOutput = function (result) {\n    return this.outputFormatter && result !== null ? this.outputFormatter(result) : result;\n};\n\n/**\n * Should attach function to method\n * \n * @method attachToObject\n * @param {Object}\n * @param {Function}\n */\nMethod.prototype.attachToObject = function (obj) {\n    var func = this.send.bind(this);\n    func.call = this.call; // that's ugly. filter.js uses it\n    var name = this.name.split('.');\n    if (name.length > 1) {\n        obj[name[0]] = obj[name[0]] || {};\n        obj[name[0]][name[1]] = func;\n    } else {\n        obj[name[0]] = func; \n    }\n};\n\n/**\n * Should create payload from given input args\n *\n * @method toPayload\n * @param {Array} args\n * @return {Object}\n */\nMethod.prototype.toPayload = function (args) {\n    var call = this.getCall(args);\n    var callback = this.extractCallback(args);\n    var params = this.formatInput(args);\n    this.validateArgs(params);\n\n    return {\n        method: call,\n        params: params,\n        callback: callback\n    };\n};\n\n/**\n * Should send request to the API\n *\n * @method send\n * @param list of params\n * @return result\n */\nMethod.prototype.send = function () {\n    var payload = this.toPayload(Array.prototype.slice.call(arguments));\n    if (payload.callback) {\n        var self = this;\n        return RequestManager.getInstance().sendAsync(payload, function (err, result) {\n            payload.callback(null, self.formatOutput(result));\n        });\n    }\n    return this.formatOutput(RequestManager.getInstance().send(payload));\n};\n\nmodule.exports = Method;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file eth.js\n * @authors:\n *   Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar utils = require('../utils/utils');\nvar Property = require('./property');\n\n/// @returns an array of objects describing web3.eth api methods\nvar methods = [\n];\n\n/// @returns an array of objects describing web3.eth api properties\nvar properties = [\n    new Property({\n        name: 'listening',\n        getter: 'net_listening'\n    }),\n    new Property({\n        name: 'peerCount',\n        getter: 'net_peerCount',\n        outputFormatter: utils.toDecimal\n    })\n];\n\n\nmodule.exports = {\n    methods: methods,\n    properties: properties\n};\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/**\n * @file property.js\n * @author Fabian Vogelsteller <fabian@frozeman.de>\n * @author Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar RequestManager = require('./requestmanager');\n\nvar Property = function (options) {\n    this.name = options.name;\n    this.getter = options.getter;\n    this.setter = options.setter;\n    this.outputFormatter = options.outputFormatter;\n    this.inputFormatter = options.inputFormatter;\n};\n\n/**\n * Should be called to format input args of method\n * \n * @method formatInput\n * @param {Array}\n * @return {Array}\n */\nProperty.prototype.formatInput = function (arg) {\n    return this.inputFormatter ? this.inputFormatter(arg) : arg;\n};\n\n/**\n * Should be called to format output(result) of method\n *\n * @method formatOutput\n * @param {Object}\n * @return {Object}\n */\nProperty.prototype.formatOutput = function (result) {\n    return this.outputFormatter && result !== null ? this.outputFormatter(result) : result;\n};\n\n/**\n * Should attach function to method\n * \n * @method attachToObject\n * @param {Object}\n * @param {Function}\n */\nProperty.prototype.attachToObject = function (obj) {\n    var proto = {\n        get: this.get.bind(this),\n        set: this.set.bind(this)\n    };\n\n    var name = this.name.split('.');\n    if (name.length > 1) {\n        obj[name[0]] = obj[name[0]] || {};\n        Object.defineProperty(obj[name[0]], name[1], proto); \n    } else {\n        Object.defineProperty(obj, name[0], proto);\n    }\n};\n\n/**\n * Should be used to get value of the property\n *\n * @method get\n * @return {Object} value of the property\n */\nProperty.prototype.get = function () {\n    return this.formatOutput(RequestManager.getInstance().send({\n        method: this.getter\n    }));\n};\n\n/**\n * Should be used to set value of the property\n *\n * @method set\n * @param {Object} new value of the property\n */\nProperty.prototype.set = function (value) {\n    return RequestManager.getInstance().send({\n        method: this.setter,\n        params: [this.formatInput(value)]\n    });\n};\n\nmodule.exports = Property;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file qtsync.js\n * @authors:\n *   Marek Kotewicz <marek@ethdev.com>\n *   Marian Oancea <marian@ethdev.com>\n * @date 2014\n */\n\nvar QtSyncProvider = function () {\n};\n\nQtSyncProvider.prototype.send = function (payload) {\n    var result = navigator.qt.callMethod(JSON.stringify(payload));\n    return JSON.parse(result);\n};\n\nmodule.exports = QtSyncProvider;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** \n * @file requestmanager.js\n * @author Jeffrey Wilcke <jeff@ethdev.com>\n * @author Marek Kotewicz <marek@ethdev.com>\n * @author Marian Oancea <marian@ethdev.com>\n * @author Fabian Vogelsteller <fabian@ethdev.com>\n * @author Gav Wood <g@ethdev.com>\n * @date 2014\n */\n\nvar Jsonrpc = require('./jsonrpc');\nvar utils = require('../utils/utils');\nvar c = require('../utils/config');\nvar errors = require('./errors');\n\n/**\n * It's responsible for passing messages to providers\n * It's also responsible for polling the ethereum node for incoming messages\n * Default poll timeout is 1 second\n * Singleton\n */\nvar RequestManager = function (provider) {\n    // singleton pattern\n    if (arguments.callee._singletonInstance) {\n        return arguments.callee._singletonInstance;\n    }\n    arguments.callee._singletonInstance = this;\n\n    this.provider = provider;\n    this.polls = [];\n    this.timeout = null;\n    this.poll();\n};\n\n/**\n * @return {RequestManager} singleton\n */\nRequestManager.getInstance = function () {\n    var instance = new RequestManager();\n    return instance;\n};\n\n/**\n * Should be used to synchronously send request\n *\n * @method send\n * @param {Object} data\n * @return {Object}\n */\nRequestManager.prototype.send = function (data) {\n    if (!this.provider) {\n        console.error(errors.InvalidProvider());\n        return null;\n    }\n\n    var payload = Jsonrpc.getInstance().toPayload(data.method, data.params);\n    var result = this.provider.send(payload);\n\n    if (!Jsonrpc.getInstance().isValidResponse(result)) {\n        throw errors.InvalidResponse(result);\n    }\n\n    return result.result;\n};\n\n/**\n * Should be used to asynchronously send request\n *\n * @method sendAsync\n * @param {Object} data\n * @param {Function} callback\n */\nRequestManager.prototype.sendAsync = function (data, callback) {\n    if (!this.provider) {\n        return callback(errors.InvalidProvider());\n    }\n\n    var payload = Jsonrpc.getInstance().toPayload(data.method, data.params);\n    this.provider.sendAsync(payload, function (err, result) {\n        if (err) {\n            return callback(err);\n        }\n        \n        if (!Jsonrpc.getInstance().isValidResponse(result)) {\n            return callback(errors.InvalidResponse(result));\n        }\n\n        callback(null, result.result);\n    });\n};\n\n/**\n * Should be used to set provider of request manager\n *\n * @method setProvider\n * @param {Object}\n */\nRequestManager.prototype.setProvider = function (p) {\n    this.provider = p;\n};\n\n/*jshint maxparams:4 */\n\n/**\n * Should be used to start polling\n *\n * @method startPolling\n * @param {Object} data\n * @param {Number} pollId\n * @param {Function} callback\n * @param {Function} uninstall\n *\n * @todo cleanup number of params\n */\nRequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) {\n    this.polls.push({data: data, id: pollId, callback: callback, uninstall: uninstall});\n};\n/*jshint maxparams:3 */\n\n/**\n * Should be used to stop polling for filter with given id\n *\n * @method stopPolling\n * @param {Number} pollId\n */\nRequestManager.prototype.stopPolling = function (pollId) {\n    for (var i = this.polls.length; i--;) {\n        var poll = this.polls[i];\n        if (poll.id === pollId) {\n            this.polls.splice(i, 1);\n        }\n    }\n};\n\n/**\n * Should be called to reset polling mechanism of request manager\n *\n * @method reset\n */\nRequestManager.prototype.reset = function () {\n    this.polls.forEach(function (poll) {\n        poll.uninstall(poll.id); \n    });\n    this.polls = [];\n\n    if (this.timeout) {\n        clearTimeout(this.timeout);\n        this.timeout = null;\n    }\n    this.poll();\n};\n\n/**\n * Should be called to poll for changes on filter with given id\n *\n * @method poll\n */\nRequestManager.prototype.poll = function () {\n    this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT);\n\n    if (!this.polls.length) {\n        return;\n    }\n\n    if (!this.provider) {\n        console.error(errors.InvalidProvider());\n        return;\n    }\n\n    var payload = Jsonrpc.getInstance().toBatchPayload(this.polls.map(function (data) {\n        return data.data;\n    }));\n\n    var self = this;\n    this.provider.sendAsync(payload, function (error, results) {\n        // TODO: console log?\n        if (error) {\n            return;\n        }\n            \n        if (!utils.isArray(results)) {\n            throw errors.InvalidResponse(results);\n        }\n\n        results.map(function (result, index) {\n            result.callback = self.polls[index].callback;\n            return result;\n        }).filter(function (result) {\n            var valid = Jsonrpc.getInstance().isValidResponse(result);\n            if (!valid) {\n                result.callback(errors.InvalidResponse(result));\n            }\n            return valid;\n        }).filter(function (result) {\n            return utils.isArray(result.result) && result.result.length > 0;\n        }).forEach(function (result) {\n            result.callback(null, result.result);\n        });\n    });\n};\n\nmodule.exports = RequestManager;\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file shh.js\n * @authors:\n *   Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar Method = require('./method');\nvar formatters = require('./formatters');\n\nvar post = new Method({\n    name: 'post', \n    call: 'shh_post', \n    params: 1,\n    inputFormatter: [formatters.inputPostFormatter]\n});\n\nvar newIdentity = new Method({\n    name: 'newIdentity',\n    call: 'shh_newIdentity',\n    params: 0\n});\n\nvar hasIdentity = new Method({\n    name: 'hasIdentity',\n    call: 'shh_hasIdentity',\n    params: 1\n});\n\nvar newGroup = new Method({\n    name: 'newGroup',\n    call: 'shh_newGroup',\n    params: 0\n});\n\nvar addToGroup = new Method({\n    name: 'addToGroup',\n    call: 'shh_addToGroup',\n    params: 0\n});\n\nvar methods = [\n    post,\n    newIdentity,\n    hasIdentity,\n    newGroup,\n    addToGroup\n];\n\nmodule.exports = {\n    methods: methods\n};\n\n",
    "/*\n    This file is part of ethereum.js.\n\n    ethereum.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    ethereum.js is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with ethereum.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/** @file watches.js\n * @authors:\n *   Marek Kotewicz <marek@ethdev.com>\n * @date 2015\n */\n\nvar Method = require('./method');\n\n/// @returns an array of objects describing web3.eth.filter api methods\nvar eth = function () {\n    var newFilterCall = function (args) {\n        return typeof args[0] === 'string' ? 'eth_newBlockFilter' : 'eth_newFilter';\n    };\n\n    var newFilter = new Method({\n        name: 'newFilter',\n        call: newFilterCall,\n        params: 1\n    });\n\n    var uninstallFilter = new Method({\n        name: 'uninstallFilter',\n        call: 'eth_uninstallFilter',\n        params: 1\n    });\n\n    var getLogs = new Method({\n        name: 'getLogs',\n        call: 'eth_getFilterLogs',\n        params: 1\n    });\n\n    var poll = new Method({\n        name: 'poll',\n        call: 'eth_getFilterChanges',\n        params: 1\n    });\n\n    return [\n        newFilter,\n        uninstallFilter,\n        getLogs,\n        poll\n    ];\n};\n\n/// @returns an array of objects describing web3.shh.watch api methods\nvar shh = function () {\n    var newFilter = new Method({\n        name: 'newFilter',\n        call: 'shh_newFilter',\n        params: 1\n    });\n\n    var uninstallFilter = new Method({\n        name: 'uninstallFilter',\n        call: 'shh_uninstallFilter',\n        params: 1\n    });\n\n    var getLogs = new Method({\n        name: 'getLogs',\n        call: 'shh_getMessages',\n        params: 1\n    });\n\n    var poll = new Method({\n        name: 'poll',\n        call: 'shh_getFilterChanges',\n        params: 1\n    });\n\n    return [\n        newFilter,\n        uninstallFilter,\n        getLogs,\n        poll\n    ];\n};\n\nmodule.exports = {\n    eth: eth,\n    shh: shh\n};\n\n",
    null,
    "/*! bignumber.js v2.0.7 https://github.com/MikeMcl/bignumber.js/LICENCE */\n\n;(function (global) {\n    'use strict';\n\n    /*\n      bignumber.js v2.0.7\n      A JavaScript library for arbitrary-precision arithmetic.\n      https://github.com/MikeMcl/bignumber.js\n      Copyright (c) 2015 Michael Mclaughlin <M8ch88l@gmail.com>\n      MIT Expat Licence\n    */\n\n\n    var BigNumber, crypto, parseNumeric,\n        isNumeric = /^-?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\n        mathceil = Math.ceil,\n        mathfloor = Math.floor,\n        notBool = ' not a boolean or binary digit',\n        roundingMode = 'rounding mode',\n        tooManyDigits = 'number type has more than 15 significant digits',\n        ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_',\n        BASE = 1e14,\n        LOG_BASE = 14,\n        MAX_SAFE_INTEGER = 0x1fffffffffffff,         // 2^53 - 1\n        // MAX_INT32 = 0x7fffffff,                   // 2^31 - 1\n        POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\n        SQRT_BASE = 1e7,\n\n        /*\n         * The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\n         * the arguments to toExponential, toFixed, toFormat, and toPrecision, beyond which an\n         * exception is thrown (if ERRORS is true).\n         */\n        MAX = 1E9;                                   // 0 to MAX_INT32\n\n\n    /*\n     * Create and return a BigNumber constructor.\n     */\n    function another(configObj) {\n        var div,\n\n            // id tracks the caller function, so its name can be included in error messages.\n            id = 0,\n            P = BigNumber.prototype,\n            ONE = new BigNumber(1),\n\n\n            /********************************* EDITABLE DEFAULTS **********************************/\n\n\n            /*\n             * The default values below must be integers within the inclusive ranges stated.\n             * The values can also be changed at run-time using BigNumber.config.\n             */\n\n            // The maximum number of decimal places for operations involving division.\n            DECIMAL_PLACES = 20,                     // 0 to MAX\n\n            /*\n             * The rounding mode used when rounding to the above decimal places, and when using\n             * toExponential, toFixed, toFormat and toPrecision, and round (default value).\n             * UP         0 Away from zero.\n             * DOWN       1 Towards zero.\n             * CEIL       2 Towards +Infinity.\n             * FLOOR      3 Towards -Infinity.\n             * HALF_UP    4 Towards nearest neighbour. If equidistant, up.\n             * HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\n             * HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\n             * HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\n             * HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\n             */\n            ROUNDING_MODE = 4,                       // 0 to 8\n\n            // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\n\n            // The exponent value at and beneath which toString returns exponential notation.\n            // Number type: -7\n            TO_EXP_NEG = -7,                         // 0 to -MAX\n\n            // The exponent value at and above which toString returns exponential notation.\n            // Number type: 21\n            TO_EXP_POS = 21,                         // 0 to MAX\n\n            // RANGE : [MIN_EXP, MAX_EXP]\n\n            // The minimum exponent value, beneath which underflow to zero occurs.\n            // Number type: -324  (5e-324)\n            MIN_EXP = -1e7,                          // -1 to -MAX\n\n            // The maximum exponent value, above which overflow to Infinity occurs.\n            // Number type:  308  (1.7976931348623157e+308)\n            // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\n            MAX_EXP = 1e7,                           // 1 to MAX\n\n            // Whether BigNumber Errors are ever thrown.\n            ERRORS = true,                           // true or false\n\n            // Change to intValidatorNoErrors if ERRORS is false.\n            isValidInt = intValidatorWithErrors,     // intValidatorWithErrors/intValidatorNoErrors\n\n            // Whether to use cryptographically-secure random number generation, if available.\n            CRYPTO = false,                          // true or false\n\n            /*\n             * The modulo mode used when calculating the modulus: a mod n.\n             * The quotient (q = a / n) is calculated according to the corresponding rounding mode.\n             * The remainder (r) is calculated as: r = a - n * q.\n             *\n             * UP        0 The remainder is positive if the dividend is negative, else is negative.\n             * DOWN      1 The remainder has the same sign as the dividend.\n             *             This modulo mode is commonly known as 'truncated division' and is\n             *             equivalent to (a % n) in JavaScript.\n             * FLOOR     3 The remainder has the same sign as the divisor (Python %).\n             * HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\n             * EUCLID    9 Euclidian division. q = sign(n) * floor(a / abs(n)).\n             *             The remainder is always positive.\n             *\n             * The truncated division, floored division, Euclidian division and IEEE 754 remainder\n             * modes are commonly used for the modulus operation.\n             * Although the other rounding modes can also be used, they may not give useful results.\n             */\n            MODULO_MODE = 1,                         // 0 to 9\n\n            // The maximum number of significant digits of the result of the toPower operation.\n            // If POW_PRECISION is 0, there will be unlimited significant digits.\n            POW_PRECISION = 100,                     // 0 to MAX\n\n            // The format specification used by the BigNumber.prototype.toFormat method.\n            FORMAT = {\n                decimalSeparator: '.',\n                groupSeparator: ',',\n                groupSize: 3,\n                secondaryGroupSize: 0,\n                fractionGroupSeparator: '\\xA0',      // non-breaking space\n                fractionGroupSize: 0\n            };\n\n\n        /******************************************************************************************/\n\n\n        // CONSTRUCTOR\n\n\n        /*\n         * The BigNumber constructor and exported function.\n         * Create and return a new instance of a BigNumber object.\n         *\n         * n {number|string|BigNumber} A numeric value.\n         * [b] {number} The base of n. Integer, 2 to 64 inclusive.\n         */\n        function BigNumber( n, b ) {\n            var c, e, i, num, len, str,\n                x = this;\n\n            // Enable constructor usage without new.\n            if ( !( x instanceof BigNumber ) ) {\n\n                // 'BigNumber() constructor call without new: {n}'\n                if (ERRORS) raise( 26, 'constructor call without new', n );\n                return new BigNumber( n, b );\n            }\n\n            // 'new BigNumber() base not an integer: {b}'\n            // 'new BigNumber() base out of range: {b}'\n            if ( b == null || !isValidInt( b, 2, 64, id, 'base' ) ) {\n\n                // Duplicate.\n                if ( n instanceof BigNumber ) {\n                    x.s = n.s;\n                    x.e = n.e;\n                    x.c = ( n = n.c ) ? n.slice() : n;\n                    id = 0;\n                    return;\n                }\n\n                if ( ( num = typeof n == 'number' ) && n * 0 == 0 ) {\n                    x.s = 1 / n < 0 ? ( n = -n, -1 ) : 1;\n\n                    // Fast path for integers.\n                    if ( n === ~~n ) {\n                        for ( e = 0, i = n; i >= 10; i /= 10, e++ );\n                        x.e = e;\n                        x.c = [n];\n                        id = 0;\n                        return;\n                    }\n\n                    str = n + '';\n                } else {\n                    if ( !isNumeric.test( str = n + '' ) ) return parseNumeric( x, str, num );\n                    x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1;\n                }\n            } else {\n                b = b | 0;\n                str = n + '';\n\n                // Ensure return value is rounded to DECIMAL_PLACES as with other bases.\n                // Allow exponential notation to be used with base 10 argument.\n                if ( b == 10 ) {\n                    x = new BigNumber( n instanceof BigNumber ? n : str );\n                    return round( x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE );\n                }\n\n                // Avoid potential interpretation of Infinity and NaN as base 44+ values.\n                // Any number in exponential form will fail due to the [Ee][+-].\n                if ( ( num = typeof n == 'number' ) && n * 0 != 0 ||\n                  !( new RegExp( '^-?' + ( c = '[' + ALPHABET.slice( 0, b ) + ']+' ) +\n                    '(?:\\\\.' + c + ')?$',b < 37 ? 'i' : '' ) ).test(str) ) {\n                    return parseNumeric( x, str, num, b );\n                }\n\n                if (num) {\n                    x.s = 1 / n < 0 ? ( str = str.slice(1), -1 ) : 1;\n\n                    if ( ERRORS && str.replace( /^0\\.0*|\\./, '' ).length > 15 ) {\n\n                        // 'new BigNumber() number type has more than 15 significant digits: {n}'\n                        raise( id, tooManyDigits, n );\n                    }\n\n                    // Prevent later check for length on converted number.\n                    num = false;\n                } else {\n                    x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1;\n                }\n\n                str = convertBase( str, 10, b, x.s );\n            }\n\n            // Decimal point?\n            if ( ( e = str.indexOf('.') ) > -1 ) str = str.replace( '.', '' );\n\n            // Exponential form?\n            if ( ( i = str.search( /e/i ) ) > 0 ) {\n\n                // Determine exponent.\n                if ( e < 0 ) e = i;\n                e += +str.slice( i + 1 );\n                str = str.substring( 0, i );\n            } else if ( e < 0 ) {\n\n                // Integer.\n                e = str.length;\n            }\n\n            // Determine leading zeros.\n            for ( i = 0; str.charCodeAt(i) === 48; i++ );\n\n            // Determine trailing zeros.\n            for ( len = str.length; str.charCodeAt(--len) === 48; );\n            str = str.slice( i, len + 1 );\n\n            if (str) {\n                len = str.length;\n\n                // Disallow numbers with over 15 significant digits if number type.\n                // 'new BigNumber() number type has more than 15 significant digits: {n}'\n                if ( num && ERRORS && len > 15 ) raise( id, tooManyDigits, x.s * n );\n\n                e = e - i - 1;\n\n                 // Overflow?\n                if ( e > MAX_EXP ) {\n\n                    // Infinity.\n                    x.c = x.e = null;\n\n                // Underflow?\n                } else if ( e < MIN_EXP ) {\n\n                    // Zero.\n                    x.c = [ x.e = 0 ];\n                } else {\n                    x.e = e;\n                    x.c = [];\n\n                    // Transform base\n\n                    // e is the base 10 exponent.\n                    // i is where to slice str to get the first element of the coefficient array.\n                    i = ( e + 1 ) % LOG_BASE;\n                    if ( e < 0 ) i += LOG_BASE;\n\n                    if ( i < len ) {\n                        if (i) x.c.push( +str.slice( 0, i ) );\n\n                        for ( len -= LOG_BASE; i < len; ) {\n                            x.c.push( +str.slice( i, i += LOG_BASE ) );\n                        }\n\n                        str = str.slice(i);\n                        i = LOG_BASE - str.length;\n                    } else {\n                        i -= len;\n                    }\n\n                    for ( ; i--; str += '0' );\n                    x.c.push( +str );\n                }\n            } else {\n\n                // Zero.\n                x.c = [ x.e = 0 ];\n            }\n\n            id = 0;\n        }\n\n\n        // CONSTRUCTOR PROPERTIES\n\n\n        BigNumber.another = another;\n\n        BigNumber.ROUND_UP = 0;\n        BigNumber.ROUND_DOWN = 1;\n        BigNumber.ROUND_CEIL = 2;\n        BigNumber.ROUND_FLOOR = 3;\n        BigNumber.ROUND_HALF_UP = 4;\n        BigNumber.ROUND_HALF_DOWN = 5;\n        BigNumber.ROUND_HALF_EVEN = 6;\n        BigNumber.ROUND_HALF_CEIL = 7;\n        BigNumber.ROUND_HALF_FLOOR = 8;\n        BigNumber.EUCLID = 9;\n\n\n        /*\n         * Configure infrequently-changing library-wide settings.\n         *\n         * Accept an object or an argument list, with one or many of the following properties or\n         * parameters respectively:\n         *\n         *   DECIMAL_PLACES  {number}  Integer, 0 to MAX inclusive\n         *   ROUNDING_MODE   {number}  Integer, 0 to 8 inclusive\n         *   EXPONENTIAL_AT  {number|number[]}  Integer, -MAX to MAX inclusive or\n         *                                      [integer -MAX to 0 incl., 0 to MAX incl.]\n         *   RANGE           {number|number[]}  Non-zero integer, -MAX to MAX inclusive or\n         *                                      [integer -MAX to -1 incl., integer 1 to MAX incl.]\n         *   ERRORS          {boolean|number}   true, false, 1 or 0\n         *   CRYPTO          {boolean|number}   true, false, 1 or 0\n         *   MODULO_MODE     {number}           0 to 9 inclusive\n         *   POW_PRECISION   {number}           0 to MAX inclusive\n         *   FORMAT          {object}           See BigNumber.prototype.toFormat\n         *      decimalSeparator       {string}\n         *      groupSeparator         {string}\n         *      groupSize              {number}\n         *      secondaryGroupSize     {number}\n         *      fractionGroupSeparator {string}\n         *      fractionGroupSize      {number}\n         *\n         * (The values assigned to the above FORMAT object properties are not checked for validity.)\n         *\n         * E.g.\n         * BigNumber.config(20, 4) is equivalent to\n         * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\n         *\n         * Ignore properties/parameters set to null or undefined.\n         * Return an object with the properties current values.\n         */\n        BigNumber.config = function () {\n            var v, p,\n                i = 0,\n                r = {},\n                a = arguments,\n                o = a[0],\n                has = o && typeof o == 'object'\n                  ? function () { if ( o.hasOwnProperty(p) ) return ( v = o[p] ) != null; }\n                  : function () { if ( a.length > i ) return ( v = a[i++] ) != null; };\n\n            // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\n            // 'config() DECIMAL_PLACES not an integer: {v}'\n            // 'config() DECIMAL_PLACES out of range: {v}'\n            if ( has( p = 'DECIMAL_PLACES' ) && isValidInt( v, 0, MAX, 2, p ) ) {\n                DECIMAL_PLACES = v | 0;\n            }\n            r[p] = DECIMAL_PLACES;\n\n            // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\n            // 'config() ROUNDING_MODE not an integer: {v}'\n            // 'config() ROUNDING_MODE out of range: {v}'\n            if ( has( p = 'ROUNDING_MODE' ) && isValidInt( v, 0, 8, 2, p ) ) {\n                ROUNDING_MODE = v | 0;\n            }\n            r[p] = ROUNDING_MODE;\n\n            // EXPONENTIAL_AT {number|number[]}\n            // Integer, -MAX to MAX inclusive or [integer -MAX to 0 inclusive, 0 to MAX inclusive].\n            // 'config() EXPONENTIAL_AT not an integer: {v}'\n            // 'config() EXPONENTIAL_AT out of range: {v}'\n            if ( has( p = 'EXPONENTIAL_AT' ) ) {\n\n                if ( isArray(v) ) {\n                    if ( isValidInt( v[0], -MAX, 0, 2, p ) && isValidInt( v[1], 0, MAX, 2, p ) ) {\n                        TO_EXP_NEG = v[0] | 0;\n                        TO_EXP_POS = v[1] | 0;\n                    }\n                } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) {\n                    TO_EXP_NEG = -( TO_EXP_POS = ( v < 0 ? -v : v ) | 0 );\n                }\n            }\n            r[p] = [ TO_EXP_NEG, TO_EXP_POS ];\n\n            // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\n            // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\n            // 'config() RANGE not an integer: {v}'\n            // 'config() RANGE cannot be zero: {v}'\n            // 'config() RANGE out of range: {v}'\n            if ( has( p = 'RANGE' ) ) {\n\n                if ( isArray(v) ) {\n                    if ( isValidInt( v[0], -MAX, -1, 2, p ) && isValidInt( v[1], 1, MAX, 2, p ) ) {\n                        MIN_EXP = v[0] | 0;\n                        MAX_EXP = v[1] | 0;\n                    }\n                } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) {\n                    if ( v | 0 ) MIN_EXP = -( MAX_EXP = ( v < 0 ? -v : v ) | 0 );\n                    else if (ERRORS) raise( 2, p + ' cannot be zero', v );\n                }\n            }\n            r[p] = [ MIN_EXP, MAX_EXP ];\n\n            // ERRORS {boolean|number} true, false, 1 or 0.\n            // 'config() ERRORS not a boolean or binary digit: {v}'\n            if ( has( p = 'ERRORS' ) ) {\n\n                if ( v === !!v || v === 1 || v === 0 ) {\n                    id = 0;\n                    isValidInt = ( ERRORS = !!v ) ? intValidatorWithErrors : intValidatorNoErrors;\n                } else if (ERRORS) {\n                    raise( 2, p + notBool, v );\n                }\n            }\n            r[p] = ERRORS;\n\n            // CRYPTO {boolean|number} true, false, 1 or 0.\n            // 'config() CRYPTO not a boolean or binary digit: {v}'\n            // 'config() crypto unavailable: {crypto}'\n            if ( has( p = 'CRYPTO' ) ) {\n\n                if ( v === !!v || v === 1 || v === 0 ) {\n                    CRYPTO = !!( v && crypto && typeof crypto == 'object' );\n                    if ( v && !CRYPTO && ERRORS ) raise( 2, 'crypto unavailable', crypto );\n                } else if (ERRORS) {\n                    raise( 2, p + notBool, v );\n                }\n            }\n            r[p] = CRYPTO;\n\n            // MODULO_MODE {number} Integer, 0 to 9 inclusive.\n            // 'config() MODULO_MODE not an integer: {v}'\n            // 'config() MODULO_MODE out of range: {v}'\n            if ( has( p = 'MODULO_MODE' ) && isValidInt( v, 0, 9, 2, p ) ) {\n                MODULO_MODE = v | 0;\n            }\n            r[p] = MODULO_MODE;\n\n            // POW_PRECISION {number} Integer, 0 to MAX inclusive.\n            // 'config() POW_PRECISION not an integer: {v}'\n            // 'config() POW_PRECISION out of range: {v}'\n            if ( has( p = 'POW_PRECISION' ) && isValidInt( v, 0, MAX, 2, p ) ) {\n                POW_PRECISION = v | 0;\n            }\n            r[p] = POW_PRECISION;\n\n            // FORMAT {object}\n            // 'config() FORMAT not an object: {v}'\n            if ( has( p = 'FORMAT' ) ) {\n\n                if ( typeof v == 'object' ) {\n                    FORMAT = v;\n                } else if (ERRORS) {\n                    raise( 2, p + ' not an object', v );\n                }\n            }\n            r[p] = FORMAT;\n\n            return r;\n        };\n\n\n        /*\n         * Return a new BigNumber whose value is the maximum of the arguments.\n         *\n         * arguments {number|string|BigNumber}\n         */\n        BigNumber.max = function () { return maxOrMin( arguments, P.lt ); };\n\n\n        /*\n         * Return a new BigNumber whose value is the minimum of the arguments.\n         *\n         * arguments {number|string|BigNumber}\n         */\n        BigNumber.min = function () { return maxOrMin( arguments, P.gt ); };\n\n\n        /*\n         * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\n         * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\n         * zeros are produced).\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         *\n         * 'random() decimal places not an integer: {dp}'\n         * 'random() decimal places out of range: {dp}'\n         * 'random() crypto unavailable: {crypto}'\n         */\n        BigNumber.random = (function () {\n            var pow2_53 = 0x20000000000000;\n\n            // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\n            // Check if Math.random() produces more than 32 bits of randomness.\n            // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\n            // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\n            var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\n              ? function () { return mathfloor( Math.random() * pow2_53 ); }\n              : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\n                  (Math.random() * 0x800000 | 0); };\n\n            return function (dp) {\n                var a, b, e, k, v,\n                    i = 0,\n                    c = [],\n                    rand = new BigNumber(ONE);\n\n                dp = dp == null || !isValidInt( dp, 0, MAX, 14 ) ? DECIMAL_PLACES : dp | 0;\n                k = mathceil( dp / LOG_BASE );\n\n                if (CRYPTO) {\n\n                    // Browsers supporting crypto.getRandomValues.\n                    if ( crypto && crypto.getRandomValues ) {\n\n                        a = crypto.getRandomValues( new Uint32Array( k *= 2 ) );\n\n                        for ( ; i < k; ) {\n\n                            // 53 bits:\n                            // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\n                            // 11111 11111111 11111111 11111111 11100000 00000000 00000000\n                            // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\n                            //                                     11111 11111111 11111111\n                            // 0x20000 is 2^21.\n                            v = a[i] * 0x20000 + (a[i + 1] >>> 11);\n\n                            // Rejection sampling:\n                            // 0 <= v < 9007199254740992\n                            // Probability that v >= 9e15, is\n                            // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\n                            if ( v >= 9e15 ) {\n                                b = crypto.getRandomValues( new Uint32Array(2) );\n                                a[i] = b[0];\n                                a[i + 1] = b[1];\n                            } else {\n\n                                // 0 <= v <= 8999999999999999\n                                // 0 <= (v % 1e14) <= 99999999999999\n                                c.push( v % 1e14 );\n                                i += 2;\n                            }\n                        }\n                        i = k / 2;\n\n                    // Node.js supporting crypto.randomBytes.\n                    } else if ( crypto && crypto.randomBytes ) {\n\n                        // buffer\n                        a = crypto.randomBytes( k *= 7 );\n\n                        for ( ; i < k; ) {\n\n                            // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\n                            // 0x100000000 is 2^32, 0x1000000 is 2^24\n                            // 11111 11111111 11111111 11111111 11111111 11111111 11111111\n                            // 0 <= v < 9007199254740992\n                            v = ( ( a[i] & 31 ) * 0x1000000000000 ) + ( a[i + 1] * 0x10000000000 ) +\n                                  ( a[i + 2] * 0x100000000 ) + ( a[i + 3] * 0x1000000 ) +\n                                  ( a[i + 4] << 16 ) + ( a[i + 5] << 8 ) + a[i + 6];\n\n                            if ( v >= 9e15 ) {\n                                crypto.randomBytes(7).copy( a, i );\n                            } else {\n\n                                // 0 <= (v % 1e14) <= 99999999999999\n                                c.push( v % 1e14 );\n                                i += 7;\n                            }\n                        }\n                        i = k / 7;\n                    } else if (ERRORS) {\n                        raise( 14, 'crypto unavailable', crypto );\n                    }\n                }\n\n                // Use Math.random: CRYPTO is false or crypto is unavailable and ERRORS is false.\n                if (!i) {\n\n                    for ( ; i < k; ) {\n                        v = random53bitInt();\n                        if ( v < 9e15 ) c[i++] = v % 1e14;\n                    }\n                }\n\n                k = c[--i];\n                dp %= LOG_BASE;\n\n                // Convert trailing digits to zeros according to dp.\n                if ( k && dp ) {\n                    v = POWS_TEN[LOG_BASE - dp];\n                    c[i] = mathfloor( k / v ) * v;\n                }\n\n                // Remove trailing elements which are zero.\n                for ( ; c[i] === 0; c.pop(), i-- );\n\n                // Zero?\n                if ( i < 0 ) {\n                    c = [ e = 0 ];\n                } else {\n\n                    // Remove leading elements which are zero and adjust exponent accordingly.\n                    for ( e = -1 ; c[0] === 0; c.shift(), e -= LOG_BASE);\n\n                    // Count the digits of the first element of c to determine leading zeros, and...\n                    for ( i = 1, v = c[0]; v >= 10; v /= 10, i++);\n\n                    // adjust the exponent accordingly.\n                    if ( i < LOG_BASE ) e -= LOG_BASE - i;\n                }\n\n                rand.e = e;\n                rand.c = c;\n                return rand;\n            };\n        })();\n\n\n        // PRIVATE FUNCTIONS\n\n\n        // Convert a numeric string of baseIn to a numeric string of baseOut.\n        function convertBase( str, baseOut, baseIn, sign ) {\n            var d, e, k, r, x, xc, y,\n                i = str.indexOf( '.' ),\n                dp = DECIMAL_PLACES,\n                rm = ROUNDING_MODE;\n\n            if ( baseIn < 37 ) str = str.toLowerCase();\n\n            // Non-integer.\n            if ( i >= 0 ) {\n                k = POW_PRECISION;\n\n                // Unlimited precision.\n                POW_PRECISION = 0;\n                str = str.replace( '.', '' );\n                y = new BigNumber(baseIn);\n                x = y.pow( str.length - i );\n                POW_PRECISION = k;\n\n                // Convert str as if an integer, then restore the fraction part by dividing the\n                // result by its base raised to a power.\n                y.c = toBaseOut( toFixedPoint( coeffToString( x.c ), x.e ), 10, baseOut );\n                y.e = y.c.length;\n            }\n\n            // Convert the number as integer.\n            xc = toBaseOut( str, baseIn, baseOut );\n            e = k = xc.length;\n\n            // Remove trailing zeros.\n            for ( ; xc[--k] == 0; xc.pop() );\n            if ( !xc[0] ) return '0';\n\n            if ( i < 0 ) {\n                --e;\n            } else {\n                x.c = xc;\n                x.e = e;\n\n                // sign is needed for correct rounding.\n                x.s = sign;\n                x = div( x, y, dp, rm, baseOut );\n                xc = x.c;\n                r = x.r;\n                e = x.e;\n            }\n\n            d = e + dp + 1;\n\n            // The rounding digit, i.e. the digit to the right of the digit that may be rounded up.\n            i = xc[d];\n            k = baseOut / 2;\n            r = r || d < 0 || xc[d + 1] != null;\n\n            r = rm < 4 ? ( i != null || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) )\n                       : i > k || i == k &&( rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\n                         rm == ( x.s < 0 ? 8 : 7 ) );\n\n            if ( d < 1 || !xc[0] ) {\n\n                // 1^-dp or 0.\n                str = r ? toFixedPoint( '1', -dp ) : '0';\n            } else {\n                xc.length = d;\n\n                if (r) {\n\n                    // Rounding up may mean the previous digit has to be rounded up and so on.\n                    for ( --baseOut; ++xc[--d] > baseOut; ) {\n                        xc[d] = 0;\n\n                        if ( !d ) {\n                            ++e;\n                            xc.unshift(1);\n                        }\n                    }\n                }\n\n                // Determine trailing zeros.\n                for ( k = xc.length; !xc[--k]; );\n\n                // E.g. [4, 11, 15] becomes 4bf.\n                for ( i = 0, str = ''; i <= k; str += ALPHABET.charAt( xc[i++] ) );\n                str = toFixedPoint( str, e );\n            }\n\n            // The caller will add the sign.\n            return str;\n        }\n\n\n        // Perform division in the specified base. Called by div and convertBase.\n        div = (function () {\n\n            // Assume non-zero x and k.\n            function multiply( x, k, base ) {\n                var m, temp, xlo, xhi,\n                    carry = 0,\n                    i = x.length,\n                    klo = k % SQRT_BASE,\n                    khi = k / SQRT_BASE | 0;\n\n                for ( x = x.slice(); i--; ) {\n                    xlo = x[i] % SQRT_BASE;\n                    xhi = x[i] / SQRT_BASE | 0;\n                    m = khi * xlo + xhi * klo;\n                    temp = klo * xlo + ( ( m % SQRT_BASE ) * SQRT_BASE ) + carry;\n                    carry = ( temp / base | 0 ) + ( m / SQRT_BASE | 0 ) + khi * xhi;\n                    x[i] = temp % base;\n                }\n\n                if (carry) x.unshift(carry);\n\n                return x;\n            }\n\n            function compare( a, b, aL, bL ) {\n                var i, cmp;\n\n                if ( aL != bL ) {\n                    cmp = aL > bL ? 1 : -1;\n                } else {\n\n                    for ( i = cmp = 0; i < aL; i++ ) {\n\n                        if ( a[i] != b[i] ) {\n                            cmp = a[i] > b[i] ? 1 : -1;\n                            break;\n                        }\n                    }\n                }\n                return cmp;\n            }\n\n            function subtract( a, b, aL, base ) {\n                var i = 0;\n\n                // Subtract b from a.\n                for ( ; aL--; ) {\n                    a[aL] -= i;\n                    i = a[aL] < b[aL] ? 1 : 0;\n                    a[aL] = i * base + a[aL] - b[aL];\n                }\n\n                // Remove leading zeros.\n                for ( ; !a[0] && a.length > 1; a.shift() );\n            }\n\n            // x: dividend, y: divisor.\n            return function ( x, y, dp, rm, base ) {\n                var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\n                    yL, yz,\n                    s = x.s == y.s ? 1 : -1,\n                    xc = x.c,\n                    yc = y.c;\n\n                // Either NaN, Infinity or 0?\n                if ( !xc || !xc[0] || !yc || !yc[0] ) {\n\n                    return new BigNumber(\n\n                      // Return NaN if either NaN, or both Infinity or 0.\n                      !x.s || !y.s || ( xc ? yc && xc[0] == yc[0] : !yc ) ? NaN :\n\n                        // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\n                        xc && xc[0] == 0 || !yc ? s * 0 : s / 0\n                    );\n                }\n\n                q = new BigNumber(s);\n                qc = q.c = [];\n                e = x.e - y.e;\n                s = dp + e + 1;\n\n                if ( !base ) {\n                    base = BASE;\n                    e = bitFloor( x.e / LOG_BASE ) - bitFloor( y.e / LOG_BASE );\n                    s = s / LOG_BASE | 0;\n                }\n\n                // Result exponent may be one less then the current value of e.\n                // The coefficients of the BigNumbers from convertBase may have trailing zeros.\n                for ( i = 0; yc[i] == ( xc[i] || 0 ); i++ );\n                if ( yc[i] > ( xc[i] || 0 ) ) e--;\n\n                if ( s < 0 ) {\n                    qc.push(1);\n                    more = true;\n                } else {\n                    xL = xc.length;\n                    yL = yc.length;\n                    i = 0;\n                    s += 2;\n\n                    // Normalise xc and yc so highest order digit of yc is >= base / 2.\n\n                    n = mathfloor( base / ( yc[0] + 1 ) );\n\n                    // Not necessary, but to handle odd bases where yc[0] == ( base / 2 ) - 1.\n                    // if ( n > 1 || n++ == 1 && yc[0] < base / 2 ) {\n                    if ( n > 1 ) {\n                        yc = multiply( yc, n, base );\n                        xc = multiply( xc, n, base );\n                        yL = yc.length;\n                        xL = xc.length;\n                    }\n\n                    xi = yL;\n                    rem = xc.slice( 0, yL );\n                    remL = rem.length;\n\n                    // Add zeros to make remainder as long as divisor.\n                    for ( ; remL < yL; rem[remL++] = 0 );\n                    yz = yc.slice();\n                    yz.unshift(0);\n                    yc0 = yc[0];\n                    if ( yc[1] >= base / 2 ) yc0++;\n                    // Not necessary, but to prevent trial digit n > base, when using base 3.\n                    // else if ( base == 3 && yc0 == 1 ) yc0 = 1 + 1e-15;\n\n                    do {\n                        n = 0;\n\n                        // Compare divisor and remainder.\n                        cmp = compare( yc, rem, yL, remL );\n\n                        // If divisor < remainder.\n                        if ( cmp < 0 ) {\n\n                            // Calculate trial digit, n.\n\n                            rem0 = rem[0];\n                            if ( yL != remL ) rem0 = rem0 * base + ( rem[1] || 0 );\n\n                            // n is how many times the divisor goes into the current remainder.\n                            n = mathfloor( rem0 / yc0 );\n\n                            //  Algorithm:\n                            //  1. product = divisor * trial digit (n)\n                            //  2. if product > remainder: product -= divisor, n--\n                            //  3. remainder -= product\n                            //  4. if product was < remainder at 2:\n                            //    5. compare new remainder and divisor\n                            //    6. If remainder > divisor: remainder -= divisor, n++\n\n                            if ( n > 1 ) {\n\n                                // n may be > base only when base is 3.\n                                if (n >= base) n = base - 1;\n\n                                // product = divisor * trial digit.\n                                prod = multiply( yc, n, base );\n                                prodL = prod.length;\n                                remL = rem.length;\n\n                                // Compare product and remainder.\n                                // If product > remainder.\n                                // Trial digit n too high.\n                                // n is 1 too high about 5% of the time, and is not known to have\n                                // ever been more than 1 too high.\n                                while ( compare( prod, rem, prodL, remL ) == 1 ) {\n                                    n--;\n\n                                    // Subtract divisor from product.\n                                    subtract( prod, yL < prodL ? yz : yc, prodL, base );\n                                    prodL = prod.length;\n                                    cmp = 1;\n                                }\n                            } else {\n\n                                // n is 0 or 1, cmp is -1.\n                                // If n is 0, there is no need to compare yc and rem again below,\n                                // so change cmp to 1 to avoid it.\n                                // If n is 1, leave cmp as -1, so yc and rem are compared again.\n                                if ( n == 0 ) {\n\n                                    // divisor < remainder, so n must be at least 1.\n                                    cmp = n = 1;\n                                }\n\n                                // product = divisor\n                                prod = yc.slice();\n                                prodL = prod.length;\n                            }\n\n                            if ( prodL < remL ) prod.unshift(0);\n\n                            // Subtract product from remainder.\n                            subtract( rem, prod, remL, base );\n                            remL = rem.length;\n\n                             // If product was < remainder.\n                            if ( cmp == -1 ) {\n\n                                // Compare divisor and new remainder.\n                                // If divisor < new remainder, subtract divisor from remainder.\n                                // Trial digit n too low.\n                                // n is 1 too low about 5% of the time, and very rarely 2 too low.\n                                while ( compare( yc, rem, yL, remL ) < 1 ) {\n                                    n++;\n\n                                    // Subtract divisor from remainder.\n                                    subtract( rem, yL < remL ? yz : yc, remL, base );\n                                    remL = rem.length;\n                                }\n                            }\n                        } else if ( cmp === 0 ) {\n                            n++;\n                            rem = [0];\n                        } // else cmp === 1 and n will be 0\n\n                        // Add the next digit, n, to the result array.\n                        qc[i++] = n;\n\n                        // Update the remainder.\n                        if ( rem[0] ) {\n                            rem[remL++] = xc[xi] || 0;\n                        } else {\n                            rem = [ xc[xi] ];\n                            remL = 1;\n                        }\n                    } while ( ( xi++ < xL || rem[0] != null ) && s-- );\n\n                    more = rem[0] != null;\n\n                    // Leading zero?\n                    if ( !qc[0] ) qc.shift();\n                }\n\n                if ( base == BASE ) {\n\n                    // To calculate q.e, first get the number of digits of qc[0].\n                    for ( i = 1, s = qc[0]; s >= 10; s /= 10, i++ );\n                    round( q, dp + ( q.e = i + e * LOG_BASE - 1 ) + 1, rm, more );\n\n                // Caller is convertBase.\n                } else {\n                    q.e = e;\n                    q.r = +more;\n                }\n\n                return q;\n            };\n        })();\n\n\n        /*\n         * Return a string representing the value of BigNumber n in fixed-point or exponential\n         * notation rounded to the specified decimal places or significant digits.\n         *\n         * n is a BigNumber.\n         * i is the index of the last digit required (i.e. the digit that may be rounded up).\n         * rm is the rounding mode.\n         * caller is caller id: toExponential 19, toFixed 20, toFormat 21, toPrecision 24.\n         */\n        function format( n, i, rm, caller ) {\n            var c0, e, ne, len, str;\n\n            rm = rm != null && isValidInt( rm, 0, 8, caller, roundingMode )\n              ? rm | 0 : ROUNDING_MODE;\n\n            if ( !n.c ) return n.toString();\n            c0 = n.c[0];\n            ne = n.e;\n\n            if ( i == null ) {\n                str = coeffToString( n.c );\n                str = caller == 19 || caller == 24 && ne <= TO_EXP_NEG\n                  ? toExponential( str, ne )\n                  : toFixedPoint( str, ne );\n            } else {\n                n = round( new BigNumber(n), i, rm );\n\n                // n.e may have changed if the value was rounded up.\n                e = n.e;\n\n                str = coeffToString( n.c );\n                len = str.length;\n\n                // toPrecision returns exponential notation if the number of significant digits\n                // specified is less than the number of digits necessary to represent the integer\n                // part of the value in fixed-point notation.\n\n                // Exponential notation.\n                if ( caller == 19 || caller == 24 && ( i <= e || e <= TO_EXP_NEG ) ) {\n\n                    // Append zeros?\n                    for ( ; len < i; str += '0', len++ );\n                    str = toExponential( str, e );\n\n                // Fixed-point notation.\n                } else {\n                    i -= ne;\n                    str = toFixedPoint( str, e );\n\n                    // Append zeros?\n                    if ( e + 1 > len ) {\n                        if ( --i > 0 ) for ( str += '.'; i--; str += '0' );\n                    } else {\n                        i += e - len;\n                        if ( i > 0 ) {\n                            if ( e + 1 == len ) str += '.';\n                            for ( ; i--; str += '0' );\n                        }\n                    }\n                }\n            }\n\n            return n.s < 0 && c0 ? '-' + str : str;\n        }\n\n\n        // Handle BigNumber.max and BigNumber.min.\n        function maxOrMin( args, method ) {\n            var m, n,\n                i = 0;\n\n            if ( isArray( args[0] ) ) args = args[0];\n            m = new BigNumber( args[0] );\n\n            for ( ; ++i < args.length; ) {\n                n = new BigNumber( args[i] );\n\n                // If any number is NaN, return NaN.\n                if ( !n.s ) {\n                    m = n;\n                    break;\n                } else if ( method.call( m, n ) ) {\n                    m = n;\n                }\n            }\n\n            return m;\n        }\n\n\n        /*\n         * Return true if n is an integer in range, otherwise throw.\n         * Use for argument validation when ERRORS is true.\n         */\n        function intValidatorWithErrors( n, min, max, caller, name ) {\n            if ( n < min || n > max || n != truncate(n) ) {\n                raise( caller, ( name || 'decimal places' ) +\n                  ( n < min || n > max ? ' out of range' : ' not an integer' ), n );\n            }\n\n            return true;\n        }\n\n\n        /*\n         * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\n         * Called by minus, plus and times.\n         */\n        function normalise( n, c, e ) {\n            var i = 1,\n                j = c.length;\n\n             // Remove trailing zeros.\n            for ( ; !c[--j]; c.pop() );\n\n            // Calculate the base 10 exponent. First get the number of digits of c[0].\n            for ( j = c[0]; j >= 10; j /= 10, i++ );\n\n            // Overflow?\n            if ( ( e = i + e * LOG_BASE - 1 ) > MAX_EXP ) {\n\n                // Infinity.\n                n.c = n.e = null;\n\n            // Underflow?\n            } else if ( e < MIN_EXP ) {\n\n                // Zero.\n                n.c = [ n.e = 0 ];\n            } else {\n                n.e = e;\n                n.c = c;\n            }\n\n            return n;\n        }\n\n\n        // Handle values that fail the validity test in BigNumber.\n        parseNumeric = (function () {\n            var basePrefix = /^(-?)0([xbo])/i,\n                dotAfter = /^([^.]+)\\.$/,\n                dotBefore = /^\\.([^.]+)$/,\n                isInfinityOrNaN = /^-?(Infinity|NaN)$/,\n                whitespaceOrPlus = /^\\s*\\+|^\\s+|\\s+$/g;\n\n            return function ( x, str, num, b ) {\n                var base,\n                    s = num ? str : str.replace( whitespaceOrPlus, '' );\n\n                // No exception on ±Infinity or NaN.\n                if ( isInfinityOrNaN.test(s) ) {\n                    x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\n                } else {\n                    if ( !num ) {\n\n                        // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\n                        s = s.replace( basePrefix, function ( m, p1, p2 ) {\n                            base = ( p2 = p2.toLowerCase() ) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\n                            return !b || b == base ? p1 : m;\n                        });\n\n                        if (b) {\n                            base = b;\n\n                            // E.g. '1.' to '1', '.1' to '0.1'\n                            s = s.replace( dotAfter, '$1' ).replace( dotBefore, '0.$1' );\n                        }\n\n                        if ( str != s ) return new BigNumber( s, base );\n                    }\n\n                    // 'new BigNumber() not a number: {n}'\n                    // 'new BigNumber() not a base {b} number: {n}'\n                    if (ERRORS) raise( id, 'not a' + ( b ? ' base ' + b : '' ) + ' number', str );\n                    x.s = null;\n                }\n\n                x.c = x.e = null;\n                id = 0;\n            }\n        })();\n\n\n        // Throw a BigNumber Error.\n        function raise( caller, msg, val ) {\n            var error = new Error( [\n                'new BigNumber',     // 0\n                'cmp',               // 1\n                'config',            // 2\n                'div',               // 3\n                'divToInt',          // 4\n                'eq',                // 5\n                'gt',                // 6\n                'gte',               // 7\n                'lt',                // 8\n                'lte',               // 9\n                'minus',             // 10\n                'mod',               // 11\n                'plus',              // 12\n                'precision',         // 13\n                'random',            // 14\n                'round',             // 15\n                'shift',             // 16\n                'times',             // 17\n                'toDigits',          // 18\n                'toExponential',     // 19\n                'toFixed',           // 20\n                'toFormat',          // 21\n                'toFraction',        // 22\n                'pow',               // 23\n                'toPrecision',       // 24\n                'toString',          // 25\n                'BigNumber'          // 26\n            ][caller] + '() ' + msg + ': ' + val );\n\n            error.name = 'BigNumber Error';\n            id = 0;\n            throw error;\n        }\n\n\n        /*\n         * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\n         * If r is truthy, it is known that there are more digits after the rounding digit.\n         */\n        function round( x, sd, rm, r ) {\n            var d, i, j, k, n, ni, rd,\n                xc = x.c,\n                pows10 = POWS_TEN;\n\n            // if x is not Infinity or NaN...\n            if (xc) {\n\n                // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\n                // n is a base 1e14 number, the value of the element of array x.c containing rd.\n                // ni is the index of n within x.c.\n                // d is the number of digits of n.\n                // i is the index of rd within n including leading zeros.\n                // j is the actual index of rd within n (if < 0, rd is a leading zero).\n                out: {\n\n                    // Get the number of digits of the first element of xc.\n                    for ( d = 1, k = xc[0]; k >= 10; k /= 10, d++ );\n                    i = sd - d;\n\n                    // If the rounding digit is in the first element of xc...\n                    if ( i < 0 ) {\n                        i += LOG_BASE;\n                        j = sd;\n                        n = xc[ ni = 0 ];\n\n                        // Get the rounding digit at index j of n.\n                        rd = n / pows10[ d - j - 1 ] % 10 | 0;\n                    } else {\n                        ni = mathceil( ( i + 1 ) / LOG_BASE );\n\n                        if ( ni >= xc.length ) {\n\n                            if (r) {\n\n                                // Needed by sqrt.\n                                for ( ; xc.length <= ni; xc.push(0) );\n                                n = rd = 0;\n                                d = 1;\n                                i %= LOG_BASE;\n                                j = i - LOG_BASE + 1;\n                            } else {\n                                break out;\n                            }\n                        } else {\n                            n = k = xc[ni];\n\n                            // Get the number of digits of n.\n                            for ( d = 1; k >= 10; k /= 10, d++ );\n\n                            // Get the index of rd within n.\n                            i %= LOG_BASE;\n\n                            // Get the index of rd within n, adjusted for leading zeros.\n                            // The number of leading zeros of n is given by LOG_BASE - d.\n                            j = i - LOG_BASE + d;\n\n                            // Get the rounding digit at index j of n.\n                            rd = j < 0 ? 0 : n / pows10[ d - j - 1 ] % 10 | 0;\n                        }\n                    }\n\n                    r = r || sd < 0 ||\n\n                    // Are there any non-zero digits after the rounding digit?\n                    // The expression  n % pows10[ d - j - 1 ]  returns all digits of n to the right\n                    // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\n                      xc[ni + 1] != null || ( j < 0 ? n : n % pows10[ d - j - 1 ] );\n\n                    r = rm < 4\n                      ? ( rd || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) )\n                      : rd > 5 || rd == 5 && ( rm == 4 || r || rm == 6 &&\n\n                        // Check whether the digit to the left of the rounding digit is odd.\n                        ( ( i > 0 ? j > 0 ? n / pows10[ d - j ] : 0 : xc[ni - 1] ) % 10 ) & 1 ||\n                          rm == ( x.s < 0 ? 8 : 7 ) );\n\n                    if ( sd < 1 || !xc[0] ) {\n                        xc.length = 0;\n\n                        if (r) {\n\n                            // Convert sd to decimal places.\n                            sd -= x.e + 1;\n\n                            // 1, 0.1, 0.01, 0.001, 0.0001 etc.\n                            xc[0] = pows10[ sd % LOG_BASE ];\n                            x.e = -sd || 0;\n                        } else {\n\n                            // Zero.\n                            xc[0] = x.e = 0;\n                        }\n\n                        return x;\n                    }\n\n                    // Remove excess digits.\n                    if ( i == 0 ) {\n                        xc.length = ni;\n                        k = 1;\n                        ni--;\n                    } else {\n                        xc.length = ni + 1;\n                        k = pows10[ LOG_BASE - i ];\n\n                        // E.g. 56700 becomes 56000 if 7 is the rounding digit.\n                        // j > 0 means i > number of leading zeros of n.\n                        xc[ni] = j > 0 ? mathfloor( n / pows10[ d - j ] % pows10[j] ) * k : 0;\n                    }\n\n                    // Round up?\n                    if (r) {\n\n                        for ( ; ; ) {\n\n                            // If the digit to be rounded up is in the first element of xc...\n                            if ( ni == 0 ) {\n\n                                // i will be the length of xc[0] before k is added.\n                                for ( i = 1, j = xc[0]; j >= 10; j /= 10, i++ );\n                                j = xc[0] += k;\n                                for ( k = 1; j >= 10; j /= 10, k++ );\n\n                                // if i != k the length has increased.\n                                if ( i != k ) {\n                                    x.e++;\n                                    if ( xc[0] == BASE ) xc[0] = 1;\n                                }\n\n                                break;\n                            } else {\n                                xc[ni] += k;\n                                if ( xc[ni] != BASE ) break;\n                                xc[ni--] = 0;\n                                k = 1;\n                            }\n                        }\n                    }\n\n                    // Remove trailing zeros.\n                    for ( i = xc.length; xc[--i] === 0; xc.pop() );\n                }\n\n                // Overflow? Infinity.\n                if ( x.e > MAX_EXP ) {\n                    x.c = x.e = null;\n\n                // Underflow? Zero.\n                } else if ( x.e < MIN_EXP ) {\n                    x.c = [ x.e = 0 ];\n                }\n            }\n\n            return x;\n        }\n\n\n        // PROTOTYPE/INSTANCE METHODS\n\n\n        /*\n         * Return a new BigNumber whose value is the absolute value of this BigNumber.\n         */\n        P.absoluteValue = P.abs = function () {\n            var x = new BigNumber(this);\n            if ( x.s < 0 ) x.s = 1;\n            return x;\n        };\n\n\n        /*\n         * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole\n         * number in the direction of Infinity.\n         */\n        P.ceil = function () {\n            return round( new BigNumber(this), this.e + 1, 2 );\n        };\n\n\n        /*\n         * Return\n         * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\n         * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\n         * 0 if they have the same value,\n         * or null if the value of either is NaN.\n         */\n        P.comparedTo = P.cmp = function ( y, b ) {\n            id = 1;\n            return compare( this, new BigNumber( y, b ) );\n        };\n\n\n        /*\n         * Return the number of decimal places of the value of this BigNumber, or null if the value\n         * of this BigNumber is ±Infinity or NaN.\n         */\n        P.decimalPlaces = P.dp = function () {\n            var n, v,\n                c = this.c;\n\n            if ( !c ) return null;\n            n = ( ( v = c.length - 1 ) - bitFloor( this.e / LOG_BASE ) ) * LOG_BASE;\n\n            // Subtract the number of trailing zeros of the last number.\n            if ( v = c[v] ) for ( ; v % 10 == 0; v /= 10, n-- );\n            if ( n < 0 ) n = 0;\n\n            return n;\n        };\n\n\n        /*\n         *  n / 0 = I\n         *  n / N = N\n         *  n / I = 0\n         *  0 / n = 0\n         *  0 / 0 = N\n         *  0 / N = N\n         *  0 / I = 0\n         *  N / n = N\n         *  N / 0 = N\n         *  N / N = N\n         *  N / I = N\n         *  I / n = I\n         *  I / 0 = I\n         *  I / N = N\n         *  I / I = N\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\n         * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\n         */\n        P.dividedBy = P.div = function ( y, b ) {\n            id = 3;\n            return div( this, new BigNumber( y, b ), DECIMAL_PLACES, ROUNDING_MODE );\n        };\n\n\n        /*\n         * Return a new BigNumber whose value is the integer part of dividing the value of this\n         * BigNumber by the value of BigNumber(y, b).\n         */\n        P.dividedToIntegerBy = P.divToInt = function ( y, b ) {\n            id = 4;\n            return div( this, new BigNumber( y, b ), 0, 1 );\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\n         * otherwise returns false.\n         */\n        P.equals = P.eq = function ( y, b ) {\n            id = 5;\n            return compare( this, new BigNumber( y, b ) ) === 0;\n        };\n\n\n        /*\n         * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole\n         * number in the direction of -Infinity.\n         */\n        P.floor = function () {\n            return round( new BigNumber(this), this.e + 1, 3 );\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\n         * otherwise returns false.\n         */\n        P.greaterThan = P.gt = function ( y, b ) {\n            id = 6;\n            return compare( this, new BigNumber( y, b ) ) > 0;\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is greater than or equal to the value of\n         * BigNumber(y, b), otherwise returns false.\n         */\n        P.greaterThanOrEqualTo = P.gte = function ( y, b ) {\n            id = 7;\n            return ( b = compare( this, new BigNumber( y, b ) ) ) === 1 || b === 0;\n\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is a finite number, otherwise returns false.\n         */\n        P.isFinite = function () {\n            return !!this.c;\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is an integer, otherwise return false.\n         */\n        P.isInteger = P.isInt = function () {\n            return !!this.c && bitFloor( this.e / LOG_BASE ) > this.c.length - 2;\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is NaN, otherwise returns false.\n         */\n        P.isNaN = function () {\n            return !this.s;\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is negative, otherwise returns false.\n         */\n        P.isNegative = P.isNeg = function () {\n            return this.s < 0;\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is 0 or -0, otherwise returns false.\n         */\n        P.isZero = function () {\n            return !!this.c && this.c[0] == 0;\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\n         * otherwise returns false.\n         */\n        P.lessThan = P.lt = function ( y, b ) {\n            id = 8;\n            return compare( this, new BigNumber( y, b ) ) < 0;\n        };\n\n\n        /*\n         * Return true if the value of this BigNumber is less than or equal to the value of\n         * BigNumber(y, b), otherwise returns false.\n         */\n        P.lessThanOrEqualTo = P.lte = function ( y, b ) {\n            id = 9;\n            return ( b = compare( this, new BigNumber( y, b ) ) ) === -1 || b === 0;\n        };\n\n\n        /*\n         *  n - 0 = n\n         *  n - N = N\n         *  n - I = -I\n         *  0 - n = -n\n         *  0 - 0 = 0\n         *  0 - N = N\n         *  0 - I = -I\n         *  N - n = N\n         *  N - 0 = N\n         *  N - N = N\n         *  N - I = N\n         *  I - n = I\n         *  I - 0 = I\n         *  I - N = N\n         *  I - I = N\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber minus the value of\n         * BigNumber(y, b).\n         */\n        P.minus = P.sub = function ( y, b ) {\n            var i, j, t, xLTy,\n                x = this,\n                a = x.s;\n\n            id = 10;\n            y = new BigNumber( y, b );\n            b = y.s;\n\n            // Either NaN?\n            if ( !a || !b ) return new BigNumber(NaN);\n\n            // Signs differ?\n            if ( a != b ) {\n                y.s = -b;\n                return x.plus(y);\n            }\n\n            var xe = x.e / LOG_BASE,\n                ye = y.e / LOG_BASE,\n                xc = x.c,\n                yc = y.c;\n\n            if ( !xe || !ye ) {\n\n                // Either Infinity?\n                if ( !xc || !yc ) return xc ? ( y.s = -b, y ) : new BigNumber( yc ? x : NaN );\n\n                // Either zero?\n                if ( !xc[0] || !yc[0] ) {\n\n                    // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\n                    return yc[0] ? ( y.s = -b, y ) : new BigNumber( xc[0] ? x :\n\n                      // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\n                      ROUNDING_MODE == 3 ? -0 : 0 );\n                }\n            }\n\n            xe = bitFloor(xe);\n            ye = bitFloor(ye);\n            xc = xc.slice();\n\n            // Determine which is the bigger number.\n            if ( a = xe - ye ) {\n\n                if ( xLTy = a < 0 ) {\n                    a = -a;\n                    t = xc;\n                } else {\n                    ye = xe;\n                    t = yc;\n                }\n\n                t.reverse();\n\n                // Prepend zeros to equalise exponents.\n                for ( b = a; b--; t.push(0) );\n                t.reverse();\n            } else {\n\n                // Exponents equal. Check digit by digit.\n                j = ( xLTy = ( a = xc.length ) < ( b = yc.length ) ) ? a : b;\n\n                for ( a = b = 0; b < j; b++ ) {\n\n                    if ( xc[b] != yc[b] ) {\n                        xLTy = xc[b] < yc[b];\n                        break;\n                    }\n                }\n            }\n\n            // x < y? Point xc to the array of the bigger number.\n            if (xLTy) t = xc, xc = yc, yc = t, y.s = -y.s;\n\n            b = ( j = yc.length ) - ( i = xc.length );\n\n            // Append zeros to xc if shorter.\n            // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\n            if ( b > 0 ) for ( ; b--; xc[i++] = 0 );\n            b = BASE - 1;\n\n            // Subtract yc from xc.\n            for ( ; j > a; ) {\n\n                if ( xc[--j] < yc[j] ) {\n                    for ( i = j; i && !xc[--i]; xc[i] = b );\n                    --xc[i];\n                    xc[j] += BASE;\n                }\n\n                xc[j] -= yc[j];\n            }\n\n            // Remove leading zeros and adjust exponent accordingly.\n            for ( ; xc[0] == 0; xc.shift(), --ye );\n\n            // Zero?\n            if ( !xc[0] ) {\n\n                // Following IEEE 754 (2008) 6.3,\n                // n - n = +0  but  n - n = -0  when rounding towards -Infinity.\n                y.s = ROUNDING_MODE == 3 ? -1 : 1;\n                y.c = [ y.e = 0 ];\n                return y;\n            }\n\n            // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\n            // for finite x and y.\n            return normalise( y, xc, ye );\n        };\n\n\n        /*\n         *   n % 0 =  N\n         *   n % N =  N\n         *   n % I =  n\n         *   0 % n =  0\n         *  -0 % n = -0\n         *   0 % 0 =  N\n         *   0 % N =  N\n         *   0 % I =  0\n         *   N % n =  N\n         *   N % 0 =  N\n         *   N % N =  N\n         *   N % I =  N\n         *   I % n =  N\n         *   I % 0 =  N\n         *   I % N =  N\n         *   I % I =  N\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\n         * BigNumber(y, b). The result depends on the value of MODULO_MODE.\n         */\n        P.modulo = P.mod = function ( y, b ) {\n            var q, s,\n                x = this;\n\n            id = 11;\n            y = new BigNumber( y, b );\n\n            // Return NaN if x is Infinity or NaN, or y is NaN or zero.\n            if ( !x.c || !y.s || y.c && !y.c[0] ) {\n                return new BigNumber(NaN);\n\n            // Return x if y is Infinity or x is zero.\n            } else if ( !y.c || x.c && !x.c[0] ) {\n                return new BigNumber(x);\n            }\n\n            if ( MODULO_MODE == 9 ) {\n\n                // Euclidian division: q = sign(y) * floor(x / abs(y))\n                // r = x - qy    where  0 <= r < abs(y)\n                s = y.s;\n                y.s = 1;\n                q = div( x, y, 0, 3 );\n                y.s = s;\n                q.s *= s;\n            } else {\n                q = div( x, y, 0, MODULO_MODE );\n            }\n\n            return x.minus( q.times(y) );\n        };\n\n\n        /*\n         * Return a new BigNumber whose value is the value of this BigNumber negated,\n         * i.e. multiplied by -1.\n         */\n        P.negated = P.neg = function () {\n            var x = new BigNumber(this);\n            x.s = -x.s || null;\n            return x;\n        };\n\n\n        /*\n         *  n + 0 = n\n         *  n + N = N\n         *  n + I = I\n         *  0 + n = n\n         *  0 + 0 = 0\n         *  0 + N = N\n         *  0 + I = I\n         *  N + n = N\n         *  N + 0 = N\n         *  N + N = N\n         *  N + I = N\n         *  I + n = I\n         *  I + 0 = I\n         *  I + N = N\n         *  I + I = I\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber plus the value of\n         * BigNumber(y, b).\n         */\n        P.plus = P.add = function ( y, b ) {\n            var t,\n                x = this,\n                a = x.s;\n\n            id = 12;\n            y = new BigNumber( y, b );\n            b = y.s;\n\n            // Either NaN?\n            if ( !a || !b ) return new BigNumber(NaN);\n\n            // Signs differ?\n             if ( a != b ) {\n                y.s = -b;\n                return x.minus(y);\n            }\n\n            var xe = x.e / LOG_BASE,\n                ye = y.e / LOG_BASE,\n                xc = x.c,\n                yc = y.c;\n\n            if ( !xe || !ye ) {\n\n                // Return ±Infinity if either ±Infinity.\n                if ( !xc || !yc ) return new BigNumber( a / 0 );\n\n                // Either zero?\n                // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\n                if ( !xc[0] || !yc[0] ) return yc[0] ? y : new BigNumber( xc[0] ? x : a * 0 );\n            }\n\n            xe = bitFloor(xe);\n            ye = bitFloor(ye);\n            xc = xc.slice();\n\n            // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\n            if ( a = xe - ye ) {\n                if ( a > 0 ) {\n                    ye = xe;\n                    t = yc;\n                } else {\n                    a = -a;\n                    t = xc;\n                }\n\n                t.reverse();\n                for ( ; a--; t.push(0) );\n                t.reverse();\n            }\n\n            a = xc.length;\n            b = yc.length;\n\n            // Point xc to the longer array, and b to the shorter length.\n            if ( a - b < 0 ) t = yc, yc = xc, xc = t, b = a;\n\n            // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\n            for ( a = 0; b; ) {\n                a = ( xc[--b] = xc[b] + yc[b] + a ) / BASE | 0;\n                xc[b] %= BASE;\n            }\n\n            if (a) {\n                xc.unshift(a);\n                ++ye;\n            }\n\n            // No need to check for zero, as +x + +y != 0 && -x + -y != 0\n            // ye = MAX_EXP + 1 possible\n            return normalise( y, xc, ye );\n        };\n\n\n        /*\n         * Return the number of significant digits of the value of this BigNumber.\n         *\n         * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\n         */\n        P.precision = P.sd = function (z) {\n            var n, v,\n                x = this,\n                c = x.c;\n\n            // 'precision() argument not a boolean or binary digit: {z}'\n            if ( z != null && z !== !!z && z !== 1 && z !== 0 ) {\n                if (ERRORS) raise( 13, 'argument' + notBool, z );\n                if ( z != !!z ) z = null;\n            }\n\n            if ( !c ) return null;\n            v = c.length - 1;\n            n = v * LOG_BASE + 1;\n\n            if ( v = c[v] ) {\n\n                // Subtract the number of trailing zeros of the last element.\n                for ( ; v % 10 == 0; v /= 10, n-- );\n\n                // Add the number of digits of the first element.\n                for ( v = c[0]; v >= 10; v /= 10, n++ );\n            }\n\n            if ( z && x.e + 1 > n ) n = x.e + 1;\n\n            return n;\n        };\n\n\n        /*\n         * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of\n         * dp decimal places using rounding mode rm, or to 0 and ROUNDING_MODE respectively if\n         * omitted.\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'round() decimal places out of range: {dp}'\n         * 'round() decimal places not an integer: {dp}'\n         * 'round() rounding mode not an integer: {rm}'\n         * 'round() rounding mode out of range: {rm}'\n         */\n        P.round = function ( dp, rm ) {\n            var n = new BigNumber(this);\n\n            if ( dp == null || isValidInt( dp, 0, MAX, 15 ) ) {\n                round( n, ~~dp + this.e + 1, rm == null ||\n                  !isValidInt( rm, 0, 8, 15, roundingMode ) ? ROUNDING_MODE : rm | 0 );\n            }\n\n            return n;\n        };\n\n\n        /*\n         * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\n         * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\n         *\n         * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\n         *\n         * If k is out of range and ERRORS is false, the result will be ±0 if k < 0, or ±Infinity\n         * otherwise.\n         *\n         * 'shift() argument not an integer: {k}'\n         * 'shift() argument out of range: {k}'\n         */\n        P.shift = function (k) {\n            var n = this;\n            return isValidInt( k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 16, 'argument' )\n\n              // k < 1e+21, or truncate(k) will produce exponential notation.\n              ? n.times( '1e' + truncate(k) )\n              : new BigNumber( n.c && n.c[0] && ( k < -MAX_SAFE_INTEGER || k > MAX_SAFE_INTEGER )\n                ? n.s * ( k < 0 ? 0 : 1 / 0 )\n                : n );\n        };\n\n\n        /*\n         *  sqrt(-n) =  N\n         *  sqrt( N) =  N\n         *  sqrt(-I) =  N\n         *  sqrt( I) =  I\n         *  sqrt( 0) =  0\n         *  sqrt(-0) = -0\n         *\n         * Return a new BigNumber whose value is the square root of the value of this BigNumber,\n         * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\n         */\n        P.squareRoot = P.sqrt = function () {\n            var m, n, r, rep, t,\n                x = this,\n                c = x.c,\n                s = x.s,\n                e = x.e,\n                dp = DECIMAL_PLACES + 4,\n                half = new BigNumber('0.5');\n\n            // Negative/NaN/Infinity/zero?\n            if ( s !== 1 || !c || !c[0] ) {\n                return new BigNumber( !s || s < 0 && ( !c || c[0] ) ? NaN : c ? x : 1 / 0 );\n            }\n\n            // Initial estimate.\n            s = Math.sqrt( +x );\n\n            // Math.sqrt underflow/overflow?\n            // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\n            if ( s == 0 || s == 1 / 0 ) {\n                n = coeffToString(c);\n                if ( ( n.length + e ) % 2 == 0 ) n += '0';\n                s = Math.sqrt(n);\n                e = bitFloor( ( e + 1 ) / 2 ) - ( e < 0 || e % 2 );\n\n                if ( s == 1 / 0 ) {\n                    n = '1e' + e;\n                } else {\n                    n = s.toExponential();\n                    n = n.slice( 0, n.indexOf('e') + 1 ) + e;\n                }\n\n                r = new BigNumber(n);\n            } else {\n                r = new BigNumber( s + '' );\n            }\n\n            // Check for zero.\n            // r could be zero if MIN_EXP is changed after the this value was created.\n            // This would cause a division by zero (x/t) and hence Infinity below, which would cause\n            // coeffToString to throw.\n            if ( r.c[0] ) {\n                e = r.e;\n                s = e + dp;\n                if ( s < 3 ) s = 0;\n\n                // Newton-Raphson iteration.\n                for ( ; ; ) {\n                    t = r;\n                    r = half.times( t.plus( div( x, t, dp, 1 ) ) );\n\n                    if ( coeffToString( t.c   ).slice( 0, s ) === ( n =\n                         coeffToString( r.c ) ).slice( 0, s ) ) {\n\n                        // The exponent of r may here be one less than the final result exponent,\n                        // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\n                        // are indexed correctly.\n                        if ( r.e < e ) --s;\n                        n = n.slice( s - 3, s + 1 );\n\n                        // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\n                        // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\n                        // iteration.\n                        if ( n == '9999' || !rep && n == '4999' ) {\n\n                            // On the first iteration only, check to see if rounding up gives the\n                            // exact result as the nines may infinitely repeat.\n                            if ( !rep ) {\n                                round( t, t.e + DECIMAL_PLACES + 2, 0 );\n\n                                if ( t.times(t).eq(x) ) {\n                                    r = t;\n                                    break;\n                                }\n                            }\n\n                            dp += 4;\n                            s += 4;\n                            rep = 1;\n                        } else {\n\n                            // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\n                            // result. If not, then there are further digits and m will be truthy.\n                            if ( !+n || !+n.slice(1) && n.charAt(0) == '5' ) {\n\n                                // Truncate to the first rounding digit.\n                                round( r, r.e + DECIMAL_PLACES + 2, 1 );\n                                m = !r.times(r).eq(x);\n                            }\n\n                            break;\n                        }\n                    }\n                }\n            }\n\n            return round( r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m );\n        };\n\n\n        /*\n         *  n * 0 = 0\n         *  n * N = N\n         *  n * I = I\n         *  0 * n = 0\n         *  0 * 0 = 0\n         *  0 * N = N\n         *  0 * I = N\n         *  N * n = N\n         *  N * 0 = N\n         *  N * N = N\n         *  N * I = N\n         *  I * n = I\n         *  I * 0 = N\n         *  I * N = N\n         *  I * I = I\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber times the value of\n         * BigNumber(y, b).\n         */\n        P.times = P.mul = function ( y, b ) {\n            var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\n                base, sqrtBase,\n                x = this,\n                xc = x.c,\n                yc = ( id = 17, y = new BigNumber( y, b ) ).c;\n\n            // Either NaN, ±Infinity or ±0?\n            if ( !xc || !yc || !xc[0] || !yc[0] ) {\n\n                // Return NaN if either is NaN, or one is 0 and the other is Infinity.\n                if ( !x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc ) {\n                    y.c = y.e = y.s = null;\n                } else {\n                    y.s *= x.s;\n\n                    // Return ±Infinity if either is ±Infinity.\n                    if ( !xc || !yc ) {\n                        y.c = y.e = null;\n\n                    // Return ±0 if either is ±0.\n                    } else {\n                        y.c = [0];\n                        y.e = 0;\n                    }\n                }\n\n                return y;\n            }\n\n            e = bitFloor( x.e / LOG_BASE ) + bitFloor( y.e / LOG_BASE );\n            y.s *= x.s;\n            xcL = xc.length;\n            ycL = yc.length;\n\n            // Ensure xc points to longer array and xcL to its length.\n            if ( xcL < ycL ) zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i;\n\n            // Initialise the result array with zeros.\n            for ( i = xcL + ycL, zc = []; i--; zc.push(0) );\n\n            base = BASE;\n            sqrtBase = SQRT_BASE;\n\n            for ( i = ycL; --i >= 0; ) {\n                c = 0;\n                ylo = yc[i] % sqrtBase;\n                yhi = yc[i] / sqrtBase | 0;\n\n                for ( k = xcL, j = i + k; j > i; ) {\n                    xlo = xc[--k] % sqrtBase;\n                    xhi = xc[k] / sqrtBase | 0;\n                    m = yhi * xlo + xhi * ylo;\n                    xlo = ylo * xlo + ( ( m % sqrtBase ) * sqrtBase ) + zc[j] + c;\n                    c = ( xlo / base | 0 ) + ( m / sqrtBase | 0 ) + yhi * xhi;\n                    zc[j--] = xlo % base;\n                }\n\n                zc[j] = c;\n            }\n\n            if (c) {\n                ++e;\n            } else {\n                zc.shift();\n            }\n\n            return normalise( y, zc, e );\n        };\n\n\n        /*\n         * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of\n         * sd significant digits using rounding mode rm, or ROUNDING_MODE if rm is omitted.\n         *\n         * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toDigits() precision out of range: {sd}'\n         * 'toDigits() precision not an integer: {sd}'\n         * 'toDigits() rounding mode not an integer: {rm}'\n         * 'toDigits() rounding mode out of range: {rm}'\n         */\n        P.toDigits = function ( sd, rm ) {\n            var n = new BigNumber(this);\n            sd = sd == null || !isValidInt( sd, 1, MAX, 18, 'precision' ) ? null : sd | 0;\n            rm = rm == null || !isValidInt( rm, 0, 8, 18, roundingMode ) ? ROUNDING_MODE : rm | 0;\n            return sd ? round( n, sd, rm ) : n;\n        };\n\n\n        /*\n         * Return a string representing the value of this BigNumber in exponential notation and\n         * rounded using ROUNDING_MODE to dp fixed decimal places.\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toExponential() decimal places not an integer: {dp}'\n         * 'toExponential() decimal places out of range: {dp}'\n         * 'toExponential() rounding mode not an integer: {rm}'\n         * 'toExponential() rounding mode out of range: {rm}'\n         */\n        P.toExponential = function ( dp, rm ) {\n            return format( this,\n              dp != null && isValidInt( dp, 0, MAX, 19 ) ? ~~dp + 1 : null, rm, 19 );\n        };\n\n\n        /*\n         * Return a string representing the value of this BigNumber in fixed-point notation rounding\n         * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\n         *\n         * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\n         * but e.g. (-0.00001).toFixed(0) is '-0'.\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toFixed() decimal places not an integer: {dp}'\n         * 'toFixed() decimal places out of range: {dp}'\n         * 'toFixed() rounding mode not an integer: {rm}'\n         * 'toFixed() rounding mode out of range: {rm}'\n         */\n        P.toFixed = function ( dp, rm ) {\n            return format( this, dp != null && isValidInt( dp, 0, MAX, 20 )\n              ? ~~dp + this.e + 1 : null, rm, 20 );\n        };\n\n\n        /*\n         * Return a string representing the value of this BigNumber in fixed-point notation rounded\n         * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\n         * of the FORMAT object (see BigNumber.config).\n         *\n         * FORMAT = {\n         *      decimalSeparator : '.',\n         *      groupSeparator : ',',\n         *      groupSize : 3,\n         *      secondaryGroupSize : 0,\n         *      fractionGroupSeparator : '\\xA0',    // non-breaking space\n         *      fractionGroupSize : 0\n         * };\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toFormat() decimal places not an integer: {dp}'\n         * 'toFormat() decimal places out of range: {dp}'\n         * 'toFormat() rounding mode not an integer: {rm}'\n         * 'toFormat() rounding mode out of range: {rm}'\n         */\n        P.toFormat = function ( dp, rm ) {\n            var str = format( this, dp != null && isValidInt( dp, 0, MAX, 21 )\n              ? ~~dp + this.e + 1 : null, rm, 21 );\n\n            if ( this.c ) {\n                var i,\n                    arr = str.split('.'),\n                    g1 = +FORMAT.groupSize,\n                    g2 = +FORMAT.secondaryGroupSize,\n                    groupSeparator = FORMAT.groupSeparator,\n                    intPart = arr[0],\n                    fractionPart = arr[1],\n                    isNeg = this.s < 0,\n                    intDigits = isNeg ? intPart.slice(1) : intPart,\n                    len = intDigits.length;\n\n                if (g2) i = g1, g1 = g2, g2 = i, len -= i;\n\n                if ( g1 > 0 && len > 0 ) {\n                    i = len % g1 || g1;\n                    intPart = intDigits.substr( 0, i );\n\n                    for ( ; i < len; i += g1 ) {\n                        intPart += groupSeparator + intDigits.substr( i, g1 );\n                    }\n\n                    if ( g2 > 0 ) intPart += groupSeparator + intDigits.slice(i);\n                    if (isNeg) intPart = '-' + intPart;\n                }\n\n                str = fractionPart\n                  ? intPart + FORMAT.decimalSeparator + ( ( g2 = +FORMAT.fractionGroupSize )\n                    ? fractionPart.replace( new RegExp( '\\\\d{' + g2 + '}\\\\B', 'g' ),\n                      '$&' + FORMAT.fractionGroupSeparator )\n                    : fractionPart )\n                  : intPart;\n            }\n\n            return str;\n        };\n\n\n        /*\n         * Return a string array representing the value of this BigNumber as a simple fraction with\n         * an integer numerator and an integer denominator. The denominator will be a positive\n         * non-zero value less than or equal to the specified maximum denominator. If a maximum\n         * denominator is not specified, the denominator will be the lowest value necessary to\n         * represent the number exactly.\n         *\n         * [md] {number|string|BigNumber} Integer >= 1 and < Infinity. The maximum denominator.\n         *\n         * 'toFraction() max denominator not an integer: {md}'\n         * 'toFraction() max denominator out of range: {md}'\n         */\n        P.toFraction = function (md) {\n            var arr, d0, d2, e, exp, n, n0, q, s,\n                k = ERRORS,\n                x = this,\n                xc = x.c,\n                d = new BigNumber(ONE),\n                n1 = d0 = new BigNumber(ONE),\n                d1 = n0 = new BigNumber(ONE);\n\n            if ( md != null ) {\n                ERRORS = false;\n                n = new BigNumber(md);\n                ERRORS = k;\n\n                if ( !( k = n.isInt() ) || n.lt(ONE) ) {\n\n                    if (ERRORS) {\n                        raise( 22,\n                          'max denominator ' + ( k ? 'out of range' : 'not an integer' ), md );\n                    }\n\n                    // ERRORS is false:\n                    // If md is a finite non-integer >= 1, round it to an integer and use it.\n                    md = !k && n.c && round( n, n.e + 1, 1 ).gte(ONE) ? n : null;\n                }\n            }\n\n            if ( !xc ) return x.toString();\n            s = coeffToString(xc);\n\n            // Determine initial denominator.\n            // d is a power of 10 and the minimum max denominator that specifies the value exactly.\n            e = d.e = s.length - x.e - 1;\n            d.c[0] = POWS_TEN[ ( exp = e % LOG_BASE ) < 0 ? LOG_BASE + exp : exp ];\n            md = !md || n.cmp(d) > 0 ? ( e > 0 ? d : n1 ) : n;\n\n            exp = MAX_EXP;\n            MAX_EXP = 1 / 0;\n            n = new BigNumber(s);\n\n            // n0 = d1 = 0\n            n0.c[0] = 0;\n\n            for ( ; ; )  {\n                q = div( n, d, 0, 1 );\n                d2 = d0.plus( q.times(d1) );\n                if ( d2.cmp(md) == 1 ) break;\n                d0 = d1;\n                d1 = d2;\n                n1 = n0.plus( q.times( d2 = n1 ) );\n                n0 = d2;\n                d = n.minus( q.times( d2 = d ) );\n                n = d2;\n            }\n\n            d2 = div( md.minus(d0), d1, 0, 1 );\n            n0 = n0.plus( d2.times(n1) );\n            d0 = d0.plus( d2.times(d1) );\n            n0.s = n1.s = x.s;\n            e *= 2;\n\n            // Determine which fraction is closer to x, n0/d0 or n1/d1\n            arr = div( n1, d1, e, ROUNDING_MODE ).minus(x).abs().cmp(\n                  div( n0, d0, e, ROUNDING_MODE ).minus(x).abs() ) < 1\n                    ? [ n1.toString(), d1.toString() ]\n                    : [ n0.toString(), d0.toString() ];\n\n            MAX_EXP = exp;\n            return arr;\n        };\n\n\n        /*\n         * Return the value of this BigNumber converted to a number primitive.\n         */\n        P.toNumber = function () {\n            var x = this;\n\n            // Ensure zero has correct sign.\n            return +x || ( x.s ? x.s * 0 : NaN );\n        };\n\n\n        /*\n         * Return a BigNumber whose value is the value of this BigNumber raised to the power n.\n         * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\n         * If POW_PRECISION is not 0, round to POW_PRECISION using ROUNDING_MODE.\n         *\n         * n {number} Integer, -9007199254740992 to 9007199254740992 inclusive.\n         * (Performs 54 loop iterations for n of 9007199254740992.)\n         *\n         * 'pow() exponent not an integer: {n}'\n         * 'pow() exponent out of range: {n}'\n         */\n        P.toPower = P.pow = function (n) {\n            var k, y,\n                i = mathfloor( n < 0 ? -n : +n ),\n                x = this;\n\n            // Pass ±Infinity to Math.pow if exponent is out of range.\n            if ( !isValidInt( n, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 23, 'exponent' ) &&\n              ( !isFinite(n) || i > MAX_SAFE_INTEGER && ( n /= 0 ) ||\n                parseFloat(n) != n && !( n = NaN ) ) ) {\n                return new BigNumber( Math.pow( +x, n ) );\n            }\n\n            // Truncating each coefficient array to a length of k after each multiplication equates\n            // to truncating significant digits to POW_PRECISION + [28, 41], i.e. there will be a\n            // minimum of 28 guard digits retained. (Using + 1.5 would give [9, 21] guard digits.)\n            k = POW_PRECISION ? mathceil( POW_PRECISION / LOG_BASE + 2 ) : 0;\n            y = new BigNumber(ONE);\n\n            for ( ; ; ) {\n\n                if ( i % 2 ) {\n                    y = y.times(x);\n                    if ( !y.c ) break;\n                    if ( k && y.c.length > k ) y.c.length = k;\n                }\n\n                i = mathfloor( i / 2 );\n                if ( !i ) break;\n\n                x = x.times(x);\n                if ( k && x.c && x.c.length > k ) x.c.length = k;\n            }\n\n            if ( n < 0 ) y = ONE.div(y);\n            return k ? round( y, POW_PRECISION, ROUNDING_MODE ) : y;\n        };\n\n\n        /*\n         * Return a string representing the value of this BigNumber rounded to sd significant digits\n         * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\n         * necessary to represent the integer part of the value in fixed-point notation, then use\n         * exponential notation.\n         *\n         * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toPrecision() precision not an integer: {sd}'\n         * 'toPrecision() precision out of range: {sd}'\n         * 'toPrecision() rounding mode not an integer: {rm}'\n         * 'toPrecision() rounding mode out of range: {rm}'\n         */\n        P.toPrecision = function ( sd, rm ) {\n            return format( this, sd != null && isValidInt( sd, 1, MAX, 24, 'precision' )\n              ? sd | 0 : null, rm, 24 );\n        };\n\n\n        /*\n         * Return a string representing the value of this BigNumber in base b, or base 10 if b is\n         * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\n         * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\n         * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\n         * TO_EXP_NEG, return exponential notation.\n         *\n         * [b] {number} Integer, 2 to 64 inclusive.\n         *\n         * 'toString() base not an integer: {b}'\n         * 'toString() base out of range: {b}'\n         */\n        P.toString = function (b) {\n            var str,\n                n = this,\n                s = n.s,\n                e = n.e;\n\n            // Infinity or NaN?\n            if ( e === null ) {\n\n                if (s) {\n                    str = 'Infinity';\n                    if ( s < 0 ) str = '-' + str;\n                } else {\n                    str = 'NaN';\n                }\n            } else {\n                str = coeffToString( n.c );\n\n                if ( b == null || !isValidInt( b, 2, 64, 25, 'base' ) ) {\n                    str = e <= TO_EXP_NEG || e >= TO_EXP_POS\n                      ? toExponential( str, e )\n                      : toFixedPoint( str, e );\n                } else {\n                    str = convertBase( toFixedPoint( str, e ), b | 0, 10, s );\n                }\n\n                if ( s < 0 && n.c[0] ) str = '-' + str;\n            }\n\n            return str;\n        };\n\n\n        /*\n         * Return a new BigNumber whose value is the value of this BigNumber truncated to a whole\n         * number.\n         */\n        P.truncated = P.trunc = function () {\n            return round( new BigNumber(this), this.e + 1, 1 );\n        };\n\n\n\n        /*\n         * Return as toString, but do not accept a base argument.\n         */\n        P.valueOf = P.toJSON = function () {\n            return this.toString();\n        };\n\n\n        // Aliases for BigDecimal methods.\n        //P.add = P.plus;         // P.add included above\n        //P.subtract = P.minus;   // P.sub included above\n        //P.multiply = P.times;   // P.mul included above\n        //P.divide = P.div;\n        //P.remainder = P.mod;\n        //P.compareTo = P.cmp;\n        //P.negate = P.neg;\n\n\n        if ( configObj != null ) BigNumber.config(configObj);\n\n        return BigNumber;\n    }\n\n\n    // PRIVATE HELPER FUNCTIONS\n\n\n    function bitFloor(n) {\n        var i = n | 0;\n        return n > 0 || n === i ? i : i - 1;\n    }\n\n\n    // Return a coefficient array as a string of base 10 digits.\n    function coeffToString(a) {\n        var s, z,\n            i = 1,\n            j = a.length,\n            r = a[0] + '';\n\n        for ( ; i < j; ) {\n            s = a[i++] + '';\n            z = LOG_BASE - s.length;\n            for ( ; z--; s = '0' + s );\n            r += s;\n        }\n\n        // Determine trailing zeros.\n        for ( j = r.length; r.charCodeAt(--j) === 48; );\n        return r.slice( 0, j + 1 || 1 );\n    }\n\n\n    // Compare the value of BigNumbers x and y.\n    function compare( x, y ) {\n        var a, b,\n            xc = x.c,\n            yc = y.c,\n            i = x.s,\n            j = y.s,\n            k = x.e,\n            l = y.e;\n\n        // Either NaN?\n        if ( !i || !j ) return null;\n\n        a = xc && !xc[0];\n        b = yc && !yc[0];\n\n        // Either zero?\n        if ( a || b ) return a ? b ? 0 : -j : i;\n\n        // Signs differ?\n        if ( i != j ) return i;\n\n        a = i < 0;\n        b = k == l;\n\n        // Either Infinity?\n        if ( !xc || !yc ) return b ? 0 : !xc ^ a ? 1 : -1;\n\n        // Compare exponents.\n        if ( !b ) return k > l ^ a ? 1 : -1;\n\n        j = ( k = xc.length ) < ( l = yc.length ) ? k : l;\n\n        // Compare digit by digit.\n        for ( i = 0; i < j; i++ ) if ( xc[i] != yc[i] ) return xc[i] > yc[i] ^ a ? 1 : -1;\n\n        // Compare lengths.\n        return k == l ? 0 : k > l ^ a ? 1 : -1;\n    }\n\n\n    /*\n     * Return true if n is a valid number in range, otherwise false.\n     * Use for argument validation when ERRORS is false.\n     * Note: parseInt('1e+1') == 1 but parseFloat('1e+1') == 10.\n     */\n    function intValidatorNoErrors( n, min, max ) {\n        return ( n = truncate(n) ) >= min && n <= max;\n    }\n\n\n    function isArray(obj) {\n        return Object.prototype.toString.call(obj) == '[object Array]';\n    }\n\n\n    /*\n     * Convert string of baseIn to an array of numbers of baseOut.\n     * Eg. convertBase('255', 10, 16) returns [15, 15].\n     * Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\n     */\n    function toBaseOut( str, baseIn, baseOut ) {\n        var j,\n            arr = [0],\n            arrL,\n            i = 0,\n            len = str.length;\n\n        for ( ; i < len; ) {\n            for ( arrL = arr.length; arrL--; arr[arrL] *= baseIn );\n            arr[ j = 0 ] += ALPHABET.indexOf( str.charAt( i++ ) );\n\n            for ( ; j < arr.length; j++ ) {\n\n                if ( arr[j] > baseOut - 1 ) {\n                    if ( arr[j + 1] == null ) arr[j + 1] = 0;\n                    arr[j + 1] += arr[j] / baseOut | 0;\n                    arr[j] %= baseOut;\n                }\n            }\n        }\n\n        return arr.reverse();\n    }\n\n\n    function toExponential( str, e ) {\n        return ( str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str ) +\n          ( e < 0 ? 'e' : 'e+' ) + e;\n    }\n\n\n    function toFixedPoint( str, e ) {\n        var len, z;\n\n        // Negative exponent?\n        if ( e < 0 ) {\n\n            // Prepend zeros.\n            for ( z = '0.'; ++e; z += '0' );\n            str = z + str;\n\n        // Positive exponent\n        } else {\n            len = str.length;\n\n            // Append zeros.\n            if ( ++e > len ) {\n                for ( z = '0', e -= len; --e; z += '0' );\n                str += z;\n            } else if ( e < len ) {\n                str = str.slice( 0, e ) + '.' + str.slice(e);\n            }\n        }\n\n        return str;\n    }\n\n\n    function truncate(n) {\n        n = parseFloat(n);\n        return n < 0 ? mathceil(n) : mathfloor(n);\n    }\n\n\n    // EXPORT\n\n\n    BigNumber = another();\n\n    // AMD.\n    if ( typeof define == 'function' && define.amd ) {\n        define( function () { return BigNumber; } );\n\n    // Node and other environments that support module.exports.\n    } else if ( typeof module != 'undefined' && module.exports ) {\n        module.exports = BigNumber;\n        if ( !crypto ) try { crypto = require('crypto'); } catch (e) {}\n\n    // Browser.\n    } else {\n        global.BigNumber = BigNumber;\n    }\n})(this);\n",
    "var web3 = require('./lib/web3');\nweb3.providers.HttpProvider = require('./lib/web3/httpprovider');\nweb3.providers.QtSyncProvider = require('./lib/web3/qtsync');\nweb3.eth.contract = require('./lib/web3/contract');\nweb3.abi = require('./lib/solidity/abi');\n\n// dont override global variable\nif (typeof window !== 'undefined' && typeof window.web3 === 'undefined') {\n    window.web3 = web3;\n}\n\nmodule.exports = web3;\n\n"
  ]
}