ETH Price: $2,002.67 (+0.71%)
 

Overview

ETH Balance

0.2651 ETH

Eth Value

$530.91 (@ $2,002.67/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Mine Crystals130894502021-08-24 17:35:371306 days ago1629826537IN
0xcec76159...71F1DE12e
0 ETH0.03444745105
Buy Pickaxes130894322021-08-24 17:30:251306 days ago1629826225IN
0xcec76159...71F1DE12e
0.05 ETH0.00836996102.54921683
Mine Crystals121277012021-03-28 12:49:191455 days ago1616935759IN
0xcec76159...71F1DE12e
0 ETH0.05415701111
Buy Pickaxes121276802021-03-28 12:45:101455 days ago1616935510IN
0xcec76159...71F1DE12e
0.1 ETH0.0080052111
Buy Pickaxes121186412021-03-27 3:07:341457 days ago1616814454IN
0xcec76159...71F1DE12e
0.0049 ETH0.0019472490
_get Random120660782021-03-19 1:02:441465 days ago1616115764IN
0xcec76159...71F1DE12e
0 ETH0.00761536160
Buy Pickaxes120659862021-03-19 0:41:431465 days ago1616114503IN
0xcec76159...71F1DE12e
0.005 ETH0.01298142180
_get Random120659582021-03-19 0:31:481465 days ago1616113908IN
0xcec76159...71F1DE12e
0 ETH0.00885732186
Buy Pickaxes120380162021-03-14 17:24:211469 days ago1615742661IN
0xcec76159...71F1DE12e
0.005 ETH0.0098803137
Buy Pickaxes120370752021-03-14 13:57:221469 days ago1615730242IN
0xcec76159...71F1DE12e
0.15 ETH0.00923123128
Mine Crystals94511722020-02-09 22:02:061868 days ago1581285726IN
0xcec76159...71F1DE12e
0 ETH0.001234671
Transfer94511092020-02-09 21:48:481868 days ago1581284928IN
0xcec76159...71F1DE12e
0.005 ETH0.000071611
Transfer94395772020-02-08 3:10:451870 days ago1581131445IN
0xcec76159...71F1DE12e
0.005 ETH0.000143222
Mine Crystals94018222020-02-02 7:51:471875 days ago1580629907IN
0xcec76159...71F1DE12e
0 ETH0.000473931
Transfer94018142020-02-02 7:49:571875 days ago1580629797IN
0xcec76159...71F1DE12e
0.005 ETH0.000071611
Mine Crystals93869482020-01-31 1:02:031878 days ago1580432523IN
0xcec76159...71F1DE12e
0 ETH0.001458593
Transfer93869352020-01-31 0:59:401878 days ago1580432380IN
0xcec76159...71F1DE12e
0.005 ETH0.000214833
Melt Crystals93796752020-01-29 21:57:541879 days ago1580335074IN
0xcec76159...71F1DE12e
0 ETH0.000333191.44
Melt Crystals93796702020-01-29 21:56:301879 days ago1580334990IN
0xcec76159...71F1DE12e
0 ETH0.001385995
Mine Crystals92465322020-01-09 12:45:151899 days ago1578573915IN
0xcec76159...71F1DE12e
0 ETH0.0145696710
Mine Crystals92457752020-01-09 9:56:561899 days ago1578563816IN
0xcec76159...71F1DE12e
0 ETH0.013262469
Mine Crystals92431062020-01-08 23:57:271900 days ago1578527847IN
0xcec76159...71F1DE12e
0 ETH0.005962556
Transfer92430812020-01-08 23:50:091900 days ago1578527409IN
0xcec76159...71F1DE12e
0.015 ETH0.000339676
Transfer92430802020-01-08 23:49:541900 days ago1578527394IN
0xcec76159...71F1DE12e
0.015 ETH0.000429676
Mine Crystals92170522020-01-05 0:07:421904 days ago1578182862IN
0xcec76159...71F1DE12e
0 ETH0.00377764
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-130894322021-08-24 17:30:251306 days ago1629826225
0xcec76159...71F1DE12e
0.049 ETH
-121276802021-03-28 12:45:101455 days ago1616935510
0xcec76159...71F1DE12e
0.098 ETH
-120659862021-03-19 0:41:431465 days ago1616114503
0xcec76159...71F1DE12e
0.0049 ETH
-120380162021-03-14 17:24:211469 days ago1615742661
0xcec76159...71F1DE12e
0.0049 ETH
-120370752021-03-14 13:57:221469 days ago1615730242
0xcec76159...71F1DE12e
0.147 ETH
-94511092020-02-09 21:48:481868 days ago1581284928
0xcec76159...71F1DE12e
0.0049 ETH
-94395772020-02-08 3:10:451870 days ago1581131445
0xcec76159...71F1DE12e
0.0049 ETH
-94018142020-02-02 7:49:571875 days ago1580629797
0xcec76159...71F1DE12e
0.0049 ETH
-93869352020-01-31 0:59:401878 days ago1580432380
0xcec76159...71F1DE12e
0.0049 ETH
-92430812020-01-08 23:50:091900 days ago1578527409
0xcec76159...71F1DE12e
0.0147 ETH
-92430802020-01-08 23:49:541900 days ago1578527394
0xcec76159...71F1DE12e
0.0147 ETH
-92170352020-01-05 0:03:071904 days ago1578182587
0xcec76159...71F1DE12e
0.0098 ETH
-92170072020-01-04 23:57:151904 days ago1578182235
0xcec76159...71F1DE12e
0.0098 ETH
-91773952019-12-28 20:10:571911 days ago1577563857
0xcec76159...71F1DE12e
0.0049 ETH
-91558452019-12-24 13:07:431915 days ago1577192863
0xcec76159...71F1DE12e
0.0049 ETH
-90173172019-11-28 20:25:011941 days ago1574972701
0xcec76159...71F1DE12e
0.0245 ETH
-89900502019-11-24 2:56:151946 days ago1574564175
0xcec76159...71F1DE12e
0.0049 ETH
-88644502019-11-03 9:52:531966 days ago1572774773
0xcec76159...71F1DE12e
0.0098 ETH
-87723472019-10-19 16:40:271981 days ago1571503227
0xcec76159...71F1DE12e
0.0245 ETH
-86782602019-10-04 22:09:251996 days ago1570226965
0xcec76159...71F1DE12e
0.0147 ETH
-86779492019-10-04 21:02:011996 days ago1570222921
0xcec76159...71F1DE12e
0.0049 ETH
-86622742019-10-02 10:19:011998 days ago1570011541
0xcec76159...71F1DE12e
0.0098 ETH
-86090012019-09-24 1:58:422007 days ago1569290322
0xcec76159...71F1DE12e
0.0098 ETH
-85674542019-09-17 14:24:212013 days ago1568730261
0xcec76159...71F1DE12e
0.0049 ETH
-85550162019-09-15 15:58:482015 days ago1568563128
0xcec76159...71F1DE12e
0.0049 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoCrystal

Compiler Version
v0.4.23+commit.124ca40d

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-05-11
*/

pragma solidity ^0.4.23;

// File: contracts/zeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

// File: contracts/Acceptable.sol

// @title Acceptable
// @author Takayuki Jimba
// @dev Provide basic access control.
contract Acceptable is Ownable {
    address public sender;

    // @dev Throws if called by any address other than the sender.
    modifier onlyAcceptable {
        require(msg.sender == sender);
        _;
    }

    // @dev Change acceptable address
    // @param _sender The address to new sender
    function setAcceptable(address _sender) public onlyOwner {
        sender = _sender;
    }
}

// File: contracts/zeppelin-solidity/contracts/token/ERC721/ERC721Basic.sol

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic {
  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);  

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function exists(uint256 _tokenId) public view returns (bool _exists);
  
  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId) public view returns (address _operator);
  
  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator) public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;  
  function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public;
}

// File: contracts/zeppelin-solidity/contracts/token/ERC721/ERC721.sol

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
  function totalSupply() public view returns (uint256);
  function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId);
  function tokenByIndex(uint256 _index) public view returns (uint256);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
  function name() public view returns (string _name);
  function symbol() public view returns (string _symbol);
  function tokenURI(uint256 _tokenId) public view returns (string);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

// File: contracts/CrystalBaseIF.sol

// @title CrystalBaseIF
// @author Takayuki Jimba
contract CrystalBaseIF is ERC721 {
    function mint(address _owner, uint256 _gene, uint256 _kind, uint256 _weight) public returns(uint256);
    function burn(address _owner, uint256 _tokenId) public;
    function _transferFrom(address _from, address _to, uint256 _tokenId) public;
    function getCrystalKindWeight(uint256 _tokenId) public view returns(uint256 kind, uint256 weight);
    function getCrystalGeneKindWeight(uint256 _tokenId) public view returns(uint256 gene, uint256 kind, uint256 weight);
}

// File: contracts/zeppelin-solidity/contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

// File: contracts/MiningSupplier.sol

// @title MiningSupplier
// @author Takayuki Jimba
contract MiningSupplier {
    using SafeMath for uint256;

    uint256 public constant secondsPerYear = 1 years * 1 seconds;
    uint256 public constant secondsPerDay = 1 days * 1 seconds;

    // @dev Number of blocks per year
    function _getBlocksPerYear(
        uint256 _secondsPerBlock
    ) public pure returns(uint256) {
        return secondsPerYear.div(_secondsPerBlock);
    }

    // @dev 0-based block number index
    //      First block number index of every years is 0
    function _getBlockIndexAtYear(
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber,
        uint256 _secondsPerBlock
    ) public pure returns(uint256) {
        //require(_currentBlockNumber >= _initialBlockNumber, "current is large than or equal to initial");
        require(_currentBlockNumber >= _initialBlockNumber);
        uint256 _blockIndex = _currentBlockNumber.sub(_initialBlockNumber);
        uint256 _blocksPerYear = _getBlocksPerYear(_secondsPerBlock);
        return _blockIndex.sub(_blockIndex.div(_blocksPerYear).mul(_blocksPerYear));
    }

    // @dev Map block number to block index.
    //      First block is number 0.
    function _getBlockIndex(
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber
    ) public pure returns(uint256) {
        //require(_currentBlockNumber >= _initialBlockNumber, "current is large than or equal to initial");
        require(_currentBlockNumber >= _initialBlockNumber);
        return _currentBlockNumber.sub(_initialBlockNumber);
    }

    // @dev Map block number to year index.
    //      First (blocksPerYear - 1) blocks are number 0.
    function _getYearIndex(
        uint256 _secondsPerBlock,
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber
    ) public pure returns(uint256) {
        uint256 _blockIndex =  _getBlockIndex(_initialBlockNumber, _currentBlockNumber);
        uint256 _blocksPerYear = _getBlocksPerYear(_secondsPerBlock);
        return _blockIndex.div(_blocksPerYear);
    }

    // @dev
    function _getWaitingBlocks(
        uint256 _secondsPerBlock
    ) public pure returns(uint256) {
        return secondsPerDay.div(_secondsPerBlock);
    }

    function _getWeightUntil(
        uint256 _totalWeight,
        uint256 _yearIndex
    ) public pure returns(uint256) {
        uint256 _sum = 0;
        for(uint256 i = 0; i < _yearIndex; i++) {
            _sum = _sum.add(_totalWeight / (2 ** (i + 1)));
        }
        return _sum;
    }

    function _estimateSupply(
        uint256 _secondsPerBlock,
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber,
        uint256 _totalWeight
    ) public pure returns(uint256){
        uint256 _yearIndex = _getYearIndex(_secondsPerBlock, _initialBlockNumber, _currentBlockNumber); // 0-based
        uint256 _blockIndex = _getBlockIndexAtYear(_initialBlockNumber, _currentBlockNumber, _secondsPerBlock) + 1;
        uint256 _numerator = _totalWeight.mul(_secondsPerBlock).mul(_blockIndex);
        uint256 _yearFactor = 2 ** (_yearIndex + 1);
        uint256 _denominator =  _yearFactor.mul(secondsPerYear);
        uint256 _supply = _numerator.div(_denominator).add(_getWeightUntil(_totalWeight, _yearIndex));
        return _supply; // mg
    }

    function _estimateWeight(
        uint256 _secondsPerBlock,
        uint256 _initialBlockNumber,
        uint256 _currentBlockNumber,
        uint256 _totalWeight,
        uint256 _currentWeight
    ) public pure returns(uint256) {
        uint256 _supply = _estimateSupply(
            _secondsPerBlock,
            _initialBlockNumber,
            _currentBlockNumber,
            _totalWeight
        );
        uint256 _yearIndex = _getYearIndex(
            _secondsPerBlock,
            _initialBlockNumber,
            _currentBlockNumber
        ); // 0-based
        uint256 _yearFactor = 2 ** _yearIndex;
        uint256 _defaultWeight = 10000; // mg

        if(_currentWeight > _supply) {
            // (_supply / _currentWeight) * _defaultWeight / _yearFactor
            return _supply.mul(_defaultWeight).div(_currentWeight).div(_yearFactor);
        } else {
            // _defaultWeight / _yearFactor
            return _defaultWeight.div(_yearFactor);
        }
    }

    function _updateNeeded(
        uint256 _secondsPerBlock,
        uint256 _currentBlockNumber,
        uint256 _blockNumberUpdated
    ) public pure returns(bool) {
        if (_blockNumberUpdated == 0) {
            return true;
        }
        uint256 _waitingBlocks = _getWaitingBlocks(_secondsPerBlock);
        return _currentBlockNumber >= _blockNumberUpdated + _waitingBlocks;
    }
}

// File: contracts/CrystalWeightManager.sol

// @title CrystalWeightManager
// @author Takayuki Jimba
contract CrystalWeightManager is MiningSupplier {
    // Amounts of deposit of all crystals.
    // Each unit of weight is milligrams
    // e.g. 50000000000 means 50t.
    uint256[100] crystalWeights = [
        50000000000,226800000000,1312500000000,31500000000,235830000000,
        151200000000,655200000000,829500000000,7177734375,762300000000,
        684600000000,676200000000,5037226562,30761718750,102539062500,
        102539062500,102539062500,5126953125,31500000000,5040000000,
        20507812500,20507812500,10253906250,5024414062,6300000000,
        20507812500,102539062500,102539062500,102539062500,102539062500,
        102539062500,7690429687,15380859375,69300000000,10253906250,
        547050000000,15380859375,20507812500,15380859375,15380859375,
        20507812500,15380859375,7690429687,153808593750,92285156250,
        102539062500,71777343750,82031250000,256347656250,1384277343750,
        820312500000,743408203125,461425781250,563964843750,538330078125,
        358886718750,256347656250,358886718750,102539062500,307617187500,
        256347656250,51269531250,41015625000,307617187500,307617187500,
        2050781250,3588867187,2563476562,5126953125,399902343750,
        615234375000,563964843750,461425781250,358886718750,717773437500,
        41015625000,41015625000,2050781250,102539062500,102539062500,
        51269531250,102539062500,30761718750,41015625000,102539062500,
        102539062500,102539062500,205078125000,205078125000,556500000000,
        657300000000,41015625000,102539062500,30761718750,102539062500,
        20507812500,20507812500,20507812500,20507812500,82031250000
    ];

    uint256 public secondsPerBlock = 12;
    uint256 public initialBlockNumber = block.number;
    uint256 public constant originalTotalWeight = 21 * 10**13; // mg
    uint256 public currentWeight = 0;
    uint256 public estimatedWeight = 0;
    uint256 public blockNumberUpdated = 0;

    event UpdateEstimatedWeight(uint256 weight, uint256 nextUpdateBlockNumber);

    function setEstimatedWeight(uint256 _minedWeight) internal {
        currentWeight = currentWeight.add(_minedWeight);

        uint256 _currentBlockNumber = block.number;

        bool _isUpdate = _updateNeeded(
            secondsPerBlock,
            _currentBlockNumber,
            blockNumberUpdated
        );

        if(_isUpdate) {
            estimatedWeight = _estimateWeight(
                secondsPerBlock,
                initialBlockNumber,
                _currentBlockNumber,
                originalTotalWeight,
                currentWeight
            );
            blockNumberUpdated = _currentBlockNumber;

            emit UpdateEstimatedWeight(estimatedWeight, _currentBlockNumber);
        }
    }

    function getCrystalWeights() external view returns(uint256[100]) {
        return crystalWeights;
    }
}

// File: contracts/EOACallable.sol

// @title EOACallable
// @author Takayuki Jimba
contract EOACallable {
    function isContract(address addr) internal view returns (bool) {
        uint size;
        assembly { size := extcodesize(addr) }
        return size > 0;
    }

    modifier onlyEOA {
        require(!isContract(msg.sender));
        _;
    }
}

// File: contracts/ExchangeBaseIF.sol

// @title ExchangeBaseIF
// @author Takayuki Jimba
contract ExchangeBaseIF {
    function create(
        address _owner,
        uint256 _ownerTokenId,
        uint256 _ownerTokenGene,
        uint256 _ownerTokenKind,
        uint256 _ownerTokenWeight,
        uint256 _kind,
        uint256 _weight,
        uint256 _createdAt
    ) public returns(uint256);
    function remove(uint256 _id) public;
    function getExchange(uint256 _id) public view returns(
        address owner,
        uint256 tokenId,
        uint256 kind,
        uint256 weight,
        uint256 createdAt
    );
    function getTokenId(uint256 _id) public view returns(uint256);
    function ownerOf(uint256 _id) public view returns(address);
    function isOnExchange(uint256 _tokenId) public view returns(bool);
    function isOnExchangeById(uint256 _id) public view returns(bool);
}

// File: contracts/zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

// File: contracts/zeppelin-solidity/contracts/token/ERC20/ERC20.sol

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/PickaxeIF.sol

// @title PickaxeIF
// @author Takayuki Jimba
contract PickaxeIF is ERC20 {
    function transferFromOwner(address _to, uint256 _amount) public;
    function burn(address _from, uint256 _amount) public;
}

// File: contracts/RandomGeneratorIF.sol

// @title RandomGeneratorIF
// @author Takayuki Jimba
contract RandomGeneratorIF {
    function generate() public returns(uint64);
}

// File: contracts/Sellable.sol

// @title Sellable
// @author Takayuki Jimba
// @dev Sell tokens.
//      Token is supposed to be Pickaxe contract in our contracts.
//      Actual transferring tokens operation is to be implemented in inherited contract.
contract Sellable is Ownable {
    using SafeMath for uint256;

    address public wallet;
    uint256 public rate;

    address public donationWallet;
    uint256 public donationRate;

    uint256 public constant MIN_WEI_AMOUNT = 5 * 10**15;

    event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
    event ForwardFunds(address sender, uint256 value, uint256 deposit);
    event Donation(address sender, uint256 value);

    constructor(address _wallet, address _donationWallet, uint256 _donationRate) public {
        // 1 token = 0.005 ETH
        rate = 200;
        wallet = _wallet;
        donationWallet = _donationWallet;
        donationRate = _donationRate;
    }

    function setWallet(address _wallet) external onlyOwner {
        wallet = _wallet;
    }

    function setEthereumWallet(address _donationWallet) external onlyOwner {
        donationWallet = _donationWallet;
    }

    function () external payable {
        require(msg.value >= MIN_WEI_AMOUNT);
        buyPickaxes(msg.sender);
    }

    function buyPickaxes(address _beneficiary) public payable {
        require(msg.value >= MIN_WEI_AMOUNT);

        uint256 _weiAmount = msg.value;
        uint256 _tokens = _weiAmount.mul(rate).div(1 ether);

        require(_tokens.mul(1 ether).div(rate) == _weiAmount);

        _transferFromOwner(msg.sender, _tokens);
        emit TokenPurchase(msg.sender, _beneficiary, _weiAmount, _tokens);
        _forwardFunds();
    }

    function _transferFromOwner(address _to, uint256 _value) internal {
        /* MUST override */
    }

    function _forwardFunds() internal {
        uint256 donation = msg.value.div(donationRate); // 2%
        uint256 value = msg.value - donation;

        wallet.transfer(value);

        emit ForwardFunds(msg.sender, value, donation);

        uint256 donationEth = 2014000000000000000; // 2.014 ether
        if(address(this).balance >= donationEth) {
            donationWallet.transfer(donationEth);
            emit Donation(msg.sender, donationEth);
        }
    }
}

// File: contracts/CryptoCrystal.sol

// @title CryptoCrystal
// @author Takayuki Jimba
// @dev Almost all application specific logic is in this contract.
//      CryptoCrystal acts as a facade to Pixaxe(ERC20), CrystalBase(ERC721), ExchangeBase as to transactions.
contract CryptoCrystal is Sellable, EOACallable, CrystalWeightManager {
    PickaxeIF public pickaxe;
    CrystalBaseIF public crystal;
    ExchangeBaseIF public exchange;
    RandomGeneratorIF public generator;

    //event RandomGenerated(uint256 number);

    event MineCrystals(
        // miner of the crystal
        address indexed owner,
        // time of mining
        uint256 indexed minedAt,
        // tokenIds of mined crystals
        uint256[] tokenIds,
        // kinds of mined crystals
        uint256[] kinds,
        // weights of mined crystals
        uint256[] weights,
        // genes of mined crystals
        uint256[] genes
    );

    event MeltCrystals(
        // melter of the crystals
        address indexed owner,
        // time of melting
        uint256 indexed meltedAt,
        // tokenIds of melted crystals
        uint256[] meltedTokenIds,
        // tokenId of newly generated crystal
        uint256 tokenId,
        // kind of newly generated crystal
        uint256 kind,
        // weight of newly generated crystal
        uint256 weight,
        // gene of newly generated crystal
        uint256 gene
    );

    event CreateExchange(
        // id of exchange
        uint256 indexed id,
        // creator of the exchange
        address owner,
        // tokenId of exhibited crystal
        uint256 ownerTokenId,
        // gene of exhibited crystal
        uint256 ownerTokenGene,
        // kind of exhibited crystal
        uint256 ownerTokenKind,
        // weight of exhibited crystal
        uint256 ownerTokenWeight,
        // kind of condition for exchange
        uint256 kind,
        // weight of condition for exchange
        uint256 weight,
        // time of exchange creation
        uint256 createdAt
    );

    event CancelExchange(
        // id of excahnge
        uint256 indexed id,
        // creator of the exchange
        address owner,
        // tokenId of exhibited crystal
        uint256 ownerTokenId,
        // kind of exhibited crystal
        uint256 ownerTokenKind,
        // weight of exhibited crystal
        uint256 ownerTokenWeight,
        // time of exchange cancelling
        uint256 cancelledAt
    );

    event BidExchange(
        // id of exchange
        uint256 indexed id,
        // creator of the exchange
        address owner,
        // tokenId of exhibited crystal
        uint256 ownerTokenId,
        // gene of exhibited crystal
        uint256 ownerTokenGene,
        // kind of exhibited crystal
        uint256 ownerTokenKind,
        // weight of exhibited crystal
        uint256 ownerTokenWeight,
        // exchanger who bid to exchange
        address exchanger,
        // tokenId of crystal to exchange
        uint256 exchangerTokenId,
        // kind of crystal to exchange
        uint256 exchangerTokenKind,
        // weight of crystal to exchange (may not be the same to weight condition)
        uint256 exchangerTokenWeight,
        // time of bidding
        uint256 bidAt
    );

    struct ExchangeWrapper {
        uint256 id;
        address owner;
        uint256 tokenId;
        uint256 kind;
        uint256 weight;
        uint256 createdAt;
    }

    struct CrystalWrapper {
        address owner;
        uint256 tokenId;
        uint256 gene;
        uint256 kind;
        uint256 weight;
    }

    constructor(
        PickaxeIF _pickaxe,
        CrystalBaseIF _crystal,
        ExchangeBaseIF _exchange,
        RandomGeneratorIF _generator,
        address _wallet,
        address _donationWallet,
        uint256 _donationRate
    ) Sellable(_wallet, _donationWallet, _donationRate) public {
        pickaxe = _pickaxe;
        crystal = _crystal;
        exchange = _exchange;
        generator = _generator;
        setEstimatedWeight(0);
    }

    // @dev mineCrystals consists of two basic operations that burn pickaxes and mint crystals.
    // @param _pkxAmount uint256 the amount of tokens to be burned
    function mineCrystals(uint256 _pkxAmount) external onlyEOA {
        address _owner = msg.sender;
        require(pickaxe.balanceOf(msg.sender) >= _pkxAmount);
        require(0 < _pkxAmount && _pkxAmount <= 100);

        uint256 _crystalAmount = _getRandom(5);

        uint256[] memory _tokenIds = new uint256[](_crystalAmount);
        uint256[] memory _kinds = new uint256[](_crystalAmount);
        uint256[] memory _weights = new uint256[](_crystalAmount);
        uint256[] memory _genes = new uint256[](_crystalAmount);

        uint256[] memory _crystalWeightsCumsum = new uint256[](100);
        _crystalWeightsCumsum[0] = crystalWeights[0];
        for(uint256 i = 1; i < 100; i++) {
            _crystalWeightsCumsum[i] = _crystalWeightsCumsum[i - 1].add(crystalWeights[i]);
        }
        uint256 _totalWeight = _crystalWeightsCumsum[_crystalWeightsCumsum.length - 1];
        uint256 _weightRandomSum = 0;
        uint256 _weightSum = 0;

        for(i = 0; i < _crystalAmount; i++) {
            _weights[i] = _getRandom(100);
            _weightRandomSum = _weightRandomSum.add(_weights[i]);
        }

        for(i = 0; i < _crystalAmount; i++) {
            // Kind is decided randomly according to remaining crystal weights.
            // That means crystals of large quantity are chosen with high probability.
            _kinds[i] = _getFirstIndex(_getRandom(_totalWeight), _crystalWeightsCumsum);

            // Weight is decided randomly according to estimatedWeight.
            // EstimatedWeight is fixed (calculated in advance) in one mining.
            // EstimatedWeight is randomly divided into each of weight.
            // That means sum of weights is equal to EstimatedWeight.
            uint256 actualWeight = estimatedWeight.mul(_pkxAmount);
            _weights[i] = _weights[i].mul(actualWeight).div(_weightRandomSum);

            // Gene is decided randomly.
            _genes[i] = _generateGene();

            require(_weights[i] > 0);

            _tokenIds[i] = crystal.mint(_owner, _genes[i], _kinds[i], _weights[i]);

            crystalWeights[_kinds[i]] = crystalWeights[_kinds[i]].sub(_weights[i]);

            _weightSum = _weightSum.add(_weights[i]);
        }

        setEstimatedWeight(_weightSum);
        pickaxe.burn(msg.sender, _pkxAmount);

        emit MineCrystals(
        _owner,
        now,
        _tokenIds,
        _kinds,
        _weights,
        _genes
        );
    }

    // @dev meltCrystals consists of two basic operations.
    //      It burns old crystals and mint new crystal.
    //      The weight of new crystal is the same to total weight of bunred crystals.
    // @notice meltCrystals may have bugs. We will fix later.
    // @param uint256[] _tokenIds the token ids of crystals to be melt
    function meltCrystals(uint256[] _tokenIds) external onlyEOA {
        uint256 _length = _tokenIds.length;
        address _owner = msg.sender;

        require(2 <= _length && _length <= 10);

        uint256[] memory _kinds = new uint256[](_length);
        uint256 _weight;
        uint256 _totalWeight = 0;

        for(uint256 i = 0; i < _length; i++) {
            require(crystal.ownerOf(_tokenIds[i]) == _owner);
            (_kinds[i], _weight) = crystal.getCrystalKindWeight(_tokenIds[i]);
            if (i != 0) {
                require(_kinds[i] == _kinds[i - 1]);
            }

            _totalWeight = _totalWeight.add(_weight);
            crystal.burn(_owner, _tokenIds[i]);
        }

        uint256 _gene = _generateGene();
        uint256 _tokenId = crystal.mint(_owner, _gene, _kinds[0], _totalWeight);

        emit MeltCrystals(_owner, now, _tokenIds, _tokenId, _kinds[0], _totalWeight, _gene);
    }

    // @dev create exchange
    // @param uint256 _tokenId tokenId you want to exchange
    // @param uint256 _kind crystal kind you want to get
    // @param uint256 _weight minimum crystal weight you want to get
    function createExchange(uint256 _tokenId, uint256 _kind, uint256 _weight) external onlyEOA {
        ExchangeWrapper memory _ew = ExchangeWrapper({
            id: 0, // specify after
            owner: msg.sender,
            tokenId: _tokenId,
            kind: _kind,
            weight: _weight,
            createdAt: 0
            });

        CrystalWrapper memory _cw = getCrystalWrapper(msg.sender, _tokenId);

        require(crystal.ownerOf(_tokenId) == _cw.owner);
        require(_kind < 100);

        // escrow crystal to exchange contract
        crystal._transferFrom(_cw.owner, exchange, _tokenId);

        _ew.id = exchange.create(_ew.owner, _tokenId, _cw.gene, _cw.kind, _cw.weight, _ew.kind, _ew.weight, now);

        emit CreateExchange(_ew.id, _ew.owner, _ew.tokenId, _cw.gene, _cw.kind, _cw.weight, _ew.kind, _ew.weight, now);
    }

    function getCrystalWrapper(address _owner, uint256 _tokenId) internal returns(CrystalWrapper) {
        CrystalWrapper memory _cw;
        _cw.owner = _owner;
        _cw.tokenId = _tokenId;
        (_cw.gene, _cw.kind, _cw.weight) = crystal.getCrystalGeneKindWeight(_tokenId);
        return _cw;
    }

    // @dev cancel exchange
    // @param uint256 _id exchangeId you want to cancel
    function cancelExchange(uint256 _id) external onlyEOA {
        require(exchange.ownerOf(_id) == msg.sender);

        uint256 _tokenId = exchange.getTokenId(_id);

        CrystalWrapper memory _cw = getCrystalWrapper(msg.sender, _tokenId);

        // withdraw crystal from exchange contract
        crystal._transferFrom(exchange, _cw.owner, _cw.tokenId);

        exchange.remove(_id);

        emit CancelExchange(_id, _cw.owner, _cw.tokenId, _cw.kind, _cw.weight, now);
    }

    // @dev bid exchange
    // @param uint256 _exchangeId exchange id you want to bid
    // @param uint256 _tokenId token id of your crystal to be exchanged
    function bidExchange(uint256 _exchangeId, uint256 _tokenId) external onlyEOA {
        // exchange
        ExchangeWrapper memory _ew;
        _ew.id = _exchangeId;
        (_ew.owner, _ew.tokenId, _ew.kind, _ew.weight, _ew.createdAt) = exchange.getExchange(_ew.id); // check existence

        // crystal of exchanger
        CrystalWrapper memory _cwe = getCrystalWrapper(msg.sender, _tokenId);

        // crystal of creator of exchange
        CrystalWrapper memory _cwo = getCrystalWrapper(_ew.owner, _ew.tokenId);

        require(_cwe.owner != _ew.owner);
        require(_cwe.kind == _ew.kind);
        require(_cwe.weight >= _ew.weight);

        // transfer my crystal to owner of exchange
        crystal._transferFrom(_cwe.owner, _ew.owner, _cwe.tokenId);

        // transfer escrowed crystal to me.
        crystal._transferFrom(exchange, _cwe.owner, _ew.tokenId);

        exchange.remove(_ew.id);

        emit BidExchange(_ew.id, _ew.owner, _ew.tokenId, _cwo.gene, _cwo.kind, _cwo.weight, _cwe.owner, _cwe.tokenId, _cwe.kind, _cwe.weight, now);
    }

    // @dev get index when cumsum[i] exceeds _in first.
    // @param uint256 _min
    // @param uint256[] _sorted array is required to be sorted by ascending order
    function _getFirstIndex(uint256 _min, uint256[] _sorted) public pure returns(uint256) {
        for(uint256 i = 0; i < _sorted.length; i++) {
            if(_min < _sorted[i]) {
                return i;
            }
        }
        return _sorted.length - 1;
    }

    function _transferFromOwner(address _to, uint256 _value) internal {
        pickaxe.transferFromOwner(_to, _value);
    }

    function _generateGene() internal returns(uint256) {
        return _getRandom(~uint256(0));
    }

    function _getRandom(uint256 _max) public returns(uint256){
        bytes32 hash = keccak256(generator.generate());
        uint256 number = (uint256(hash) % _max) + 1;
        //emit RandomGenerated(number);
        return number;
    }

    // @dev change random generator
    // @param RandomGeneratorIF randomGenerator contract address
    function setRandomGenerator(RandomGeneratorIF _generator) external onlyOwner {
        generator = _generator;
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"buyPickaxes","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"donationRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"},{"name":"_secondsPerBlock","type":"uint256"}],"name":"_getBlockIndexAtYear","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_totalWeight","type":"uint256"},{"name":"_yearIndex","type":"uint256"}],"name":"_getWeightUntil","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_min","type":"uint256"},{"name":"_sorted","type":"uint256[]"}],"name":"_getFirstIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerYear","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"blockNumberUpdated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"estimatedWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"},{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"},{"name":"_totalWeight","type":"uint256"}],"name":"_estimateSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"originalTotalWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_generator","type":"address"}],"name":"setRandomGenerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"},{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"}],"name":"_getYearIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"cancelExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_kind","type":"uint256"},{"name":"_weight","type":"uint256"}],"name":"createExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secondsPerBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"generator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_donationWallet","type":"address"}],"name":"setEthereumWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"}],"name":"_getBlocksPerYear","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"}],"name":"meltCrystals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crystal","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"}],"name":"_getBlockIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"},{"name":"_blockNumberUpdated","type":"uint256"}],"name":"_updateNeeded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"},{"name":"_initialBlockNumber","type":"uint256"},{"name":"_currentBlockNumber","type":"uint256"},{"name":"_totalWeight","type":"uint256"},{"name":"_currentWeight","type":"uint256"}],"name":"_estimateWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_secondsPerBlock","type":"uint256"}],"name":"_getWaitingBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"initialBlockNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pkxAmount","type":"uint256"}],"name":"mineCrystals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"exchange","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_exchangeId","type":"uint256"},{"name":"_tokenId","type":"uint256"}],"name":"bidExchange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_max","type":"uint256"}],"name":"_getRandom","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCrystalWeights","outputs":[{"name":"","type":"uint256[100]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"setWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"donationWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEI_AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pickaxe","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_pickaxe","type":"address"},{"name":"_crystal","type":"address"},{"name":"_exchange","type":"address"},{"name":"_generator","type":"address"},{"name":"_wallet","type":"address"},{"name":"_donationWallet","type":"address"},{"name":"_donationRate","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"minedAt","type":"uint256"},{"indexed":false,"name":"tokenIds","type":"uint256[]"},{"indexed":false,"name":"kinds","type":"uint256[]"},{"indexed":false,"name":"weights","type":"uint256[]"},{"indexed":false,"name":"genes","type":"uint256[]"}],"name":"MineCrystals","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"meltedAt","type":"uint256"},{"indexed":false,"name":"meltedTokenIds","type":"uint256[]"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"kind","type":"uint256"},{"indexed":false,"name":"weight","type":"uint256"},{"indexed":false,"name":"gene","type":"uint256"}],"name":"MeltCrystals","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"ownerTokenId","type":"uint256"},{"indexed":false,"name":"ownerTokenGene","type":"uint256"},{"indexed":false,"name":"ownerTokenKind","type":"uint256"},{"indexed":false,"name":"ownerTokenWeight","type":"uint256"},{"indexed":false,"name":"kind","type":"uint256"},{"indexed":false,"name":"weight","type":"uint256"},{"indexed":false,"name":"createdAt","type":"uint256"}],"name":"CreateExchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"ownerTokenId","type":"uint256"},{"indexed":false,"name":"ownerTokenKind","type":"uint256"},{"indexed":false,"name":"ownerTokenWeight","type":"uint256"},{"indexed":false,"name":"cancelledAt","type":"uint256"}],"name":"CancelExchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"ownerTokenId","type":"uint256"},{"indexed":false,"name":"ownerTokenGene","type":"uint256"},{"indexed":false,"name":"ownerTokenKind","type":"uint256"},{"indexed":false,"name":"ownerTokenWeight","type":"uint256"},{"indexed":false,"name":"exchanger","type":"address"},{"indexed":false,"name":"exchangerTokenId","type":"uint256"},{"indexed":false,"name":"exchangerTokenKind","type":"uint256"},{"indexed":false,"name":"exchangerTokenWeight","type":"uint256"},{"indexed":false,"name":"bidAt","type":"uint256"}],"name":"BidExchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"weight","type":"uint256"},{"indexed":false,"name":"nextUpdateBlockNumber","type":"uint256"}],"name":"UpdateEstimatedWeight","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"deposit","type":"uint256"}],"name":"ForwardFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Donation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

6080604052610c8060405190810160405280640ba43b740065ffffffffffff1681526020016434ce555c0065ffffffffffff1681526020016501319718a50065ffffffffffff1681526020016407558bdb0065ffffffffffff1681526020016436e890398065ffffffffffff16815260200164233438e80065ffffffffffff16815260200164988cf6980065ffffffffffff16815260200164c1220d870065ffffffffffff1681526020016401abd388e765ffffffffffff16815260200164b17c9ee70065ffffffffffff168152602001649f6556fe0065ffffffffffff168152602001649d70a92a0065ffffffffffff16815260200164012c3dfa4265ffffffffffff1681526020016407298a93de65ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016401319718a565ffffffffffff1681526020016407558bdb0065ffffffffffff16815260200164012c684c0065ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016402632e314a65ffffffffffff16815260200164012b7a796e65ffffffffffff168152602001640177825f0065ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016401ca62a4f765ffffffffffff168152602001640394c549ef65ffffffffffff1681526020016410229a150065ffffffffffff1681526020016402632e314a65ffffffffffff168152602001647f5eb88e8065ffffffffffff168152602001640394c549ef65ffffffffffff1681526020016404c65c629465ffffffffffff168152602001640394c549ef65ffffffffffff168152602001640394c549ef65ffffffffffff1681526020016404c65c629465ffffffffffff168152602001640394c549ef65ffffffffffff1681526020016401ca62a4f765ffffffffffff1681526020016423cfb4e35665ffffffffffff16815260200164157c9fbb9a65ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016410b643590665ffffffffffff168152602001641319718a5065ffffffffffff168152602001643baf82d03a65ffffffffffff1681526020016501424d5bfe0665ffffffffffff16815260200164befe6f672065ffffffffffff16815260200164ad1694f57565ffffffffffff168152602001646b6f1eaa0265ffffffffffff16815260200164834eec96e665ffffffffffff168152602001647d56f91bad65ffffffffffff16815260200164538f50bd1e65ffffffffffff168152602001643baf82d03a65ffffffffffff16815260200164538f50bd1e65ffffffffffff1681526020016417dfcdece465ffffffffffff16815260200164479f69c6ac65ffffffffffff168152602001643baf82d03a65ffffffffffff168152602001640befe6f67265ffffffffffff16815260200164098cb8c52865ffffffffffff16815260200164479f69c6ac65ffffffffffff16815260200164479f69c6ac65ffffffffffff168152602001637a3c704265ffffffffffff16815260200163d5e9c47365ffffffffffff1681526020016398cb8c5265ffffffffffff1681526020016401319718a565ffffffffffff168152602001645d1c09824665ffffffffffff168152602001648f3ed38d5865ffffffffffff16815260200164834eec96e665ffffffffffff168152602001646b6f1eaa0265ffffffffffff16815260200164538f50bd1e65ffffffffffff16815260200164a71ea17a3c65ffffffffffff16815260200164098cb8c52865ffffffffffff16815260200164098cb8c52865ffffffffffff168152602001637a3c704265ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff168152602001640befe6f67265ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016407298a93de65ffffffffffff16815260200164098cb8c52865ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016417dfcdece465ffffffffffff168152602001642fbf9bd9c865ffffffffffff168152602001642fbf9bd9c865ffffffffffff168152602001648191fc1d0065ffffffffffff16815260200164990a220d0065ffffffffffff16815260200164098cb8c52865ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016407298a93de65ffffffffffff1681526020016417dfcdece465ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016404c65c629465ffffffffffff1681526020016404c65c629465ffffffffffff168152602001641319718a5065ffffffffffff1681525060059060646200078b9291906200102a565b50600c60695543606a556000606b556000606c556000606d55348015620007b157600080fd5b5060405160e08062004c6c83398101806040528101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050828282336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c860028190555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060048190555050505086606e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085606f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084607060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083607160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000a07600062000a14640100000000026401000000009004565b50505050505050620010a1565b60008062000a3c83606b5462000aec6401000000000262003899179091906401000000009004565b606b8190555043915062000a6560695483606d5462000b0b640100000000026401000000009004565b9050801562000ae75762000a98606954606a548465befe6f672000606b5462000b4f640100000000026401000000009004565b606c8190555081606d819055507fb9a2ce1061b71fbf2ee90bb8feed7941f9d6f8b6fe67bce1822774c5fc9844af606c5483604051808381526020018281526020019250505060405180910390a15b505050565b600080828401905083811015151562000b0157fe5b8091505092915050565b600080600083141562000b22576001915062000b47565b62000b3c8562000c4a640100000000026401000000009004565b905080830184101591505b509392505050565b600080600080600062000b748a8a8a8a62000c79640100000000026401000000009004565b935062000b928a8a8a62000dae640100000000026401000000009004565b92508260020a915061271090508386111562000c175762000c0f8262000bf28862000bd5858962000e1a6401000000000262003547179091906401000000009004565b62000e596401000000000262003582179091906401000000009004565b62000e596401000000000262003582179091906401000000009004565b945062000c3d565b62000c3a828262000e596401000000000262003582179091906401000000009004565b94505b5050505095945050505050565b600062000c72826201518062000e596401000000000262003582179091906401000000009004565b9050919050565b600080600080600080600062000ca08b8b8b62000dae640100000000026401000000009004565b9550600162000cc08b8b8e62000e75640100000000026401000000009004565b01945062000d088562000ceb8d8b62000e1a6401000000000262003547179091906401000000009004565b62000e1a6401000000000262003547179091906401000000009004565b93506001860160020a925062000d3a6301e133808462000e1a6401000000000262003547179091906401000000009004565b915062000d9b62000d5b898862000f3d640100000000026401000000009004565b62000d7e848762000e596401000000000262003582179091906401000000009004565b62000aec6401000000000262003899179091906401000000009004565b9050809650505050505050949350505050565b600080600062000dce858562000fa3640100000000026401000000009004565b915062000dea8662000fe0640100000000026401000000009004565b905062000e0f818362000e596401000000000262003582179091906401000000009004565b925050509392505050565b600080600084141562000e31576000915062000e52565b828402905082848281151562000e4357fe5b0414151562000e4e57fe5b8091505b5092915050565b600080828481151562000e6857fe5b0490508091505092915050565b600080600085851015151562000e8a57600080fd5b62000ead8686620010106401000000000262003880179091906401000000009004565b915062000ec98462000fe0640100000000026401000000009004565b905062000f3262000f148262000ef7848662000e596401000000000262003582179091906401000000009004565b62000e1a6401000000000262003547179091906401000000009004565b83620010106401000000000262003880179091906401000000009004565b925050509392505050565b6000806000809150600090505b8381101562000f985762000f886001820160020a8681151562000f6957fe5b048362000aec6401000000000262003899179091906401000000009004565b9150808060010191505062000f4a565b819250505092915050565b600082821015151562000fb557600080fd5b62000fd88383620010106401000000000262003880179091906401000000009004565b905092915050565b600062001009826301e1338062000e596401000000000262003582179091906401000000009004565b9050919050565b60008282111515156200101f57fe5b818303905092915050565b826064810192821562001066579160200282015b8281111562001065578251829065ffffffffffff169055916020019190600101906200103e565b5b50905062001075919062001079565b5090565b6200109e91905b808211156200109a57600081600090555060010162001080565b5090565b90565b613bbb80620010b16000396000f3006080604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063032946141461020f5780630d38ffcd1461024557806313c1629c1461027057806314c65687146102c557806314c72e9e14610310578063252e40b1146103945780632c4e722e146103bf57806330b5198f146103ea57806332b85a4414610415578063473533e6146104405780634786cfea1461046b57806349716f5a146104ca5780634bc19fee146104f5578063521eb273146105385780635cb603dd1461058f5780635d3d08a8146105e457806363809953146106115780637909da6f1461063c5780637a7d49371461067d5780637afa1eed146106a8578063815a4876146106ff57806384cb4fec14610742578063889087b1146107835780638da5cb5b146107be578063971a9091146108155780639a6846581461086c578063aa36b52e146108b7578063aa41d60514610910578063b348036914610979578063b3ae65d7146109ba578063c67415f3146109e5578063d2f7265a14610a12578063d3e212c514610a69578063dd1e4e1114610aa0578063ddfa3a6014610ae1578063deaa59df14610b34578063e7b94df414610b77578063e95f206e14610bce578063f2fde38b14610bf9578063fa922e6614610c3c575b6611c37937e08000341015151561020457600080fd5b61020d33610c93565b005b610243600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c93565b005b34801561025157600080fd5b5061025a610da0565b6040518082815260200191505060405180910390f35b34801561027c57600080fd5b506102af600480360381019080803590602001909291908035906020019092919080359060200190929190505050610da6565b6040518082815260200191505060405180910390f35b3480156102d157600080fd5b506102fa6004803603810190808035906020019092919080359060200190929190505050610e1c565b6040518082815260200191505060405180910390f35b34801561031c57600080fd5b5061037e6004803603810190808035906020019092919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610e6f565b6040518082815260200191505060405180910390f35b3480156103a057600080fd5b506103a9610ec3565b6040518082815260200191505060405180910390f35b3480156103cb57600080fd5b506103d4610ecb565b6040518082815260200191505060405180910390f35b3480156103f657600080fd5b506103ff610ed1565b6040518082815260200191505060405180910390f35b34801561042157600080fd5b5061042a610ed7565b6040518082815260200191505060405180910390f35b34801561044c57600080fd5b50610455610edd565b6040518082815260200191505060405180910390f35b34801561047757600080fd5b506104b460048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610ee3565b6040518082815260200191505060405180910390f35b3480156104d657600080fd5b506104df610f95565b6040518082815260200191505060405180910390f35b34801561050157600080fd5b50610536600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f9f565b005b34801561054457600080fd5b5061054d61103e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059b57600080fd5b506105ce600480360381019080803590602001909291908035906020019092919080359060200190929190505050611064565b6040518082815260200191505060405180910390f35b3480156105f057600080fd5b5061060f6004803603810190808035906020019092919050505061109e565b005b34801561061d57600080fd5b50610626611519565b6040518082815260200191505060405180910390f35b34801561064857600080fd5b5061067b600480360381019080803590602001909291908035906020019092919080359060200190929190505050611520565b005b34801561068957600080fd5b506106926119fc565b6040518082815260200191505060405180910390f35b3480156106b457600080fd5b506106bd611a02565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561070b57600080fd5b50610740600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a28565b005b34801561074e57600080fd5b5061076d60048036038101908080359060200190929190505050611ac7565b6040518082815260200191505060405180910390f35b34801561078f57600080fd5b506107bc600480360381019080803590602001908201803590602001919091929391929390505050611ae7565b005b3480156107ca57600080fd5b506107d36120d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082157600080fd5b5061082a6120fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561087857600080fd5b506108a16004803603810190808035906020019092919080359060200190929190505050612120565b6040518082815260200191505060405180910390f35b3480156108c357600080fd5b506108f660048036038101908080359060200190929190803590602001909291908035906020019092919050505061214c565b604051808215151515815260200191505060405180910390f35b34801561091c57600080fd5b50610963600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061217d565b6040518082815260200191505060405180910390f35b34801561098557600080fd5b506109a460048036038101908080359060200190929190505050612214565b6040518082815260200191505060405180910390f35b3480156109c657600080fd5b506109cf612233565b6040518082815260200191505060405180910390f35b3480156109f157600080fd5b50610a1060048036038101908080359060200190929190505050612239565b005b348015610a1e57600080fd5b50610a27612b3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a7557600080fd5b50610a9e6004803603810190808035906020019092919080359060200190929190505050612b62565b005b348015610aac57600080fd5b50610acb60048036038101908080359060200190929190505050613186565b6040518082815260200191505060405180910390f35b348015610aed57600080fd5b50610af66132b1565b6040518082606460200280838360005b83811015610b21578082015181840152602081019050610b06565b5050505090500191505060405180910390f35b348015610b4057600080fd5b50610b75600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132fc565b005b348015610b8357600080fd5b50610b8c61339b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bda57600080fd5b50610be36133c1565b6040518082815260200191505060405180910390f35b348015610c0557600080fd5b50610c3a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133cc565b005b348015610c4857600080fd5b50610c51613521565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000806611c37937e080003410151515610cac57600080fd5b349150610cde670de0b6b3a7640000610cd06002548561354790919063ffffffff16565b61358290919063ffffffff16565b905081610d10600254610d02670de0b6b3a76400008561354790919063ffffffff16565b61358290919063ffffffff16565b141515610d1c57600080fd5b610d26338261359d565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188484604051808381526020018281526020019250505060405180910390a3610d9b61367e565b505050565b60045481565b6000806000858510151515610dba57600080fd5b610dcd868661388090919063ffffffff16565b9150610dd884611ac7565b9050610e11610e0282610df4848661358290919063ffffffff16565b61354790919063ffffffff16565b8361388090919063ffffffff16565b925050509392505050565b6000806000809150600090505b83811015610e6457610e556001820160020a86811515610e4557fe5b048361389990919063ffffffff16565b91508080600101915050610e29565b819250505092915050565b600080600090505b8251811015610eb4578281815181101515610e8e57fe5b90602001906020020151841015610ea757809150610ebc565b8080600101915050610e77565b600183510391505b5092915050565b6301e1338081565b60025481565b606d5481565b606b5481565b606c5481565b6000806000806000806000610ef98b8b8b611064565b95506001610f088b8b8e610da6565b019450610f3085610f228d8b61354790919063ffffffff16565b61354790919063ffffffff16565b93506001860160020a9250610f526301e133808461354790919063ffffffff16565b9150610f82610f618988610e1c565b610f74848761358290919063ffffffff16565b61389990919063ffffffff16565b9050809650505050505050949350505050565b65befe6f67200081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ffa57600080fd5b80607160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060006110738585612120565b915061107e86611ac7565b9050611093818361358290919063ffffffff16565b925050509392505050565b60006110a8613ad8565b6110b1336138b7565b1515156110bd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561116557600080fd5b505af1158015611179573d6000803e3d6000fd5b505050506040513d602081101561118f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156111c257600080fd5b607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314ff5ea3846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d602081101561127d57600080fd5b8101908080519060200190929190505050915061129a33836138ca565b9050606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb712535607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000015184602001516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156113bf57600080fd5b505af11580156113d3573d6000803e3d6000fd5b50505050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634cc82215846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561146857600080fd5b505af115801561147c573d6000803e3d6000fd5b50505050827fd4d8d3838d177b895f32762da601506feae7134f9f3e3a286d256f79d40c3972826000015183602001518460600151856080015142604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a2505050565b6201518081565b611528613b1e565b611530613ad8565b611539336138b7565b15151561154557600080fd5b60c060405190810160405280600081526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020016000815250915061159733866138ca565b9050806000015173ffffffffffffffffffffffffffffffffffffffff16606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561164557600080fd5b505af1158015611659573d6000803e3d6000fd5b505050506040513d602081101561166f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156116a257600080fd5b6064841015156116b157600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb7125358260000151607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156117d057600080fd5b505af11580156117e4573d6000803e3d6000fd5b50505050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166352638d7583602001518784604001518560600151866080015188606001518960800151426040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b1580156118f557600080fd5b505af1158015611909573d6000803e3d6000fd5b505050506040513d602081101561191f57600080fd5b810190808051906020019092919050505082600001818152505081600001517fb18c9515006d8d9e31fb76eddb92e53ba7e8ec9e6d683e5fcab1e18ec4bb98e4836020015184604001518460400151856060015186608001518860600151896080015142604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390a25050505050565b60695481565b607160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a8357600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611ae0826301e1338061358290919063ffffffff16565b9050919050565b60008060606000806000806000611afd336138b7565b151515611b0957600080fd5b89899050975033965087600211158015611b245750600a8811155b1515611b2f57600080fd5b87604051908082528060200260200182016040528015611b5e5781602001602082028038833980820191505090505b50955060009350600092505b87831015611ef1578673ffffffffffffffffffffffffffffffffffffffff16606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8c8c878181101515611bd557fe5b905060200201356040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015611c2e57600080fd5b505af1158015611c42573d6000803e3d6000fd5b505050506040513d6020811015611c5857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515611c8b57600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af62a7088b8b868181101515611cd757fe5b905060200201356040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506040805180830381600087803b158015611d2f57600080fd5b505af1158015611d43573d6000803e3d6000fd5b505050506040513d6040811015611d5957600080fd5b8101908080519060200190929190805190602001909291905050508785815181101515611d8257fe5b906020019060200201819750828152505050600083141515611dde578560018403815181101515611daf57fe5b906020019060200201518684815181101515611dc757fe5b90602001906020020151141515611ddd57600080fd5b5b611df1858561389990919063ffffffff16565b9350606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac888c8c878181101515611e4057fe5b905060200201356040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015611ecc57600080fd5b505af1158015611ee0573d6000803e3d6000fd5b505050508280600101935050611b6a565b611ef9613a21565b9150606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a647e8ec8884896000815181101515611f4a57fe5b90602001906020020151886040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050602060405180830381600087803b158015611fe857600080fd5b505af1158015611ffc573d6000803e3d6000fd5b505050506040513d602081101561201257600080fd5b81019080805190602001909291905050509050428773ffffffffffffffffffffffffffffffffffffffff167f9a2f4e8b8b46a06a6a22027ad11ae098be40d52fb6263f7c0baf02c4e1bc17a08c8c858b600081518110151561207057fe5b906020019060200201518a8960405180806020018681526020018581526020018481526020018381526020018281038252888882818152602001925060200280828437820191505097505050505050505060405180910390a350505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600082821015151561213157600080fd5b612144838361388090919063ffffffff16565b905092915050565b60008060008314156121615760019150612175565b61216a85612214565b905080830184101591505b509392505050565b60008060008060006121918a8a8a8a610ee3565b935061219e8a8a8a611064565b92508260020a91506127109050838611156121f1576121ea826121dc886121ce858961354790919063ffffffff16565b61358290919063ffffffff16565b61358290919063ffffffff16565b9450612207565b612204828261358290919063ffffffff16565b94505b5050505095945050505050565b600061222c826201518061358290919063ffffffff16565b9050919050565b606a5481565b60008060608060608060606000806000806000612255336138b7565b15151561226157600080fd5b339b508c606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561232257600080fd5b505af1158015612336573d6000803e3d6000fd5b505050506040513d602081101561234c57600080fd5b81019080805190602001909291905050501015151561236a57600080fd5b8c600010801561237b575060648d11155b151561238657600080fd5b6123906005613186565b9a508a6040519080825280602002602001820160405280156123c15781602001602082028038833980820191505090505b5099508a6040519080825280602002602001820160405280156123f35781602001602082028038833980820191505090505b5098508a6040519080825280602002602001820160405280156124255781602001602082028038833980820191505090505b5097508a6040519080825280602002602001820160405280156124575781602001602082028038833980820191505090505b509650606460405190808252806020026020018201604052801561248a5781602001602082028038833980820191505090505b5095506005600060648110151561249d57fe5b01548660008151811015156124ae57fe5b9060200190602002018181525050600194505b6064851015612530576125076005866064811015156124dc57fe5b015487600188038151811015156124ef57fe5b9060200190602002015161389990919063ffffffff16565b868681518110151561251557fe5b906020019060200201818152505084806001019550506124c1565b85600187510381518110151561254257fe5b9060200190602002015193506000925060009150600094505b8a8510156125c25761256d6064613186565b888681518110151561257b57fe5b90602001906020020181815250506125b3888681518110151561259a57fe5b906020019060200201518461389990919063ffffffff16565b9250848060010195505061255b565b600094505b8a8510156128dc576125e16125db85613186565b87610e6f565b89868151811015156125ef57fe5b90602001906020020181815250506126128d606c5461354790919063ffffffff16565b905061265083612642838b8981518110151561262a57fe5b9060200190602002015161354790919063ffffffff16565b61358290919063ffffffff16565b888681518110151561265e57fe5b9060200190602002018181525050612674613a21565b878681518110151561268257fe5b9060200190602002018181525050600088868151811015156126a057fe5b906020019060200201511115156126b657600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a647e8ec8d898881518110151561270357fe5b906020019060200201518c8981518110151561271b57fe5b906020019060200201518c8a81518110151561273357fe5b906020019060200201516040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050602060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050506040513d60208110156127fa57600080fd5b81019080805190602001909291905050508a8681518110151561281957fe5b9060200190602002018181525050612878888681518110151561283857fe5b9060200190602002015160058b8881518110151561285257fe5b9060200190602002015160648110151561286857fe5b015461388090919063ffffffff16565b60058a8781518110151561288857fe5b9060200190602002015160648110151561289e57fe5b01819055506128cd88868151811015156128b457fe5b906020019060200201518361389990919063ffffffff16565b915084806001019550506125c7565b6128e582613a33565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac338f6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156129aa57600080fd5b505af11580156129be573d6000803e3d6000fd5b50505050428c73ffffffffffffffffffffffffffffffffffffffff167f23c59a8ab07b391d91ac8ab3319ad5e959ded915308b151c7ca552c56e8b35a38c8c8c8c6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015612a4e578082015181840152602081019050612a33565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015612a90578082015181840152602081019050612a75565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015612ad2578082015181840152602081019050612ab7565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015612b14578082015181840152602081019050612af9565b505050509050019850505050505050505060405180910390a350505050505050505050505050565b607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b6a613b1e565b612b72613ad8565b612b7a613ad8565b612b83336138b7565b151515612b8f57600080fd5b84836000018181525050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630b9d584784600001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060a060405180830381600087803b158015612c2e57600080fd5b505af1158015612c42573d6000803e3d6000fd5b505050506040513d60a0811015612c5857600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050508760200188604001896060018a6080018b60a001858152508581525085815250858152508573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505050505050612cf433856138ca565b9150612d08836020015184604001516138ca565b9050826020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614151515612d4d57600080fd5b82606001518260600151141515612d6357600080fd5b8260800151826080015110151515612d7a57600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb7125358360000151856020015185602001516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612e7f57600080fd5b505af1158015612e93573d6000803e3d6000fd5b50505050606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb712535607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846000015186604001516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612fba57600080fd5b505af1158015612fce573d6000803e3d6000fd5b50505050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634cc8221584600001516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561306757600080fd5b505af115801561307b573d6000803e3d6000fd5b5050505082600001517f5514510acd7becd44fa4def480d977880b8c94af90a31acbd616949850f15d5684602001518560400151846040015185606001518660800151886000015189602001518a606001518b6080015142604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a25050505050565b6000806000607160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a1bbc346040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561321157600080fd5b505af1158015613225573d6000803e3d6000fd5b505050506040513d602081101561323b57600080fd5b8101908080519060200190929190505050604051808267ffffffffffffffff1667ffffffffffffffff1678010000000000000000000000000000000000000000000000000281526008019150506040518091039020915060018483600190048115156132a357fe5b060190508092505050919050565b6132b9613b6b565b60056064806020026040519081016040528092919082606480156132f2576020028201915b8154815260200190600101908083116132de575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561335757600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6611c37937e0800081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561342757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561346357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600084141561355c576000915061357b565b828402905082848281151561356d57fe5b0414151561357757fe5b8091505b5092915050565b600080828481151561359057fe5b0490508091505092915050565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f18ac0783836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561366257600080fd5b505af1158015613676573d6000803e3d6000fd5b505050505050565b60008060006136986004543461358290919063ffffffff16565b92508234039150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613707573d6000803e3d6000fd5b507ff56ba0f53476ddecea8bd2db761e216b2386c1f4c7b53e8667ca6586ac77a6df338385604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1671bf32a5451a300009050803073ffffffffffffffffffffffffffffffffffffffff163110151561387b57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561380e573d6000803e3d6000fd5b507f5d8bc849764969eb1bcc6d0a2f55999d0167c1ccec240a4f39cf664ca9c4148e3382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b505050565b600082821115151561388e57fe5b818303905092915050565b60008082840190508381101515156138ad57fe5b8091505092915050565b600080823b905060008111915050919050565b6138d2613ad8565b6138da613ad8565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816020018181525050606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c3b6f0e846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050606060405180830381600087803b1580156139ad57600080fd5b505af11580156139c1573d6000803e3d6000fd5b505050506040513d60608110156139d757600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050508360400184606001856080018381525083815250838152505050508091505092915050565b6000613a2e600019613186565b905090565b600080613a4b83606b5461389990919063ffffffff16565b606b81905550439150613a6360695483606d5461214c565b90508015613ad357613a84606954606a548465befe6f672000606b5461217d565b606c8190555081606d819055507fb9a2ce1061b71fbf2ee90bb8feed7941f9d6f8b6fe67bce1822774c5fc9844af606c5483604051808381526020018281526020019250505060405180910390a15b505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b60c06040519081016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b610c80604051908101604052806064906020820280388339808201915050905050905600a165627a7a72305820459e86dc3ddcfbb169995058294fa47fed86bd909aaa082d9f46f3c6b7e881da00290000000000000000000000005116c1d70e3a2cf55a2502d05f1bc17a0518782e000000000000000000000000cfbc9103362aec4ce3089f155c2da2eea1cb7602000000000000000000000000b6e928db347dbaad2c06868b716a2cf488904574000000000000000000000000045f11fc6fbed29b73119f4d51570c7e64af75f30000000000000000000000007b37faf831044d08da0c0e7419e2e31615f43032000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d3590000000000000000000000000000000000000000000000000000000000000032

Deployed Bytecode

0x6080604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063032946141461020f5780630d38ffcd1461024557806313c1629c1461027057806314c65687146102c557806314c72e9e14610310578063252e40b1146103945780632c4e722e146103bf57806330b5198f146103ea57806332b85a4414610415578063473533e6146104405780634786cfea1461046b57806349716f5a146104ca5780634bc19fee146104f5578063521eb273146105385780635cb603dd1461058f5780635d3d08a8146105e457806363809953146106115780637909da6f1461063c5780637a7d49371461067d5780637afa1eed146106a8578063815a4876146106ff57806384cb4fec14610742578063889087b1146107835780638da5cb5b146107be578063971a9091146108155780639a6846581461086c578063aa36b52e146108b7578063aa41d60514610910578063b348036914610979578063b3ae65d7146109ba578063c67415f3146109e5578063d2f7265a14610a12578063d3e212c514610a69578063dd1e4e1114610aa0578063ddfa3a6014610ae1578063deaa59df14610b34578063e7b94df414610b77578063e95f206e14610bce578063f2fde38b14610bf9578063fa922e6614610c3c575b6611c37937e08000341015151561020457600080fd5b61020d33610c93565b005b610243600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c93565b005b34801561025157600080fd5b5061025a610da0565b6040518082815260200191505060405180910390f35b34801561027c57600080fd5b506102af600480360381019080803590602001909291908035906020019092919080359060200190929190505050610da6565b6040518082815260200191505060405180910390f35b3480156102d157600080fd5b506102fa6004803603810190808035906020019092919080359060200190929190505050610e1c565b6040518082815260200191505060405180910390f35b34801561031c57600080fd5b5061037e6004803603810190808035906020019092919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610e6f565b6040518082815260200191505060405180910390f35b3480156103a057600080fd5b506103a9610ec3565b6040518082815260200191505060405180910390f35b3480156103cb57600080fd5b506103d4610ecb565b6040518082815260200191505060405180910390f35b3480156103f657600080fd5b506103ff610ed1565b6040518082815260200191505060405180910390f35b34801561042157600080fd5b5061042a610ed7565b6040518082815260200191505060405180910390f35b34801561044c57600080fd5b50610455610edd565b6040518082815260200191505060405180910390f35b34801561047757600080fd5b506104b460048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610ee3565b6040518082815260200191505060405180910390f35b3480156104d657600080fd5b506104df610f95565b6040518082815260200191505060405180910390f35b34801561050157600080fd5b50610536600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f9f565b005b34801561054457600080fd5b5061054d61103e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059b57600080fd5b506105ce600480360381019080803590602001909291908035906020019092919080359060200190929190505050611064565b6040518082815260200191505060405180910390f35b3480156105f057600080fd5b5061060f6004803603810190808035906020019092919050505061109e565b005b34801561061d57600080fd5b50610626611519565b6040518082815260200191505060405180910390f35b34801561064857600080fd5b5061067b600480360381019080803590602001909291908035906020019092919080359060200190929190505050611520565b005b34801561068957600080fd5b506106926119fc565b6040518082815260200191505060405180910390f35b3480156106b457600080fd5b506106bd611a02565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561070b57600080fd5b50610740600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a28565b005b34801561074e57600080fd5b5061076d60048036038101908080359060200190929190505050611ac7565b6040518082815260200191505060405180910390f35b34801561078f57600080fd5b506107bc600480360381019080803590602001908201803590602001919091929391929390505050611ae7565b005b3480156107ca57600080fd5b506107d36120d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082157600080fd5b5061082a6120fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561087857600080fd5b506108a16004803603810190808035906020019092919080359060200190929190505050612120565b6040518082815260200191505060405180910390f35b3480156108c357600080fd5b506108f660048036038101908080359060200190929190803590602001909291908035906020019092919050505061214c565b604051808215151515815260200191505060405180910390f35b34801561091c57600080fd5b50610963600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061217d565b6040518082815260200191505060405180910390f35b34801561098557600080fd5b506109a460048036038101908080359060200190929190505050612214565b6040518082815260200191505060405180910390f35b3480156109c657600080fd5b506109cf612233565b6040518082815260200191505060405180910390f35b3480156109f157600080fd5b50610a1060048036038101908080359060200190929190505050612239565b005b348015610a1e57600080fd5b50610a27612b3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a7557600080fd5b50610a9e6004803603810190808035906020019092919080359060200190929190505050612b62565b005b348015610aac57600080fd5b50610acb60048036038101908080359060200190929190505050613186565b6040518082815260200191505060405180910390f35b348015610aed57600080fd5b50610af66132b1565b6040518082606460200280838360005b83811015610b21578082015181840152602081019050610b06565b5050505090500191505060405180910390f35b348015610b4057600080fd5b50610b75600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132fc565b005b348015610b8357600080fd5b50610b8c61339b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bda57600080fd5b50610be36133c1565b6040518082815260200191505060405180910390f35b348015610c0557600080fd5b50610c3a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133cc565b005b348015610c4857600080fd5b50610c51613521565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000806611c37937e080003410151515610cac57600080fd5b349150610cde670de0b6b3a7640000610cd06002548561354790919063ffffffff16565b61358290919063ffffffff16565b905081610d10600254610d02670de0b6b3a76400008561354790919063ffffffff16565b61358290919063ffffffff16565b141515610d1c57600080fd5b610d26338261359d565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188484604051808381526020018281526020019250505060405180910390a3610d9b61367e565b505050565b60045481565b6000806000858510151515610dba57600080fd5b610dcd868661388090919063ffffffff16565b9150610dd884611ac7565b9050610e11610e0282610df4848661358290919063ffffffff16565b61354790919063ffffffff16565b8361388090919063ffffffff16565b925050509392505050565b6000806000809150600090505b83811015610e6457610e556001820160020a86811515610e4557fe5b048361389990919063ffffffff16565b91508080600101915050610e29565b819250505092915050565b600080600090505b8251811015610eb4578281815181101515610e8e57fe5b90602001906020020151841015610ea757809150610ebc565b8080600101915050610e77565b600183510391505b5092915050565b6301e1338081565b60025481565b606d5481565b606b5481565b606c5481565b6000806000806000806000610ef98b8b8b611064565b95506001610f088b8b8e610da6565b019450610f3085610f228d8b61354790919063ffffffff16565b61354790919063ffffffff16565b93506001860160020a9250610f526301e133808461354790919063ffffffff16565b9150610f82610f618988610e1c565b610f74848761358290919063ffffffff16565b61389990919063ffffffff16565b9050809650505050505050949350505050565b65befe6f67200081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ffa57600080fd5b80607160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060006110738585612120565b915061107e86611ac7565b9050611093818361358290919063ffffffff16565b925050509392505050565b60006110a8613ad8565b6110b1336138b7565b1515156110bd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561116557600080fd5b505af1158015611179573d6000803e3d6000fd5b505050506040513d602081101561118f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156111c257600080fd5b607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314ff5ea3846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d602081101561127d57600080fd5b8101908080519060200190929190505050915061129a33836138ca565b9050606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb712535607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000015184602001516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156113bf57600080fd5b505af11580156113d3573d6000803e3d6000fd5b50505050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634cc82215846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561146857600080fd5b505af115801561147c573d6000803e3d6000fd5b50505050827fd4d8d3838d177b895f32762da601506feae7134f9f3e3a286d256f79d40c3972826000015183602001518460600151856080015142604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a2505050565b6201518081565b611528613b1e565b611530613ad8565b611539336138b7565b15151561154557600080fd5b60c060405190810160405280600081526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020016000815250915061159733866138ca565b9050806000015173ffffffffffffffffffffffffffffffffffffffff16606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e876040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561164557600080fd5b505af1158015611659573d6000803e3d6000fd5b505050506040513d602081101561166f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156116a257600080fd5b6064841015156116b157600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb7125358260000151607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156117d057600080fd5b505af11580156117e4573d6000803e3d6000fd5b50505050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166352638d7583602001518784604001518560600151866080015188606001518960800151426040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b1580156118f557600080fd5b505af1158015611909573d6000803e3d6000fd5b505050506040513d602081101561191f57600080fd5b810190808051906020019092919050505082600001818152505081600001517fb18c9515006d8d9e31fb76eddb92e53ba7e8ec9e6d683e5fcab1e18ec4bb98e4836020015184604001518460400151856060015186608001518860600151896080015142604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390a25050505050565b60695481565b607160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a8357600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611ae0826301e1338061358290919063ffffffff16565b9050919050565b60008060606000806000806000611afd336138b7565b151515611b0957600080fd5b89899050975033965087600211158015611b245750600a8811155b1515611b2f57600080fd5b87604051908082528060200260200182016040528015611b5e5781602001602082028038833980820191505090505b50955060009350600092505b87831015611ef1578673ffffffffffffffffffffffffffffffffffffffff16606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8c8c878181101515611bd557fe5b905060200201356040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015611c2e57600080fd5b505af1158015611c42573d6000803e3d6000fd5b505050506040513d6020811015611c5857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515611c8b57600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af62a7088b8b868181101515611cd757fe5b905060200201356040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506040805180830381600087803b158015611d2f57600080fd5b505af1158015611d43573d6000803e3d6000fd5b505050506040513d6040811015611d5957600080fd5b8101908080519060200190929190805190602001909291905050508785815181101515611d8257fe5b906020019060200201819750828152505050600083141515611dde578560018403815181101515611daf57fe5b906020019060200201518684815181101515611dc757fe5b90602001906020020151141515611ddd57600080fd5b5b611df1858561389990919063ffffffff16565b9350606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac888c8c878181101515611e4057fe5b905060200201356040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015611ecc57600080fd5b505af1158015611ee0573d6000803e3d6000fd5b505050508280600101935050611b6a565b611ef9613a21565b9150606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a647e8ec8884896000815181101515611f4a57fe5b90602001906020020151886040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050602060405180830381600087803b158015611fe857600080fd5b505af1158015611ffc573d6000803e3d6000fd5b505050506040513d602081101561201257600080fd5b81019080805190602001909291905050509050428773ffffffffffffffffffffffffffffffffffffffff167f9a2f4e8b8b46a06a6a22027ad11ae098be40d52fb6263f7c0baf02c4e1bc17a08c8c858b600081518110151561207057fe5b906020019060200201518a8960405180806020018681526020018581526020018481526020018381526020018281038252888882818152602001925060200280828437820191505097505050505050505060405180910390a350505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600082821015151561213157600080fd5b612144838361388090919063ffffffff16565b905092915050565b60008060008314156121615760019150612175565b61216a85612214565b905080830184101591505b509392505050565b60008060008060006121918a8a8a8a610ee3565b935061219e8a8a8a611064565b92508260020a91506127109050838611156121f1576121ea826121dc886121ce858961354790919063ffffffff16565b61358290919063ffffffff16565b61358290919063ffffffff16565b9450612207565b612204828261358290919063ffffffff16565b94505b5050505095945050505050565b600061222c826201518061358290919063ffffffff16565b9050919050565b606a5481565b60008060608060608060606000806000806000612255336138b7565b15151561226157600080fd5b339b508c606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561232257600080fd5b505af1158015612336573d6000803e3d6000fd5b505050506040513d602081101561234c57600080fd5b81019080805190602001909291905050501015151561236a57600080fd5b8c600010801561237b575060648d11155b151561238657600080fd5b6123906005613186565b9a508a6040519080825280602002602001820160405280156123c15781602001602082028038833980820191505090505b5099508a6040519080825280602002602001820160405280156123f35781602001602082028038833980820191505090505b5098508a6040519080825280602002602001820160405280156124255781602001602082028038833980820191505090505b5097508a6040519080825280602002602001820160405280156124575781602001602082028038833980820191505090505b509650606460405190808252806020026020018201604052801561248a5781602001602082028038833980820191505090505b5095506005600060648110151561249d57fe5b01548660008151811015156124ae57fe5b9060200190602002018181525050600194505b6064851015612530576125076005866064811015156124dc57fe5b015487600188038151811015156124ef57fe5b9060200190602002015161389990919063ffffffff16565b868681518110151561251557fe5b906020019060200201818152505084806001019550506124c1565b85600187510381518110151561254257fe5b9060200190602002015193506000925060009150600094505b8a8510156125c25761256d6064613186565b888681518110151561257b57fe5b90602001906020020181815250506125b3888681518110151561259a57fe5b906020019060200201518461389990919063ffffffff16565b9250848060010195505061255b565b600094505b8a8510156128dc576125e16125db85613186565b87610e6f565b89868151811015156125ef57fe5b90602001906020020181815250506126128d606c5461354790919063ffffffff16565b905061265083612642838b8981518110151561262a57fe5b9060200190602002015161354790919063ffffffff16565b61358290919063ffffffff16565b888681518110151561265e57fe5b9060200190602002018181525050612674613a21565b878681518110151561268257fe5b9060200190602002018181525050600088868151811015156126a057fe5b906020019060200201511115156126b657600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a647e8ec8d898881518110151561270357fe5b906020019060200201518c8981518110151561271b57fe5b906020019060200201518c8a81518110151561273357fe5b906020019060200201516040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050602060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050506040513d60208110156127fa57600080fd5b81019080805190602001909291905050508a8681518110151561281957fe5b9060200190602002018181525050612878888681518110151561283857fe5b9060200190602002015160058b8881518110151561285257fe5b9060200190602002015160648110151561286857fe5b015461388090919063ffffffff16565b60058a8781518110151561288857fe5b9060200190602002015160648110151561289e57fe5b01819055506128cd88868151811015156128b457fe5b906020019060200201518361389990919063ffffffff16565b915084806001019550506125c7565b6128e582613a33565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac338f6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156129aa57600080fd5b505af11580156129be573d6000803e3d6000fd5b50505050428c73ffffffffffffffffffffffffffffffffffffffff167f23c59a8ab07b391d91ac8ab3319ad5e959ded915308b151c7ca552c56e8b35a38c8c8c8c6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015612a4e578082015181840152602081019050612a33565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015612a90578082015181840152602081019050612a75565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015612ad2578082015181840152602081019050612ab7565b50505050905001858103825286818151815260200191508051906020019060200280838360005b83811015612b14578082015181840152602081019050612af9565b505050509050019850505050505050505060405180910390a350505050505050505050505050565b607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612b6a613b1e565b612b72613ad8565b612b7a613ad8565b612b83336138b7565b151515612b8f57600080fd5b84836000018181525050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630b9d584784600001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060a060405180830381600087803b158015612c2e57600080fd5b505af1158015612c42573d6000803e3d6000fd5b505050506040513d60a0811015612c5857600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050508760200188604001896060018a6080018b60a001858152508581525085815250858152508573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505050505050612cf433856138ca565b9150612d08836020015184604001516138ca565b9050826020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614151515612d4d57600080fd5b82606001518260600151141515612d6357600080fd5b8260800151826080015110151515612d7a57600080fd5b606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb7125358360000151856020015185602001516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612e7f57600080fd5b505af1158015612e93573d6000803e3d6000fd5b50505050606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb712535607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846000015186604001516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612fba57600080fd5b505af1158015612fce573d6000803e3d6000fd5b50505050607060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634cc8221584600001516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561306757600080fd5b505af115801561307b573d6000803e3d6000fd5b5050505082600001517f5514510acd7becd44fa4def480d977880b8c94af90a31acbd616949850f15d5684602001518560400151846040015185606001518660800151886000015189602001518a606001518b6080015142604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a25050505050565b6000806000607160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a1bbc346040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561321157600080fd5b505af1158015613225573d6000803e3d6000fd5b505050506040513d602081101561323b57600080fd5b8101908080519060200190929190505050604051808267ffffffffffffffff1667ffffffffffffffff1678010000000000000000000000000000000000000000000000000281526008019150506040518091039020915060018483600190048115156132a357fe5b060190508092505050919050565b6132b9613b6b565b60056064806020026040519081016040528092919082606480156132f2576020028201915b8154815260200190600101908083116132de575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561335757600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6611c37937e0800081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561342757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561346357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600084141561355c576000915061357b565b828402905082848281151561356d57fe5b0414151561357757fe5b8091505b5092915050565b600080828481151561359057fe5b0490508091505092915050565b606e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630f18ac0783836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561366257600080fd5b505af1158015613676573d6000803e3d6000fd5b505050505050565b60008060006136986004543461358290919063ffffffff16565b92508234039150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015613707573d6000803e3d6000fd5b507ff56ba0f53476ddecea8bd2db761e216b2386c1f4c7b53e8667ca6586ac77a6df338385604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1671bf32a5451a300009050803073ffffffffffffffffffffffffffffffffffffffff163110151561387b57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561380e573d6000803e3d6000fd5b507f5d8bc849764969eb1bcc6d0a2f55999d0167c1ccec240a4f39cf664ca9c4148e3382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b505050565b600082821115151561388e57fe5b818303905092915050565b60008082840190508381101515156138ad57fe5b8091505092915050565b600080823b905060008111915050919050565b6138d2613ad8565b6138da613ad8565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816020018181525050606f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c3b6f0e846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050606060405180830381600087803b1580156139ad57600080fd5b505af11580156139c1573d6000803e3d6000fd5b505050506040513d60608110156139d757600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050508360400184606001856080018381525083815250838152505050508091505092915050565b6000613a2e600019613186565b905090565b600080613a4b83606b5461389990919063ffffffff16565b606b81905550439150613a6360695483606d5461214c565b90508015613ad357613a84606954606a548465befe6f672000606b5461217d565b606c8190555081606d819055507fb9a2ce1061b71fbf2ee90bb8feed7941f9d6f8b6fe67bce1822774c5fc9844af606c5483604051808381526020018281526020019250505060405180910390a15b505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b60c06040519081016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b610c80604051908101604052806064906020820280388339808201915050905050905600a165627a7a72305820459e86dc3ddcfbb169995058294fa47fed86bd909aaa082d9f46f3c6b7e881da0029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005116c1d70e3a2cf55a2502d05f1bc17a0518782e000000000000000000000000cfbc9103362aec4ce3089f155c2da2eea1cb7602000000000000000000000000b6e928db347dbaad2c06868b716a2cf488904574000000000000000000000000045f11fc6fbed29b73119f4d51570c7e64af75f30000000000000000000000007b37faf831044d08da0c0e7419e2e31615f43032000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d3590000000000000000000000000000000000000000000000000000000000000032

-----Decoded View---------------
Arg [0] : _pickaxe (address): 0x5116c1D70E3A2Cf55a2502d05F1bc17a0518782E
Arg [1] : _crystal (address): 0xcFbC9103362AEc4ce3089f155c2DA2EEa1cB7602
Arg [2] : _exchange (address): 0xB6e928dB347dbAAD2C06868b716a2Cf488904574
Arg [3] : _generator (address): 0x045F11Fc6fBed29b73119f4D51570C7e64Af75F3
Arg [4] : _wallet (address): 0x7B37FaF831044d08Da0C0E7419e2e31615f43032
Arg [5] : _donationWallet (address): 0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359
Arg [6] : _donationRate (uint256): 50

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000005116c1d70e3a2cf55a2502d05f1bc17a0518782e
Arg [1] : 000000000000000000000000cfbc9103362aec4ce3089f155c2da2eea1cb7602
Arg [2] : 000000000000000000000000b6e928db347dbaad2c06868b716a2cf488904574
Arg [3] : 000000000000000000000000045f11fc6fbed29b73119f4d51570c7e64af75f3
Arg [4] : 0000000000000000000000007b37faf831044d08da0c0e7419e2e31615f43032
Arg [5] : 000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d359
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000032


Swarm Source

bzzr://459e86dc3ddcfbb169995058294fa47fed86bd909aaa082d9f46f3c6b7e881da

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.