CRO Price: $0.10 (+3.26%)

Token

Sea Token (SEA)

Overview

Max Total Supply

92,899,436.474164133738600679 SEA

Holders

43

Total Transfers

-

Market

Price

$0.00 @ 0.000000 CRO

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
GovernanceToken

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2024-10-24
*/

// Sources flattened with hardhat v2.22.10 https://hardhat.org

// SPDX-License-Identifier: MIT

// File contracts/deprecated/Context.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <0.8.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.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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


// File contracts/deprecated/Ownable.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File contracts/Authorizable.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.6.12;

contract Authorizable is Ownable {
    mapping(address => bool) public authorized;

    modifier onlyAuthorized() {
        require(authorized[msg.sender] || owner() == msg.sender);
        _;
    }

    function addAuthorized(address _toAdd) public onlyOwner {
        authorized[_toAdd] = true;
    }

    function removeAuthorized(address _toRemove) public onlyOwner {
        require(_toRemove != msg.sender);
        authorized[_toRemove] = false;
    }
}


// File contracts/deprecated/IERC20.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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 contracts/deprecated/SafeMath.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <0.8.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, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}


// File contracts/deprecated/ERC20.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity >=0.6.0 <0.8.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 {ERC20PresetMinterPauser}.
 *
 * 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;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * 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 virtual returns (uint8) {
        return _decimals;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override 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 virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override 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 virtual override 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 virtual 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 virtual 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 virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _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 virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _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 virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _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 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 virtual {
        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 Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}


// File contracts/GovernanceToken.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.6.12;



// The GovernanceToken
contract GovernanceToken is ERC20, Ownable, Authorizable {
    uint256 private _cap;
    uint256 private _totalLock;
    uint256 public lockFromBlock;
    uint256 public lockToBlock;
    // uint256 public manualMintLimit;
    // uint256 public manualMinted = 0;

    mapping(address => uint256) private _locks;
    mapping(address => uint256) private _lastUnlockBlock;

    event Lock(address indexed to, uint256 value);
    event TransferLocked(address indexed from, address indexed to, uint256 value);

    constructor(
      string memory _name,
      string memory _symbol,
      uint256 cap_,
    //   uint256 _manualMintLimit,
      uint256 _lockFromBlock,
      uint256 _lockToBlock
    ) public ERC20(_name, _symbol) {
        _cap = cap_;
        // manualMintLimit = _manualMintLimit;
        lockFromBlock = _lockFromBlock;
        lockToBlock = _lockToBlock;
    }

    /**
     * @dev Returns the cap on the token's total supply.
     */
    function cap() public view returns (uint256) {
        return _cap;
    }

    // Update the total cap - can go up or down but wont destroy previous tokens.
    function capUpdate(uint256 _newCap) public onlyAuthorized {
        _cap = _newCap;
    }

    // Update the lockFromBlock
    function lockFromUpdate(uint256 _newLockFrom) public onlyAuthorized {
        lockFromBlock = _newLockFrom;
    }

    // Update the lockToBlock
    function lockToUpdate(uint256 _newLockTo) public onlyAuthorized {
        lockToBlock = _newLockTo;
    }

    function unlockedSupply() public view returns (uint256) {
        return totalSupply().sub(_totalLock);
    }

    function lockedSupply() public view returns (uint256) {
        return totalLock();
    }

    function circulatingSupply() public view returns (uint256) {
        return totalSupply();
    }

    function totalLock() public view returns (uint256) {
        return _totalLock;
    }

    /**
     * @dev See {ERC20-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - minted tokens must not cause the total supply to go over the cap.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        if (from == address(0)) {
            // When minting tokens
            require(
                totalSupply().add(amount) <= _cap,
                "ERC20Capped: cap exceeded"
            );
        }
    }

    /**
     * @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 virtual override {
        super._transfer(sender, recipient, amount);
        _moveDelegates(_delegates[sender], _delegates[recipient], amount);
    }

    /// @notice Creates `_amount` token to `_to`. Must only be called by the owner.
    function mint(address _to, uint256 _amount) public onlyOwner {
        _mint(_to, _amount);
        _moveDelegates(address(0), _delegates[_to], _amount);
    }

    // function manualMint(address _to, uint256 _amount) public onlyAuthorized {
    //     require(manualMinted.add(_amount) <= manualMintLimit, "ERC20: manualMinted greater than manualMintLimit");
    //     _mint(_to, _amount);
    //     _moveDelegates(address(0), _delegates[_to], _amount);
    //     manualMinted = manualMinted.add(_amount);
    // }

    function totalBalanceOf(address _holder) public view returns (uint256) {
        return _locks[_holder].add(balanceOf(_holder));
    }

    function lockOf(address _holder) public view returns (uint256) {
        return _locks[_holder];
    }

    function lastUnlockBlock(address _holder) public view returns (uint256) {
        return _lastUnlockBlock[_holder];
    }

    function lock(address _holder, uint256 _amount) public onlyOwner {
        require(_holder != address(0), "ERC20: lock to the zero address");
        require(
            _amount <= balanceOf(_holder),
            "ERC20: lock amount over balance"
        );

        _transfer(_holder, address(this), _amount);

        _locks[_holder] = _locks[_holder].add(_amount);
        _totalLock = _totalLock.add(_amount);
        if (_lastUnlockBlock[_holder] < lockFromBlock) {
            _lastUnlockBlock[_holder] = lockFromBlock;
        }
        emit Lock(_holder, _amount);
    }

    function canUnlockAmount(address _holder) public view returns (uint256) {
        if (block.number < lockFromBlock) {
            return 0;
        } else if (block.number >= lockToBlock) {
            return _locks[_holder];
        } else {
            uint256 releaseBlock = block.number.sub(_lastUnlockBlock[_holder]);
            uint256 numberLockBlock =
                lockToBlock.sub(_lastUnlockBlock[_holder]);
            return _locks[_holder].mul(releaseBlock).div(numberLockBlock);
        }
    }

    function unlock() public {
        require(_locks[msg.sender] > 0, "ERC20: cannot unlock");

        uint256 amount = canUnlockAmount(msg.sender);
        // just for sure
        if (amount > balanceOf(address(this))) {
            amount = balanceOf(address(this));
        }
        _transfer(address(this), msg.sender, amount);
        _locks[msg.sender] = _locks[msg.sender].sub(amount);
        _lastUnlockBlock[msg.sender] = block.number;
        _totalLock = _totalLock.sub(amount);
    }

    // This function is for dev address migrate all balance to a multi sig address
    function transferAll(address _to) public {
        _locks[_to] = _locks[_to].add(_locks[msg.sender]);

        if (_lastUnlockBlock[_to] < lockFromBlock) {
            _lastUnlockBlock[_to] = lockFromBlock;
        }

        if (_lastUnlockBlock[_to] < _lastUnlockBlock[msg.sender]) {
            _lastUnlockBlock[_to] = _lastUnlockBlock[msg.sender];
        }

        _locks[msg.sender] = 0;
        _lastUnlockBlock[msg.sender] = 0;

        _transfer(msg.sender, _to, balanceOf(msg.sender));
    }
    
    function transferLockedAmount(address _to, uint256 amount) public {
        // Ensure the sender has enough locked tokens to transfer
        require(amount <= _locks[msg.sender], "ERC20: transfer amount exceeds locked balance");

        // Transfer locked tokens
        _locks[_to] = _locks[_to].add(amount);         // Add locked tokens to recipient
        _locks[msg.sender] = _locks[msg.sender].sub(amount);  // Deduct locked tokens from sender
        _totalLock = _totalLock.sub(amount);  // Update total locked tokens globally

        // Update the last unlock block for the recipient
        if (_lastUnlockBlock[_to] < lockFromBlock) {
            _lastUnlockBlock[_to] = lockFromBlock;
        }

        if (_lastUnlockBlock[_to] < _lastUnlockBlock[msg.sender]) {
            _lastUnlockBlock[_to] = _lastUnlockBlock[msg.sender];
        }

        emit TransferLocked(msg.sender, _to, amount);
    }
    // Copied and modified from YAM code:
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol

    /// @dev A record of each accounts delegate
    mapping(address => address) internal _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping(address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256(
            "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
        );

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping(address => uint256) public nonces;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(
        address indexed delegator,
        address indexed fromDelegate,
        address indexed toDelegate
    );

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(
        address indexed delegate,
        uint256 previousBalance,
        uint256 newBalance
    );

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegator The address to get delegatee for
     */
    function delegates(address delegator) external view returns (address) {
        return _delegates[delegator];
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        bytes32 domainSeparator =
            keccak256(
                abi.encode(
                    DOMAIN_TYPEHASH,
                    keccak256(bytes(name())),
                    getChainId(),
                    address(this)
                )
            );

        bytes32 structHash =
            keccak256(
                abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)
            );

        bytes32 digest =
            keccak256(
                abi.encodePacked("\x19\x01", domainSeparator, structHash)
            );

        address signatory = ecrecover(digest, v, r, s);
        require(
            signatory != address(0),
            "GovernanceToken::delegateBySig: invalid signature"
        );
        require(
            nonce == nonces[signatory]++,
            "GovernanceToken::delegateBySig: invalid nonce"
        );
        require(now <= expiry, "GovernanceToken::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint256) {
        uint32 nCheckpoints = numCheckpoints[account];
        return
            nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint256 blockNumber)
        external
        view
        returns (uint256)
    {
        require(
            blockNumber < block.number,
            "GovernanceToken::getPriorVotes: not yet determined"
        );

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(
        address srcRep,
        address dstRep,
        uint256 amount
    ) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld =
                    srcRepNum > 0
                        ? checkpoints[srcRep][srcRepNum - 1].votes
                        : 0;
                uint256 srcRepNew = srcRepOld.sub(amount);
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld =
                    dstRepNum > 0
                        ? checkpoints[dstRep][dstRepNum - 1].votes
                        : 0;
                uint256 dstRepNew = dstRepOld.add(amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint256 oldVotes,
        uint256 newVotes
    ) internal {
        uint32 blockNumber =
            safe32(
                block.number,
                "GovernanceToken::_writeCheckpoint: block number exceeds 32 bits"
            );

        if (
            nCheckpoints > 0 &&
            checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber
        ) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(
                blockNumber,
                newVotes
            );
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint256 n, string memory errorMessage)
        internal
        pure
        returns (uint32)
    {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function getChainId() internal pure returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"cap_","type":"uint256"},{"internalType":"uint256","name":"_lockFromBlock","type":"uint256"},{"internalType":"uint256","name":"_lockToBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferLocked","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAdd","type":"address"}],"name":"addAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"canUnlockAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"capUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"lastUnlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockFromBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLockFrom","type":"uint256"}],"name":"lockFromUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"lockOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockToBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLockTo","type":"uint256"}],"name":"lockToUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toRemove","type":"address"}],"name":"removeAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferLockedAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162004e6338038062004e63833981810160405260a08110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b838201915060208201858111156200006f57600080fd5b82518660018202830111640100000000821117156200008d57600080fd5b8083526020830192505050908051906020019080838360005b83811015620000c3578082015181840152602081019050620000a6565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b838201915060208201858111156200012c57600080fd5b82518660018202830111640100000000821117156200014a57600080fd5b8083526020830192505050908051906020019080838360005b838110156200018057808201518184015260208101905062000163565b50505050905090810190601f168015620001ae5780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805190602001909291908051906020019092919050505084848160039080519060200190620001f092919062000301565b5080600490805190602001906200020992919062000301565b506012600560006101000a81548160ff021916908360ff160217905550505060006200023a620002f960201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350826007819055508160098190555080600a819055505050505050620003a7565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200034457805160ff191683800117855562000375565b8280016001018555821562000375579182015b828111156200037457825182559160200191906001019062000357565b5b50905062000384919062000388565b5090565b5b80821115620003a357600081600090555060010162000389565b5090565b614aac80620003b76000396000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c8063756a5ab31161015c578063a9059cbb116100ce578063cf1c316a11610087578063cf1c316a14610dab578063dd62ed3e14610def578063e7a324dc14610e67578063f1127ed814610e85578063f2fde38b14610efa578063fd3d27b814610f3e5761028a565b8063a9059cbb14610bd0578063b4b5ea5714610c34578063b918161114610c8c578063c38533c614610ce6578063c3cda52014610d14578063ca5c7b9114610d8d5761028a565b80638e875e1a116101205780638e875e1a14610a5f5780639358928b14610a7d57806395d89b4114610a9b578063a3a7e7f314610b1e578063a457c2d714610b62578063a69df4b514610bc65761028a565b8063756a5ab3146108cb578063782d6fe1146109195780637ecebe001461097b57806389a2867c146109d35780638da5cb5b14610a2b5761028a565b80633a1aae35116102005780635a46d3b5116101b95780635a46d3b5146107515780635c19a95c146107a957806366fc237b146107ed5780636fcfff451461080b57806370a0823114610869578063715018a6146108c15761028a565b80633a1aae35146105ad57806340346c49146105cb57806340c10f19146105f9578063485d7d94146106475780634b0ee02a1461068b578063587cde1e146106e35761028a565b806320606b701161025257806320606b701461041a57806323b872dd14610438578063282d3fdf146104bc578063313ce5671461050a578063355274ea1461052b57806339509351146105495761028a565b806306fdde031461028f578063095ea7b3146103125780630cb285e21461037657806318160ddd146103a4578063202b1760146103c2575b600080fd5b610297610f5c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102d75780820151818401526020810190506102bc565b50505050905090810190601f1680156103045780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61035e6004803603604081101561032857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ffe565b60405180821515815260200191505060405180910390f35b6103a26004803603602081101561038c57600080fd5b810190808035906020019092919050505061101c565b005b6103ac6110b9565b6040518082815260200191505060405180910390f35b610404600480360360208110156103d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110c3565b6040518082815260200191505060405180910390f35b610422611244565b6040518082815260200191505060405180910390f35b6104a46004803603606081101561044e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611268565b60405180821515815260200191505060405180910390f35b610508600480360360408110156104d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611341565b005b6105126116ae565b604051808260ff16815260200191505060405180910390f35b6105336116c5565b6040518082815260200191505060405180910390f35b6105956004803603604081101561055f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116cf565b60405180821515815260200191505060405180910390f35b6105b5611782565b6040518082815260200191505060405180910390f35b6105f7600480360360208110156105e157600080fd5b810190808035906020019092919050505061178c565b005b6106456004803603604081101561060f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611829565b005b6106896004803603602081101561065d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611951565b005b6106cd600480360360208110156106a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a94565b6040518082815260200191505060405180910390f35b610725600480360360208110156106f957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611af7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107936004803603602081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b60565b6040518082815260200191505060405180910390f35b6107eb600480360360208110156107bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ba9565b005b6107f5611bb6565b6040518082815260200191505060405180910390f35b61084d6004803603602081101561082157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bbc565b604051808263ffffffff16815260200191505060405180910390f35b6108ab6004803603602081101561087f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bdf565b6040518082815260200191505060405180910390f35b6108c9611c27565b005b610917600480360360408110156108e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d97565b005b6109656004803603604081101561092f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612177565b6040518082815260200191505060405180910390f35b6109bd6004803603602081101561099157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612538565b6040518082815260200191505060405180910390f35b610a15600480360360208110156109e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612550565b6040518082815260200191505060405180910390f35b610a33612599565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a676125c3565b6040518082815260200191505060405180910390f35b610a856125c9565b6040518082815260200191505060405180910390f35b610aa36125d8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae3578082015181840152602081019050610ac8565b50505050905090810190601f168015610b105780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b6060048036036020811015610b3457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061267a565b005b610bae60048036036040811015610b7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612988565b60405180821515815260200191505060405180910390f35b610bce612a55565b005b610c1c60048036036040811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c35565b60405180821515815260200191505060405180910390f35b610c7660048036036020811015610c4a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c53565b6040518082815260200191505060405180910390f35b610cce60048036036020811015610ca257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d29565b60405180821515815260200191505060405180910390f35b610d1260048036036020811015610cfc57600080fd5b8101908080359060200190929190505050612d49565b005b610d8b600480360360c0811015610d2a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050612de6565b005b610d9561314a565b6040518082815260200191505060405180910390f35b610ded60048036036020811015610dc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613159565b005b610e5160048036036040811015610e0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613263565b6040518082815260200191505060405180910390f35b610e6f6132ea565b6040518082815260200191505060405180910390f35b610ed760048036036040811015610e9b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff16906020019092919050505061330e565b604051808363ffffffff1681526020018281526020019250505060405180910390f35b610f3c60048036036020811015610f1057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061334f565b005b610f46613544565b6040518082815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ff45780601f10610fc957610100808354040283529160200191610ff4565b820191906000526020600020905b815481529060010190602001808311610fd757829003601f168201915b5050505050905090565b600061101261100b613567565b848461356f565b6001905092915050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806110a657503373ffffffffffffffffffffffffffffffffffffffff1661108e612599565b73ffffffffffffffffffffffffffffffffffffffff16145b6110af57600080fd5b80600a8190555050565b6000600254905090565b60006009544310156110d8576000905061123f565b600a54431061112857600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061123f565b600061117c600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544361376690919063ffffffff16565b905060006111d4600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a5461376690919063ffffffff16565b905061123a8161122c84600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137e990919063ffffffff16565b61386f90919063ffffffff16565b925050505b919050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60006112758484846138f8565b61133684611281613567565b611331856040518060600160405280602881526020016149b060289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006112e7613567565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139d19092919063ffffffff16565b61356f565b600190509392505050565b611349613567565b73ffffffffffffffffffffffffffffffffffffffff16611367612599565b73ffffffffffffffffffffffffffffffffffffffff16146113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206c6f636b20746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b61149c82611bdf565b811115611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206c6f636b20616d6f756e74206f7665722062616c616e63650081525060200191505060405180910390fd5b61151c8230836138f8565b61156e81600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115c681600854613a8b90919063ffffffff16565b600881905550600954600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561165c57600954600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8173ffffffffffffffffffffffffffffffffffffffff167f625fed9875dada8643f2418b838ae0bc78d9a148a18eee4ee1979ff0f3f5d427826040518082815260200191505060405180910390a25050565b6000600560009054906101000a900460ff16905090565b6000600754905090565b60006117786116dc613567565b8461177385600160006116ed613567565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b61356f565b6001905092915050565b6000600854905090565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061181657503373ffffffffffffffffffffffffffffffffffffffff166117fe612599565b73ffffffffffffffffffffffffffffffffffffffff16145b61181f57600080fd5b8060078190555050565b611831613567565b73ffffffffffffffffffffffffffffffffffffffff1661184f612599565b73ffffffffffffffffffffffffffffffffffffffff16146118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6118e28282613b13565b61194d6000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613cda565b5050565b611959613567565b73ffffffffffffffffffffffffffffffffffffffff16611977612599565b73ffffffffffffffffffffffffffffffffffffffff1614611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a3957600080fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000611af0611aa283611bdf565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b9050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bb33382613f77565b50565b60095481565b600f6020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c2f613567565b73ffffffffffffffffffffffffffffffffffffffff16611c4d612599565b73ffffffffffffffffffffffffffffffffffffffff1614611cd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115611e2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806148c3602d913960400191505060405180910390fd5b611e8181600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f1681600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376690919063ffffffff16565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f6e8160085461376690919063ffffffff16565b600881905550600954600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561200457600954600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561210e57600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5317ebfc0ec3457aaee1706ade06359db30a72c13fc9e937354e852bd9e43df9836040518082815260200191505060405180910390a35050565b60004382106121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806148026032913960400191505060405180910390fd5b6000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16141561223e576000915050612532565b82600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161232857600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff16815260200190815260200160002060010154915050612532565b82600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156123a9576000915050612532565b6000806001830390505b8163ffffffff168163ffffffff1611156124cc576000600283830363ffffffff16816123db57fe5b04820390506123e86147e1565b600e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156124a457806020015195505050505050612532565b86816000015163ffffffff1610156124be578193506124c5565b6001820392505b50506123b3565b600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60106020528060005260406000206000915090505481565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b60006125d36110b9565b905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126705780601f1061264557610100808354040283529160200191612670565b820191906000526020600020905b81548152906001019060200180831161265357829003601f168201915b5050505050905090565b61270b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600954600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156127de57600954600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156128e857600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612985338261298033611bdf565b6138f8565b50565b6000612a4b612995613567565b84612a4685604051806060016040528060258152602001614a5260259139600160006129bf613567565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139d19092919063ffffffff16565b61356f565b6001905092915050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612b0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f45524332303a2063616e6e6f7420756e6c6f636b00000000000000000000000081525060200191505060405180910390fd5b6000612b15336110c3565b9050612b2030611bdf565b811115612b3357612b3030611bdf565b90505b612b3e3033836138f8565b612b9081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376690919063ffffffff16565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555043600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612c2c8160085461376690919063ffffffff16565b60088190555050565b6000612c49612c42613567565b84846138f8565b6001905092915050565b600080600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611612cbd576000612d21565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612dd357503373ffffffffffffffffffffffffffffffffffffffff16612dbb612599565b73ffffffffffffffffffffffffffffffffffffffff16145b612ddc57600080fd5b8060098190555050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866612e11610f5c565b80519060200120612e206140e8565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612fa4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613036576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806149d86031913960400191505060405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505589146130db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614834602d913960400191505060405180910390fd5b87421115613134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061495e6031913960400191505060405180910390fd5b61313e818b613f77565b50505050505050505050565b6000613154611782565b905090565b613161613567565b73ffffffffffffffffffffffffffffffffffffffff1661317f612599565b73ffffffffffffffffffffffffffffffffffffffff1614613208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600e602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b613357613567565b73ffffffffffffffffffffffffffffffffffffffff16613375612599565b73ffffffffffffffffffffffffffffffffffffffff16146133fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613484576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148f06026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006135626008546135546110b9565b61376690919063ffffffff16565b905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a2e6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561367b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806149166022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000828211156137de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6000808314156137fc5760009050613869565b600082840290508284828161380d57fe5b0414613864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061498f6021913960400191505060405180910390fd5b809150505b92915050565b60008082116138e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b8183816138ef57fe5b04905092915050565b6139038383836140f5565b6139cc600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613cda565b505050565b6000838311158290613a7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a43578082015181840152602081019050613a28565b50505050905090810190601f168015613a705780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b600080828401905083811015613b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b613bc2600083836143b6565b613bd781600254613a8b90919063ffffffff16565b600281905550613c2e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613d165750600081115b15613f7257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613e46576000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611613db9576000613e1d565b600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000613e34848361376690919063ffffffff16565b9050613e428684848461448d565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613f71576000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611613ee4576000613f48565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000613f5f8483613a8b90919063ffffffff16565b9050613f6d8584848461448d565b5050505b5b505050565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613fe684611bdf565b905082600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46140e2828483613cda565b50505050565b6000804690508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561417b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614a096025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806148616023913960400191505060405180910390fd5b61420c8383836143b6565b61427781604051806060016040528060268152602001614938602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139d19092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061430a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6143c1838383614721565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561448857600754614413826144056110b9565b613a8b90919063ffffffff16565b1115614487576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f45524332304361707065643a206361702065786365656465640000000000000081525060200191505060405180910390fd5b5b505050565b60006144b1436040518060600160405280603f8152602001614884603f9139614726565b905060008463ffffffff1611801561454657508063ffffffff16600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156145b75781600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff168152602001908152602001600020600101819055506146c4565b60405180604001604052808263ffffffff16815260200183815250600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b505050565b6000640100000000831082906147d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561479c578082015181840152602081019050614781565b50505050905090810190601f1680156147c95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff16815260200160008152509056fe476f7665726e616e6365546f6b656e3a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e6564476f7665726e616e6365546f6b656e3a3a64656c656761746542795369673a20696e76616c6964206e6f6e636545524332303a207472616e7366657220746f20746865207a65726f2061646472657373476f7665726e616e6365546f6b656e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e7366657220616d6f756e742065786365656473206c6f636b65642062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365476f7665726e616e6365546f6b656e3a3a64656c656761746542795369673a207369676e61747572652065787069726564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365476f7665726e616e6365546f6b656e3a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b70f6ef98e8aa83315d0e97371173792bfb3d7aa5979475ae2aea8d578ab575064736f6c634300060c003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000006765c793fa10079d0000000000000000000000000000000000000000000000000000000000000000151eda0000000000000000000000000000000000000000000000000000000000200e914000000000000000000000000000000000000000000000000000000000000000953656120546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035345410000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c8063756a5ab31161015c578063a9059cbb116100ce578063cf1c316a11610087578063cf1c316a14610dab578063dd62ed3e14610def578063e7a324dc14610e67578063f1127ed814610e85578063f2fde38b14610efa578063fd3d27b814610f3e5761028a565b8063a9059cbb14610bd0578063b4b5ea5714610c34578063b918161114610c8c578063c38533c614610ce6578063c3cda52014610d14578063ca5c7b9114610d8d5761028a565b80638e875e1a116101205780638e875e1a14610a5f5780639358928b14610a7d57806395d89b4114610a9b578063a3a7e7f314610b1e578063a457c2d714610b62578063a69df4b514610bc65761028a565b8063756a5ab3146108cb578063782d6fe1146109195780637ecebe001461097b57806389a2867c146109d35780638da5cb5b14610a2b5761028a565b80633a1aae35116102005780635a46d3b5116101b95780635a46d3b5146107515780635c19a95c146107a957806366fc237b146107ed5780636fcfff451461080b57806370a0823114610869578063715018a6146108c15761028a565b80633a1aae35146105ad57806340346c49146105cb57806340c10f19146105f9578063485d7d94146106475780634b0ee02a1461068b578063587cde1e146106e35761028a565b806320606b701161025257806320606b701461041a57806323b872dd14610438578063282d3fdf146104bc578063313ce5671461050a578063355274ea1461052b57806339509351146105495761028a565b806306fdde031461028f578063095ea7b3146103125780630cb285e21461037657806318160ddd146103a4578063202b1760146103c2575b600080fd5b610297610f5c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102d75780820151818401526020810190506102bc565b50505050905090810190601f1680156103045780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61035e6004803603604081101561032857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ffe565b60405180821515815260200191505060405180910390f35b6103a26004803603602081101561038c57600080fd5b810190808035906020019092919050505061101c565b005b6103ac6110b9565b6040518082815260200191505060405180910390f35b610404600480360360208110156103d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110c3565b6040518082815260200191505060405180910390f35b610422611244565b6040518082815260200191505060405180910390f35b6104a46004803603606081101561044e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611268565b60405180821515815260200191505060405180910390f35b610508600480360360408110156104d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611341565b005b6105126116ae565b604051808260ff16815260200191505060405180910390f35b6105336116c5565b6040518082815260200191505060405180910390f35b6105956004803603604081101561055f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116cf565b60405180821515815260200191505060405180910390f35b6105b5611782565b6040518082815260200191505060405180910390f35b6105f7600480360360208110156105e157600080fd5b810190808035906020019092919050505061178c565b005b6106456004803603604081101561060f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611829565b005b6106896004803603602081101561065d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611951565b005b6106cd600480360360208110156106a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a94565b6040518082815260200191505060405180910390f35b610725600480360360208110156106f957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611af7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107936004803603602081101561076757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b60565b6040518082815260200191505060405180910390f35b6107eb600480360360208110156107bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ba9565b005b6107f5611bb6565b6040518082815260200191505060405180910390f35b61084d6004803603602081101561082157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bbc565b604051808263ffffffff16815260200191505060405180910390f35b6108ab6004803603602081101561087f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bdf565b6040518082815260200191505060405180910390f35b6108c9611c27565b005b610917600480360360408110156108e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d97565b005b6109656004803603604081101561092f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612177565b6040518082815260200191505060405180910390f35b6109bd6004803603602081101561099157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612538565b6040518082815260200191505060405180910390f35b610a15600480360360208110156109e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612550565b6040518082815260200191505060405180910390f35b610a33612599565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a676125c3565b6040518082815260200191505060405180910390f35b610a856125c9565b6040518082815260200191505060405180910390f35b610aa36125d8565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae3578082015181840152602081019050610ac8565b50505050905090810190601f168015610b105780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b6060048036036020811015610b3457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061267a565b005b610bae60048036036040811015610b7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612988565b60405180821515815260200191505060405180910390f35b610bce612a55565b005b610c1c60048036036040811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c35565b60405180821515815260200191505060405180910390f35b610c7660048036036020811015610c4a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c53565b6040518082815260200191505060405180910390f35b610cce60048036036020811015610ca257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d29565b60405180821515815260200191505060405180910390f35b610d1260048036036020811015610cfc57600080fd5b8101908080359060200190929190505050612d49565b005b610d8b600480360360c0811015610d2a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050612de6565b005b610d9561314a565b6040518082815260200191505060405180910390f35b610ded60048036036020811015610dc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613159565b005b610e5160048036036040811015610e0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613263565b6040518082815260200191505060405180910390f35b610e6f6132ea565b6040518082815260200191505060405180910390f35b610ed760048036036040811015610e9b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803563ffffffff16906020019092919050505061330e565b604051808363ffffffff1681526020018281526020019250505060405180910390f35b610f3c60048036036020811015610f1057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061334f565b005b610f46613544565b6040518082815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ff45780601f10610fc957610100808354040283529160200191610ff4565b820191906000526020600020905b815481529060010190602001808311610fd757829003601f168201915b5050505050905090565b600061101261100b613567565b848461356f565b6001905092915050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806110a657503373ffffffffffffffffffffffffffffffffffffffff1661108e612599565b73ffffffffffffffffffffffffffffffffffffffff16145b6110af57600080fd5b80600a8190555050565b6000600254905090565b60006009544310156110d8576000905061123f565b600a54431061112857600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061123f565b600061117c600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544361376690919063ffffffff16565b905060006111d4600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a5461376690919063ffffffff16565b905061123a8161122c84600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137e990919063ffffffff16565b61386f90919063ffffffff16565b925050505b919050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60006112758484846138f8565b61133684611281613567565b611331856040518060600160405280602881526020016149b060289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006112e7613567565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139d19092919063ffffffff16565b61356f565b600190509392505050565b611349613567565b73ffffffffffffffffffffffffffffffffffffffff16611367612599565b73ffffffffffffffffffffffffffffffffffffffff16146113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206c6f636b20746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b61149c82611bdf565b811115611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206c6f636b20616d6f756e74206f7665722062616c616e63650081525060200191505060405180910390fd5b61151c8230836138f8565b61156e81600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115c681600854613a8b90919063ffffffff16565b600881905550600954600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561165c57600954600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8173ffffffffffffffffffffffffffffffffffffffff167f625fed9875dada8643f2418b838ae0bc78d9a148a18eee4ee1979ff0f3f5d427826040518082815260200191505060405180910390a25050565b6000600560009054906101000a900460ff16905090565b6000600754905090565b60006117786116dc613567565b8461177385600160006116ed613567565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b61356f565b6001905092915050565b6000600854905090565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061181657503373ffffffffffffffffffffffffffffffffffffffff166117fe612599565b73ffffffffffffffffffffffffffffffffffffffff16145b61181f57600080fd5b8060078190555050565b611831613567565b73ffffffffffffffffffffffffffffffffffffffff1661184f612599565b73ffffffffffffffffffffffffffffffffffffffff16146118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6118e28282613b13565b61194d6000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613cda565b5050565b611959613567565b73ffffffffffffffffffffffffffffffffffffffff16611977612599565b73ffffffffffffffffffffffffffffffffffffffff1614611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a3957600080fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000611af0611aa283611bdf565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b9050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bb33382613f77565b50565b60095481565b600f6020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c2f613567565b73ffffffffffffffffffffffffffffffffffffffff16611c4d612599565b73ffffffffffffffffffffffffffffffffffffffff1614611cd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115611e2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806148c3602d913960400191505060405180910390fd5b611e8181600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f1681600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376690919063ffffffff16565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f6e8160085461376690919063ffffffff16565b600881905550600954600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561200457600954600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561210e57600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5317ebfc0ec3457aaee1706ade06359db30a72c13fc9e937354e852bd9e43df9836040518082815260200191505060405180910390a35050565b60004382106121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806148026032913960400191505060405180910390fd5b6000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16141561223e576000915050612532565b82600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161232857600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff16815260200190815260200160002060010154915050612532565b82600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611156123a9576000915050612532565b6000806001830390505b8163ffffffff168163ffffffff1611156124cc576000600283830363ffffffff16816123db57fe5b04820390506123e86147e1565b600e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1614156124a457806020015195505050505050612532565b86816000015163ffffffff1610156124be578193506124c5565b6001820392505b50506123b3565b600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60106020528060005260406000206000915090505481565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b60006125d36110b9565b905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126705780601f1061264557610100808354040283529160200191612670565b820191906000526020600020905b81548152906001019060200180831161265357829003601f168201915b5050505050905090565b61270b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600954600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156127de57600954600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156128e857600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612985338261298033611bdf565b6138f8565b50565b6000612a4b612995613567565b84612a4685604051806060016040528060258152602001614a5260259139600160006129bf613567565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139d19092919063ffffffff16565b61356f565b6001905092915050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612b0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f45524332303a2063616e6e6f7420756e6c6f636b00000000000000000000000081525060200191505060405180910390fd5b6000612b15336110c3565b9050612b2030611bdf565b811115612b3357612b3030611bdf565b90505b612b3e3033836138f8565b612b9081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376690919063ffffffff16565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555043600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612c2c8160085461376690919063ffffffff16565b60088190555050565b6000612c49612c42613567565b84846138f8565b6001905092915050565b600080600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611612cbd576000612d21565b600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001830363ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612dd357503373ffffffffffffffffffffffffffffffffffffffff16612dbb612599565b73ffffffffffffffffffffffffffffffffffffffff16145b612ddc57600080fd5b8060098190555050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866612e11610f5c565b80519060200120612e206140e8565b30604051602001808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019450505050506040516020818303038152906040528051906020012090506000828260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612fa4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613036576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806149d86031913960400191505060405180910390fd5b601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505589146130db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614834602d913960400191505060405180910390fd5b87421115613134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061495e6031913960400191505060405180910390fd5b61313e818b613f77565b50505050505050505050565b6000613154611782565b905090565b613161613567565b73ffffffffffffffffffffffffffffffffffffffff1661317f612599565b73ffffffffffffffffffffffffffffffffffffffff1614613208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600e602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b613357613567565b73ffffffffffffffffffffffffffffffffffffffff16613375612599565b73ffffffffffffffffffffffffffffffffffffffff16146133fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613484576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148f06026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006135626008546135546110b9565b61376690919063ffffffff16565b905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a2e6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561367b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806149166022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000828211156137de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6000808314156137fc5760009050613869565b600082840290508284828161380d57fe5b0414613864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061498f6021913960400191505060405180910390fd5b809150505b92915050565b60008082116138e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b8183816138ef57fe5b04905092915050565b6139038383836140f5565b6139cc600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683613cda565b505050565b6000838311158290613a7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a43578082015181840152602081019050613a28565b50505050905090810190601f168015613a705780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082840390509392505050565b600080828401905083811015613b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613bb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b613bc2600083836143b6565b613bd781600254613a8b90919063ffffffff16565b600281905550613c2e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613d165750600081115b15613f7257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613e46576000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611613db9576000613e1d565b600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000613e34848361376690919063ffffffff16565b9050613e428684848461448d565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613f71576000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611613ee4576000613f48565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001840363ffffffff1663ffffffff168152602001908152602001600020600101545b90506000613f5f8483613a8b90919063ffffffff16565b9050613f6d8584848461448d565b5050505b5b505050565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613fe684611bdf565b905082600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46140e2828483613cda565b50505050565b6000804690508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561417b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614a096025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806148616023913960400191505060405180910390fd5b61420c8383836143b6565b61427781604051806060016040528060268152602001614938602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546139d19092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061430a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a8b90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6143c1838383614721565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561448857600754614413826144056110b9565b613a8b90919063ffffffff16565b1115614487576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f45524332304361707065643a206361702065786365656465640000000000000081525060200191505060405180910390fd5b5b505050565b60006144b1436040518060600160405280603f8152602001614884603f9139614726565b905060008463ffffffff1611801561454657508063ffffffff16600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156145b75781600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001870363ffffffff1663ffffffff168152602001908152602001600020600101819055506146c4565b60405180604001604052808263ffffffff16815260200183815250600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018401600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051808381526020018281526020019250505060405180910390a25050505050565b505050565b6000640100000000831082906147d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561479c578082015181840152602081019050614781565b50505050905090810190601f1680156147c95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082905092915050565b6040518060400160405280600063ffffffff16815260200160008152509056fe476f7665726e616e6365546f6b656e3a3a6765745072696f72566f7465733a206e6f74207965742064657465726d696e6564476f7665726e616e6365546f6b656e3a3a64656c656761746542795369673a20696e76616c6964206e6f6e636545524332303a207472616e7366657220746f20746865207a65726f2061646472657373476f7665726e616e6365546f6b656e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e7366657220616d6f756e742065786365656473206c6f636b65642062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365476f7665726e616e6365546f6b656e3a3a64656c656761746542795369673a207369676e61747572652065787069726564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365476f7665726e616e6365546f6b656e3a3a64656c656761746542795369673a20696e76616c6964207369676e617475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b70f6ef98e8aa83315d0e97371173792bfb3d7aa5979475ae2aea8d578ab575064736f6c634300060c0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000006765c793fa10079d0000000000000000000000000000000000000000000000000000000000000000151eda0000000000000000000000000000000000000000000000000000000000200e914000000000000000000000000000000000000000000000000000000000000000953656120546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035345410000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Sea Token
Arg [1] : _symbol (string): SEA
Arg [2] : cap_ (uint256): 2000000000000000000000000000
Arg [3] : _lockFromBlock (uint256): 22146464
Arg [4] : _lockToBlock (uint256): 33614100

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000000000000000000006765c793fa10079d0000000
Arg [3] : 000000000000000000000000000000000000000000000000000000000151eda0
Arg [4] : 000000000000000000000000000000000000000000000000000000000200e914
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [6] : 53656120546f6b656e0000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 5345410000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

25663:16595:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16639:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18785:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27101:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17738:108;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30603:522;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34205:155;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19436:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30001:594;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17582:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26649:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20166:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27540:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26815:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29078:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3926:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29614:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35304:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29758:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35569;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25787:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34084:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17909:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2932:148;;;:::i;:::-;;32262:934;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38186:1304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34661:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29870:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2281:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25822:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27434:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16849:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31733:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20887:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31133:508;;;:::i;:::-;;18249:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37519:236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3646:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26947:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36107:1211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27335:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3818:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18487:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34454:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33947:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;3235:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27216:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16639:91;16684:13;16717:5;16710:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16639:91;:::o;18785:169::-;18868:4;18885:39;18894:12;:10;:12::i;:::-;18908:7;18917:6;18885:8;:39::i;:::-;18942:4;18935:11;;18785:169;;;;:::o;27101:107::-;3742:10;:22;3753:10;3742:22;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;3779:10;3768:21;;:7;:5;:7::i;:::-;:21;;;3742:47;3734:56;;;;;;27190:10:::1;27176:11;:24;;;;27101:107:::0;:::o;17738:108::-;17799:7;17826:12;;17819:19;;17738:108;:::o;30603:522::-;30666:7;30705:13;;30690:12;:28;30686:432;;;30742:1;30735:8;;;;30686:432;30781:11;;30765:12;:27;30761:357;;30816:6;:15;30823:7;30816:15;;;;;;;;;;;;;;;;30809:22;;;;30761:357;30864:20;30887:43;30904:16;:25;30921:7;30904:25;;;;;;;;;;;;;;;;30887:12;:16;;:43;;;;:::i;:::-;30864:66;;30945:23;30988:42;31004:16;:25;31021:7;31004:25;;;;;;;;;;;;;;;;30988:11;;:15;;:42;;;;:::i;:::-;30945:85;;31052:54;31090:15;31052:33;31072:12;31052:6;:15;31059:7;31052:15;;;;;;;;;;;;;;;;:19;;:33;;;;:::i;:::-;:37;;:54;;;;:::i;:::-;31045:61;;;;30603:522;;;;:::o;34205:155::-;34256:104;34205:155;:::o;19436:321::-;19542:4;19559:36;19569:6;19577:9;19588:6;19559:9;:36::i;:::-;19606:121;19615:6;19623:12;:10;:12::i;:::-;19637:89;19675:6;19637:89;;;;;;;;;;;;;;;;;:11;:19;19649:6;19637:19;;;;;;;;;;;;;;;:33;19657:12;:10;:12::i;:::-;19637:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;19606:8;:121::i;:::-;19745:4;19738:11;;19436:321;;;;;:::o;30001:594::-;2512:12;:10;:12::i;:::-;2501:23;;:7;:5;:7::i;:::-;:23;;;2493:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30104:1:::1;30085:21;;:7;:21;;;;30077:65;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;30186:18;30196:7;30186:9;:18::i;:::-;30175:7;:29;;30153:110;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;30276:42;30286:7;30303:4;30310:7;30276:9;:42::i;:::-;30349:28;30369:7;30349:6;:15;30356:7;30349:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;30331:6;:15;30338:7;30331:15;;;;;;;;;;;;;;;:46;;;;30401:23;30416:7;30401:10;;:14;;:23;;;;:::i;:::-;30388:10;:36;;;;30467:13;;30439:16;:25;30456:7;30439:25;;;;;;;;;;;;;;;;:41;30435:115;;;30525:13;;30497:16;:25;30514:7;30497:25;;;;;;;;;;;;;;;:41;;;;30435:115;30570:7;30565:22;;;30579:7;30565:22;;;;;;;;;;;;;;;;;;30001:594:::0;;:::o;17582:91::-;17631:5;17656:9;;;;;;;;;;;17649:16;;17582:91;:::o;26649:75::-;26685:7;26712:4;;26705:11;;26649:75;:::o;20166:218::-;20254:4;20271:83;20280:12;:10;:12::i;:::-;20294:7;20303:50;20342:10;20303:11;:25;20315:12;:10;:12::i;:::-;20303:25;;;;;;;;;;;;;;;:34;20329:7;20303:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;20271:8;:83::i;:::-;20372:4;20365:11;;20166:218;;;;:::o;27540:87::-;27582:7;27609:10;;27602:17;;27540:87;:::o;26815:91::-;3742:10;:22;3753:10;3742:22;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;3779:10;3768:21;;:7;:5;:7::i;:::-;:21;;;3742:47;3734:56;;;;;;26891:7:::1;26884:4;:14;;;;26815:91:::0;:::o;29078:162::-;2512:12;:10;:12::i;:::-;2501:23;;:7;:5;:7::i;:::-;:23;;;2493:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29150:19:::1;29156:3;29161:7;29150:5;:19::i;:::-;29180:52;29203:1;29207:10;:15;29218:3;29207:15;;;;;;;;;;;;;;;;;;;;;;;;;29224:7;29180:14;:52::i;:::-;29078:162:::0;;:::o;3926:153::-;2512:12;:10;:12::i;:::-;2501:23;;:7;:5;:7::i;:::-;:23;;;2493:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4020:10:::1;4007:23;;:9;:23;;;;3999:32;;;::::0;::::1;;4066:5;4042:10;:21;4053:9;4042:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;3926:153:::0;:::o;29614:136::-;29676:7;29703:39;29723:18;29733:7;29723:9;:18::i;:::-;29703:6;:15;29710:7;29703:15;;;;;;;;;;;;;;;;:19;;:39;;;;:::i;:::-;29696:46;;29614:136;;;:::o;35304:117::-;35365:7;35392:10;:21;35403:9;35392:21;;;;;;;;;;;;;;;;;;;;;;;;;35385:28;;35304:117;;;:::o;29758:104::-;29812:7;29839:6;:15;29846:7;29839:15;;;;;;;;;;;;;;;;29832:22;;29758:104;;;:::o;35569:::-;35633:32;35643:10;35655:9;35633;:32::i;:::-;35569:104;:::o;25787:28::-;;;;:::o;34084:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;17909:127::-;17983:7;18010:9;:18;18020:7;18010:18;;;;;;;;;;;;;;;;18003:25;;17909:127;;;:::o;2932:148::-;2512:12;:10;:12::i;:::-;2501:23;;:7;:5;:7::i;:::-;:23;;;2493:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3039:1:::1;3002:40;;3023:6;;;;;;;;;;;3002:40;;;;;;;;;;;;3070:1;3053:6;;:19;;;;;;;;;;;;;;;;;;2932:148::o:0;32262:934::-;32424:6;:18;32431:10;32424:18;;;;;;;;;;;;;;;;32414:6;:28;;32406:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32554:23;32570:6;32554;:11;32561:3;32554:11;;;;;;;;;;;;;;;;:15;;:23;;;;:::i;:::-;32540:6;:11;32547:3;32540:11;;;;;;;;;;;;;;;:37;;;;32651:30;32674:6;32651;:18;32658:10;32651:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;32630:6;:18;32637:10;32630:18;;;;;;;;;;;;;;;:51;;;;32742:22;32757:6;32742:10;;:14;;:22;;;;:::i;:::-;32729:10;:35;;;;32904:13;;32880:16;:21;32897:3;32880:21;;;;;;;;;;;;;;;;:37;32876:107;;;32958:13;;32934:16;:21;32951:3;32934:21;;;;;;;;;;;;;;;:37;;;;32876:107;33023:16;:28;33040:10;33023:28;;;;;;;;;;;;;;;;32999:16;:21;33016:3;32999:21;;;;;;;;;;;;;;;;:52;32995:137;;;33092:16;:28;33109:10;33092:28;;;;;;;;;;;;;;;;33068:16;:21;33085:3;33068:21;;;;;;;;;;;;;;;:52;;;;32995:137;33176:3;33149:39;;33164:10;33149:39;;;33181:6;33149:39;;;;;;;;;;;;;;;;;;32262:934;;:::o;38186:1304::-;38297:7;38358:12;38344:11;:26;38322:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38461:19;38483:14;:23;38498:7;38483:23;;;;;;;;;;;;;;;;;;;;;;;;;38461:45;;38537:1;38521:12;:17;;;38517:58;;;38562:1;38555:8;;;;;38517:58;38687:11;38635;:20;38647:7;38635:20;;;;;;;;;;;;;;;:38;38671:1;38656:12;:16;38635:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;38631:147;;38722:11;:20;38734:7;38722:20;;;;;;;;;;;;;;;:38;38758:1;38743:12;:16;38722:38;;;;;;;;;;;;;;;:44;;;38715:51;;;;;38631:147;38875:11;38839;:20;38851:7;38839:20;;;;;;;;;;;;;;;:23;38860:1;38839:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;38835:88;;;38910:1;38903:8;;;;;38835:88;38935:12;38962;38992:1;38977:12;:16;38962:31;;39004:428;39019:5;39011:13;;:5;:13;;;39004:428;;;39041:13;39083:1;39074:5;39066;:13;39065:19;;;;;;;;39057:5;:27;39041:43;;39126:20;;:::i;:::-;39149:11;:20;39161:7;39149:20;;;;;;;;;;;;;;;:28;39170:6;39149:28;;;;;;;;;;;;;;;39126:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39212:11;39196:2;:12;;;:27;;;39192:229;;;39251:2;:8;;;39244:15;;;;;;;;;39192:229;39300:11;39285:2;:12;;;:26;;;39281:140;;;39340:6;39332:14;;39281:140;;;39404:1;39395:6;:10;39387:18;;39281:140;39004:428;;;;;39449:11;:20;39461:7;39449:20;;;;;;;;;;;;;;;:27;39470:5;39449:27;;;;;;;;;;;;;;;:33;;;39442:40;;;;;38186:1304;;;;;:::o;34661:41::-;;;;;;;;;;;;;;;;;:::o;29870:123::-;29933:7;29960:16;:25;29977:7;29960:25;;;;;;;;;;;;;;;;29953:32;;29870:123;;;:::o;2281:87::-;2327:7;2354:6;;;;;;;;;;;2347:13;;2281:87;:::o;25822:26::-;;;;:::o;27434:98::-;27484:7;27511:13;:11;:13::i;:::-;27504:20;;27434:98;:::o;16849:95::-;16896:13;16929:7;16922:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16849:95;:::o;31733:517::-;31799:35;31815:6;:18;31822:10;31815:18;;;;;;;;;;;;;;;;31799:6;:11;31806:3;31799:11;;;;;;;;;;;;;;;;:15;;:35;;;;:::i;:::-;31785:6;:11;31792:3;31785:11;;;;;;;;;;;;;;;:49;;;;31875:13;;31851:16;:21;31868:3;31851:21;;;;;;;;;;;;;;;;:37;31847:107;;;31929:13;;31905:16;:21;31922:3;31905:21;;;;;;;;;;;;;;;:37;;;;31847:107;31994:16;:28;32011:10;31994:28;;;;;;;;;;;;;;;;31970:16;:21;31987:3;31970:21;;;;;;;;;;;;;;;;:52;31966:137;;;32063:16;:28;32080:10;32063:28;;;;;;;;;;;;;;;;32039:16;:21;32056:3;32039:21;;;;;;;;;;;;;;;:52;;;;31966:137;32136:1;32115:6;:18;32122:10;32115:18;;;;;;;;;;;;;;;:22;;;;32179:1;32148:16;:28;32165:10;32148:28;;;;;;;;;;;;;;;:32;;;;32193:49;32203:10;32215:3;32220:21;32230:10;32220:9;:21::i;:::-;32193:9;:49::i;:::-;31733:517;:::o;20887:269::-;20980:4;20997:129;21006:12;:10;:12::i;:::-;21020:7;21029:96;21068:15;21029:96;;;;;;;;;;;;;;;;;:11;:25;21041:12;:10;:12::i;:::-;21029:25;;;;;;;;;;;;;;;:34;21055:7;21029:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;20997:8;:129::i;:::-;21144:4;21137:11;;20887:269;;;;:::o;31133:508::-;31198:1;31177:6;:18;31184:10;31177:18;;;;;;;;;;;;;;;;:22;31169:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31237:14;31254:27;31270:10;31254:15;:27::i;:::-;31237:44;;31331:24;31349:4;31331:9;:24::i;:::-;31322:6;:33;31318:99;;;31381:24;31399:4;31381:9;:24::i;:::-;31372:33;;31318:99;31427:44;31445:4;31452:10;31464:6;31427:9;:44::i;:::-;31503:30;31526:6;31503;:18;31510:10;31503:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;31482:6;:18;31489:10;31482:18;;;;;;;;;;;;;;;:51;;;;31575:12;31544:16;:28;31561:10;31544:28;;;;;;;;;;;;;;;:43;;;;31611:22;31626:6;31611:10;;:14;;:22;;;;:::i;:::-;31598:10;:35;;;;31133:508;:::o;18249:175::-;18335:4;18352:42;18362:12;:10;:12::i;:::-;18376:9;18387:6;18352:9;:42::i;:::-;18412:4;18405:11;;18249:175;;;;:::o;37519:236::-;37584:7;37604:19;37626:14;:23;37641:7;37626:23;;;;;;;;;;;;;;;;;;;;;;;;;37604:45;;37695:1;37680:12;:16;;;:67;;37746:1;37680:67;;;37699:11;:20;37711:7;37699:20;;;;;;;;;;;;;;;:38;37735:1;37720:12;:16;37699:38;;;;;;;;;;;;;;;:44;;;37680:67;37660:87;;;37519:236;;;:::o;3646:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;26947:115::-;3742:10;:22;3753:10;3742:22;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;3779:10;3768:21;;:7;:5;:7::i;:::-;:21;;;3742:47;3734:56;;;;;;27042:12:::1;27026:13;:28;;;;26947:115:::0;:::o;36107:1211::-;36292:23;34256:104;36446:6;:4;:6::i;:::-;36430:24;;;;;;36477:12;:10;:12::i;:::-;36520:4;36359:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36331:228;;;;;;36292:267;;36572:18;34509:71;36666:9;36677:5;36684:6;36634:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36606:100;;;;;;36572:134;;36719:14;36806:15;36823:10;36777:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36749:100;;;;;;36719:130;;36862:17;36882:26;36892:6;36900:1;36903;36906;36882:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36862:46;;36962:1;36941:23;;:9;:23;;;;36919:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37083:6;:17;37090:9;37083:17;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;37074:5;:28;37052:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37201:6;37194:3;:13;;37186:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37279:31;37289:9;37300;37279;:31::i;:::-;37272:38;;;;36107:1211;;;;;;:::o;27335:91::-;27380:7;27407:11;:9;:11::i;:::-;27400:18;;27335:91;:::o;3818:100::-;2512:12;:10;:12::i;:::-;2501:23;;:7;:5;:7::i;:::-;:23;;;2493:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3906:4:::1;3885:10;:18;3896:6;3885:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;3818:100:::0;:::o;18487:151::-;18576:7;18603:11;:18;18615:5;18603:18;;;;;;;;;;;;;;;:27;18622:7;18603:27;;;;;;;;;;;;;;;;18596:34;;18487:151;;;;:::o;34454:126::-;34509:71;34454:126;:::o;33947:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3235:244::-;2512:12;:10;:12::i;:::-;2501:23;;:7;:5;:7::i;:::-;:23;;;2493:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3344:1:::1;3324:22;;:8;:22;;;;3316:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3434:8;3405:38;;3426:6;;;;;;;;;;;3405:38;;;;;;;;;;;;3463:8;3454:6;;:17;;;;;;;;;;;;;;;;;;3235:244:::0;:::o;27216:111::-;27263:7;27290:29;27308:10;;27290:13;:11;:13::i;:::-;:17;;:29;;;;:::i;:::-;27283:36;;27216:111;:::o;776:106::-;829:15;864:10;857:17;;776:106;:::o;24034:346::-;24153:1;24136:19;;:5;:19;;;;24128:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24234:1;24215:21;;:7;:21;;;;24207:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24318:6;24288:11;:18;24300:5;24288:18;;;;;;;;;;;;;;;:27;24307:7;24288:27;;;;;;;;;;;;;;;:36;;;;24356:7;24340:32;;24349:5;24340:32;;;24365:6;24340:32;;;;;;;;;;;;;;;;;;24034:346;;;:::o;10233:158::-;10291:7;10324:1;10319;:6;;10311:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10382:1;10378;:5;10371:12;;10233:158;;;;:::o;10650:220::-;10708:7;10737:1;10732;:6;10728:20;;;10747:1;10740:8;;;;10728:20;10759:9;10775:1;10771;:5;10759:17;;10804:1;10799;10795;:5;;;;;;:10;10787:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10861:1;10854:8;;;10650:220;;;;;:::o;11348:153::-;11406:7;11438:1;11434;:5;11426:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11492:1;11488;:5;;;;;;11481:12;;11348:153;;;;:::o;28718:267::-;28859:42;28875:6;28883:9;28894:6;28859:15;:42::i;:::-;28912:65;28927:10;:18;28938:6;28927:18;;;;;;;;;;;;;;;;;;;;;;;;;28947:10;:21;28958:9;28947:21;;;;;;;;;;;;;;;;;;;;;;;;;28970:6;28912:14;:65::i;:::-;28718:267;;;:::o;12598:166::-;12684:7;12717:1;12712;:6;;12720:12;12704:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12755:1;12751;:5;12744:12;;12598:166;;;;;:::o;9771:179::-;9829:7;9849:9;9865:1;9861;:5;9849:17;;9890:1;9885;:6;;9877:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9941:1;9934:8;;;9771:179;;;;:::o;22467:378::-;22570:1;22551:21;;:7;:21;;;;22543:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22621:49;22650:1;22654:7;22663:6;22621:20;:49::i;:::-;22698:24;22715:6;22698:12;;:16;;:24;;;;:::i;:::-;22683:12;:39;;;;22754:30;22777:6;22754:9;:18;22764:7;22754:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;22733:9;:18;22743:7;22733:18;;;;;;;;;;;;;;;:51;;;;22821:7;22800:37;;22817:1;22800:37;;;22830:6;22800:37;;;;;;;;;;;;;;;;;;22467:378;;:::o;39885:1123::-;40025:6;40015:16;;:6;:16;;;;:30;;;;;40044:1;40035:6;:10;40015:30;40011:990;;;40084:1;40066:20;;:6;:20;;;40062:456;;40155:16;40174:14;:22;40189:6;40174:22;;;;;;;;;;;;;;;;;;;;;;;;;40155:41;;40215:17;40268:1;40256:9;:13;;;:110;;40365:1;40256:110;;;40297:11;:19;40309:6;40297:19;;;;;;;;;;;;;;;:34;40329:1;40317:9;:13;40297:34;;;;;;;;;;;;;;;:40;;;40256:110;40215:151;;40385:17;40405:21;40419:6;40405:9;:13;;:21;;;;:::i;:::-;40385:41;;40445:57;40462:6;40470:9;40481;40492;40445:16;:57::i;:::-;40062:456;;;;40556:1;40538:20;;:6;:20;;;40534:456;;40627:16;40646:14;:22;40661:6;40646:22;;;;;;;;;;;;;;;;;;;;;;;;;40627:41;;40687:17;40740:1;40728:9;:13;;;:110;;40837:1;40728:110;;;40769:11;:19;40781:6;40769:19;;;;;;;;;;;;;;;:34;40801:1;40789:9;:13;40769:34;;;;;;;;;;;;;;;:40;;;40728:110;40687:151;;40857:17;40877:21;40891:6;40877:9;:13;;:21;;;;:::i;:::-;40857:41;;40917:57;40934:6;40942:9;40953;40964;40917:16;:57::i;:::-;40534:456;;;;40011:990;39885:1123;;;:::o;39498:379::-;39575:23;39601:10;:21;39612:9;39601:21;;;;;;;;;;;;;;;;;;;;;;;;;39575:47;;39633:24;39660:20;39670:9;39660;:20::i;:::-;39633:47;;39715:9;39691:10;:21;39702:9;39691:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;39786:9;39742:54;;39769:15;39742:54;;39758:9;39742:54;;;;;;;;;;;;39809:60;39824:15;39841:9;39852:16;39809:14;:60::i;:::-;39498:379;;;;:::o;42077:178::-;42122:7;42142:15;42203:9;42192:20;;42240:7;42233:14;;;42077:178;:::o;21646:539::-;21770:1;21752:20;;:6;:20;;;;21744:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21854:1;21833:23;;:9;:23;;;;21825:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21909:47;21930:6;21938:9;21949:6;21909:20;:47::i;:::-;21989:71;22011:6;21989:71;;;;;;;;;;;;;;;;;:9;:17;21999:6;21989:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;21969:9;:17;21979:6;21969:17;;;;;;;;;;;;;;;:91;;;;22094:32;22119:6;22094:9;:20;22104:9;22094:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;22071:9;:20;22081:9;22071:20;;;;;;;;;;;;;;;:55;;;;22159:9;22142:35;;22151:6;22142:35;;;22170:6;22142:35;;;;;;;;;;;;;;;;;;21646:539;;;:::o;27814:414::-;27957:44;27984:4;27990:2;27994:6;27957:26;:44::i;:::-;28034:1;28018:18;;:4;:18;;;28014:207;;;28144:4;;28115:25;28133:6;28115:13;:11;:13::i;:::-;:17;;:25;;;;:::i;:::-;:33;;28089:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28014:207;27814:414;;;:::o;41016:849::-;41181:18;41215:136;41240:12;41215:136;;;;;;;;;;;;;;;;;:6;:136::i;:::-;41181:170;;41397:1;41382:12;:16;;;:98;;;;;41469:11;41415:65;;:11;:22;41427:9;41415:22;;;;;;;;;;;;;;;:40;41453:1;41438:12;:16;41415:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;41382:98;41364:425;;;41556:8;41507:11;:22;41519:9;41507:22;;;;;;;;;;;;;;;:40;41545:1;41530:12;:16;41507:40;;;;;;;;;;;;;;;:46;;:57;;;;41364:425;;;41636:82;;;;;;;;41665:11;41636:82;;;;;;41695:8;41636:82;;;41597:11;:22;41609:9;41597:22;;;;;;;;;;;;;;;:36;41620:12;41597:36;;;;;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41776:1;41761:12;:16;41733:14;:25;41748:9;41733:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;41364:425;41827:9;41806:51;;;41838:8;41848;41806:51;;;;;;;;;;;;;;;;;;;;;;;;41016:849;;;;;:::o;25413:92::-;;;;:::o;41873:196::-;41978:6;42014:5;42010:1;:9;42021:12;42002:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42059:1;42045:16;;41873:196;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://b70f6ef98e8aa83315d0e97371173792bfb3d7aa5979475ae2aea8d578ab5750
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.