ETH Price: $2,513.33 (-0.45%)

Token

HAG Token (HAG)
 

Overview

Max Total Supply

1,200,000 HAG

Holders

132

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
160.147 HAG

Value
$0.00
0xb72bde32364762593165d1b4915c69d1f1a1a4fb
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
HagToken

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-01-17
*/

// File: contracts/1404/IERC1404.sol

pragma solidity 0.5.8;

interface IERC1404 {
    /// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code
    /// @param from Sending address
    /// @param to Receiving address
    /// @param value Amount of tokens being transferred
    /// @return Code by which to reference message for rejection reasoning
    /// @dev Overwrite with your custom transfer restriction logic
    function detectTransferRestriction (address from, address to, uint256 value) external view returns (uint8);

    /// @notice Detects if a transferFrom will be reverted and if so returns an appropriate reference code
    /// @param sender Transaction sending address
    /// @param from Source of funds address
    /// @param to Receiving address
    /// @param value Amount of tokens being transferred
    /// @return Code by which to reference message for rejection reasoning
    /// @dev Overwrite with your custom transfer restriction logic
    function detectTransferFromRestriction (address sender, address from, address to, uint256 value) external view returns (uint8);

    /// @notice Returns a human-readable message for a given restriction code
    /// @param restrictionCode Identifier for looking up a message
    /// @return Text showing the restriction's reasoning
    /// @dev Overwrite with your custom message and restrictionCode handling
    function messageForTransferRestriction (uint8 restrictionCode) external view returns (string memory);
}

interface IERC1404getSuccessCode {
    /// @notice Return the uint256 that represents the SUCCESS_CODE
    /// @return uint256 SUCCESS_CODE
    function getSuccessCode () external view returns (uint256);
}

/**
 * @title IERC1404Success
 * @dev Combines IERC1404 and IERC1404getSuccessCode interfaces, to be implemented by the TransferRestrictions contract
 */
contract IERC1404Success is IERC1404getSuccessCode, IERC1404 {
}

// File: contracts/1404/IERC1404Validators.sol

pragma solidity 0.5.8;

/**
 * @title IERC1404Validators
 * @dev Interfaces implemented by the token contract to be called by the TransferRestrictions contract
 */
interface IERC1404Validators {
    /// @notice Returns the token balance for an account
    /// @param account The address to get the token balance of
    /// @return uint256 representing the token balance for the account
    function balanceOf (address account) external view returns (uint256);

    /// @notice Returns a boolean indicating the paused state of the contract
    /// @return true if contract is paused, false if unpaused
    function paused () external view returns (bool);

    /// @notice Determine if sender and receiver are whitelisted, return true if both accounts are whitelisted
    /// @param from The address sending tokens.
    /// @param to The address receiving tokens.
    /// @return true if both accounts are whitelisted, false if not
    function checkWhitelists (address from, address to) external view returns (bool);

    /// @notice Determine if a users tokens are locked preventing a transfer
    /// @param _address the address to retrieve the data from
    /// @param amount the amount to send
    /// @param balance the token balance of the sending account
    /// @return true if user has sufficient unlocked token to transfer the requested amount, false if not
    function checkTimelock (address _address, uint256 amount, uint256 balance) external view returns (bool);
}

// File: @openzeppelin/contracts/access/Roles.sol

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

// File: contracts/roles/OwnerRole.sol

pragma solidity 0.5.8;


contract OwnerRole {
    using Roles for Roles.Role;

    event OwnerAdded(address indexed addedOwner, address indexed addedBy);
    event OwnerRemoved(address indexed removedOwner, address indexed removedBy);

    Roles.Role private _owners;

    modifier onlyOwner() {
        require(isOwner(msg.sender), "OwnerRole: caller does not have the Owner role");
        _;
    }

    function isOwner(address account) public view returns (bool) {
        return _owners.has(account);
    }

    function addOwner(address account) public onlyOwner {
        _addOwner(account);
    }

    function removeOwner(address account) public onlyOwner {
        require(msg.sender != account, "Owners cannot remove themselves as owner");
        _removeOwner(account);
    }

    function _addOwner(address account) internal {
        _owners.add(account);
        emit OwnerAdded(account, msg.sender);
    }

    function _removeOwner(address account) internal {
        _owners.remove(account);
        emit OwnerRemoved(account, msg.sender);
    }
}

// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: 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
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.5.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20Mintable}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

     /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

// File: contracts/roles/RevokerRole.sol

pragma solidity 0.5.8;


contract RevokerRole is OwnerRole {

    event RevokerAdded(address indexed addedRevoker, address indexed addedBy);
    event RevokerRemoved(address indexed removedRevoker, address indexed removedBy);

    Roles.Role private _revokers;

    modifier onlyRevoker() {
        require(isRevoker(msg.sender), "RevokerRole: caller does not have the Revoker role");
        _;
    }

    function isRevoker(address account) public view returns (bool) {
        return _revokers.has(account);
    }

    function addRevoker(address account) public onlyOwner {
        _addRevoker(account);
    }

    function removeRevoker(address account) public onlyOwner {
        _removeRevoker(account);
    }

    function _addRevoker(address account) internal {
        _revokers.add(account);
        emit RevokerAdded(account, msg.sender);
    }

    function _removeRevoker(address account) internal {
        _revokers.remove(account);
        emit RevokerRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Revocable.sol

pragma solidity 0.5.8;



/**
 * Allows an administrator to move tokens from a target account to their own.
 */
contract Revocable is ERC20, RevokerRole {

  event Revoke(address indexed revoker, address indexed from, uint256 amount);

  function revoke(
    address _from,
    uint256 _amount
  )
    public
    onlyRevoker
    returns (bool)
  {
    ERC20._transfer(_from, msg.sender, _amount);
    emit Revoke(msg.sender, _from, _amount);
    return true;
  }
}

// File: contracts/roles/WhitelisterRole.sol

pragma solidity 0.5.8;


contract WhitelisterRole is OwnerRole {

    event WhitelisterAdded(address indexed addedWhitelister, address indexed addedBy);
    event WhitelisterRemoved(address indexed removedWhitelister, address indexed removedBy);

    Roles.Role private _whitelisters;

    modifier onlyWhitelister() {
        require(isWhitelister(msg.sender), "WhitelisterRole: caller does not have the Whitelister role");
        _;
    }

    function isWhitelister(address account) public view returns (bool) {
        return _whitelisters.has(account);
    }

    function addWhitelister(address account) public onlyOwner {
        _addWhitelister(account);
    }

    function removeWhitelister(address account) public onlyOwner {
        _removeWhitelister(account);
    }

    function _addWhitelister(address account) internal {
        _whitelisters.add(account);
        emit WhitelisterAdded(account, msg.sender);
    }

    function _removeWhitelister(address account) internal {
        _whitelisters.remove(account);
        emit WhitelisterRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Whitelistable.sol

pragma solidity 0.5.8;


/**
 * @title Whitelistable
 * @dev Allows tracking whether addressess are allowed to hold tokens.
 */
contract Whitelistable is WhitelisterRole {

    event WhitelistUpdate(address _address, bool status, string data);

    // Tracks whether an address is whitelisted
    // data field can track any external field (like a hash of personal details)
    struct whiteListItem {
        bool status;
        string data;
    }

    // white list status
    mapping (address => whiteListItem) public whitelist;

    /**
    * @dev Set a white list address
    * @param to the address to be set
    * @param status the whitelisting status (true for yes, false for no)
    * @param data a string with data about the whitelisted address
    */
    function setWhitelist(address to, bool status, string memory data)  public onlyWhitelister returns(bool){
        whitelist[to] = whiteListItem(status, data);
        emit WhitelistUpdate(to, status, data);
        return true;
    }

    /**
    * @dev Get the status of the whitelist
    * @param _address the address to be check
    */
    function getWhitelistStatus(address _address) public view returns(bool){
        return whitelist[_address].status;
    }

    /**
    * @dev Get the data of and address in the whitelist
    * @param _address the address to retrieve the data from
    */
    function getWhitelistData(address _address) public view returns(string memory){
        return whitelist[_address].data;
    }

    /**
    * @dev Determine if sender and receiver are whitelisted, return true if both accounts are whitelisted
    * @param from The address sending tokens.
    * @param to The address receiving tokens.
    */
    function checkWhitelists(address from, address to) external view returns (bool) {
        return whitelist[from].status && whitelist[to].status;
    }
}

// File: contracts/roles/TimelockerRole.sol

pragma solidity 0.5.8;


contract TimelockerRole is OwnerRole {

    event TimelockerAdded(address indexed addedTimelocker, address indexed addedBy);
    event TimelockerRemoved(address indexed removedTimelocker, address indexed removedBy);

    Roles.Role private _timelockers;

    modifier onlyTimelocker() {
        require(isTimelocker(msg.sender), "TimelockerRole: caller does not have the Timelocker role");
        _;
    }

    function isTimelocker(address account) public view returns (bool) {
        return _timelockers.has(account);
    }

    function addTimelocker(address account) public onlyOwner {
        _addTimelocker(account);
    }

    function removeTimelocker(address account) public onlyOwner {
        _removeTimelocker(account);
    }

    function _addTimelocker(address account) internal {
        _timelockers.add(account);
        emit TimelockerAdded(account, msg.sender);
    }

    function _removeTimelocker(address account) internal {
        _timelockers.remove(account);
        emit TimelockerRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Timelockable.sol

pragma solidity 0.5.8;



/**
 * @title Hag Timelockable
 * @dev Lockup all or a portion of an accounts tokens until an expiration date
 */
contract Timelockable is TimelockerRole {

    using SafeMath for uint256;

    struct lockupItem {
        uint256 amount;
        uint256 releaseTime;
    }

    mapping (address => lockupItem) lockups;

    event AccountLock(address _address, uint256 amount, uint256 releaseTime);
    event AccountRelease(address _address, uint256 amount);


    /**
    * @dev lock address and amount and lock it, set the release time
    * @param _address the address to lock
    * @param amount the amount to lock
    * @param releaseTime of the locked amount (in seconds since the epoch)
    */
    function lock( address _address, uint256 amount, uint256 releaseTime) public onlyTimelocker returns (bool) {
        require(releaseTime > block.timestamp, "Release time needs to be in the future");
        require(_address != address(0), "Address must be valid for lockup");

        lockupItem memory _lockupItem = lockupItem(amount, releaseTime);
        lockups[_address] = _lockupItem;
        emit AccountLock(_address, amount, releaseTime);
        return true;
    }

    /**
    * @dev release locked amount
    * @param _address the address to retrieve the data from
    * @param amountToRelease the amount to check
    */
    function release( address _address, uint256 amountToRelease) public onlyTimelocker returns(bool) {
        require(_address != address(0), "Address must be valid for release");

        uint256 _lockedAmount = lockups[_address].amount;

        // nothing to release
        if(_lockedAmount == 0){
            emit AccountRelease(_address, 0);
            return true;
        }

        // extract release time for re-locking
        uint256 _releaseTime = lockups[_address].releaseTime;

        // delete the lock entry
        delete lockups[_address];

        if(_lockedAmount >= amountToRelease){
           uint256 newLockedAmount = _lockedAmount.sub(amountToRelease);

           // re-lock the new locked balance
           lock(_address, newLockedAmount, _releaseTime);
           emit AccountRelease(_address, amountToRelease);
           return true;
        } else {
            // if they requested to release more than the locked amount emit the event with the locked amount that has been released
            emit AccountRelease(_address, _lockedAmount);
            return true;
        }
    }

    /**
    * @dev return true if the given account has enough unlocked tokens to send the requested amount
    * @param _address the address to retrieve the data from
    * @param amount the amount to send
    * @param balance the token balance of the sending account
    */
    function checkTimelock(address _address, uint256 amount, uint256 balance) external view returns (bool) {
        // if the user does not have enough tokens to send regardless of lock return true here
        // the failure will still fail but this should make it explicit that the transfer failure is not
        // due to locked tokens but because of too low token balance
        if (balance < amount) {
            return true;
        }

        // get the sending addresses token balance that is not locked
        uint256 nonLockedAmount = balance.sub(lockups[_address].amount);

        // determine if the sending address has enough free tokens to send the entire amount
        bool notLocked = amount <= nonLockedAmount;

        // if the timelock is greater then the release time the time lock is expired
        bool timeLockExpired = block.timestamp > lockups[_address].releaseTime;

        // if the timelock is expired OR the requested amount is available the transfer is not locked
        if(timeLockExpired || notLocked){
            return true;

        // if the timelocked is not expired AND the requested amount is not available the tranfer is locked
        } else {
            return false;
        }
    }

    /**
    * @dev get address lockup info
    * @param _address the address to retrieve the data from
    * @return array of 2 uint256, release time (in seconds since the epoch) and amount (in HAG)
    */
    function checkLockup(address _address) public view returns(uint256, uint256) {
        // copy lockup data into memory
        lockupItem memory _lockupItem = lockups[_address];

        return (_lockupItem.releaseTime, _lockupItem.amount);
    }
}

// File: contracts/roles/PauserRole.sol

pragma solidity 0.5.8;


contract PauserRole is OwnerRole {

    event PauserAdded(address indexed addedPauser, address indexed addedBy);
    event PauserRemoved(address indexed removedPauser, address indexed removedBy);

    Roles.Role private _pausers;

    modifier onlyPauser() {
        require(isPauser(msg.sender), "PauserRole: caller does not have the Pauser role");
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyOwner {
        _addPauser(account);
    }

    function removePauser(address account) public onlyOwner {
        _removePauser(account);
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account, msg.sender);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Pausable.sol

pragma solidity 0.5.8;


/**
 * Allows transfers on a token contract to be paused by an administrator.
 */
contract Pausable is PauserRole {
    event Paused();
    event Unpaused();

    bool private _paused;

    /**
     * @return true if the contract is paused, false otherwise.
     */
    function paused() external view returns (bool) {
        return _paused;
    }

    /**
     * @dev internal function, triggers paused state
     */
    function _pause() internal {
        _paused = true;
        emit Paused();
    }

    /**
     * @dev internal function, returns to unpaused state
     */
    function _unpause() internal {
        _paused = false;
        emit Unpaused();
    }

     /**
     * @dev called by pauser role to pause, triggers stopped state
     */
    function pause() public onlyPauser {
        _pause();
    }

    /**
     * @dev called by pauer role to unpause, returns to normal state
     */
    function unpause() public onlyPauser {
        _unpause();
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol

pragma solidity ^0.5.0;


/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

pragma solidity ^0.5.0;

contract MinterRole is OwnerRole {

    event MinterAdded(address indexed addedMinter, address indexed addedBy);
    event MinterRemoved(address indexed removedMinter, address indexed removedBy);

    Roles.Role private _minters;

    modifier onlyMinter() {
        require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role");
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.has(account);
    }

    function _addMinter(address account) internal {
        _minters.add(account);
        emit MinterAdded(account, msg.sender);
    }

    function _removeMinter(address account) internal {
        _minters.remove(account);
        emit MinterRemoved(account, msg.sender);
    }

    function addMinter(address account) public onlyOwner {
        _addMinter(account);
    }

    function removeMinter(address account) public onlyOwner {
        _removeMinter(account);
    }

}

pragma solidity ^0.5.0;

contract Mintable is ERC20, MinterRole {
  event Mint(address indexed minter, address indexed to, uint256 amount);

  function _mint(address minter, address to, uint256 amount) internal returns (bool) {
      ERC20._mint(to, amount);
      emit Mint(minter, to, amount);
      return true;
  }

  /**
  Allow Owners to mint tokens to valid addresses
  */
  function mint(address account, uint256 amount) public onlyMinter returns (bool) {
      return Mintable._mint(msg.sender, account, amount);
  }
}

pragma solidity ^0.5.0;

contract BurnerRole is OwnerRole {

    event BurnerAdded(address indexed addedBurner, address indexed addedBy);
    event BurnerRemoved(address indexed removedBurner, address indexed removedBy);

    Roles.Role private _burners;

    modifier onlyBurner() {
        require(isBurner(msg.sender), "BurnerRole: caller does not have the Burner role");
        _;
    }

    function isBurner(address account) public view returns (bool) {
        return _burners.has(account);
    }

    function _addBurner(address account) internal {
        _burners.add(account);
        emit BurnerAdded(account, msg.sender);
    }

    function _removeBurner(address account) internal {
        _burners.remove(account);
        emit BurnerRemoved(account, msg.sender);
    }

    function addBurner(address account) public onlyOwner {
        _addBurner(account);
    }

    function removeBurner(address account) public onlyOwner {
        _removeBurner(account);
    }

}

pragma solidity ^0.5.0;


contract Burnable is ERC20, BurnerRole {
  event Burn(address indexed burner, address indexed from, uint256 amount);

  function _burn(address burner, address from, uint256 amount) internal returns (bool) {
      ERC20._burn(from, amount);
      emit Burn(burner, from, amount);
      return true;
  }

  /**
  Allow Burners to burn tokens from valid addresses
  */
  function burn(address account, uint256 amount) public onlyBurner returns (bool) {
      return _burn(msg.sender, account, amount);
  }
}

// File: contracts/HagToken.sol

pragma solidity 0.5.8;

contract HagToken is IERC1404, IERC1404Validators, IERC20, ERC20Detailed, OwnerRole, Revocable, Whitelistable, Timelockable, Pausable, Mintable, Burnable {

    // Token Details
    string constant TOKEN_NAME = "HAG Token";
    string constant TOKEN_SYMBOL = "HAG";
    uint8 constant TOKEN_DECIMALS = 18;

    // Token supply - 1.2 Million Tokens, with 18 decimal precision
    uint256 constant ONE_POINT_TWO_MILLION = 1200000;
    uint256 constant TOKEN_SUPPLY = ONE_POINT_TWO_MILLION * (10 ** uint256(TOKEN_DECIMALS));

    // This tracks the external contract where restriction logic is executed
    IERC1404Success private transferRestrictions;

    // Event tracking when restriction logic contract is updated
    event RestrictionsUpdated (address newRestrictionsAddress, address updatedBy);

    /**
    Constructor for the token to set readable details and mint all tokens
    to the specified owner.
    */
    constructor(address owner) public
        ERC20Detailed(TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS)
    {
        _mint(owner, TOKEN_SUPPLY);
        _addOwner(owner);
    }

    /**
    Function that can only be called by an owner that updates the address
    with the ERC1404 Transfer Restrictions defined
    */
    function updateTransferRestrictions(address _newRestrictionsAddress)
        public
        onlyOwner
        returns (bool)
    {
        transferRestrictions = IERC1404Success(_newRestrictionsAddress);
        emit RestrictionsUpdated(address(transferRestrictions), msg.sender);
        return true;
    }

    /**
    The address with the Transfer Restrictions contract
    */
    function getRestrictionsAddress () public view returns (address) {
        return address(transferRestrictions);
    }


    /**
    This function detects whether a transfer should be restricted and not allowed.
    If the function returns SUCCESS_CODE (0) then it should be allowed.
    */
    function detectTransferRestriction (address from, address to, uint256 amount)
        public
        view
        returns (uint8)
    {
        // Verify the external contract is valid
        require(address(transferRestrictions) != address(0), 'TransferRestrictions contract must be set');

        // call detectTransferRestriction on the current transferRestrictions contract
        return transferRestrictions.detectTransferRestriction(from, to, amount);
    }

    /**
    This function detects whether a transferFrom should be restricted and not allowed.
    If the function returns SUCCESS_CODE (0) then it should be allowed.
    */
    function detectTransferFromRestriction (address sender, address from, address to, uint256 amount)
        public
        view
        returns (uint8)
    {
        // Verify the external contract is valid
        require(address(transferRestrictions) != address(0), 'TransferRestrictions contract must be set');

        // call detectTransferFromRestriction on the current transferRestrictions contract
        return  transferRestrictions.detectTransferFromRestriction(sender, from, to, amount);
    }

    /**
    This function allows a wallet or other client to get a human readable string to show
    a user if a transfer was restricted.  It should return enough information for the user
    to know why it failed.
    */
    function messageForTransferRestriction (uint8 restrictionCode)
        external
        view
        returns (string memory)
    {
        // call messageForTransferRestriction on the current transferRestrictions contract
        return transferRestrictions.messageForTransferRestriction(restrictionCode);
    }

    /**
    Evaluates whether a transfer should be allowed or not.
    */
    modifier notRestricted (address from, address to, uint256 value) {
        uint8 restrictionCode = transferRestrictions.detectTransferRestriction(from, to, value);
        require(restrictionCode == transferRestrictions.getSuccessCode(), transferRestrictions.messageForTransferRestriction(restrictionCode));
        _;
    }

    /**
    Evaluates whether a transferFrom should be allowed or not.
    */
    modifier notRestrictedTransferFrom (address sender, address from, address to, uint256 value) {
        uint8 transferFromRestrictionCode = transferRestrictions.detectTransferFromRestriction(sender, from, to, value);
        require(transferFromRestrictionCode == transferRestrictions.getSuccessCode(), transferRestrictions.messageForTransferRestriction(transferFromRestrictionCode));
        _;
    }

    /**
    Overrides the parent class token transfer function to enforce restrictions.
    */
    function transfer (address to, uint256 value)
        public
        notRestricted(msg.sender, to, value)
        returns (bool success)
    {
        success = ERC20.transfer(to, value);
    }

    /**
    Overrides the parent class token transferFrom function to enforce restrictions.
    */
    function transferFrom (address from, address to, uint256 value)
        public
        notRestrictedTransferFrom(msg.sender, from, to, value)
        returns (bool success)
    {
        success = ERC20.transferFrom(from, to, value);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addTimelocker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"amountToRelease","type":"uint256"}],"name":"release","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRestrictionsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"sender","type":"address"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"detectTransferFromRestriction","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isTimelocker","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"status","type":"bool"},{"name":"data","type":"string"}],"name":"setWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isBurner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getWhitelistData","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isWhitelister","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"restrictionCode","type":"uint8"}],"name":"messageForTransferRestriction","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeWhitelister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeTimelocker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addRevoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"}],"name":"checkWhitelists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"checkLockup","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"status","type":"bool"},{"name":"data","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeRevoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"},{"name":"amount","type":"uint256"},{"name":"balance","type":"uint256"}],"name":"checkTimelock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"detectTransferRestriction","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getWhitelistStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newRestrictionsAddress","type":"address"}],"name":"updateTransferRestrictions","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":false,"inputs":[{"name":"_address","type":"address"},{"name":"amount","type":"uint256"},{"name":"releaseTime","type":"uint256"}],"name":"lock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"}],"name":"revoke","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addWhitelister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isRevoker","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRestrictionsAddress","type":"address"},{"indexed":false,"name":"updatedBy","type":"address"}],"name":"RestrictionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedBurner","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedBurner","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"minter","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedMinter","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedMinter","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedPauser","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedPauser","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"releaseTime","type":"uint256"}],"name":"AccountLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"AccountRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedTimelocker","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"TimelockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedTimelocker","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"TimelockerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"status","type":"bool"},{"indexed":false,"name":"data","type":"string"}],"name":"WhitelistUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedWhitelister","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"WhitelisterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedWhitelister","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"WhitelisterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"revoker","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedRevoker","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"RevokerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedRevoker","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"RevokerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedOwner","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedOwner","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"OwnerRemoved","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"},{"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"}]

60806040523480156200001157600080fd5b5060405160208062003b4c833981018060405260208110156200003357600080fd5b5051604080518082018252600981527f48414720546f6b656e000000000000000000000000000000000000000000000060208281019182528351808501909452600384527f4841470000000000000000000000000000000000000000000000000000000000908401528151919291601291620000b391600091906200042c565b508151620000c99060019060208501906200042c565b506002805460ff191660ff9290921691909117905550620000fe90508169fe1c215e8f838e00000062000116602090811b901c565b6200010f816200023560201b60201c565b50620004d1565b6001600160a01b0382166200018c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b620001a8816005546200028960201b620028c31790919060201c565b6005556001600160a01b038216600090815260036020908152604090912054620001dd918390620028c362000289821b17901c565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b620002508160066200030560201b62002f721790919060201c565b60405133906001600160a01b038316907fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a90600090a350565b600082820183811015620002fe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b620003178282620003a960201b60201c565b156200038457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018062003b2a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200046f57805160ff19168380011785556200049f565b828001600101855582156200049f579182015b828111156200049f57825182559160200191906001019062000482565b50620004ad929150620004b1565b5090565b620004ce91905b80821115620004ad5760008155600101620004b8565b90565b61364980620004e16000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c80637f4ab1dd1161019d578063a9059cbb116100e9578063db0cc92a116100a2578063eac449d91161007c578063eac449d914610bc3578063eaf9144a14610bef578063f44637ba14610c15578063f6c4b01f14610c3b5761030c565b8063db0cc92a14610b3d578063dd62ed3e14610b63578063e2ab691d14610b915761030c565b8063a9059cbb14610a37578063aa271e1a14610a63578063c06f8b9414610a89578063c697e4a314610aaf578063d4ce141514610ae1578063d9ba32fc14610b175761030c565b8063961a66f6116101565780639a6e292f116101305780639a6e292f146108f75780639b19251a146109365780639dc29fac146109df578063a457c2d714610a0b5761030c565b8063961a66f61461087d578063983b2d56146108a357806399da091d146108c95761030c565b80637f4ab1dd146107db57806382c3f79c146107fb57806382dc1ec414610821578063841aca44146108475780638456cb591461086d57806395d89b41146108755761030c565b80633092afd51161025c57806346fbf68e116102155780636b2c0f55116101ef5780636b2c0f55146107435780637065cb481461076957806370a082311461078f5780637d0c269f146107b55761030c565b806346fbf68e146106ef5780635c975abb1461071557806368aa98131461071d5761030c565b80633092afd51461063b578063313ce5671461066157806339509351146106695780633f4ba83a1461069557806340c10f191461069d5780634334614a146106c95761030c565b8063095ea7b3116102c957806318160ddd116102a357806318160ddd1461050a57806323b872dd1461052457806327ac19751461055a5780632f54bf6e146106155761030c565b8063095ea7b3146104925780630c57133f146104be578063173825d9146104e45761030c565b80630284685814610311578063031d4053146103395780630357371d1461035f57806305557bd41461039f57806306fdde03146103c35780630754cede14610440575b600080fd5b6103376004803603602081101561032757600080fd5b50356001600160a01b0316610c61565b005b6103376004803603602081101561034f57600080fd5b50356001600160a01b0316610cb4565b61038b6004803603604081101561037557600080fd5b506001600160a01b038135169060200135610d04565b604080519115158252519081900360200190f35b6103a7610eef565b604080516001600160a01b039092168252519081900360200190f35b6103cb610eff565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104055781810151838201526020016103ed565b50505050905090810190601f1680156104325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61047c6004803603608081101561045657600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610f95565b6040805160ff9092168252519081900360200190f35b61038b600480360360408110156104a857600080fd5b506001600160a01b03813516906020013561107e565b61038b600480360360208110156104d457600080fd5b50356001600160a01b031661109b565b610337600480360360208110156104fa57600080fd5b50356001600160a01b03166110ae565b610512611149565b60408051918252519081900360200190f35b61038b6004803603606081101561053a57600080fd5b506001600160a01b0381358116916020810135909116906040013561114f565b61038b6004803603606081101561057057600080fd5b6001600160a01b03823516916020810135151591810190606081016040820135600160201b8111156105a157600080fd5b8201836020820111156105b357600080fd5b803590602001918460018302840111600160201b831117156105d457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113e9945050505050565b61038b6004803603602081101561062b57600080fd5b50356001600160a01b0316611552565b6103376004803603602081101561065157600080fd5b50356001600160a01b0316611565565b61047c6115b5565b61038b6004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356115be565b610337611617565b61038b600480360360408110156106b357600080fd5b506001600160a01b038135169060200135611668565b61038b600480360360208110156106df57600080fd5b50356001600160a01b03166116bc565b61038b6004803603602081101561070557600080fd5b50356001600160a01b03166116cf565b61038b6116e2565b6103cb6004803603602081101561073357600080fd5b50356001600160a01b03166116eb565b6103376004803603602081101561075957600080fd5b50356001600160a01b03166117b5565b6103376004803603602081101561077f57600080fd5b50356001600160a01b0316611805565b610512600480360360208110156107a557600080fd5b50356001600160a01b0316611855565b61038b600480360360208110156107cb57600080fd5b50356001600160a01b0316611870565b6103cb600480360360208110156107f157600080fd5b503560ff16611883565b6103376004803603602081101561081157600080fd5b50356001600160a01b0316611960565b6103376004803603602081101561083757600080fd5b50356001600160a01b03166119b0565b6103376004803603602081101561085d57600080fd5b50356001600160a01b0316611a00565b610337611a50565b6103cb611a9f565b6103376004803603602081101561089357600080fd5b50356001600160a01b0316611aff565b610337600480360360208110156108b957600080fd5b50356001600160a01b0316611b4f565b61038b600480360360408110156108df57600080fd5b506001600160a01b0381358116916020013516611b9f565b61091d6004803603602081101561090d57600080fd5b50356001600160a01b0316611be3565b6040805192835260208301919091528051918290030190f35b61095c6004803603602081101561094c57600080fd5b50356001600160a01b0316611c2a565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109a357818101518382015260200161098b565b50505050905090810190601f1680156109d05780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61038b600480360360408110156109f557600080fd5b506001600160a01b038135169060200135611cd8565b61038b60048036036040811015610a2157600080fd5b506001600160a01b038135169060200135611d2c565b61038b60048036036040811015610a4d57600080fd5b506001600160a01b038135169060200135611d9a565b61038b60048036036020811015610a7957600080fd5b50356001600160a01b0316611fea565b61033760048036036020811015610a9f57600080fd5b50356001600160a01b0316611ffd565b61038b60048036036060811015610ac557600080fd5b506001600160a01b03813516906020810135906040013561204d565b61047c60048036036060811015610af757600080fd5b506001600160a01b038135811691602081013590911690604001356120d5565b61038b60048036036020811015610b2d57600080fd5b50356001600160a01b03166121b5565b61038b60048036036020811015610b5357600080fd5b50356001600160a01b03166121d3565b61051260048036036040811015610b7957600080fd5b506001600160a01b0381358116916020013516612281565b61038b60048036036060811015610ba757600080fd5b506001600160a01b0381351690602081013590604001356122ac565b61038b60048036036040811015610bd957600080fd5b506001600160a01b038135169060200135612421565b61033760048036036020811015610c0557600080fd5b50356001600160a01b03166124be565b61033760048036036020811015610c2b57600080fd5b50356001600160a01b031661250e565b61038b60048036036020811015610c5157600080fd5b50356001600160a01b031661255e565b610c6a33611552565b610ca857604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612571565b50565b610cbd33611552565b610cfb57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb1816125bb565b6000610d0f3361109b565b610d4d57604051600160e51b62461bcd0281526004018080602001828103825260388152602001806133666038913960400191505060405180910390fd5b6001600160a01b038316610d9557604051600160e51b62461bcd0281526004018080602001828103825260218152602001806135af6021913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090205480610e0157604080516001600160a01b03861681526000602082015281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a16001915050610ee9565b6001600160a01b0384166000908152600b602052604081206001810180549183905591909155838210610e9e576000610e40838663ffffffff61260516565b9050610e4d8682846122ac565b50604080516001600160a01b03881681526020810187905281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a160019350505050610ee9565b604080516001600160a01b03871681526020810184905281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a16001925050505b92915050565b6010546001600160a01b03165b90565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b820191906000526020600020905b815481529060010190602001808311610f6e57829003601f168201915b5050505050905090565b6010546000906001600160a01b0316610fe257604051600160e51b62461bcd0281526004018080602001828103825260298152602001806135f56029913960400191505060405180910390fd5b60105460408051600160e11b6303aa676f0281526001600160a01b038881166004830152878116602483015286811660448301526064820186905291519190921691630754cede916084808301926020929190829003018186803b15801561104957600080fd5b505afa15801561105d573d6000803e3d6000fd5b505050506040513d602081101561107357600080fd5b505195945050505050565b600061109261108b612647565b848461264b565b50600192915050565b6000610ee9600a8363ffffffff61273d16565b6110b733611552565b6110f557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b336001600160a01b038216141561114057604051600160e51b62461bcd0281526004018080602001828103825260288152602001806134bd6028913960400191505060405180910390fd5b610cb1816127a7565b60055490565b60105460408051600160e11b6303aa676f02815233600482018190526001600160a01b03808816602484015280871660448401526064830186905292516000949193889388938893889390911691630754cede916084808301926020929190829003018186803b1580156111c257600080fd5b505afa1580156111d6573d6000803e3d6000fd5b505050506040513d60208110156111ec57600080fd5b505160105460408051600160e01b635ec6475902815290519293506001600160a01b0390911691635ec6475991600480820192602092909190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d602081101561126357600080fd5b505160105460408051600160e01b637f4ab1dd02815260ff851660048201819052915191909314926001600160a01b0390921691637f4ab1dd916024808301926000929190829003018186803b1580156112bc57600080fd5b505afa1580156112d0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156112f957600080fd5b810190808051600160201b81111561131057600080fd5b8201602081018481111561132357600080fd5b8151600160201b81118282018710171561133c57600080fd5b5050929190505050906113d057604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561139557818101518382015260200161137d565b50505050905090810190601f1680156113c25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506113dc8989896127f1565b9998505050505050505050565b60006113f433611870565b61143257604051600160e51b62461bcd02815260040180806020018281038252603a815260200180613551603a913960400191505060405180910390fd5b604080518082018252841515815260208082018581526001600160a01b038816600090815260098352939093208251815460ff19169015151781559251805192939261148492600185019201906131ea565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd584848460405180846001600160a01b03166001600160a01b031681526020018315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561150b5781810151838201526020016114f3565b50505050905090810190601f1680156115385780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15060015b9392505050565b6000610ee960068363ffffffff61273d16565b61156e33611552565b6115ac57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612879565b60025460ff1690565b60006110926115cb612647565b8461161285600460006115dc612647565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6128c316565b61264b565b611620336116cf565b61165e57604051600160e51b62461bcd0281526004018080602001828103825260308152602001806132e26030913960400191505060405180910390fd5b611666612920565b565b600061167333611fea565b6116b157604051600160e51b62461bcd0281526004018080602001828103825260308152602001806133f46030913960400191505060405180910390fd5b61154b338484612955565b6000610ee9600f8363ffffffff61273d16565b6000610ee9600c8363ffffffff61273d16565b600d5460ff1690565b606060096000836001600160a01b03166001600160a01b031681526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b50505050509050919050565b6117be33611552565b6117fc57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb1816129b6565b61180e33611552565b61184c57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a00565b6001600160a01b031660009081526003602052604090205490565b6000610ee960088363ffffffff61273d16565b60105460408051600160e01b637f4ab1dd02815260ff8416600482015290516060926001600160a01b031691637f4ab1dd916024808301926000929190829003018186803b1580156118d457600080fd5b505afa1580156118e8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561191157600080fd5b810190808051600160201b81111561192857600080fd5b8201602081018481111561193b57600080fd5b8151600160201b81118282018710171561195457600080fd5b50909695505050505050565b61196933611552565b6119a757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a4a565b6119b933611552565b6119f757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a94565b611a0933611552565b611a4757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612ade565b611a59336116cf565b611a9757604051600160e51b62461bcd0281526004018080602001828103825260308152602001806132e26030913960400191505060405180910390fd5b611666612b28565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b611b0833611552565b611b4657604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612b60565b611b5833611552565b611b9657604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612baa565b6001600160a01b03821660009081526009602052604081205460ff16801561154b5750506001600160a01b031660009081526009602052604090205460ff16919050565b600080611bee613268565b5050506001600160a01b03166000908152600b602090815260409182902082518084019093528054808452600190910154929091018290529091565b6009602090815260009182526040918290208054600180830180548651600261010094831615949094026000190190911692909204601f810186900486028301860190965285825260ff909216949293909290830182828015611cce5780601f10611ca357610100808354040283529160200191611cce565b820191906000526020600020905b815481529060010190602001808311611cb157829003601f168201915b5050505050905082565b6000611ce3336116bc565b611d2157604051600160e51b62461bcd0281526004018080602001828103825260308152602001806133c46030913960400191505060405180910390fd5b61154b338484612bf4565b6000611092611d39612647565b84611612856040518060600160405280602581526020016135d06025913960046000611d63612647565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff612c5516565b60105460408051600160e01b63d4ce141502815233600482018190526001600160a01b038087166024840152604483018690529251600094919387938793879392169163d4ce141591606480820192602092909190829003018186803b158015611e0357600080fd5b505afa158015611e17573d6000803e3d6000fd5b505050506040513d6020811015611e2d57600080fd5b505160105460408051600160e01b635ec6475902815290519293506001600160a01b0390911691635ec6475991600480820192602092909190829003018186803b158015611e7a57600080fd5b505afa158015611e8e573d6000803e3d6000fd5b505050506040513d6020811015611ea457600080fd5b505160105460408051600160e01b637f4ab1dd02815260ff851660048201819052915191909314926001600160a01b0390921691637f4ab1dd916024808301926000929190829003018186803b158015611efd57600080fd5b505afa158015611f11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f3a57600080fd5b810190808051600160201b811115611f5157600080fd5b82016020810184811115611f6457600080fd5b8151600160201b811182820187101715611f7d57600080fd5b505092919050505090611fd457604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561139557818101518382015260200161137d565b50611fdf8787612cb2565b979650505050505050565b6000610ee9600e8363ffffffff61273d16565b61200633611552565b61204457604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612cc6565b60008282101561205f5750600161154b565b6001600160a01b0384166000908152600b602052604081205461208990849063ffffffff61260516565b6001600160a01b0386166000908152600b60205260409020600101549091508185111590421180806120b85750815b156120c9576001935050505061154b565b6000935050505061154b565b6010546000906001600160a01b031661212257604051600160e51b62461bcd0281526004018080602001828103825260298152602001806135f56029913960400191505060405180910390fd5b60105460408051600160e01b63d4ce14150281526001600160a01b0387811660048301528681166024830152604482018690529151919092169163d4ce1415916064808301926020929190829003018186803b15801561218157600080fd5b505afa158015612195573d6000803e3d6000fd5b505050506040513d60208110156121ab57600080fd5b5051949350505050565b6001600160a01b031660009081526009602052604090205460ff1690565b60006121de33611552565b61221c57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b601080546001600160a01b0319166001600160a01b0384811691909117918290556040805192909116825233602083015280517f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe9281900390910190a1506001919050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60006122b73361109b565b6122f557604051600160e51b62461bcd0281526004018080602001828103825260388152602001806133666038913960400191505060405180910390fd5b42821161233657604051600160e51b62461bcd0281526004018080602001828103825260268152602001806135066026913960400191505060405180910390fd5b6001600160a01b0384166123945760408051600160e51b62461bcd02815260206004820181905260248201527f41646472657373206d7573742062652076616c696420666f72206c6f636b7570604482015290519081900360640190fd5b61239c613268565b5060408051808201825284815260208082018581526001600160a01b0388166000818152600b84528590208451815591516001909201919091558351908152908101869052808301859052915190917fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae919081900360600190a1506001949350505050565b600061242c3361255e565b61246a57604051600160e51b62461bcd0281526004018080602001828103825260328152602001806133346032913960400191505060405180910390fd5b612475833384612d10565b6040805183815290516001600160a01b0385169133917fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b9181900360200190a350600192915050565b6124c733611552565b61250557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612e74565b61251733611552565b61255557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612ebe565b6000610ee960078363ffffffff61273d16565b612582600f8263ffffffff612f0816565b60405133906001600160a01b038316907f85222465e0d438163a28671b59fc9ebeb03bf39f880ddd36c8315da7512b31c090600090a350565b6125cc600a8263ffffffff612f7216565b60405133906001600160a01b038316907f28f069fa8730ef5d44b24faedbcabf2b254c53f4e02a953476a4015e3067714190600090a350565b600061154b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c55565b3390565b6001600160a01b03831661269357604051600160e51b62461bcd02815260040180806020018281038252602481526020018061358b6024913960400191505060405180910390fd5b6001600160a01b0382166126db57604051600160e51b62461bcd0281526004018080602001828103825260228152602001806133126022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006001600160a01b03821661278757604051600160e51b62461bcd02815260040180806020018281038252602281526020018061349b6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6127b860068263ffffffff612f0816565b60405133906001600160a01b038316907fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367990600090a350565b60006127fe848484612d10565b61286f8461280a612647565b61161285604051806060016040528060288152602001613473602891396001600160a01b038a16600090815260046020526040812090612848612647565b6001600160a01b03168152602081019190915260400160002054919063ffffffff612c5516565b5060019392505050565b61288a600e8263ffffffff612f0816565b60405133906001600160a01b038316907f4b5ef9a786cf64a7d82ebcf2d5132667edc9faef4ac36260d9a9e52c526b623290600090a350565b60008282018381101561154b5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60006129618383612ff6565b826001600160a01b0316846001600160a01b03167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040518082815260200191505060405180910390a35060019392505050565b6129c7600c8263ffffffff612f0816565b60405133906001600160a01b038316907fb75903ade4a0fdb07d60c882c22c779e2e1c751883c37aecdcc92a8ec72b046e90600090a350565b612a1160068263ffffffff612f7216565b60405133906001600160a01b038316907fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a90600090a350565b612a5b60088263ffffffff612f0816565b60405133906001600160a01b038316907f3ed21605dd544629fb45f2ccaedcc095ba1dbea540fb6eaf5493a7479856b0be90600090a350565b612aa5600c8263ffffffff612f7216565b60405133906001600160a01b038316907fe0953c403a52f9dc1fef4202a8d33975c958b727bee0d7b5b328965ddad98d8190600090a350565b612aef600a8263ffffffff612f0816565b60405133906001600160a01b038316907f1bac2ef39c5011bb7c20ecf6bc7cb986695b3f432a149d898c0ed368e55c780690600090a350565b600d805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b612b7160078263ffffffff612f7216565b60405133906001600160a01b038316907f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe297019690600090a350565b612bbb600e8263ffffffff612f7216565b60405133906001600160a01b038316907f3c091dafb1d99e4a4c333024492eac3b2cd8bf921a3dd547c937db33be307bb890600090a350565b6000612c0083836130eb565b826001600160a01b0316846001600160a01b03167fbac40739b0d4ca32fa2d82fc91630465ba3eddd1598da6fca393b26fb63b9453846040518082815260200191505060405180910390a35060019392505050565b60008184841115612caa57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561139557818101518382015260200161137d565b505050900390565b6000611092612cbf612647565b8484612d10565b612cd760078263ffffffff612f0816565b60405133906001600160a01b038316907fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b90600090a350565b6001600160a01b038316612d5857604051600160e51b62461bcd02815260040180806020018281038252602581526020018061352c6025913960400191505060405180910390fd5b6001600160a01b038216612da057604051600160e51b62461bcd02815260040180806020018281038252602381526020018061329d6023913960400191505060405180910390fd5b612de38160405180606001604052806026815260200161339e602691396001600160a01b038616600090815260036020526040902054919063ffffffff612c5516565b6001600160a01b038085166000908152600360205260408082209390935590841681522054612e18908263ffffffff6128c316565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b612e8560088263ffffffff612f7216565b60405133906001600160a01b038316907f5f36f4f5999f34947706fca376b955319b858573bf9d6bc59303c9a4cd80ced090600090a350565b612ecf600f8263ffffffff612f7216565b60405133906001600160a01b038316907f86515ebaad527298e98929c064c075f5a2604cc80afc0db29e73c01a36f8e98c90600090a350565b612f12828261273d565b612f5057604051600160e51b62461bcd0281526004018080602001828103825260218152602001806134526021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b612f7c828261273d565b15612fd15760408051600160e51b62461bcd02815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b0382166130545760408051600160e51b62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554613067908263ffffffff6128c316565b6005556001600160a01b038216600090815260036020526040902054613093908263ffffffff6128c316565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661313357604051600160e51b62461bcd0281526004018080602001828103825260218152602001806134e56021913960400191505060405180910390fd5b613176816040518060600160405280602281526020016132c0602291396001600160a01b038516600090815260036020526040902054919063ffffffff612c5516565b6001600160a01b0383166000908152600360205260409020556005546131a2908263ffffffff61260516565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061322b57805160ff1916838001178555613258565b82800160010185558215613258579182015b8281111561325857825182559160200191906001019061323d565b50613264929150613282565b5090565b604051806040016040528060008152602001600081525090565b610efc91905b80821115613264576000815560010161328856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6545524332303a20617070726f766520746f20746865207a65726f20616464726573735265766f6b6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205265766f6b657220726f6c6554696d656c6f636b6572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652054696d656c6f636b657220726f6c6545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654275726e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204275726e657220726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c654f776e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204f776e657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f776e6572732063616e6e6f742072656d6f7665207468656d73656c766573206173206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737352656c656173652074696d65206e6565647320746f20626520696e207468652066757475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737357686974656c6973746572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374657220726f6c6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737341646472657373206d7573742062652076616c696420666f722072656c6561736545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5472616e736665725265737472696374696f6e7320636f6e7472616374206d75737420626520736574a165627a7a723058207d3afabbceccff0bda34b20c92cb0f58a5a8aa735387152c8f3e7670e0e4c4960029526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373000000000000000000000000e4dc667f92b9d110a307b265bf8afacdd0fd3c8c

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061030c5760003560e01c80637f4ab1dd1161019d578063a9059cbb116100e9578063db0cc92a116100a2578063eac449d91161007c578063eac449d914610bc3578063eaf9144a14610bef578063f44637ba14610c15578063f6c4b01f14610c3b5761030c565b8063db0cc92a14610b3d578063dd62ed3e14610b63578063e2ab691d14610b915761030c565b8063a9059cbb14610a37578063aa271e1a14610a63578063c06f8b9414610a89578063c697e4a314610aaf578063d4ce141514610ae1578063d9ba32fc14610b175761030c565b8063961a66f6116101565780639a6e292f116101305780639a6e292f146108f75780639b19251a146109365780639dc29fac146109df578063a457c2d714610a0b5761030c565b8063961a66f61461087d578063983b2d56146108a357806399da091d146108c95761030c565b80637f4ab1dd146107db57806382c3f79c146107fb57806382dc1ec414610821578063841aca44146108475780638456cb591461086d57806395d89b41146108755761030c565b80633092afd51161025c57806346fbf68e116102155780636b2c0f55116101ef5780636b2c0f55146107435780637065cb481461076957806370a082311461078f5780637d0c269f146107b55761030c565b806346fbf68e146106ef5780635c975abb1461071557806368aa98131461071d5761030c565b80633092afd51461063b578063313ce5671461066157806339509351146106695780633f4ba83a1461069557806340c10f191461069d5780634334614a146106c95761030c565b8063095ea7b3116102c957806318160ddd116102a357806318160ddd1461050a57806323b872dd1461052457806327ac19751461055a5780632f54bf6e146106155761030c565b8063095ea7b3146104925780630c57133f146104be578063173825d9146104e45761030c565b80630284685814610311578063031d4053146103395780630357371d1461035f57806305557bd41461039f57806306fdde03146103c35780630754cede14610440575b600080fd5b6103376004803603602081101561032757600080fd5b50356001600160a01b0316610c61565b005b6103376004803603602081101561034f57600080fd5b50356001600160a01b0316610cb4565b61038b6004803603604081101561037557600080fd5b506001600160a01b038135169060200135610d04565b604080519115158252519081900360200190f35b6103a7610eef565b604080516001600160a01b039092168252519081900360200190f35b6103cb610eff565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104055781810151838201526020016103ed565b50505050905090810190601f1680156104325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61047c6004803603608081101561045657600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610f95565b6040805160ff9092168252519081900360200190f35b61038b600480360360408110156104a857600080fd5b506001600160a01b03813516906020013561107e565b61038b600480360360208110156104d457600080fd5b50356001600160a01b031661109b565b610337600480360360208110156104fa57600080fd5b50356001600160a01b03166110ae565b610512611149565b60408051918252519081900360200190f35b61038b6004803603606081101561053a57600080fd5b506001600160a01b0381358116916020810135909116906040013561114f565b61038b6004803603606081101561057057600080fd5b6001600160a01b03823516916020810135151591810190606081016040820135600160201b8111156105a157600080fd5b8201836020820111156105b357600080fd5b803590602001918460018302840111600160201b831117156105d457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113e9945050505050565b61038b6004803603602081101561062b57600080fd5b50356001600160a01b0316611552565b6103376004803603602081101561065157600080fd5b50356001600160a01b0316611565565b61047c6115b5565b61038b6004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356115be565b610337611617565b61038b600480360360408110156106b357600080fd5b506001600160a01b038135169060200135611668565b61038b600480360360208110156106df57600080fd5b50356001600160a01b03166116bc565b61038b6004803603602081101561070557600080fd5b50356001600160a01b03166116cf565b61038b6116e2565b6103cb6004803603602081101561073357600080fd5b50356001600160a01b03166116eb565b6103376004803603602081101561075957600080fd5b50356001600160a01b03166117b5565b6103376004803603602081101561077f57600080fd5b50356001600160a01b0316611805565b610512600480360360208110156107a557600080fd5b50356001600160a01b0316611855565b61038b600480360360208110156107cb57600080fd5b50356001600160a01b0316611870565b6103cb600480360360208110156107f157600080fd5b503560ff16611883565b6103376004803603602081101561081157600080fd5b50356001600160a01b0316611960565b6103376004803603602081101561083757600080fd5b50356001600160a01b03166119b0565b6103376004803603602081101561085d57600080fd5b50356001600160a01b0316611a00565b610337611a50565b6103cb611a9f565b6103376004803603602081101561089357600080fd5b50356001600160a01b0316611aff565b610337600480360360208110156108b957600080fd5b50356001600160a01b0316611b4f565b61038b600480360360408110156108df57600080fd5b506001600160a01b0381358116916020013516611b9f565b61091d6004803603602081101561090d57600080fd5b50356001600160a01b0316611be3565b6040805192835260208301919091528051918290030190f35b61095c6004803603602081101561094c57600080fd5b50356001600160a01b0316611c2a565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109a357818101518382015260200161098b565b50505050905090810190601f1680156109d05780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61038b600480360360408110156109f557600080fd5b506001600160a01b038135169060200135611cd8565b61038b60048036036040811015610a2157600080fd5b506001600160a01b038135169060200135611d2c565b61038b60048036036040811015610a4d57600080fd5b506001600160a01b038135169060200135611d9a565b61038b60048036036020811015610a7957600080fd5b50356001600160a01b0316611fea565b61033760048036036020811015610a9f57600080fd5b50356001600160a01b0316611ffd565b61038b60048036036060811015610ac557600080fd5b506001600160a01b03813516906020810135906040013561204d565b61047c60048036036060811015610af757600080fd5b506001600160a01b038135811691602081013590911690604001356120d5565b61038b60048036036020811015610b2d57600080fd5b50356001600160a01b03166121b5565b61038b60048036036020811015610b5357600080fd5b50356001600160a01b03166121d3565b61051260048036036040811015610b7957600080fd5b506001600160a01b0381358116916020013516612281565b61038b60048036036060811015610ba757600080fd5b506001600160a01b0381351690602081013590604001356122ac565b61038b60048036036040811015610bd957600080fd5b506001600160a01b038135169060200135612421565b61033760048036036020811015610c0557600080fd5b50356001600160a01b03166124be565b61033760048036036020811015610c2b57600080fd5b50356001600160a01b031661250e565b61038b60048036036020811015610c5157600080fd5b50356001600160a01b031661255e565b610c6a33611552565b610ca857604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612571565b50565b610cbd33611552565b610cfb57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb1816125bb565b6000610d0f3361109b565b610d4d57604051600160e51b62461bcd0281526004018080602001828103825260388152602001806133666038913960400191505060405180910390fd5b6001600160a01b038316610d9557604051600160e51b62461bcd0281526004018080602001828103825260218152602001806135af6021913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090205480610e0157604080516001600160a01b03861681526000602082015281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a16001915050610ee9565b6001600160a01b0384166000908152600b602052604081206001810180549183905591909155838210610e9e576000610e40838663ffffffff61260516565b9050610e4d8682846122ac565b50604080516001600160a01b03881681526020810187905281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a160019350505050610ee9565b604080516001600160a01b03871681526020810184905281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a16001925050505b92915050565b6010546001600160a01b03165b90565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b820191906000526020600020905b815481529060010190602001808311610f6e57829003601f168201915b5050505050905090565b6010546000906001600160a01b0316610fe257604051600160e51b62461bcd0281526004018080602001828103825260298152602001806135f56029913960400191505060405180910390fd5b60105460408051600160e11b6303aa676f0281526001600160a01b038881166004830152878116602483015286811660448301526064820186905291519190921691630754cede916084808301926020929190829003018186803b15801561104957600080fd5b505afa15801561105d573d6000803e3d6000fd5b505050506040513d602081101561107357600080fd5b505195945050505050565b600061109261108b612647565b848461264b565b50600192915050565b6000610ee9600a8363ffffffff61273d16565b6110b733611552565b6110f557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b336001600160a01b038216141561114057604051600160e51b62461bcd0281526004018080602001828103825260288152602001806134bd6028913960400191505060405180910390fd5b610cb1816127a7565b60055490565b60105460408051600160e11b6303aa676f02815233600482018190526001600160a01b03808816602484015280871660448401526064830186905292516000949193889388938893889390911691630754cede916084808301926020929190829003018186803b1580156111c257600080fd5b505afa1580156111d6573d6000803e3d6000fd5b505050506040513d60208110156111ec57600080fd5b505160105460408051600160e01b635ec6475902815290519293506001600160a01b0390911691635ec6475991600480820192602092909190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d602081101561126357600080fd5b505160105460408051600160e01b637f4ab1dd02815260ff851660048201819052915191909314926001600160a01b0390921691637f4ab1dd916024808301926000929190829003018186803b1580156112bc57600080fd5b505afa1580156112d0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156112f957600080fd5b810190808051600160201b81111561131057600080fd5b8201602081018481111561132357600080fd5b8151600160201b81118282018710171561133c57600080fd5b5050929190505050906113d057604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561139557818101518382015260200161137d565b50505050905090810190601f1680156113c25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506113dc8989896127f1565b9998505050505050505050565b60006113f433611870565b61143257604051600160e51b62461bcd02815260040180806020018281038252603a815260200180613551603a913960400191505060405180910390fd5b604080518082018252841515815260208082018581526001600160a01b038816600090815260098352939093208251815460ff19169015151781559251805192939261148492600185019201906131ea565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd584848460405180846001600160a01b03166001600160a01b031681526020018315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561150b5781810151838201526020016114f3565b50505050905090810190601f1680156115385780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15060015b9392505050565b6000610ee960068363ffffffff61273d16565b61156e33611552565b6115ac57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612879565b60025460ff1690565b60006110926115cb612647565b8461161285600460006115dc612647565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6128c316565b61264b565b611620336116cf565b61165e57604051600160e51b62461bcd0281526004018080602001828103825260308152602001806132e26030913960400191505060405180910390fd5b611666612920565b565b600061167333611fea565b6116b157604051600160e51b62461bcd0281526004018080602001828103825260308152602001806133f46030913960400191505060405180910390fd5b61154b338484612955565b6000610ee9600f8363ffffffff61273d16565b6000610ee9600c8363ffffffff61273d16565b600d5460ff1690565b606060096000836001600160a01b03166001600160a01b031681526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b50505050509050919050565b6117be33611552565b6117fc57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb1816129b6565b61180e33611552565b61184c57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a00565b6001600160a01b031660009081526003602052604090205490565b6000610ee960088363ffffffff61273d16565b60105460408051600160e01b637f4ab1dd02815260ff8416600482015290516060926001600160a01b031691637f4ab1dd916024808301926000929190829003018186803b1580156118d457600080fd5b505afa1580156118e8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561191157600080fd5b810190808051600160201b81111561192857600080fd5b8201602081018481111561193b57600080fd5b8151600160201b81118282018710171561195457600080fd5b50909695505050505050565b61196933611552565b6119a757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a4a565b6119b933611552565b6119f757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a94565b611a0933611552565b611a4757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612ade565b611a59336116cf565b611a9757604051600160e51b62461bcd0281526004018080602001828103825260308152602001806132e26030913960400191505060405180910390fd5b611666612b28565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b611b0833611552565b611b4657604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612b60565b611b5833611552565b611b9657604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612baa565b6001600160a01b03821660009081526009602052604081205460ff16801561154b5750506001600160a01b031660009081526009602052604090205460ff16919050565b600080611bee613268565b5050506001600160a01b03166000908152600b602090815260409182902082518084019093528054808452600190910154929091018290529091565b6009602090815260009182526040918290208054600180830180548651600261010094831615949094026000190190911692909204601f810186900486028301860190965285825260ff909216949293909290830182828015611cce5780601f10611ca357610100808354040283529160200191611cce565b820191906000526020600020905b815481529060010190602001808311611cb157829003601f168201915b5050505050905082565b6000611ce3336116bc565b611d2157604051600160e51b62461bcd0281526004018080602001828103825260308152602001806133c46030913960400191505060405180910390fd5b61154b338484612bf4565b6000611092611d39612647565b84611612856040518060600160405280602581526020016135d06025913960046000611d63612647565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff612c5516565b60105460408051600160e01b63d4ce141502815233600482018190526001600160a01b038087166024840152604483018690529251600094919387938793879392169163d4ce141591606480820192602092909190829003018186803b158015611e0357600080fd5b505afa158015611e17573d6000803e3d6000fd5b505050506040513d6020811015611e2d57600080fd5b505160105460408051600160e01b635ec6475902815290519293506001600160a01b0390911691635ec6475991600480820192602092909190829003018186803b158015611e7a57600080fd5b505afa158015611e8e573d6000803e3d6000fd5b505050506040513d6020811015611ea457600080fd5b505160105460408051600160e01b637f4ab1dd02815260ff851660048201819052915191909314926001600160a01b0390921691637f4ab1dd916024808301926000929190829003018186803b158015611efd57600080fd5b505afa158015611f11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f3a57600080fd5b810190808051600160201b811115611f5157600080fd5b82016020810184811115611f6457600080fd5b8151600160201b811182820187101715611f7d57600080fd5b505092919050505090611fd457604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561139557818101518382015260200161137d565b50611fdf8787612cb2565b979650505050505050565b6000610ee9600e8363ffffffff61273d16565b61200633611552565b61204457604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612cc6565b60008282101561205f5750600161154b565b6001600160a01b0384166000908152600b602052604081205461208990849063ffffffff61260516565b6001600160a01b0386166000908152600b60205260409020600101549091508185111590421180806120b85750815b156120c9576001935050505061154b565b6000935050505061154b565b6010546000906001600160a01b031661212257604051600160e51b62461bcd0281526004018080602001828103825260298152602001806135f56029913960400191505060405180910390fd5b60105460408051600160e01b63d4ce14150281526001600160a01b0387811660048301528681166024830152604482018690529151919092169163d4ce1415916064808301926020929190829003018186803b15801561218157600080fd5b505afa158015612195573d6000803e3d6000fd5b505050506040513d60208110156121ab57600080fd5b5051949350505050565b6001600160a01b031660009081526009602052604090205460ff1690565b60006121de33611552565b61221c57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b601080546001600160a01b0319166001600160a01b0384811691909117918290556040805192909116825233602083015280517f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe9281900390910190a1506001919050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60006122b73361109b565b6122f557604051600160e51b62461bcd0281526004018080602001828103825260388152602001806133666038913960400191505060405180910390fd5b42821161233657604051600160e51b62461bcd0281526004018080602001828103825260268152602001806135066026913960400191505060405180910390fd5b6001600160a01b0384166123945760408051600160e51b62461bcd02815260206004820181905260248201527f41646472657373206d7573742062652076616c696420666f72206c6f636b7570604482015290519081900360640190fd5b61239c613268565b5060408051808201825284815260208082018581526001600160a01b0388166000818152600b84528590208451815591516001909201919091558351908152908101869052808301859052915190917fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae919081900360600190a1506001949350505050565b600061242c3361255e565b61246a57604051600160e51b62461bcd0281526004018080602001828103825260328152602001806133346032913960400191505060405180910390fd5b612475833384612d10565b6040805183815290516001600160a01b0385169133917fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b9181900360200190a350600192915050565b6124c733611552565b61250557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612e74565b61251733611552565b61255557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612ebe565b6000610ee960078363ffffffff61273d16565b612582600f8263ffffffff612f0816565b60405133906001600160a01b038316907f85222465e0d438163a28671b59fc9ebeb03bf39f880ddd36c8315da7512b31c090600090a350565b6125cc600a8263ffffffff612f7216565b60405133906001600160a01b038316907f28f069fa8730ef5d44b24faedbcabf2b254c53f4e02a953476a4015e3067714190600090a350565b600061154b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c55565b3390565b6001600160a01b03831661269357604051600160e51b62461bcd02815260040180806020018281038252602481526020018061358b6024913960400191505060405180910390fd5b6001600160a01b0382166126db57604051600160e51b62461bcd0281526004018080602001828103825260228152602001806133126022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006001600160a01b03821661278757604051600160e51b62461bcd02815260040180806020018281038252602281526020018061349b6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6127b860068263ffffffff612f0816565b60405133906001600160a01b038316907fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367990600090a350565b60006127fe848484612d10565b61286f8461280a612647565b61161285604051806060016040528060288152602001613473602891396001600160a01b038a16600090815260046020526040812090612848612647565b6001600160a01b03168152602081019190915260400160002054919063ffffffff612c5516565b5060019392505050565b61288a600e8263ffffffff612f0816565b60405133906001600160a01b038316907f4b5ef9a786cf64a7d82ebcf2d5132667edc9faef4ac36260d9a9e52c526b623290600090a350565b60008282018381101561154b5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60006129618383612ff6565b826001600160a01b0316846001600160a01b03167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040518082815260200191505060405180910390a35060019392505050565b6129c7600c8263ffffffff612f0816565b60405133906001600160a01b038316907fb75903ade4a0fdb07d60c882c22c779e2e1c751883c37aecdcc92a8ec72b046e90600090a350565b612a1160068263ffffffff612f7216565b60405133906001600160a01b038316907fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a90600090a350565b612a5b60088263ffffffff612f0816565b60405133906001600160a01b038316907f3ed21605dd544629fb45f2ccaedcc095ba1dbea540fb6eaf5493a7479856b0be90600090a350565b612aa5600c8263ffffffff612f7216565b60405133906001600160a01b038316907fe0953c403a52f9dc1fef4202a8d33975c958b727bee0d7b5b328965ddad98d8190600090a350565b612aef600a8263ffffffff612f0816565b60405133906001600160a01b038316907f1bac2ef39c5011bb7c20ecf6bc7cb986695b3f432a149d898c0ed368e55c780690600090a350565b600d805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b612b7160078263ffffffff612f7216565b60405133906001600160a01b038316907f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe297019690600090a350565b612bbb600e8263ffffffff612f7216565b60405133906001600160a01b038316907f3c091dafb1d99e4a4c333024492eac3b2cd8bf921a3dd547c937db33be307bb890600090a350565b6000612c0083836130eb565b826001600160a01b0316846001600160a01b03167fbac40739b0d4ca32fa2d82fc91630465ba3eddd1598da6fca393b26fb63b9453846040518082815260200191505060405180910390a35060019392505050565b60008184841115612caa57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561139557818101518382015260200161137d565b505050900390565b6000611092612cbf612647565b8484612d10565b612cd760078263ffffffff612f0816565b60405133906001600160a01b038316907fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b90600090a350565b6001600160a01b038316612d5857604051600160e51b62461bcd02815260040180806020018281038252602581526020018061352c6025913960400191505060405180910390fd5b6001600160a01b038216612da057604051600160e51b62461bcd02815260040180806020018281038252602381526020018061329d6023913960400191505060405180910390fd5b612de38160405180606001604052806026815260200161339e602691396001600160a01b038616600090815260036020526040902054919063ffffffff612c5516565b6001600160a01b038085166000908152600360205260408082209390935590841681522054612e18908263ffffffff6128c316565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b612e8560088263ffffffff612f7216565b60405133906001600160a01b038316907f5f36f4f5999f34947706fca376b955319b858573bf9d6bc59303c9a4cd80ced090600090a350565b612ecf600f8263ffffffff612f7216565b60405133906001600160a01b038316907f86515ebaad527298e98929c064c075f5a2604cc80afc0db29e73c01a36f8e98c90600090a350565b612f12828261273d565b612f5057604051600160e51b62461bcd0281526004018080602001828103825260218152602001806134526021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b612f7c828261273d565b15612fd15760408051600160e51b62461bcd02815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b0382166130545760408051600160e51b62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554613067908263ffffffff6128c316565b6005556001600160a01b038216600090815260036020526040902054613093908263ffffffff6128c316565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661313357604051600160e51b62461bcd0281526004018080602001828103825260218152602001806134e56021913960400191505060405180910390fd5b613176816040518060600160405280602281526020016132c0602291396001600160a01b038516600090815260036020526040902054919063ffffffff612c5516565b6001600160a01b0383166000908152600360205260409020556005546131a2908263ffffffff61260516565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061322b57805160ff1916838001178555613258565b82800160010185558215613258579182015b8281111561325857825182559160200191906001019061323d565b50613264929150613282565b5090565b604051806040016040528060008152602001600081525090565b610efc91905b80821115613264576000815560010161328856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6545524332303a20617070726f766520746f20746865207a65726f20616464726573735265766f6b6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205265766f6b657220726f6c6554696d656c6f636b6572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652054696d656c6f636b657220726f6c6545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654275726e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204275726e657220726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c654f776e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204f776e657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f776e6572732063616e6e6f742072656d6f7665207468656d73656c766573206173206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737352656c656173652074696d65206e6565647320746f20626520696e207468652066757475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737357686974656c6973746572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374657220726f6c6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737341646472657373206d7573742062652076616c696420666f722072656c6561736545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5472616e736665725265737472696374696f6e7320636f6e7472616374206d75737420626520736574a165627a7a723058207d3afabbceccff0bda34b20c92cb0f58a5a8aa735387152c8f3e7670e0e4c4960029

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

000000000000000000000000e4dc667f92b9d110a307b265bf8afacdd0fd3c8c

-----Decoded View---------------
Arg [0] : owner (address): 0xE4dc667f92b9d110A307b265bf8AFacdD0FD3C8c

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e4dc667f92b9d110a307b265bf8afacdd0fd3c8c


Deployed Bytecode Sourcemap

41269:5268:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41269:5268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40550:97;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40550:97:0;-1:-1:-1;;;;;40550:97:0;;:::i;:::-;;29070:99;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29070:99:0;-1:-1:-1;;;;;29070:99:0;;:::i;31068:1142::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31068:1142:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42936:120;;;:::i;:::-;;;;-1:-1:-1;;;;;42936:120:0;;;;;;;;;;;;;;37116:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37116:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43902:513;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;43902:513:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17911:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17911:152:0;;;;;;;;:::i;28945:117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28945:117:0;-1:-1:-1;;;;;28945:117:0;;:::i;5302:180::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5302:180:0;-1:-1:-1;;;;;5302:180:0;;:::i;16932:91::-;;;:::i;:::-;;;;;;;;;;;;;;;;46289:245;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46289:245:0;;;;;;;;;;;;;;;;;:::i;27314:237::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;27314:237:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27314:237:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27314:237:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27314:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;27314:237:0;;-1:-1:-1;27314:237:0;;-1:-1:-1;;;;;27314:237:0:i;5090:107::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5090:107:0;-1:-1:-1;;;;;5090:107:0;;:::i;38977:97::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38977:97:0;-1:-1:-1;;;;;38977:97:0;;:::i;37968:83::-;;;:::i;19248:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19248:210:0;;;;;;;;:::i;36331:66::-;;;:::i;39479:145::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39479:145:0;;;;;;;;:::i;40042:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40042:109:0;-1:-1:-1;;;;;40042:109:0;;:::i;34691:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34691:109:0;-1:-1:-1;;;;;34691:109:0;;:::i;35661:80::-;;;:::i;27933:128::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27933:128:0;-1:-1:-1;;;;;27933:128:0;;:::i;34907:97::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34907:97:0;-1:-1:-1;;;;;34907:97:0;;:::i;5205:89::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5205:89:0;-1:-1:-1;;;;;5205:89:0;;:::i;17086:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17086:110:0;-1:-1:-1;;;;;17086:110:0;;:::i;25796:119::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25796:119:0;-1:-1:-1;;;;;25796:119:0;;:::i;44650:318::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44650:318:0;;;;:::i;26032:107::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26032:107:0;-1:-1:-1;;;;;26032:107:0;;:::i;34808:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34808:91:0;-1:-1:-1;;;;;34808:91:0;;:::i;29177:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29177:105:0;-1:-1:-1;;;;;29177:105:0;;:::i;36173:62::-;;;:::i;37318:87::-;;;:::i;24241:93::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24241:93:0;-1:-1:-1;;;;;24241:93:0;;:::i;38878:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38878:91:0;-1:-1:-1;;;;;38878:91:0;;:::i;28287:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28287:152:0;;;;;;;;;;:::i;33978:251::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33978:251:0;-1:-1:-1;;;;;33978:251:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27019:51;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27019:51:0;-1:-1:-1;;;;;27019:51:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27019:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41065:136;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41065:136:0;;;;;;;;:::i;19961:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19961:261:0;;;;;;;;:::i;45980:199::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45980:199:0;;;;;;;;:::i;38469:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38469:109:0;-1:-1:-1;;;;;38469:109:0;;:::i;24342:99::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24342:99:0;-1:-1:-1;;;;;24342:99:0;;:::i;32500:1259::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;32500:1259:0;;;;;;;;;;;;;:::i;43240:476::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43240:476:0;;;;;;;;;;;;;;;;;:::i;27667:123::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27667:123:0;-1:-1:-1;;;;;27667:123:0;;:::i;42539:315::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42539:315:0;-1:-1:-1;;;;;42539:315:0;;:::i;17630:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17630:134:0;;;;;;;;;;:::i;30416:482::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30416:482:0;;;;;;;;;;;;;:::i;25044:235::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25044:235:0;;;;;;;;:::i;25923:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25923:101:0;-1:-1:-1;;;;;25923:101:0;;:::i;40451:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40451:91:0;-1:-1:-1;;;;;40451:91:0;;:::i;24122:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24122:111:0;-1:-1:-1;;;;;24122:111:0;;:::i;40550:97::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40617:22;40631:7;40617:13;:22::i;:::-;40550:97;:::o;29070:99::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29138:23;29153:7;29138:14;:23::i;31068:1142::-;31159:4;28832:24;28845:10;28832:12;:24::i;:::-;28824:93;;;;-1:-1:-1;;;;;28824:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31184:22:0;;31176:68;;;;-1:-1:-1;;;;;31176:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31281:17:0;;31257:21;31281:17;;;:7;:17;;;;;:24;31352:18;31349:107;;31391:27;;;-1:-1:-1;;;;;31391:27:0;;;;31416:1;31391:27;;;;;;;;;;;;;;;;;31440:4;31433:11;;;;;31349:107;-1:-1:-1;;;;;31539:17:0;;31516:20;31539:17;;;:7;:17;;;;;:29;;;;;31615:24;;;;;;;;31655:32;;;31652:551;;31702:23;31728:34;:13;31746:15;31728:34;:17;:34;:::i;:::-;31702:60;;31824:45;31829:8;31839:15;31856:12;31824:4;:45::i;:::-;-1:-1:-1;31888:41:0;;;-1:-1:-1;;;;;31888:41:0;;;;;;;;;;;;;;;;;;;;;;;31950:4;31943:11;;;;;;;31652:551;32126:39;;;-1:-1:-1;;;;;32126:39:0;;;;;;;;;;;;;;;;;;;;;;;32187:4;32180:11;;;;28928:1;31068:1142;;;;:::o;42936:120::-;43027:20;;-1:-1:-1;;;;;43027:20:0;42936:120;;:::o;37116:83::-;37186:5;37179:12;;;;;;;;-1:-1:-1;;37179:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37153:13;;37179:12;;37186:5;;37179:12;;37186:5;37179:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37116:83;:::o;43902:513::-;44137:20;;44048:5;;-1:-1:-1;;;;;44137:20:0;44121:97;;;;-1:-1:-1;;;;;44121:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44331:20;;:76;;;-1:-1:-1;;;;;44331:76:0;;-1:-1:-1;;;;;44331:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;;;;:50;;:76;;;;;;;;;;;;;;:20;:76;;;5:2:-1;;;;30:1;27;20:12;5:2;44331:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44331:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44331:76:0;;43902:513;-1:-1:-1;;;;;43902:513:0:o;17911:152::-;17977:4;17994:39;18003:12;:10;:12::i;:::-;18017:7;18026:6;17994:8;:39::i;:::-;-1:-1:-1;18051:4:0;17911:152;;;;:::o;28945:117::-;29005:4;29029:25;:12;29046:7;29029:25;:16;:25;:::i;5302:180::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5376:10;-1:-1:-1;;;;;5376:21:0;;;;5368:74;;;;-1:-1:-1;;;;;5368:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5453:21;5466:7;5453:12;:21::i;16932:91::-;17003:12;;16932:91;:::o;46289:245::-;45610:20;;:75;;;-1:-1:-1;;;;;45610:75:0;;46404:10;45610:75;;;;;;-1:-1:-1;;;;;45610:75:0;;;;;;;;;;;;;;;;;;;;;;46451:12;;46404:10;;46416:4;;46422:2;;46426:5;;46451:12;;45610:20;;;;:50;;:75;;;;;;;;;;;;;;:20;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;45610:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45610:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45610:75:0;45735:20;;:37;;;-1:-1:-1;;;;;45735:37:0;;;;45610:75;;-1:-1:-1;;;;;;45735:20:0;;;;:35;;:37;;;;;45610:75;;45735:37;;;;;;;;:20;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;45735:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45735:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45735:37:0;45774:20;;:79;;;-1:-1:-1;;;;;45774:79:0;;45704:68;;;45774:79;;;;;;;;45704:68;;;;;-1:-1:-1;;;;;45774:20:0;;;;:50;;:79;;;;;:20;;:79;;;;;;;:20;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;45774:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45774:79:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45774:79:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;45774:79:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;45774:79:0;;;;;;45696:158;;;;;-1:-1:-1;;;;;45696:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45696:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46491:35;46510:4;46516:2;46520:5;46491:18;:35::i;:::-;46481:45;46289:245;-1:-1:-1;;;;;;;;;46289:245:0:o;27314:237::-;27413:4;25680:25;25694:10;25680:13;:25::i;:::-;25672:96;;;;-1:-1:-1;;;;;25672:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27445:27;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27429:13:0;;-1:-1:-1;27429:13:0;;;:9;:13;;;;;;:43;;;;-1:-1:-1;;27429:43:0;;;;;;;;;;;27445:27;;27429:13;:43;;-1:-1:-1;27429:43:0;;;;;;:::i;:::-;;;;;27488:33;27504:2;27508:6;27516:4;27488:33;;;;-1:-1:-1;;;;;27488:33:0;-1:-1:-1;;;;;27488:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27488:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27539:4:0;25779:1;27314:237;;;;;:::o;5090:107::-;5145:4;5169:20;:7;5181;5169:20;:11;:20;:::i;38977:97::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39044:22;39058:7;39044:13;:22::i;37968:83::-;38034:9;;;;37968:83;:::o;19248:210::-;19328:4;19345:83;19354:12;:10;:12::i;:::-;19368:7;19377:50;19416:10;19377:11;:25;19389:12;:10;:12::i;:::-;-1:-1:-1;;;;;19377:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;19377:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;:::-;19345:8;:83::i;36331:66::-;34590:20;34599:10;34590:8;:20::i;:::-;34582:81;;;;-1:-1:-1;;;;;34582:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36379:10;:8;:10::i;:::-;36331:66::o;39479:145::-;39553:4;38368:20;38377:10;38368:8;:20::i;:::-;38360:81;;;;-1:-1:-1;;;;;38360:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39575:43;39590:10;39602:7;39611:6;39575:14;:43::i;40042:109::-;40098:4;40122:21;:8;40135:7;40122:21;:12;:21;:::i;34691:109::-;34747:4;34771:21;:8;34784:7;34771:21;:12;:21;:::i;35661:80::-;35726:7;;;;35661:80;:::o;27933:128::-;27997:13;28029:9;:19;28039:8;-1:-1:-1;;;;;28029:19:0;-1:-1:-1;;;;;28029:19:0;;;;;;;;;;;;:24;;28022:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27933:128;;;:::o;34907:97::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34974:22;34988:7;34974:13;:22::i;5205:89::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5268:18;5278:7;5268:9;:18::i;17086:110::-;-1:-1:-1;;;;;17170:18:0;17143:7;17170:18;;;:9;:18;;;;;;;17086:110::o;25796:119::-;25857:4;25881:26;:13;25899:7;25881:26;:17;:26;:::i;44650:318::-;44893:20;;:67;;;-1:-1:-1;;;;;44893:67:0;;;;;;;;;;;44763:13;;-1:-1:-1;;;;;44893:20:0;;:50;;:67;;;;;:20;;:67;;;;;;;:20;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;44893:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44893:67:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;44893:67:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;44893:67:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;-1:-1;44893:67:0;;44650:318;-1:-1:-1;;;;;;44650:318:0:o;26032:107::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26104:27;26123:7;26104:18;:27::i;34808:91::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34872:19;34883:7;34872:10;:19::i;29177:105::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29248:26;29266:7;29248:17;:26::i;36173:62::-;34590:20;34599:10;34590:8;:20::i;:::-;34582:81;;;;-1:-1:-1;;;;;34582:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36219:8;:6;:8::i;37318:87::-;37390:7;37383:14;;;;;;;;-1:-1:-1;;37383:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37357:13;;37383:14;;37390:7;;37383:14;;37390:7;37383:14;;;;;;;;;;;;;;;;;;;;;;;;24241:93;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24306:20;24318:7;24306:11;:20::i;38878:91::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38942:19;38953:7;38942:10;:19::i;28287:152::-;-1:-1:-1;;;;;28385:15:0;;28361:4;28385:15;;;:9;:15;;;;;:22;;;:46;;;;-1:-1:-1;;;;;;;28411:13:0;;;;;:9;:13;;;;;:20;;;;28287:152;-1:-1:-1;28287:152:0:o;33978:251::-;34037:7;34046;34107:29;;:::i;:::-;-1:-1:-1;;;;;;;;34139:17:0;;;;;:7;:17;;;;;;;;;34107:49;;;;;;;;;;;;;;;;;;;;;;;;;;;33978:251::o;27019:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27019:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41065:136::-;41139:4;39941:20;39950:10;39941:8;:20::i;:::-;39933:81;;;;-1:-1:-1;;;;;39933:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41161:34;41167:10;41179:7;41188:6;41161:5;:34::i;19961:261::-;20046:4;20063:129;20072:12;:10;:12::i;:::-;20086:7;20095:96;20134:15;20095:96;;;;;;;;;;;;;;;;;:11;:25;20107:12;:10;:12::i;:::-;-1:-1:-1;;;;;20095:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;20095:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;45980:199::-;45153:20;;:63;;;-1:-1:-1;;;;;45153:63:0;;46065:10;45153:63;;;;;;-1:-1:-1;;;;;45153:63:0;;;;;;;;;;;;;;;46106:12;;46065:10;;46077:2;;46081:5;;46106:12;;45153:20;;;:46;;:63;;;;;;;;;;;;;;;:20;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;45153:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45153:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45153:63:0;45254:20;;:37;;;-1:-1:-1;;;;;45254:37:0;;;;45153:63;;-1:-1:-1;;;;;;45254:20:0;;;;:35;;:37;;;;;45153:63;;45254:37;;;;;;;;:20;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;45254:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45254:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45254:37:0;45293:20;;:67;;;-1:-1:-1;;;;;45293:67:0;;45235:56;;;45293:67;;;;;;;;45235:56;;;;;-1:-1:-1;;;;;45293:20:0;;;;:50;;:67;;;;;:20;;:67;;;;;;;:20;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;45293:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45293:67:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45293:67:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;45293:67:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;45293:67:0;;;;;;45227:134;;;;;-1:-1:-1;;;;;45227:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;45227:134:0;;46146:25;46161:2;46165:5;46146:14;:25::i;:::-;46136:35;45980:199;-1:-1:-1;;;;;;;45980:199:0:o;38469:109::-;38525:4;38549:21;:8;38562:7;38549:21;:12;:21;:::i;24342:99::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24410:23;24425:7;24410:14;:23::i;32500:1259::-;32597:4;32900:6;32890:7;:16;32886:60;;;-1:-1:-1;32930:4:0;32923:11;;32886:60;-1:-1:-1;;;;;33067:17:0;;33029:23;33067:17;;;:7;:17;;;;;:24;33055:37;;:7;;:37;:11;:37;:::i;:::-;-1:-1:-1;;;;;33381:17:0;;33199:14;33381:17;;;:7;:17;;;;;:29;;;33029:63;;-1:-1:-1;33216:25:0;;;;;33363:15;:47;;;33529:28;;;33548:9;33529:28;33526:226;;;33580:4;33573:11;;;;;;;33526:226;33735:5;33728:12;;;;;;;43240:476;43455:20;;43366:5;;-1:-1:-1;;;;;43455:20:0;43439:97;;;;-1:-1:-1;;;;;43439:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43644:20;;:64;;;-1:-1:-1;;;;;43644:64:0;;-1:-1:-1;;;;;43644:64:0;;;;;;;;;;;;;;;;;;;;;;:20;;;;;:46;;:64;;;;;;;;;;;;;;:20;:64;;;5:2:-1;;;;30:1;27;20:12;5:2;43644:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43644:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43644:64:0;;43240:476;-1:-1:-1;;;;43240:476:0:o;27667:123::-;-1:-1:-1;;;;;27756:19:0;27733:4;27756:19;;;:9;:19;;;;;:26;;;;27667:123::o;42539:315::-;42661:4;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42683:20;:63;;-1:-1:-1;;;;;;42683:63:0;-1:-1:-1;;;;;42683:63:0;;;;;;;;;;;42762:62;;;42790:20;;;;42762:62;;42813:10;42762:62;;;;;;;;;;;;;;;;-1:-1:-1;42842:4:0;42539:315;;;:::o;17630:134::-;-1:-1:-1;;;;;17729:18:0;;;17702:7;17729:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17630:134::o;30416:482::-;30517:4;28832:24;28845:10;28832:12;:24::i;:::-;28824:93;;;;-1:-1:-1;;;;;28824:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30556:15;30542:11;:29;30534:80;;;;-1:-1:-1;;;;;30534:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30633:22:0;;30625:67;;;;;-1:-1:-1;;;;;30625:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30705:29;;:::i;:::-;-1:-1:-1;30737:31:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30779:17:0;;-1:-1:-1;30779:17:0;;;:7;:17;;;;;:31;;;;;;;;;;;;;;30826:42;;;;;;;;;;;;;;;;;;;30737:31;;30826:42;;;;;;;;;;-1:-1:-1;30886:4:0;;30416:482;-1:-1:-1;;;;30416:482:0:o;25044:235::-;25150:4;24018:21;24028:10;24018:9;:21::i;:::-;24010:84;;;;-1:-1:-1;;;;;24010:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25166:43;25182:5;25189:10;25201:7;25166:15;:43::i;:::-;25221:34;;;;;;;;-1:-1:-1;;;;;25221:34:0;;;25228:10;;25221:34;;;;;;;;;-1:-1:-1;25269:4:0;25044:235;;;;:::o;25923:101::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25992:24;26008:7;25992:15;:24::i;40451:91::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40515:19;40526:7;40515:10;:19::i;24122:111::-;24179:4;24203:22;:9;24217:7;24203:22;:13;:22;:::i;40301:142::-;40361:24;:8;40377:7;40361:24;:15;:24;:::i;:::-;40401:34;;40424:10;;-1:-1:-1;;;;;40401:34:0;;;;;;;;40301:142;:::o;29290:146::-;29351:25;:12;29368:7;29351:25;:16;:25;:::i;:::-;29392:36;;29417:10;;-1:-1:-1;;;;;29392:36:0;;;;;;;;29290:146;:::o;11220:136::-;11278:7;11305:43;11309:1;11312;11305:43;;;;;;;;;;;;;;;;;:3;:43::i;6633:98::-;6713:10;6633:98;:::o;22893:338::-;-1:-1:-1;;;;;22987:19:0;;22979:68;;;;-1:-1:-1;;;;;22979:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23066:21:0;;23058:68;;;;-1:-1:-1;;;;;23058:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23139:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23191:32;;;;;;;;;;;;;;;;;22893:338;;;:::o;4416:203::-;4488:4;-1:-1:-1;;;;;4513:21:0;;4505:68;;;;-1:-1:-1;;;;;4505:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4591:20:0;:11;:20;;;;;;;;;;;;;;;4416:203::o;5629:139::-;5688:23;:7;5703;5688:23;:14;:23;:::i;:::-;5727:33;;5749:10;;-1:-1:-1;;;;;5727:33:0;;;;;;;;5629:139;:::o;18535:304::-;18624:4;18641:36;18651:6;18659:9;18670:6;18641:9;:36::i;:::-;18688:121;18697:6;18705:12;:10;:12::i;:::-;18719:89;18757:6;18719:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18719:19:0;;;;;;:11;:19;;;;;;18739:12;:10;:12::i;:::-;-1:-1:-1;;;;;18719:33:0;;;;;;;;;;;;-1:-1:-1;18719:33:0;;;:89;;:37;:89;:::i;18688:121::-;-1:-1:-1;18827:4:0;18535:304;;;;;:::o;38728:142::-;38788:24;:8;38804:7;38788:24;:15;:24;:::i;:::-;38828:34;;38851:10;;-1:-1:-1;;;;;38828:34:0;;;;;;;;38728:142;:::o;10764:181::-;10822:7;10854:5;;;10878:6;;;;10870:46;;;;;-1:-1:-1;;;;;10870:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;35989:89;36029:7;:15;;-1:-1:-1;;36029:15:0;;;36060:10;;;;36039:5;;36060:10;35989:89::o;39231:179::-;39308:4;39323:23;39335:2;39339:6;39323:11;:23::i;:::-;39373:2;-1:-1:-1;;;;;39360:24:0;39365:6;-1:-1:-1;;;;;39360:24:0;;39377:6;39360:24;;;;;;;;;;;;;;;;;;-1:-1:-1;39400:4:0;39231:179;;;;;:::o;35154:142::-;35214:24;:8;35230:7;35214:24;:15;:24;:::i;:::-;35254:34;;35277:10;;-1:-1:-1;;;;;35254:34:0;;;;;;;;35154:142;:::o;5490:131::-;5546:20;:7;5558;5546:20;:11;:20;:::i;:::-;5582:31;;5602:10;;-1:-1:-1;;;;;5582:31:0;;;;;;;;5490:131;:::o;26304:157::-;26369:29;:13;26390:7;26369:29;:20;:29;:::i;:::-;26414:39;;26442:10;;-1:-1:-1;;;;;26414:39:0;;;;;;;;26304:157;:::o;35012:134::-;35069:21;:8;35082:7;35069:21;:12;:21;:::i;:::-;35106:32;;35127:10;;-1:-1:-1;;;;;35106:32:0;;;;;;;;35012:134;:::o;29444:154::-;29508:28;:12;29528:7;29508:28;:19;:28;:::i;:::-;29552:38;;29579:10;;-1:-1:-1;;;;;29552:38:0;;;;;;;;29444:154;:::o;35821:84::-;35859:7;:14;;-1:-1:-1;;35859:14:0;35869:4;35859:14;;;35889:8;;;;35859:7;;35889:8;35821:84::o;24449:137::-;24507:22;:9;24521:7;24507:22;:13;:22;:::i;:::-;24545:33;;24567:10;;-1:-1:-1;;;;;24545:33:0;;;;;;;;24449:137;:::o;38586:134::-;38643:21;:8;38656:7;38643:21;:12;:21;:::i;:::-;38680:32;;38701:10;;-1:-1:-1;;;;;38680:32:0;;;;;;;;38586:134;:::o;40808:185::-;40887:4;40902:25;40914:4;40920:6;40902:11;:25::i;:::-;40954:4;-1:-1:-1;;;;;40941:26:0;40946:6;-1:-1:-1;;;;;40941:26:0;;40960:6;40941:26;;;;;;;;;;;;;;;;;;-1:-1:-1;40983:4:0;40808:185;;;;;:::o;11693:192::-;11779:7;11815:12;11807:6;;;;11799:29;;;;-1:-1:-1;;;;;11799:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;11799:29:0;-1:-1:-1;;;11851:5:0;;;11693:192::o;17409:158::-;17478:4;17495:42;17505:12;:10;:12::i;:::-;17519:9;17530:6;17495:9;:42::i;24594:145::-;24655:25;:9;24672:7;24655:25;:16;:25;:::i;:::-;24696:35;;24720:10;;-1:-1:-1;;;;;24696:35:0;;;;;;;;24594:145;:::o;20712:471::-;-1:-1:-1;;;;;20810:20:0;;20802:70;;;;-1:-1:-1;;;;;20802:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20891:23:0;;20883:71;;;;-1:-1:-1;;;;;20883:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20987;21009:6;20987:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20987:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;20967:17:0;;;;;;;:9;:17;;;;;;:91;;;;21092:20;;;;;;;:32;;21117:6;21092:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;21069:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;21140:35;;;;;;;21069:20;;21140:35;;;;;;;;;;;;;20712:471;;;:::o;26147:149::-;26209:26;:13;26227:7;26209:26;:17;:26;:::i;:::-;26251:37;;26277:10;;-1:-1:-1;;;;;26251:37:0;;;;;;;;26147:149;:::o;40159:134::-;40216:21;:8;40229:7;40216:21;:12;:21;:::i;:::-;40253:32;;40274:10;;-1:-1:-1;;;;;40253:32:0;;;;;;;;40159:134;:::o;4138:183::-;4218:18;4222:4;4228:7;4218:3;:18::i;:::-;4210:64;;;;-1:-1:-1;;;;;4210:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4285:20:0;4308:5;4285:20;;;;;;;;;;;:28;;-1:-1:-1;;4285:28:0;;;4138:183::o;3880:178::-;3958:18;3962:4;3968:7;3958:3;:18::i;:::-;3957:19;3949:63;;;;;-1:-1:-1;;;;;3949:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4023:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;4023:27:0;4046:4;4023:27;;;3880:178::o;21464:308::-;-1:-1:-1;;;;;21540:21:0;;21532:65;;;;;-1:-1:-1;;;;;21532:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21625:12;;:24;;21642:6;21625:24;:16;:24;:::i;:::-;21610:12;:39;-1:-1:-1;;;;;21681:18:0;;;;;;:9;:18;;;;;;:30;;21704:6;21681:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;21660:18:0;;;;;;:9;:18;;;;;;;;:51;;;;21727:37;;;;;;;21660:18;;;;21727:37;;;;;;;;;;21464:308;;:::o;22105:348::-;-1:-1:-1;;;;;22181:21:0;;22173:67;;;;-1:-1:-1;;;;;22173:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22274:68;22297:6;22274:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22274:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;22253:18:0;;;;;;:9;:18;;;;;:89;22368:12;;:24;;22385:6;22368:24;:16;:24;:::i;:::-;22353:12;:39;22408:37;;;;;;;;22434:1;;-1:-1:-1;;;;;22408:37:0;;;;;;;;;;;;22105:348;;:::o;41269:5268::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41269:5268:0;;;-1:-1:-1;41269:5268:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://7d3afabbceccff0bda34b20c92cb0f58a5a8aa735387152c8f3e7670e0e4c496
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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