ETH Price: $1,957.96 (-0.77%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer144398012022-03-23 2:05:211432 days ago1648001121IN
0x5E046CCc...DcfED0a85
0 ETH0.0018577934
Transfer137461862021-12-05 12:49:491540 days ago1638708589IN
0x5E046CCc...DcfED0a85
0 ETH0.0028786457.99397836
Transfer125909072021-06-08 1:23:561720 days ago1623115436IN
0x5E046CCc...DcfED0a85
0 ETH0.0007137518
Transfer100171912020-05-07 5:18:162117 days ago1588828696IN
0x5E046CCc...DcfED0a85
0 ETH0.000231246
Transfer93980472020-02-01 18:07:572213 days ago1580580477IN
0x5E046CCc...DcfED0a85
0 ETH0.0011562330
Transfer93254702020-01-21 14:48:072224 days ago1579618087IN
0x5E046CCc...DcfED0a85
0 ETH0.000047082
Transfer92379772020-01-08 4:57:412237 days ago1578459461IN
0x5E046CCc...DcfED0a85
0 ETH0.000035311.5
Transfer92024202020-01-02 18:13:462243 days ago1577988826IN
0x5E046CCc...DcfED0a85
0 ETH0.000032971.4
Approve91904292019-12-31 10:36:272245 days ago1577788587IN
0x5E046CCc...DcfED0a85
0 ETH0.000360028
Transfer87073882019-10-09 11:20:352328 days ago1570620035IN
0x5E046CCc...DcfED0a85
0 ETH0.0009354941
Transfer87011182019-10-08 11:42:442329 days ago1570534964IN
0x5E046CCc...DcfED0a85
0 ETH0.0004159811
Transfer87011092019-10-08 11:40:042329 days ago1570534804IN
0x5E046CCc...DcfED0a85
0 ETH0.000186568
Transfer86842102019-10-05 20:26:002332 days ago1570307160IN
0x5E046CCc...DcfED0a85
0 ETH0.000303048
Transfer86721572019-10-03 23:20:182333 days ago1570144818IN
0x5E046CCc...DcfED0a85
0 ETH0.000453812
Transfer85438792019-09-13 22:16:362354 days ago1568412996IN
0x5E046CCc...DcfED0a85
0 ETH0.0011383530
Transfer84020312019-08-22 19:44:022376 days ago1566503042IN
0x5E046CCc...DcfED0a85
0 ETH0.000079221.5
Transfer82851692019-08-04 16:10:062394 days ago1564935006IN
0x5E046CCc...DcfED0a85
0 ETH0.0015478741
Transfer82362092019-07-28 1:38:112401 days ago1564277891IN
0x5E046CCc...DcfED0a85
0 ETH0.00013696
Transfer81372712019-07-12 16:11:442417 days ago1562947904IN
0x5E046CCc...DcfED0a85
0 ETH0.0010563420
Transfer81331242019-07-12 0:29:102417 days ago1562891350IN
0x5E046CCc...DcfED0a85
0 ETH0.000091484.00946924
Transfer81329772019-07-11 23:56:302417 days ago1562889390IN
0x5E046CCc...DcfED0a85
0 ETH0.000052751
Transfer80740642019-07-02 19:49:102427 days ago1562096950IN
0x5E046CCc...DcfED0a85
0 ETH0.0003775310
Transfer80740642019-07-02 19:49:102427 days ago1562096950IN
0x5E046CCc...DcfED0a85
0 ETH0.0003781710
Transfer80304062019-06-26 0:36:222433 days ago1561509382IN
0x5E046CCc...DcfED0a85
0 ETH0.000037811
Transfer79944492019-06-20 10:09:292439 days ago1561025369IN
0x5E046CCc...DcfED0a85
0 ETH0.000151014
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TRVLToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

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

pragma solidity ^0.4.23;


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






/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
    require(token.transfer(to, value));
  }

  function safeTransferFrom(
    ERC20 token,
    address from,
    address to,
    uint256 value
  )
    internal
  {
    require(token.transferFrom(from, to, value));
  }

  function safeApprove(ERC20 token, address spender, uint256 value) internal {
    require(token.approve(spender, value));
  }
}



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


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


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

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

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}









/// Gives the owner the ability to transfer ownership of the contract to a new
/// address and it requires the owner of the new address to accept the transfer.






/**
 * @title Claimable
 * @dev Extension for the Ownable contract, where the ownership needs to be claimed.
 * This allows the new owner to accept the transfer.
 */
contract Claimable is Ownable {
  address public pendingOwner;

  /**
   * @dev Modifier throws if called by any account other than the pendingOwner.
   */
  modifier onlyPendingOwner() {
    require(msg.sender == pendingOwner);
    _;
  }

  /**
   * @dev Allows the current owner to set the pendingOwner address.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) onlyOwner public {
    pendingOwner = newOwner;
  }

  /**
   * @dev Allows the pendingOwner address to finalize the transfer.
   */
  function claimOwnership() onlyPendingOwner public {
    emit OwnershipTransferred(owner, pendingOwner);
    owner = pendingOwner;
    pendingOwner = address(0);
  }
}



/// @title Admin functionality for TRVLToken.sol contracts.
contract Admin is Claimable{
    mapping(address => bool) public admins;

    event AdminAdded(address added);
    event AdminRemoved(address removed);

    /// @dev Verifies the msg.sender is a member of the admins mapping. Owner is by default an admin.
    modifier onlyAdmin() {
        require(admins[msg.sender] || msg.sender == owner, "msg.sender is not an admin!");
        _;
    }

    /// @notice Adds a list of addresses to the admins list.
    /// @dev Requires that the msg.sender is the Owner. Emits an event on success.
    /// @param _admins The list of addresses to add to the admins mapping.
    function addAddressesToAdmins(address[] _admins) external onlyOwner {
        require(_admins.length > 0, "Cannot add an empty list to admins!");
        for (uint256 i = 0; i < _admins.length; ++i) {
            address user = _admins[i];
            require(user != address(0), "Cannot add the zero address to admins!");

            if (!admins[user]) {
                admins[user] = true;

                emit AdminAdded(user);
            }
        }
    }

    /// @notice Removes a list of addresses from the admins list.
    /// @dev Requires that the msg.sender is an Owner. It is possible for the admins list to be empty, this is a fail safe
    /// in the event the admin accounts are compromised. The owner has the ability to lockout the server access from which
    /// TravelBlock is processing payments. Emits an event on success.
    /// @param _admins The list of addresses to remove from the admins mapping.
    function removeAddressesFromAdmins(address[] _admins) external onlyOwner {
        require(_admins.length > 0, "Cannot remove an empty list to admins!");
        for (uint256 i = 0; i < _admins.length; ++i) {
            address user = _admins[i];

            if (admins[user]) {
                admins[user] = false;

                emit AdminRemoved(user);
            }
        }
    }
}



/// @title Whitelist configurations for the TRVL Token contract.
contract Whitelist is Admin {
    mapping(address => bool) public whitelist;

    event WhitelistAdded(address added);
    event WhitelistRemoved(address removed);

    /// @dev Verifies the user is whitelisted.
    modifier isWhitelisted(address _user) {
        require(whitelist[_user] != false, "User is not whitelisted!");
        _;
    }

    /// @notice Adds a list of addresses to the whitelist.
    /// @dev Requires that the msg.sender is the Admin. Emits an event on success.
    /// @param _users The list of addresses to add to the whitelist.
    function addAddressesToWhitelist(address[] _users) external onlyAdmin {
        require(_users.length > 0, "Cannot add an empty list to whitelist!");
        for (uint256 i = 0; i < _users.length; ++i) {
            address user = _users[i];
            require(user != address(0), "Cannot add the zero address to whitelist!");

            if (!whitelist[user]) {
                whitelist[user] = true;

                emit WhitelistAdded(user);
            }
        }
    }

    /// @notice Removes a list of addresses from the whitelist.
    /// @dev Requires that the msg.sender is an Admin. Emits an event on success.
    /// @param _users The list of addresses to remove from the whitelist.
    function removeAddressesFromWhitelist(address[] _users) external onlyAdmin {
        require(_users.length > 0, "Cannot remove an empty list to whitelist!");
        for (uint256 i = 0; i < _users.length; ++i) {
            address user = _users[i];

            if (whitelist[user]) {
                whitelist[user] = false;

                emit WhitelistRemoved(user);
            }
        }
    }
}






/// Standard ERC20 token with the ability to freeze and unfreeze token transfer.











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

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting '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;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

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

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

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



/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  /**
  * @dev total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

}






/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender)
    public view returns (uint256);

  function transferFrom(address from, address to, uint256 value)
    public returns (bool);

  function approve(address spender, uint256 value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}



/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    returns (bool)
  {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(
    address _spender,
    uint _addedValue
  )
    public
    returns (bool)
  {
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(
    address _spender,
    uint _subtractedValue
  )
    public
    returns (bool)
  {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}







/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @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);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}



/**
 * @title Pausable token
 * @dev StandardToken modified with pausable transfers.
 **/
contract PausableToken is StandardToken, Pausable {

  function transfer(
    address _to,
    uint256 _value
  )
    public
    whenNotPaused
    returns (bool)
  {
    return super.transfer(_to, _value);
  }

  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    whenNotPaused
    returns (bool)
  {
    return super.transferFrom(_from, _to, _value);
  }

  function approve(
    address _spender,
    uint256 _value
  )
    public
    whenNotPaused
    returns (bool)
  {
    return super.approve(_spender, _value);
  }

  function increaseApproval(
    address _spender,
    uint _addedValue
  )
    public
    whenNotPaused
    returns (bool success)
  {
    return super.increaseApproval(_spender, _addedValue);
  }

  function decreaseApproval(
    address _spender,
    uint _subtractedValue
  )
    public
    whenNotPaused
    returns (bool success)
  {
    return super.decreaseApproval(_spender, _subtractedValue);
  }
}


/// Blocks ERC223 tokens and allows the smart contract to transfer ownership of
/// ERC20 tokens that are sent to the contract address.









/**
 * @title Contracts that should be able to recover tokens
 * @author SylTi
 * @dev This allow a contract to recover any ERC20 token received in a contract by transferring the balance to the contract owner.
 * This will prevent any accidental loss of tokens.
 */
contract CanReclaimToken is Ownable {
  using SafeERC20 for ERC20Basic;

  /**
   * @dev Reclaim all ERC20Basic compatible tokens
   * @param token ERC20Basic The address of the token contract
   */
  function reclaimToken(ERC20Basic token) external onlyOwner {
    uint256 balance = token.balanceOf(this);
    token.safeTransfer(owner, balance);
  }

}



/**
 * @title Contracts that should not own Tokens
 * @author Remco Bloemen <remco@2π.com>
 * @dev This blocks incoming ERC223 tokens to prevent accidental loss of tokens.
 * Should tokens (any ERC20Basic compatible) end up in the contract, it allows the
 * owner to reclaim the tokens.
 */
contract HasNoTokens is CanReclaimToken {

 /**
  * @dev Reject all ERC223 compatible tokens
  * @param from_ address The address that is transferring the tokens
  * @param value_ uint256 the amount of the specified token
  * @param data_ Bytes The data passed from the caller.
  */
  function tokenFallback(address from_, uint256 value_, bytes data_) external {
    from_;
    value_;
    data_;
    revert();
  }

}



/// @title Reward Token contract that contains all reward token configurations.
contract RewardToken is PausableToken, Whitelist, HasNoTokens{
    /// @dev Any token balances added here must be removed from the balances map.
    mapping(address => uint256) public rewardBalances;

    uint256[] public rewardPercentage;
    uint256 public rewardPercentageDecimals;
    uint256 public rewardPercentageDivisor;

    event RewardPercentage(uint256 index, uint256 percentage);

    /// @dev Verifies the reward index is valid.
    modifier isValidRewardIndex(uint256 _index) {
        require(_index < rewardPercentage.length, "The reward percentage index does not exist!");
        _;
    }

    /// @dev Verifies the reward percentage is valid.
    modifier isValidRewardPercentage(uint256 _percentage) {
        require(_percentage <= rewardPercentageDivisor, "Cannot have a reward percentage greater than 100%!");
        _;
    }

    constructor(uint256 _rewardPercentageDecimals) public {
        rewardPercentageDecimals = _rewardPercentageDecimals;
        rewardPercentageDivisor = (10 ** uint256(_rewardPercentageDecimals)).mul(100);
    }

    /// @notice Adds a reward percentage to the list of available reward percentages, specific to 18 decimals.
    /// @dev To achieve an affective 5% bonus, the sender needs to use 5 x 10^18.
    /// Requires:
    ///     - Msg.sender is an admin
    ///     - Percentage is <= 100%
    /// @param _percentage The new percentage specific to 18 decimals.
    /// @return The index of the percentage added in the rewardPercentage array.
    function addRewardPercentage(uint256 _percentage) public onlyAdmin isValidRewardPercentage(_percentage) returns (uint256 _index) {
        _index = rewardPercentage.length;
        rewardPercentage.push(_percentage);

        emit RewardPercentage(_index, _percentage);
    }

    /// @notice Edits the contents of the percentage array, with the specified parameters.
    /// @dev Allows the owner to edit percentage array contents for a given index.
    /// Requires:
    ///     - Msg.sender is an admin
    ///     - The index must be within the bounds of the rewardPercentage array
    ///     - The new percentage must be <= 100%
    /// @param _index The index of the percentage to be edited.
    /// @param _percentage The new percentage to be used for the given index.
    function updateRewardPercentageByIndex(uint256 _index, uint256 _percentage)
        public
        onlyAdmin
        isValidRewardIndex(_index)
        isValidRewardPercentage(_percentage)
    {
        rewardPercentage[_index] = _percentage;

        emit RewardPercentage(_index, _percentage);
    }

    /// @dev Calculates the reward based on the reward percentage index.
    /// Requires:
    ///     - The index must be within the bounds of the rewardPercentage array
    /// @param _amount The amount tokens to be converted to rewards.
    /// @param _rewardPercentageIndex The location of reward percentage to be applied.
    /// @return The amount of tokens converted to reward tokens.
    function getRewardToken(uint256 _amount, uint256 _rewardPercentageIndex)
        internal
        view
        isValidRewardIndex(_rewardPercentageIndex)
        returns(uint256 _rewardToken)
    {
        _rewardToken = _amount.mul(rewardPercentage[_rewardPercentageIndex]).div(rewardPercentageDivisor);
    }
}



/// @title TRVLToken smart contract
contract TRVLToken is RewardToken {
    string public constant name = "TRVL Token";
    string public constant symbol = "TRVL";
    uint8 public constant decimals = 18;
    uint256 public constant TOTAL_CAP = 600000000 * (10 ** uint256(decimals));

    event TransferReward(address from, address to, uint256 value);

    /// @dev Verifies the user has enough tokens to cover the payment.
    modifier senderHasEnoughTokens(uint256 _regularTokens, uint256 _rewardTokens) {
        require(rewardBalances[msg.sender] >= _rewardTokens, "User does not have enough reward tokens!");
        require(balances[msg.sender] >= _regularTokens, "User does not have enough regular tokens!");
        _;
    }

    /// @dev Verifies the amount is > 0.
    modifier validAmount(uint256 _amount) {
        require(_amount > 0, "The amount specified is 0!");
        _;
    }

    /// @dev The TRVL Token is an ERC20 complaint token with a built in reward system that
    /// gives users back a percentage of tokens spent on travel. These tokens are
    /// non-transferable and can only be spent on travel through the TravelBlock website.
    /// The percentages are defined in the rewardPercentage array and can be modified by
    /// the TravelBlock team. The token is created with the entire balance being owned by the address that deploys.
    constructor() RewardToken(decimals) public {
        totalSupply_ = TOTAL_CAP;
        balances[owner] = totalSupply_;
        emit Transfer(0x0, owner, totalSupply_);
    }

    /// @notice Process a payment that prioritizes the use of regular tokens.
    /// @dev Uses up all of the available regular tokens, before using rewards tokens to cover a payment. Pushes the calculated amounts
    /// into their respective function calls.
    /// @param _amount The total tokens to be paid.
    function paymentRegularTokensPriority (uint256 _amount, uint256 _rewardPercentageIndex) public {
        uint256 regularTokensAvailable = balances[msg.sender];

        if (regularTokensAvailable >= _amount) {
            paymentRegularTokens(_amount, _rewardPercentageIndex);

        } else {
            if (regularTokensAvailable > 0) {
                uint256 amountOfRewardsTokens = _amount.sub(regularTokensAvailable);
                paymentMixed(regularTokensAvailable, amountOfRewardsTokens, _rewardPercentageIndex);
            } else {
                paymentRewardTokens(_amount);
            }
        }
    }

    /// @notice Process a payment that prioritizes the use of reward tokens.
    /// @dev Uses up all of the available reward tokens, before using regular tokens to cover a payment. Pushes the calculated amounts
    /// into their respective function calls.
    /// @param _amount The total tokens to be paid.
    function paymentRewardTokensPriority (uint256 _amount, uint256 _rewardPercentageIndex) public {
        uint256 rewardTokensAvailable = rewardBalances[msg.sender];

        if (rewardTokensAvailable >= _amount) {
            paymentRewardTokens(_amount);
        } else {
            if (rewardTokensAvailable > 0) {
                uint256 amountOfRegularTokens = _amount.sub(rewardTokensAvailable);
                paymentMixed(amountOfRegularTokens, rewardTokensAvailable, _rewardPercentageIndex);
            } else {
                paymentRegularTokens(_amount, _rewardPercentageIndex);
            }
        }
    }

    /// @notice Process a TRVL tokens payment with a combination of regular and rewards tokens.
    /// @dev calls the regular/rewards payment methods respectively.
    /// @param _regularTokenAmount The amount of regular tokens to be processed.
    /// @param _rewardTokenAmount The amount of reward tokens to be processed.
    function paymentMixed (uint256 _regularTokenAmount, uint256 _rewardTokenAmount, uint256 _rewardPercentageIndex) public {
        paymentRewardTokens(_rewardTokenAmount);
        paymentRegularTokens(_regularTokenAmount, _rewardPercentageIndex);
    }

    /// @notice Process a payment using only regular TRVL Tokens with a specified reward percentage.
    /// @dev Adjusts the balances accordingly and applies a reward token bonus. The accounts must be whitelisted because the travel team must own the address
    /// to make transfers on their behalf.
    /// Requires:
    ///     - The contract is not paused
    ///     - The amount being processed is greater than 0
    ///     - The reward index being passed is valid
    ///     - The sender has enough tokens to cover the payment
    ///     - The sender is a whitelisted address
    /// @param _regularTokenAmount The amount of regular tokens being used for the payment.
    /// @param _rewardPercentageIndex The index pointing to the percentage of reward tokens to be applied.
    function paymentRegularTokens (uint256 _regularTokenAmount, uint256 _rewardPercentageIndex)
        public
        validAmount(_regularTokenAmount)
        isValidRewardIndex(_rewardPercentageIndex)
        senderHasEnoughTokens(_regularTokenAmount, 0)
        isWhitelisted(msg.sender)
        whenNotPaused
    {
        // 1. Pay the specified amount with from the balance of the user/sender.
        balances[msg.sender] = balances[msg.sender].sub(_regularTokenAmount);

        // 2. distribute reward tokens to the user.
        uint256 rewardAmount = getRewardToken(_regularTokenAmount, _rewardPercentageIndex);
        rewardBalances[msg.sender] = rewardBalances[msg.sender].add(rewardAmount);
        emit TransferReward(owner, msg.sender, rewardAmount);

        // 3. Update the owner balance minus the reward tokens.
        balances[owner] = balances[owner].add(_regularTokenAmount.sub(rewardAmount));
        emit Transfer(msg.sender, owner, _regularTokenAmount.sub(rewardAmount));
    }

    /// @notice Process a payment using only reward TRVL Tokens.
    /// @dev Adjusts internal balances accordingly. The accounts must be whitelisted because the travel team must own the address
    /// to make transfers on their behalf.
    /// Requires:
    ///     - The contract is not paused
    ///     - The amount being processed is greater than 0
    ///     - The sender has enough tokens to cover the payment
    ///     - The sender is a whitelisted address
    /// @param _rewardTokenAmount The amount of reward tokens being used for the payment.
    function paymentRewardTokens (uint256 _rewardTokenAmount)
        public
        validAmount(_rewardTokenAmount)
        senderHasEnoughTokens(0, _rewardTokenAmount)
        isWhitelisted(msg.sender)
        whenNotPaused
    {
        rewardBalances[msg.sender] = rewardBalances[msg.sender].sub(_rewardTokenAmount);
        rewardBalances[owner] = rewardBalances[owner].add(_rewardTokenAmount);

        emit TransferReward(msg.sender, owner, _rewardTokenAmount);
    }

    /// @notice Convert a specific amount of regular TRVL tokens from the owner, into reward tokens for a user.
    /// @dev Converts the regular tokens into reward tokens at a 1-1 ratio.
    /// Requires:
    ///     - Owner has enough tokens to convert
    ///     - The specified user is whitelisted
    ///     - The amount being converted is greater than 0
    /// @param _user The user receiving the converted tokens.
    /// @param _amount The amount of tokens to be converted.
    function convertRegularToRewardTokens(address _user, uint256 _amount)
        external
        onlyOwner
        validAmount(_amount)
        senderHasEnoughTokens(_amount, 0)
        isWhitelisted(_user)
    {
        balances[msg.sender] = balances[msg.sender].sub(_amount);
        rewardBalances[_user] = rewardBalances[_user].add(_amount);

        emit TransferReward(msg.sender, _user, _amount);
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"TOTAL_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardPercentageDecimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_rewardPercentageIndex","type":"uint256"}],"name":"paymentRegularTokensPriority","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"reclaimToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_users","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"admins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_index","type":"uint256"},{"name":"_percentage","type":"uint256"}],"name":"updateRewardPercentageByIndex","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"rewardPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"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":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_regularTokenAmount","type":"uint256"},{"name":"_rewardPercentageIndex","type":"uint256"}],"name":"paymentRegularTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_rewardTokenAmount","type":"uint256"}],"name":"paymentRewardTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_admins","type":"address[]"}],"name":"removeAddressesFromAdmins","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"rewardBalances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_percentage","type":"uint256"}],"name":"addRewardPercentage","outputs":[{"name":"_index","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_admins","type":"address[]"}],"name":"addAddressesToAdmins","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from_","type":"address"},{"name":"value_","type":"uint256"},{"name":"data_","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_rewardPercentageIndex","type":"uint256"}],"name":"paymentRewardTokensPriority","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_regularTokenAmount","type":"uint256"},{"name":"_rewardTokenAmount","type":"uint256"},{"name":"_rewardPercentageIndex","type":"uint256"}],"name":"paymentMixed","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_amount","type":"uint256"}],"name":"convertRegularToRewardTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPercentageDivisor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_users","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"TransferReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"index","type":"uint256"},{"indexed":false,"name":"percentage","type":"uint256"}],"name":"RewardPercentage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"added","type":"address"}],"name":"WhitelistAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"removed","type":"address"}],"name":"WhitelistRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"added","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"removed","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

60806040526000600360146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50601260ff1633600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600981905550620000a1606482600a0a6200019d6401000000000262004884179091906401000000009004565b600a8190555050601260ff16600a0a6323c3460002600181905550600154600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6001546040518082815260200191505060405180910390a3620001d9565b600080831415620001b25760009050620001d3565b8183029050818382811515620001c457fe5b04141515620001cf57fe5b8090505b92915050565b6148fe80620001e96000396000f3006080604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806302548866146101f357806306fdde031461021e578063095ea7b3146102ae5780630ca5f72f1461031357806313a5aac71461033e57806317ffc3201461037557806318160ddd146103b857806323b872dd146103e357806324953eaa14610468578063313ce567146104a35780633f4ba83a146104d4578063429b62e5146104eb5780634e71e0c8146105465780635adfafdf1461055d5780635c975abb14610594578063619f7cd0146105c3578063661884631461060457806370a0823114610669578063715018a6146106c0578063803fbe5b146106d7578063841eb7f81461070e5780638456cb591461073b5780638da5cb5b146107525780638ee365fa146107a957806393c8dc6d146107e457806395d89b411461083b5780639b19251a146108cb5780639c1747e514610926578063a289409b14610967578063a9059cbb146109a2578063c0ee0b8a14610a07578063d38cba4b14610a6c578063d39ce83a14610aa3578063d5d1b95a14610ae4578063d73dd62314610b31578063dd62ed3e14610b96578063e025a66614610c0d578063e2ec6ec314610c38578063e30c397814610c73578063f2fde38b14610cca575b600080fd5b3480156101ff57600080fd5b50610208610d0d565b6040518082815260200191505060405180910390f35b34801561022a57600080fd5b50610233610d1e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610273578082015181840152602081019050610258565b50505050905090810190601f1680156102a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ba57600080fd5b506102f9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d57565b604051808215151515815260200191505060405180910390f35b34801561031f57600080fd5b50610328610d87565b6040518082815260200191505060405180910390f35b34801561034a57600080fd5b506103736004803603810190808035906020019092919080359060200190929190505050610d8d565b005b34801561038157600080fd5b506103b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e28565b005b3480156103c457600080fd5b506103cd610faf565b6040518082815260200191505060405180910390f35b3480156103ef57600080fd5b5061044e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fb9565b604051808215151515815260200191505060405180910390f35b34801561047457600080fd5b506104a1600480360381019080803590602001908201803590602001919091929391929390505050610feb565b005b3480156104af57600080fd5b506104b8611304565b604051808260ff1660ff16815260200191505060405180910390f35b3480156104e057600080fd5b506104e9611309565b005b3480156104f757600080fd5b5061052c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113c9565b604051808215151515815260200191505060405180910390f35b34801561055257600080fd5b5061055b6113e9565b005b34801561056957600080fd5b50610592600480360381019080803590602001909291908035906020019092919050505061158a565b005b3480156105a057600080fd5b506105a961184a565b604051808215151515815260200191505060405180910390f35b3480156105cf57600080fd5b506105ee6004803603810190808035906020019092919050505061185d565b6040518082815260200191505060405180910390f35b34801561061057600080fd5b5061064f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611880565b604051808215151515815260200191505060405180910390f35b34801561067557600080fd5b506106aa600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118b0565b6040518082815260200191505060405180910390f35b3480156106cc57600080fd5b506106d56118f8565b005b3480156106e357600080fd5b5061070c60048036038101908080359060200190929190803590602001909291905050506119fd565b005b34801561071a57600080fd5b506107396004803603810190808035906020019092919050505061213e565b005b34801561074757600080fd5b5061075061268f565b005b34801561075e57600080fd5b50610767612750565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107b557600080fd5b506107e2600480360381019080803590602001908201803590602001919091929391929390505050612776565b005b3480156107f057600080fd5b50610825600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129d2565b6040518082815260200191505060405180910390f35b34801561084757600080fd5b506108506129ea565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d757600080fd5b5061090c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a23565b604051808215151515815260200191505060405180910390f35b34801561093257600080fd5b5061095160048036038101908080359060200190929190505050612a43565b6040518082815260200191505060405180910390f35b34801561097357600080fd5b506109a0600480360381019080803590602001908201803590602001919091929391929390505050612c78565b005b3480156109ae57600080fd5b506109ed600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fa0565b604051808215151515815260200191505060405180910390f35b348015610a1357600080fd5b50610a6a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050612fd0565b005b348015610a7857600080fd5b50610aa16004803603810190808035906020019092919080359060200190929190505050612fd5565b005b348015610aaf57600080fd5b50610ae2600480360381019080803590602001909291908035906020019092919080359060200190929190505050613071565b005b348015610af057600080fd5b50610b2f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613089565b005b348015610b3d57600080fd5b50610b7c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506135b3565b604051808215151515815260200191505060405180910390f35b348015610ba257600080fd5b50610bf7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135e3565b6040518082815260200191505060405180910390f35b348015610c1957600080fd5b50610c2261366a565b6040518082815260200191505060405180910390f35b348015610c4457600080fd5b50610c71600480360381019080803590602001908201803590602001919091929391929390505050613670565b005b348015610c7f57600080fd5b50610c88613a55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cd657600080fd5b50610d0b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a7b565b005b601260ff16600a0a6323c346000281565b6040805190810160405280600a81526020017f5452564c20546f6b656e0000000000000000000000000000000000000000000081525081565b6000600360149054906101000a900460ff16151515610d7557600080fd5b610d7f8383613b1b565b905092915050565b60095481565b6000806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491508382101515610de957610de484846119fd565b610e22565b6000821115610e1757610e058285613c0d90919063ffffffff16565b9050610e12828285613071565b610e21565b610e208461213e565b5b5b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e8657600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015610f2157600080fd5b505af1158015610f35573d6000803e3d6000fd5b505050506040513d6020811015610f4b57600080fd5b81019080805190602001909291905050509050610fab600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613c269092919063ffffffff16565b5050565b6000600154905090565b6000600360149054906101000a900460ff16151515610fd757600080fd5b610fe2848484613d14565b90509392505050565b600080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806110935750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611107576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d73672e73656e646572206973206e6f7420616e2061646d696e21000000000081525060200191505060405180910390fd5b6000848490501115156111a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f43616e6e6f742072656d6f766520616e20656d707479206c69737420746f207781526020017f686974656c69737421000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600091505b838390508210156112fe5783838381811015156111c657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112f3576000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fde8cf212af7ce38b2840785a2768d97ff2dbf3c21b516961cec0061e134c2a1e81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b8160010191506111ad565b50505050565b601281565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561136557600080fd5b600360149054906101000a900460ff16151561138057600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60056020528060005260406000206000915054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561144557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061162f5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d73672e73656e646572206973206e6f7420616e2061646d696e21000000000081525060200191505060405180910390fd5b8160088054905081101515611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f546865207265776172642070657263656e7461676520696e64657820646f657381526020017f206e6f742065786973742100000000000000000000000000000000000000000081525060400191505060405180910390fd5b81600a5481111515156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f7420686176652061207265776172642070657263656e746167652081526020017f67726561746572207468616e203130302521000000000000000000000000000081525060400191505060405180910390fd5b826008858154811015156117f757fe5b90600052602060002001819055507f05f4496f879690498b5e029b5e8e2382de819ac154cbf728f6ad317347921ff38484604051808381526020018281526020019250505060405180910390a150505050565b600360149054906101000a900460ff1681565b60088181548110151561186c57fe5b906000526020600020016000915090505481565b6000600360149054906101000a900460ff1615151561189e57600080fd5b6118a883836140ce565b905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561195457600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600082600081111515611a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f54686520616d6f756e742073706563696669656420697320302100000000000081525060200191505060405180910390fd5b8260088054905081101515611b1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f546865207265776172642070657263656e7461676520696e64657820646f657381526020017f206e6f742065786973742100000000000000000000000000000000000000000081525060400191505060405180910390fd5b84600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611bfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f5573657220646f6573206e6f74206861766520656e6f7567682072657761726481526020017f20746f6b656e732100000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611cd7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f5573657220646f6573206e6f74206861766520656e6f75676820726567756c6181526020017f7220746f6b656e7321000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3360001515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514151515611da1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f55736572206973206e6f742077686974656c697374656421000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff16151515611dbd57600080fd5b611e0e886000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e5a888861435f565b9550611eae86600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f4332d3aac8bbc1ec65700cf5d1235e2118fe56b06c41aaf3e9627fb19a39b1bf600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163388604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1612037611fc8878a613c0d90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61211f898c613c0d90919063ffffffff16565b6040518082815260200191505060405180910390a35050505050505050565b806000811115156121b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f54686520616d6f756e742073706563696669656420697320302100000000000081525060200191505060405180910390fd5b60008280600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515612297576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f5573657220646f6573206e6f74206861766520656e6f7567682072657761726481526020017f20746f6b656e732100000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515612373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f5573657220646f6573206e6f74206861766520656e6f75676820726567756c6181526020017f7220746f6b656e7321000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3360001515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415151561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f55736572206973206e6f742077686974656c697374656421000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff1615151561245957600080fd5b6124ab85600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125628560076000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b60076000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f4332d3aac8bbc1ec65700cf5d1235e2118fe56b06c41aaf3e9627fb19a39b1bf33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156126eb57600080fd5b600360149054906101000a900460ff1615151561270757600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127d557600080fd5b600084849050111515612876576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e6e6f742072656d6f766520616e20656d707479206c69737420746f206181526020017f646d696e7321000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600091505b838390508210156129cc57838383818110151561289457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156129c1576000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b81600101915061287b565b50505050565b60076020528060005260406000206000915090505481565b6040805190810160405280600481526020017f5452564c0000000000000000000000000000000000000000000000000000000081525081565b60066020528060005260406000206000915054906101000a900460ff1681565b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612aea5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d73672e73656e646572206973206e6f7420616e2061646d696e21000000000081525060200191505060405180910390fd5b81600a548111151515612bff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f7420686176652061207265776172642070657263656e746167652081526020017f67726561746572207468616e203130302521000000000000000000000000000081525060400191505060405180910390fd5b600880549050915060088390806001815401808255809150509060018203906000526020600020016000909192909190915055507f05f4496f879690498b5e029b5e8e2382de819ac154cbf728f6ad317347921ff38284604051808381526020018281526020019250505060405180910390a150919050565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cd757600080fd5b600084849050111515612d78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f43616e6e6f742061646420616e20656d707479206c69737420746f2061646d6981526020017f6e7321000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600091505b83839050821015612f9a578383838181101515612d9657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612e80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e6e6f742061646420746865207a65726f206164647265737320746f206181526020017f646d696e7321000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515612f8f576001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b816001019150612d7d565b50505050565b6000600360149054906101000a900460ff16151515612fbe57600080fd5b612fc88383614469565b905092915050565b600080fd5b600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915083821015156130315761302c8461213e565b61306b565b600082111561305f5761304d8285613c0d90919063ffffffff16565b905061305a818385613071565b61306a565b61306984846119fd565b5b5b50505050565b61307a8261213e565b61308483826119fd565b505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130e557600080fd5b8060008111151561315e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f54686520616d6f756e742073706563696669656420697320302100000000000081525060200191505060405180910390fd5b81600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561323e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f5573657220646f6573206e6f74206861766520656e6f7567682072657761726481526020017f20746f6b656e732100000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561331a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f5573657220646f6573206e6f74206861766520656e6f75676820726567756c6181526020017f7220746f6b656e7321000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8460001515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515156133e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f55736572206973206e6f742077686974656c697374656421000000000000000081525060200191505060405180910390fd5b613435856000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134c985600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f4332d3aac8bbc1ec65700cf5d1235e2118fe56b06c41aaf3e9627fb19a39b1bf338787604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050505050565b6000600360149054906101000a900460ff161515156135d157600080fd5b6135db8383614688565b905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137185750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561378c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d73672e73656e646572206973206e6f7420616e2061646d696e21000000000081525060200191505060405180910390fd5b60008484905011151561382d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e6e6f742061646420616e20656d707479206c69737420746f207768697481526020017f656c69737421000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600091505b83839050821015613a4f57838383818110151561384b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613935576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f43616e6e6f742061646420746865207a65726f206164647265737320746f207781526020017f686974656c69737421000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515613a44576001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b816001019150613832565b50505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ad757600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000828211151515613c1b57fe5b818303905092915050565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613cc957600080fd5b505af1158015613cdd573d6000803e3d6000fd5b505050506040513d6020811015613cf357600080fd5b81019080805190602001909291905050501515613d0f57600080fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613d5157600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515613d9e57600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515613e2957600080fd5b613e7a826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f0d826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613fde82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808311156141df576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614273565b6141f28382613c0d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008160088054905081101515614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f546865207265776172642070657263656e7461676520696e64657820646f657381526020017f206e6f742065786973742100000000000000000000000000000000000000000081525060400191505060405180910390fd5b614444600a5461443660088681548110151561441c57fe5b90600052602060002001548761488490919063ffffffff16565b6148bc90919063ffffffff16565b91505092915050565b6000818301905082811015151561446057fe5b80905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156144a657600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156144f357600080fd5b614544826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145d7826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600061471982600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60008083141561489757600090506148b6565b81830290508183828115156148a857fe5b041415156148b257fe5b8090505b92915050565b600081838115156148c957fe5b049050929150505600a165627a7a72305820efed9ed6db8c31ddf4f8c355fcba182f5637fb9fb6bc544ebfe4822ab93c46d10029

Deployed Bytecode

0x6080604052600436106101ee576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806302548866146101f357806306fdde031461021e578063095ea7b3146102ae5780630ca5f72f1461031357806313a5aac71461033e57806317ffc3201461037557806318160ddd146103b857806323b872dd146103e357806324953eaa14610468578063313ce567146104a35780633f4ba83a146104d4578063429b62e5146104eb5780634e71e0c8146105465780635adfafdf1461055d5780635c975abb14610594578063619f7cd0146105c3578063661884631461060457806370a0823114610669578063715018a6146106c0578063803fbe5b146106d7578063841eb7f81461070e5780638456cb591461073b5780638da5cb5b146107525780638ee365fa146107a957806393c8dc6d146107e457806395d89b411461083b5780639b19251a146108cb5780639c1747e514610926578063a289409b14610967578063a9059cbb146109a2578063c0ee0b8a14610a07578063d38cba4b14610a6c578063d39ce83a14610aa3578063d5d1b95a14610ae4578063d73dd62314610b31578063dd62ed3e14610b96578063e025a66614610c0d578063e2ec6ec314610c38578063e30c397814610c73578063f2fde38b14610cca575b600080fd5b3480156101ff57600080fd5b50610208610d0d565b6040518082815260200191505060405180910390f35b34801561022a57600080fd5b50610233610d1e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610273578082015181840152602081019050610258565b50505050905090810190601f1680156102a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ba57600080fd5b506102f9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d57565b604051808215151515815260200191505060405180910390f35b34801561031f57600080fd5b50610328610d87565b6040518082815260200191505060405180910390f35b34801561034a57600080fd5b506103736004803603810190808035906020019092919080359060200190929190505050610d8d565b005b34801561038157600080fd5b506103b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e28565b005b3480156103c457600080fd5b506103cd610faf565b6040518082815260200191505060405180910390f35b3480156103ef57600080fd5b5061044e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fb9565b604051808215151515815260200191505060405180910390f35b34801561047457600080fd5b506104a1600480360381019080803590602001908201803590602001919091929391929390505050610feb565b005b3480156104af57600080fd5b506104b8611304565b604051808260ff1660ff16815260200191505060405180910390f35b3480156104e057600080fd5b506104e9611309565b005b3480156104f757600080fd5b5061052c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113c9565b604051808215151515815260200191505060405180910390f35b34801561055257600080fd5b5061055b6113e9565b005b34801561056957600080fd5b50610592600480360381019080803590602001909291908035906020019092919050505061158a565b005b3480156105a057600080fd5b506105a961184a565b604051808215151515815260200191505060405180910390f35b3480156105cf57600080fd5b506105ee6004803603810190808035906020019092919050505061185d565b6040518082815260200191505060405180910390f35b34801561061057600080fd5b5061064f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611880565b604051808215151515815260200191505060405180910390f35b34801561067557600080fd5b506106aa600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118b0565b6040518082815260200191505060405180910390f35b3480156106cc57600080fd5b506106d56118f8565b005b3480156106e357600080fd5b5061070c60048036038101908080359060200190929190803590602001909291905050506119fd565b005b34801561071a57600080fd5b506107396004803603810190808035906020019092919050505061213e565b005b34801561074757600080fd5b5061075061268f565b005b34801561075e57600080fd5b50610767612750565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107b557600080fd5b506107e2600480360381019080803590602001908201803590602001919091929391929390505050612776565b005b3480156107f057600080fd5b50610825600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129d2565b6040518082815260200191505060405180910390f35b34801561084757600080fd5b506108506129ea565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d757600080fd5b5061090c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a23565b604051808215151515815260200191505060405180910390f35b34801561093257600080fd5b5061095160048036038101908080359060200190929190505050612a43565b6040518082815260200191505060405180910390f35b34801561097357600080fd5b506109a0600480360381019080803590602001908201803590602001919091929391929390505050612c78565b005b3480156109ae57600080fd5b506109ed600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fa0565b604051808215151515815260200191505060405180910390f35b348015610a1357600080fd5b50610a6a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050612fd0565b005b348015610a7857600080fd5b50610aa16004803603810190808035906020019092919080359060200190929190505050612fd5565b005b348015610aaf57600080fd5b50610ae2600480360381019080803590602001909291908035906020019092919080359060200190929190505050613071565b005b348015610af057600080fd5b50610b2f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613089565b005b348015610b3d57600080fd5b50610b7c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506135b3565b604051808215151515815260200191505060405180910390f35b348015610ba257600080fd5b50610bf7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506135e3565b6040518082815260200191505060405180910390f35b348015610c1957600080fd5b50610c2261366a565b6040518082815260200191505060405180910390f35b348015610c4457600080fd5b50610c71600480360381019080803590602001908201803590602001919091929391929390505050613670565b005b348015610c7f57600080fd5b50610c88613a55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cd657600080fd5b50610d0b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a7b565b005b601260ff16600a0a6323c346000281565b6040805190810160405280600a81526020017f5452564c20546f6b656e0000000000000000000000000000000000000000000081525081565b6000600360149054906101000a900460ff16151515610d7557600080fd5b610d7f8383613b1b565b905092915050565b60095481565b6000806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491508382101515610de957610de484846119fd565b610e22565b6000821115610e1757610e058285613c0d90919063ffffffff16565b9050610e12828285613071565b610e21565b610e208461213e565b5b5b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e8657600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015610f2157600080fd5b505af1158015610f35573d6000803e3d6000fd5b505050506040513d6020811015610f4b57600080fd5b81019080805190602001909291905050509050610fab600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613c269092919063ffffffff16565b5050565b6000600154905090565b6000600360149054906101000a900460ff16151515610fd757600080fd5b610fe2848484613d14565b90509392505050565b600080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806110935750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611107576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d73672e73656e646572206973206e6f7420616e2061646d696e21000000000081525060200191505060405180910390fd5b6000848490501115156111a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f43616e6e6f742072656d6f766520616e20656d707479206c69737420746f207781526020017f686974656c69737421000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600091505b838390508210156112fe5783838381811015156111c657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112f3576000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fde8cf212af7ce38b2840785a2768d97ff2dbf3c21b516961cec0061e134c2a1e81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b8160010191506111ad565b50505050565b601281565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561136557600080fd5b600360149054906101000a900460ff16151561138057600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60056020528060005260406000206000915054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561144557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061162f5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d73672e73656e646572206973206e6f7420616e2061646d696e21000000000081525060200191505060405180910390fd5b8160088054905081101515611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f546865207265776172642070657263656e7461676520696e64657820646f657381526020017f206e6f742065786973742100000000000000000000000000000000000000000081525060400191505060405180910390fd5b81600a5481111515156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f7420686176652061207265776172642070657263656e746167652081526020017f67726561746572207468616e203130302521000000000000000000000000000081525060400191505060405180910390fd5b826008858154811015156117f757fe5b90600052602060002001819055507f05f4496f879690498b5e029b5e8e2382de819ac154cbf728f6ad317347921ff38484604051808381526020018281526020019250505060405180910390a150505050565b600360149054906101000a900460ff1681565b60088181548110151561186c57fe5b906000526020600020016000915090505481565b6000600360149054906101000a900460ff1615151561189e57600080fd5b6118a883836140ce565b905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561195457600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600082600081111515611a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f54686520616d6f756e742073706563696669656420697320302100000000000081525060200191505060405180910390fd5b8260088054905081101515611b1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f546865207265776172642070657263656e7461676520696e64657820646f657381526020017f206e6f742065786973742100000000000000000000000000000000000000000081525060400191505060405180910390fd5b84600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611bfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f5573657220646f6573206e6f74206861766520656e6f7567682072657761726481526020017f20746f6b656e732100000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611cd7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f5573657220646f6573206e6f74206861766520656e6f75676820726567756c6181526020017f7220746f6b656e7321000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3360001515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514151515611da1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f55736572206973206e6f742077686974656c697374656421000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff16151515611dbd57600080fd5b611e0e886000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e5a888861435f565b9550611eae86600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f4332d3aac8bbc1ec65700cf5d1235e2118fe56b06c41aaf3e9627fb19a39b1bf600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163388604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1612037611fc8878a613c0d90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61211f898c613c0d90919063ffffffff16565b6040518082815260200191505060405180910390a35050505050505050565b806000811115156121b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f54686520616d6f756e742073706563696669656420697320302100000000000081525060200191505060405180910390fd5b60008280600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515612297576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f5573657220646f6573206e6f74206861766520656e6f7567682072657761726481526020017f20746f6b656e732100000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515612373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f5573657220646f6573206e6f74206861766520656e6f75676820726567756c6181526020017f7220746f6b656e7321000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3360001515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415151561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f55736572206973206e6f742077686974656c697374656421000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff1615151561245957600080fd5b6124ab85600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125628560076000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b60076000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f4332d3aac8bbc1ec65700cf5d1235e2118fe56b06c41aaf3e9627fb19a39b1bf33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156126eb57600080fd5b600360149054906101000a900460ff1615151561270757600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127d557600080fd5b600084849050111515612876576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e6e6f742072656d6f766520616e20656d707479206c69737420746f206181526020017f646d696e7321000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600091505b838390508210156129cc57838383818110151561289457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156129c1576000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b81600101915061287b565b50505050565b60076020528060005260406000206000915090505481565b6040805190810160405280600481526020017f5452564c0000000000000000000000000000000000000000000000000000000081525081565b60066020528060005260406000206000915054906101000a900460ff1681565b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612aea5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d73672e73656e646572206973206e6f7420616e2061646d696e21000000000081525060200191505060405180910390fd5b81600a548111151515612bff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f7420686176652061207265776172642070657263656e746167652081526020017f67726561746572207468616e203130302521000000000000000000000000000081525060400191505060405180910390fd5b600880549050915060088390806001815401808255809150509060018203906000526020600020016000909192909190915055507f05f4496f879690498b5e029b5e8e2382de819ac154cbf728f6ad317347921ff38284604051808381526020018281526020019250505060405180910390a150919050565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cd757600080fd5b600084849050111515612d78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f43616e6e6f742061646420616e20656d707479206c69737420746f2061646d6981526020017f6e7321000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600091505b83839050821015612f9a578383838181101515612d9657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612e80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e6e6f742061646420746865207a65726f206164647265737320746f206181526020017f646d696e7321000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515612f8f576001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b816001019150612d7d565b50505050565b6000600360149054906101000a900460ff16151515612fbe57600080fd5b612fc88383614469565b905092915050565b600080fd5b600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915083821015156130315761302c8461213e565b61306b565b600082111561305f5761304d8285613c0d90919063ffffffff16565b905061305a818385613071565b61306a565b61306984846119fd565b5b5b50505050565b61307a8261213e565b61308483826119fd565b505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130e557600080fd5b8060008111151561315e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f54686520616d6f756e742073706563696669656420697320302100000000000081525060200191505060405180910390fd5b81600080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561323e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f5573657220646f6573206e6f74206861766520656e6f7567682072657761726481526020017f20746f6b656e732100000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561331a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f5573657220646f6573206e6f74206861766520656e6f75676820726567756c6181526020017f7220746f6b656e7321000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8460001515600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515156133e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f55736572206973206e6f742077686974656c697374656421000000000000000081525060200191505060405180910390fd5b613435856000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134c985600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f4332d3aac8bbc1ec65700cf5d1235e2118fe56b06c41aaf3e9627fb19a39b1bf338787604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050505050565b6000600360149054906101000a900460ff161515156135d157600080fd5b6135db8383614688565b905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137185750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561378c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6d73672e73656e646572206973206e6f7420616e2061646d696e21000000000081525060200191505060405180910390fd5b60008484905011151561382d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f43616e6e6f742061646420616e20656d707479206c69737420746f207768697481526020017f656c69737421000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600091505b83839050821015613a4f57838383818110151561384b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613935576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f43616e6e6f742061646420746865207a65726f206164647265737320746f207781526020017f686974656c69737421000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515613a44576001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f4790a4adb426ca2345bb5108f6e454eae852a7bf687544cd66a7270dff3a41d681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b816001019150613832565b50505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ad757600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000828211151515613c1b57fe5b818303905092915050565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613cc957600080fd5b505af1158015613cdd573d6000803e3d6000fd5b505050506040513d6020811015613cf357600080fd5b81019080805190602001909291905050501515613d0f57600080fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515613d5157600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515613d9e57600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515613e2957600080fd5b613e7a826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f0d826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613fde82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808311156141df576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614273565b6141f28382613c0d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008160088054905081101515614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f546865207265776172642070657263656e7461676520696e64657820646f657381526020017f206e6f742065786973742100000000000000000000000000000000000000000081525060400191505060405180910390fd5b614444600a5461443660088681548110151561441c57fe5b90600052602060002001548761488490919063ffffffff16565b6148bc90919063ffffffff16565b91505092915050565b6000818301905082811015151561446057fe5b80905092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156144a657600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156144f357600080fd5b614544826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145d7826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600061471982600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461444d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60008083141561489757600090506148b6565b81830290508183828115156148a857fe5b041415156148b257fe5b8090505b92915050565b600081838115156148c957fe5b049050929150505600a165627a7a72305820efed9ed6db8c31ddf4f8c355fcba182f5637fb9fb6bc544ebfe4822ab93c46d10029

Swarm Source

bzzr://efed9ed6db8c31ddf4f8c355fcba182f5637fb9fb6bc544ebfe4822ab93c46d1

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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