ETH Price: $3,439.21 (-1.29%)

EtheremonMonster (EMONA)
 

Overview

TokenID

39243

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Etheremon combines Blockchain with Virtual Reality (VR) to set the foundation for the Game 3.0 era.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EtheremonMonsterToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-08-28
*/

pragma solidity ^0.4.24;

/**
 * @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 c) {
    if (a == 0) {
      return 0;
    }
    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 a / b;
  }

  /**
  * @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 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * Utility library of inline functions on addresses
 */
library AddressUtils {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   *  as the code is not actually created until after the constructor finishes.
   * @param addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address addr) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(addr) }
    return size > 0;
  }

}

interface ERC165 {
    function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}

contract SupportsInterface is ERC165 {
    
    mapping(bytes4 => bool) internal supportedInterfaces;

    constructor() public {
        supportedInterfaces[0x01ffc9a7] = true; // ERC165
    }

    function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
        return supportedInterfaces[_interfaceID];
    }
}

interface ERC721 {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    
    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) external;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;
    
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function approve(address _approved, uint256 _tokenId) external;
    function setApprovalForAll(address _operator, bool _approved) external;
    
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

interface ERC721Enumerable {
    function totalSupply() external view returns (uint256);
    function tokenByIndex(uint256 _index) external view returns (uint256);
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

interface ERC721Metadata {
    function name() external view returns (string _name);
    function symbol() external view returns (string _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string);
}

interface ERC721TokenReceiver {
  function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);
}

contract BasicAccessControl {
    address public owner;
    // address[] public moderators;
    uint16 public totalModerators = 0;
    mapping (address => bool) public moderators;
    bool public isMaintaining = false;

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    modifier onlyModerators() {
        require(msg.sender == owner || moderators[msg.sender] == true);
        _;
    }

    modifier isActive {
        require(!isMaintaining);
        _;
    }

    function ChangeOwner(address _newOwner) onlyOwner public {
        if (_newOwner != address(0)) {
            owner = _newOwner;
        }
    }


    function AddModerator(address _newModerator) onlyOwner public {
        if (moderators[_newModerator] == false) {
            moderators[_newModerator] = true;
            totalModerators += 1;
        }
    }
    
    function RemoveModerator(address _oldModerator) onlyOwner public {
        if (moderators[_oldModerator] == true) {
            moderators[_oldModerator] = false;
            totalModerators -= 1;
        }
    }

    function UpdateMaintaining(bool _isMaintaining) onlyOwner public {
        isMaintaining = _isMaintaining;
    }
}

contract EtheremonEnum {

    enum ResultCode {
        SUCCESS,
        ERROR_CLASS_NOT_FOUND,
        ERROR_LOW_BALANCE,
        ERROR_SEND_FAIL,
        ERROR_NOT_TRAINER,
        ERROR_NOT_ENOUGH_MONEY,
        ERROR_INVALID_AMOUNT
    }
    
    enum ArrayType {
        CLASS_TYPE,
        STAT_STEP,
        STAT_START,
        STAT_BASE,
        OBJ_SKILL
    }
    
    enum PropertyType {
        ANCESTOR,
        XFACTOR
    }
}

contract EtheremonDataBase {
    
    uint64 public totalMonster;
    uint32 public totalClass;
    
    // write
    function withdrawEther(address _sendTo, uint _amount) external returns(EtheremonEnum.ResultCode);
    function addElementToArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint8 _value) external returns(uint);
    function updateIndexOfArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint _index, uint8 _value) external returns(uint);
    function setMonsterClass(uint32 _classId, uint256 _price, uint256 _returnPrice, bool _catchable) external returns(uint32);
    function addMonsterObj(uint32 _classId, address _trainer, string _name) external returns(uint64);
    function setMonsterObj(uint64 _objId, string _name, uint32 _exp, uint32 _createIndex, uint32 _lastClaimIndex) external;
    function increaseMonsterExp(uint64 _objId, uint32 amount) external;
    function decreaseMonsterExp(uint64 _objId, uint32 amount) external;
    function removeMonsterIdMapping(address _trainer, uint64 _monsterId) external;
    function addMonsterIdMapping(address _trainer, uint64 _monsterId) external;
    function clearMonsterReturnBalance(uint64 _monsterId) external returns(uint256 amount);
    function collectAllReturnBalance(address _trainer) external returns(uint256 amount);
    function transferMonster(address _from, address _to, uint64 _monsterId) external returns(EtheremonEnum.ResultCode);
    function addExtraBalance(address _trainer, uint256 _amount) external returns(uint256);
    function deductExtraBalance(address _trainer, uint256 _amount) external returns(uint256);
    function setExtraBalance(address _trainer, uint256 _amount) external;
    
    // read
    function getSizeArrayType(EtheremonEnum.ArrayType _type, uint64 _id) constant external returns(uint);
    function getElementInArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint _index) constant external returns(uint8);
    function getMonsterClass(uint32 _classId) constant external returns(uint32 classId, uint256 price, uint256 returnPrice, uint32 total, bool catchable);
    function getMonsterObj(uint64 _objId) constant external returns(uint64 objId, uint32 classId, address trainer, uint32 exp, uint32 createIndex, uint32 lastClaimIndex, uint createTime);
    function getMonsterName(uint64 _objId) constant external returns(string name);
    function getExtraBalance(address _trainer) constant external returns(uint256);
    function getMonsterDexSize(address _trainer) constant external returns(uint);
    function getMonsterObjId(address _trainer, uint index) constant external returns(uint64);
    function getExpectedBalance(address _trainer) constant external returns(uint256);
    function getMonsterReturn(uint64 _objId) constant external returns(uint256 current, uint256 total);
}

interface EtheremonBattle {
    function isOnBattle(uint64 _objId) constant external returns(bool);
}

interface EtheremonTradeInterface {
    function isOnTrading(uint64 _objId) constant external returns(bool);
}


contract EtheremonMonsterTokenBasic is ERC721, SupportsInterface, BasicAccessControl {

    using SafeMath for uint256;
    using AddressUtils for address;
    
    struct MonsterClassAcc {
        uint32 classId;
        uint256 price;
        uint256 returnPrice;
        uint32 total;
        bool catchable;
    }

    struct MonsterObjAcc {
        uint64 monsterId;
        uint32 classId;
        address trainer;
        string name;
        uint32 exp;
        uint32 createIndex;
        uint32 lastClaimIndex;
        uint createTime;
    }

    // data contract
    address public dataContract;
    address public battleContract;
    address public tradeContract;
    
    // Mapping from NFT ID to approved address.
    mapping (uint256 => address) internal idToApprovals;
    
    // Mapping from owner address to mapping of operator addresses.
    mapping (address => mapping (address => bool)) internal ownerToOperators;
    
    /**
    * @dev Magic value of a smart contract that can recieve NFT.
    * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
    */
    bytes4 constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    
    // internal function
    function _canOperate(address _tokenOwner) constant internal {
        require(_tokenOwner == msg.sender || ownerToOperators[_tokenOwner][msg.sender]);
    }
    
    function _canTransfer(uint256 _tokenId, address _tokenOwner) constant internal {
        EtheremonBattle battle = EtheremonBattle(battleContract);
        EtheremonTradeInterface trade = EtheremonTradeInterface(tradeContract);
        require(!battle.isOnBattle(uint64(_tokenId)) && !trade.isOnTrading(uint64(_tokenId)));
        require(_tokenOwner != address(0));
        require(_tokenOwner == msg.sender || idToApprovals[_tokenId] == msg.sender || ownerToOperators[_tokenOwner][msg.sender]);
    }
    
    function setOperationContracts(address _dataContract, address _battleContract, address _tradeContract) onlyModerators external {
        dataContract = _dataContract;
        battleContract = _battleContract;
        tradeContract = _tradeContract;
    }
    
    // public function

    constructor() public {
        supportedInterfaces[0x80ac58cd] = true; // ERC721
    }

    function isApprovable(address _owner, uint256 _tokenId) public constant returns(bool) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        if (obj.monsterId != uint64(_tokenId))
            return false;
        if (obj.trainer != _owner)
            return false;
        // check battle & trade contract 
        EtheremonBattle battle = EtheremonBattle(battleContract);
        EtheremonTradeInterface trade = EtheremonTradeInterface(tradeContract);
        return (!battle.isOnBattle(obj.monsterId) && !trade.isOnTrading(obj.monsterId));
    }

    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0));
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        return data.getMonsterDexSize(_owner);
    }

    function ownerOf(uint256 _tokenId) external view returns (address _owner) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, _owner, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(_owner != address(0));
    }


    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) external {
        _safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) external {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        _canTransfer(_tokenId, obj.trainer);
        
        require(obj.trainer == _from);
        require(_to != address(0));
        _transfer(obj.trainer, _to, _tokenId);
    }

    function transfer(address _to, uint256 _tokenId) external {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        _canTransfer(_tokenId, obj.trainer);
        
        require(obj.trainer == msg.sender);
        require(_to != address(0));
        _transfer(obj.trainer, _to, _tokenId);
    }

    function approve(address _approved, uint256 _tokenId) external {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        _canOperate(obj.trainer);
        EtheremonBattle battle = EtheremonBattle(battleContract);
        EtheremonTradeInterface trade = EtheremonTradeInterface(tradeContract);
        if(battle.isOnBattle(obj.monsterId) || trade.isOnTrading(obj.monsterId))
            revert();
        
        require(_approved != obj.trainer);

        idToApprovals[_tokenId] = _approved;
        emit Approval(obj.trainer, _approved, _tokenId);
    }

    function setApprovalForAll(address _operator, bool _approved) external {
        require(_operator != address(0));
        ownerToOperators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    function getApproved(uint256 _tokenId) public view returns (address) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        return idToApprovals[_tokenId];
    }

    function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
        require(_owner != address(0));
        require(_operator != address(0));
        return ownerToOperators[_owner][_operator];
    }

    function _safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) internal {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        _canTransfer(_tokenId, obj.trainer);
        
        require(obj.trainer == _from);
        require(_to != address(0));

        _transfer(obj.trainer, _to, _tokenId);

        if (_to.isContract()) {
            bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
            require(retval == MAGIC_ON_ERC721_RECEIVED);
        }
    }

    function _transfer(address _from, address _to, uint256 _tokenId) private {
        _clearApproval(_tokenId);
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        data.removeMonsterIdMapping(_from, uint64(_tokenId));
        data.addMonsterIdMapping(_to, uint64(_tokenId));
        emit Transfer(_from, _to, _tokenId);
    }


    function _burn(uint256 _tokenId) internal { 
        _clearApproval(_tokenId);
        
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(uint64(_tokenId));
        require(obj.trainer != address(0));
        
        EtheremonBattle battle = EtheremonBattle(battleContract);
        EtheremonTradeInterface trade = EtheremonTradeInterface(tradeContract);
        if(battle.isOnBattle(obj.monsterId) || trade.isOnTrading(obj.monsterId))
            revert();
        
        data.removeMonsterIdMapping(obj.trainer, uint64(_tokenId));
        
        emit Transfer(obj.trainer, address(0), _tokenId);
    }

    function _clearApproval(uint256 _tokenId) internal {
        if(idToApprovals[_tokenId] != 0) {
            delete idToApprovals[_tokenId];
        }
    }

}


contract EtheremonMonsterEnumerable is EtheremonMonsterTokenBasic, ERC721Enumerable {

    constructor() public {
        supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
    }

    function totalSupply() external view returns (uint256) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        return data.totalMonster();
    }

    function tokenByIndex(uint256 _index) external view returns (uint256) {
        return _index;
    }

    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        require(_owner != address(0));
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        return data.getMonsterObjId(_owner, _index);
    }

}


contract EtheremonMonsterStandard is EtheremonMonsterEnumerable, ERC721Metadata {
    string internal nftName;
    string internal nftSymbol;
    
    mapping (uint256 => string) internal idToUri;
    
    constructor(string _name, string _symbol) public {
        nftName = _name;
        nftSymbol = _symbol;
        supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
    }
    
    function _burn(uint256 _tokenId) internal {
        super._burn(_tokenId);
        if (bytes(idToUri[_tokenId]).length != 0) {
            delete idToUri[_tokenId];
        }
    }
    
    function _setTokenUri(uint256 _tokenId, string _uri) internal {
        idToUri[_tokenId] = _uri;
    }
    
    function name() external view returns (string _name) {
        _name = nftName;
    }
    
    function symbol() external view returns (string _symbol) {
        _symbol = nftSymbol;
    }
    
    function tokenURI(uint256 _tokenId) external view returns (string) {
        return idToUri[_tokenId];
    }
}

contract EtheremonMonsterToken is EtheremonMonsterStandard("EtheremonMonster", "EMONA") {
    uint8 constant public STAT_COUNT = 6;
    uint8 constant public STAT_MAX = 32;

    uint seed = 0;
    
    mapping(uint8 => uint32) public levelExps;
    mapping(uint32 => bool) classWhitelist;
    mapping(address => bool) addressWhitelist;
    
    uint public gapFactor = 0.001 ether;
    uint16 public priceIncreasingRatio = 1000;
    
    function setPriceIncreasingRatio(uint16 _ratio) onlyModerators external {
        priceIncreasingRatio = _ratio;
    }
    
    function setFactor(uint _gapFactor) onlyModerators public {
        gapFactor = _gapFactor;
    }
    
    function genLevelExp() onlyModerators external {
        uint8 level = 1;
        uint32 requirement = 100;
        uint32 sum = requirement;
        while(level <= 100) {
            levelExps[level] = sum;
            level += 1;
            requirement = (requirement * 11) / 10 + 5;
            sum += requirement;
        }
    }
    
    function setClassWhitelist(uint32 _classId, bool _status) onlyModerators external {
        classWhitelist[_classId] = _status;
    }

    function setAddressWhitelist(address _smartcontract, bool _status) onlyModerators external {
        addressWhitelist[_smartcontract] = _status;
    }

    function setTokenURI(uint256 _tokenId, string _uri) onlyModerators external {
        _setTokenUri(_tokenId, _uri);
    }
    
    function withdrawEther(address _sendTo, uint _amount) onlyOwner public {
        if (_amount > address(this).balance) {
            revert();
        }
        _sendTo.transfer(_amount);
    }
    
    function mintMonster(uint32 _classId, address _trainer, string _name) onlyModerators external returns(uint){
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        // add monster
        uint64 objId = data.addMonsterObj(_classId, _trainer, _name);
        uint8 value;
        seed = getRandom(_trainer, block.number-1, seed, objId);
        // generate base stat for the previous one
        for (uint i=0; i < STAT_COUNT; i+= 1) {
            value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
            data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
        }
        emit Transfer(address(0), _trainer, objId);
        return objId;
    }
    
    function burnMonster(uint64 _tokenId) onlyModerators external {
        _burn(_tokenId);
    }
    
    function clearApproval(uint _tokenId) onlyModerators external {
        _clearApproval(_tokenId);
    }
    
    function triggerTransferEvent(address _from, address _to, uint _tokenId) onlyModerators external {
        _clearApproval(_tokenId);
        emit Transfer(_from, _to, _tokenId);
    }
    
    // public api 
    function getRandom(address _player, uint _block, uint _seed, uint _count) view public returns(uint) {
        return uint(keccak256(abi.encodePacked(blockhash(_block), _player, _seed, _count)));
    }
    
    function getLevel(uint32 exp) view public returns (uint8) {
        uint8 minIndex = 1;
        uint8 maxIndex = 100;
        uint8 currentIndex;
     
        while (minIndex < maxIndex) {
            currentIndex = (minIndex + maxIndex) / 2;
            if (exp < levelExps[currentIndex])
                maxIndex = currentIndex;
            else
                minIndex = currentIndex + 1;
        }

        return minIndex;
    }
    
    function getMonsterBaseStats(uint64 _monsterId) constant external returns(uint hp, uint pa, uint pd, uint sa, uint sd, uint speed) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        uint[6] memory stats;
        for(uint i=0; i < STAT_COUNT; i+=1) {
            stats[i] = data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_BASE, _monsterId, i);
        }
        return (stats[0], stats[1], stats[2], stats[3], stats[4], stats[5]);
    }
    
    function getMonsterCurrentStats(uint64 _monsterId) constant external returns(uint exp, uint level, uint hp, uint pa, uint pd, uint sa, uint sd, uint speed) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(_monsterId);
        
        uint[6] memory stats;
        uint i = 0;
        level = getLevel(obj.exp);
        for(i=0; i < STAT_COUNT; i+=1) {
            stats[i] = data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_BASE, _monsterId, i);
        }
        for(i=0; i < STAT_COUNT; i++) {
            stats[i] += uint(data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_STEP, obj.classId, i)) * level * 3;
        }
        
        return (obj.exp, level, stats[0], stats[1], stats[2], stats[3], stats[4], stats[5]);
    }
    
    function getMonsterCP(uint64 _monsterId) constant external returns(uint cp) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(_monsterId);
        
        uint[6] memory stats;
        uint i = 0;
        cp = getLevel(obj.exp);
        for(i=0; i < STAT_COUNT; i+=1) {
            stats[i] = data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_BASE, _monsterId, i);
        }
        for(i=0; i < STAT_COUNT; i++) {
            stats[i] += uint(data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_STEP, obj.classId, i)) * cp * 3;
        }
        
        cp = (stats[0] + stats[1] + stats[2] + stats[3] + stats[4] + stats[5]) / 6;
    }
    
    function getPrice(uint32 _classId) constant external returns(bool catchable, uint price) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
        
        price = class.price;
        if (class.total > 0)
            price += class.price*(class.total-1)/priceIncreasingRatio;
        
        if (class.catchable == false) {
            if (addressWhitelist[msg.sender] == true && classWhitelist[_classId] == true) {
                return (true, price);
            }
        }
        
        return (class.catchable, price);
    }
    
    function getMonsterClassBasic(uint32 _classId) constant external returns(uint256, uint256, uint256, bool) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
        return (class.price, class.returnPrice, class.total, class.catchable);
    }
    
    function renameMonster(uint64 _objId, string name) isActive external {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(_objId);
        if (obj.monsterId != _objId || obj.trainer != msg.sender) {
            revert();
        }
        data.setMonsterObj(_objId, name, obj.exp, obj.createIndex, obj.lastClaimIndex);
    }
    
    function catchMonster(address _player, uint32 _classId, string _name) isActive external payable returns(uint tokenId) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
        if (class.classId == 0) {
            revert();
        }
        
        if (class.catchable == false) {
            if (addressWhitelist[msg.sender] == false || classWhitelist[_classId] == false) {
                revert();
            }
        }
        
        uint price = class.price;
        if (class.total > 0)
            price += class.price*(class.total-1)/priceIncreasingRatio;
        if (msg.value + gapFactor < price) {
            revert();
        }
        
        // add new monster 
        uint64 objId = data.addMonsterObj(_classId, _player, _name);
        uint8 value;
        seed = getRandom(_player, block.number-1, seed, objId);
        // generate base stat for the previous one
        for (uint i=0; i < STAT_COUNT; i+= 1) {
            value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
            data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
        }
        
        emit Transfer(address(0), _player, objId);

        return objId; 
    }
    
    
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_monsterId","type":"uint64"}],"name":"getMonsterCP","outputs":[{"name":"cp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_classId","type":"uint32"},{"name":"_trainer","type":"address"},{"name":"_name","type":"string"}],"name":"mintMonster","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_player","type":"address"},{"name":"_block","type":"uint256"},{"name":"_seed","type":"uint256"},{"name":"_count","type":"uint256"}],"name":"getRandom","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dataContract","type":"address"},{"name":"_battleContract","type":"address"},{"name":"_tradeContract","type":"address"}],"name":"setOperationContracts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dataContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"moderators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_uri","type":"string"}],"name":"setTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"genLevelExp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_monsterId","type":"uint64"}],"name":"getMonsterCurrentStats","outputs":[{"name":"exp","type":"uint256"},{"name":"level","type":"uint256"},{"name":"hp","type":"uint256"},{"name":"pa","type":"uint256"},{"name":"pd","type":"uint256"},{"name":"sa","type":"uint256"},{"name":"sd","type":"uint256"},{"name":"speed","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"battleContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_classId","type":"uint32"},{"name":"_status","type":"bool"}],"name":"setClassWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_isMaintaining","type":"bool"}],"name":"UpdateMaintaining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"STAT_MAX","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalModerators","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sendTo","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ratio","type":"uint16"}],"name":"setPriceIncreasingRatio","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newModerator","type":"address"}],"name":"AddModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"levelExps","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"clearApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_gapFactor","type":"uint256"}],"name":"setFactor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint64"}],"name":"burnMonster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"isApprovable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_objId","type":"uint64"},{"name":"name","type":"string"}],"name":"renameMonster","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":"_classId","type":"uint32"}],"name":"getMonsterClassBasic","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_smartcontract","type":"address"},{"name":"_status","type":"bool"}],"name":"setAddressWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"exp","type":"uint32"}],"name":"getLevel","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldModerator","type":"address"}],"name":"RemoveModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_player","type":"address"},{"name":"_classId","type":"uint32"},{"name":"_name","type":"string"}],"name":"catchMonster","outputs":[{"name":"tokenId","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"gapFactor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"triggerTransferEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_monsterId","type":"uint64"}],"name":"getMonsterBaseStats","outputs":[{"name":"hp","type":"uint256"},{"name":"pa","type":"uint256"},{"name":"pd","type":"uint256"},{"name":"sa","type":"uint256"},{"name":"sd","type":"uint256"},{"name":"speed","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STAT_COUNT","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_classId","type":"uint32"}],"name":"getPrice","outputs":[{"name":"catchable","type":"bool"},{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"priceIncreasingRatio","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isMaintaining","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"ChangeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tradeContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

600180546003805460ff199081169091556000600b81905566038d7ea4c68000600f556010805461ffff19166103e817815560808181527f4574686572656d6f6e4d6f6e737465720000000000000000000000000000000060a0908152610100604052600560c09081527f454d4f4e4100000000000000000000000000000000000000000000000000000060e05260208590527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c58054871689179055600160b060020a0319909616331787557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548616881790557f780e9d63000000000000000000000000000000000000000000000000000000009093527f77b7bbe0e49b76487c9476b5db3354cf5270619d0037ccb899c2a4c4a75b43188054909416909517909255620001539160089190620001c7565b50805162000169906009906020840190620001c7565b50507f5b5e139f000000000000000000000000000000000000000000000000000000006000908152602052507f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805460ff191660011790556200026c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200020a57805160ff19168380011785556200023a565b828001600101855582156200023a579182015b828111156200023a5782518255916020019190600101906200021d565b50620002489291506200024c565b5090565b6200026991905b8082111562000248576000815560010162000253565b90565b614091806200027c6000396000f3006080604052600436106102795763ffffffff60e060020a60003504166301ffc9a7811461027e5780630672859b146102c957806306fdde03146102fd578063081812fc14610387578063095ea7b3146103bb5780630963d4b7146103e15780630a92b264146104185780630afd548d146104425780630d6688181461046f57806314d0f1ba14610484578063162094c4146104a557806318160ddd146104c957806323b872dd146104de5780632f745c591461050857806333ced3211461052c5780633c6e592714610541578063423b1ca3146105a457806342842e0e146105b95780634661bb98146105e357806348ef5aa8146106065780634e3dc2f1146106205780634efb023e1461064b5780634f6ccce714610677578063522f68151461068f57806357918052146106b35780636352211e146106cf5780636c81fd6d146106e757806370a082311461070857806378b475a8146107295780637fdd54031461075d578063817e9d311461077557806381b230421461078d5780638a0520fb146107af5780638d1d22d8146107d35780638da5cb5b1461080157806394f6ba1c1461081657806395d89b411461085c578063a22cb46514610871578063a9059cbb14610897578063af4c14ee146108bb578063b2cad9b7146108e1578063b85d6275146108ff578063b88d4fde14610920578063c0845e8a14610959578063c10be52114610983578063c463b00814610998578063c87b56dd146109c2578063d29cbd60146109da578063d98e14bd14610a2f578063da26663a14610a44578063e19bb96414610a7d578063e985e9c514610a92578063ee4e441614610ab9578063f285329214610ace578063ffa640d814610aef575b600080fd5b34801561028a57600080fd5b506102b57bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516610b04565b604080519115158252519081900360200190f35b3480156102d557600080fd5b506102eb67ffffffffffffffff60043516610b38565b60408051918252519081900360200190f35b34801561030957600080fd5b50610312610dfe565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561034c578181015183820152602001610334565b50505050905090810190601f1680156103795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039357600080fd5b5061039f600435610e94565b60408051600160a060020a039092168252519081900360200190f35b3480156103c757600080fd5b506103df600160a060020a0360043516602435610fbf565b005b3480156103ed57600080fd5b506102eb6004803563ffffffff169060248035600160a060020a0316916044359182019101356112a7565b34801561042457600080fd5b506102eb600160a060020a036004351660243560443560643561157a565b34801561044e57600080fd5b506103df600160a060020a036004358116906024358116906044351661162c565b34801561047b57600080fd5b5061039f6116c6565b34801561049057600080fd5b506102b5600160a060020a03600435166116da565b3480156104b157600080fd5b506103df6004803590602480359081019101356116ef565b3480156104d557600080fd5b506102eb611766565b3480156104ea57600080fd5b506103df600160a060020a03600435811690602435166044356117fc565b34801561051457600080fd5b506102eb600160a060020a0360043516602435611961565b34801561053857600080fd5b506103df611a2e565b34801561054d57600080fd5b5061056367ffffffffffffffff60043516611acb565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156105b057600080fd5b5061039f611de6565b3480156105c557600080fd5b506103df600160a060020a0360043581169060243516604435611df5565b3480156105ef57600080fd5b506103df63ffffffff600435166024351515611e11565b34801561061257600080fd5b506103df6004351515611e71565b34801561062c57600080fd5b50610635611e9b565b6040805160ff9092168252519081900360200190f35b34801561065757600080fd5b50610660611ea0565b6040805161ffff9092168252519081900360200190f35b34801561068357600080fd5b506102eb600435611ec2565b34801561069b57600080fd5b506103df600160a060020a0360043516602435611ec5565b3480156106bf57600080fd5b506103df61ffff60043516611f20565b3480156106db57600080fd5b5061039f600435611f70565b3480156106f357600080fd5b506103df600160a060020a0360043516612075565b34801561071457600080fd5b506102eb600160a060020a036004351661211c565b34801561073557600080fd5b5061074460ff600435166121d7565b6040805163ffffffff9092168252519081900360200190f35b34801561076957600080fd5b506103df6004356121ef565b34801561078157600080fd5b506103df600435612230565b34801561079957600080fd5b506103df67ffffffffffffffff6004351661226d565b3480156107bb57600080fd5b506102b5600160a060020a03600435166024356122b8565b3480156107df57600080fd5b506103df6004803567ffffffffffffffff16906024803590810191013561253e565b34801561080d57600080fd5b5061039f612758565b34801561082257600080fd5b5061083463ffffffff60043516612767565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b34801561086857600080fd5b50610312612866565b34801561087d57600080fd5b506103df600160a060020a036004351660243515156128c7565b3480156108a357600080fd5b506103df600160a060020a036004351660243561294a565b3480156108c757600080fd5b506103df600160a060020a03600435166024351515612aa3565b3480156108ed57600080fd5b5061063563ffffffff60043516612b06565b34801561090b57600080fd5b506103df600160a060020a0360043516612b69565b34801561092c57600080fd5b506103df600160a060020a0360048035821691602480359091169160443591606435908101910135612c10565b6102eb60048035600160a060020a0316906024803563ffffffff1691604435918201910135612c4c565b34801561098f57600080fd5b506102eb61307b565b3480156109a457600080fd5b506103df600160a060020a0360043581169060243516604435613081565b3480156109ce57600080fd5b506103126004356130f6565b3480156109e657600080fd5b506109fc67ffffffffffffffff60043516613197565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610a3b57600080fd5b506106356132a6565b348015610a5057600080fd5b50610a6263ffffffff600435166132ab565b60408051921515835260208301919091528051918290030190f35b348015610a8957600080fd5b50610660613438565b348015610a9e57600080fd5b506102b5600160a060020a0360043581169060243516613442565b348015610ac557600080fd5b506102b561349d565b348015610ada57600080fd5b506103df600160a060020a03600435166134a6565b348015610afb57600080fd5b5061039f6134f9565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526020819052604090205460ff1690565b600080610b43613ee1565b610b4b613f24565b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169450600091859163072024609160248083019260e092919082900301818787803b158015610bac57600080fd5b505af1158015610bc0573d6000803e3d6000fd5b505050506040513d60e0811015610bd657600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a01819052600160a060020a039091169189019190915293169086015267ffffffffffffffff16845260009150610c5190612b06565b60ff169450600090505b6006811015610d0f576040805160e060020a6362b21ad70281526003600482015267ffffffffffffffff88166024820152604481018390529051600160a060020a038616916362b21ad79160648083019260209291908290030181600087803b158015610cc757600080fd5b505af1158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b505160ff16828260068110610d0257fe5b6020020152600101610c5b565b5060005b6006811015610dd1576020838101516040805160e060020a6362b21ad70281526001600482015263ffffffff909216602483015260448201849052518792600160a060020a038816926362b21ad792606480830193928290030181600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b505050506040513d6020811015610da957600080fd5b505160ff1602600302828260068110610dbe57fe5b6020020180519091019052600101610d13565b5060a081015160808201516060830151604084015160208501519451600695010101010104949350505050565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b820191906000526020600020905b815481529060010190602001808311610e6d57829003601f168201915b5050505050905090565b600080610e9f613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b158015610eff57600080fd5b505af1158015610f13573d6000803e3d6000fd5b505050506040513d60e0811015610f2957600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff1682521515610f9d57600080fd5b600084815260066020526040902054600160a060020a031692505b5050919050565b6000610fc9613ee1565b600080600360019054906101000a9004600160a060020a0316935083600160a060020a03166307202460866040518263ffffffff1660e060020a028152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060e060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b505050506040513d60e081101561106b57600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880181905293169086015267ffffffffffffffff16845215156110df57600080fd5b6110ec8360400151613508565b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b15801561115757600080fd5b505af115801561116b573d6000803e3d6000fd5b505050506040513d602081101561118157600080fd5b50518061120d575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b1580156111e057600080fd5b505af11580156111f4573d6000803e3d6000fd5b505050506040513d602081101561120a57600080fd5b50515b1561121757600080fd5b6040830151600160a060020a038781169116141561123457600080fd5b600085815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038a811691821790925586830151925189949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050505050565b6001546000908190819081908190600160a060020a03163314806112df57503360009081526002602052604090205460ff1615156001145b15156112ea57600080fd5b6003546040517ffc4d20f500000000000000000000000000000000000000000000000000000000815263ffffffff8b1660048201908152600160a060020a038b81166024840152606060448401908152606484018b9052610100909404169650869263fc4d20f5928d928d928d928d929190608401848480828437820191505095505050505050602060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b505050506040513d60208110156113b557600080fd5b5051600b549093506113d990899060001943019067ffffffffffffffff871661157a565b600b555060005b6006811015611534576040805160e060020a6362b21ad70281526002600482015263ffffffff8b166024820152604481018390529051600160a060020a038616916362b21ad79160648083019260209291908290030181600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b505050506040513d602081101561147257600080fd5b5051600b546020900601915083600160a060020a03166326bda739600385856040518463ffffffff1660e060020a028152600401808460048111156114b357fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018260ff1660ff1681526020019350505050602060405180830381600087803b15801561150057600080fd5b505af1158015611514573d6000803e3d6000fd5b505050506040513d602081101561152a57600080fd5b50506001016113e0565b60405167ffffffffffffffff841690600160a060020a038a1690600090600080516020614046833981519152908290a4505067ffffffffffffffff169695505050505050565b6040805184406020808301919091526c01000000000000000000000000600160a060020a0388160282840152605482018590526074808301859052835180840390910181526094909201928390528151600093918291908401908083835b602083106115f75780518252601f1990920191602091820191016115d8565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912098975050505050505050565b600154600160a060020a031633148061165957503360009081526002602052604090205460ff1615156001145b151561166457600080fd5b60038054600160a060020a039485166101000274ffffffffffffffffffffffffffffffffffffffff00199091161790556004805492841673ffffffffffffffffffffffffffffffffffffffff1993841617905560058054919093169116179055565b6003546101009004600160a060020a031681565b60026020526000908152604090205460ff1681565b600154600160a060020a031633148061171c57503360009081526002602052604090205460ff1615156001145b151561172757600080fd5b6117618383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061354d945050505050565b505050565b600080600360019054906101000a9004600160a060020a0316905080600160a060020a0316637a09defe6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156117bf57600080fd5b505af11580156117d3573d6000803e3d6000fd5b505050506040513d60208110156117e957600080fd5b505167ffffffffffffffff1691505b5090565b6000611806613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff861660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b15801561186657600080fd5b505af115801561187a573d6000803e3d6000fd5b505050506040513d60e081101561189057600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff168252151561190457600080fd5b61191283826040015161356c565b84600160a060020a03168160400151600160a060020a031614151561193657600080fd5b600160a060020a038416151561194b57600080fd5b61195a8160400151858561370e565b5050505050565b600080600160a060020a038416151561197957600080fd5b50600354604080517f75fe2e33000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820186905291516101009093049091169182916375fe2e339160448083019260209291908290030181600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d6020811015611a1a57600080fd5b505167ffffffffffffffff16949350505050565b60015460009081908190600160a060020a0316331480611a6257503360009081526002602052604090205460ff1615156001145b1515611a6d57600080fd5b506001915060649050805b606460ff8416116117615760ff83166000908152600c60205260409020805463ffffffff191663ffffffff83811691909117909155600190930192600a90600b8402160460050191508181019050611a78565b6000806000806000806000806000611ae1613ee1565b611ae9613f24565b6003546040805160e560020a6239012302815267ffffffffffffffff8f1660048201529051610100909204600160a060020a03169450600091859163072024609160248083019260e092919082900301818787803b158015611b4a57600080fd5b505af1158015611b5e573d6000803e3d6000fd5b505050506040513d60e0811015611b7457600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a01819052600160a060020a039091169189019190915293169086015267ffffffffffffffff16845260009150611bef90612b06565b60ff169a50600090505b6006811015611cc65783600160a060020a03166362b21ad760038f846040518463ffffffff1660e060020a02815260040180846004811115611c3757fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611c7e57600080fd5b505af1158015611c92573d6000803e3d6000fd5b505050506040513d6020811015611ca857600080fd5b505160ff16828260068110611cb957fe5b6020020152600101611bf9565b5060005b6006811015611d88576020838101516040805160e060020a6362b21ad70281526001600482015263ffffffff909216602483015260448201849052518d92600160a060020a038816926362b21ad792606480830193928290030181600087803b158015611d3657600080fd5b505af1158015611d4a573d6000803e3d6000fd5b505050506040513d6020811015611d6057600080fd5b505160ff1602600302828260068110611d7557fe5b6020020180519091019052600101611cca565b60808301518b8360006020020151846001602002015185600260200201518660036020020151876004602002015188600560200201518763ffffffff1697509b509b509b509b509b509b509b509b5050505050919395975091939597565b600454600160a060020a031681565b6117618383836020604051908101604052806000815250613871565b600154600160a060020a0316331480611e3e57503360009081526002602052604090205460ff1615156001145b1515611e4957600080fd5b63ffffffff919091166000908152600d60205260409020805460ff1916911515919091179055565b600154600160a060020a03163314611e8857600080fd5b6003805460ff1916911515919091179055565b602081565b60015474010000000000000000000000000000000000000000900461ffff1681565b90565b600154600160a060020a03163314611edc57600080fd5b3031811115611eea57600080fd5b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015611761573d6000803e3d6000fd5b600154600160a060020a0316331480611f4d57503360009081526002602052604090205460ff1615156001145b1515611f5857600080fd5b6010805461ffff191661ffff92909216919091179055565b600080611f7b613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b158015611fdb57600080fd5b505af1158015611fef573d6000803e3d6000fd5b505050506040513d60e081101561200557600080fd5b5080516020808301516040840151606085015160808087015160a08089015160c0998a015160e08c015263ffffffff908116998b0199909952908816908901529086169087015293169084015267ffffffffffffffff1682529250600160a060020a0383161515610fb857600080fd5b600154600160a060020a0316331461208c57600080fd5b600160a060020a03811660009081526002602052604090205460ff16151561211957600160a060020a0381166000908152600260205260409020805460ff19166001908117909155805461ffff74010000000000000000000000000000000000000000808304821684019091160275ffff0000000000000000000000000000000000000000199091161790555b50565b600080600160a060020a038316151561213457600080fd5b50600354604080517f47c17bac000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291516101009093049091169182916347c17bac9160248083019260209291908290030181600087803b1580156121a457600080fd5b505af11580156121b8573d6000803e3d6000fd5b505050506040513d60208110156121ce57600080fd5b50519392505050565b600c6020526000908152604090205463ffffffff1681565b600154600160a060020a031633148061221c57503360009081526002602052604090205460ff1615156001145b151561222757600080fd5b61211981613b4b565b600154600160a060020a031633148061225d57503360009081526002602052604090205460ff1615156001145b151561226857600080fd5b600f55565b600154600160a060020a031633148061229a57503360009081526002602052604090205460ff1615156001145b15156122a557600080fd5b6121198167ffffffffffffffff16613b93565b6000806122c3613ee1565b600080600360019054906101000a9004600160a060020a0316935083600160a060020a03166307202460876040518263ffffffff1660e060020a028152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060e060405180830381600087803b15801561233b57600080fd5b505af115801561234f573d6000803e3d6000fd5b505050506040513d60e081101561236557600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880152929092169185019190915267ffffffffffffffff908116808552908716146123e55760009450612534565b86600160a060020a03168360400151600160a060020a031614151561240d5760009450612534565b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b15801561247857600080fd5b505af115801561248c573d6000803e3d6000fd5b505050506040513d60208110156124a257600080fd5b5051158015612531575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b15801561250357600080fd5b505af1158015612517573d6000803e3d6000fd5b505050506040513d602081101561252d57600080fd5b5051155b94505b5050505092915050565b6000612548613ee1565b60035460ff161561255857600080fd5b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b1580156125b857600080fd5b505af11580156125cc573d6000803e3d6000fd5b505050506040513d60e08110156125e257600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860152929092169183019190915267ffffffffffffffff90811680835290861614158061266e57506040810151600160a060020a03163314155b1561267857600080fd5b608081015160a08083015160c08401516040517f32666a3100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8a166004820190815263ffffffff80871660448401528085166064840152831660848301526024820194855260a48201899052600160a060020a038816956332666a31958c958c958c959394919390929060c4018787808284378201915050975050505050505050600060405180830381600087803b15801561273957600080fd5b505af115801561274d573d6000803e3d6000fd5b505050505050505050565b600154600160a060020a031681565b6000806000806000612777613f43565b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529051610100909204600160a060020a031693508391639d29cac49160248082019260a0929091908290030181600087803b1580156127ea57600080fd5b505af11580156127fe573d6000803e3d6000fd5b505050506040513d60a081101561281457600080fd5b508051602080830151604080850151606080870151608097880151151597890188905263ffffffff90811691890182905292880182905293870183905293169094529299909850919650945092505050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b600160a060020a03821615156128dc57600080fd5b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000612954613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff861660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b1580156129b457600080fd5b505af11580156129c8573d6000803e3d6000fd5b505050506040513d60e08110156129de57600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff1682521515612a5257600080fd5b612a6083826040015161356c565b6040810151600160a060020a03163314612a7957600080fd5b600160a060020a0384161515612a8e57600080fd5b612a9d8160400151858561370e565b50505050565b600154600160a060020a0316331480612ad057503360009081526002602052604090205460ff1615156001145b1515612adb57600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b600060016064825b8160ff168360ff161015612b6057600260ff848401160460ff81166000908152600c602052604090205490915063ffffffff9081169086161015612b5457809150612b5b565b8060010192505b612b0e565b50909392505050565b600154600160a060020a03163314612b8057600080fd5b600160a060020a03811660009081526002602052604090205460ff1615156001141561211957600160a060020a03166000908152600260205260409020805460ff191690556001805475ffff0000000000000000000000000000000000000000198116740100000000000000000000000000000000000000009182900461ffff9081166000190116909102179055565b61195a85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750613871945050505050565b600080612c57613f43565b60035460009081908190819060ff1615612c7057600080fd5b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff8d1660048201529051610100909204600160a060020a031697508791639d29cac49160248082019260a0929091908290030181600087803b158015612ce357600080fd5b505af1158015612cf7573d6000803e3d6000fd5b505050506040513d60a0811015612d0d57600080fd5b5080516020808301516040808501516060808701516080978801511515978d019790975263ffffffff968716908c0152908a015290880152168086521515612d5457600080fd5b60808501511515612d9e57336000908152600e602052604090205460ff161580612d94575063ffffffff8a166000908152600d602052604090205460ff16155b15612d9e57600080fd5b846020015193506000856060015163ffffffff161115612de8576010546060860151602087015161ffff9092169160001990910163ffffffff1602811515612de257fe5b04840193505b83600f5434011015612df957600080fd5b85600160a060020a031663fc4d20f58b8d8c8c6040518563ffffffff1660e060020a028152600401808563ffffffff1663ffffffff16815260200184600160a060020a0316600160a060020a03168152602001806020018281038252848482818152602001925080828437820191505095505050505050602060405180830381600087803b158015612e8a57600080fd5b505af1158015612e9e573d6000803e3d6000fd5b505050506040513d6020811015612eb457600080fd5b5051600b54909350612ed8908c9060001943019067ffffffffffffffff871661157a565b600b555060005b6006811015613033576040805160e060020a6362b21ad70281526002600482015263ffffffff8c166024820152604481018390529051600160a060020a038816916362b21ad79160648083019260209291908290030181600087803b158015612f4757600080fd5b505af1158015612f5b573d6000803e3d6000fd5b505050506040513d6020811015612f7157600080fd5b5051600b546020900601915085600160a060020a03166326bda739600385856040518463ffffffff1660e060020a02815260040180846004811115612fb257fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018260ff1660ff1681526020019350505050602060405180830381600087803b158015612fff57600080fd5b505af1158015613013573d6000803e3d6000fd5b505050506040513d602081101561302957600080fd5b5050600101612edf565b60405167ffffffffffffffff841690600160a060020a038d1690600090600080516020614046833981519152908290a4505067ffffffffffffffff1698975050505050505050565b600f5481565b600154600160a060020a03163314806130ae57503360009081526002602052604090205460ff1615156001145b15156130b957600080fd5b6130c281613b4b565b8082600160a060020a031684600160a060020a031660008051602061404683398151915260405160405180910390a4505050565b6000818152600a602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561318b5780601f106131605761010080835404028352916020019161318b565b820191906000526020600020905b81548152906001019060200180831161316e57829003601f168201915b50505050509050919050565b60008060008060008060006131aa613f24565b6003546101009004600160a060020a0316915060005b6006811015613274576040805160e060020a6362b21ad70281526003600482015267ffffffffffffffff8c166024820152604481018390529051600160a060020a038516916362b21ad79160648083019260209291908290030181600087803b15801561322c57600080fd5b505af1158015613240573d6000803e3d6000fd5b505050506040513d602081101561325657600080fd5b505160ff1682826006811061326757fe5b60200201526001016131c0565b508051602082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b600681565b60008060006132b8613f43565b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff881660048201529051610100909204600160a060020a031693508391639d29cac49160248082019260a0929091908290030181600087803b15801561332b57600080fd5b505af115801561333f573d6000803e3d6000fd5b505050506040513d60a081101561335557600080fd5b50805160208083015160408085015160608087015160809788015115159789019790975263ffffffff96871690880181905291870152918501819052929091168352909350600010156133d2576010546060820151602083015161ffff9092169160001990910163ffffffff16028115156133cc57fe5b04830192505b6080810151151561342957336000908152600e602052604090205460ff161515600114801561341b575063ffffffff85166000908152600d602052604090205460ff1615156001145b156134295760019350613431565b608081015193505b5050915091565b60105461ffff1681565b6000600160a060020a038316151561345957600080fd5b600160a060020a038216151561346e57600080fd5b50600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60035460ff1681565b600154600160a060020a031633146134bd57600080fd5b600160a060020a038116156121195760018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b600554600160a060020a031681565b600160a060020a0381163314806135425750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b151561211957600080fd5b6000828152600a60209081526040909120825161176192840190613f71565b600480546005546040805160e060020a6335f097f302815267ffffffffffffffff87169481019490945251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b1580156135d157600080fd5b505af11580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505115801561368857506040805160e260020a632a11e9c702815267ffffffffffffffff861660048201529051600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b15801561365a57600080fd5b505af115801561366e573d6000803e3d6000fd5b505050506040513d602081101561368457600080fd5b5051155b151561369357600080fd5b600160a060020a03831615156136a857600080fd5b600160a060020a0383163314806136d55750600084815260066020526040902054600160a060020a031633145b806137035750600160a060020a038316600090815260076020908152604080832033845290915290205460ff165b1515612a9d57600080fd5b600061371982613b4b565b50600354604080517f60c6ccb2000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015267ffffffffffffffff8516602483015291516101009093049091169182916360c6ccb291604480830192600092919082900301818387803b15801561379857600080fd5b505af11580156137ac573d6000803e3d6000fd5b5050604080517f9248019e000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015267ffffffffffffffff8716602483015291519185169350639248019e925060448082019260009290919082900301818387803b15801561382457600080fd5b505af1158015613838573d6000803e3d6000fd5b505050508183600160a060020a031685600160a060020a031660008051602061404683398151915260405160405180910390a450505050565b600061387b613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350600091849163072024609160248083019260e092919082900301818787803b1580156138dc57600080fd5b505af11580156138f0573d6000803e3d6000fd5b505050506040513d60e081101561390657600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08e015263ffffffff9081169a8d019a909a52908916908b015290871690890152600160a060020a031690870181905293169085015267ffffffffffffffff168352151561397a57600080fd5b61398885836040015161356c565b86600160a060020a03168260400151600160a060020a03161415156139ac57600080fd5b600160a060020a03861615156139c157600080fd5b6139d08260400151878761370e565b6139e286600160a060020a0316613bda565b15613b42576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038a8116602485015260448401899052608060648501908152885160848601528851918b169463150b7a0294938d938c938c93909160a490910190602085019080838360005b83811015613a7a578181015183820152602001613a62565b50505050905090810190601f168015613aa75780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613ac957600080fd5b505af1158015613add573d6000803e3d6000fd5b505050506040513d6020811015613af357600080fd5b505190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981167f150b7a020000000000000000000000000000000000000000000000000000000014613b4257600080fd5b50505050505050565b600081815260066020526040902054600160a060020a031615612119576000908152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055565b613b9c81613be2565b6000818152600a60205260409020546002600019610100600184161502019091160415612119576000818152600a6020526040812061211991613feb565b6000903b1190565b6000613bec613ee1565b600080613bf885613b4b565b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169550859163072024609160248082019260e0929091908290030181600087803b158015613c5857600080fd5b505af1158015613c6c573d6000803e3d6000fd5b505050506040513d60e0811015613c8257600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880181905293169086015267ffffffffffffffff1684521515613cf657600080fd5b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b158015613d6157600080fd5b505af1158015613d75573d6000803e3d6000fd5b505050506040513d6020811015613d8b57600080fd5b505180613e17575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b158015613dea57600080fd5b505af1158015613dfe573d6000803e3d6000fd5b505050506040513d6020811015613e1457600080fd5b50515b15613e2157600080fd5b60408084015181517f60c6ccb2000000000000000000000000000000000000000000000000000000008152600160a060020a03918216600482015267ffffffffffffffff881660248201529151908616916360c6ccb291604480830192600092919082900301818387803b158015613e9857600080fd5b505af1158015613eac573d6000803e3d6000fd5b5050506040808501519051879250600091600160a060020a031690600080516020614046833981519152908390a45050505050565b60408051610100810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c0810182905260e081019190915290565b60c0604051908101604052806006906020820280388339509192915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fb257805160ff1916838001178555613fdf565b82800160010185558215613fdf579182015b82811115613fdf578251825591602001919060010190613fc4565b506117f892915061402b565b50805460018160011615610100020316600290046000825580601f106140115750612119565b601f01602090049060005260206000209081019061211991905b611ec291905b808211156117f857600081556001016140315600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582089a567cea9b3bb8422cf1b9a2493b8775bc1007b0c9f0a20c9626c790722f9b60029

Deployed Bytecode

0x6080604052600436106102795763ffffffff60e060020a60003504166301ffc9a7811461027e5780630672859b146102c957806306fdde03146102fd578063081812fc14610387578063095ea7b3146103bb5780630963d4b7146103e15780630a92b264146104185780630afd548d146104425780630d6688181461046f57806314d0f1ba14610484578063162094c4146104a557806318160ddd146104c957806323b872dd146104de5780632f745c591461050857806333ced3211461052c5780633c6e592714610541578063423b1ca3146105a457806342842e0e146105b95780634661bb98146105e357806348ef5aa8146106065780634e3dc2f1146106205780634efb023e1461064b5780634f6ccce714610677578063522f68151461068f57806357918052146106b35780636352211e146106cf5780636c81fd6d146106e757806370a082311461070857806378b475a8146107295780637fdd54031461075d578063817e9d311461077557806381b230421461078d5780638a0520fb146107af5780638d1d22d8146107d35780638da5cb5b1461080157806394f6ba1c1461081657806395d89b411461085c578063a22cb46514610871578063a9059cbb14610897578063af4c14ee146108bb578063b2cad9b7146108e1578063b85d6275146108ff578063b88d4fde14610920578063c0845e8a14610959578063c10be52114610983578063c463b00814610998578063c87b56dd146109c2578063d29cbd60146109da578063d98e14bd14610a2f578063da26663a14610a44578063e19bb96414610a7d578063e985e9c514610a92578063ee4e441614610ab9578063f285329214610ace578063ffa640d814610aef575b600080fd5b34801561028a57600080fd5b506102b57bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1960043516610b04565b604080519115158252519081900360200190f35b3480156102d557600080fd5b506102eb67ffffffffffffffff60043516610b38565b60408051918252519081900360200190f35b34801561030957600080fd5b50610312610dfe565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561034c578181015183820152602001610334565b50505050905090810190601f1680156103795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039357600080fd5b5061039f600435610e94565b60408051600160a060020a039092168252519081900360200190f35b3480156103c757600080fd5b506103df600160a060020a0360043516602435610fbf565b005b3480156103ed57600080fd5b506102eb6004803563ffffffff169060248035600160a060020a0316916044359182019101356112a7565b34801561042457600080fd5b506102eb600160a060020a036004351660243560443560643561157a565b34801561044e57600080fd5b506103df600160a060020a036004358116906024358116906044351661162c565b34801561047b57600080fd5b5061039f6116c6565b34801561049057600080fd5b506102b5600160a060020a03600435166116da565b3480156104b157600080fd5b506103df6004803590602480359081019101356116ef565b3480156104d557600080fd5b506102eb611766565b3480156104ea57600080fd5b506103df600160a060020a03600435811690602435166044356117fc565b34801561051457600080fd5b506102eb600160a060020a0360043516602435611961565b34801561053857600080fd5b506103df611a2e565b34801561054d57600080fd5b5061056367ffffffffffffffff60043516611acb565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156105b057600080fd5b5061039f611de6565b3480156105c557600080fd5b506103df600160a060020a0360043581169060243516604435611df5565b3480156105ef57600080fd5b506103df63ffffffff600435166024351515611e11565b34801561061257600080fd5b506103df6004351515611e71565b34801561062c57600080fd5b50610635611e9b565b6040805160ff9092168252519081900360200190f35b34801561065757600080fd5b50610660611ea0565b6040805161ffff9092168252519081900360200190f35b34801561068357600080fd5b506102eb600435611ec2565b34801561069b57600080fd5b506103df600160a060020a0360043516602435611ec5565b3480156106bf57600080fd5b506103df61ffff60043516611f20565b3480156106db57600080fd5b5061039f600435611f70565b3480156106f357600080fd5b506103df600160a060020a0360043516612075565b34801561071457600080fd5b506102eb600160a060020a036004351661211c565b34801561073557600080fd5b5061074460ff600435166121d7565b6040805163ffffffff9092168252519081900360200190f35b34801561076957600080fd5b506103df6004356121ef565b34801561078157600080fd5b506103df600435612230565b34801561079957600080fd5b506103df67ffffffffffffffff6004351661226d565b3480156107bb57600080fd5b506102b5600160a060020a03600435166024356122b8565b3480156107df57600080fd5b506103df6004803567ffffffffffffffff16906024803590810191013561253e565b34801561080d57600080fd5b5061039f612758565b34801561082257600080fd5b5061083463ffffffff60043516612767565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b34801561086857600080fd5b50610312612866565b34801561087d57600080fd5b506103df600160a060020a036004351660243515156128c7565b3480156108a357600080fd5b506103df600160a060020a036004351660243561294a565b3480156108c757600080fd5b506103df600160a060020a03600435166024351515612aa3565b3480156108ed57600080fd5b5061063563ffffffff60043516612b06565b34801561090b57600080fd5b506103df600160a060020a0360043516612b69565b34801561092c57600080fd5b506103df600160a060020a0360048035821691602480359091169160443591606435908101910135612c10565b6102eb60048035600160a060020a0316906024803563ffffffff1691604435918201910135612c4c565b34801561098f57600080fd5b506102eb61307b565b3480156109a457600080fd5b506103df600160a060020a0360043581169060243516604435613081565b3480156109ce57600080fd5b506103126004356130f6565b3480156109e657600080fd5b506109fc67ffffffffffffffff60043516613197565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610a3b57600080fd5b506106356132a6565b348015610a5057600080fd5b50610a6263ffffffff600435166132ab565b60408051921515835260208301919091528051918290030190f35b348015610a8957600080fd5b50610660613438565b348015610a9e57600080fd5b506102b5600160a060020a0360043581169060243516613442565b348015610ac557600080fd5b506102b561349d565b348015610ada57600080fd5b506103df600160a060020a03600435166134a6565b348015610afb57600080fd5b5061039f6134f9565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191660009081526020819052604090205460ff1690565b600080610b43613ee1565b610b4b613f24565b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169450600091859163072024609160248083019260e092919082900301818787803b158015610bac57600080fd5b505af1158015610bc0573d6000803e3d6000fd5b505050506040513d60e0811015610bd657600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a01819052600160a060020a039091169189019190915293169086015267ffffffffffffffff16845260009150610c5190612b06565b60ff169450600090505b6006811015610d0f576040805160e060020a6362b21ad70281526003600482015267ffffffffffffffff88166024820152604481018390529051600160a060020a038616916362b21ad79160648083019260209291908290030181600087803b158015610cc757600080fd5b505af1158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b505160ff16828260068110610d0257fe5b6020020152600101610c5b565b5060005b6006811015610dd1576020838101516040805160e060020a6362b21ad70281526001600482015263ffffffff909216602483015260448201849052518792600160a060020a038816926362b21ad792606480830193928290030181600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b505050506040513d6020811015610da957600080fd5b505160ff1602600302828260068110610dbe57fe5b6020020180519091019052600101610d13565b5060a081015160808201516060830151604084015160208501519451600695010101010104949350505050565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b820191906000526020600020905b815481529060010190602001808311610e6d57829003601f168201915b5050505050905090565b600080610e9f613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b158015610eff57600080fd5b505af1158015610f13573d6000803e3d6000fd5b505050506040513d60e0811015610f2957600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff1682521515610f9d57600080fd5b600084815260066020526040902054600160a060020a031692505b5050919050565b6000610fc9613ee1565b600080600360019054906101000a9004600160a060020a0316935083600160a060020a03166307202460866040518263ffffffff1660e060020a028152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060e060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b505050506040513d60e081101561106b57600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880181905293169086015267ffffffffffffffff16845215156110df57600080fd5b6110ec8360400151613508565b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b15801561115757600080fd5b505af115801561116b573d6000803e3d6000fd5b505050506040513d602081101561118157600080fd5b50518061120d575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b1580156111e057600080fd5b505af11580156111f4573d6000803e3d6000fd5b505050506040513d602081101561120a57600080fd5b50515b1561121757600080fd5b6040830151600160a060020a038781169116141561123457600080fd5b600085815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038a811691821790925586830151925189949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050505050565b6001546000908190819081908190600160a060020a03163314806112df57503360009081526002602052604090205460ff1615156001145b15156112ea57600080fd5b6003546040517ffc4d20f500000000000000000000000000000000000000000000000000000000815263ffffffff8b1660048201908152600160a060020a038b81166024840152606060448401908152606484018b9052610100909404169650869263fc4d20f5928d928d928d928d929190608401848480828437820191505095505050505050602060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b505050506040513d60208110156113b557600080fd5b5051600b549093506113d990899060001943019067ffffffffffffffff871661157a565b600b555060005b6006811015611534576040805160e060020a6362b21ad70281526002600482015263ffffffff8b166024820152604481018390529051600160a060020a038616916362b21ad79160648083019260209291908290030181600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b505050506040513d602081101561147257600080fd5b5051600b546020900601915083600160a060020a03166326bda739600385856040518463ffffffff1660e060020a028152600401808460048111156114b357fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018260ff1660ff1681526020019350505050602060405180830381600087803b15801561150057600080fd5b505af1158015611514573d6000803e3d6000fd5b505050506040513d602081101561152a57600080fd5b50506001016113e0565b60405167ffffffffffffffff841690600160a060020a038a1690600090600080516020614046833981519152908290a4505067ffffffffffffffff169695505050505050565b6040805184406020808301919091526c01000000000000000000000000600160a060020a0388160282840152605482018590526074808301859052835180840390910181526094909201928390528151600093918291908401908083835b602083106115f75780518252601f1990920191602091820191016115d8565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912098975050505050505050565b600154600160a060020a031633148061165957503360009081526002602052604090205460ff1615156001145b151561166457600080fd5b60038054600160a060020a039485166101000274ffffffffffffffffffffffffffffffffffffffff00199091161790556004805492841673ffffffffffffffffffffffffffffffffffffffff1993841617905560058054919093169116179055565b6003546101009004600160a060020a031681565b60026020526000908152604090205460ff1681565b600154600160a060020a031633148061171c57503360009081526002602052604090205460ff1615156001145b151561172757600080fd5b6117618383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375061354d945050505050565b505050565b600080600360019054906101000a9004600160a060020a0316905080600160a060020a0316637a09defe6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156117bf57600080fd5b505af11580156117d3573d6000803e3d6000fd5b505050506040513d60208110156117e957600080fd5b505167ffffffffffffffff1691505b5090565b6000611806613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff861660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b15801561186657600080fd5b505af115801561187a573d6000803e3d6000fd5b505050506040513d60e081101561189057600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff168252151561190457600080fd5b61191283826040015161356c565b84600160a060020a03168160400151600160a060020a031614151561193657600080fd5b600160a060020a038416151561194b57600080fd5b61195a8160400151858561370e565b5050505050565b600080600160a060020a038416151561197957600080fd5b50600354604080517f75fe2e33000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820186905291516101009093049091169182916375fe2e339160448083019260209291908290030181600087803b1580156119f057600080fd5b505af1158015611a04573d6000803e3d6000fd5b505050506040513d6020811015611a1a57600080fd5b505167ffffffffffffffff16949350505050565b60015460009081908190600160a060020a0316331480611a6257503360009081526002602052604090205460ff1615156001145b1515611a6d57600080fd5b506001915060649050805b606460ff8416116117615760ff83166000908152600c60205260409020805463ffffffff191663ffffffff83811691909117909155600190930192600a90600b8402160460050191508181019050611a78565b6000806000806000806000806000611ae1613ee1565b611ae9613f24565b6003546040805160e560020a6239012302815267ffffffffffffffff8f1660048201529051610100909204600160a060020a03169450600091859163072024609160248083019260e092919082900301818787803b158015611b4a57600080fd5b505af1158015611b5e573d6000803e3d6000fd5b505050506040513d60e0811015611b7457600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a01819052600160a060020a039091169189019190915293169086015267ffffffffffffffff16845260009150611bef90612b06565b60ff169a50600090505b6006811015611cc65783600160a060020a03166362b21ad760038f846040518463ffffffff1660e060020a02815260040180846004811115611c3757fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611c7e57600080fd5b505af1158015611c92573d6000803e3d6000fd5b505050506040513d6020811015611ca857600080fd5b505160ff16828260068110611cb957fe5b6020020152600101611bf9565b5060005b6006811015611d88576020838101516040805160e060020a6362b21ad70281526001600482015263ffffffff909216602483015260448201849052518d92600160a060020a038816926362b21ad792606480830193928290030181600087803b158015611d3657600080fd5b505af1158015611d4a573d6000803e3d6000fd5b505050506040513d6020811015611d6057600080fd5b505160ff1602600302828260068110611d7557fe5b6020020180519091019052600101611cca565b60808301518b8360006020020151846001602002015185600260200201518660036020020151876004602002015188600560200201518763ffffffff1697509b509b509b509b509b509b509b509b5050505050919395975091939597565b600454600160a060020a031681565b6117618383836020604051908101604052806000815250613871565b600154600160a060020a0316331480611e3e57503360009081526002602052604090205460ff1615156001145b1515611e4957600080fd5b63ffffffff919091166000908152600d60205260409020805460ff1916911515919091179055565b600154600160a060020a03163314611e8857600080fd5b6003805460ff1916911515919091179055565b602081565b60015474010000000000000000000000000000000000000000900461ffff1681565b90565b600154600160a060020a03163314611edc57600080fd5b3031811115611eea57600080fd5b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015611761573d6000803e3d6000fd5b600154600160a060020a0316331480611f4d57503360009081526002602052604090205460ff1615156001145b1515611f5857600080fd5b6010805461ffff191661ffff92909216919091179055565b600080611f7b613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b158015611fdb57600080fd5b505af1158015611fef573d6000803e3d6000fd5b505050506040513d60e081101561200557600080fd5b5080516020808301516040840151606085015160808087015160a08089015160c0998a015160e08c015263ffffffff908116998b0199909952908816908901529086169087015293169084015267ffffffffffffffff1682529250600160a060020a0383161515610fb857600080fd5b600154600160a060020a0316331461208c57600080fd5b600160a060020a03811660009081526002602052604090205460ff16151561211957600160a060020a0381166000908152600260205260409020805460ff19166001908117909155805461ffff74010000000000000000000000000000000000000000808304821684019091160275ffff0000000000000000000000000000000000000000199091161790555b50565b600080600160a060020a038316151561213457600080fd5b50600354604080517f47c17bac000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015291516101009093049091169182916347c17bac9160248083019260209291908290030181600087803b1580156121a457600080fd5b505af11580156121b8573d6000803e3d6000fd5b505050506040513d60208110156121ce57600080fd5b50519392505050565b600c6020526000908152604090205463ffffffff1681565b600154600160a060020a031633148061221c57503360009081526002602052604090205460ff1615156001145b151561222757600080fd5b61211981613b4b565b600154600160a060020a031633148061225d57503360009081526002602052604090205460ff1615156001145b151561226857600080fd5b600f55565b600154600160a060020a031633148061229a57503360009081526002602052604090205460ff1615156001145b15156122a557600080fd5b6121198167ffffffffffffffff16613b93565b6000806122c3613ee1565b600080600360019054906101000a9004600160a060020a0316935083600160a060020a03166307202460876040518263ffffffff1660e060020a028152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060e060405180830381600087803b15801561233b57600080fd5b505af115801561234f573d6000803e3d6000fd5b505050506040513d60e081101561236557600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880152929092169185019190915267ffffffffffffffff908116808552908716146123e55760009450612534565b86600160a060020a03168360400151600160a060020a031614151561240d5760009450612534565b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b15801561247857600080fd5b505af115801561248c573d6000803e3d6000fd5b505050506040513d60208110156124a257600080fd5b5051158015612531575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b15801561250357600080fd5b505af1158015612517573d6000803e3d6000fd5b505050506040513d602081101561252d57600080fd5b5051155b94505b5050505092915050565b6000612548613ee1565b60035460ff161561255857600080fd5b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b1580156125b857600080fd5b505af11580156125cc573d6000803e3d6000fd5b505050506040513d60e08110156125e257600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860152929092169183019190915267ffffffffffffffff90811680835290861614158061266e57506040810151600160a060020a03163314155b1561267857600080fd5b608081015160a08083015160c08401516040517f32666a3100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8a166004820190815263ffffffff80871660448401528085166064840152831660848301526024820194855260a48201899052600160a060020a038816956332666a31958c958c958c959394919390929060c4018787808284378201915050975050505050505050600060405180830381600087803b15801561273957600080fd5b505af115801561274d573d6000803e3d6000fd5b505050505050505050565b600154600160a060020a031681565b6000806000806000612777613f43565b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529051610100909204600160a060020a031693508391639d29cac49160248082019260a0929091908290030181600087803b1580156127ea57600080fd5b505af11580156127fe573d6000803e3d6000fd5b505050506040513d60a081101561281457600080fd5b508051602080830151604080850151606080870151608097880151151597890188905263ffffffff90811691890182905292880182905293870183905293169094529299909850919650945092505050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b600160a060020a03821615156128dc57600080fd5b336000818152600760209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000612954613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff861660048201529051610100909204600160a060020a03169350839163072024609160248082019260e0929091908290030181600087803b1580156129b457600080fd5b505af11580156129c8573d6000803e3d6000fd5b505050506040513d60e08110156129de57600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08d015263ffffffff9081169a8c019a909a52908916908a015290871690880152600160a060020a031690860181905293169084015267ffffffffffffffff1682521515612a5257600080fd5b612a6083826040015161356c565b6040810151600160a060020a03163314612a7957600080fd5b600160a060020a0384161515612a8e57600080fd5b612a9d8160400151858561370e565b50505050565b600154600160a060020a0316331480612ad057503360009081526002602052604090205460ff1615156001145b1515612adb57600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b600060016064825b8160ff168360ff161015612b6057600260ff848401160460ff81166000908152600c602052604090205490915063ffffffff9081169086161015612b5457809150612b5b565b8060010192505b612b0e565b50909392505050565b600154600160a060020a03163314612b8057600080fd5b600160a060020a03811660009081526002602052604090205460ff1615156001141561211957600160a060020a03166000908152600260205260409020805460ff191690556001805475ffff0000000000000000000000000000000000000000198116740100000000000000000000000000000000000000009182900461ffff9081166000190116909102179055565b61195a85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750613871945050505050565b600080612c57613f43565b60035460009081908190819060ff1615612c7057600080fd5b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff8d1660048201529051610100909204600160a060020a031697508791639d29cac49160248082019260a0929091908290030181600087803b158015612ce357600080fd5b505af1158015612cf7573d6000803e3d6000fd5b505050506040513d60a0811015612d0d57600080fd5b5080516020808301516040808501516060808701516080978801511515978d019790975263ffffffff968716908c0152908a015290880152168086521515612d5457600080fd5b60808501511515612d9e57336000908152600e602052604090205460ff161580612d94575063ffffffff8a166000908152600d602052604090205460ff16155b15612d9e57600080fd5b846020015193506000856060015163ffffffff161115612de8576010546060860151602087015161ffff9092169160001990910163ffffffff1602811515612de257fe5b04840193505b83600f5434011015612df957600080fd5b85600160a060020a031663fc4d20f58b8d8c8c6040518563ffffffff1660e060020a028152600401808563ffffffff1663ffffffff16815260200184600160a060020a0316600160a060020a03168152602001806020018281038252848482818152602001925080828437820191505095505050505050602060405180830381600087803b158015612e8a57600080fd5b505af1158015612e9e573d6000803e3d6000fd5b505050506040513d6020811015612eb457600080fd5b5051600b54909350612ed8908c9060001943019067ffffffffffffffff871661157a565b600b555060005b6006811015613033576040805160e060020a6362b21ad70281526002600482015263ffffffff8c166024820152604481018390529051600160a060020a038816916362b21ad79160648083019260209291908290030181600087803b158015612f4757600080fd5b505af1158015612f5b573d6000803e3d6000fd5b505050506040513d6020811015612f7157600080fd5b5051600b546020900601915085600160a060020a03166326bda739600385856040518463ffffffff1660e060020a02815260040180846004811115612fb257fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018260ff1660ff1681526020019350505050602060405180830381600087803b158015612fff57600080fd5b505af1158015613013573d6000803e3d6000fd5b505050506040513d602081101561302957600080fd5b5050600101612edf565b60405167ffffffffffffffff841690600160a060020a038d1690600090600080516020614046833981519152908290a4505067ffffffffffffffff1698975050505050505050565b600f5481565b600154600160a060020a03163314806130ae57503360009081526002602052604090205460ff1615156001145b15156130b957600080fd5b6130c281613b4b565b8082600160a060020a031684600160a060020a031660008051602061404683398151915260405160405180910390a4505050565b6000818152600a602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561318b5780601f106131605761010080835404028352916020019161318b565b820191906000526020600020905b81548152906001019060200180831161316e57829003601f168201915b50505050509050919050565b60008060008060008060006131aa613f24565b6003546101009004600160a060020a0316915060005b6006811015613274576040805160e060020a6362b21ad70281526003600482015267ffffffffffffffff8c166024820152604481018390529051600160a060020a038516916362b21ad79160648083019260209291908290030181600087803b15801561322c57600080fd5b505af1158015613240573d6000803e3d6000fd5b505050506040513d602081101561325657600080fd5b505160ff1682826006811061326757fe5b60200201526001016131c0565b508051602082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b600681565b60008060006132b8613f43565b600354604080517f9d29cac400000000000000000000000000000000000000000000000000000000815263ffffffff881660048201529051610100909204600160a060020a031693508391639d29cac49160248082019260a0929091908290030181600087803b15801561332b57600080fd5b505af115801561333f573d6000803e3d6000fd5b505050506040513d60a081101561335557600080fd5b50805160208083015160408085015160608087015160809788015115159789019790975263ffffffff96871690880181905291870152918501819052929091168352909350600010156133d2576010546060820151602083015161ffff9092169160001990910163ffffffff16028115156133cc57fe5b04830192505b6080810151151561342957336000908152600e602052604090205460ff161515600114801561341b575063ffffffff85166000908152600d602052604090205460ff1615156001145b156134295760019350613431565b608081015193505b5050915091565b60105461ffff1681565b6000600160a060020a038316151561345957600080fd5b600160a060020a038216151561346e57600080fd5b50600160a060020a03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60035460ff1681565b600154600160a060020a031633146134bd57600080fd5b600160a060020a038116156121195760018054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b600554600160a060020a031681565b600160a060020a0381163314806135425750600160a060020a038116600090815260076020908152604080832033845290915290205460ff165b151561211957600080fd5b6000828152600a60209081526040909120825161176192840190613f71565b600480546005546040805160e060020a6335f097f302815267ffffffffffffffff87169481019490945251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b1580156135d157600080fd5b505af11580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505115801561368857506040805160e260020a632a11e9c702815267ffffffffffffffff861660048201529051600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b15801561365a57600080fd5b505af115801561366e573d6000803e3d6000fd5b505050506040513d602081101561368457600080fd5b5051155b151561369357600080fd5b600160a060020a03831615156136a857600080fd5b600160a060020a0383163314806136d55750600084815260066020526040902054600160a060020a031633145b806137035750600160a060020a038316600090815260076020908152604080832033845290915290205460ff165b1515612a9d57600080fd5b600061371982613b4b565b50600354604080517f60c6ccb2000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015267ffffffffffffffff8516602483015291516101009093049091169182916360c6ccb291604480830192600092919082900301818387803b15801561379857600080fd5b505af11580156137ac573d6000803e3d6000fd5b5050604080517f9248019e000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015267ffffffffffffffff8716602483015291519185169350639248019e925060448082019260009290919082900301818387803b15801561382457600080fd5b505af1158015613838573d6000803e3d6000fd5b505050508183600160a060020a031685600160a060020a031660008051602061404683398151915260405160405180910390a450505050565b600061387b613ee1565b6003546040805160e560020a6239012302815267ffffffffffffffff871660048201529051610100909204600160a060020a03169350600091849163072024609160248083019260e092919082900301818787803b1580156138dc57600080fd5b505af11580156138f0573d6000803e3d6000fd5b505050506040513d60e081101561390657600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08e015263ffffffff9081169a8d019a909a52908916908b015290871690890152600160a060020a031690870181905293169085015267ffffffffffffffff168352151561397a57600080fd5b61398885836040015161356c565b86600160a060020a03168260400151600160a060020a03161415156139ac57600080fd5b600160a060020a03861615156139c157600080fd5b6139d08260400151878761370e565b6139e286600160a060020a0316613bda565b15613b42576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038a8116602485015260448401899052608060648501908152885160848601528851918b169463150b7a0294938d938c938c93909160a490910190602085019080838360005b83811015613a7a578181015183820152602001613a62565b50505050905090810190601f168015613aa75780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613ac957600080fd5b505af1158015613add573d6000803e3d6000fd5b505050506040513d6020811015613af357600080fd5b505190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981167f150b7a020000000000000000000000000000000000000000000000000000000014613b4257600080fd5b50505050505050565b600081815260066020526040902054600160a060020a031615612119576000908152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055565b613b9c81613be2565b6000818152600a60205260409020546002600019610100600184161502019091160415612119576000818152600a6020526040812061211991613feb565b6000903b1190565b6000613bec613ee1565b600080613bf885613b4b565b6003546040805160e560020a6239012302815267ffffffffffffffff881660048201529051610100909204600160a060020a03169550859163072024609160248082019260e0929091908290030181600087803b158015613c5857600080fd5b505af1158015613c6c573d6000803e3d6000fd5b505050506040513d60e0811015613c8257600080fd5b508051602080830151604080850151606086015160808088015160a0808a015160c09a8b015160e08f015263ffffffff9081169a8e019a909a52908916908c0152908716908a0152600160a060020a031690880181905293169086015267ffffffffffffffff1684521515613cf657600080fd5b50506004805460055483516040805160e060020a6335f097f302815267ffffffffffffffff909216948201949094529251600160a060020a0392831693919092169183916335f097f39160248083019260209291908290030181600087803b158015613d6157600080fd5b505af1158015613d75573d6000803e3d6000fd5b505050506040513d6020811015613d8b57600080fd5b505180613e17575082516040805160e260020a632a11e9c702815267ffffffffffffffff909216600483015251600160a060020a0383169163a847a71c9160248083019260209291908290030181600087803b158015613dea57600080fd5b505af1158015613dfe573d6000803e3d6000fd5b505050506040513d6020811015613e1457600080fd5b50515b15613e2157600080fd5b60408084015181517f60c6ccb2000000000000000000000000000000000000000000000000000000008152600160a060020a03918216600482015267ffffffffffffffff881660248201529151908616916360c6ccb291604480830192600092919082900301818387803b158015613e9857600080fd5b505af1158015613eac573d6000803e3d6000fd5b5050506040808501519051879250600091600160a060020a031690600080516020614046833981519152908390a45050505050565b60408051610100810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c0810182905260e081019190915290565b60c0604051908101604052806006906020820280388339509192915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613fb257805160ff1916838001178555613fdf565b82800160010185558215613fdf579182015b82811115613fdf578251825591602001919060010190613fc4565b506117f892915061402b565b50805460018160011615610100020316600290046000825580601f106140115750612119565b601f01602090049060005260206000209081019061211991905b611ec291905b808211156117f857600081556001016140315600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582089a567cea9b3bb8422cf1b9a2493b8775bc1007b0c9f0a20c9626c790722f9b60029

Swarm Source

bzzr://89a567cea9b3bb8422cf1b9a2493b8775bc1007b0c9f0a20c9626c790722f9b6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.