ETH Price: $1,921.26 (-5.37%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Approve237141602025-11-02 20:54:59116 days ago1762116899IN
BlockWRK: WRK Token
0 ETH0.00000450.18666433
Transfer222279242025-04-09 0:59:59324 days ago1744160399IN
BlockWRK: WRK Token
0 ETH0.000028730.50558497
Transfer221746922025-04-01 14:35:59332 days ago1743518159IN
BlockWRK: WRK Token
0 ETH0.000176013.09639081
Transfer210685542024-10-29 3:17:47486 days ago1730171867IN
BlockWRK: WRK Token
0 ETH0.0008076118.13038429
Transfer210685452024-10-29 3:15:59486 days ago1730171759IN
BlockWRK: WRK Token
0 ETH0.0007448816.72216036
Transfer210683422024-10-29 2:35:11486 days ago1730169311IN
BlockWRK: WRK Token
0 ETH0.0008241518.50172544
Transfer199970052024-06-01 12:35:59636 days ago1717245359IN
BlockWRK: WRK Token
0 ETH0.000359739.04846486
Transfer199166042024-05-21 6:50:11647 days ago1716274211IN
BlockWRK: WRK Token
0 ETH0.000498838.09367943
Transfer178015442023-07-29 22:01:47943 days ago1690668107IN
BlockWRK: WRK Token
0 ETH0.0011629326.1
Transfer176489722023-07-08 12:14:23965 days ago1688818463IN
BlockWRK: WRK Token
0 ETH0.0008874322.32831861
Transfer176489712023-07-08 12:14:11965 days ago1688818451IN
BlockWRK: WRK Token
0 ETH0.0008532621.46193909
Transfer176489712023-07-08 12:14:11965 days ago1688818451IN
BlockWRK: WRK Token
0 ETH0.0008532621.46193909
Transfer176489712023-07-08 12:14:11965 days ago1688818451IN
BlockWRK: WRK Token
0 ETH0.0008532621.46193909
Transfer176489712023-07-08 12:14:11965 days ago1688818451IN
BlockWRK: WRK Token
0 ETH0.00085321.46193909
Transfer176489712023-07-08 12:14:11965 days ago1688818451IN
BlockWRK: WRK Token
0 ETH0.0008532621.46193909
Transfer176489712023-07-08 12:14:11965 days ago1688818451IN
BlockWRK: WRK Token
0 ETH0.0008532621.46193909
Transfer176489292023-07-08 12:05:35965 days ago1688817935IN
BlockWRK: WRK Token
0 ETH0.0008963222.54504358
Transfer176489292023-07-08 12:05:35965 days ago1688817935IN
BlockWRK: WRK Token
0 ETH0.0008963222.54504358
Transfer176489282023-07-08 12:05:23965 days ago1688817923IN
BlockWRK: WRK Token
0 ETH0.0009102222.89463254
Transfer176367382023-07-06 19:00:23967 days ago1688670023IN
BlockWRK: WRK Token
0 ETH0.00794503128.85863618
Transfer175919172023-06-30 11:52:47973 days ago1688125967IN
BlockWRK: WRK Token
0 ETH0.0019712331.97713707
Transfer175674522023-06-27 1:29:11976 days ago1687829351IN
BlockWRK: WRK Token
0 ETH0.0008589913.93177688
Transfer174726022023-06-13 17:37:35990 days ago1686677855IN
BlockWRK: WRK Token
0 ETH0.000824318.5
Transfer170921052023-04-21 3:28:471043 days ago1682047727IN
BlockWRK: WRK Token
0 ETH0.0017913345.05701774
Transfer170902732023-04-20 21:15:471043 days ago1682025347IN
BlockWRK: WRK Token
0 ETH0.0033835275.91666242
View all transactions

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-79131722019-06-07 16:46:052457 days ago1559925965
BlockWRK: WRK Token
119.98 ETH
-77810722019-05-18 0:56:412477 days ago1558141001
BlockWRK: WRK Token
108.4303 ETH
-77807602019-05-17 23:46:242477 days ago1558136784
BlockWRK: WRK Token
100.001 ETH
-77603082019-05-14 19:17:512481 days ago1557861471
BlockWRK: WRK Token
22.78441831 ETH
-77602802019-05-14 19:12:262481 days ago1557861146
BlockWRK: WRK Token
4.84671897 ETH
-77599602019-05-14 18:05:302481 days ago1557857130
BlockWRK: WRK Token
0.1 ETH
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:
BlockWRKICO

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Audited
/**
 *Submitted for verification at Etherscan.io on 2019-05-14
*/

// File: openzeppelin-solidity\contracts\token\ERC20\ERC20Basic.sol

pragma solidity 0.4.24;


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

// File: openzeppelin-solidity\contracts\token\ERC20\ERC20.sol

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

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

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

// File: contracts\ERC865Basic.sol

/**
 * @title ERC865Basic
 * @dev Simpler version of the ERC865 interface from https://github.com/adilharis2001/ERC865Demo
 * @author jsdavis28
 * @notice ERC865Token allows for users to pay gas costs to a delegate in an ERC20 token
 * https://github.com/ethereum/EIPs/issues/865
 */
 contract ERC865Basic is ERC20 {
     function _transferPreSigned(
         bytes _signature,
         address _from,
         address _to,
         uint256 _value,
         uint256 _fee,
         uint256 _nonce
     )
        internal;

     event TransferPreSigned(
         address indexed delegate,
         address indexed from,
         address indexed to,
         uint256 value);
}

// File: openzeppelin-solidity\contracts\math\SafeMath.sol

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

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 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;
  }
}

// File: openzeppelin-solidity\contracts\token\ERC20\BasicToken.sol

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

  mapping(address => uint256) internal balances;

  uint256 internal 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(_value <= balances[msg.sender]);
    require(_to != address(0));

    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];
  }

}

// File: openzeppelin-solidity\contracts\token\ERC20\StandardToken.sol

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/issues/20
 * 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(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);
    require(_to != address(0));

    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,
    uint256 _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,
    uint256 _subtractedValue
  )
    public
    returns (bool)
  {
    uint256 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;
  }

}

// File: contracts\ERC865BasicToken.sol

/**
 * @title ERC865BasicToken
 * @dev Simpler version of the ERC865 token from https://github.com/adilharis2001/ERC865Demo
 * @author jsdavis28
 * @notice ERC865Token allows for users to pay gas costs to a delegate in an ERC20 token
 * https://github.com/ethereum/EIPs/issues/865
 */

 contract ERC865BasicToken is ERC865Basic, StandardToken {
    /**
     * @dev Sets internal variables for contract
     */
    address internal feeAccount;
    mapping(bytes => bool) internal signatures;

    /**
     * @dev Allows a delegate to submit a transaction on behalf of the token holder.
     * @param _signature The signature, issued by the token holder.
     * @param _to The recipient's address.
     * @param _value The amount of tokens to be transferred.
     * @param _fee The amount of tokens paid to the delegate for gas costs.
     * @param _nonce The transaction number.
     */
    function _transferPreSigned(
        bytes _signature,
        address _from,
        address _to,
        uint256 _value,
        uint256 _fee,
        uint256 _nonce
    )
        internal
    {
        //Pre-validate transaction
        require(_to != address(0));
        require(signatures[_signature] == false);

        //Create a hash of the transaction details
        bytes32 hashedTx = _transferPreSignedHashing(_to, _value, _fee, _nonce);

        //Obtain the token holder's address and check balance
        address from = _recover(hashedTx, _signature);
        require(from == _from);
        uint256 total = _value.add(_fee);
        require(total <= balances[from]);

        //Transfer tokens
        balances[from] = balances[from].sub(_value).sub(_fee);
        balances[_to] = balances[_to].add(_value);
        balances[feeAccount] = balances[feeAccount].add(_fee);

        //Mark transaction as completed
        signatures[_signature] = true;

        //TransferPreSigned ERC865 events
        emit TransferPreSigned(msg.sender, from, _to, _value);
        emit TransferPreSigned(msg.sender, from, feeAccount, _fee);
        
        //Transfer ERC20 events
        emit Transfer(from, _to, _value);
        emit Transfer(from, feeAccount, _fee);
    }

    /**
     * @dev Creates a hash of the transaction information passed to transferPresigned.
     * @param _to address The address which you want to transfer to.
     * @param _value uint256 The amount of tokens to be transferred.
     * @param _fee uint256 The amount of tokens paid to msg.sender, by the owner.
     * @param _nonce uint256 Presigned transaction number.
     * @return A copy of the hashed message signed by the token holder, with prefix added.
     */
    function _transferPreSignedHashing(
        address _to,
        uint256 _value,
        uint256 _fee,
        uint256 _nonce
    )
        internal pure
        returns (bytes32)
    {
        //Create a copy of the hashed message signed by the token holder
        bytes32 hash = keccak256(abi.encodePacked(_to, _value, _fee,_nonce));

        //Add prefix to hash
        return _prefix(hash);
    }

    /**
     * @dev Adds prefix to the hashed message signed by the token holder.
     * @param _hash The hashed message (keccak256) to be prefixed.
     * @return Prefixed hashed message to return from _transferPreSignedHashing.
     */
    function _prefix(bytes32 _hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash));
    }

    /**
     * @dev Validate the transaction information and recover the token holder's address.
     * @param _hash A prefixed version of the hash used in the original signed message.
     * @param _sig The signature submitted by the token holder.
     * @return The token holder/transaction signer's address.
     */
    function _recover(bytes32 _hash, bytes _sig) internal pure returns (address) {
        bytes32 r;
        bytes32 s;
        uint8 v;

        //Check the signature length
        if (_sig.length != 65) {
            return (address(0));
        }

        //Split the signature into r, s and v variables
        assembly {
            r := mload(add(_sig, 32))
            s := mload(add(_sig, 64))
            v := byte(0, mload(add(_sig, 96)))
        }

        //Version of signature should be 27 or 28, but 0 and 1 are also possible
        if (v < 27) {
            v += 27;
        }

        //If the version is correct, return the signer address
        if (v != 27 && v != 28) {
            return (address(0));
        } else {
            return ecrecover(_hash, v, r, s);
        }
    }
}

// File: contracts\TaxedToken.sol

/**
 * @title Taxed token
 * @dev Version of BasicToken that allows for a fee on token transfers.
 * See https://github.com/OpenZeppelin/openzeppelin-solidity/pull/788
 * @author jsdavis28
 */
contract TaxedToken is ERC865BasicToken {
    /**
     * @dev Sets taxRate fee as public
     */
    uint8 public taxRate;

    /**
     * @dev Transfer tokens to a specified account after diverting a fee to a central account.
     * @param _to The receiving address.
     * @param _value The number of tokens to transfer.
     */
    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);
        uint256 fee = _value.mul(taxRate).div(100);
        uint256 taxedValue = _value.sub(fee);

        balances[_to] = balances[_to].add(taxedValue);
        emit Transfer(msg.sender, _to, taxedValue);
        balances[feeAccount] = balances[feeAccount].add(fee);
        emit Transfer(msg.sender, feeAccount, fee);

        return true;
    }

    /**
     * @dev Provides a taxed transfer on StandardToken's transferFrom() function
     * @param _from The address providing allowance to spend
     * @param _to The receiving address.
     * @param _value The number of tokens to transfer.
     */
    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);
        uint256 fee = _value.mul(taxRate).div(100);
        uint256 taxedValue = _value.sub(fee);

        balances[_to] = balances[_to].add(taxedValue);
        emit Transfer(_from, _to, taxedValue);
        balances[feeAccount] = balances[feeAccount].add(fee);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, feeAccount, fee);

        return true;
    }
}

// File: openzeppelin-solidity\contracts\ownership\Ownable.sol

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


  event 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.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  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;
  }
}

// File: contracts\Authorizable.sol

/**
 * @title Authorizable
 * @dev The Authorizable contract allows the owner to set a number of additional
 *  acccounts with limited administrative privileges to simplify user permissions.
 * Only the contract owner can add or remove authorized accounts.
 * @author jsdavis28
 */
contract Authorizable is Ownable {
    using SafeMath for uint256;

    address[] public authorized;
    mapping(address => bool) internal authorizedIndex;
    uint8 public numAuthorized;

    /**
     * @dev The Authorizable constructor sets the owner as authorized
     */
    constructor() public {
        authorized.length = 2;
        authorized[1] = msg.sender;
        authorizedIndex[msg.sender] = true;
        numAuthorized = 1;
    }

    /**
     * @dev Throws if called by any account other than an authorized account.
     */
    modifier onlyAuthorized {
        require(isAuthorized(msg.sender));
        _;
    }

    /**
     * @dev Allows the current owner to add an authorized account.
     * @param _account The address being added as authorized.
     */
    function addAuthorized(address _account) public onlyOwner {
        if (authorizedIndex[_account] == false) {
        	authorizedIndex[_account] = true;
        	authorized.length++;
        	authorized[authorized.length.sub(1)] = _account;
        	numAuthorized++;
        }
    }

    /**
     * @dev Validates whether an account is authorized for enhanced permissions.
     * @param _account The address being evaluated.
     */
    function isAuthorized(address _account) public constant returns (bool) {
        if (authorizedIndex[_account] == true) {
        	return true;
        }

        return false;
    }

    /**
     * @dev Allows the current owner to remove an authorized account.
     * @param _account The address to remove from authorized.
     */
    function removeAuthorized(address _account) public onlyOwner {
        require(isAuthorized(_account)); 
        authorizedIndex[_account] = false;
        numAuthorized--;
    }
}

// File: contracts\BlockWRKToken.sol

/**
 * @title BlockWRKToken
 * @dev BlockWRKToken contains administrative features that allow the BlockWRK
 *  application to interface with the BlockWRK token, an ERC20-compliant token
 *  that integrates taxed token and ERC865 functionality.
 * @author jsdavis28
 */

contract BlockWRKToken is TaxedToken, Authorizable {
    /**
     * @dev Sets token information.
     */
    string public name = "BlockWRK";
    string public symbol = "WRK";
    uint8 public decimals = 4;
    uint256 public INITIAL_SUPPLY;

    /**
     * @dev Sets public variables for BlockWRK token.
     */
    address public distributionPoolWallet;
    address public inAppPurchaseWallet;
    address public reservedTokenWallet;
    uint256 public premineDistributionPool;
    uint256 public premineReserved;

    /**
     * @dev Sets private variables for custom token functions.
     */
    uint256 internal decimalValue = 10000;

    constructor() public {
        feeAccount = 0xeCced56A201d1A6D1Da31A060868F96ACdba99B3;
        distributionPoolWallet = 0xAB3Edd46E9D52e1b3131757e1Ed87FA885f48019;
        inAppPurchaseWallet = 0x97eae8151487e054112E27D8c2eE5f17B3C6A83c;
        reservedTokenWallet = 0xd6E4E287a4aE2E9d8BF7f0323f440acC0d5AD301;
        premineDistributionPool = decimalValue.mul(5600000000);
        premineReserved = decimalValue.mul(2000000000);
        INITIAL_SUPPLY = premineDistributionPool.add(premineReserved);
        balances[distributionPoolWallet] = premineDistributionPool;
        emit Transfer(address(this), distributionPoolWallet, premineDistributionPool);
        balances[reservedTokenWallet] = premineReserved;
        emit Transfer(address(this), reservedTokenWallet, premineReserved);
        totalSupply_ = INITIAL_SUPPLY;
        taxRate = 2;
    }

    /**
     * @dev Allows App to distribute WRK tokens to users.
     * This function will be called by authorized from within the App.
     * @param _to The recipient's BlockWRK address.
     * @param _value The amount of WRK to transfer.
     */
    function inAppTokenDistribution(
        address _to,
        uint256 _value
    )
        public
        onlyAuthorized
    {
        require(_value <= balances[distributionPoolWallet]);
        require(_to != address(0));

        balances[distributionPoolWallet] = balances[distributionPoolWallet].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(distributionPoolWallet, _to, _value);
    }

    /**
     * @dev Allows App to process fiat payments for WRK tokens, charging a fee in WRK.
     * This function will be called by authorized from within the App.
     * @param _to The buyer's BlockWRK address.
     * @param _value The amount of WRK to transfer.
     * @param _fee The fee charged in WRK for token purchase.
     */
    function inAppTokenPurchase(
        address _to,
        uint256 _value,
        uint256 _fee
    )
        public
        onlyAuthorized
    {
        require(_value <= balances[inAppPurchaseWallet]);
        require(_to != address(0));

        balances[inAppPurchaseWallet] = balances[inAppPurchaseWallet].sub(_value);
        uint256 netAmount = _value.sub(_fee);
        balances[_to] = balances[_to].add(netAmount);
        emit Transfer(inAppPurchaseWallet, _to, netAmount);
        balances[feeAccount] = balances[feeAccount].add(_fee);
        emit Transfer(inAppPurchaseWallet, feeAccount, _fee);
    }

    /**
     * @dev Allows owner to set the percentage fee charged by TaxedToken on external transfers.
     * @param _newRate The amount to be set.
     */
    function setTaxRate(uint8 _newRate) public onlyOwner {
        taxRate = _newRate;
    }

    /**
     * @dev Allows owner to set the fee account to receive transfer fees.
     * @param _newAddress The address to be set.
     */
    function setFeeAccount(address _newAddress) public onlyOwner {
        require(_newAddress != address(0));
        feeAccount = _newAddress;
    }

    /**
     * @dev Allows owner to set the wallet that holds WRK for sale via in-app purchases with fiat.
     * @param _newAddress The address to be set.
     */
    function setInAppPurchaseWallet(address _newAddress) public onlyOwner {
        require(_newAddress != address(0));
        inAppPurchaseWallet = _newAddress;
    }

    /**
     * @dev Allows authorized to act as a delegate to transfer a pre-signed transaction for ERC865
     * @param _signature The pre-signed message.
     * @param _from The token sender.
     * @param _to The token recipient.
     * @param _value The amount of WRK to send the recipient.
     * @param _fee The fee to be paid in WRK (calculated by App off-chain).
     * @param _nonce The transaction number (stored in App off-chain).
     */
    function transactionHandler(
        bytes _signature,
        address _from,
        address _to,
        uint256 _value,
        uint256 _fee,
        uint256 _nonce
    )
        public
        onlyAuthorized
    {
        _transferPreSigned(_signature, _from, _to, _value, _fee, _nonce);
    }
}

// File: contracts\BlockWRKICO.sol

/**
 * @title BlockWRKICO
 * @notice This contract manages the sale of WRK tokens for the BlockWRK ICO.
 * @dev This contract incorporates elements of OpenZeppelin crowdsale contracts with some modifications.
 * @author jsdavis28
 */
 contract BlockWRKICO is BlockWRKToken {
    /**
     * @dev Sets public variables for BlockWRK ICO
     */
    address public salesWallet;
    uint256 public cap;
    uint256 public closingTime;
    uint256 public currentTierRate;
    uint256 public openingTime;
    uint256 public weiRaised;

    /**
     * @dev Sets private variables for custom token functions.
     */
     uint256 internal availableInCurrentTier;
     uint256 internal availableInSale;
     uint256 internal totalPremineVolume;
     uint256 internal totalSaleVolume;
     uint256 internal totalTokenVolume;
     uint256 internal tier1Rate;
     uint256 internal tier2Rate;
     uint256 internal tier3Rate;
     uint256 internal tier4Rate;
     uint256 internal tier5Rate;
     uint256 internal tier6Rate;
     uint256 internal tier7Rate;
     uint256 internal tier8Rate;
     uint256 internal tier9Rate;
     uint256 internal tier10Rate;
     uint256 internal tier1Volume;
     uint256 internal tier2Volume;
     uint256 internal tier3Volume;
     uint256 internal tier4Volume;
     uint256 internal tier5Volume;
     uint256 internal tier6Volume;
     uint256 internal tier7Volume;
     uint256 internal tier8Volume;
     uint256 internal tier9Volume;
     uint256 internal tier10Volume;

     constructor() public {
         cap = 9999999999999999999999999999999999999999999999;
         salesWallet = 0xA0E021fC3538ed52F9a3D79249ff1D3A67f91C42;
         openingTime = 1557856800;
         closingTime = 1589479200;

         totalPremineVolume = 76000000000000;
         totalSaleVolume = 43000000000000;
         totalTokenVolume = 119000000000000;
         availableInSale = totalSaleVolume;
         tier1Rate = 100000;
         tier2Rate = 10000;
         tier3Rate = 2000;
         tier4Rate = 1250;
         tier5Rate = 625;
         tier6Rate = 312;
         tier7Rate = 156;
         tier8Rate = 117;
         tier9Rate = 104;
         tier10Rate = 100;
         tier1Volume = totalPremineVolume.add(1000000000000);
         tier2Volume = tier1Volume.add(2000000000000);
         tier3Volume = tier2Volume.add(5000000000000);
         tier4Volume = tier3Volume.add(5000000000000);
         tier5Volume = tier4Volume.add(5000000000000);
         tier6Volume = tier5Volume.add(5000000000000);
         tier7Volume = tier6Volume.add(5000000000000);
         tier8Volume = tier7Volume.add(5000000000000);
         tier9Volume = tier8Volume.add(5000000000000);
         tier10Volume = tier9Volume.add(5000000000000);
     }

    /**
     * Event for token purchase logging
     * @param purchaser who paid for the tokens
     * @param beneficiary who got the tokens
     * @param value weis paid for purchase
     * @param amount amount of tokens purchased
     */
    event TokenPurchase(
        address indexed purchaser,
        address indexed beneficiary,
        uint256 value,
        uint256 amount
    );

    /**
     * Event marking the transfer of any remaining WRK to the distribution pool post-ICO
     * @param wallet The address remaining sale tokens are delivered
     * @param amount The remaining tokens after the sale has closed
     */
     event CloseoutSale(address indexed wallet, uint256 amount);



    // -----------------------------------------
    // Crowdsale external interface
    // -----------------------------------------

    /**
     * @dev fallback function
     */
    function () external payable {
      buyTokens(msg.sender);
    }

    /**
     * @dev Allows ICO participants to purchase WRK tokens
     * @param _beneficiary The address of the ICO participant
     */
    function buyTokens(address _beneficiary) public payable {
      uint256 weiAmount = msg.value;
      _preValidatePurchase(_beneficiary, weiAmount);

      //Calculate number of tokens to issue
      uint256 tokens = _calculateTokens(weiAmount);

      //Calculate new amount of Wei raised
      weiRaised = weiRaised.add(weiAmount);

      //Process token purchase and forward funcds to salesWallet
      _processPurchase(_beneficiary, tokens);
      _forwardFunds();
      emit TokenPurchase(msg.sender, _beneficiary, weiAmount, tokens);
    }

    /**
     * @dev Checks whether the cap has been reached.
     * @return Whether the cap was reached
     */
    function capReached() public view returns (bool) {
      return weiRaised >= cap;
    }

     /**
      * @dev Checks whether the period in which the crowdsale is open has already elapsed.
      * @return Whether crowdsale period has elapsed
      */
     function hasClosed() public view returns (bool) {
         // solium-disable-next-line security/no-block-members
         return block.timestamp > closingTime;
     }



    // -----------------------------------------
    // Internal interface (extensible)
    // -----------------------------------------

    /**
     * @dev Calculates total number of tokens to sell, accounting for varied rates per tier.
     * @param _amountWei Total amount of Wei sent by ICO participant
     * @return Total number of tokens to send to buyer
     */
    function _calculateTokens(uint256 _amountWei) internal returns (uint256) {
        //Tokens pending in sale
        uint256 tokenAmountPending;

        //Tokens to be sold
        uint256 tokenAmountToIssue;

        //Note: tierCaps must take into account reserved and distribution pool tokens
        //Determine tokens remaining in tier and set current token rate
        uint256 tokensRemainingInTier = _getRemainingTokens(totalSupply_);

        //Calculate new tokens pending sale
        uint256 newTokens = _getTokenAmount(_amountWei);

        //Check if _newTokens exceeds _tokensRemainingInTier
        bool nextTier = true;
        while (nextTier) {
            if (newTokens > tokensRemainingInTier) {
                //Get tokens sold in current tier and add to pending total supply
                tokenAmountPending = tokensRemainingInTier;
                uint256 newTotal = totalSupply_.add(tokenAmountPending);

                //Save number of tokens pending from current tier
                tokenAmountToIssue = tokenAmountToIssue.add(tokenAmountPending);

                //Calculate Wei spent in current tier and set remaining Wei for next tier
                uint256 pendingAmountWei = tokenAmountPending.div(currentTierRate);
                uint256 remainingWei = _amountWei.sub(pendingAmountWei);

                //Calculate number of tokens in next tier
                tokensRemainingInTier = _getRemainingTokens(newTotal);
                newTokens = _getTokenAmount(remainingWei);
            } else {
                tokenAmountToIssue = tokenAmountToIssue.add(newTokens);
                nextTier = false;
                _setAvailableInCurrentTier(tokensRemainingInTier, newTokens);
                _setAvailableInSale(newTokens);
            }
        }

        //Return amount of tokens to be issued in this sale
        return tokenAmountToIssue;
    }

    /**
     * @dev Source of tokens.
     * @param _beneficiary Address performing the token purchase
     * @param _tokenAmount Number of tokens to be emitted
     */
    function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal {
        totalSupply_ = totalSupply_.add(_tokenAmount);
        balances[_beneficiary] = balances[_beneficiary].add(_tokenAmount);
    }

    /**
     * @dev Determines how ETH is stored/forwarded on purchases.
     */
    function _forwardFunds() internal {
        salesWallet.transfer(msg.value);
    }

    /**
     * @dev Performs a binary search of the sale tiers to determine current sales volume and rate.
     * @param _tokensSold The total number of tokens sold in the ICO prior to this tx
     * @return The remaining number of tokens for sale in the current sale tier
     */
    function _getRemainingTokens(uint256 _tokensSold) internal returns (uint256) {
        //Deteremine the current sale tier, set current rate and find remaining tokens in tier
        uint256 remaining;
        if (_tokensSold < tier5Volume) {
            if (_tokensSold < tier3Volume) {
                if (_tokensSold < tier1Volume) {
                    _setCurrentTierRate(tier1Rate);
                    remaining = tier1Volume.sub(_tokensSold);
                } else if (_tokensSold < tier2Volume) {
                    _setCurrentTierRate(tier2Rate);
                    remaining = tier2Volume.sub(_tokensSold);
                } else {
                    _setCurrentTierRate(tier3Rate);
                    remaining = tier3Volume.sub(_tokensSold);
                }
            } else {
                if (_tokensSold < tier4Volume) {
                    _setCurrentTierRate(tier4Rate);
                    remaining = tier4Volume.sub(_tokensSold);
                } else {
                    _setCurrentTierRate(tier5Rate);
                    remaining = tier5Volume.sub(_tokensSold);
                }
            }
        } else {
            if (_tokensSold < tier8Volume) {
                if (_tokensSold < tier6Volume) {
                    _setCurrentTierRate(tier6Rate);
                    remaining = tier6Volume.sub(_tokensSold);
                } else if (_tokensSold < tier7Volume) {
                    _setCurrentTierRate(tier7Rate);
                    remaining = tier7Volume.sub(_tokensSold);
                } else {
                    _setCurrentTierRate(tier8Rate);
                    remaining = tier8Volume.sub(_tokensSold);
                }
            } else {
                if (_tokensSold < tier9Volume) {
                    _setCurrentTierRate(tier9Rate);
                    remaining = tier9Volume.sub(_tokensSold);
                } else {
                    _setCurrentTierRate(tier10Rate);
                    remaining = tier10Volume.sub(_tokensSold);
                }
            }
        }

        return remaining;
    }

    /**
     * @dev Override to extend the way in which ether is converted to tokens.
     * @param _weiAmount Value in wei to be converted into tokens
     * @return Number of tokens that can be purchased with the specified _weiAmount
     */
    function _getTokenAmount(uint256 _weiAmount) internal view returns (uint256) {
        return _weiAmount.mul(currentTierRate).mul(decimalValue).div(1 ether);
    }

    /**
     * @dev Validation of an incoming purchase.
     * @param _beneficiary Address performing the token purchase
     * @param _weiAmount Value in wei involved in the purchase
     */
    function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal view {
        require(_beneficiary != address(0));
        require(_weiAmount != 0);
        require(weiRaised.add(_weiAmount) <= cap);
        // solium-disable-next-line security/no-block-members
        require(block.timestamp >= openingTime && block.timestamp <= closingTime);
    }

    /**
     * @dev Executed when a purchase has been validated and is ready to be executed. Not necessarily emits/sends tokens.
     * @param _beneficiary Address receiving the tokens
     * @param _tokenAmount Number of tokens to be purchased
     */
    function _processPurchase(address _beneficiary, uint256 _tokenAmount) internal {
        _deliverTokens(_beneficiary, _tokenAmount);
    }

    /**
     * @dev Calculates remaining tokens available in the current tier after a sale is processed
     * @param _tierPreviousRemaining Number of tokens remaining prior to sale
     * @param _newIssue Number of tokens to be purchased
     */
    function _setAvailableInCurrentTier(uint256 _tierPreviousRemaining, uint256 _newIssue) internal {
        availableInCurrentTier = _tierPreviousRemaining.sub(_newIssue);
    }

    /**
     * @dev Calculates remaining tokens available in the ICO after a sale is processed
     * @param _newIssue Number of tokens to be purchased
     */
    function _setAvailableInSale(uint256 _newIssue) internal {
        availableInSale = totalSaleVolume.sub(_newIssue);
    }

    /**
     * @dev Sets the current tier rate based on sale volume
     * @param _rate The new rate
     */
    function _setCurrentTierRate(uint256 _rate) internal {
        currentTierRate = _rate;
    }

    /**
     * @dev Returns the remaining number of tokens for sale
     * @return Total remaining tokens available for sale
     */
    function tokensRemainingInSale() public view returns (uint256) {
        return availableInSale;
    }

    /**
     * @dev Returns the remaining number of tokens for sale in the current tier
     * @return Total remaining tokens available for sale in the current tier
     */
    function tokensRemainingInTier() public view returns (uint256) {
        return availableInCurrentTier;
    }

    /**
     * @dev Allows the owner to transfer any remaining tokens not sold to a wallet
     * @return Total remaining tokens available for sale
     */
     function transferRemainingTokens() public onlyOwner {
         //require that sale is closed
         require(hasClosed());

         //require that tokens are still remaining after close
         require(availableInSale > 0);

         //send remaining tokens to distribution pool wallet
         balances[distributionPoolWallet] = balances[distributionPoolWallet].add(availableInSale);
         emit CloseoutSale(distributionPoolWallet, availableInSale);
     }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"premineReserved","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":"","type":"uint256"}],"name":"authorized","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasClosed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint256"}],"name":"inAppTokenPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentTierRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"removeAuthorized","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setFeeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"closingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"capReached","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensRemainingInSale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"transferRemainingTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRate","type":"uint8"}],"name":"setTaxRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"inAppTokenDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"taxRate","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setInAppPurchaseWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reservedTokenWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"premineDistributionPool","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"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":"numAuthorized","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","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":true,"inputs":[],"name":"openingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"addAuthorized","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_signature","type":"bytes"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_nonce","type":"uint256"}],"name":"transactionHandler","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","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":"inAppPurchaseWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"distributionPoolWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"salesWallet","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"},{"constant":true,"inputs":[],"name":"tokensRemainingInTier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"isAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"wallet","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"CloseoutSale","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":"delegate","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"TransferPreSigned","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"}]

60806040526040805190810160405280600881526020017f426c6f636b57524b00000000000000000000000000000000000000000000000081525060099080519060200190620000519291906200092b565b506040805190810160405280600381526020017f57524b0000000000000000000000000000000000000000000000000000000000815250600a90805190602001906200009f9291906200092b565b506004600b60006101000a81548160ff021916908360ff160217905550612710601255348015620000cf57600080fd5b5033600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600681620001229190620009b2565b5033600660018154811015156200013557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860006101000a81548160ff021916908360ff16021790555073ecced56a201d1a6d1da31a060868f96acdba99b3600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ab3edd46e9d52e1b3131757e1ed87fa885f48019600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507397eae8151487e054112e27d8c2ee5f17b3c6a83c600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d6e4e287a4ae2e9d8bf7f0323f440acc0d5ad301600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200036f64014dc93800601254620008d264010000000002620033dd179091906401000000009004565b6010819055506200039e6377359400601254620008d264010000000002620033dd179091906401000000009004565b601181905550620003cb6011546010546200090e640100000000026200332f179091906401000000009004565b600c81905550601054600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6010546040518082815260200191505060405180910390a3601154600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6011546040518082815260200191505060405180910390a3600c546001819055506002600560006101000a81548160ff021916908360ff1602179055507301c06a5ec5433c60ddaa16406f5a3fffffffffff60148190555073a0e021fc3538ed52f9a3d79249ff1d3a67f91c42601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550635cdb0220601781905550635ebd872060158190555065451f2100c000601b8190555065271bb7b9b000601c81905550656c3ad8ba7000601d81905550601c54601a81905550620186a0601e81905550612710601f819055506107d06020819055506104e2602181905550610271602281905550610138602381905550609c6024819055506075602581905550606860268190555060646027819055506200070d64e8d4a51000601b546200090e640100000000026200332f179091906401000000009004565b6028819055506200073e6501d1a94a20006028546200090e640100000000026200332f179091906401000000009004565b6029819055506200076f65048c273950006029546200090e640100000000026200332f179091906401000000009004565b602a81905550620007a065048c27395000602a546200090e640100000000026200332f179091906401000000009004565b602b81905550620007d165048c27395000602b546200090e640100000000026200332f179091906401000000009004565b602c819055506200080265048c27395000602c546200090e640100000000026200332f179091906401000000009004565b602d819055506200083365048c27395000602d546200090e640100000000026200332f179091906401000000009004565b602e819055506200086465048c27395000602e546200090e640100000000026200332f179091906401000000009004565b602f819055506200089565048c27395000602f546200090e640100000000026200332f179091906401000000009004565b603081905550620008c665048c273950006030546200090e640100000000026200332f179091906401000000009004565b60318190555062000a09565b600080831415620008e7576000905062000908565b8183029050818382811515620008f957fe5b041415156200090457fe5b8090505b92915050565b600081830190508281101515156200092257fe5b80905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200096e57805160ff19168380011785556200099f565b828001600101855582156200099f579182015b828111156200099e57825182559160200191906001019062000981565b5b509050620009ae9190620009e1565b5090565b815481835581811115620009dc57818360005260206000209182019101620009db9190620009e1565b5b505050565b62000a0691905b8082111562000a02576000816000905550600101620009e8565b5090565b90565b61419d8062000a196000396000f30060806040526004361061021a576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305f7939a1461022557806306fdde0314610250578063095ea7b3146102e05780630d48669a146103455780631515bc2b146103b257806318160ddd146103e15780631bfd816b1461040c57806323b872dd146104635780632ff2e9dc146104e8578063313ce56714610513578063355274ea14610544578063379b4ed01461056f5780634042b66f1461059a578063485d7d94146105c55780634b023cf8146106085780634b6753bc1461064b5780634f935945146106765780635946748c146106a557806363cc4aa2146106d057806366188463146106e75780636c791e041461074c578063705388631461077c57806370a08231146107c9578063715018a614610820578063771a3a1d146108375780637b5f4f5b146108685780637dd6ab72146108ab578063819d95c1146109025780638da5cb5b1461092d57806395d89b4114610984578063a31f898214610a14578063a9059cbb14610a45578063b7a8807c14610aaa578063cf1c316a14610ad5578063d6d2229114610b18578063d73dd62314610bdf578063dd62ed3e14610c44578063e3175c4d14610cbb578063e5ee34a214610d12578063ec8ac4d814610d69578063edf4d84714610d9f578063f2fde38b14610df6578063f4dab3ff14610e39578063fe9fbb8014610e64575b61022333610ebf565b005b34801561023157600080fd5b5061023a610f79565b6040518082815260200191505060405180910390f35b34801561025c57600080fd5b50610265610f7f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a557808201518184015260208101905061028a565b50505050905090810190601f1680156102d25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ec57600080fd5b5061032b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061101d565b604051808215151515815260200191505060405180910390f35b34801561035157600080fd5b506103706004803603810190808035906020019092919050505061110f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103be57600080fd5b506103c761114d565b604051808215151515815260200191505060405180910390f35b3480156103ed57600080fd5b506103f6611159565b6040518082815260200191505060405180910390f35b34801561041857600080fd5b50610461600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611163565b005b34801561046f57600080fd5b506104ce600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115b0565b604051808215151515815260200191505060405180910390f35b3480156104f457600080fd5b506104fd611b1c565b6040518082815260200191505060405180910390f35b34801561051f57600080fd5b50610528611b22565b604051808260ff1660ff16815260200191505060405180910390f35b34801561055057600080fd5b50610559611b35565b6040518082815260200191505060405180910390f35b34801561057b57600080fd5b50610584611b3b565b6040518082815260200191505060405180910390f35b3480156105a657600080fd5b506105af611b41565b6040518082815260200191505060405180910390f35b3480156105d157600080fd5b50610606600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b47565b005b34801561061457600080fd5b50610649600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c45565b005b34801561065757600080fd5b50610660611d21565b6040518082815260200191505060405180910390f35b34801561068257600080fd5b5061068b611d27565b604051808215151515815260200191505060405180910390f35b3480156106b157600080fd5b506106ba611d36565b6040518082815260200191505060405180910390f35b3480156106dc57600080fd5b506106e5611d40565b005b3480156106f357600080fd5b50610732600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f0d565b604051808215151515815260200191505060405180910390f35b34801561075857600080fd5b5061077a600480360381019080803560ff16906020019092919050505061219f565b005b34801561078857600080fd5b506107c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612219565b005b3480156107d557600080fd5b5061080a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124cd565b6040518082815260200191505060405180910390f35b34801561082c57600080fd5b50610835612515565b005b34801561084357600080fd5b5061084c61261a565b604051808260ff1660ff16815260200191505060405180910390f35b34801561087457600080fd5b506108a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061262d565b005b3480156108b757600080fd5b506108c0612709565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090e57600080fd5b5061091761272f565b6040518082815260200191505060405180910390f35b34801561093957600080fd5b50610942612735565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561099057600080fd5b5061099961275b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109d95780820151818401526020810190506109be565b50505050905090810190601f168015610a065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a2057600080fd5b50610a296127f9565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a5157600080fd5b50610a90600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061280c565b604051808215151515815260200191505060405180910390f35b348015610ab657600080fd5b50610abf612bdd565b6040518082815260200191505060405180910390f35b348015610ae157600080fd5b50610b16600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612be3565b005b348015610b2457600080fd5b50610bdd600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050612dab565b005b348015610beb57600080fd5b50610c2a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dd5565b604051808215151515815260200191505060405180910390f35b348015610c5057600080fd5b50610ca5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fd1565b6040518082815260200191505060405180910390f35b348015610cc757600080fd5b50610cd0613058565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d1e57600080fd5b50610d2761307e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d9d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ebf565b005b348015610dab57600080fd5b50610db46130a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e0257600080fd5b50610e37600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130ca565b005b348015610e4557600080fd5b50610e4e613132565b6040518082815260200191505060405180910390f35b348015610e7057600080fd5b50610ea5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061313c565b604051808215151515815260200191505060405180910390f35b600080349150610ecf83836131aa565b610ed88261323e565b9050610eef8260185461332f90919063ffffffff16565b601881905550610eff838261334b565b610f07613359565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188484604051808381526020018281526020019250505060405180910390a3505050565b60115481565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60068181548110151561111e57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006015544211905090565b6000600154905090565b600061116e3361313c565b151561117957600080fd5b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483111515156111e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561122457600080fd5b61129783600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061130e82846133c490919063ffffffff16565b9050611361816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a361149d82600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115f057600080fd5b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561163d57600080fd5b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111515156116c857600080fd5b611719846000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117936064611785600560009054906101000a900460ff1660ff16876133dd90919063ffffffff16565b61341590919063ffffffff16565b91506117a882856133c490919063ffffffff16565b90506117fb816000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a361191582600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0884600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001925050509392505050565b600c5481565b600b60009054906101000a900460ff1681565b60145481565b60165481565b60185481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ba357600080fd5b611bac8161313c565b1515611bb757600080fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506008600081819054906101000a900460ff16809291906001900391906101000a81548160ff021916908360ff1602179055505050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ca157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cdd57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60155481565b60006014546018541015905090565b6000601a54905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d9c57600080fd5b611da461114d565b1515611daf57600080fd5b6000601a54111515611dc057600080fd5b611e35601a54600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1227f9baa9c17a74ae4200a9a412668d5892cbf9f1cc63bdcd07cc1be0634192601a546040518082815260200191505060405180910390a2565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808310151561201f576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120b3565b61203283826133c490919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121fb57600080fd5b80600560006101000a81548160ff021916908360ff16021790555050565b6122223361313c565b151561222d57600080fd5b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115151561229c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156122d857600080fd5b61234b81600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612400816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561257157600080fd5b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560009054906101000a900460ff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561268957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126c557600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127f15780601f106127c6576101008083540402835291602001916127f1565b820191906000526020600020905b8154815290600101906020018083116127d457829003601f168201915b505050505081565b600860009054906101000a900460ff1681565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561284c57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561289957600080fd5b6128ea846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506129646064612956600560009054906101000a900460ff1660ff16876133dd90919063ffffffff16565b61341590919063ffffffff16565b915061297982856133c490919063ffffffff16565b90506129cc816000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3612ae682600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019250505092915050565b60175481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c3f57600080fd5b60001515600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415612da8576001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060068054809190600101612d049190614120565b50806006612d2160016006805490506133c490919063ffffffff16565b815481101515612d2d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff160217905550505b50565b612db43361313c565b1515612dbf57600080fd5b612dcd86868686868661342b565b505050505050565b6000612e6682600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561312657600080fd5b61312f81613a50565b50565b6000601954905090565b600060011515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156131a057600190506131a5565b600090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156131e657600080fd5b600081141515156131f657600080fd5b60145461320e8260185461332f90919063ffffffff16565b1115151561321b57600080fd5b601754421015801561322f57506015544211155b151561323a57600080fd5b5050565b6000806000806000806000806000613257600154613b4c565b95506132628a613d3c565b9450600193505b831561331f57858511156132ed5785975061328f8860015461332f90919063ffffffff16565b92506132a4888861332f90919063ffffffff16565b96506132bb6016548961341590919063ffffffff16565b91506132d0828b6133c490919063ffffffff16565b90506132db83613b4c565b95506132e681613d3c565b945061331a565b613300858861332f90919063ffffffff16565b9650600093506133108686613d88565b61331985613da5565b5b613269565b8698505050505050505050919050565b6000818301905082811015151561334257fe5b80905092915050565b6133558282613dc3565b5050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156133c1573d6000803e3d6000fd5b50565b60008282111515156133d257fe5b818303905092915050565b6000808314156133f0576000905061340f565b818302905081838281151561340157fe5b0414151561340b57fe5b8090505b92915050565b6000818381151561342257fe5b04905092915050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415151561346b57600080fd5b6000151560048a6040518082805190602001908083835b6020831015156134a75780518252602082019150602081019050602083039250613482565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900460ff1615151415156134f657600080fd5b61350287878787613e75565b925061350e838a613f63565b91508773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151561354a57600080fd5b61355d858761332f90919063ffffffff16565b90506000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111515156135ac57600080fd5b61360f85613601886000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6133c490919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136a2866000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061375785600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160048a6040518082805190602001908083835b6020831015156137f557805182526020820191506020810190506020830392506137d0565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548160ff0219169083151502179055508673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f339e733e8f3d5b80a99579a1bd0d885dd3d96783439f354abebcd98f88b6462c896040518082815260200191505060405180910390a4600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f339e733e8f3d5b80a99579a1bd0d885dd3d96783439f354abebcd98f88b6462c886040518082815260200191505060405180910390a48673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040518082815260200191505060405180910390a3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613a8c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080602c54831015613c4857602a54831015613bee57602854831015613b9457613b78601e5461405b565b613b8d836028546133c490919063ffffffff16565b9050613be9565b602954831015613bc557613ba9601f5461405b565b613bbe836029546133c490919063ffffffff16565b9050613be8565b613bd060205461405b565b613be583602a546133c490919063ffffffff16565b90505b5b613c43565b602b54831015613c1f57613c0360215461405b565b613c1883602b546133c490919063ffffffff16565b9050613c42565b613c2a60225461405b565b613c3f83602c546133c490919063ffffffff16565b90505b5b613d33565b602f54831015613cdd57602d54831015613c8357613c6760235461405b565b613c7c83602d546133c490919063ffffffff16565b9050613cd8565b602e54831015613cb457613c9860245461405b565b613cad83602e546133c490919063ffffffff16565b9050613cd7565b613cbf60255461405b565b613cd483602f546133c490919063ffffffff16565b90505b5b613d32565b603054831015613d0e57613cf260265461405b565b613d07836030546133c490919063ffffffff16565b9050613d31565b613d1960275461405b565b613d2e836031546133c490919063ffffffff16565b90505b5b5b80915050919050565b6000613d81670de0b6b3a7640000613d73601254613d65601654876133dd90919063ffffffff16565b6133dd90919063ffffffff16565b61341590919063ffffffff16565b9050919050565b613d9b81836133c490919063ffffffff16565b6019819055505050565b613dba81601c546133c490919063ffffffff16565b601a8190555050565b613dd88160015461332f90919063ffffffff16565b600181905550613e2f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008085858585604051602001808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018281526020019450505050506040516020818303038152906040526040518082805190602001908083835b602083101515613f205780518252602082019150602081019050602083039250613efb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050613f5881614065565b915050949350505050565b60008060008060418551141515613f7d5760009350614052565b6020850151925060408501519150606085015160001a9050601b8160ff161015613fa857601b810190505b601b8160ff1614158015613fc05750601c8160ff1614155b15613fce5760009350614052565b600186828585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015614045573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b8060168190555050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156140ec57805182526020820191506020810190506020830392506140c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050919050565b81548183558181111561414757818360005260206000209182019101614146919061414c565b5b505050565b61416e91905b8082111561416a576000816000905550600101614152565b5090565b905600a165627a7a72305820f6c48654dbdf5d07f556060f1719a80abb203dac97e4fce2e43b511dd59fdf030029

Deployed Bytecode

0x60806040526004361061021a576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305f7939a1461022557806306fdde0314610250578063095ea7b3146102e05780630d48669a146103455780631515bc2b146103b257806318160ddd146103e15780631bfd816b1461040c57806323b872dd146104635780632ff2e9dc146104e8578063313ce56714610513578063355274ea14610544578063379b4ed01461056f5780634042b66f1461059a578063485d7d94146105c55780634b023cf8146106085780634b6753bc1461064b5780634f935945146106765780635946748c146106a557806363cc4aa2146106d057806366188463146106e75780636c791e041461074c578063705388631461077c57806370a08231146107c9578063715018a614610820578063771a3a1d146108375780637b5f4f5b146108685780637dd6ab72146108ab578063819d95c1146109025780638da5cb5b1461092d57806395d89b4114610984578063a31f898214610a14578063a9059cbb14610a45578063b7a8807c14610aaa578063cf1c316a14610ad5578063d6d2229114610b18578063d73dd62314610bdf578063dd62ed3e14610c44578063e3175c4d14610cbb578063e5ee34a214610d12578063ec8ac4d814610d69578063edf4d84714610d9f578063f2fde38b14610df6578063f4dab3ff14610e39578063fe9fbb8014610e64575b61022333610ebf565b005b34801561023157600080fd5b5061023a610f79565b6040518082815260200191505060405180910390f35b34801561025c57600080fd5b50610265610f7f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a557808201518184015260208101905061028a565b50505050905090810190601f1680156102d25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ec57600080fd5b5061032b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061101d565b604051808215151515815260200191505060405180910390f35b34801561035157600080fd5b506103706004803603810190808035906020019092919050505061110f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103be57600080fd5b506103c761114d565b604051808215151515815260200191505060405180910390f35b3480156103ed57600080fd5b506103f6611159565b6040518082815260200191505060405180910390f35b34801561041857600080fd5b50610461600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611163565b005b34801561046f57600080fd5b506104ce600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115b0565b604051808215151515815260200191505060405180910390f35b3480156104f457600080fd5b506104fd611b1c565b6040518082815260200191505060405180910390f35b34801561051f57600080fd5b50610528611b22565b604051808260ff1660ff16815260200191505060405180910390f35b34801561055057600080fd5b50610559611b35565b6040518082815260200191505060405180910390f35b34801561057b57600080fd5b50610584611b3b565b6040518082815260200191505060405180910390f35b3480156105a657600080fd5b506105af611b41565b6040518082815260200191505060405180910390f35b3480156105d157600080fd5b50610606600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b47565b005b34801561061457600080fd5b50610649600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c45565b005b34801561065757600080fd5b50610660611d21565b6040518082815260200191505060405180910390f35b34801561068257600080fd5b5061068b611d27565b604051808215151515815260200191505060405180910390f35b3480156106b157600080fd5b506106ba611d36565b6040518082815260200191505060405180910390f35b3480156106dc57600080fd5b506106e5611d40565b005b3480156106f357600080fd5b50610732600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f0d565b604051808215151515815260200191505060405180910390f35b34801561075857600080fd5b5061077a600480360381019080803560ff16906020019092919050505061219f565b005b34801561078857600080fd5b506107c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612219565b005b3480156107d557600080fd5b5061080a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124cd565b6040518082815260200191505060405180910390f35b34801561082c57600080fd5b50610835612515565b005b34801561084357600080fd5b5061084c61261a565b604051808260ff1660ff16815260200191505060405180910390f35b34801561087457600080fd5b506108a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061262d565b005b3480156108b757600080fd5b506108c0612709565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090e57600080fd5b5061091761272f565b6040518082815260200191505060405180910390f35b34801561093957600080fd5b50610942612735565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561099057600080fd5b5061099961275b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109d95780820151818401526020810190506109be565b50505050905090810190601f168015610a065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a2057600080fd5b50610a296127f9565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a5157600080fd5b50610a90600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061280c565b604051808215151515815260200191505060405180910390f35b348015610ab657600080fd5b50610abf612bdd565b6040518082815260200191505060405180910390f35b348015610ae157600080fd5b50610b16600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612be3565b005b348015610b2457600080fd5b50610bdd600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050612dab565b005b348015610beb57600080fd5b50610c2a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dd5565b604051808215151515815260200191505060405180910390f35b348015610c5057600080fd5b50610ca5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fd1565b6040518082815260200191505060405180910390f35b348015610cc757600080fd5b50610cd0613058565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d1e57600080fd5b50610d2761307e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d9d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ebf565b005b348015610dab57600080fd5b50610db46130a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e0257600080fd5b50610e37600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130ca565b005b348015610e4557600080fd5b50610e4e613132565b6040518082815260200191505060405180910390f35b348015610e7057600080fd5b50610ea5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061313c565b604051808215151515815260200191505060405180910390f35b600080349150610ecf83836131aa565b610ed88261323e565b9050610eef8260185461332f90919063ffffffff16565b601881905550610eff838261334b565b610f07613359565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad188484604051808381526020018281526020019250505060405180910390a3505050565b60115481565b60098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60068181548110151561111e57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006015544211905090565b6000600154905090565b600061116e3361313c565b151561117957600080fd5b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483111515156111e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561122457600080fd5b61129783600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061130e82846133c490919063ffffffff16565b9050611361816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a361149d82600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115f057600080fd5b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561163d57600080fd5b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111515156116c857600080fd5b611719846000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117936064611785600560009054906101000a900460ff1660ff16876133dd90919063ffffffff16565b61341590919063ffffffff16565b91506117a882856133c490919063ffffffff16565b90506117fb816000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a361191582600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0884600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001925050509392505050565b600c5481565b600b60009054906101000a900460ff1681565b60145481565b60165481565b60185481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ba357600080fd5b611bac8161313c565b1515611bb757600080fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506008600081819054906101000a900460ff16809291906001900391906101000a81548160ff021916908360ff1602179055505050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ca157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cdd57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60155481565b60006014546018541015905090565b6000601a54905090565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d9c57600080fd5b611da461114d565b1515611daf57600080fd5b6000601a54111515611dc057600080fd5b611e35601a54600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1227f9baa9c17a74ae4200a9a412668d5892cbf9f1cc63bdcd07cc1be0634192601a546040518082815260200191505060405180910390a2565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808310151561201f576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120b3565b61203283826133c490919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121fb57600080fd5b80600560006101000a81548160ff021916908360ff16021790555050565b6122223361313c565b151561222d57600080fd5b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115151561229c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156122d857600080fd5b61234b81600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612400816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561257157600080fd5b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600560009054906101000a900460ff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561268957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156126c557600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127f15780601f106127c6576101008083540402835291602001916127f1565b820191906000526020600020905b8154815290600101906020018083116127d457829003601f168201915b505050505081565b600860009054906101000a900460ff1681565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561284c57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561289957600080fd5b6128ea846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506129646064612956600560009054906101000a900460ff1660ff16876133dd90919063ffffffff16565b61341590919063ffffffff16565b915061297982856133c490919063ffffffff16565b90506129cc816000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3612ae682600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019250505092915050565b60175481565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c3f57600080fd5b60001515600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415612da8576001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060068054809190600101612d049190614120565b50806006612d2160016006805490506133c490919063ffffffff16565b815481101515612d2d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff160217905550505b50565b612db43361313c565b1515612dbf57600080fd5b612dcd86868686868661342b565b505050505050565b6000612e6682600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561312657600080fd5b61312f81613a50565b50565b6000601954905090565b600060011515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156131a057600190506131a5565b600090505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156131e657600080fd5b600081141515156131f657600080fd5b60145461320e8260185461332f90919063ffffffff16565b1115151561321b57600080fd5b601754421015801561322f57506015544211155b151561323a57600080fd5b5050565b6000806000806000806000806000613257600154613b4c565b95506132628a613d3c565b9450600193505b831561331f57858511156132ed5785975061328f8860015461332f90919063ffffffff16565b92506132a4888861332f90919063ffffffff16565b96506132bb6016548961341590919063ffffffff16565b91506132d0828b6133c490919063ffffffff16565b90506132db83613b4c565b95506132e681613d3c565b945061331a565b613300858861332f90919063ffffffff16565b9650600093506133108686613d88565b61331985613da5565b5b613269565b8698505050505050505050919050565b6000818301905082811015151561334257fe5b80905092915050565b6133558282613dc3565b5050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156133c1573d6000803e3d6000fd5b50565b60008282111515156133d257fe5b818303905092915050565b6000808314156133f0576000905061340f565b818302905081838281151561340157fe5b0414151561340b57fe5b8090505b92915050565b6000818381151561342257fe5b04905092915050565b60008060008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415151561346b57600080fd5b6000151560048a6040518082805190602001908083835b6020831015156134a75780518252602082019150602081019050602083039250613482565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900460ff1615151415156134f657600080fd5b61350287878787613e75565b925061350e838a613f63565b91508773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151561354a57600080fd5b61355d858761332f90919063ffffffff16565b90506000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111515156135ac57600080fd5b61360f85613601886000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133c490919063ffffffff16565b6133c490919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136a2866000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061375785600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160048a6040518082805190602001908083835b6020831015156137f557805182526020820191506020810190506020830392506137d0565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548160ff0219169083151502179055508673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f339e733e8f3d5b80a99579a1bd0d885dd3d96783439f354abebcd98f88b6462c896040518082815260200191505060405180910390a4600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f339e733e8f3d5b80a99579a1bd0d885dd3d96783439f354abebcd98f88b6462c886040518082815260200191505060405180910390a48673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040518082815260200191505060405180910390a3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613a8c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080602c54831015613c4857602a54831015613bee57602854831015613b9457613b78601e5461405b565b613b8d836028546133c490919063ffffffff16565b9050613be9565b602954831015613bc557613ba9601f5461405b565b613bbe836029546133c490919063ffffffff16565b9050613be8565b613bd060205461405b565b613be583602a546133c490919063ffffffff16565b90505b5b613c43565b602b54831015613c1f57613c0360215461405b565b613c1883602b546133c490919063ffffffff16565b9050613c42565b613c2a60225461405b565b613c3f83602c546133c490919063ffffffff16565b90505b5b613d33565b602f54831015613cdd57602d54831015613c8357613c6760235461405b565b613c7c83602d546133c490919063ffffffff16565b9050613cd8565b602e54831015613cb457613c9860245461405b565b613cad83602e546133c490919063ffffffff16565b9050613cd7565b613cbf60255461405b565b613cd483602f546133c490919063ffffffff16565b90505b5b613d32565b603054831015613d0e57613cf260265461405b565b613d07836030546133c490919063ffffffff16565b9050613d31565b613d1960275461405b565b613d2e836031546133c490919063ffffffff16565b90505b5b5b80915050919050565b6000613d81670de0b6b3a7640000613d73601254613d65601654876133dd90919063ffffffff16565b6133dd90919063ffffffff16565b61341590919063ffffffff16565b9050919050565b613d9b81836133c490919063ffffffff16565b6019819055505050565b613dba81601c546133c490919063ffffffff16565b601a8190555050565b613dd88160015461332f90919063ffffffff16565b600181905550613e2f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461332f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008085858585604051602001808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018481526020018381526020018281526020019450505050506040516020818303038152906040526040518082805190602001908083835b602083101515613f205780518252602082019150602081019050602083039250613efb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050613f5881614065565b915050949350505050565b60008060008060418551141515613f7d5760009350614052565b6020850151925060408501519150606085015160001a9050601b8160ff161015613fa857601b810190505b601b8160ff1614158015613fc05750601c8160ff1614155b15613fce5760009350614052565b600186828585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015614045573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b8060168190555050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831015156140ec57805182526020820191506020810190506020830392506140c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050919050565b81548183558181111561414757818360005260206000209182019101614146919061414c565b5b505050565b61416e91905b8082111561416a576000816000905550600101614152565b5090565b905600a165627a7a72305820f6c48654dbdf5d07f556060f1719a80abb203dac97e4fce2e43b511dd59fdf030029

Deployed Bytecode Sourcemap

25233:13697:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28762:21;28772:10;28762:9;:21::i;:::-;25233:13697;20544:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20544:30:0;;;;;;;;;;;;;;;;;;;;;;;20157:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20157:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20157:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6425:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6425:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18004:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18004:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29886:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29886:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3674:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3674:85:0;;;;;;;;;;;;;;;;;;;;;;;22639:630;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22639:630:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15038:768;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15038:768:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20262:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20262:29:0;;;;;;;;;;;;;;;;;;;;;;;20230:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20230:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25381:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25381:18:0;;;;;;;;;;;;;;;;;;;;;;;25439:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25439:30:0;;;;;;;;;;;;;;;;;;;;;;;25509:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25509:24:0;;;;;;;;;;;;;;;;;;;;;;;19537:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19537:182:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23679:149;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23679:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25406:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25406:26:0;;;;;;;;;;;;;;;;;;;;;;;29622:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29622:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37885:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37885:104:0;;;;;;;;;;;;;;;;;;;;;;;38454:473;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38454:473:0;;;;;;8344:447;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8344:447:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23438:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23438:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21845:443;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21845:443:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4458:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4458:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16891:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16891:114:0;;;;;;13898:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13898:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24004:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24004:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20458:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20458:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20499:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20499:38:0;;;;;;;;;;;;;;;;;;;;;;;16096:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16096:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20195:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20195:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20195:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18094:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18094:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14139:631;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14139:631:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25476:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25476:26:0;;;;;;;;;;;;;;;;;;;;;;;18739:289;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18739:289:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24638:309;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24638:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7569:307;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7569:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6944:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6944:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20417:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20417:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20373:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20373:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28940:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;25348:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25348:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17173:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17173:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38174:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38174:111:0;;;;;;;;;;;;;;;;;;;;;;;19189:188;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19189:188:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28940:558;29005:17;29144:14;29025:9;29005:29;;29043:45;29064:12;29078:9;29043:20;:45::i;:::-;29161:27;29178:9;29161:16;:27::i;:::-;29144:44;;29255:24;29269:9;29255;;:13;;:24;;;;:::i;:::-;29243:9;:36;;;;29356:38;29373:12;29387:6;29356:16;:38::i;:::-;29403:15;:13;:15::i;:::-;29458:12;29432:58;;29446:10;29432:58;;;29472:9;29483:6;29432:58;;;;;;;;;;;;;;;;;;;;;;;;28940:558;;;:::o;20544:30::-;;;;:::o;20157:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6425:192::-;6492:4;6537:6;6505:7;:19;6513:10;6505:19;;;;;;;;;;;;;;;:29;6525:8;6505:29;;;;;;;;;;;;;;;:38;;;;6576:8;6555:38;;6564:10;6555:38;;;6586:6;6555:38;;;;;;;;;;;;;;;;;;6607:4;6600:11;;6425:192;;;;:::o;18004:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29886:169::-;29928:4;30035:11;;30017:15;:29;30010:36;;29886:169;:::o;3674:85::-;3718:7;3741:12;;3734:19;;3674:85;:::o;22639:630::-;22982:17;18537:24;18550:10;18537:12;:24::i;:::-;18529:33;;;;;;;;22818:8;:29;22827:19;;;;;;;;;;;22818:29;;;;;;;;;;;;;;;;22808:6;:39;;22800:48;;;;;;;;22882:1;22867:17;;:3;:17;;;;22859:26;;;;;;;;22930:41;22964:6;22930:8;:29;22939:19;;;;;;;;;;;22930:29;;;;;;;;;;;;;;;;:33;;:41;;;;:::i;:::-;22898:8;:29;22907:19;;;;;;;;;;;22898:29;;;;;;;;;;;;;;;:73;;;;23002:16;23013:4;23002:6;:10;;:16;;;;:::i;:::-;22982:36;;23045:28;23063:9;23045:8;:13;23054:3;23045:13;;;;;;;;;;;;;;;;:17;;:28;;;;:::i;:::-;23029:8;:13;23038:3;23029:13;;;;;;;;;;;;;;;:44;;;;23119:3;23089:45;;23098:19;;;;;;;;;;;23089:45;;;23124:9;23089:45;;;;;;;;;;;;;;;;;;23168:30;23193:4;23168:8;:20;23177:10;;;;;;;;;;;23168:20;;;;;;;;;;;;;;;;:24;;:30;;;;:::i;:::-;23145:8;:20;23154:10;;;;;;;;;;;23145:20;;;;;;;;;;;;;;;:53;;;;23244:10;;;;;;;;;;;23214:47;;23223:19;;;;;;;;;;;23214:47;;;23256:4;23214:47;;;;;;;;;;;;;;;;;;22639:630;;;;:::o;15038:768::-;15172:4;15390:11;15443:18;15217:1;15202:17;;:3;:17;;;;15194:26;;;;;;;;15249:8;:15;15258:5;15249:15;;;;;;;;;;;;;;;;15239:6;:25;;15231:34;;;;;;;;15294:7;:14;15302:5;15294:14;;;;;;;;;;;;;;;:26;15309:10;15294:26;;;;;;;;;;;;;;;;15284:6;:36;;15276:45;;;;;;;;15352:27;15372:6;15352:8;:15;15361:5;15352:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;15334:8;:15;15343:5;15334:15;;;;;;;;;;;;;;;:45;;;;15404:28;15428:3;15404:19;15415:7;;;;;;;;;;;15404:19;;:6;:10;;:19;;;;:::i;:::-;:23;;:28;;;;:::i;:::-;15390:42;;15464:15;15475:3;15464:6;:10;;:15;;;;:::i;:::-;15443:36;;15508:29;15526:10;15508:8;:13;15517:3;15508:13;;;;;;;;;;;;;;;;:17;;:29;;;;:::i;:::-;15492:8;:13;15501:3;15492:13;;;;;;;;;;;;;;;:45;;;;15569:3;15553:32;;15562:5;15553:32;;;15574:10;15553:32;;;;;;;;;;;;;;;;;;15619:29;15644:3;15619:8;:20;15628:10;;;;;;;;;;;15619:20;;;;;;;;;;;;;;;;:24;;:29;;;;:::i;:::-;15596:8;:20;15605:10;;;;;;;;;;;15596:20;;;;;;;;;;;;;;;:52;;;;15688:38;15719:6;15688:7;:14;15696:5;15688:14;;;;;;;;;;;;;;;:26;15703:10;15688:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;15659:7;:14;15667:5;15659:14;;;;;;;;;;;;;;;:26;15674:10;15659:26;;;;;;;;;;;;;;;:67;;;;15758:10;;;;;;;;;;;15742:32;;15751:5;15742:32;;;15770:3;15742:32;;;;;;;;;;;;;;;;;;15794:4;15787:11;;15038:768;;;;;;;:::o;20262:29::-;;;;:::o;20230:25::-;;;;;;;;;;;;;:::o;25381:18::-;;;;:::o;25439:30::-;;;;:::o;25509:24::-;;;;:::o;19537:182::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;19617:22;19630:8;19617:12;:22::i;:::-;19609:31;;;;;;;;19680:5;19652:15;:25;19668:8;19652:25;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;19696:13;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19537:182;:::o;23679:149::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;23782:1;23759:25;;:11;:25;;;;23751:34;;;;;;;;23809:11;23796:10;;:24;;;;;;;;;;;;;;;;;;23679:149;:::o;25406:26::-;;;;:::o;29622:89::-;29665:4;29700:3;;29687:9;;:16;;29680:23;;29622:89;:::o;37885:104::-;37939:7;37966:15;;37959:22;;37885:104;:::o;38454:473::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;38566:11;:9;:11::i;:::-;38558:20;;;;;;;;38682:1;38664:15;;:19;38656:28;;;;;;;;38795:53;38832:15;;38795:8;:32;38804:22;;;;;;;;;;;38795:32;;;;;;;;;;;;;;;;:36;;:53;;;;:::i;:::-;38760:8;:32;38769:22;;;;;;;;;;;38760:32;;;;;;;;;;;;;;;:88;;;;38878:22;;;;;;;;;;;38865:53;;;38902:15;;38865:53;;;;;;;;;;;;;;;;;;38454:473::o;8344:447::-;8455:4;8471:16;8490:7;:19;8498:10;8490:19;;;;;;;;;;;;;;;:29;8510:8;8490:29;;;;;;;;;;;;;;;;8471:48;;8550:8;8530:16;:28;;8526:169;;;8601:1;8569:7;:19;8577:10;8569:19;;;;;;;;;;;;;;;:29;8589:8;8569:29;;;;;;;;;;;;;;;:33;;;;8526:169;;;8657:30;8670:16;8657:8;:12;;:30;;;;:::i;:::-;8625:7;:19;8633:10;8625:19;;;;;;;;;;;;;;;:29;8645:8;8625:29;;;;;;;;;;;;;;;:62;;;;8526:169;8727:8;8706:61;;8715:10;8706:61;;;8737:7;:19;8745:10;8737:19;;;;;;;;;;;;;;;:29;8757:8;8737:29;;;;;;;;;;;;;;;;8706:61;;;;;;;;;;;;;;;;;;8781:4;8774:11;;8344:447;;;;;:::o;23438:90::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;23512:8;23502:7;;:18;;;;;;;;;;;;;;;;;;23438:90;:::o;21845:443::-;18537:24;18550:10;18537:12;:24::i;:::-;18529:33;;;;;;;;22005:8;:32;22014:22;;;;;;;;;;;22005:32;;;;;;;;;;;;;;;;21995:6;:42;;21987:51;;;;;;;;22072:1;22057:17;;:3;:17;;;;22049:26;;;;;;;;22123:44;22160:6;22123:8;:32;22132:22;;;;;;;;;;;22123:32;;;;;;;;;;;;;;;;:36;;:44;;;;:::i;:::-;22088:8;:32;22097:22;;;;;;;;;;;22088:32;;;;;;;;;;;;;;;:79;;;;22194:25;22212:6;22194:8;:13;22203:3;22194:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;22178:8;:13;22187:3;22178:13;;;;;;;;;;;;;;;:41;;;;22268:3;22235:45;;22244:22;;;;;;;;;;;22235:45;;;22273:6;22235:45;;;;;;;;;;;;;;;;;;21845:443;;:::o;4458:101::-;4514:7;4537:8;:16;4546:6;4537:16;;;;;;;;;;;;;;;;4530:23;;4458:101;;;:::o;16891:114::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;16968:5;;;;;;;;;;;16949:25;;;;;;;;;;;;16997:1;16981:5;;:18;;;;;;;;;;;;;;;;;;16891:114::o;13898:20::-;;;;;;;;;;;;;:::o;24004:167::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;24116:1;24093:25;;:11;:25;;;;24085:34;;;;;;;;24152:11;24130:19;;:33;;;;;;;;;;;;;;;;;;24004:167;:::o;20458:34::-;;;;;;;;;;;;;:::o;20499:38::-;;;;:::o;16096:20::-;;;;;;;;;;;;;:::o;20195:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18094:26::-;;;;;;;;;;;;;:::o;14139:631::-;14245:4;14422:11;14475:18;14290:1;14275:17;;:3;:17;;;;14267:26;;;;;;;;14322:8;:20;14331:10;14322:20;;;;;;;;;;;;;;;;14312:6;:30;;14304:39;;;;;;;;14379:32;14404:6;14379:8;:20;14388:10;14379:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;14356:8;:20;14365:10;14356:20;;;;;;;;;;;;;;;:55;;;;14436:28;14460:3;14436:19;14447:7;;;;;;;;;;;14436:19;;:6;:10;;:19;;;;:::i;:::-;:23;;:28;;;;:::i;:::-;14422:42;;14496:15;14507:3;14496:6;:10;;:15;;;;:::i;:::-;14475:36;;14540:29;14558:10;14540:8;:13;14549:3;14540:13;;;;;;;;;;;;;;;;:17;;:29;;;;:::i;:::-;14524:8;:13;14533:3;14524:13;;;;;;;;;;;;;;;:45;;;;14606:3;14585:37;;14594:10;14585:37;;;14611:10;14585:37;;;;;;;;;;;;;;;;;;14656:29;14681:3;14656:8;:20;14665:10;;;;;;;;;;;14656:20;;;;;;;;;;;;;;;;:24;;:29;;;;:::i;:::-;14633:8;:20;14642:10;;;;;;;;;;;14633:20;;;;;;;;;;;;;;;:52;;;;14722:10;;;;;;;;;;;14701:37;;14710:10;14701:37;;;14734:3;14701:37;;;;;;;;;;;;;;;;;;14758:4;14751:11;;14139:631;;;;;;:::o;25476:26::-;;;;:::o;18739:289::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;18841:5;18812:34;;:15;:25;18828:8;18812:25;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;18808:213;;;18888:4;18860:15;:25;18876:8;18860:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;18904:10;:19;;;;;;;;;;;:::i;:::-;;18974:8;18935:10;18946:24;18968:1;18946:10;:17;;;;:21;;:24;;;;:::i;:::-;18935:36;;;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;18994:13;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18808:213;18739:289;:::o;24638:309::-;18537:24;18550:10;18537:12;:24::i;:::-;18529:33;;;;;;;;24875:64;24894:10;24906:5;24913:3;24918:6;24926:4;24932:6;24875:18;:64::i;:::-;24638:309;;;;;;:::o;7569:307::-;7675:4;7732:46;7766:11;7732:7;:19;7740:10;7732:19;;;;;;;;;;;;;;;:29;7752:8;7732:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;7691:7;:19;7699:10;7691:19;;;;;;;;;;;;;;;:29;7711:8;7691:29;;;;;;;;;;;;;;;:88;;;;7812:8;7791:61;;7800:10;7791:61;;;7822:7;:19;7830:10;7822:19;;;;;;;;;;;;;;;:29;7842:8;7822:29;;;;;;;;;;;;;;;;7791:61;;;;;;;;;;;;;;;;;;7866:4;7859:11;;7569:307;;;;:::o;6944:162::-;7049:7;7075;:15;7083:6;7075:15;;;;;;;;;;;;;;;:25;7091:8;7075:25;;;;;;;;;;;;;;;;7068:32;;6944:162;;;;:::o;20417:34::-;;;;;;;;;;;;;:::o;20373:37::-;;;;;;;;;;;;;:::o;25348:26::-;;;;;;;;;;;;;:::o;17173:105::-;16599:5;;;;;;;;;;;16585:19;;:10;:19;;;16577:28;;;;;;;;17243:29;17262:9;17243:18;:29::i;:::-;17173:105;:::o;38174:111::-;38228:7;38255:22;;38248:29;;38174:111;:::o;19189:188::-;19254:4;19304;19275:33;;:15;:25;19291:8;19275:25;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;19271:74;;;19329:4;19322:11;;;;19271:74;19364:5;19357:12;;19189:188;;;;:::o;36011:374::-;36140:1;36116:26;;:12;:26;;;;36108:35;;;;;;;;36176:1;36162:10;:15;;36154:24;;;;;;;;36226:3;;36197:25;36211:10;36197:9;;:13;;:25;;;;:::i;:::-;:32;;36189:41;;;;;;;;36331:11;;36312:15;:30;;:64;;;;;36365:11;;36346:15;:30;;36312:64;36304:73;;;;;;;;36011:374;;:::o;30447:1937::-;30511:7;30565:26;30633;30832:29;30955:17;31077:13;31342:16;31660:24;31745:20;30864:33;30884:12;;30864:19;:33::i;:::-;30832:65;;30975:27;30991:10;30975:15;:27::i;:::-;30955:47;;31093:4;31077:20;;31108:1170;31115:8;31108:1170;;;31156:21;31144:9;:33;31140:1127;;;31302:21;31281:42;;31361:36;31378:18;31361:12;;:16;;:36;;;;:::i;:::-;31342:55;;31506:42;31529:18;31506;:22;;:42;;;;:::i;:::-;31485:63;;31687:39;31710:15;;31687:18;:22;;:39;;;;:::i;:::-;31660:66;;31768:32;31783:16;31768:10;:14;;:32;;;;:::i;:::-;31745:55;;31904:29;31924:8;31904:19;:29::i;:::-;31880:53;;31964:29;31980:12;31964:15;:29::i;:::-;31952:41;;31140:1127;;;32055:33;32078:9;32055:18;:22;;:33;;;;:::i;:::-;32034:54;;32118:5;32107:16;;32142:60;32169:21;32192:9;32142:26;:60::i;:::-;32221:30;32241:9;32221:19;:30::i;:::-;31140:1127;31108:1170;;;32358:18;32351:25;;30447:1937;;;;;;;;;;;:::o;3151:132::-;3211:9;3238:2;3233;:7;3229:11;;3259:2;3254:1;:7;;3247:15;;;;;;3276:1;3269:8;;3151:132;;;;:::o;36651:140::-;36741:42;36756:12;36770;36741:14;:42::i;:::-;36651:140;;:::o;32875:84::-;32920:11;;;;;;;;;;;:20;;:31;32941:9;32920:31;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32920:31:0;32875:84::o;2965:119::-;3025:7;3054:2;3048;:8;;3041:16;;;;;;3076:2;3071;:7;3064:14;;2965:119;;;;:::o;2082:391::-;2142:9;2378:1;2372:2;:7;2368:38;;;2397:1;2390:8;;;;2368:38;2423:2;2418;:7;2414:11;;2449:2;2443;2439:1;:6;;;;;;;;:12;2432:20;;;;;;2466:1;2459:8;;2082:391;;;;;:::o;2560:288::-;2620:7;2840:2;2835;:7;;;;;;;;2828:14;;2560:288;;;;:::o;9756:1316::-;10149:16;10296:12;10385:13;10030:1;10015:17;;:3;:17;;;;10007:26;;;;;;;;10078:5;10052:31;;:10;10063;10052:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10052:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;10044:40;;;;;;;;10168:52;10194:3;10199:6;10207:4;10213:6;10168:25;:52::i;:::-;10149:71;;10311:30;10320:8;10330:10;10311:8;:30::i;:::-;10296:45;;10368:5;10360:13;;:4;:13;;;10352:22;;;;;;;;10401:16;10412:4;10401:6;:10;;:16;;;;:::i;:::-;10385:32;;10445:8;:14;10454:4;10445:14;;;;;;;;;;;;;;;;10436:5;:23;;10428:32;;;;;;;;10517:36;10548:4;10517:26;10536:6;10517:8;:14;10526:4;10517:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;:30;;:36;;;;:::i;:::-;10500:8;:14;10509:4;10500:14;;;;;;;;;;;;;;;:53;;;;10580:25;10598:6;10580:8;:13;10589:3;10580:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;10564:8;:13;10573:3;10564:13;;;;;;;;;;;;;;;:41;;;;10639:30;10664:4;10639:8;:20;10648:10;;;;;;;;;;;10639:20;;;;;;;;;;;;;;;;:24;;:30;;;;:::i;:::-;10616:8;:20;10625:10;;;;;;;;;;;10616:20;;;;;;;;;;;;;;;:53;;;;10748:4;10723:10;10734;10723:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10723:22:0;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;10849:3;10813:48;;10843:4;10813:48;;10831:10;10813:48;;;10854:6;10813:48;;;;;;;;;;;;;;;;;;10913:10;;;;;;;;;;;10877:53;;10907:4;10877:53;;10895:10;10877:53;;;10925:4;10877:53;;;;;;;;;;;;;;;;;;11004:3;10989:27;;10998:4;10989:27;;;11009:6;10989:27;;;;;;;;;;;;;;;;;;11047:10;;;;;;;;;;;11032:32;;11041:4;11032:32;;;11059:4;11032:32;;;;;;;;;;;;;;;;;;9756:1316;;;;;;;;;:::o;17419:175::-;17511:1;17490:23;;:9;:23;;;;17482:32;;;;;;;;17554:9;17526:38;;17547:5;;;;;;;;;;;17526:38;;;;;;;;;;;;17579:9;17571:5;;:17;;;;;;;;;;;;;;;;;;17419:175;:::o;33253:2131::-;33321:7;33437:17;33483:11;;33469;:25;33465:1883;;;33529:11;;33515;:25;33511:896;;;33579:11;;33565;:25;33561:482;;;33615:30;33635:9;;33615:19;:30::i;:::-;33680:28;33696:11;33680;;:15;;:28;;;;:::i;:::-;33668:40;;33561:482;;;33752:11;;33738;:25;33734:309;;;33788:30;33808:9;;33788:19;:30::i;:::-;33853:28;33869:11;33853;;:15;;:28;;;;:::i;:::-;33841:40;;33734:309;;;33930:30;33950:9;;33930:19;:30::i;:::-;33995:28;34011:11;33995;;:15;;:28;;;;:::i;:::-;33983:40;;33734:309;33561:482;33511:896;;;34101:11;;34087;:25;34083:309;;;34137:30;34157:9;;34137:19;:30::i;:::-;34202:28;34218:11;34202;;:15;;:28;;;;:::i;:::-;34190:40;;34083:309;;;34279:30;34299:9;;34279:19;:30::i;:::-;34344:28;34360:11;34344;;:15;;:28;;;;:::i;:::-;34332:40;;34083:309;33511:896;33465:1883;;;34457:11;;34443;:25;34439:898;;;34507:11;;34493;:25;34489:482;;;34543:30;34563:9;;34543:19;:30::i;:::-;34608:28;34624:11;34608;;:15;;:28;;;;:::i;:::-;34596:40;;34489:482;;;34680:11;;34666;:25;34662:309;;;34716:30;34736:9;;34716:19;:30::i;:::-;34781:28;34797:11;34781;;:15;;:28;;;;:::i;:::-;34769:40;;34662:309;;;34858:30;34878:9;;34858:19;:30::i;:::-;34923:28;34939:11;34923;;:15;;:28;;;;:::i;:::-;34911:40;;34662:309;34489:482;34439:898;;;35029:11;;35015;:25;35011:311;;;35065:30;35085:9;;35065:19;:30::i;:::-;35130:28;35146:11;35130;;:15;;:28;;;;:::i;:::-;35118:40;;35011:311;;;35207:31;35227:10;;35207:19;:31::i;:::-;35273:29;35290:11;35273:12;;:16;;:29;;;;:::i;:::-;35261:41;;35011:311;34439:898;33465:1883;35367:9;35360:16;;33253:2131;;;;:::o;35641:165::-;35709:7;35736:62;35790:7;35736:49;35772:12;;35736:31;35751:15;;35736:10;:14;;:31;;;;:::i;:::-;:35;;:49;;;;:::i;:::-;:53;;:62;;;;:::i;:::-;35729:69;;35641:165;;;:::o;37051:177::-;37183:37;37210:9;37183:22;:26;;:37;;;;:::i;:::-;37158:22;:62;;;;37051:177;;:::o;37400:124::-;37486:30;37506:9;37486:15;;:19;;:30;;;;:::i;:::-;37468:15;:48;;;;37400:124;:::o;32566:217::-;32669:30;32686:12;32669;;:16;;:30;;;;:::i;:::-;32654:12;:45;;;;32735:40;32762:12;32735:8;:22;32744:12;32735:22;;;;;;;;;;;;;;;;:26;;:40;;;;:::i;:::-;32710:8;:22;32719:12;32710:22;;;;;;;;;;;;;;;:65;;;;32566:217;;:::o;11561:416::-;11739:7;11838:12;11880:3;11885:6;11893:4;11898:6;11863:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11863:42:0;;;11853:53;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11853:53:0;;;;;;;;;;;;;;;;11838:68;;11956:13;11964:4;11956:7;:13::i;:::-;11949:20;;11561:416;;;;;;;:::o;12721:829::-;12789:7;12809:9;12829;12849:7;12926:2;12911:4;:11;:17;;12907:69;;;12961:1;12945:19;;;;12907:69;13090:2;13084:4;13080:13;13074:20;13069:25;;13129:2;13123:4;13119:13;13113:20;13108:25;;13176:2;13170:4;13166:13;13160:20;13157:1;13152:29;13147:34;;13294:2;13290:1;:6;;;13286:46;;;13318:2;13313:7;;;;13286:46;13417:2;13412:1;:7;;;;:18;;;;;13428:2;13423:1;:7;;;;13412:18;13408:135;;;13463:1;13447:19;;;;13408:135;13506:25;13516:5;13523:1;13526;13529;13506:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13506:25:0;;;;;;;;13499:32;;12721:829;;;;;;;;:::o;37645:95::-;37727:5;37709:15;:23;;;;37645:95;:::o;12228:160::-;12283:7;12373:5;12320:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12320:59:0;;;12310:70;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;12310:70:0;;;;;;;;;;;;;;;;12303:77;;12228:160;;;:::o;25233:13697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://f6c48654dbdf5d07f556060f1719a80abb203dac97e4fce2e43b511dd59fdf03

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

OVERVIEW

Monetize your data and productivity on the blockchain

Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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