ETH Price: $1,972.74 (+0.56%)
 

Overview

Max Total Supply

103 REDT

Holders

0

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
Null: 0x000...000
Balance
0 REDT
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RedTokenCore

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2019-03-28
*/

// File: contracts\math\SafeMath.sol

pragma solidity 0.5.7;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
    * @dev Multiplies two unsigned integers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

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

        return c;
    }

    /**
    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Adds two unsigned integers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: contracts\RedTokenAccessControl.sol

pragma solidity 0.5.7;

/*
 * @title RedTokenAccessControl
 * @notice This contract defines organizational roles and permissions.
 */
contract RedTokenAccessControl {

  event Paused();
  event Unpaused();
  event PausedUser(address indexed account);
  event UnpausedUser(address indexed account);

  /*
   * @notice CEO's address
   */
  address public ceoAddress;

  /*
   * @notice CFO's address
   */
  address public cfoAddress;

  /*
   * @notice COO's address
   */
  address public cooAddress;

  bool public paused = false;

  /*
   * @notice paused users status
   */
  mapping (address => bool) private pausedUsers;

  /*
   * @notice init constructor
   */
  constructor () internal {
      ceoAddress = msg.sender;
      cfoAddress = msg.sender;
      cooAddress = msg.sender;
  }

  /*
   * @dev Modifier to make a function only callable by the CEO
   */
  modifier onlyCEO() {
    require(msg.sender == ceoAddress);
    _;
  }

  /*
   * @dev Modifier to make a function only callable by the CFO
   */
  modifier onlyCFO() {
    require(msg.sender == cfoAddress);
    _;
  }

  /*
   * @dev Modifier to make a function only callable by the COO
   */
  modifier onlyCOO() {
    require(msg.sender == cooAddress);
    _;
  }

  /*
   * @dev Modifier to make a function only callable by C-level execs
   */
  modifier onlyCLevel() {
    require(
      msg.sender == cooAddress ||
      msg.sender == ceoAddress ||
      msg.sender == cfoAddress
    );
    _;
  }

  /*
   * @dev Modifier to make a function only callable by CEO or CFO
   */
  modifier onlyCEOOrCFO() {
    require(
      msg.sender == cfoAddress ||
      msg.sender == ceoAddress
    );
    _;
  }

  /*
   * @dev Modifier to make a function only callable by CEO or COO
   */
  modifier onlyCEOOrCOO() {
    require(
      msg.sender == cooAddress ||
      msg.sender == ceoAddress
    );
    _;
  }

  /*
   * @notice Sets a new CEO
   * @param _newCEO - the address of the new CEO
   */
  function setCEO(address _newCEO) external onlyCEO {
    require(_newCEO != address(0));
    ceoAddress = _newCEO;
  }

  /*
   * @notice Sets a new CFO
   * @param _newCFO - the address of the new CFO
   */
  function setCFO(address _newCFO) external onlyCEO {
    require(_newCFO != address(0));
    cfoAddress = _newCFO;
  }

  /*
   * @notice Sets a new COO
   * @param _newCOO - the address of the new COO
   */
  function setCOO(address _newCOO) external onlyCEO {
    require(_newCOO != address(0));
    cooAddress = _newCOO;
  }

  /* Pausable functionality adapted from OpenZeppelin **/
  /*
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /*
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /*
   * @notice called by any C-LEVEL to pause, triggers stopped state
   */
  function pause() external onlyCLevel whenNotPaused {
    paused = true;
    emit Paused();
  }

  /*
   * @notice called by any C-LEVEL to unpause, returns to normal state
   */
  function unpause() external onlyCLevel whenPaused {
    paused = false;
    emit Unpaused();
  }

  /* user Pausable functionality ref someting : openzeppelin/access/Roles.sol **/
  /*
   * @dev Modifier to make a function callable only when the user is not paused.
   */
  modifier whenNotPausedUser(address account) {
    require(account != address(0));
    require(!pausedUsers[account]);
    _;
  }

  /*
   * @dev Modifier to make a function callable only when the user is paused.
   */
  modifier whenPausedUser(address account) {
    require(account != address(0));
    require(pausedUsers[account]);
    _;
  }

  /*
    * @dev check if an account has this pausedUsers
    * @return bool
    */
  function has(address account) internal view returns (bool) {
      require(account != address(0));
      return pausedUsers[account];
  }
  
  /*
   * @notice _addPauseUser
   */
  function _addPauseUser(address account) internal {
      require(account != address(0));
      require(!has(account));

      pausedUsers[account] = true;

      emit PausedUser(account);
  }

  /*
   * @notice _unpausedUser
   */
  function _unpausedUser(address account) internal {
      require(account != address(0));
      require(has(account));

      pausedUsers[account] = false;
      emit UnpausedUser(account);
  }

  /*
   * @notice isPausedUser
   */
  function isPausedUser(address account) external view returns (bool) {
      return has(account);
  }

  /*
   * @notice called by the COO to pauseUser, triggers stopped user state
   */
  function pauseUser(address account) external onlyCOO whenNotPausedUser(account) {
    _addPauseUser(account);
  }

  /*
   * @notice called by any C-LEVEL to unpauseUser, returns to user state
   */
  function unpauseUser(address account) external onlyCLevel whenPausedUser(account) {
    _unpausedUser(account);
  }
}

// File: contracts\RedTokenBase.sol

pragma solidity 0.5.7;



/*
 * @title RedTokenBase
 * @notice This contract defines the RedToken data structure and how to read from it / functions
 */
contract RedTokenBase is RedTokenAccessControl {
  using SafeMath for uint256;

  /*
   * @notice Product defines a RedToken
   */ 
  struct RedToken {
    uint256 tokenId;
    string rmsBondNo;
    uint256 bondAmount;
    uint256 listingAmount;
    uint256 collectedAmount;
    uint createdTime;
    bool isValid;
  }

  /*
   * @notice tokenId for share users by listingAmount
   */
  mapping (uint256 => mapping(address => uint256)) shareUsers;

  /*
   * @notice tokenid by share accounts in shareUsers list iterator.
   */
  mapping (uint256 => address []) shareUsersKeys;

  /** events **/
  event RedTokenCreated(
    address account, 
    uint256 tokenId, 
    string rmsBondNo, 
    uint256 bondAmount, 
    uint256 listingAmount, 
    uint256 collectedAmount, 
    uint createdTime
  );
  
  /*
   * @notice All redTokens in existence.
   * @dev The ID of each redToken is an index in this array.
   */
  RedToken[] redTokens;
  
  /*
   * @notice Get a redToken RmsBondNo
   * @param _tokenId the token id
   */
  function redTokenRmsBondNo(uint256 _tokenId) external view returns (string memory) {
    return redTokens[_tokenId].rmsBondNo;
  }

  /*
   * @notice Get a redToken BondAmount
   * @param _tokenId the token id
   */
  function redTokenBondAmount(uint256 _tokenId) external view returns (uint256) {
    return redTokens[_tokenId].bondAmount;
  }

  /*
   * @notice Get a redToken ListingAmount
   * @param _tokenId the token id
   */
  function redTokenListingAmount(uint256 _tokenId) external view returns (uint256) {
    return redTokens[_tokenId].listingAmount;
  }
  
  /*
   * @notice Get a redToken CollectedAmount
   * @param _tokenId the token id
   */
  function redTokenCollectedAmount(uint256 _tokenId) external view returns (uint256) {
    return redTokens[_tokenId].collectedAmount;
  }

  /*
   * @notice Get a redToken CreatedTime
   * @param _tokenId the token id
   */
  function redTokenCreatedTime(uint256 _tokenId) external view returns (uint) {
    return redTokens[_tokenId].createdTime;
  }

  /*
   * @notice isValid a redToken
   * @param _tokenId the token id
   */
  function isValidRedToken(uint256 _tokenId) public view returns (bool) {
    return redTokens[_tokenId].isValid;
  }

  /*
   * @notice info a redToken
   * @param _tokenId the token id
   */
  function redTokenInfo(uint256 _tokenId)
    external view returns (uint256, string memory, uint256, uint256, uint256, uint)
  {
    require(isValidRedToken(_tokenId));
    RedToken memory _redToken = redTokens[_tokenId];

    return (
        _redToken.tokenId,
        _redToken.rmsBondNo,
        _redToken.bondAmount,
        _redToken.listingAmount,
        _redToken.collectedAmount,
        _redToken.createdTime
    );
  }
  
  /*
   * @notice info a token of share users
   * @param _tokenId the token id
   */
  function redTokenInfoOfshareUsers(uint256 _tokenId) external view returns (address[] memory, uint256[] memory) {
    require(isValidRedToken(_tokenId));

    uint256 keySize = shareUsersKeys[_tokenId].length;

    address[] memory addrs   = new address[](keySize);
    uint256[] memory amounts = new uint256[](keySize);

    for (uint index = 0; index < keySize; index++) {
      addrs[index]   = shareUsersKeys[_tokenId][index];
      amounts[index] = shareUsers[_tokenId][addrs[index]];
    }
    
    return (addrs, amounts);
  }
}

// File: contracts\interfaces\ERC721.sol

pragma solidity 0.5.7;

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface ERC721 {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external payable;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

// File: contracts\interfaces\ERC721Metadata.sol

pragma solidity 0.5.7;

/*
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 *  Note: the ERC-165 identifier for this interface is 0x5b5e139f
 */
interface ERC721Metadata /* is ERC721 */ {
    
    /*
     * @notice A descriptive name for a collection of NFTs in this contract
     */
    function name() external pure returns (string memory _name);

    /*
     * @notice An abbreviated name for NFTs in this contract
     */ 
    function symbol() external pure returns (string memory _symbol);

    /*
     * @notice A distinct Uniform Resource Identifier (URI) for a given asset.
     * @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
     *  3986. The URI may point to a JSON file that conforms to the "ERC721
     *  Metadata JSON Schema".
     */
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

// File: contracts\interfaces\ERC721Enumerable.sol

pragma solidity 0.5.7;

/*
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 *  Note: the ERC-165 identifier for this interface is 0x780e9d63
 */
interface ERC721Enumerable /* is ERC721 */ {
    /*
     * @notice Count NFTs tracked by this contract
     * @return A count of valid NFTs tracked by this contract, where each one of
     *  them has an assigned and queryable owner not equal to the zero address
     */
    function totalSupply() external view returns (uint256);

    /*
     * @notice Enumerate valid NFTs
     * @dev Throws if `_index` >= `totalSupply()`.
     * @param _index A counter less than `totalSupply()`
     * @return The token identifier for the `_index`th NFT,
     *  (sort order not specified)
     */
    function tokenByIndex(uint256 _index) external view returns (uint256);

    /*
     * @notice Enumerate NFTs assigned to an owner
     * @dev Throws if `_index` >= `balanceOf(_owner)` or if
     *  `_owner` is the zero address, representing invalid NFTs.
     * @param _owner An address where we are interested in NFTs owned by them
     * @param _index A counter less than `balanceOf(_owner)`
     * @return The token identifier for the `_index`th NFT assigned to `_owner`,
     *   (sort order not specified)
     */
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 _tokenId);
}

// File: contracts\interfaces\ERC165.sol

pragma solidity 0.5.7;

interface ERC165 {
    /*
     * @notice Query if a contract implements an interface
     * @param interfaceID The interface identifier, as specified in ERC-165
     * @dev Interface identification is specified in ERC-165. This function
     *  uses less than 30,000 gas.
     * @return `true` if the contract implements `interfaceID` and
     *  `interfaceID` is not 0xffffffff, `false` otherwise
     */
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// File: contracts\strings\Strings.sol

pragma solidity 0.5.7;

library Strings {
  // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
  function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory) {
    bytes memory _ba = bytes(_a);
    bytes memory _bb = bytes(_b);
    bytes memory _bc = bytes(_c);
    bytes memory _bd = bytes(_d);
    bytes memory _be = bytes(_e);
    string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
    bytes memory babcde = bytes(abcde);
    uint k = 0;
    for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
    for (uint i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
    for (uint i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
    for (uint i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
    for (uint i = 0; i < _be.length; i++) babcde[k++] = _be[i];
    return string(babcde);
  }

  function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory) {
    return strConcat(_a, _b, _c, _d, "");
  }

  function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) {
    return strConcat(_a, _b, _c, "", "");
  }

  function strConcat(string memory _a, string memory _b) internal pure returns (string memory) {
    return strConcat(_a, _b, "", "", "");
  }

  function uint2str(uint i) internal pure returns (string memory) {
    if (i == 0) return "0";
    uint j = i;
    uint len;
    while (j != 0){
        len++;
        j /= 10;
    }
    bytes memory bstr = new bytes(len);
    uint k = len - 1;
    while (i != 0){
        bstr[k--] = byte(uint8(48 + i % 10));
        i /= 10;
    }
    return string(bstr);
  }
}

// File: contracts\interfaces\ERC721TokenReceiver.sol

pragma solidity 0.5.7;

/*
 * @dev Note: the ERC-165 identifier for this interface is 0xf0b9e5ba
 */
interface ERC721TokenReceiver {
    /*
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     *  after a `transfer`. This function MAY throw to revert and reject the
     *  transfer. This function MUST use 50,000 gas or less. Return of other
     *  than the magic value MUST result in the transaction being reverted.
     *  Note: the contract address is always the message sender.
     * @param _from The sending address
     * @param _tokenId The NFT identifier which is being transfered
     * @param _data Additional data with no specified format
     * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
     *  unless throwing
     */
	function onERC721Received(address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

// File: contracts\RedTokenOwnership.sol

pragma solidity 0.5.7;








/*
 * @title RedTokenOwnership
 * @notice control by TokenBase.
 */
contract RedTokenOwnership is RedTokenBase, ERC721, ERC165, ERC721Metadata, ERC721Enumerable {
  using SafeMath for uint256;

  // Total amount of tokens
  uint256 private totalTokens;

  // Mapping from token ID to owner
  mapping (uint256 => address) private tokenOwner;

  // Mapping from owner to list of owned token IDs
  mapping (address => uint256[]) internal ownedTokens;

  // Mapping from token ID to index of the owner tokens list
  mapping (uint256 => uint256) internal ownedTokensIndex;

  // Mapping from token ID to approved address
  mapping (uint256 => address) internal tokenApprovals;

  // Mapping from owner address to operator address to approval
  mapping (address => mapping (address => bool)) internal operatorApprovals;

  /** events **/
  event calculateShareUsers(uint256 tokenId, address owner, address from, address to, uint256 amount);
  event CollectedAmountUpdate(uint256 tokenId, address owner, uint256 amount);

  /** Constants **/
  // Configure these for your own deployment
  string internal constant NAME = "RedToken";
  string internal constant SYMBOL = "REDT";
  string internal tokenMetadataBaseURI = "https://doc.reditus.co.kr/?docid=";

  /** structs **/
  function supportsInterface(
    bytes4 interfaceID) // solium-disable-line dotta/underscore-function-arguments
    external view returns (bool)
  {
    return
      interfaceID == this.supportsInterface.selector || // ERC165
      interfaceID == 0x5b5e139f || // ERC721Metadata
      interfaceID == 0x80ac58cd || // ERC-721
      interfaceID == 0x780e9d63; // ERC721Enumerable
  }

  /*
   * @notice Guarantees msg.sender is owner of the given token
   * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
   */
  modifier onlyOwnerOf(uint256 _tokenId) {
    require(ownerOf(_tokenId) == msg.sender);
    _;
  }

  /** external functions **/  
  /*
   * @notice token's name
   */
  function name() external pure returns (string memory) {
    return NAME;
  }

  /*
   * @notice symbols's name
   */
  function symbol() external pure returns (string memory) {
    return SYMBOL;
  }

  /*
   * @notice tokenURI
   * @dev do not checked in array and used function isValidRedToken value is not important, only check in redTokens array
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory infoUrl)
  {
    if ( isValidRedToken(_tokenId) ){
      return Strings.strConcat( tokenMetadataBaseURI, Strings.uint2str(_tokenId));
    }else{
      return Strings.strConcat( tokenMetadataBaseURI, Strings.uint2str(_tokenId));
    }
  }

  /*
   * @notice setTokenMetadataBaseURI
   */
  function setTokenMetadataBaseURI(string calldata _newBaseURI) external onlyCOO {
    tokenMetadataBaseURI = _newBaseURI;
  }

  /*
   * @notice Gets the total amount of tokens stored by the contract
   * @return uint256 representing the total amount of tokens
   */
  function totalSupply() external view returns (uint256) {
    return totalTokens;
  }

  /*
   * @dev Gets the owner of the specified token ID
   * @param _tokenId uint256 ID of the token to query the owner of
   * @return owner address currently marked as the owner of the given token ID
   */
  function ownerOf(uint256 _tokenId) public view returns (address) {
    address owner = tokenOwner[_tokenId];
    require(owner != address(0));
    return owner;
  }

  /*
   * @notice Gets the balance of the specified address
   * @param _owner address to query the balance of
   * @return uint256 representing the amount owned by the passed address
   */
  function balanceOf(address _owner) public view returns (uint256) {
    require(_owner != address(0));
    return ownedTokens[_owner].length;
  }

  /*
   * @notice Gets the list of tokens owned by a given address
   * @param _owner address to query the tokens of
   * @return uint256[] representing the list of tokens owned by the passed address
   */
  function tokensOf(address _owner) external view returns (uint256[] memory) {
    require(_owner != address(0));
    return ownedTokens[_owner];
  }

  /*
  * @notice Enumerate valid NFTs
  * @dev Our Licenses are kept in an array and each new License-token is just
  * the next element in the array. This method is required for ERC721Enumerable
  * which may support more complicated storage schemes. However, in our case the
  * _index is the tokenId
  * @param _index A counter less than `totalSupply()`
  * @return The token identifier for the `_index`th NFT
  */
  function tokenByIndex(uint256 _index) external view returns (uint256) {
    require(_index < totalTokens);
    return _index;
  }

  /*
   * @notice Enumerate NFTs assigned to an owner
   * @dev Throws if `_index` >= `balanceOf(_owner)` or if
   *  `_owner` is the zero address, representing invalid NFTs.
   * @param _owner An address where we are interested in NFTs owned by them
   * @param _index A counter less than `balanceOf(_owner)`
   * @return The token identifier for the `_index`th NFT assigned to `_owner`,
   */
  function tokenOfOwnerByIndex(address _owner, uint256 _index)
    external
    view
    returns (uint256 _tokenId)
  {
    require(_index < balanceOf(_owner));
    return ownedTokens[_owner][_index];
  }

  /*
   * @notice Gets the approved address to take ownership of a given token ID
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved to take ownership of the given token ID
   */
  function getApproved(uint256 _tokenId) public view returns (address) {
    return tokenApprovals[_tokenId];
  }

  /*
   * @notice Tells whether an operator is approved by a given owner
   * @param _owner owner address which you want to query the approval of
   * @param _operator operator address which you want to query the approval of
   * @return bool whether the given operator is approved by the given owner
   */
  function isApprovedForAll(address _owner, address _operator) public view returns (bool)
  {
    return operatorApprovals[_owner][_operator];
  }

  /*
   * @notice Approves another address to claim for the ownership of the given token ID
   * @param _to address to be approved for the given token ID
   * @param _tokenId uint256 ID of the token to be approved
   */
  function approve(address _to, uint256 _tokenId)
    external
    payable
    whenNotPaused
    whenNotPausedUser(msg.sender)
    onlyOwnerOf(_tokenId)
  {
    require(_to != ownerOf(_tokenId));
    if (getApproved(_tokenId) != address(0) || _to != address(0)) {
      tokenApprovals[_tokenId] = _to;

      emit Approval(ownerOf(_tokenId), _to, _tokenId);
    }
  }

  /*
   * @notice Enable or disable approval for a third party ("operator") to manage all your assets
   * @dev Emits the ApprovalForAll event
   * @param _to Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval
   */
  function setApprovalForAll(address _to, bool _approved)
    external
    whenNotPaused
    whenNotPausedUser(msg.sender)
  {
    if(_approved) {
      approveAll(_to);
    } else {
      disapproveAll(_to);
    }
  }

  /*
   * @notice Approves another address to claim for the ownership of any tokens owned by this account
   * @param _to address to be approved for the given token ID
   */
  function approveAll(address _to)
    internal
    whenNotPaused
    whenNotPausedUser(msg.sender)
  {
    require(_to != msg.sender);
    require(_to != address(0));
    operatorApprovals[msg.sender][_to] = true;

    emit ApprovalForAll(msg.sender, _to, true);
  }

  /*
   * @notice Removes approval for another address to claim for the ownership of any
   *  tokens owned by this account.
   * @dev Note that this only removes the operator approval and
   *  does not clear any independent, specific approvals of token transfers to this address
   * @param _to address to be disapproved for the given token ID
   */
  function disapproveAll(address _to)
    internal
    whenNotPaused
    whenNotPausedUser(msg.sender)
  {
    require(_to != msg.sender);
    delete operatorApprovals[msg.sender][_to];
    
    emit ApprovalForAll(msg.sender, _to, false);
  }

  /*
   * @notice Tells whether the msg.sender is approved to transfer the given token ID or not
   * Checks both for specific approval and operator approval
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return bool whether transfer by msg.sender is approved for the given token ID or not
   */
  function isSenderApprovedFor(uint256 _tokenId) public view returns (bool) {
    return
      ownerOf(_tokenId) == msg.sender ||
      getApproved(_tokenId) == msg.sender ||
      isApprovedForAll(ownerOf(_tokenId), msg.sender);
  }
  
  /*
   * @notice Transfers the ownership of a given token ID to another address
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
   */
  function transfer(address _to, uint256 _tokenId)
    external
    payable
    whenNotPaused
    whenNotPausedUser(msg.sender)
    onlyOwnerOf(_tokenId)
  {
    _clearApprovalAndTransfer(msg.sender, _to, _tokenId);
  }

  /*
   * @notice Transfer a token owned by another address, for which the calling address has
   *  previously been granted transfer approval by the owner.
   * @param _from The address that owns the token
   * @param _to The address that will take ownership of the token. Can be any address, including the caller
   * @param _tokenId The ID of the token to be transferred
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    payable
    whenNotPaused
    whenNotPausedUser(msg.sender)
  {
    require(isSenderApprovedFor(_tokenId));
    _clearApprovalAndTransfer(_from, _to, _tokenId);
  }
  
  /*
   * @notice Transfers the ownership of an NFT from one address to another address
   * @dev This works identically to the other function with an extra data parameter,
   *  except this function just sets data to ""
   * @param _from The current owner of the NFT
   * @param _to The new owner
   * @param _tokenId The NFT to transfer
  */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    payable
    whenNotPaused
    whenNotPausedUser(msg.sender)
  {
    require(isSenderApprovedFor(_tokenId));
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /*
   * @notice Transfers the ownership of an NFT from one address to another address
   * @dev Throws unless `msg.sender` is the current owner, an authorized
   * operator, or the approved address for this NFT. Throws if `_from` is
   * not the current owner. Throws if `_to` is the zero address. Throws if
   * `_tokenId` is not a valid NFT. When transfer is complete, this function
   * checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @param _from The current owner of the NFT
   * @param _to The new owner
   * @param _tokenId The NFT to transfer
   * @param _data Additional data with no specified format, sent in call to `_to`
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    payable
    whenNotPaused
    whenNotPausedUser(msg.sender)
  {
    require(isSenderApprovedFor(_tokenId));
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /*
   * @notice send amount shareUsers
   */
  function sendAmountShareUsers(
    uint256 _tokenId, 
    address _to, 
    uint256 _amount
  ) 
    external 
    onlyCOO
    returns (bool) 
  {
    require(_to != address(0));
    return _calculateShareUsers(_tokenId, ownerOf(_tokenId), _to, _amount);
  }

  /*
   * @notice send amount shareUsers
   */
  function sendAmountShareUsersFrom(
    uint256 _tokenId, 
    address _from, 
    address _to, 
    uint256 _amount
  ) 
    external 
    onlyCOO
    returns (bool) 
  {
    require(_to != address(0));
    return _calculateShareUsers(_tokenId, _from, _to, _amount);
  }

  /*
   * @notice update collectedAmount 
   */
  function updateCollectedAmount(
    uint256 _tokenId, 
    uint256 _amount
  ) 
    external 
    onlyCOO 
    returns (bool) 
  {
    require(isValidRedToken(_tokenId));
    require(_amount > 0);
        
    redTokens[_tokenId].collectedAmount = redTokens[_tokenId].collectedAmount.add(_amount);
    
    emit CollectedAmountUpdate(_tokenId, ownerOf(_tokenId), _amount);
    return true;
  }

  /*
   * @notice createRedToken
   */
  function createRedToken(
    address _user, 
    string calldata _rmsBondNo, 
    uint256 _bondAmount, 
    uint256 _listingAmount
  ) 
    external 
    onlyCOO 
    returns (uint256) 
  {
    return _createRedToken(_user,_rmsBondNo,_bondAmount,_listingAmount);
  }

  /*
   * @notice burn amount a token by share users
   */
  function burnAmountByShareUser(
    uint256 _tokenId, 
    address _from, 
    uint256 _amount
  ) 
    external 
    onlyCOO 
    returns (bool) 
  {
    return _calculateShareUsers(_tokenId, _from, address(0), _amount);
  }
  
  /*
   * @notice burn RedToken
   */
  function burn(
    address _owner, 
    uint256 _tokenId
  ) 
    external 
    onlyCOO 
    returns(bool) 
  {
    require(_owner != address(0));
    return _burn(_owner, _tokenId);
  }

  /** internal function **/
  function isContract(address _addr) internal view returns (bool) {
    uint size;
    assembly { size := extcodesize(_addr) }
    return size > 0;
  }

  /*
   * @notice checked shareUser by shareUsersKeys
   */
  function isShareUser(
    uint256 _tokenId, 
    address _from
  ) 
    internal  
    view 
    returns (bool) 
  {
    bool chechedUser = false;
    for (uint index = 0; index < shareUsersKeys[_tokenId].length; index++) {
      if (  shareUsersKeys[_tokenId][index] == _from ){
        chechedUser = true;
        break;
      }
    }
    return chechedUser;
  }

  /*
   * @notice Transfers the ownership of an NFT from one address to another address
   * @param _from The current owner of the NFT
   * @param _to The new owner
   * @param _tokenId The NFT to transfer
   * @param _data Additional data with no specified format, sent in call to `_to`
   */
  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    internal
  {
    _clearApprovalAndTransfer(_from, _to, _tokenId);

    if (isContract(_to)) {
      bytes4 tokenReceiverResponse = ERC721TokenReceiver(_to).onERC721Received.gas(50000)(
        _from, _tokenId, _data
      );
      require(tokenReceiverResponse == bytes4(keccak256("onERC721Received(address,uint256,bytes)")));
    }
  }

  /*
  * @notice Internal function to clear current approval and transfer the ownership of a given token ID
  * @param _from address which you want to send tokens from
  * @param _to address which you want to transfer the token to
  * @param _tokenId uint256 ID of the token to be transferred
  */
  function _clearApprovalAndTransfer(
    address _from, 
    address _to, 
    uint256 _tokenId
  )
    internal 
  {
    require(_to != address(0));
    require(_to != ownerOf(_tokenId));
    require(ownerOf(_tokenId) == _from);
    require(isValidRedToken(_tokenId));
    
    address owner = ownerOf(_tokenId);

    _clearApproval(owner, _tokenId);
    _removeToken(owner, _tokenId);
    _addToken(_to, _tokenId);
    _changeTokenShareUserByOwner(owner, _to, _tokenId);

    emit Transfer(owner, _to, _tokenId);
  }

  /*
   * @notice change token owner rate sending
   * @param _from address which you want to change rate from
   * @param _to address which you want to change rate the token to
   * @param _tokenId uint256 ID of the token to be change rate
   */
  function _changeTokenShareUserByOwner(
    address _from, 
    address _to, 
    uint256 _tokenId
  ) 
    internal  
  {
    uint256 amount = shareUsers[_tokenId][_from];
    delete shareUsers[_tokenId][_from];

    shareUsers[_tokenId][_to] = shareUsers[_tokenId][_to].add(amount);

    if ( !isShareUser(_tokenId, _to) ) {
      shareUsersKeys[_tokenId].push(_to);
    }
  }

  /*
   * @notice remove shareUsers
   */
  function _calculateShareUsers(
    uint256 _tokenId, 
    address _from, 
    address _to, 
    uint256 _amount
  ) 
    internal
    returns (bool) 
  {
    require(_from != address(0));
    require(_from != _to);
    require(_amount > 0);
    require(shareUsers[_tokenId][_from] >= _amount);
    require(isValidRedToken(_tokenId));
    
    shareUsers[_tokenId][_from] = shareUsers[_tokenId][_from].sub(_amount);
    shareUsers[_tokenId][_to] = shareUsers[_tokenId][_to].add(_amount);

    if ( !isShareUser(_tokenId, _to) ) {
      shareUsersKeys[_tokenId].push(_to);
    }

    emit calculateShareUsers(_tokenId, ownerOf(_tokenId), _from, _to, _amount);
    return true;
  }

  /*
  * @notice Internal function to clear current approval of a given token ID
  * @param _tokenId uint256 ID of the token to be transferred
  */
  function _clearApproval(
    address _owner,
    uint256 _tokenId
  ) 
    internal 
  {
    require(ownerOf(_tokenId) == _owner);
    
    tokenApprovals[_tokenId] = address(0);

    emit Approval(_owner, address(0), _tokenId);
  }

  function _createRedToken(
    address _user, 
    string memory _rmsBondNo, 
    uint256 _bondAmount, 
    uint256 _listingAmount
  ) 
    internal 
    returns (uint256)
  {
    require(_user != address(0));
    require(bytes(_rmsBondNo).length > 0);
    require(_bondAmount > 0);
    require(_listingAmount > 0);

    uint256 _newTokenId = redTokens.length;

    RedToken memory _redToken = RedToken({
      tokenId: _newTokenId,
      rmsBondNo: _rmsBondNo,
      bondAmount: _bondAmount,
      listingAmount: _listingAmount,
      collectedAmount: 0,
      createdTime: now,
      isValid:true
    });

    redTokens.push(_redToken) - 1;

    shareUsers[_newTokenId][_user] = shareUsers[_newTokenId][_user].add(_listingAmount);
    shareUsersKeys[_newTokenId].push(_user);

    _addToken(_user, _newTokenId);

    emit RedTokenCreated(_user,
                        _redToken.tokenId,
                        _redToken.rmsBondNo,
                        _redToken.bondAmount,
                        _redToken.listingAmount,
                        _redToken.collectedAmount,
                        _redToken.createdTime);
    
    return _newTokenId;
  }
  
  /*
  * @notice Internal function to add a token ID to the list of a given address
  * @param _to address representing the new owner of the given token ID
  * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
  */
  function _addToken(
    address _to, 
    uint256 _tokenId
  ) 
    internal 
  {
    require(tokenOwner[_tokenId] == address(0));

    tokenOwner[_tokenId] = _to;
    uint256 length = balanceOf(_to);
    ownedTokens[_to].push(_tokenId);
    ownedTokensIndex[_tokenId] = length;
    totalTokens = totalTokens.add(1);
  }

  /*
  * @notice Internal function to remove a token ID from the list of a given address
  * @param _from address representing the previous owner of the given token ID
  * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
  */
  function _removeToken(
    address _from, 
    uint256 _tokenId
  ) 
    internal 
  {
    require(ownerOf(_tokenId) == _from);

    uint256 tokenIndex = ownedTokensIndex[_tokenId];
    uint256 lastTokenIndex = balanceOf(_from).sub(1);
    uint256 lastToken = ownedTokens[_from][lastTokenIndex];

    tokenOwner[_tokenId] = address(0);
    ownedTokens[_from][tokenIndex] = lastToken;
    ownedTokens[_from][lastTokenIndex] = 0;
    // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
    // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
    // the lastToken to the first position, and then dropping the element placed in the last position of the list

    ownedTokens[_from].length--;
    ownedTokensIndex[_tokenId] = 0;
    ownedTokensIndex[lastToken] = tokenIndex;
    totalTokens = totalTokens.sub(1);
  }

  /*
   * @dev Internal function to burn a specific token
   * @dev Reverts if the token does not exist
   * @param _tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(
    address _owner, 
    uint256 _tokenId
  ) 
    internal 
    returns(bool) 
  {
    require(ownerOf(_tokenId) == _owner);
    _clearApproval(_owner, _tokenId);
    _removeToken(_owner, _tokenId);

    redTokens[_tokenId].isValid = false;

    emit Transfer(_owner, address(0), _tokenId);
    return true;
  }
}

// File: contracts\RedTokenCore.sol

pragma solidity 0.5.7;


/*
 * @title RedTokenCore is the entry point of the contract
 * @notice RedTokenCore is the entry point and it controls the ability to set a new
 * contract address, in the case where an upgrade is required
 */
contract RedTokenCore is RedTokenOwnership{

  constructor() public {
    ceoAddress = msg.sender;
    cooAddress = msg.sender;
    cfoAddress = msg.sender;
  }

  function() external {
    assert(false);
  }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","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":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newBaseURI","type":"string"}],"name":"setTokenMetadataBaseURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"sendAmountShareUsersFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPausedUser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenCreatedTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"sendAmountShareUsers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isSenderApprovedFor","outputs":[{"name":"","type":"bool"}],"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":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOf","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_rmsBondNo","type":"string"},{"name":"_bondAmount","type":"uint256"},{"name":"_listingAmount","type":"uint256"}],"name":"createRedToken","outputs":[{"name":"","type":"uint256"}],"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":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"unpauseUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isValidRedToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenBondAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenRmsBondNo","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenListingAmount","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":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"pauseUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenCollectedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"}],"name":"burnAmountByShareUser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"infoUrl","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenInfoOfshareUsers","outputs":[{"name":"","type":"address[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_amount","type":"uint256"}],"name":"updateCollectedAmount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"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"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"calculateShareUsers","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"CollectedAmountUpdate","type":"event"},{"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"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"rmsBondNo","type":"string"},{"indexed":false,"name":"bondAmount","type":"uint256"},{"indexed":false,"name":"listingAmount","type":"uint256"},{"indexed":false,"name":"collectedAmount","type":"uint256"},{"indexed":false,"name":"createdTime","type":"uint256"}],"name":"RedTokenCreated","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PausedUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"UnpausedUser","type":"event"}]

60806040526000600260146101000a81548160ff021916908315150217905550604051806060016040528060218152602001620058c460219139600d908051906020019062000050929190620001e9565b503480156200005e57600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000298565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200022c57805160ff19168380011785556200025d565b828001600101855582156200025d579182015b828111156200025c5782518255916020019190600101906200023f565b5b5090506200026c919062000270565b5090565b6200029591905b808211156200029157600081600090555060010162000277565b5090565b90565b61561c80620002a86000396000f3fe60806040526004361061027d5760003560e01c80636352211e1161014f578063a9059cbb116100c1578063c4defb091161007a578063c4defb091461127f578063c87b56dd146112fc578063ce696ca5146113b0578063d86ac8d714611488578063e532b01b146114e5578063e985e9c5146115bc5761027d565b8063a9059cbb14611028578063b047fb5014611076578063b341e6be146110cd578063b88d4fde1461111c578063bfcb9079146111df578063c0885af8146112305761027d565b8063939a518b11610113578063939a518b14610d7257806395d89b4114610dc55780639dc29fac14610e55578063a22cb46514610ec8578063a34b041414610f25578063a603644314610f745761027d565b80636352211e14610b5c5780636b08e00014610bd757806370a0823114610ca55780638456cb5914610d0a5780638622878d14610d215761027d565b80632f745c59116101f35780634cc028aa116101ac5780634cc028aa146109175780634e0a3379146109945780634eae8e30146109e55780634f6ccce714610a385780635a3f267214610a875780635c975abb14610b2d5761027d565b80632f745c59146106ce57806332f67cc81461073d5780633f4ba83a146107da57806342842e0e146107f157806344c22b581461085f57806348263272146108c85761027d565b80630a0f8168116102455780630a0f8168146104b657806318160ddd1461050d5780631e20363a1461053857806323b872dd146105be57806327d7874c1461062c5780632ba73c151461067d5761027d565b806301ffc9a7146102945780630519ce791461030657806306fdde031461035d578063081812fc146103ed578063095ea7b314610468575b34801561028957600080fd5b50600061029257fe5b005b3480156102a057600080fd5b506102ec600480360360208110156102b757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611645565b604051808215151515815260200191505060405180910390f35b34801561031257600080fd5b5061031b611726565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561036957600080fd5b5061037261174c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b2578082015181840152602081019050610397565b50505050905090810190601f1680156103df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f957600080fd5b506104266004803603602081101561041057600080fd5b8101908080359060200190929190505050611789565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104b46004803603604081101561047e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117c6565b005b3480156104c257600080fd5b506104cb611a26565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051957600080fd5b50610522611a4b565b6040518082815260200191505060405180910390f35b34801561054457600080fd5b506105bc6004803603602081101561055b57600080fd5b810190808035906020019064010000000081111561057857600080fd5b82018360208201111561058a57600080fd5b803590602001918460018302840111640100000000831117156105ac57600080fd5b9091929391929390505050611a55565b005b61062a600480360360608110156105d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac5565b005b34801561063857600080fd5b5061067b6004803603602081101561064f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b94565b005b34801561068957600080fd5b506106cc600480360360208110156106a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c6a565b005b3480156106da57600080fd5b50610727600480360360408110156106f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d41565b6040518082815260200191505060405180910390f35b34801561074957600080fd5b506107c06004803603608081101561076057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611db4565b604051808215151515815260200191505060405180910390f35b3480156107e657600080fd5b506107ef611e60565b005b61085d6004803603606081101561080757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fcb565b005b34801561086b57600080fd5b506108ae6004803603602081101561088257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120aa565b604051808215151515815260200191505060405180910390f35b3480156108d457600080fd5b50610901600480360360208110156108eb57600080fd5b81019080803590602001909291905050506120bc565b6040518082815260200191505060405180910390f35b34801561092357600080fd5b5061097a6004803603606081101561093a57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120e4565b604051808215151515815260200191505060405180910390f35b3480156109a057600080fd5b506109e3600480360360208110156109b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612197565b005b3480156109f157600080fd5b50610a1e60048036036020811015610a0857600080fd5b810190808035906020019092919050505061226e565b604051808215151515815260200191505060405180910390f35b348015610a4457600080fd5b50610a7160048036036020811015610a5b57600080fd5b8101908080359060200190929190505050612305565b6040518082815260200191505060405180910390f35b348015610a9357600080fd5b50610ad660048036036020811015610aaa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061231d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b19578082015181840152602081019050610afe565b505050509050019250505060405180910390f35b348015610b3957600080fd5b50610b426123ee565b604051808215151515815260200191505060405180910390f35b348015610b6857600080fd5b50610b9560048036036020811015610b7f57600080fd5b8101908080359060200190929190505050612401565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610be357600080fd5b50610c8f60048036036080811015610bfa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c3757600080fd5b820183602082011115610c4957600080fd5b80359060200191846001830284011164010000000083111715610c6b57600080fd5b9091929391929390803590602001909291908035906020019092919050505061247d565b6040518082815260200191505060405180910390f35b348015610cb157600080fd5b50610cf460048036036020811015610cc857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612534565b6040518082815260200191505060405180910390f35b348015610d1657600080fd5b50610d1f6125b9565b005b348015610d2d57600080fd5b50610d7060048036036020811015610d4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612725565b005b348015610d7e57600080fd5b50610dab60048036036020811015610d9557600080fd5b81019080803590602001909291905050506128cc565b604051808215151515815260200191505060405180910390f35b348015610dd157600080fd5b50610dda612901565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578082015181840152602081019050610dff565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6157600080fd5b50610eae60048036036040811015610e7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061293e565b604051808215151515815260200191505060405180910390f35b348015610ed457600080fd5b50610f2360048036036040811015610eeb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129e6565b005b348015610f3157600080fd5b50610f5e60048036036020811015610f4857600080fd5b8101908080359060200190929190505050612ab5565b6040518082815260200191505060405180910390f35b348015610f8057600080fd5b50610fad60048036036020811015610f9757600080fd5b8101908080359060200190929190505050612add565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610fed578082015181840152602081019050610fd2565b50505050905090810190601f16801561101a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6110746004803603604081101561103e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b9d565b005b34801561108257600080fd5b5061108b612c9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156110d957600080fd5b50611106600480360360208110156110f057600080fd5b8101908080359060200190929190505050612cc1565b6040518082815260200191505060405180910390f35b6111dd6004803603608081101561113257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561119957600080fd5b8201836020820111156111ab57600080fd5b803590602001918460018302840111640100000000831117156111cd57600080fd5b9091929391929390505050612ce9565b005b3480156111eb57600080fd5b5061122e6004803603602081101561120257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dff565b005b34801561123c57600080fd5b506112696004803603602081101561125357600080fd5b8101908080359060200190929190505050612ef8565b6040518082815260200191505060405180910390f35b34801561128b57600080fd5b506112e2600480360360608110156112a257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612f20565b604051808215151515815260200191505060405180910390f35b34801561130857600080fd5b506113356004803603602081101561131f57600080fd5b8101908080359060200190929190505050612f92565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561137557808201518184015260208101905061135a565b50505050905090810190601f1680156113a25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156113bc57600080fd5b506113e9600480360360208110156113d357600080fd5b8101908080359060200190929190505050613109565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611430578082015181840152602081019050611415565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611472578082015181840152602081019050611457565b5050505090500194505050505060405180910390f35b34801561149457600080fd5b506114cb600480360360408110156114ab57600080fd5b8101908080359060200190929190803590602001909291905050506132d6565b604051808215151515815260200191505060405180910390f35b3480156114f157600080fd5b5061151e6004803603602081101561150857600080fd5b8101908080359060200190929190505050613429565b6040518087815260200180602001868152602001858152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b8381101561157c578082015181840152602081019050611561565b50505050905090810190601f1680156115a95780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b3480156115c857600080fd5b5061162b600480360360408110156115df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061359b565b604051808215151515815260200191505060405180910390f35b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116bf5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806116ef57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061171f575063780e9d6360e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600881526020017f526564546f6b656e000000000000000000000000000000000000000000000000815250905090565b6000600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600260149054906101000a900460ff16156117e057600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181b57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561187257600080fd5b813373ffffffffffffffffffffffffffffffffffffffff1661189382612401565b73ffffffffffffffffffffffffffffffffffffffff16146118b357600080fd5b6118bc83612401565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156118f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661191584611789565b73ffffffffffffffffffffffffffffffffffffffff161415806119655750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611a205783600b600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff166119dd85612401565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aaf57600080fd5b8181600d9190611ac0929190615439565b505050565b600260149054906101000a900460ff1615611adf57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b7157600080fd5b611b7a8261226e565b611b8357600080fd5b611b8e84848461362f565b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bed57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c2757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cfd57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d4c83612534565b8210611d5757600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611da157fe5b9060005260206000200154905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e4a57600080fd5b611e5685858585613793565b9050949350505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f0857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611f605750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611f6957600080fd5b600260149054906101000a900460ff16611f8257600080fd5b6000600260146101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b600260149054906101000a900460ff1615611fe557600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561202057600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561207757600080fd5b6120808261226e565b61208957600080fd5b6120a484848460405180602001604052806000815250613b66565b50505050565b60006120b582613d20565b9050919050565b6000600682815481106120cb57fe5b9060005260206000209060070201600501549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461214057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561217a57600080fd5b61218e8461218786612401565b8585613793565b90509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121f057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561222a57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003373ffffffffffffffffffffffffffffffffffffffff1661229083612401565b73ffffffffffffffffffffffffffffffffffffffff1614806122e557503373ffffffffffffffffffffffffffffffffffffffff166122cd83611789565b73ffffffffffffffffffffffffffffffffffffffff16145b806122fe57506122fd6122f783612401565b3361359b565b5b9050919050565b6000600754821061231557600080fd5b819050919050565b6060600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561235957600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156123e257602002820191906000526020600020905b8154815260200190600101908083116123ce575b50505050509050919050565b600260149054906101000a900460ff1681565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247457600080fd5b80915050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124d957600080fd5b6125298686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585613daf565b905095945050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256f57600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061266157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806126b95750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6126c257600080fd5b600260149054906101000a900460ff16156126dc57600080fd5b6001600260146101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127cd57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806128255750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61282e57600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561286957600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128bf57600080fd5b6128c882614155565b5050565b6000600682815481106128db57fe5b906000526020600020906007020160060160009054906101000a900460ff169050919050565b60606040518060400160405280600481526020017f5245445400000000000000000000000000000000000000000000000000000000815250905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461299a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129d457600080fd5b6129de838361423f565b905092915050565b600260149054906101000a900460ff1615612a0057600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a3b57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a9257600080fd5b8115612aa657612aa183614332565b612ab0565b612aaf83614554565b5b505050565b600060068281548110612ac457fe5b9060005260206000209060070201600201549050919050565b606060068281548110612aec57fe5b90600052602060002090600702016001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b915780601f10612b6657610100808354040283529160200191612b91565b820191906000526020600020905b815481529060010190602001808311612b7457829003601f168201915b50505050509050919050565b600260149054906101000a900460ff1615612bb757600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bf257600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612c4957600080fd5b813373ffffffffffffffffffffffffffffffffffffffff16612c6a82612401565b73ffffffffffffffffffffffffffffffffffffffff1614612c8a57600080fd5b612c9533858561362f565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060068281548110612cd057fe5b9060005260206000209060070201600301549050919050565b600260149054906101000a900460ff1615612d0357600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d3e57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612d9557600080fd5b612d9e8461226e565b612da757600080fd5b612df786868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613b66565b505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e5957600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e9457600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612eeb57600080fd5b612ef482614733565b5050565b600060068281548110612f0757fe5b9060005260206000209060070201600401549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f7c57600080fd5b612f898484600085613793565b90509392505050565b6060612f9d826128cc565b156130555761304e600d8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561303b5780601f106130105761010080835404028352916020019161303b565b820191906000526020600020905b81548152906001019060200180831161301e57829003601f168201915b50505050506130498461481e565b61494b565b9050613104565b613101600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130ee5780601f106130c3576101008083540402835291602001916130ee565b820191906000526020600020905b8154815290600101906020018083116130d157829003601f168201915b50505050506130fc8461481e565b61494b565b90505b919050565b606080613115836128cc565b61311e57600080fd5b60006005600085815260200190815260200160002080549050905060608160405190808252806020026020018201604052801561316a5781602001602082028038833980820191505090505b50905060608260405190808252806020026020018201604052801561319e5781602001602082028038833980820191505090505b50905060008090505b838110156132c7576005600088815260200190815260200160002081815481106131cd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061320457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060046000888152602001908152602001600020600084838151811061325f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548282815181106132ae57fe5b60200260200101818152505080806001019150506131a7565b50818194509450505050915091565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461333257600080fd5b61333b836128cc565b61334457600080fd5b6000821161335157600080fd5b613382826006858154811061336257fe5b90600052602060002090600702016004015461498f90919063ffffffff16565b6006848154811061338f57fe5b9060005260206000209060070201600401819055507f05337d88b83679841d390a2fbdf3a5c88bdb06460f3975e249bafeaabfafb1fc836133cf85612401565b84604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a16001905092915050565b6000606060008060008061343c876128cc565b61344557600080fd5b61344d6154b9565b6006888154811061345a57fe5b90600052602060002090600702016040518060e001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135165780601f106134eb57610100808354040283529160200191613516565b820191906000526020600020905b8154815290600101906020018083116134f957829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509050806000015181602001518260400151836060015184608001518560a001518494509650965096509650965096505091939550919395565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561366957600080fd5b61367281612401565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136aa57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166136ca82612401565b73ffffffffffffffffffffffffffffffffffffffff16146136ea57600080fd5b6136f3816128cc565b6136fc57600080fd5b600061370782612401565b905061371381836149ae565b61371d8183614aa1565b6137278383614d1f565b613732818484614e8c565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137ce57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561380757600080fd5b6000821161381457600080fd5b816004600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561387157600080fd5b61387a856128cc565b61388357600080fd5b6138e6826004600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461507890919063ffffffff16565b6004600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061399d826004600088815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139fb8584615098565b613a7757600560008681526020019081526020016000208390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b7fa75257f47ef40a14f62a43929f445734a6f637f872fc94577d76af85e26025d585613aa287612401565b868686604051808681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019550505050505060405180910390a160019050949350505050565b613b7184848461362f565b613b7a83615160565b15613d1a5760008373ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba61c3508786866040518563ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613c2a578082015181840152602081019050613c0f565b50505050905090810190601f168015613c575780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600088803b158015613c7857600080fd5b5087f1158015613c8c573d6000803e3d6000fd5b50505050506040513d6020811015613ca357600080fd5b8101908080519060200190929190505050905060405180806155ca60279139602701905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613d1857600080fd5b505b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d5b57600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613dea57600080fd5b6000845111613df857600080fd5b60008311613e0557600080fd5b60008211613e1257600080fd5b60006006805490509050613e246154b9565b6040518060e0016040528083815260200187815260200186815260200185815260200160008152602001428152602001600115158152509050600160068290806001815401808255809150509060018203906000526020600020906007020160009091929091909150600082015181600001556020820151816001019080519060200190613eb39291906154f8565b5060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555050505050613f63846004600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008381526020019081526020016000208790806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506140388783614d1f565b7fc501ac2be852a550c9c6067d077aede2499d3faa4f52b69eb0bf0c685b135e6687826000015183602001518460400151856060015186608001518760a00151604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200180602001868152602001858152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b838110156141085780820151818401526020810190506140ed565b50505050905090810190601f1680156141355780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a18192505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561418f57600080fd5b61419881613d20565b6141a157600080fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fa0d94fc04c80f003b48a783ce73888e968d047f20aa82b15ea04a337adfdb54e60405160405180910390a250565b60008273ffffffffffffffffffffffffffffffffffffffff1661426183612401565b73ffffffffffffffffffffffffffffffffffffffff161461428157600080fd5b61428b83836149ae565b6142958383614aa1565b6000600683815481106142a457fe5b906000526020600020906007020160060160006101000a81548160ff02191690831515021790555081600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001905092915050565b600260149054906101000a900460ff161561434c57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561438757600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156143de57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561441757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561445157600080fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c316001604051808215151515815260200191505060405180910390a35050565b600260149054906101000a900460ff161561456e57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156145a957600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561460057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561463957600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c316000604051808215151515815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561476d57600080fd5b61477681613d20565b1561478057600080fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7f8a124e9caf40fb6766c0ef83b56076743409baa010cde8e7a972466bed1fcd60405160405180910390a250565b60606000821415614866576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614946565b600082905060005b60008214614890578080600101915050600a828161488857fe5b04915061486e565b6060816040519080825280601f01601f1916602001820160405280156148c55781602001600182028038833980820191505090505b50905060006001830390505b6000861461493e57600a86816148e357fe5b0660300160f81b828280600190039350815181106148fd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a868161493657fe5b0495506148d1565b819450505050505b919050565b60606149878383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250615173565b905092915050565b6000808284019050838110156149a457600080fd5b8091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166149ce82612401565b73ffffffffffffffffffffffffffffffffffffffff16146149ee57600080fd5b6000600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff16614ac182612401565b73ffffffffffffffffffffffffffffffffffffffff1614614ae157600080fd5b6000600a60008381526020019081526020016000205490506000614b176001614b0986612534565b61507890919063ffffffff16565b90506000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614b6557fe5b9060005260206000200154905060006008600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110614c1057fe5b90600052602060002001819055506000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110614c6a57fe5b9060005260206000200181905550600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003614cca9190615578565b506000600a60008681526020019081526020016000208190555082600a600083815260200190815260200160002081905550614d12600160075461507890919063ffffffff16565b6007819055505050505050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614d8b57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000614de883612534565b9050600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600a600084815260200190815260200160002081905550614e81600160075461498f90919063ffffffff16565b600781905550505050565b60006004600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506004600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055614f98816004600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ff68284615098565b61507257600560008381526020019081526020016000208390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50505050565b60008282111561508757600080fd5b600082840390508091505092915050565b6000806000905060008090505b6005600086815260200190815260200160002080549050811015615155578373ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002082815481106150f857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156151485760019150615155565b80806001019150506150a5565b508091505092915050565b600080823b905060008111915050919050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f1916602001820160405280156151cf5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8851811015615250578881815181106151f757fe5b602001015160f81c60f81b83838060010194508151811061521457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506151e2565b5060008090505b87518110156152c55787818151811061526c57fe5b602001015160f81c60f81b83838060010194508151811061528957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050615257565b5060008090505b865181101561533a578681815181106152e157fe5b602001015160f81c60f81b8383806001019450815181106152fe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506152cc565b5060008090505b85518110156153af5785818151811061535657fe5b602001015160f81c60f81b83838060010194508151811061537357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050615341565b5060008090505b8451811015615424578481815181106153cb57fe5b602001015160f81c60f81b8383806001019450815181106153e857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506153b6565b50819850505050505050505095945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061547a57803560ff19168380011785556154a8565b828001600101855582156154a8579182015b828111156154a757823582559160200191906001019061548c565b5b5090506154b591906155a4565b5090565b6040518060e001604052806000815260200160608152602001600081526020016000815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061553957805160ff1916838001178555615567565b82800160010185558215615567579182015b8281111561556657825182559160200191906001019061554b565b5b50905061557491906155a4565b5090565b81548183558181111561559f5781836000526020600020918201910161559e91906155a4565b5b505050565b6155c691905b808211156155c25760008160009055506001016155aa565b5090565b9056fe6f6e455243373231526563656976656428616464726573732c75696e743235362c627974657329a165627a7a72305820184266fb4e98551a636645c39347c9591c1a44597d86d9aabf8a02feaf5b19fc002968747470733a2f2f646f632e726564697475732e636f2e6b722f3f646f6369643d

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80636352211e1161014f578063a9059cbb116100c1578063c4defb091161007a578063c4defb091461127f578063c87b56dd146112fc578063ce696ca5146113b0578063d86ac8d714611488578063e532b01b146114e5578063e985e9c5146115bc5761027d565b8063a9059cbb14611028578063b047fb5014611076578063b341e6be146110cd578063b88d4fde1461111c578063bfcb9079146111df578063c0885af8146112305761027d565b8063939a518b11610113578063939a518b14610d7257806395d89b4114610dc55780639dc29fac14610e55578063a22cb46514610ec8578063a34b041414610f25578063a603644314610f745761027d565b80636352211e14610b5c5780636b08e00014610bd757806370a0823114610ca55780638456cb5914610d0a5780638622878d14610d215761027d565b80632f745c59116101f35780634cc028aa116101ac5780634cc028aa146109175780634e0a3379146109945780634eae8e30146109e55780634f6ccce714610a385780635a3f267214610a875780635c975abb14610b2d5761027d565b80632f745c59146106ce57806332f67cc81461073d5780633f4ba83a146107da57806342842e0e146107f157806344c22b581461085f57806348263272146108c85761027d565b80630a0f8168116102455780630a0f8168146104b657806318160ddd1461050d5780631e20363a1461053857806323b872dd146105be57806327d7874c1461062c5780632ba73c151461067d5761027d565b806301ffc9a7146102945780630519ce791461030657806306fdde031461035d578063081812fc146103ed578063095ea7b314610468575b34801561028957600080fd5b50600061029257fe5b005b3480156102a057600080fd5b506102ec600480360360208110156102b757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611645565b604051808215151515815260200191505060405180910390f35b34801561031257600080fd5b5061031b611726565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561036957600080fd5b5061037261174c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b2578082015181840152602081019050610397565b50505050905090810190601f1680156103df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f957600080fd5b506104266004803603602081101561041057600080fd5b8101908080359060200190929190505050611789565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104b46004803603604081101561047e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117c6565b005b3480156104c257600080fd5b506104cb611a26565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051957600080fd5b50610522611a4b565b6040518082815260200191505060405180910390f35b34801561054457600080fd5b506105bc6004803603602081101561055b57600080fd5b810190808035906020019064010000000081111561057857600080fd5b82018360208201111561058a57600080fd5b803590602001918460018302840111640100000000831117156105ac57600080fd5b9091929391929390505050611a55565b005b61062a600480360360608110156105d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac5565b005b34801561063857600080fd5b5061067b6004803603602081101561064f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b94565b005b34801561068957600080fd5b506106cc600480360360208110156106a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c6a565b005b3480156106da57600080fd5b50610727600480360360408110156106f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d41565b6040518082815260200191505060405180910390f35b34801561074957600080fd5b506107c06004803603608081101561076057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611db4565b604051808215151515815260200191505060405180910390f35b3480156107e657600080fd5b506107ef611e60565b005b61085d6004803603606081101561080757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fcb565b005b34801561086b57600080fd5b506108ae6004803603602081101561088257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120aa565b604051808215151515815260200191505060405180910390f35b3480156108d457600080fd5b50610901600480360360208110156108eb57600080fd5b81019080803590602001909291905050506120bc565b6040518082815260200191505060405180910390f35b34801561092357600080fd5b5061097a6004803603606081101561093a57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120e4565b604051808215151515815260200191505060405180910390f35b3480156109a057600080fd5b506109e3600480360360208110156109b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612197565b005b3480156109f157600080fd5b50610a1e60048036036020811015610a0857600080fd5b810190808035906020019092919050505061226e565b604051808215151515815260200191505060405180910390f35b348015610a4457600080fd5b50610a7160048036036020811015610a5b57600080fd5b8101908080359060200190929190505050612305565b6040518082815260200191505060405180910390f35b348015610a9357600080fd5b50610ad660048036036020811015610aaa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061231d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b19578082015181840152602081019050610afe565b505050509050019250505060405180910390f35b348015610b3957600080fd5b50610b426123ee565b604051808215151515815260200191505060405180910390f35b348015610b6857600080fd5b50610b9560048036036020811015610b7f57600080fd5b8101908080359060200190929190505050612401565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610be357600080fd5b50610c8f60048036036080811015610bfa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c3757600080fd5b820183602082011115610c4957600080fd5b80359060200191846001830284011164010000000083111715610c6b57600080fd5b9091929391929390803590602001909291908035906020019092919050505061247d565b6040518082815260200191505060405180910390f35b348015610cb157600080fd5b50610cf460048036036020811015610cc857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612534565b6040518082815260200191505060405180910390f35b348015610d1657600080fd5b50610d1f6125b9565b005b348015610d2d57600080fd5b50610d7060048036036020811015610d4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612725565b005b348015610d7e57600080fd5b50610dab60048036036020811015610d9557600080fd5b81019080803590602001909291905050506128cc565b604051808215151515815260200191505060405180910390f35b348015610dd157600080fd5b50610dda612901565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578082015181840152602081019050610dff565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6157600080fd5b50610eae60048036036040811015610e7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061293e565b604051808215151515815260200191505060405180910390f35b348015610ed457600080fd5b50610f2360048036036040811015610eeb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129e6565b005b348015610f3157600080fd5b50610f5e60048036036020811015610f4857600080fd5b8101908080359060200190929190505050612ab5565b6040518082815260200191505060405180910390f35b348015610f8057600080fd5b50610fad60048036036020811015610f9757600080fd5b8101908080359060200190929190505050612add565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610fed578082015181840152602081019050610fd2565b50505050905090810190601f16801561101a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6110746004803603604081101561103e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b9d565b005b34801561108257600080fd5b5061108b612c9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156110d957600080fd5b50611106600480360360208110156110f057600080fd5b8101908080359060200190929190505050612cc1565b6040518082815260200191505060405180910390f35b6111dd6004803603608081101561113257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561119957600080fd5b8201836020820111156111ab57600080fd5b803590602001918460018302840111640100000000831117156111cd57600080fd5b9091929391929390505050612ce9565b005b3480156111eb57600080fd5b5061122e6004803603602081101561120257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dff565b005b34801561123c57600080fd5b506112696004803603602081101561125357600080fd5b8101908080359060200190929190505050612ef8565b6040518082815260200191505060405180910390f35b34801561128b57600080fd5b506112e2600480360360608110156112a257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612f20565b604051808215151515815260200191505060405180910390f35b34801561130857600080fd5b506113356004803603602081101561131f57600080fd5b8101908080359060200190929190505050612f92565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561137557808201518184015260208101905061135a565b50505050905090810190601f1680156113a25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156113bc57600080fd5b506113e9600480360360208110156113d357600080fd5b8101908080359060200190929190505050613109565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611430578082015181840152602081019050611415565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611472578082015181840152602081019050611457565b5050505090500194505050505060405180910390f35b34801561149457600080fd5b506114cb600480360360408110156114ab57600080fd5b8101908080359060200190929190803590602001909291905050506132d6565b604051808215151515815260200191505060405180910390f35b3480156114f157600080fd5b5061151e6004803603602081101561150857600080fd5b8101908080359060200190929190505050613429565b6040518087815260200180602001868152602001858152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b8381101561157c578082015181840152602081019050611561565b50505050905090810190601f1680156115a95780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b3480156115c857600080fd5b5061162b600480360360408110156115df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061359b565b604051808215151515815260200191505060405180910390f35b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116bf5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806116ef57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061171f575063780e9d6360e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600881526020017f526564546f6b656e000000000000000000000000000000000000000000000000815250905090565b6000600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600260149054906101000a900460ff16156117e057600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181b57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561187257600080fd5b813373ffffffffffffffffffffffffffffffffffffffff1661189382612401565b73ffffffffffffffffffffffffffffffffffffffff16146118b357600080fd5b6118bc83612401565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156118f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661191584611789565b73ffffffffffffffffffffffffffffffffffffffff161415806119655750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611a205783600b600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff166119dd85612401565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aaf57600080fd5b8181600d9190611ac0929190615439565b505050565b600260149054906101000a900460ff1615611adf57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b7157600080fd5b611b7a8261226e565b611b8357600080fd5b611b8e84848461362f565b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bed57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c2757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cfd57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d4c83612534565b8210611d5757600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611da157fe5b9060005260206000200154905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e4a57600080fd5b611e5685858585613793565b9050949350505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f0857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611f605750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611f6957600080fd5b600260149054906101000a900460ff16611f8257600080fd5b6000600260146101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b600260149054906101000a900460ff1615611fe557600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561202057600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561207757600080fd5b6120808261226e565b61208957600080fd5b6120a484848460405180602001604052806000815250613b66565b50505050565b60006120b582613d20565b9050919050565b6000600682815481106120cb57fe5b9060005260206000209060070201600501549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461214057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561217a57600080fd5b61218e8461218786612401565b8585613793565b90509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121f057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561222a57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003373ffffffffffffffffffffffffffffffffffffffff1661229083612401565b73ffffffffffffffffffffffffffffffffffffffff1614806122e557503373ffffffffffffffffffffffffffffffffffffffff166122cd83611789565b73ffffffffffffffffffffffffffffffffffffffff16145b806122fe57506122fd6122f783612401565b3361359b565b5b9050919050565b6000600754821061231557600080fd5b819050919050565b6060600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561235957600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156123e257602002820191906000526020600020905b8154815260200190600101908083116123ce575b50505050509050919050565b600260149054906101000a900460ff1681565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247457600080fd5b80915050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124d957600080fd5b6125298686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585613daf565b905095945050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256f57600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061266157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806126b95750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6126c257600080fd5b600260149054906101000a900460ff16156126dc57600080fd5b6001600260146101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127cd57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806128255750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61282e57600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561286957600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128bf57600080fd5b6128c882614155565b5050565b6000600682815481106128db57fe5b906000526020600020906007020160060160009054906101000a900460ff169050919050565b60606040518060400160405280600481526020017f5245445400000000000000000000000000000000000000000000000000000000815250905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461299a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129d457600080fd5b6129de838361423f565b905092915050565b600260149054906101000a900460ff1615612a0057600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a3b57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a9257600080fd5b8115612aa657612aa183614332565b612ab0565b612aaf83614554565b5b505050565b600060068281548110612ac457fe5b9060005260206000209060070201600201549050919050565b606060068281548110612aec57fe5b90600052602060002090600702016001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b915780601f10612b6657610100808354040283529160200191612b91565b820191906000526020600020905b815481529060010190602001808311612b7457829003601f168201915b50505050509050919050565b600260149054906101000a900460ff1615612bb757600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bf257600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612c4957600080fd5b813373ffffffffffffffffffffffffffffffffffffffff16612c6a82612401565b73ffffffffffffffffffffffffffffffffffffffff1614612c8a57600080fd5b612c9533858561362f565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060068281548110612cd057fe5b9060005260206000209060070201600301549050919050565b600260149054906101000a900460ff1615612d0357600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d3e57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612d9557600080fd5b612d9e8461226e565b612da757600080fd5b612df786868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613b66565b505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e5957600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e9457600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612eeb57600080fd5b612ef482614733565b5050565b600060068281548110612f0757fe5b9060005260206000209060070201600401549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f7c57600080fd5b612f898484600085613793565b90509392505050565b6060612f9d826128cc565b156130555761304e600d8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561303b5780601f106130105761010080835404028352916020019161303b565b820191906000526020600020905b81548152906001019060200180831161301e57829003601f168201915b50505050506130498461481e565b61494b565b9050613104565b613101600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130ee5780601f106130c3576101008083540402835291602001916130ee565b820191906000526020600020905b8154815290600101906020018083116130d157829003601f168201915b50505050506130fc8461481e565b61494b565b90505b919050565b606080613115836128cc565b61311e57600080fd5b60006005600085815260200190815260200160002080549050905060608160405190808252806020026020018201604052801561316a5781602001602082028038833980820191505090505b50905060608260405190808252806020026020018201604052801561319e5781602001602082028038833980820191505090505b50905060008090505b838110156132c7576005600088815260200190815260200160002081815481106131cd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061320457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060046000888152602001908152602001600020600084838151811061325f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548282815181106132ae57fe5b60200260200101818152505080806001019150506131a7565b50818194509450505050915091565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461333257600080fd5b61333b836128cc565b61334457600080fd5b6000821161335157600080fd5b613382826006858154811061336257fe5b90600052602060002090600702016004015461498f90919063ffffffff16565b6006848154811061338f57fe5b9060005260206000209060070201600401819055507f05337d88b83679841d390a2fbdf3a5c88bdb06460f3975e249bafeaabfafb1fc836133cf85612401565b84604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a16001905092915050565b6000606060008060008061343c876128cc565b61344557600080fd5b61344d6154b9565b6006888154811061345a57fe5b90600052602060002090600702016040518060e001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135165780601f106134eb57610100808354040283529160200191613516565b820191906000526020600020905b8154815290600101906020018083116134f957829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509050806000015181602001518260400151836060015184608001518560a001518494509650965096509650965096505091939550919395565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561366957600080fd5b61367281612401565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136aa57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166136ca82612401565b73ffffffffffffffffffffffffffffffffffffffff16146136ea57600080fd5b6136f3816128cc565b6136fc57600080fd5b600061370782612401565b905061371381836149ae565b61371d8183614aa1565b6137278383614d1f565b613732818484614e8c565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137ce57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561380757600080fd5b6000821161381457600080fd5b816004600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561387157600080fd5b61387a856128cc565b61388357600080fd5b6138e6826004600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461507890919063ffffffff16565b6004600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061399d826004600088815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139fb8584615098565b613a7757600560008681526020019081526020016000208390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b7fa75257f47ef40a14f62a43929f445734a6f637f872fc94577d76af85e26025d585613aa287612401565b868686604051808681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019550505050505060405180910390a160019050949350505050565b613b7184848461362f565b613b7a83615160565b15613d1a5760008373ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba61c3508786866040518563ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613c2a578082015181840152602081019050613c0f565b50505050905090810190601f168015613c575780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600088803b158015613c7857600080fd5b5087f1158015613c8c573d6000803e3d6000fd5b50505050506040513d6020811015613ca357600080fd5b8101908080519060200190929190505050905060405180806155ca60279139602701905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613d1857600080fd5b505b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d5b57600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613dea57600080fd5b6000845111613df857600080fd5b60008311613e0557600080fd5b60008211613e1257600080fd5b60006006805490509050613e246154b9565b6040518060e0016040528083815260200187815260200186815260200185815260200160008152602001428152602001600115158152509050600160068290806001815401808255809150509060018203906000526020600020906007020160009091929091909150600082015181600001556020820151816001019080519060200190613eb39291906154f8565b5060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555050505050613f63846004600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008381526020019081526020016000208790806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506140388783614d1f565b7fc501ac2be852a550c9c6067d077aede2499d3faa4f52b69eb0bf0c685b135e6687826000015183602001518460400151856060015186608001518760a00151604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200180602001868152602001858152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b838110156141085780820151818401526020810190506140ed565b50505050905090810190601f1680156141355780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a18192505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561418f57600080fd5b61419881613d20565b6141a157600080fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fa0d94fc04c80f003b48a783ce73888e968d047f20aa82b15ea04a337adfdb54e60405160405180910390a250565b60008273ffffffffffffffffffffffffffffffffffffffff1661426183612401565b73ffffffffffffffffffffffffffffffffffffffff161461428157600080fd5b61428b83836149ae565b6142958383614aa1565b6000600683815481106142a457fe5b906000526020600020906007020160060160006101000a81548160ff02191690831515021790555081600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001905092915050565b600260149054906101000a900460ff161561434c57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561438757600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156143de57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561441757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561445157600080fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c316001604051808215151515815260200191505060405180910390a35050565b600260149054906101000a900460ff161561456e57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156145a957600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561460057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561463957600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c316000604051808215151515815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561476d57600080fd5b61477681613d20565b1561478057600080fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7f8a124e9caf40fb6766c0ef83b56076743409baa010cde8e7a972466bed1fcd60405160405180910390a250565b60606000821415614866576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614946565b600082905060005b60008214614890578080600101915050600a828161488857fe5b04915061486e565b6060816040519080825280601f01601f1916602001820160405280156148c55781602001600182028038833980820191505090505b50905060006001830390505b6000861461493e57600a86816148e357fe5b0660300160f81b828280600190039350815181106148fd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a868161493657fe5b0495506148d1565b819450505050505b919050565b60606149878383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250615173565b905092915050565b6000808284019050838110156149a457600080fd5b8091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166149ce82612401565b73ffffffffffffffffffffffffffffffffffffffff16146149ee57600080fd5b6000600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff16614ac182612401565b73ffffffffffffffffffffffffffffffffffffffff1614614ae157600080fd5b6000600a60008381526020019081526020016000205490506000614b176001614b0986612534565b61507890919063ffffffff16565b90506000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614b6557fe5b9060005260206000200154905060006008600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110614c1057fe5b90600052602060002001819055506000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110614c6a57fe5b9060005260206000200181905550600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003614cca9190615578565b506000600a60008681526020019081526020016000208190555082600a600083815260200190815260200160002081905550614d12600160075461507890919063ffffffff16565b6007819055505050505050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614d8b57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000614de883612534565b9050600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600a600084815260200190815260200160002081905550614e81600160075461498f90919063ffffffff16565b600781905550505050565b60006004600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506004600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055614f98816004600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ff68284615098565b61507257600560008381526020019081526020016000208390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50505050565b60008282111561508757600080fd5b600082840390508091505092915050565b6000806000905060008090505b6005600086815260200190815260200160002080549050811015615155578373ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002082815481106150f857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156151485760019150615155565b80806001019150506150a5565b508091505092915050565b600080823b905060008111915050919050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f1916602001820160405280156151cf5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8851811015615250578881815181106151f757fe5b602001015160f81c60f81b83838060010194508151811061521457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506151e2565b5060008090505b87518110156152c55787818151811061526c57fe5b602001015160f81c60f81b83838060010194508151811061528957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050615257565b5060008090505b865181101561533a578681815181106152e157fe5b602001015160f81c60f81b8383806001019450815181106152fe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506152cc565b5060008090505b85518110156153af5785818151811061535657fe5b602001015160f81c60f81b83838060010194508151811061537357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050615341565b5060008090505b8451811015615424578481815181106153cb57fe5b602001015160f81c60f81b8383806001019450815181106153e857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506153b6565b50819850505050505050505095945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061547a57803560ff19168380011785556154a8565b828001600101855582156154a8579182015b828111156154a757823582559160200191906001019061548c565b5b5090506154b591906155a4565b5090565b6040518060e001604052806000815260200160608152602001600081526020016000815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061553957805160ff1916838001178555615567565b82800160010185558215615567579182015b8281111561556657825182559160200191906001019061554b565b5b50905061557491906155a4565b5090565b81548183558181111561559f5781836000526020600020918201910161559e91906155a4565b5b505050565b6155c691905b808211156155c25760008160009055506001016155aa565b5090565b9056fe6f6e455243373231526563656976656428616464726573732c75696e743235362c627974657329a165627a7a72305820184266fb4e98551a636645c39347c9591c1a44597d86d9aabf8a02feaf5b19fc0029

Swarm Source

bzzr://184266fb4e98551a636645c39347c9591c1a44597d86d9aabf8a02feaf5b19fc
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.