ETH Price: $3,051.62 (+2.39%)
Gas: 1 Gwei

Token

GridZone.io (ZONE)
 

Overview

Max Total Supply

13,592,902.619482496194824961 ZONE

Holders

876 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
irewind.eth
Balance
154.463526499609103971 ZONE

Value
$0.00
0x4747145c8c6117f04697759e19ac27844152cb09
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Art-focused metaverse on Ethereum with digital identities.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ZONE

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 5 : ZONE.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
pragma experimental ABIEncoderV2;

import "@openzeppelin/contracts/math/SafeMath.sol";

import "./lib/Ownable.sol";
import "./lib/Global.sol";

contract CompBase is Ownable {
    using SafeMath for uint256;

    /// @notice EIP-20 token name for this token
    string public constant name = "GridZone.io";

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = "ZONE";

    /// @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 18;

    // Total number of tokens in circulation
    uint256 internal constant _teamSupply = 3360000 * (10 ** uint256(decimals)); // 12%
    uint256 internal constant _advisorsSupply = 980000 * (10 ** uint256(decimals)); // 3.5%
    uint256 internal constant _genesisSupply = 2800000 * (10 ** uint256(decimals)); // 10%
    uint256 internal constant _publicSupply = 420000 * (10 ** uint256(decimals)); // 1.5%
    uint256 internal constant _treasurySupply = 3640000 * (10 ** uint256(decimals)); // 13%
    uint256 internal constant _airdropSupply = 420000 * (10 ** uint256(decimals)); // 1.5%
    uint256 internal constant _ecosystemSupply = 16380000 * (10 ** uint256(decimals)); // 58.5%

    uint256 internal constant _genesisEthCapacity = 100e18; // 100 ETH
    uint256 internal _publicEthCapacity = 2000e18; // 2000 ETH

    uint256 private _totalSupply = 0;
    uint256 private _totalLockedTokens = 0;

    /**
     * @dev Sets the value of the `cap`. This value is immutable, it can only be
     * set once during construction.
     */
    uint256 private constant _cap = _teamSupply + _advisorsSupply + _genesisSupply
        + _publicSupply + _treasurySupply + _airdropSupply + _ecosystemSupply;

    // Allowance amounts on behalf of others
    mapping (address => mapping (address => uint256)) internal allowances;

    // Official record of token balances for each account
    mapping (address => uint256) internal _balances;

    /// @notice A record of each accounts delegate
    mapping (address => address) public 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;

    // A record of the locked token
    uint8 internal constant LOCK_TYPE_GENESIS = 0;
    uint8 internal constant LOCK_TYPE_BLACKLIST = 1;
    struct LockedToken {
        uint256 id;
        uint8 lockType;
        uint256 amount;
        uint256 start;
        uint256 end;
    }
    mapping(address => LockedToken[]) internal _lockedTokens;
    uint256 private lastLockId = 0;

    /// @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 => uint) 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, uint previousBalance, uint newBalance);

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /// @notice token locked event
    event TokenLocked(address indexed account, uint256 amount, uint8 lockType, uint256 end);
    event TokenUnlocked(address indexed account, uint256 amount, uint8 lockType);

    /**
     * @notice Construct a new GridZone token
     * @param ownerAddress Owner address of the GridZone token
     */
    constructor(address ownerAddress) Ownable(ownerAddress) public {
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply.add(_totalLockedTokens);
    }

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

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint256) {
        uint256 amount = _balances[account];
        return amount.add(getLockedAmount(account));
    }

    function getLockedAmount(address account) public view returns (uint256) {
        LockedToken[] memory lockedTokensRef = _lockedTokens[account];
        uint256 length = lockedTokensRef.length;

        uint256 amount = 0;
        for (uint256 i = 0; i < length; i ++) {
            amount = amount.add(lockedTokensRef[i].amount);
        }
        return amount;
    }

    /**
     * @notice Gets the available votes balance for `account` regarding locked token
     * @param account The address to get votes balance
     * @return The number of available votes balance for `account`
     */
    function voteBalanceOf(address account) public view returns (uint256) {
        uint256 amount = _balances[account];

        LockedToken[] memory lockedTokensRef = _lockedTokens[account];
        uint256 length = lockedTokensRef.length;
        for (uint256 i = 0; i < length; i ++) {
            if (lockedTokensRef[i].lockType != LOCK_TYPE_BLACKLIST) {
                amount = amount.add(lockedTokensRef[i].amount);
            }
        }

        return amount;
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint256) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint rawAmount) external returns (bool) {
        _approve(_msgSender(), spender, rawAmount);
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ZONE: approve from the zero address");
        require(spender != address(0), "ZONE: approve to the zero address");

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

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint256 rawAmount) external returns (bool) {
        _transferTokens(msg.sender, dst, rawAmount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param rawAmount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint256 rawAmount) external returns (bool) {
        address spender = msg.sender;
        uint256 spenderAllowance = allowances[src][spender];

        if (spender != src && spenderAllowance != uint256(-1)) {
            uint256 newAllowance = spenderAllowance.sub(rawAmount);
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, rawAmount);
        return true;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        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, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public {
        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), "ZONE::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "ZONE::delegateBySig: invalid nonce");
        require(now <= expiry, "ZONE::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, uint blockNumber) public view returns (uint256) {
        require(blockNumber < block.number, "ZONE::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 = voteBalanceOf(delegator);
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _transferTokens(address src, address dst, uint256 amount) internal {
        require(src != address(0), "ZONE::_transferTokens: cannot transfer from the zero address");
        require(dst != address(0), "ZONE::_transferTokens: cannot transfer to the zero address");

        _beforeTokenTransfer(src, dst, amount);

        _balances[src] = _balances[src].sub(amount);
        _balances[dst] = _balances[dst].add(amount);
        emit Transfer(src, dst, amount);

        _moveDelegates(delegates[src], delegates[dst], amount);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                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)) {
                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, "ZONE::_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(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

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

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

        _moveDelegates(address(0), delegates[account], amount);
    }

    function _mintLockedToken(address account, uint256 amount, uint8 lockType, uint256 end) internal {
        require(account != address(0), "ZONE: mint to the zero address");

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

        _totalLockedTokens = _totalLockedTokens.add(amount);

        LockedToken memory lockedToken = LockedToken({
            id: lastLockId++,
            lockType: lockType,
            amount: amount,
            start: now,
            end: end
        });
        _lockedTokens[account].push(lockedToken);

        emit Transfer(address(0), account, amount);

        if (lockType != LOCK_TYPE_BLACKLIST) {
            _moveDelegates(address(0), delegates[account], amount);
        }
        emit TokenLocked(account, amount, lockType, end);
    }

    function _unlockToken(address account, uint256 lockId) internal {
        LockedToken[] storage lockedTokensRef = _lockedTokens[account];
        uint256 length = lockedTokensRef.length;
        require(0 < length, "ZONE: No locked token");

        bool found = false;
        uint256 index = 0;
        for (uint256 i = 0; i < length; i++) {
            if (lockedTokensRef[i].id == lockId) {
                index = i;
                found = true;
                break;
            }
        }
        require(found == true, "ZONE: lockId invalid");

        uint256 amount = lockedTokensRef[index].amount;
        uint8 lockType = lockedTokensRef[index].lockType;

        _totalLockedTokens = _totalLockedTokens.sub(amount);
        _totalSupply = _totalSupply.add(amount);

        // remove item from list
        uint256 lastIndex = length - 1;
        if (index < lastIndex) {
            lockedTokensRef[index] = lockedTokensRef[lastIndex];
        }
        lockedTokensRef.pop();
        _balances[account] = _balances[account].add(amount);

        if (lockType == LOCK_TYPE_BLACKLIST) {
            _moveDelegates(address(0), delegates[account], amount);
        }
        emit TokenUnlocked(account, amount, lockType);
    }

    function getLockedTokens(address account) external view returns (LockedToken[] memory) {
        LockedToken[] memory lockedTokensRef = _lockedTokens[account];
        return lockedTokensRef;
    }

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

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

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

        _moveDelegates(delegates[account], address(0), amount);
    }

    /**
     * @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) view internal {
        if (from == address(0)) { // When minting tokens
            require(totalSupply().add(amount) <= _cap, "Capped: cap exceeded");
        }
    }
}


/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is CompBase {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public {
        address spender = _msgSender();
        uint256 spenderAllowance = allowances[account][spender];
        uint256 decreasedAllowance = spenderAllowance.sub(amount, "ZONE::burnFrom: burn amount exceeds allowance");

        _approve(account, spender, decreasedAllowance);
        _burn(account, amount);
    }
}

contract ZONE is CompBase, ERC20Burnable {
    using SafeMath for uint256;

    uint256 public immutable launchTime;

    address public immutable vault;

    uint256 private _genesisRate;
    uint256 private _publicRate;
    uint256 public immutable genesisSaleEndTime;
    uint256 public immutable genesisSaleUnlockTime;

    // total purchased eth amount during ICO. The unit is wei
    uint256 public genesisSaleBoughtEth = 0;
    uint256 public publicSaleBoughtEth = 0;

    uint256 public genesisSaleSoldToken = 0;
    uint256 public publicSaleSoldToken = 0;

    bool private _genesisSaleFinished = false;
    bool private _publicSaleFinished = false;

    struct Vest {
        address beneficiary;
        uint256 start;
        uint256 cliff;
        uint256 duration;
        uint256 amount;
        uint256 claimedAmount;
        bool revoked;
    }
    mapping (address => Vest) public vests;

    uint16[] private quarterlyRate; // sum is same with quarterlyRateDenominator
    uint16 private constant quarterlyRateDenominator = 10000;
    uint256 public claimedEcosystemVest = 0;

    address private governorTimelock;

    event VestAdded(address indexed beneficiary, uint256 start, uint256 cliff, uint256 duration, uint256 amount);
    event VestClaimed(address indexed beneficiary, uint256 amount);
    event EcosystemVestClaimed(address indexed account, uint256 amount);
    event SoldOnGenesisSale(address indexed buyer, uint256 ethAmount, uint256 tokenAmount);
    event SoldOnPublicSale(address indexed buyer, uint256 ethAmount, uint256 tokenAmount);
    event GenesisSaleFinished(uint256 boughtEth, uint256 soldToken);
    event PublicSaleFinished(uint256 boughtEth, uint256 soldToken);
    event GenesisSaleRateChanged(uint256 newRate);
    event PublicSaleRateChanged(uint256 newRate);
    event PublicSaleEthCapacityChanged(uint256 newRate, uint256 newEthCapacity);

    constructor(address owner_, address vault_, address advisors_, address treasury_) CompBase(owner_) public {
        require(owner_ != vault_, "ZONE: You specified owner address as an vault address");
        launchTime = now;
        quarterlyRate = [3182, 2676, 2250, 1892];

        vault = vault_;

        _genesisRate = _genesisSupply.mul(10).div(_genesisEthCapacity).div(12); // 2/12 is for bonuses
        _publicRate = _publicSupply.div(_publicEthCapacity);
        genesisSaleEndTime = now + GLOBAL.SECONDS_IN_MONTH * 3;
        genesisSaleUnlockTime = now + GLOBAL.SECONDS_IN_MONTH * 4;

        AddVest(owner_, now, 0, GLOBAL.SECONDS_IN_YEAR * 2, _teamSupply);
        AddVest(advisors_, now, 0, GLOBAL.SECONDS_IN_YEAR, _advisorsSupply);

        _mintLockedToken(treasury_, _treasurySupply, LOCK_TYPE_BLACKLIST, now + GLOBAL.SECONDS_IN_YEAR);
        _mint(vault_, _airdropSupply);
    }

    modifier onlyCommunity() {
        require(msg.sender == governorTimelock, "ZONE: The caller is not the governance timelock contract.");
        _;
    }

    modifier onlyEndUser {
        require(msg.sender == tx.origin, "ZONE: Only end-user");
        _;
    }

    function setGovernorTimelock(address governorTimelock_) external onlyOwner  {
        governorTimelock = governorTimelock_;
    }

    /**
    * @param beneficiary address of the beneficiary to whom vested tokens are transferred
    * @param cliff duration in seconds of the cliff in which tokens will begin to vest
    * @param duration duration in seconds of the period in which the tokens will vest
    */
    function AddVest(address beneficiary, uint256 start, uint256 cliff, uint256 duration, uint256 amount) internal {
        require(beneficiary != address(0), "ZONE::AddVest Invalid beneficiary");
        require(cliff <= duration, "ZONE::AddVest cliff > duration");

        Vest memory vest = Vest({
            beneficiary: beneficiary,
            start: start,
            cliff: start.add(cliff),
            duration: duration,
            amount: amount,
            claimedAmount: 0,
            revoked: false
        });

        vests[beneficiary] = vest;
        emit VestAdded(beneficiary, start, cliff, duration, amount);
    }

    function calculateVestClaim(address beneficiary) public view returns (uint256 vestedAmount, uint256 claimedAmount) {
        Vest storage vest = vests[beneficiary];
        if (vest.beneficiary != beneficiary) {
            // Invalid beneficiary
            return (0, 0);
        }

        if (now < vest.cliff) {
            // For vest created with a future start date, that hasn't been reached, return 0, 0
            return (0, vest.claimedAmount);
        } else if (vest.revoked == true) {
            return (vest.claimedAmount, vest.claimedAmount);
        } else if (vest.start.add(vest.duration) <= now) {
            return (vest.amount, vest.claimedAmount);
        } else {
            vestedAmount = vest.amount.mul(now.sub(vest.start)).div(vest.duration);
            return (vestedAmount, vest.claimedAmount);
        }
    }

    function claimVestedToken(address beneficiary) external {
        (uint256 vested, uint256 claimed) = calculateVestClaim(beneficiary);
        require(claimed < vested, "ZONE: No claimable token");

        uint256 fund = vested.sub(claimed);
        vests[beneficiary].claimedAmount = vested;
        _mint(beneficiary, fund);
        emit VestClaimed(beneficiary, fund);
    }

    function revokeVest(address beneficiary) external onlyCommunity {
        Vest storage vest = vests[beneficiary];
        require(vest.beneficiary == beneficiary, "ZONE: Invalid beneficiary");
        require(vest.revoked == false, "ZONE: Already revoked");

        uint256 fund = vest.amount.sub(vest.claimedAmount);
        if (0 < fund) {
            vest.claimedAmount = vest.amount;
            _mint(beneficiary, fund);
            emit VestClaimed(beneficiary, fund);
        }
        vest.revoked = true;
    }

    //
    // Unlock token
    //
    function getUnlockableAmount(address account) public view returns (uint256) {
        LockedToken[] memory lockedTokensRef = _lockedTokens[account];
        uint256 length = lockedTokensRef.length;

        uint256 amount = 0;
        for (uint256 i = 0; i < length; i ++) {
            if (_isUnlockable(lockedTokensRef[i].lockType, lockedTokensRef[i].end) == true) {
                amount = amount.add(lockedTokensRef[i].amount);
            }
        }
        return amount;
    }

    function Unlock(address account) public returns (uint256) {
        LockedToken[] memory lockedTokensRef = _lockedTokens[account];
        uint256 length = lockedTokensRef.length;
        bool unlocked = false;

        for (uint256 i = 0; i < length; i ++) {
            if (_isUnlockable(lockedTokensRef[i].lockType, lockedTokensRef[i].end) == true) {
                _unlockToken(account, lockedTokensRef[i].id);
                unlocked = true;
            }
        }
        require(unlocked, "ZONE: No unlockable token.");
    }

    function _isUnlockable(uint8 lockType, uint256 end) internal view returns (bool) {
        if (end <= now) {
            return true;
        }
        if ((lockType == LOCK_TYPE_GENESIS) && _publicSaleFinished) {
            return true;
        }
        return false;
    }

    function revokeBlacklistLock(address account) external onlyCommunity {
        LockedToken[] memory lockedTokensRef = _lockedTokens[account];
        uint256 length = lockedTokensRef.length;

        for (uint256 i = 0; i < length; i ++) {
            if (lockedTokensRef[i].lockType == LOCK_TYPE_BLACKLIST) {
                _unlockToken(account, lockedTokensRef[i].id);
            }
        }
    }

    //
    // Quarterly vesting for ecosystem
    //
    function calculateEcosystemVested() public view returns (uint256 vestedAmount) {
        uint256 quartersCount = now.sub(launchTime).div(GLOBAL.SECONDS_IN_QUARTER);
        uint256 yearsCount = quartersCount.div(GLOBAL.QUARTERS_IN_YEAR);
        uint256 currentQurter = quartersCount.mod(GLOBAL.QUARTERS_IN_YEAR);
        uint256 yearSupply = _ecosystemSupply >> (yearsCount + 1);

        if (0 < yearsCount) {
            // _ecosystemSupply * (1 - 1 / (2*yearsCount))
            vestedAmount =  _ecosystemSupply.sub(_ecosystemSupply.div(2).div(yearsCount));
        } else {
            vestedAmount = 0;
        }

        for (uint8 quarter = 0; quarter <= currentQurter; quarter ++) {
            uint256 vestedInQuarter = yearSupply.mul(quarterlyRate[quarter]).div(quarterlyRateDenominator);
            vestedAmount = vestedAmount.add(vestedInQuarter);
        }
        return vestedAmount;
    }

    function claimEcosystemVest() external {
        uint256 vested = calculateEcosystemVested();
        require (claimedEcosystemVest < vested, "ZONE: No claimable token for the ecosystem.");

        uint256 fund = vested.sub(claimedEcosystemVest);
        claimedEcosystemVest = vested;
        _mint(vault, fund);
        emit EcosystemVestClaimed(vault, fund);
    }

    function revokeEcosystemVest() external onlyCommunity {
        require (claimedEcosystemVest < _ecosystemSupply, "ZONE: All tokens already have been claimed for the ecosystem.");

        uint256 fund = _ecosystemSupply.sub(claimedEcosystemVest);
        claimedEcosystemVest = _ecosystemSupply;
        _mint(vault, fund);
        emit EcosystemVestClaimed(vault, fund);
    }

    //
    // Genesis and Public sale
    //
    function isGenesisSaleFinished() external view returns (bool) {
        if (_genesisSaleFinished == true || genesisSaleEndTime <= now) {
            return true;
        }
        return false;
    }

    function isPublicSaleFinished() external view returns (bool) {
        return _publicSaleFinished;
    }

    // Crowds Sale contains both the Genesis sale and the Public sale
    function isCrowdsaleFinished() external view returns (bool) {
        if (_publicSaleFinished) return true;
        if (genesisSaleEndTime <= now) return false;
        if (_genesisSaleFinished) return true;
        return false;
    }

    function rate() public view returns (uint256) {
        return (now < genesisSaleEndTime) ? _genesisRate : _publicRate;
    }

    function getGenesisSaleRate() external view returns(uint256) {
        return _genesisRate;
    }

    function setGenesisSaleRate(uint256 newRate) external onlyOwner {
        require(0 < newRate, "ZONE: The rate can't be 0.");
        _genesisRate = newRate;
        emit GenesisSaleRateChanged(_genesisRate);
    }

    function getPublicSaleRate() external view returns(uint256) {
        return _publicRate;
    }

    function setPublicSaleRate(uint256 newRate) public onlyOwner {
        require(0 < newRate, "ZONE: The rate can't be 0.");
        _publicRate = newRate;
        emit PublicSaleRateChanged(_publicRate);
    }

    function getPublicSaleEthCapacity() external view returns(uint256) {
        return _publicEthCapacity;
    }

    function setPublicSaleEthCapacity(uint256 newEthCapacity) public onlyOwner {
        require(publicSaleBoughtEth < newEthCapacity, "ZONE: The capacity must be greater than the already bought amount in the public sale.");

        _publicRate = _publicSupply.sub(publicSaleSoldToken).div(newEthCapacity.sub(publicSaleBoughtEth));
        _publicEthCapacity = newEthCapacity;
        emit PublicSaleEthCapacityChanged(_publicRate, _publicEthCapacity);
    }

    function finishCrowdsale() external onlyOwner  {
        _finishGenesisSale();
       if (genesisSaleEndTime <= now) {
           _finishPublicSale();
       }
    }
    
    function _finishGenesisSale() private {
        if (_genesisSaleFinished) return;
        _genesisSaleFinished = true;

        uint256 leftOver = _genesisSupply.sub(genesisSaleSoldToken);
        if (leftOver > 0) {
            _mint(owner(), leftOver);
        }
        emit GenesisSaleFinished(genesisSaleBoughtEth, genesisSaleSoldToken);
    }

    function _finishPublicSale() private {
        if (_publicSaleFinished) return;
        _publicSaleFinished = true;

        uint256 leftOver = _publicSupply.sub(publicSaleSoldToken);
        if (leftOver > 0) {
            _mint(owner(), leftOver);
        }
        emit PublicSaleFinished(publicSaleBoughtEth, publicSaleSoldToken);
    }

    function _sellOnGenesisSale(address payable buyer, uint256 ethAmount) private {
        uint256 capacity = _genesisEthCapacity.sub(genesisSaleBoughtEth);
        uint256 _ethAmount = (ethAmount < capacity) ? ethAmount : capacity;
        uint256 refund = ethAmount - _ethAmount;
        require(0 < _ethAmount, "ZONE: The amount can't be 0.");

        uint256 amount = _ethAmount.mul(_genesisRate);
        uint256 genesisBonus = amount.div(10);   // when buying during Genesis sale, 10% bonus
        uint256 purchaseBonus = 0;

        if (_ethAmount >= 10e18) {
            // when buying for over 10eth, 10% bonus
            purchaseBonus = amount.div(10);
        }

        // total token amount
        amount = amount.add(genesisBonus).add(purchaseBonus);

        genesisSaleBoughtEth = genesisSaleBoughtEth.add(_ethAmount);
        genesisSaleSoldToken = genesisSaleSoldToken.add(amount);
        require(genesisSaleSoldToken <= _genesisSupply, "ZONE: Genesis supply is insufficient.");

        // mint token amount and bonuses to buyer
        _mintLockedToken(buyer, amount, LOCK_TYPE_GENESIS, genesisSaleUnlockTime);

        address payable ownerAddress = address(uint160(owner()));
        ownerAddress.transfer(_ethAmount);
        emit SoldOnGenesisSale(buyer, _ethAmount, amount);

        if (0 < refund) {
            buyer.transfer(refund);
        }
        if (_genesisEthCapacity <= genesisSaleBoughtEth) {
            _finishGenesisSale();
        }
    }

    function _sellOnPublicSale(address payable buyer, uint256 ethAmount) private {
        uint256 capacity = _publicEthCapacity.sub(publicSaleBoughtEth);
        uint256 _ethAmount = (ethAmount < capacity) ? ethAmount : capacity;
        uint256 refund = ethAmount - _ethAmount;
        require(0 < _ethAmount, "ZONE: The amount can't be 0.");

        uint256 amount = _ethAmount.mul(_publicRate);

        publicSaleBoughtEth = publicSaleBoughtEth.add(_ethAmount);
        publicSaleSoldToken = publicSaleSoldToken.add(amount);
        require(publicSaleSoldToken <= _publicSupply, "ZONE: Public supply is insufficient.");

        // mint token amount to buyer
        _mint(buyer, amount);

        address payable ownerAddress = address(uint160(owner()));
        ownerAddress.transfer(_ethAmount);
        emit SoldOnPublicSale(buyer, _ethAmount, amount);

        if (0 < refund) {
            buyer.transfer(refund);
        }
        if (_publicEthCapacity <= publicSaleBoughtEth) {
            _finishPublicSale();
        }
    }

    // low level token purchase function
    function purchase() external payable onlyEndUser {
        address payable buyer = _msgSender();
        require(buyer != address(0));
        require(msg.value >= 1e16, "ZONE: The purchase minimum amount is 0.01 ETH");

        if (now < genesisSaleEndTime) {
            require(_genesisSaleFinished == false, "ZONE: Genesis sale already finished");
            _sellOnGenesisSale(buyer, msg.value);
        } else {
            _finishGenesisSale();

            require(_publicSaleFinished == false, "ZONE: Public sale already finished");
            _sellOnPublicSale(buyer, msg.value);
        }
    }

    receive() external payable {
        require(false, "ZONE: Use the purchase function to buy the ZONE token.");
    }
}

File 2 of 5 : SafeMath.sol
// 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 3 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "@openzeppelin/contracts/utils/Context.sol";
/**
 * @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;
    address private _pendingOwner;


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

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

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

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

    /**
     * @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");
        _pendingOwner = newOwner;
    }

    function acceptOwnership() external {
        require(msg.sender == _pendingOwner, "acceptOwnership: Call must come from pendingOwner.");
        emit OwnershipTransferred(_owner, _pendingOwner);
        _owner = _pendingOwner;
    }
}

File 4 of 5 : Global.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
pragma experimental ABIEncoderV2;

library GLOBAL {
    uint256 constant SECONDS_IN_YEAR = 365 * 24 * 3600; // 365 days * 24 hours * 60 minutes * 60 seconds
    uint256 constant SECONDS_IN_QUARTER = SECONDS_IN_YEAR / 4;
    uint256 constant SECONDS_IN_MONTH = 30 * 24 * 3600; // 30 days * 24 hours * 60 minutes * 60 seconds

    uint8 constant QUARTERS_IN_YEAR = 4;
}

File 5 of 5 : Context.sol
// 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;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"address","name":"advisors_","type":"address"},{"internalType":"address","name":"treasury_","type":"address"}],"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":"amount","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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EcosystemVestClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"boughtEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"soldToken","type":"uint256"}],"name":"GenesisSaleFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"GenesisSaleRateChanged","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":false,"internalType":"uint256","name":"newRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEthCapacity","type":"uint256"}],"name":"PublicSaleEthCapacityChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"boughtEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"soldToken","type":"uint256"}],"name":"PublicSaleFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"PublicSaleRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"SoldOnGenesisSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"SoldOnPublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"lockType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"TokenLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"lockType","type":"uint8"}],"name":"TokenUnlocked","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cliff","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestClaimed","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":"account","type":"address"}],"name":"Unlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":"rawAmount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"calculateEcosystemVested","outputs":[{"internalType":"uint256","name":"vestedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"calculateVestClaim","outputs":[{"internalType":"uint256","name":"vestedAmount","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":"claimEcosystemVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"claimVestedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimedEcosystemVest","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":"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":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finishCrowdsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisSaleBoughtEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisSaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisSaleSoldToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisSaleUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGenesisSaleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLockedTokens","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"lockType","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"internalType":"struct CompBase.LockedToken[]","name":"","type":"tuple[]"}],"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":[],"name":"getPublicSaleEthCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSaleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUnlockableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCrowdsaleFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGenesisSaleFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleBoughtEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleSoldToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeBlacklistLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeEcosystemVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"revokeVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setGenesisSaleRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governorTimelock_","type":"address"}],"name":"setGovernorTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newEthCapacity","type":"uint256"}],"name":"setPublicSaleEthCapacity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setPublicSaleRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vests","outputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"bool","name":"revoked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"voteBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

610100604052686c6b935b8bbd400000600255600060038190556004819055600b819055600f8190556010819055601181905560128190556013805461ffff191690556016553480156200005257600080fd5b506040516200575938038062005759833981016040819052620000759162000c1e565b600080546001600160a01b0319166001600160a01b038616908117825560405186928392917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050826001600160a01b0316846001600160a01b03161415620000ff5760405162461bcd60e51b8152600401620000f69062000ea0565b60405180910390fd5b426080908152604080519182018152610c6e8252610a7460208301526108ca9082015261076460608201526200013a90601590600462000ac0565b50606083901b6001600160601b03191660a05262000196600c6200018268056bc75e2d63100000816a0250ec4ddca432f6000000600a62000253602090811b6200256617901c565b6200029c60201b620025a01790919060201c565b600d55600254620001bf906958f03ee118a13e800000906200029c602090811b620025a017901c565b600e55426276a700810160c052629e3400810160e052620001f590859060006303c267006a02c781f708c509f4000000620002d2565b62000213824260006301e1338069cf85e80d39783c800000620002d2565b62000233816a0302cccb9ed575730000006001426301e133800162000443565b62000249836958f03ee118a13e800000620005e7565b5050505062000f48565b600082620002645750600062000296565b828202828482816200027257fe5b0414620002935760405162461bcd60e51b8152600401620000f69062000de7565b90505b92915050565b6000808211620002c05760405162461bcd60e51b8152600401620000f69062000d79565b818381620002ca57fe5b049392505050565b6001600160a01b038516620002fb5760405162461bcd60e51b8152600401620000f69062000e5f565b818311156200031e5760405162461bcd60e51b8152600401620000f69062000e28565b6200032862000b70565b6040518060e00160405280876001600160a01b03168152602001868152602001620003628688620006e260201b620025d21790919060201c565b8152602080820186905260408083018690526000606080850182905260809485018290526001600160a01b038c81168084526014865292849020875181546001600160a01b0319169216919091178155938601516001850155858301516002850155850151600384015592840151600483015560a0840151600583015560c08401516006909201805460ff19169215159290921790915551919250907fe248a39650014b0e23685178b095d4aee81e861e4cf38d6acc166d7c05616027906200043390889088908890889062000f14565b60405180910390a2505050505050565b6001600160a01b0384166200046c5760405162461bcd60e51b8152600401620000f69062000cd4565b6200047a600085856200070a565b6200049683600454620006e260201b620025d21790919060201c565b600455620004a362000bb8565b506040805160a081018252600b80546001808201909255825260ff85811660208085019182528486018981524260608701908152608087018981526001600160a01b038d166000818152600a86528a81208054808b0182559082529581208a516005909702019586559551978501805460ff1916989097169790971790955590516002830155516003820155915160049092019190915592519192909160008051602062005705833981519152906200055e90889062000efd565b60405180910390a360ff831660011462000599576001600160a01b03808616600090815260076020526040812054620005999216866200076e565b846001600160a01b03167f9298b2b497f03d8c40a216bc1e5142747187dd4687de91e09d789982f96d0f5a858585604051620005d89392919062000f2f565b60405180910390a25050505050565b6001600160a01b038216620006105760405162461bcd60e51b8152600401620000f69062000cd4565b6200061e600083836200070a565b6200063a81600354620006e260201b620025d21790919060201c565b6003556001600160a01b0382166000908152600660209081526040909120546200066f918390620025d2620006e2821b17901c565b6001600160a01b0383166000818152600660205260408082209390935591519091906000805160206200570583398151915290620006af90859062000efd565b60405180910390a36001600160a01b03808316600090815260076020526040812054620006de9216836200076e565b5050565b600082820183811015620002935760405162461bcd60e51b8152600401620000f69062000d0b565b6001600160a01b03831662000769576a17293b0a9e69fd9c000000620007488262000734620008df565b620006e260201b620025d21790919060201c565b1115620007695760405162461bcd60e51b8152600401620000f69062000db0565b505050565b816001600160a01b0316836001600160a01b031614158015620007915750600081115b1562000769576001600160a01b0383161562000839576001600160a01b03831660009081526009602052604081205463ffffffff169081620007d557600062000807565b6001600160a01b038516600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b905060006200082584836200090460201b620025f71790919060201c565b905062000835868484846200092f565b5050505b6001600160a01b0382161562000769576001600160a01b03821660009081526009602052604081205463ffffffff16908162000877576000620008a9565b6001600160a01b038416600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b90506000620008c78483620006e260201b620025d21790919060201c565b9050620008d7858484846200092f565b505050505050565b6000620008ff600454600354620006e260201b620025d21790919060201c565b905090565b600082821115620009295760405162461bcd60e51b8152600401620000f69062000d42565b50900390565b60006200095643604051806060016040528060348152602001620057256034913962000a8d565b905060008463ffffffff16118015620009a057506001600160a01b038516600090815260086020908152604080832063ffffffff6000198901811685529252909120548282169116145b15620009df576001600160a01b038516600090815260086020908152604080832063ffffffff6000198901168452909152902060010182905562000a50565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600884528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260099092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051620005d892919062000f06565b600081640100000000841062000ab85760405162461bcd60e51b8152600401620000f6919062000c7e565b509192915050565b82805482825590600052602060002090600f0160109004810192821562000b5e5791602002820160005b8382111562000b2c57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000aea565b801562000b5c5782816101000a81549061ffff021916905560020160208160010104928301926001030262000b2c565b505b5062000b6c92915062000bea565b5090565b6040518060e0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6040518060a0016040528060008152602001600060ff1681526020016000815260200160008152602001600081525090565b5b8082111562000b6c57805461ffff1916815560010162000beb565b80516001600160a01b03811681146200029657600080fd5b6000806000806080858703121562000c34578384fd5b62000c40868662000c06565b935062000c51866020870162000c06565b925062000c62866040870162000c06565b915062000c73866060870162000c06565b905092959194509250565b6000602080835283518082850152825b8181101562000cac5785810183015185820160400152820162000c8e565b8181111562000cbe5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601e908201527f5a4f4e453a206d696e7420746f20746865207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526014908201527f4361707065643a20636170206578636565646564000000000000000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f5a4f4e453a3a4164645665737420636c696666203e206475726174696f6e0000604082015260600190565b60208082526021908201527f5a4f4e453a3a4164645665737420496e76616c69642062656e656669636961726040820152607960f81b606082015260800190565b60208082526035908201527f5a4f4e453a20596f7520737065636966696564206f776e65722061646472657360408201527f7320617320616e207661756c7420616464726573730000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b92835260ff919091166020830152604082015260600190565b60805160a05160601c60c05160e05161474d62000fb860003980610fc05280612e5a525080610e8e52806111775280611a575280611cee5280611dae5280611e2752508061178452806117ab5280612168528061218f52806125445250806115d65280611b82525061474d6000f3fe6080604052600436106103b15760003560e01c8063782d6fe1116101e7578063b4b5ea571161010d578063dd62ed3e116100a0578063f1127ed81161006f578063f1127ed814610a41578063f2fde38b14610a6f578063f45f8b9914610a8f578063fbfa77cf14610aaf576103d9565b8063dd62ed3e146109d7578063e30c3978146109f7578063e680be4d14610a0c578063e7a324dc14610a2c576103d9565b8063c3cda520116100dc578063c3cda5201461096d578063c514621c1461098d578063d7d79931146109a2578063db75e17c146109b7576103d9565b8063b4b5ea5714610903578063b5267cb014610923578063b80cdcf614610938578063bffeac211461094d576103d9565b80638c0491ca1161018557806394fc8f0a1161015457806394fc8f0a146108a457806395d89b41146108b9578063a9059cbb146108ce578063aa56c8e7146108ee576103d9565b80638c0491ca1461083a5780638cfd91a61461085a5780638da5cb5b1461086f578063929ec53714610884576103d9565b806379cc6790116101c157806379cc6790146107c55780637e0e71ac146107e55780637ecebe00146107fa57806384ab8bb81461081a576103d9565b8063782d6fe11461077b578063790ca4131461079b57806379ba5097146107b0576103d9565b806337e1a88e116102d757806364edfbf01161026a57806370a082311161023957806370a082311461071c578063712df89f1461073c578063715018a61461075157806377ee5cfe14610766576103d9565b806364edfbf01461069a5780636b2d95d4146106a25780636fcfff45146106cf5780636fd0d888146106fc576103d9565b8063587cde1e116102a6578063587cde1e146105fa5780635c19a95c146106275780635c712bc01461064757806364d2f4c71461067a576103d9565b806337e1a88e1461059b578063408a2592146105b057806342966c68146105c557806351b2ea1f146105e5576103d9565b806318160ddd1161034f5780632c4e722e1161031e5780632c4e722e14610521578063313ce56714610536578063355274ea14610558578063365ad85f1461056d576103d9565b806318160ddd146104b757806320606b70146104cc57806323b872dd146104e1578063259da3d614610501576103d9565b806306fdde031161038b57806306fdde0314610433578063095ea7b31461045557806309f9b481146104825780630be7748514610497576103d9565b806301179422146103de5780630452a74914610409578063067f45b91461041e576103d9565b366103d95760405162461bcd60e51b81526004016103ce90613fa6565b60405180910390fd5b005b600080fd5b3480156103ea57600080fd5b506103f3610ac4565b60405161040091906139e7565b60405180910390f35b34801561041557600080fd5b506103f3610aca565b34801561042a57600080fd5b506103f3610ad1565b34801561043f57600080fd5b50610448610ad7565b6040516104009190613a56565b34801561046157600080fd5b50610475610470366004613804565b610afe565b60405161040091906139dc565b34801561048e57600080fd5b506103f3610b1c565b3480156104a357600080fd5b506103f36104b2366004613775565b610b22565b3480156104c357600080fd5b506103f3610c65565b3480156104d857600080fd5b506103f3610c83565b3480156104ed57600080fd5b506104756104fc3660046137c4565b610ca7565b34801561050d57600080fd5b506103d761051c366004613775565b610d73565b34801561052d57600080fd5b506103f3610e8a565b34801561054257600080fd5b5061054b610ec2565b6040516104009190614672565b34801561056457600080fd5b506103f3610ec7565b34801561057957600080fd5b5061058d610588366004613775565b610ed6565b604051610400929190614613565b3480156105a757600080fd5b506103f3610fbe565b3480156105bc57600080fd5b506103f3610fe2565b3480156105d157600080fd5b506103d76105e03660046138cc565b610fe8565b3480156105f157600080fd5b506103f3610ffc565b34801561060657600080fd5b5061061a610615366004613775565b611002565b604051610400919061391a565b34801561063357600080fd5b506103d7610642366004613775565b61101d565b34801561065357600080fd5b50610667610662366004613775565b611027565b604051610400979695949392919061392e565b34801561068657600080fd5b506103d76106953660046138cc565b611071565b6103d7611110565b3480156106ae57600080fd5b506106c26106bd366004613775565b611209565b604051610400919061396b565b3480156106db57600080fd5b506106ef6106ea366004613775565b6112aa565b604051610400919061464b565b34801561070857600080fd5b506103d7610717366004613775565b6112c2565b34801561072857600080fd5b506103f3610737366004613775565b611323565b34801561074857600080fd5b506103f3611356565b34801561075d57600080fd5b506103d761135c565b34801561077257600080fd5b506103f36113e5565b34801561078757600080fd5b506103f3610796366004613804565b6113eb565b3480156107a757600080fd5b506103f36115d4565b3480156107bc57600080fd5b506103d76115f8565b3480156107d157600080fd5b506103d76107e0366004613804565b611683565b3480156107f157600080fd5b506103d76116fc565b34801561080657600080fd5b506103f3610815366004613775565b61180d565b34801561082657600080fd5b506103f3610835366004613775565b61181f565b34801561084657600080fd5b506103d7610855366004613775565b611939565b34801561086657600080fd5b506103f3611a55565b34801561087b57600080fd5b5061061a611a79565b34801561089057600080fd5b506103f361089f366004613775565b611a88565b3480156108b057600080fd5b506103f3611b72565b3480156108c557600080fd5b50610448611c8a565b3480156108da57600080fd5b506104756108e9366004613804565b611cc3565b3480156108fa57600080fd5b50610475611cd0565b34801561090f57600080fd5b506103f361091e366004613775565b611d33565b34801561092f57600080fd5b50610475611d97565b34801561094457600080fd5b506103d7611ddd565b34801561095957600080fd5b506103d7610968366004613775565b611e55565b34801561097957600080fd5b506103d761098836600461382e565b611f01565b34801561099957600080fd5b5061047561210a565b3480156109ae57600080fd5b506103d7612118565b3480156109c357600080fd5b506103d76109d23660046138cc565b6121f2565b3480156109e357600080fd5b506103f36109f2366004613790565b6122bc565b348015610a0357600080fd5b5061061a6122e7565b348015610a1857600080fd5b506103f3610a27366004613775565b6122f6565b348015610a3857600080fd5b506103f36123d6565b348015610a4d57600080fd5b50610a61610a5c36600461388d565b6123fa565b60405161040092919061465c565b348015610a7b57600080fd5b506103d7610a8a366004613775565b612427565b348015610a9b57600080fd5b506103d7610aaa3660046138cc565b6124ae565b348015610abb57600080fd5b5061061a612542565b60165481565b600e545b90565b60125481565b6040518060400160405280600b81526020016a477269645a6f6e652e696f60a81b81525081565b6000610b12610b0b61261f565b8484612623565b5060015b92915050565b60105481565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b82821015610bb75760008481526020908190206040805160a081018252600586029092018054835260018082015460ff1684860152600282015492840192909252600381015460608401526004015460808301529083529092019101610b56565b5050505090506000815190506000805b82811015610c3f57610c07848281518110610bde57fe5b602002602001015160200151858381518110610bf657fe5b6020026020010151608001516126d7565b151560011415610c3757610c3286858381518110610c2157fe5b602002602001015160000151612716565b600191505b600101610bc7565b5080610c5d5760405162461bcd60e51b81526004016103ce906142bd565b505050919050565b6000610c7e6004546003546125d290919063ffffffff16565b905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6001600160a01b038316600081815260056020908152604080832033808552925282205491929091908214801590610ce157506000198114155b15610d5c576000610cf282866125f7565b6001600160a01b03808916600081815260056020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d529085906139e7565b60405180910390a3505b610d678686866129a0565b50600195945050505050565b6017546001600160a01b03163314610d9d5760405162461bcd60e51b81526004016103ce90613aa9565b6001600160a01b038082166000818152601460205260409020805490921614610dd85760405162461bcd60e51b81526004016103ce90613d56565b600681015460ff1615610dfd5760405162461bcd60e51b81526004016103ce906140ce565b6000610e1a826005015483600401546125f790919063ffffffff16565b90508015610e785760048201546005830155610e368382612ada565b826001600160a01b03167f3552bfeaaadccee76f56971ef880969c9fe7ec6af186859930f738924cc0ede982604051610e6f91906139e7565b60405180910390a25b50600601805460ff1916600117905550565b60007f00000000000000000000000000000000000000000000000000000000000000004210610ebb57600e54610c7e565b50600d5490565b601281565b6a17293b0a9e69fd9c00000090565b6001600160a01b03808216600081815260146020526040812080549193849391921614610f0a576000809250925050610fb9565b8060020154421015610f255760050154600092509050610fb9565b600681015460ff16151560011415610f4557600501549150819050610fb9565b42610f61826003015483600101546125d290919063ffffffff16565b11610f7a57806004015481600501549250925050610fb9565b610fad8160030154610fa7610f9c8460010154426125f790919063ffffffff16565b600485015490612566565b906125a0565b60059091015490925090505b915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d5490565b610ff9610ff361261f565b82612bbf565b50565b60025490565b6007602052600090815260409020546001600160a01b031681565b610ff93382612cc3565b60146020526000908152604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b039095169593949293919290919060ff1687565b61107961261f565b6001600160a01b031661108a611a79565b6001600160a01b0316146110b05760405162461bcd60e51b81526004016103ce906141f6565b806000106110d05760405162461bcd60e51b81526004016103ce90613e47565b600d8190556040517f75990a60d01435e02fb3cf68b03da25cad152b95f63f3fab6fde582b9d110487906111059083906139e7565b60405180910390a150565b33321461112f5760405162461bcd60e51b81526004016103ce90614522565b600061113961261f565b90506001600160a01b03811661114e57600080fd5b662386f26fc100003410156111755760405162461bcd60e51b81526004016103ce906145b6565b7f00000000000000000000000000000000000000000000000000000000000000004210156111cf5760135460ff16156111c05760405162461bcd60e51b81526004016103ce90613cf9565b6111ca8134612d52565b610ff9565b6111d7612f68565b601354610100900460ff16156111ff5760405162461bcd60e51b81526004016103ce90613b63565b610ff98134612fef565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606094859484015b8282101561129e5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161123d565b50929695505050505050565b60096020526000908152604090205463ffffffff1681565b6112ca61261f565b6001600160a01b03166112db611a79565b6001600160a01b0316146113015760405162461bcd60e51b81526004016103ce906141f6565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526006602052604081205461134f61134884611a88565b82906125d2565b9392505050565b600f5481565b61136461261f565b6001600160a01b0316611375611a79565b6001600160a01b03161461139b5760405162461bcd60e51b81526004016103ce906141f6565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60115481565b600043821061140c5760405162461bcd60e51b81526004016103ce906144c5565b6001600160a01b03831660009081526009602052604090205463ffffffff168061143a576000915050610b16565b6001600160a01b038416600090815260086020908152604080832063ffffffff6000198601811685529252909120541683106114a9576001600160a01b03841660009081526008602090815260408083206000199490940163ffffffff16835292905220600101549050610b16565b6001600160a01b038416600090815260086020908152604080832083805290915290205463ffffffff168310156114e4576000915050610b16565b600060001982015b8163ffffffff168163ffffffff16111561159d57600282820363ffffffff16048103611516613715565b506001600160a01b038716600090815260086020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529087141561157857602001519450610b169350505050565b805163ffffffff1687111561158f57819350611596565b6001820392505b50506114ec565b506001600160a01b038516600090815260086020908152604080832063ffffffff9094168352929052206001015491505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b031633146116225760405162461bcd60e51b81526004016103ce90613f49565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600061168d61261f565b6001600160a01b038085166000908152600560209081526040808320938516835292815282822054835160608101909452602d8085529495509391926116de9287926146b79083013984919061318d565b90506116eb858483612623565b6116f58585612bbf565b5050505050565b6017546001600160a01b031633146117265760405162461bcd60e51b81526004016103ce90613aa9565b6016546a0d8c99944ac09085800000116117525760405162461bcd60e51b81526004016103ce906143ae565b60165460009061176e906a0d8c99944ac09085800000906125f7565b6a0d8c99944ac0908580000060165590506117a97f000000000000000000000000000000000000000000000000000000000000000082612ada565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f5dfcd58f0dcb57f470a1160f7e369fafa49ce56fc620b91fc1c80199706745498260405161180291906139e7565b60405180910390a250565b600c6020526000908152604090205481565b6001600160a01b038116600090815260066020908152604080832054600a8352818420805483518186028101860190945280845291936060939290869084015b828210156118c05760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161185f565b5050825192935060009150505b8181101561192f57600160ff168382815181106118e657fe5b60200260200101516020015160ff16146119275761192483828151811061190957fe5b602002602001015160400151856125d290919063ffffffff16565b93505b6001016118cd565b5091949350505050565b6017546001600160a01b031633146119635760405162461bcd60e51b81526004016103ce90613aa9565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156119fc5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161199b565b5050825192935060009150505b81811015611a4f57600160ff16838281518110611a2257fe5b60200260200101516020015160ff161415611a4757611a4784848381518110610c2157fe5b600101611a09565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031690565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b82821015611b1d5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff1684860152600282015492840192909252600381015460608401526004015460808301529083529092019101611abc565b5050505090506000815190506000805b82811015611b6957611b5f848281518110611b4457fe5b602002602001015160400151836125d290919063ffffffff16565b9150600101611b2d565b50949350505050565b600080611ba662784ce0610fa7427f00000000000000000000000000000000000000000000000000000000000000006125f7565b90506000611bb58260046125a0565b90506000611bc48360046131b9565b90506a0d8c99944ac09085800000600183011c8215611c1357611c0c611bfa84610fa76a0d8c99944ac0908580000060026125a0565b6a0d8c99944ac09085800000906125f7565b9450611c18565b600094505b60005b828160ff1611611c82576000611c6b61271061ffff16610fa760158560ff1681548110611c4457fe5b600091825260209091206010820401548791600f166002026101000a900461ffff16612566565b9050611c7787826125d2565b965050600101611c1b565b505050505090565b6040518060400160405280600481526020017f5a4f4e450000000000000000000000000000000000000000000000000000000081525081565b6000610b123384846129a0565b601354600090610100900460ff1615611ceb57506001610ace565b427f000000000000000000000000000000000000000000000000000000000000000011611d1a57506000610ace565b60135460ff1615611d2d57506001610ace565b50600090565b6001600160a01b03811660009081526009602052604081205463ffffffff1680611d5e57600061134f565b6001600160a01b038316600090815260086020908152604080832063ffffffff6000198601168452909152902060010154915050919050565b60135460009060ff16151560011480611dd05750427f000000000000000000000000000000000000000000000000000000000000000011155b15611d2d57506001610ace565b611de561261f565b6001600160a01b0316611df6611a79565b6001600160a01b031614611e1c5760405162461bcd60e51b81526004016103ce906141f6565b611e24612f68565b427f000000000000000000000000000000000000000000000000000000000000000011611e5357611e536131eb565b565b600080611e6183610ed6565b91509150818110611e845760405162461bcd60e51b81526004016103ce90613c2e565b6000611e9083836125f7565b6001600160a01b03851660009081526014602052604090206005018490559050611eba8482612ada565b836001600160a01b03167f3552bfeaaadccee76f56971ef880969c9fe7ec6af186859930f738924cc0ede982604051611ef391906139e7565b60405180910390a250505050565b60408051808201909152600b81526a477269645a6f6e652e696f60a81b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f401f2289580892741b17d81b8e6fd14c6c8b0684a13495ce86820224e1e558ae611f70613272565b30604051602001611f849493929190613a14565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001611fd594939291906139f0565b604051602081830303815290604052805190602001209050600082826040516020016120029291906138e4565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161203f9493929190613a38565b6020604051602081039080840390855afa158015612061573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120945760405162461bcd60e51b81526004016103ce90614559565b6001600160a01b0381166000908152600c6020526040902080546001810190915589146120d35760405162461bcd60e51b81526004016103ce90614351565b874211156120f35760405162461bcd60e51b81526004016103ce9061413c565b6120fd818b612cc3565b505050505b505050505050565b601354610100900460ff1690565b6000612122611b72565b905080601654106121455760405162461bcd60e51b81526004016103ce90614260565b600061215c601654836125f790919063ffffffff16565b6016839055905061218d7f000000000000000000000000000000000000000000000000000000000000000082612ada565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f5dfcd58f0dcb57f470a1160f7e369fafa49ce56fc620b91fc1c8019970674549826040516121e691906139e7565b60405180910390a25050565b6121fa61261f565b6001600160a01b031661220b611a79565b6001600160a01b0316146122315760405162461bcd60e51b81526004016103ce906141f6565b80601054106122525760405162461bcd60e51b81526004016103ce90613dc4565b61228261226a601054836125f790919063ffffffff16565b601254610fa7906958f03ee118a13e800000906125f7565b600e81905560028290556040517fbd0d57d866d23c5e05fefb5a23f0f22a28efec80fa288d6ae00b47405d3ee8a891611105918490614613565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6001546001600160a01b031690565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b8282101561238b5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161232a565b5050505090506000815190506000805b82811015611b69576123b2848281518110610bde57fe5b1515600114156123ce576123cb848281518110611b4457fe5b91505b60010161239b565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60086020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b61242f61261f565b6001600160a01b0316612440611a79565b6001600160a01b0316146124665760405162461bcd60e51b81526004016103ce906141f6565b6001600160a01b03811661248c5760405162461bcd60e51b81526004016103ce90613b06565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6124b661261f565b6001600160a01b03166124c7611a79565b6001600160a01b0316146124ed5760405162461bcd60e51b81526004016103ce906141f6565b8060001061250d5760405162461bcd60e51b81526004016103ce90613e47565b600e8190556040517f79e6b4d7a5586ff3d8254c33e90330f31d37922340f0d818b65f50c7291ba5b7906111059083906139e7565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008261257557506000610b16565b8282028284828161258257fe5b041461134f5760405162461bcd60e51b81526004016103ce90614199565b60008082116125c15760405162461bcd60e51b81526004016103ce90613e7e565b8183816125ca57fe5b049392505050565b60008282018381101561134f5760405162461bcd60e51b81526004016103ce90613bf7565b6000828211156126195760405162461bcd60e51b81526004016103ce90613d8d565b50900390565b3390565b6001600160a01b0383166126495760405162461bcd60e51b81526004016103ce90613eec565b6001600160a01b03821661266f5760405162461bcd60e51b81526004016103ce9061403a565b6001600160a01b0380841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906126ca9085906139e7565b60405180910390a3505050565b60004282116126e857506001610b16565b60ff83161580156127005750601354610100900460ff165b1561270d57506001610b16565b50600092915050565b6001600160a01b0382166000908152600a6020526040902080548061274d5760405162461bcd60e51b81526004016103ce90614003565b60008060005b83811015612794578585828154811061276857fe5b906000526020600020906005020160000154141561278c5780915060019250612794565b600101612753565b506001821515146127b75760405162461bcd60e51b81526004016103ce90613c65565b60008482815481106127c557fe5b906000526020600020906005020160020154905060008583815481106127e757fe5b600091825260209091206001600590920201015460045460ff909116915061280f90836125f7565b60045560035461281f90836125d2565b6003556000198501808410156128a25786818154811061283b57fe5b906000526020600020906005020187858154811061285557fe5b600091825260209091208254600590920201908155600180830154908201805460ff191660ff90921691909117905560028083015490820155600380830154908201556004918201549101555b868054806128ac57fe5b6000828152602080822060056000199094019384020182815560018101805460ff191690556002810183905560038101839055600401829055919092556001600160a01b038b16825260069052604090205461290890846125d2565b6001600160a01b038a1660009081526006602052604090205560ff821660011415612952576001600160a01b03808a16600090815260076020526040812054612952921685613276565b886001600160a01b03167f72713ae12cbff1018e930bf23f6ccdbce7fa0530b38938b35f5bb893bcfd4e66848460405161298d929190614621565b60405180910390a2505050505050505050565b6001600160a01b0383166129c65760405162461bcd60e51b81526004016103ce90613c9c565b6001600160a01b0382166129ec5760405162461bcd60e51b81526004016103ce906142f4565b6129f78383836133b3565b6001600160a01b038316600090815260066020526040902054612a1a90826125f7565b6001600160a01b038085166000908152600660205260408082209390935590841681522054612a4990826125d2565b6001600160a01b0380841660008181526006602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a9b9085906139e7565b60405180910390a36001600160a01b03808416600090815260076020526040808220548584168352912054612ad592918216911683613276565b505050565b6001600160a01b038216612b005760405162461bcd60e51b81526004016103ce90613bc0565b612b0c600083836133b3565b600354612b1990826125d2565b6003556001600160a01b038216600090815260066020526040902054612b3f90826125d2565b6001600160a01b0383166000818152600660205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b8e9085906139e7565b60405180910390a36001600160a01b03808316600090815260076020526040812054612bbb921683613276565b5050565b6001600160a01b038216612be55760405162461bcd60e51b81526004016103ce9061422b565b612bf1826000836133b3565b612c2e81604051806060016040528060218152602001614696602191396001600160a01b038516600090815260066020526040902054919061318d565b6001600160a01b038316600090815260066020526040902055600354612c5490826125f7565b6003556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c959085906139e7565b60405180910390a36001600160a01b03808316600090815260076020526040812054612bbb92169083613276565b6001600160a01b0380831660009081526007602052604081205490911690612cea8461181f565b6001600160a01b0385811660008181526007602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611a4f828483613276565b6000612d72600f5468056bc75e2d631000006125f790919063ffffffff16565b90506000818310612d835781612d85565b825b905080830381612da75760405162461bcd60e51b81526004016103ce90613eb5565b6000612dbe600d548461256690919063ffffffff16565b90506000612dcd82600a6125a0565b90506000678ac7230489e800008510612dee57612deb83600a6125a0565b90505b612e0281612dfc85856125d2565b906125d2565b600f54909350612e1290866125d2565b600f55601154612e2290846125d2565b60118190556a0250ec4ddca432f60000001015612e515760405162461bcd60e51b81526004016103ce9061440b565b612e7e888460007f00000000000000000000000000000000000000000000000000000000000000006133f7565b6000612e88611a79565b6040519091506001600160a01b0382169087156108fc029088906000818181858888f19350505050158015612ec1573d6000803e3d6000fd5b50886001600160a01b03167f579d39089a1b97845971a326ca93d594877a8103906d038b93fd99e8508f59978786604051612efd929190614613565b60405180910390a28415612f43576040516001600160a01b038a169086156108fc029087906000818181858888f19350505050158015612f41573d6000803e3d6000fd5b505b600f5468056bc75e2d6310000011612f5d57612f5d612f68565b505050505050505050565b60135460ff1615612f7857611e53565b6013805460ff19166001179055601154600090612fa1906a0250ec4ddca432f6000000906125f7565b90508015612fba57612fba612fb4611a79565b82612ada565b7f9a0fa7ccc193069a32705455c2e134739bca39d58931fe12363d3cebf47a92a4600f54601154604051611105929190614613565b60006130086010546002546125f790919063ffffffff16565b90506000818310613019578161301b565b825b90508083038161303d5760405162461bcd60e51b81526004016103ce90613eb5565b6000613054600e548461256690919063ffffffff16565b60105490915061306490846125d2565b60105560125461307490826125d2565b60128190556958f03ee118a13e80000010156130a25760405162461bcd60e51b81526004016103ce90614468565b6130ac8682612ada565b60006130b6611a79565b6040519091506001600160a01b0382169085156108fc029086906000818181858888f193505050501580156130ef573d6000803e3d6000fd5b50866001600160a01b03167f3c924c24e32dc6d93bf4dc79a699da648d296aefdadcbaea23037dae46257b4a858460405161312b929190614613565b60405180910390a28215613171576040516001600160a01b0388169084156108fc029085906000818181858888f1935050505015801561316f573d6000803e3d6000fd5b505b60105460025411613184576131846131eb565b50505050505050565b600081848411156131b15760405162461bcd60e51b81526004016103ce9190613a56565b505050900390565b60008082116131da5760405162461bcd60e51b81526004016103ce90614097565b8183816131e357fe5b069392505050565b601354610100900460ff161561320057611e53565b6013805461ff00191661010017905560125460009061322a906958f03ee118a13e800000906125f7565b9050801561323d5761323d612fb4611a79565b7fb8855a603ac7881ae8282e6a1b39c138c12e785d66f8582ddacc16f0277613dd601054601254604051611105929190614613565b4690565b816001600160a01b0316836001600160a01b0316141580156132985750600081115b15612ad5576001600160a01b0383161561332a576001600160a01b03831660009081526009602052604081205463ffffffff1690816132d857600061330a565b6001600160a01b038516600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b9050600061331882856125f7565b90506133268684848461358f565b5050505b6001600160a01b03821615612ad5576001600160a01b03821660009081526009602052604081205463ffffffff169081613365576000613397565b6001600160a01b038416600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b905060006133a582856125d2565b90506121028584848461358f565b6001600160a01b038316612ad5576a17293b0a9e69fd9c0000006133d982612dfc610c65565b1115612ad55760405162461bcd60e51b81526004016103ce90614105565b6001600160a01b03841661341d5760405162461bcd60e51b81526004016103ce90613bc0565b613429600085856133b3565b60045461343690846125d2565b60045561344161372c565b506040805160a081018252600b80546001808201909255825260ff85811660208085019182528486018981524260608701908152608087018981526001600160a01b038d166000818152600a86528a81208054808b0182559082529581208a516005909702019586559551978501805460ff191698909716979097179095559051600283015551600382015591516004909201919091559251919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061350b9088906139e7565b60405180910390a360ff8316600114613543576001600160a01b03808616600090815260076020526040812054613543921686613276565b846001600160a01b03167f9298b2b497f03d8c40a216bc1e5142747187dd4687de91e09d789982f96d0f5a85858560405161358093929190614632565b60405180910390a25050505050565b60006135b3436040518060600160405280603481526020016146e4603491396136e5565b905060008463ffffffff161180156135fc57506001600160a01b038516600090815260086020908152604080832063ffffffff6000198901811685529252909120548282169116145b15613639576001600160a01b038516600090815260086020908152604080832063ffffffff600019890116845290915290206001018290556136aa565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600884528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260099092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051613580929190614613565b600081640100000000841061370d5760405162461bcd60e51b81526004016103ce9190613a56565b509192915050565b604080518082019091526000808252602082015290565b6040518060a0016040528060008152602001600060ff1681526020016000815260200160008152602001600081525090565b80356001600160a01b0381168114610b1657600080fd5b600060208284031215613786578081fd5b61134f838361375e565b600080604083850312156137a2578081fd5b6137ac848461375e565b91506137bb846020850161375e565b90509250929050565b6000806000606084860312156137d8578081fd5b83356137e381614680565b925060208401356137f381614680565b929592945050506040919091013590565b60008060408385031215613816578182fd5b613820848461375e565b946020939093013593505050565b60008060008060008060c08789031215613846578182fd5b613850888861375e565b95506020870135945060408701359350606087013560ff81168114613873578283fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561389f578182fd5b6138a9848461375e565b9150602083013563ffffffff811681146138c1578182fd5b809150509250929050565b6000602082840312156138dd578081fd5b5035919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03979097168752602087019590955260408601939093526060850191909152608084015260a0830152151560c082015260e00190565b602080825282518282018190526000919060409081850190868401855b828110156139cf578151805185528681015160ff16878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101613988565b5091979650505050505050565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b81811015613a8257858101830151858201604001528201613a66565b81811115613a935783604083870101525b50601f01601f1916929092016040019392505050565b60208082526039908201527f5a4f4e453a205468652063616c6c6572206973206e6f742074686520676f766560408201527f726e616e63652074696d656c6f636b20636f6e74726163742e00000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5a4f4e453a205075626c69632073616c6520616c72656164792066696e69736860408201527f6564000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5a4f4e453a206d696e7420746f20746865207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f5a4f4e453a204e6f20636c61696d61626c6520746f6b656e0000000000000000604082015260600190565b60208082526014908201527f5a4f4e453a206c6f636b496420696e76616c6964000000000000000000000000604082015260600190565b6020808252603c908201527f5a4f4e453a3a5f7472616e73666572546f6b656e733a2063616e6e6f7420747260408201527f616e736665722066726f6d20746865207a65726f206164647265737300000000606082015260800190565b60208082526023908201527f5a4f4e453a2047656e657369732073616c6520616c72656164792066696e697360408201527f6865640000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f5a4f4e453a20496e76616c69642062656e656669636961727900000000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526055908201527f5a4f4e453a20546865206361706163697479206d75737420626520677265617460408201527f6572207468616e2074686520616c726561647920626f7567687420616d6f756e60608201527f7420696e20746865207075626c69632073616c652e0000000000000000000000608082015260a00190565b6020808252601a908201527f5a4f4e453a2054686520726174652063616e277420626520302e000000000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f5a4f4e453a2054686520616d6f756e742063616e277420626520302e00000000604082015260600190565b60208082526023908201527f5a4f4e453a20617070726f76652066726f6d20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f6163636570744f776e6572736869703a2043616c6c206d75737420636f6d652060408201527f66726f6d2070656e64696e674f776e65722e0000000000000000000000000000606082015260800190565b60208082526036908201527f5a4f4e453a20557365207468652070757263686173652066756e6374696f6e2060408201527f746f2062757920746865205a4f4e4520746f6b656e2e00000000000000000000606082015260800190565b60208082526015908201527f5a4f4e453a204e6f206c6f636b656420746f6b656e0000000000000000000000604082015260600190565b60208082526021908201527f5a4f4e453a20617070726f766520746f20746865207a65726f2061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604082015260600190565b60208082526015908201527f5a4f4e453a20416c7265616479207265766f6b65640000000000000000000000604082015260600190565b60208082526014908201527f4361707065643a20636170206578636565646564000000000000000000000000604082015260600190565b60208082526026908201527f5a4f4e453a3a64656c656761746542795369673a207369676e6174757265206560408201527f7870697265640000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f5a4f4e453a206275726e2066726f6d20746865207a65726f2061646472657373604082015260600190565b6020808252602b908201527f5a4f4e453a204e6f20636c61696d61626c6520746f6b656e20666f722074686560408201527f2065636f73797374656d2e000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f5a4f4e453a204e6f20756e6c6f636b61626c6520746f6b656e2e000000000000604082015260600190565b6020808252603a908201527f5a4f4e453a3a5f7472616e73666572546f6b656e733a2063616e6e6f7420747260408201527f616e7366657220746f20746865207a65726f2061646472657373000000000000606082015260800190565b60208082526022908201527f5a4f4e453a3a64656c656761746542795369673a20696e76616c6964206e6f6e60408201527f6365000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252603d908201527f5a4f4e453a20416c6c20746f6b656e7320616c7265616479206861766520626560408201527f656e20636c61696d656420666f72207468652065636f73797374656d2e000000606082015260800190565b60208082526025908201527f5a4f4e453a2047656e6573697320737570706c7920697320696e73756666696360408201527f69656e742e000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5a4f4e453a205075626c696320737570706c7920697320696e7375666669636960408201527f656e742e00000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f5a4f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460408201527f65726d696e656400000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f5a4f4e453a204f6e6c7920656e642d7573657200000000000000000000000000604082015260600190565b60208082526026908201527f5a4f4e453a3a64656c656761746542795369673a20696e76616c69642073696760408201527f6e61747572650000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f5a4f4e453a20546865207075726368617365206d696e696d756d20616d6f756e60408201527f7420697320302e30312045544800000000000000000000000000000000000000606082015260800190565b918252602082015260400190565b91825260ff16602082015260400190565b92835260ff919091166020830152604082015260600190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b6001600160a01b0381168114610ff957600080fdfe5a4f4e453a206275726e20616d6f756e7420657863656564732062616c616e63655a4f4e453a3a6275726e46726f6d3a206275726e20616d6f756e74206578636565647320616c6c6f77616e63655a4f4e453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a264697066735822122073ed80619577dbbd25c20305df3c0465e725ac72198be55907de5d72eb86338064736f6c634300060c0033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5a4f4e453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473000000000000000000000000ab0b18523e8fe8cbf947c55632e8ab5ce936ae8c0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f0000000000000000000000002e229b4172a7157ea0db8caa0ca580636a05dce30000000000000000000000000c1ac3ede7a6a22cf36457bd3759bcea44b0b643

Deployed Bytecode

0x6080604052600436106103b15760003560e01c8063782d6fe1116101e7578063b4b5ea571161010d578063dd62ed3e116100a0578063f1127ed81161006f578063f1127ed814610a41578063f2fde38b14610a6f578063f45f8b9914610a8f578063fbfa77cf14610aaf576103d9565b8063dd62ed3e146109d7578063e30c3978146109f7578063e680be4d14610a0c578063e7a324dc14610a2c576103d9565b8063c3cda520116100dc578063c3cda5201461096d578063c514621c1461098d578063d7d79931146109a2578063db75e17c146109b7576103d9565b8063b4b5ea5714610903578063b5267cb014610923578063b80cdcf614610938578063bffeac211461094d576103d9565b80638c0491ca1161018557806394fc8f0a1161015457806394fc8f0a146108a457806395d89b41146108b9578063a9059cbb146108ce578063aa56c8e7146108ee576103d9565b80638c0491ca1461083a5780638cfd91a61461085a5780638da5cb5b1461086f578063929ec53714610884576103d9565b806379cc6790116101c157806379cc6790146107c55780637e0e71ac146107e55780637ecebe00146107fa57806384ab8bb81461081a576103d9565b8063782d6fe11461077b578063790ca4131461079b57806379ba5097146107b0576103d9565b806337e1a88e116102d757806364edfbf01161026a57806370a082311161023957806370a082311461071c578063712df89f1461073c578063715018a61461075157806377ee5cfe14610766576103d9565b806364edfbf01461069a5780636b2d95d4146106a25780636fcfff45146106cf5780636fd0d888146106fc576103d9565b8063587cde1e116102a6578063587cde1e146105fa5780635c19a95c146106275780635c712bc01461064757806364d2f4c71461067a576103d9565b806337e1a88e1461059b578063408a2592146105b057806342966c68146105c557806351b2ea1f146105e5576103d9565b806318160ddd1161034f5780632c4e722e1161031e5780632c4e722e14610521578063313ce56714610536578063355274ea14610558578063365ad85f1461056d576103d9565b806318160ddd146104b757806320606b70146104cc57806323b872dd146104e1578063259da3d614610501576103d9565b806306fdde031161038b57806306fdde0314610433578063095ea7b31461045557806309f9b481146104825780630be7748514610497576103d9565b806301179422146103de5780630452a74914610409578063067f45b91461041e576103d9565b366103d95760405162461bcd60e51b81526004016103ce90613fa6565b60405180910390fd5b005b600080fd5b3480156103ea57600080fd5b506103f3610ac4565b60405161040091906139e7565b60405180910390f35b34801561041557600080fd5b506103f3610aca565b34801561042a57600080fd5b506103f3610ad1565b34801561043f57600080fd5b50610448610ad7565b6040516104009190613a56565b34801561046157600080fd5b50610475610470366004613804565b610afe565b60405161040091906139dc565b34801561048e57600080fd5b506103f3610b1c565b3480156104a357600080fd5b506103f36104b2366004613775565b610b22565b3480156104c357600080fd5b506103f3610c65565b3480156104d857600080fd5b506103f3610c83565b3480156104ed57600080fd5b506104756104fc3660046137c4565b610ca7565b34801561050d57600080fd5b506103d761051c366004613775565b610d73565b34801561052d57600080fd5b506103f3610e8a565b34801561054257600080fd5b5061054b610ec2565b6040516104009190614672565b34801561056457600080fd5b506103f3610ec7565b34801561057957600080fd5b5061058d610588366004613775565b610ed6565b604051610400929190614613565b3480156105a757600080fd5b506103f3610fbe565b3480156105bc57600080fd5b506103f3610fe2565b3480156105d157600080fd5b506103d76105e03660046138cc565b610fe8565b3480156105f157600080fd5b506103f3610ffc565b34801561060657600080fd5b5061061a610615366004613775565b611002565b604051610400919061391a565b34801561063357600080fd5b506103d7610642366004613775565b61101d565b34801561065357600080fd5b50610667610662366004613775565b611027565b604051610400979695949392919061392e565b34801561068657600080fd5b506103d76106953660046138cc565b611071565b6103d7611110565b3480156106ae57600080fd5b506106c26106bd366004613775565b611209565b604051610400919061396b565b3480156106db57600080fd5b506106ef6106ea366004613775565b6112aa565b604051610400919061464b565b34801561070857600080fd5b506103d7610717366004613775565b6112c2565b34801561072857600080fd5b506103f3610737366004613775565b611323565b34801561074857600080fd5b506103f3611356565b34801561075d57600080fd5b506103d761135c565b34801561077257600080fd5b506103f36113e5565b34801561078757600080fd5b506103f3610796366004613804565b6113eb565b3480156107a757600080fd5b506103f36115d4565b3480156107bc57600080fd5b506103d76115f8565b3480156107d157600080fd5b506103d76107e0366004613804565b611683565b3480156107f157600080fd5b506103d76116fc565b34801561080657600080fd5b506103f3610815366004613775565b61180d565b34801561082657600080fd5b506103f3610835366004613775565b61181f565b34801561084657600080fd5b506103d7610855366004613775565b611939565b34801561086657600080fd5b506103f3611a55565b34801561087b57600080fd5b5061061a611a79565b34801561089057600080fd5b506103f361089f366004613775565b611a88565b3480156108b057600080fd5b506103f3611b72565b3480156108c557600080fd5b50610448611c8a565b3480156108da57600080fd5b506104756108e9366004613804565b611cc3565b3480156108fa57600080fd5b50610475611cd0565b34801561090f57600080fd5b506103f361091e366004613775565b611d33565b34801561092f57600080fd5b50610475611d97565b34801561094457600080fd5b506103d7611ddd565b34801561095957600080fd5b506103d7610968366004613775565b611e55565b34801561097957600080fd5b506103d761098836600461382e565b611f01565b34801561099957600080fd5b5061047561210a565b3480156109ae57600080fd5b506103d7612118565b3480156109c357600080fd5b506103d76109d23660046138cc565b6121f2565b3480156109e357600080fd5b506103f36109f2366004613790565b6122bc565b348015610a0357600080fd5b5061061a6122e7565b348015610a1857600080fd5b506103f3610a27366004613775565b6122f6565b348015610a3857600080fd5b506103f36123d6565b348015610a4d57600080fd5b50610a61610a5c36600461388d565b6123fa565b60405161040092919061465c565b348015610a7b57600080fd5b506103d7610a8a366004613775565b612427565b348015610a9b57600080fd5b506103d7610aaa3660046138cc565b6124ae565b348015610abb57600080fd5b5061061a612542565b60165481565b600e545b90565b60125481565b6040518060400160405280600b81526020016a477269645a6f6e652e696f60a81b81525081565b6000610b12610b0b61261f565b8484612623565b5060015b92915050565b60105481565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b82821015610bb75760008481526020908190206040805160a081018252600586029092018054835260018082015460ff1684860152600282015492840192909252600381015460608401526004015460808301529083529092019101610b56565b5050505090506000815190506000805b82811015610c3f57610c07848281518110610bde57fe5b602002602001015160200151858381518110610bf657fe5b6020026020010151608001516126d7565b151560011415610c3757610c3286858381518110610c2157fe5b602002602001015160000151612716565b600191505b600101610bc7565b5080610c5d5760405162461bcd60e51b81526004016103ce906142bd565b505050919050565b6000610c7e6004546003546125d290919063ffffffff16565b905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6001600160a01b038316600081815260056020908152604080832033808552925282205491929091908214801590610ce157506000198114155b15610d5c576000610cf282866125f7565b6001600160a01b03808916600081815260056020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d529085906139e7565b60405180910390a3505b610d678686866129a0565b50600195945050505050565b6017546001600160a01b03163314610d9d5760405162461bcd60e51b81526004016103ce90613aa9565b6001600160a01b038082166000818152601460205260409020805490921614610dd85760405162461bcd60e51b81526004016103ce90613d56565b600681015460ff1615610dfd5760405162461bcd60e51b81526004016103ce906140ce565b6000610e1a826005015483600401546125f790919063ffffffff16565b90508015610e785760048201546005830155610e368382612ada565b826001600160a01b03167f3552bfeaaadccee76f56971ef880969c9fe7ec6af186859930f738924cc0ede982604051610e6f91906139e7565b60405180910390a25b50600601805460ff1916600117905550565b60007f00000000000000000000000000000000000000000000000000000000612e75924210610ebb57600e54610c7e565b50600d5490565b601281565b6a17293b0a9e69fd9c00000090565b6001600160a01b03808216600081815260146020526040812080549193849391921614610f0a576000809250925050610fb9565b8060020154421015610f255760050154600092509050610fb9565b600681015460ff16151560011415610f4557600501549150819050610fb9565b42610f61826003015483600101546125d290919063ffffffff16565b11610f7a57806004015481600501549250925050610fb9565b610fad8160030154610fa7610f9c8460010154426125f790919063ffffffff16565b600485015490612566565b906125a0565b60059091015490925090505b915091565b7f000000000000000000000000000000000000000000000000000000006156029281565b600d5490565b610ff9610ff361261f565b82612bbf565b50565b60025490565b6007602052600090815260409020546001600160a01b031681565b610ff93382612cc3565b60146020526000908152604090208054600182015460028301546003840154600485015460058601546006909601546001600160a01b039095169593949293919290919060ff1687565b61107961261f565b6001600160a01b031661108a611a79565b6001600160a01b0316146110b05760405162461bcd60e51b81526004016103ce906141f6565b806000106110d05760405162461bcd60e51b81526004016103ce90613e47565b600d8190556040517f75990a60d01435e02fb3cf68b03da25cad152b95f63f3fab6fde582b9d110487906111059083906139e7565b60405180910390a150565b33321461112f5760405162461bcd60e51b81526004016103ce90614522565b600061113961261f565b90506001600160a01b03811661114e57600080fd5b662386f26fc100003410156111755760405162461bcd60e51b81526004016103ce906145b6565b7f00000000000000000000000000000000000000000000000000000000612e75924210156111cf5760135460ff16156111c05760405162461bcd60e51b81526004016103ce90613cf9565b6111ca8134612d52565b610ff9565b6111d7612f68565b601354610100900460ff16156111ff5760405162461bcd60e51b81526004016103ce90613b63565b610ff98134612fef565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606094859484015b8282101561129e5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161123d565b50929695505050505050565b60096020526000908152604090205463ffffffff1681565b6112ca61261f565b6001600160a01b03166112db611a79565b6001600160a01b0316146113015760405162461bcd60e51b81526004016103ce906141f6565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526006602052604081205461134f61134884611a88565b82906125d2565b9392505050565b600f5481565b61136461261f565b6001600160a01b0316611375611a79565b6001600160a01b03161461139b5760405162461bcd60e51b81526004016103ce906141f6565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60115481565b600043821061140c5760405162461bcd60e51b81526004016103ce906144c5565b6001600160a01b03831660009081526009602052604090205463ffffffff168061143a576000915050610b16565b6001600160a01b038416600090815260086020908152604080832063ffffffff6000198601811685529252909120541683106114a9576001600160a01b03841660009081526008602090815260408083206000199490940163ffffffff16835292905220600101549050610b16565b6001600160a01b038416600090815260086020908152604080832083805290915290205463ffffffff168310156114e4576000915050610b16565b600060001982015b8163ffffffff168163ffffffff16111561159d57600282820363ffffffff16048103611516613715565b506001600160a01b038716600090815260086020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529087141561157857602001519450610b169350505050565b805163ffffffff1687111561158f57819350611596565b6001820392505b50506114ec565b506001600160a01b038516600090815260086020908152604080832063ffffffff9094168352929052206001015491505092915050565b7f0000000000000000000000000000000000000000000000000000000060b7ce9281565b6001546001600160a01b031633146116225760405162461bcd60e51b81526004016103ce90613f49565b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600061168d61261f565b6001600160a01b038085166000908152600560209081526040808320938516835292815282822054835160608101909452602d8085529495509391926116de9287926146b79083013984919061318d565b90506116eb858483612623565b6116f58585612bbf565b5050505050565b6017546001600160a01b031633146117265760405162461bcd60e51b81526004016103ce90613aa9565b6016546a0d8c99944ac09085800000116117525760405162461bcd60e51b81526004016103ce906143ae565b60165460009061176e906a0d8c99944ac09085800000906125f7565b6a0d8c99944ac0908580000060165590506117a97f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f82612ada565b7f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f6001600160a01b03167f5dfcd58f0dcb57f470a1160f7e369fafa49ce56fc620b91fc1c80199706745498260405161180291906139e7565b60405180910390a250565b600c6020526000908152604090205481565b6001600160a01b038116600090815260066020908152604080832054600a8352818420805483518186028101860190945280845291936060939290869084015b828210156118c05760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161185f565b5050825192935060009150505b8181101561192f57600160ff168382815181106118e657fe5b60200260200101516020015160ff16146119275761192483828151811061190957fe5b602002602001015160400151856125d290919063ffffffff16565b93505b6001016118cd565b5091949350505050565b6017546001600160a01b031633146119635760405162461bcd60e51b81526004016103ce90613aa9565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156119fc5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161199b565b5050825192935060009150505b81811015611a4f57600160ff16838281518110611a2257fe5b60200260200101516020015160ff161415611a4757611a4784848381518110610c2157fe5b600101611a09565b50505050565b7f00000000000000000000000000000000000000000000000000000000612e759281565b6000546001600160a01b031690565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b82821015611b1d5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff1684860152600282015492840192909252600381015460608401526004015460808301529083529092019101611abc565b5050505090506000815190506000805b82811015611b6957611b5f848281518110611b4457fe5b602002602001015160400151836125d290919063ffffffff16565b9150600101611b2d565b50949350505050565b600080611ba662784ce0610fa7427f0000000000000000000000000000000000000000000000000000000060b7ce926125f7565b90506000611bb58260046125a0565b90506000611bc48360046131b9565b90506a0d8c99944ac09085800000600183011c8215611c1357611c0c611bfa84610fa76a0d8c99944ac0908580000060026125a0565b6a0d8c99944ac09085800000906125f7565b9450611c18565b600094505b60005b828160ff1611611c82576000611c6b61271061ffff16610fa760158560ff1681548110611c4457fe5b600091825260209091206010820401548791600f166002026101000a900461ffff16612566565b9050611c7787826125d2565b965050600101611c1b565b505050505090565b6040518060400160405280600481526020017f5a4f4e450000000000000000000000000000000000000000000000000000000081525081565b6000610b123384846129a0565b601354600090610100900460ff1615611ceb57506001610ace565b427f00000000000000000000000000000000000000000000000000000000612e759211611d1a57506000610ace565b60135460ff1615611d2d57506001610ace565b50600090565b6001600160a01b03811660009081526009602052604081205463ffffffff1680611d5e57600061134f565b6001600160a01b038316600090815260086020908152604080832063ffffffff6000198601168452909152902060010154915050919050565b60135460009060ff16151560011480611dd05750427f00000000000000000000000000000000000000000000000000000000612e759211155b15611d2d57506001610ace565b611de561261f565b6001600160a01b0316611df6611a79565b6001600160a01b031614611e1c5760405162461bcd60e51b81526004016103ce906141f6565b611e24612f68565b427f00000000000000000000000000000000000000000000000000000000612e759211611e5357611e536131eb565b565b600080611e6183610ed6565b91509150818110611e845760405162461bcd60e51b81526004016103ce90613c2e565b6000611e9083836125f7565b6001600160a01b03851660009081526014602052604090206005018490559050611eba8482612ada565b836001600160a01b03167f3552bfeaaadccee76f56971ef880969c9fe7ec6af186859930f738924cc0ede982604051611ef391906139e7565b60405180910390a250505050565b60408051808201909152600b81526a477269645a6f6e652e696f60a81b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f401f2289580892741b17d81b8e6fd14c6c8b0684a13495ce86820224e1e558ae611f70613272565b30604051602001611f849493929190613a14565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001611fd594939291906139f0565b604051602081830303815290604052805190602001209050600082826040516020016120029291906138e4565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161203f9493929190613a38565b6020604051602081039080840390855afa158015612061573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120945760405162461bcd60e51b81526004016103ce90614559565b6001600160a01b0381166000908152600c6020526040902080546001810190915589146120d35760405162461bcd60e51b81526004016103ce90614351565b874211156120f35760405162461bcd60e51b81526004016103ce9061413c565b6120fd818b612cc3565b505050505b505050505050565b601354610100900460ff1690565b6000612122611b72565b905080601654106121455760405162461bcd60e51b81526004016103ce90614260565b600061215c601654836125f790919063ffffffff16565b6016839055905061218d7f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f82612ada565b7f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f6001600160a01b03167f5dfcd58f0dcb57f470a1160f7e369fafa49ce56fc620b91fc1c8019970674549826040516121e691906139e7565b60405180910390a25050565b6121fa61261f565b6001600160a01b031661220b611a79565b6001600160a01b0316146122315760405162461bcd60e51b81526004016103ce906141f6565b80601054106122525760405162461bcd60e51b81526004016103ce90613dc4565b61228261226a601054836125f790919063ffffffff16565b601254610fa7906958f03ee118a13e800000906125f7565b600e81905560028290556040517fbd0d57d866d23c5e05fefb5a23f0f22a28efec80fa288d6ae00b47405d3ee8a891611105918490614613565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6001546001600160a01b031690565b6001600160a01b0381166000908152600a602090815260408083208054825181850281018501909352808352606093859084015b8282101561238b5760008481526020908190206040805160a081018252600586029092018054835260018082015460ff168486015260028201549284019290925260038101546060840152600401546080830152908352909201910161232a565b5050505090506000815190506000805b82811015611b69576123b2848281518110610bde57fe5b1515600114156123ce576123cb848281518110611b4457fe5b91505b60010161239b565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60086020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b61242f61261f565b6001600160a01b0316612440611a79565b6001600160a01b0316146124665760405162461bcd60e51b81526004016103ce906141f6565b6001600160a01b03811661248c5760405162461bcd60e51b81526004016103ce90613b06565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6124b661261f565b6001600160a01b03166124c7611a79565b6001600160a01b0316146124ed5760405162461bcd60e51b81526004016103ce906141f6565b8060001061250d5760405162461bcd60e51b81526004016103ce90613e47565b600e8190556040517f79e6b4d7a5586ff3d8254c33e90330f31d37922340f0d818b65f50c7291ba5b7906111059083906139e7565b7f0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f81565b60008261257557506000610b16565b8282028284828161258257fe5b041461134f5760405162461bcd60e51b81526004016103ce90614199565b60008082116125c15760405162461bcd60e51b81526004016103ce90613e7e565b8183816125ca57fe5b049392505050565b60008282018381101561134f5760405162461bcd60e51b81526004016103ce90613bf7565b6000828211156126195760405162461bcd60e51b81526004016103ce90613d8d565b50900390565b3390565b6001600160a01b0383166126495760405162461bcd60e51b81526004016103ce90613eec565b6001600160a01b03821661266f5760405162461bcd60e51b81526004016103ce9061403a565b6001600160a01b0380841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906126ca9085906139e7565b60405180910390a3505050565b60004282116126e857506001610b16565b60ff83161580156127005750601354610100900460ff165b1561270d57506001610b16565b50600092915050565b6001600160a01b0382166000908152600a6020526040902080548061274d5760405162461bcd60e51b81526004016103ce90614003565b60008060005b83811015612794578585828154811061276857fe5b906000526020600020906005020160000154141561278c5780915060019250612794565b600101612753565b506001821515146127b75760405162461bcd60e51b81526004016103ce90613c65565b60008482815481106127c557fe5b906000526020600020906005020160020154905060008583815481106127e757fe5b600091825260209091206001600590920201015460045460ff909116915061280f90836125f7565b60045560035461281f90836125d2565b6003556000198501808410156128a25786818154811061283b57fe5b906000526020600020906005020187858154811061285557fe5b600091825260209091208254600590920201908155600180830154908201805460ff191660ff90921691909117905560028083015490820155600380830154908201556004918201549101555b868054806128ac57fe5b6000828152602080822060056000199094019384020182815560018101805460ff191690556002810183905560038101839055600401829055919092556001600160a01b038b16825260069052604090205461290890846125d2565b6001600160a01b038a1660009081526006602052604090205560ff821660011415612952576001600160a01b03808a16600090815260076020526040812054612952921685613276565b886001600160a01b03167f72713ae12cbff1018e930bf23f6ccdbce7fa0530b38938b35f5bb893bcfd4e66848460405161298d929190614621565b60405180910390a2505050505050505050565b6001600160a01b0383166129c65760405162461bcd60e51b81526004016103ce90613c9c565b6001600160a01b0382166129ec5760405162461bcd60e51b81526004016103ce906142f4565b6129f78383836133b3565b6001600160a01b038316600090815260066020526040902054612a1a90826125f7565b6001600160a01b038085166000908152600660205260408082209390935590841681522054612a4990826125d2565b6001600160a01b0380841660008181526006602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612a9b9085906139e7565b60405180910390a36001600160a01b03808416600090815260076020526040808220548584168352912054612ad592918216911683613276565b505050565b6001600160a01b038216612b005760405162461bcd60e51b81526004016103ce90613bc0565b612b0c600083836133b3565b600354612b1990826125d2565b6003556001600160a01b038216600090815260066020526040902054612b3f90826125d2565b6001600160a01b0383166000818152600660205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612b8e9085906139e7565b60405180910390a36001600160a01b03808316600090815260076020526040812054612bbb921683613276565b5050565b6001600160a01b038216612be55760405162461bcd60e51b81526004016103ce9061422b565b612bf1826000836133b3565b612c2e81604051806060016040528060218152602001614696602191396001600160a01b038516600090815260066020526040902054919061318d565b6001600160a01b038316600090815260066020526040902055600354612c5490826125f7565b6003556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c959085906139e7565b60405180910390a36001600160a01b03808316600090815260076020526040812054612bbb92169083613276565b6001600160a01b0380831660009081526007602052604081205490911690612cea8461181f565b6001600160a01b0385811660008181526007602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611a4f828483613276565b6000612d72600f5468056bc75e2d631000006125f790919063ffffffff16565b90506000818310612d835781612d85565b825b905080830381612da75760405162461bcd60e51b81526004016103ce90613eb5565b6000612dbe600d548461256690919063ffffffff16565b90506000612dcd82600a6125a0565b90506000678ac7230489e800008510612dee57612deb83600a6125a0565b90505b612e0281612dfc85856125d2565b906125d2565b600f54909350612e1290866125d2565b600f55601154612e2290846125d2565b60118190556a0250ec4ddca432f60000001015612e515760405162461bcd60e51b81526004016103ce9061440b565b612e7e888460007f00000000000000000000000000000000000000000000000000000000615602926133f7565b6000612e88611a79565b6040519091506001600160a01b0382169087156108fc029088906000818181858888f19350505050158015612ec1573d6000803e3d6000fd5b50886001600160a01b03167f579d39089a1b97845971a326ca93d594877a8103906d038b93fd99e8508f59978786604051612efd929190614613565b60405180910390a28415612f43576040516001600160a01b038a169086156108fc029087906000818181858888f19350505050158015612f41573d6000803e3d6000fd5b505b600f5468056bc75e2d6310000011612f5d57612f5d612f68565b505050505050505050565b60135460ff1615612f7857611e53565b6013805460ff19166001179055601154600090612fa1906a0250ec4ddca432f6000000906125f7565b90508015612fba57612fba612fb4611a79565b82612ada565b7f9a0fa7ccc193069a32705455c2e134739bca39d58931fe12363d3cebf47a92a4600f54601154604051611105929190614613565b60006130086010546002546125f790919063ffffffff16565b90506000818310613019578161301b565b825b90508083038161303d5760405162461bcd60e51b81526004016103ce90613eb5565b6000613054600e548461256690919063ffffffff16565b60105490915061306490846125d2565b60105560125461307490826125d2565b60128190556958f03ee118a13e80000010156130a25760405162461bcd60e51b81526004016103ce90614468565b6130ac8682612ada565b60006130b6611a79565b6040519091506001600160a01b0382169085156108fc029086906000818181858888f193505050501580156130ef573d6000803e3d6000fd5b50866001600160a01b03167f3c924c24e32dc6d93bf4dc79a699da648d296aefdadcbaea23037dae46257b4a858460405161312b929190614613565b60405180910390a28215613171576040516001600160a01b0388169084156108fc029085906000818181858888f1935050505015801561316f573d6000803e3d6000fd5b505b60105460025411613184576131846131eb565b50505050505050565b600081848411156131b15760405162461bcd60e51b81526004016103ce9190613a56565b505050900390565b60008082116131da5760405162461bcd60e51b81526004016103ce90614097565b8183816131e357fe5b069392505050565b601354610100900460ff161561320057611e53565b6013805461ff00191661010017905560125460009061322a906958f03ee118a13e800000906125f7565b9050801561323d5761323d612fb4611a79565b7fb8855a603ac7881ae8282e6a1b39c138c12e785d66f8582ddacc16f0277613dd601054601254604051611105929190614613565b4690565b816001600160a01b0316836001600160a01b0316141580156132985750600081115b15612ad5576001600160a01b0383161561332a576001600160a01b03831660009081526009602052604081205463ffffffff1690816132d857600061330a565b6001600160a01b038516600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b9050600061331882856125f7565b90506133268684848461358f565b5050505b6001600160a01b03821615612ad5576001600160a01b03821660009081526009602052604081205463ffffffff169081613365576000613397565b6001600160a01b038416600090815260086020908152604080832063ffffffff60001987011684529091529020600101545b905060006133a582856125d2565b90506121028584848461358f565b6001600160a01b038316612ad5576a17293b0a9e69fd9c0000006133d982612dfc610c65565b1115612ad55760405162461bcd60e51b81526004016103ce90614105565b6001600160a01b03841661341d5760405162461bcd60e51b81526004016103ce90613bc0565b613429600085856133b3565b60045461343690846125d2565b60045561344161372c565b506040805160a081018252600b80546001808201909255825260ff85811660208085019182528486018981524260608701908152608087018981526001600160a01b038d166000818152600a86528a81208054808b0182559082529581208a516005909702019586559551978501805460ff191698909716979097179095559051600283015551600382015591516004909201919091559251919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061350b9088906139e7565b60405180910390a360ff8316600114613543576001600160a01b03808616600090815260076020526040812054613543921686613276565b846001600160a01b03167f9298b2b497f03d8c40a216bc1e5142747187dd4687de91e09d789982f96d0f5a85858560405161358093929190614632565b60405180910390a25050505050565b60006135b3436040518060600160405280603481526020016146e4603491396136e5565b905060008463ffffffff161180156135fc57506001600160a01b038516600090815260086020908152604080832063ffffffff6000198901811685529252909120548282169116145b15613639576001600160a01b038516600090815260086020908152604080832063ffffffff600019890116845290915290206001018290556136aa565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600884528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260099092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051613580929190614613565b600081640100000000841061370d5760405162461bcd60e51b81526004016103ce9190613a56565b509192915050565b604080518082019091526000808252602082015290565b6040518060a0016040528060008152602001600060ff1681526020016000815260200160008152602001600081525090565b80356001600160a01b0381168114610b1657600080fd5b600060208284031215613786578081fd5b61134f838361375e565b600080604083850312156137a2578081fd5b6137ac848461375e565b91506137bb846020850161375e565b90509250929050565b6000806000606084860312156137d8578081fd5b83356137e381614680565b925060208401356137f381614680565b929592945050506040919091013590565b60008060408385031215613816578182fd5b613820848461375e565b946020939093013593505050565b60008060008060008060c08789031215613846578182fd5b613850888861375e565b95506020870135945060408701359350606087013560ff81168114613873578283fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561389f578182fd5b6138a9848461375e565b9150602083013563ffffffff811681146138c1578182fd5b809150509250929050565b6000602082840312156138dd578081fd5b5035919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03979097168752602087019590955260408601939093526060850191909152608084015260a0830152151560c082015260e00190565b602080825282518282018190526000919060409081850190868401855b828110156139cf578151805185528681015160ff16878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101613988565b5091979650505050505050565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b81811015613a8257858101830151858201604001528201613a66565b81811115613a935783604083870101525b50601f01601f1916929092016040019392505050565b60208082526039908201527f5a4f4e453a205468652063616c6c6572206973206e6f742074686520676f766560408201527f726e616e63652074696d656c6f636b20636f6e74726163742e00000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5a4f4e453a205075626c69632073616c6520616c72656164792066696e69736860408201527f6564000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5a4f4e453a206d696e7420746f20746865207a65726f20616464726573730000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f5a4f4e453a204e6f20636c61696d61626c6520746f6b656e0000000000000000604082015260600190565b60208082526014908201527f5a4f4e453a206c6f636b496420696e76616c6964000000000000000000000000604082015260600190565b6020808252603c908201527f5a4f4e453a3a5f7472616e73666572546f6b656e733a2063616e6e6f7420747260408201527f616e736665722066726f6d20746865207a65726f206164647265737300000000606082015260800190565b60208082526023908201527f5a4f4e453a2047656e657369732073616c6520616c72656164792066696e697360408201527f6865640000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f5a4f4e453a20496e76616c69642062656e656669636961727900000000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526055908201527f5a4f4e453a20546865206361706163697479206d75737420626520677265617460408201527f6572207468616e2074686520616c726561647920626f7567687420616d6f756e60608201527f7420696e20746865207075626c69632073616c652e0000000000000000000000608082015260a00190565b6020808252601a908201527f5a4f4e453a2054686520726174652063616e277420626520302e000000000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f5a4f4e453a2054686520616d6f756e742063616e277420626520302e00000000604082015260600190565b60208082526023908201527f5a4f4e453a20617070726f76652066726f6d20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f6163636570744f776e6572736869703a2043616c6c206d75737420636f6d652060408201527f66726f6d2070656e64696e674f776e65722e0000000000000000000000000000606082015260800190565b60208082526036908201527f5a4f4e453a20557365207468652070757263686173652066756e6374696f6e2060408201527f746f2062757920746865205a4f4e4520746f6b656e2e00000000000000000000606082015260800190565b60208082526015908201527f5a4f4e453a204e6f206c6f636b656420746f6b656e0000000000000000000000604082015260600190565b60208082526021908201527f5a4f4e453a20617070726f766520746f20746865207a65726f2061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000604082015260600190565b60208082526015908201527f5a4f4e453a20416c7265616479207265766f6b65640000000000000000000000604082015260600190565b60208082526014908201527f4361707065643a20636170206578636565646564000000000000000000000000604082015260600190565b60208082526026908201527f5a4f4e453a3a64656c656761746542795369673a207369676e6174757265206560408201527f7870697265640000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f5a4f4e453a206275726e2066726f6d20746865207a65726f2061646472657373604082015260600190565b6020808252602b908201527f5a4f4e453a204e6f20636c61696d61626c6520746f6b656e20666f722074686560408201527f2065636f73797374656d2e000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f5a4f4e453a204e6f20756e6c6f636b61626c6520746f6b656e2e000000000000604082015260600190565b6020808252603a908201527f5a4f4e453a3a5f7472616e73666572546f6b656e733a2063616e6e6f7420747260408201527f616e7366657220746f20746865207a65726f2061646472657373000000000000606082015260800190565b60208082526022908201527f5a4f4e453a3a64656c656761746542795369673a20696e76616c6964206e6f6e60408201527f6365000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252603d908201527f5a4f4e453a20416c6c20746f6b656e7320616c7265616479206861766520626560408201527f656e20636c61696d656420666f72207468652065636f73797374656d2e000000606082015260800190565b60208082526025908201527f5a4f4e453a2047656e6573697320737570706c7920697320696e73756666696360408201527f69656e742e000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5a4f4e453a205075626c696320737570706c7920697320696e7375666669636960408201527f656e742e00000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f5a4f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460408201527f65726d696e656400000000000000000000000000000000000000000000000000606082015260800190565b60208082526013908201527f5a4f4e453a204f6e6c7920656e642d7573657200000000000000000000000000604082015260600190565b60208082526026908201527f5a4f4e453a3a64656c656761746542795369673a20696e76616c69642073696760408201527f6e61747572650000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f5a4f4e453a20546865207075726368617365206d696e696d756d20616d6f756e60408201527f7420697320302e30312045544800000000000000000000000000000000000000606082015260800190565b918252602082015260400190565b91825260ff16602082015260400190565b92835260ff919091166020830152604082015260600190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b6001600160a01b0381168114610ff957600080fdfe5a4f4e453a206275726e20616d6f756e7420657863656564732062616c616e63655a4f4e453a3a6275726e46726f6d3a206275726e20616d6f756e74206578636565647320616c6c6f77616e63655a4f4e453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a264697066735822122073ed80619577dbbd25c20305df3c0465e725ac72198be55907de5d72eb86338064736f6c634300060c0033

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

000000000000000000000000ab0b18523e8fe8cbf947c55632e8ab5ce936ae8c0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f0000000000000000000000002e229b4172a7157ea0db8caa0ca580636a05dce30000000000000000000000000c1ac3ede7a6a22cf36457bd3759bcea44b0b643

-----Decoded View---------------
Arg [0] : owner_ (address): 0xab0B18523e8fe8CBF947C55632e8aB5Ce936ae8c
Arg [1] : vault_ (address): 0x7205731e9643235Aa313D46552c7aa81E559fB6F
Arg [2] : advisors_ (address): 0x2e229B4172a7157ea0db8caa0cA580636A05dce3
Arg [3] : treasury_ (address): 0x0C1Ac3eDE7A6a22CF36457BD3759BceA44b0B643

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ab0b18523e8fe8cbf947c55632e8ab5ce936ae8c
Arg [1] : 0000000000000000000000007205731e9643235aa313d46552c7aa81e559fb6f
Arg [2] : 0000000000000000000000002e229b4172a7157ea0db8caa0ca580636a05dce3
Arg [3] : 0000000000000000000000000c1ac3ede7a6a22cf36457bd3759bcea44b0b643


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

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