ETH Price: $3,464.25 (+2.16%)
Gas: 7 Gwei

Token

GEN.ART (GENART)
 

Overview

Max Total Supply

200,000,000 GENART

Holders

1,426 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
johnastorv.eth
Balance
4,000 GENART

Value
$0.00
0xdcefc9ff1e47e458e56959154c1cdcf56003d30b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

GEN.ART is a generative art platform, operating as a members' DAO, regularly releasing art drops from world renowned artists.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GenArtGovToken

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-19
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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)
    {
        unchecked {
            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)
    {
        unchecked {
            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)
    {
        unchecked {
            // 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)
    {
        unchecked {
            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)
    {
        unchecked {
            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) {
        return a + b;
    }

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

    /**
     * @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.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        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) {
        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) {
        unchecked {
            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.
     *
     * 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) {
        unchecked {
            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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

library SafeCast {
    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(
            value <= type(uint224).max,
            "SafeCast: value doesn't fit in 224 bits"
        );
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(
            value <= type(uint128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(
            value <= type(uint96).max,
            "SafeCast: value doesn't fit in 96 bits"
        );
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(
            value <= type(uint64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(
            value <= type(uint32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(
            value <= type(uint16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(
            value <= type(uint8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(
            value >= type(int128).min && value <= type(int128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(
            value >= type(int64).min && value <= type(int64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(
            value >= type(int32).min && value <= type(int32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(
            value >= type(int16).min && value <= type(int16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(
            value >= type(int8).min && value <= type(int8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        require(
            value <= uint256(type(int256).max),
            "SafeCast: value doesn't fit in an int256"
        );
        return int256(value);
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev 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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract GenArtGovToken is Ownable {
    using SafeMath for uint256;
    using SafeCast for uint256;

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

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

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

    /// @notice Total number of tokens in circulation
    uint256 public totalSupply = 100_000_000e18; // 100 million

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

    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;
        uint224 votes;
    }

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

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

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

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

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH =
        keccak256(
            "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
        );

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

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

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

    /// @notice 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
    );

    constructor(address treasury_) {
        _mint(treasury_, 100 * 10**24);
    }

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

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

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

    /**
     * @notice Triggers an approval from owner to spender
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline 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 permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(
                PERMIT_TYPEHASH,
                owner,
                spender,
                amount,
                nonces[owner]++,
                deadline
            )
        );
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainSeparator, structHash)
        );
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "GenArtGovToken: invalid signature");
        require(signatory == owner, "GenArtGovToken: unauthorized");
        require(
            block.timestamp <= deadline,
            "GenArtGovToken: signature expired"
        );

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @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) {
        return balances[account];
    }

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public returns (bool) {
        address spender = _msgSender();

        uint256 currentAllowance = allowances[sender][spender];
        require(
            currentAllowance >= amount,
            "GenArtGovToken: transfer amount exceeds allowance"
        );
        _transferTokens(sender, recipient, amount);

        unchecked {
            approve(spender, currentAllowance - amount);
        }

        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,
        uint256 nonce,
        uint256 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), "GenArtGovToken: invalid signature");
        require(nonce == nonces[signatory]++, "GenArtGovToken: invalid nonce");
        require(block.timestamp <= expiry, "GenArtGovToken: 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, uint32 blockNumber)
        public
        view
        returns (uint256)
    {
        require(
            blockNumber < block.number,
            "GenArtGovToken: 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 = balances[delegator];
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

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

        balances[from] = balances[from].sub(
            amount,
            "GenArtGovToken: transfer amount exceeds balance"
        );

        balances[to] = balances[to].add(amount);

        emit Transfer(from, to, amount);

        _moveDelegates(delegates[from], delegates[to], 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,
                    "GenArtGovToken: vote amount underflows"
                );

                _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 {
        uint224 _votes = newVotes.toUint224();
        if (
            nCheckpoints > 0 &&
            checkpoints[delegatee][nCheckpoints - 1].fromBlock == block.number
        ) {
            checkpoints[delegatee][nCheckpoints - 1].votes = _votes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(
                block.number.toUint32(),
                _votes
            );
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, _votes);
    }

    function getChainId() public view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }

    function _mint(address account, uint96 amount) internal virtual {
        require(
            account != address(0),
            "GenArtGovToken: mint to the zero address"
        );

        totalSupply += amount;
        balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","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":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":"amount","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":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"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":"getChainId","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"name":"getPriorVotes","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526a52b7d2dcc80cd2e40000006001553480156200002057600080fd5b5060405162003bc338038062003bc38339818101604052810190620000469190620002db565b620000666200005a6200008a60201b60201c565b6200009260201b60201c565b62000083816a52b7d2dcc80cd2e40000006200015660201b60201c565b50620004e0565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c09062000380565b60405180910390fd5b806bffffffffffffffffffffffff1660016000828254620001eb9190620003d0565b92505081905550806bffffffffffffffffffffffff16600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620002519190620003d0565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002b89190620003a2565b60405180910390a35050565b600081519050620002d581620004c6565b92915050565b600060208284031215620002ee57600080fd5b6000620002fe84828501620002c4565b91505092915050565b600062000316602883620003bf565b91507f47656e417274476f76546f6b656e3a206d696e7420746f20746865207a65726f60008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b6200037a8162000483565b82525050565b600060208201905081810360008301526200039b8162000307565b9050919050565b6000602082019050620003b960008301846200036f565b92915050565b600082825260208201905092915050565b6000620003dd8262000461565b9150620003ea8362000461565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000422576200042162000497565b5b828201905092915050565b60006200043a8262000441565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b600062000490826200046b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b620004d1816200042d565b8114620004dd57600080fd5b50565b6136d380620004f06000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80637ecebe00116100c3578063d505accf1161007c578063d505accf14610405578063dd62ed3e14610421578063dd725dc314610451578063e7a324dc14610481578063f1127ed81461049f578063f2fde38b146104d057610158565b80637ecebe001461031d5780638da5cb5b1461034d57806395d89b411461036b578063a9059cbb14610389578063b4b5ea57146103b9578063c3cda520146103e957610158565b8063313ce56711610115578063313ce567146102355780633408e47014610253578063587cde1e146102715780635c19a95c146102a15780636fcfff45146102bd57806370a08231146102ed57610158565b806306fdde031461015d578063095ea7b31461017b57806318160ddd146101ab57806320606b70146101c957806323b872dd146101e757806330adf81f14610217575b600080fd5b6101656104ec565b6040516101729190613096565b60405180910390f35b610195600480360381019061019091906127b3565b610525565b6040516101a29190612f30565b60405180910390f35b6101b3610543565b6040516101c09190613278565b60405180910390f35b6101d1610549565b6040516101de9190612f4b565b60405180910390f35b61020160048036038101906101fc91906126c6565b61056d565b60405161020e9190612f30565b60405180910390f35b61021f610663565b60405161022c9190612f4b565b60405180910390f35b61023d610687565b60405161024a9190613300565b60405180910390f35b61025b61068c565b6040516102689190613278565b60405180910390f35b61028b60048036038101906102869190612661565b610699565b6040516102989190612f15565b60405180910390f35b6102bb60048036038101906102b69190612661565b6106cc565b005b6102d760048036038101906102d29190612661565b6106d9565b6040516102e491906132bc565b60405180910390f35b61030760048036038101906103029190612661565b6106fc565b6040516103149190613278565b60405180910390f35b61033760048036038101906103329190612661565b610745565b6040516103449190613278565b60405180910390f35b61035561075d565b6040516103629190612f15565b60405180910390f35b610373610786565b6040516103809190613096565b60405180910390f35b6103a3600480360381019061039e91906127b3565b6107bf565b6040516103b09190612f30565b60405180910390f35b6103d360048036038101906103ce9190612661565b6107d6565b6040516103e09190613278565b60405180910390f35b61040360048036038101906103fe91906127ef565b6108fb565b005b61041f600480360381019061041a9190612715565b610bbe565b005b61043b6004803603810190610436919061268a565b610f8e565b6040516104489190613278565b60405180910390f35b61046b60048036038101906104669190612878565b611015565b6040516104789190613278565b60405180910390f35b610489611518565b6040516104969190612f4b565b60405180910390f35b6104b960048036038101906104b49190612878565b61153c565b6040516104c79291906132d7565b60405180910390f35b6104ea60048036038101906104e59190612661565b6115a5565b005b6040518060400160405280600781526020017f47454e2e4152540000000000000000000000000000000000000000000000000081525081565b600061053961053261169d565b84846116a5565b6001905092915050565b60015481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60008061057861169d565b90506000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063590613138565b60405180910390fd5b610649868686611870565b61065582858303610525565b506001925050509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000804690508091505090565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106d63382611bc7565b50565b60066020528060005260406000206000915054906101000a900463ffffffff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60076020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600681526020017f47454e415254000000000000000000000000000000000000000000000000000081525081565b60006107cc338484611870565b6001905092915050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116108405760006108d5565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018361088e9190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff165b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600781526020017f47454e2e415254000000000000000000000000000000000000000000000000008152508051906020012061096361068c565b30604051602001610977949392919061300c565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016109c89493929190612fc7565b604051602081830303815290604052805190602001209050600082826040516020016109f5929190612ede565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610a329493929190613051565b6020604051602081039080840390855afa158015610a54573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac790613258565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610b2090613513565b919050558914610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c906130f8565b60405180910390fd5b87421115610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f90613158565b60405180910390fd5b610bb2818b611bc7565b50505050505050505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600781526020017f47454e2e4152540000000000000000000000000000000000000000000000000081525080519060200120610c2661068c565b30604051602001610c3a949392919061300c565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610cc890613513565b919050558a604051602001610ce296959493929190612f66565b60405160208183030381529060405280519060200120905060008282604051602001610d0f929190612ede565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610d4c9493929190613051565b6020604051602081039080840390855afa158015610d6e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190613258565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4f90613178565b60405180910390fd5b87421115610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9290613158565b60405180910390fd5b88600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b604051610f799190613278565b60405180910390a35050505050505050505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000438263ffffffff161061105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690613218565b60405180910390fd5b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1614156110cc576000915050611512565b8263ffffffff16600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846111219190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161121457600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836111a89190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050611512565b8263ffffffff16600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16111561129b576000915050611512565b6000806001836112ab9190613403565b90505b8163ffffffff168163ffffffff161115611466576000600283836112d29190613403565b6112dc91906133d2565b826112e79190613403565b90506000600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508663ffffffff16816000015163ffffffff16141561142f5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695505050505050611512565b8663ffffffff16816000015163ffffffff16101561144f5781935061145f565b60018261145c9190613403565b92505b50506112ae565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693505050505b92915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6005602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905082565b6115ad61169d565b73ffffffffffffffffffffffffffffffffffffffff166115cb61075d565b73ffffffffffffffffffffffffffffffffffffffff1614611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890613198565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611691576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611688906130d8565b60405180910390fd5b61169a81611d6f565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c906130b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90613238565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516118639190613278565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790613118565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611950576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611947906131d8565b60405180910390fd5b6119bc816040518060600160405280602f815260200161366f602f9139600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e339092919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a5181600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e8890919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611af19190613278565b60405180910390a3611bc2600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e9e565b505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611d69828483611e9e565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000838311158290611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e729190613096565b60405180910390fd5b5082840390509392505050565b60008183611e969190613342565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611eda5750600081115b156121ee57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612073576000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611f7d576000612012565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611fcb9190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff165b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690506000612061846040518060600160405280602681526020016136496026913984611e339092919063ffffffff16565b905061206f868484846121f3565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121ed576000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116121115760006121a6565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461215f9190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff165b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905060006121db8483611e8890919063ffffffff16565b90506121e9858484846121f3565b5050505b5b505050565b60006121fe8261253a565b905060008463ffffffff16118015612296575043600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876122609190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b1561235a5780600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876122ea9190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506124e3565b604051806040016040528061236e436125a5565b63ffffffff168152602001827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055509050506001846124859190613398565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724848360405161252b929190613293565b60405180910390a25050505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561259d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612594906131b8565b60405180910390fd5b819050919050565b600063ffffffff80168211156125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e7906131f8565b60405180910390fd5b819050919050565b600081359050612607816135d5565b92915050565b60008135905061261c816135ec565b92915050565b60008135905061263181613603565b92915050565b6000813590506126468161361a565b92915050565b60008135905061265b81613631565b92915050565b60006020828403121561267357600080fd5b6000612681848285016125f8565b91505092915050565b6000806040838503121561269d57600080fd5b60006126ab858286016125f8565b92505060206126bc858286016125f8565b9150509250929050565b6000806000606084860312156126db57600080fd5b60006126e9868287016125f8565b93505060206126fa868287016125f8565b925050604061270b86828701612622565b9150509250925092565b600080600080600080600060e0888a03121561273057600080fd5b600061273e8a828b016125f8565b975050602061274f8a828b016125f8565b96505060406127608a828b01612622565b95505060606127718a828b01612622565b94505060806127828a828b0161264c565b93505060a06127938a828b0161260d565b92505060c06127a48a828b0161260d565b91505092959891949750929550565b600080604083850312156127c657600080fd5b60006127d4858286016125f8565b92505060206127e585828601612622565b9150509250929050565b60008060008060008060c0878903121561280857600080fd5b600061281689828a016125f8565b965050602061282789828a01612622565b955050604061283889828a01612622565b945050606061284989828a0161264c565b935050608061285a89828a0161260d565b92505060a061286b89828a0161260d565b9150509295509295509295565b6000806040838503121561288b57600080fd5b6000612899858286016125f8565b92505060206128aa85828601612637565b9150509250929050565b6128bd81613437565b82525050565b6128cc81613449565b82525050565b6128db81613455565b82525050565b6128f26128ed82613455565b61355c565b82525050565b60006129038261331b565b61290d8185613326565b935061291d8185602086016134e0565b612926816135c4565b840191505092915050565b600061293e602d83613326565b91507f47656e417274476f76546f6b656e3a20617070726f76652066726f6d2074686560008301527f207a65726f2061646472657373000000000000000000000000000000000000006020830152604082019050919050565b60006129a4602683613326565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a0a601d83613326565b91507f47656e417274476f76546f6b656e3a20696e76616c6964206e6f6e63650000006000830152602082019050919050565b6000612a4a603583613326565b91507f47656e417274476f76546f6b656e3a2063616e6e6f74207472616e736665722060008301527f66726f6d20746865207a65726f206164647265737300000000000000000000006020830152604082019050919050565b6000612ab0603183613326565b91507f47656e417274476f76546f6b656e3a207472616e7366657220616d6f756e742060008301527f6578636565647320616c6c6f77616e63650000000000000000000000000000006020830152604082019050919050565b6000612b16602183613326565b91507f47656e417274476f76546f6b656e3a207369676e61747572652065787069726560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b7c600283613337565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000612bbc601c83613326565b91507f47656e417274476f76546f6b656e3a20756e617574686f72697a6564000000006000830152602082019050919050565b6000612bfc602083613326565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612c3c602783613326565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203260008301527f32342062697473000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ca2603383613326565b91507f47656e417274476f76546f6b656e3a2063616e6e6f74207472616e736665722060008301527f746f20746865207a65726f2061646472657373000000000000000000000000006020830152604082019050919050565b6000612d08602683613326565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203360008301527f32206269747300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d6e602283613326565b91507f47656e417274476f76546f6b656e3a206e6f74207965742064657465726d696e60008301527f65640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612dd4602b83613326565b91507f47656e417274476f76546f6b656e3a20617070726f766520746f20746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e3a602183613326565b91507f47656e417274476f76546f6b656e3a20696e76616c6964207369676e6174757260008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b612e9c8161347f565b82525050565b612eab816134ce565b82525050565b612eba816134a7565b82525050565b612ec9816134b1565b82525050565b612ed8816134c1565b82525050565b6000612ee982612b6f565b9150612ef582856128e1565b602082019150612f0582846128e1565b6020820191508190509392505050565b6000602082019050612f2a60008301846128b4565b92915050565b6000602082019050612f4560008301846128c3565b92915050565b6000602082019050612f6060008301846128d2565b92915050565b600060c082019050612f7b60008301896128d2565b612f8860208301886128b4565b612f9560408301876128b4565b612fa26060830186612eb1565b612faf6080830185612eb1565b612fbc60a0830184612eb1565b979650505050505050565b6000608082019050612fdc60008301876128d2565b612fe960208301866128b4565b612ff66040830185612eb1565b6130036060830184612eb1565b95945050505050565b600060808201905061302160008301876128d2565b61302e60208301866128d2565b61303b6040830185612eb1565b61304860608301846128b4565b95945050505050565b600060808201905061306660008301876128d2565b6130736020830186612ecf565b61308060408301856128d2565b61308d60608301846128d2565b95945050505050565b600060208201905081810360008301526130b081846128f8565b905092915050565b600060208201905081810360008301526130d181612931565b9050919050565b600060208201905081810360008301526130f181612997565b9050919050565b60006020820190508181036000830152613111816129fd565b9050919050565b6000602082019050818103600083015261313181612a3d565b9050919050565b6000602082019050818103600083015261315181612aa3565b9050919050565b6000602082019050818103600083015261317181612b09565b9050919050565b6000602082019050818103600083015261319181612baf565b9050919050565b600060208201905081810360008301526131b181612bef565b9050919050565b600060208201905081810360008301526131d181612c2f565b9050919050565b600060208201905081810360008301526131f181612c95565b9050919050565b6000602082019050818103600083015261321181612cfb565b9050919050565b6000602082019050818103600083015261323181612d61565b9050919050565b6000602082019050818103600083015261325181612dc7565b9050919050565b6000602082019050818103600083015261327181612e2d565b9050919050565b600060208201905061328d6000830184612eb1565b92915050565b60006040820190506132a86000830185612eb1565b6132b56020830184612ea2565b9392505050565b60006020820190506132d16000830184612ec0565b92915050565b60006040820190506132ec6000830185612ec0565b6132f96020830184612e93565b9392505050565b60006020820190506133156000830184612ecf565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061334d826134a7565b9150613358836134a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561338d5761338c613566565b5b828201905092915050565b60006133a3826134b1565b91506133ae836134b1565b92508263ffffffff038211156133c7576133c6613566565b5b828201905092915050565b60006133dd826134b1565b91506133e8836134b1565b9250826133f8576133f7613595565b5b828204905092915050565b600061340e826134b1565b9150613419836134b1565b92508282101561342c5761342b613566565b5b828203905092915050565b60006134428261345f565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60006134d98261347f565b9050919050565b60005b838110156134fe5780820151818401526020810190506134e3565b8381111561350d576000848401525b50505050565b600061351e826134a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561355157613550613566565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b6135de81613437565b81146135e957600080fd5b50565b6135f581613455565b811461360057600080fd5b50565b61360c816134a7565b811461361757600080fd5b50565b613623816134b1565b811461362e57600080fd5b50565b61363a816134c1565b811461364557600080fd5b5056fe47656e417274476f76546f6b656e3a20766f746520616d6f756e7420756e646572666c6f777347656e417274476f76546f6b656e3a207472616e7366657220616d6f756e7420657863656564732062616c616e6365a26469706673582212205300cb4b4d29fb0aabe7d4aad3096d57c7157314070aee4f5aa3057a4487db6164736f6c634300080000330000000000000000000000002b108db4f7563a3d8bc302f7f18af797fb4a2a97

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c80637ecebe00116100c3578063d505accf1161007c578063d505accf14610405578063dd62ed3e14610421578063dd725dc314610451578063e7a324dc14610481578063f1127ed81461049f578063f2fde38b146104d057610158565b80637ecebe001461031d5780638da5cb5b1461034d57806395d89b411461036b578063a9059cbb14610389578063b4b5ea57146103b9578063c3cda520146103e957610158565b8063313ce56711610115578063313ce567146102355780633408e47014610253578063587cde1e146102715780635c19a95c146102a15780636fcfff45146102bd57806370a08231146102ed57610158565b806306fdde031461015d578063095ea7b31461017b57806318160ddd146101ab57806320606b70146101c957806323b872dd146101e757806330adf81f14610217575b600080fd5b6101656104ec565b6040516101729190613096565b60405180910390f35b610195600480360381019061019091906127b3565b610525565b6040516101a29190612f30565b60405180910390f35b6101b3610543565b6040516101c09190613278565b60405180910390f35b6101d1610549565b6040516101de9190612f4b565b60405180910390f35b61020160048036038101906101fc91906126c6565b61056d565b60405161020e9190612f30565b60405180910390f35b61021f610663565b60405161022c9190612f4b565b60405180910390f35b61023d610687565b60405161024a9190613300565b60405180910390f35b61025b61068c565b6040516102689190613278565b60405180910390f35b61028b60048036038101906102869190612661565b610699565b6040516102989190612f15565b60405180910390f35b6102bb60048036038101906102b69190612661565b6106cc565b005b6102d760048036038101906102d29190612661565b6106d9565b6040516102e491906132bc565b60405180910390f35b61030760048036038101906103029190612661565b6106fc565b6040516103149190613278565b60405180910390f35b61033760048036038101906103329190612661565b610745565b6040516103449190613278565b60405180910390f35b61035561075d565b6040516103629190612f15565b60405180910390f35b610373610786565b6040516103809190613096565b60405180910390f35b6103a3600480360381019061039e91906127b3565b6107bf565b6040516103b09190612f30565b60405180910390f35b6103d360048036038101906103ce9190612661565b6107d6565b6040516103e09190613278565b60405180910390f35b61040360048036038101906103fe91906127ef565b6108fb565b005b61041f600480360381019061041a9190612715565b610bbe565b005b61043b6004803603810190610436919061268a565b610f8e565b6040516104489190613278565b60405180910390f35b61046b60048036038101906104669190612878565b611015565b6040516104789190613278565b60405180910390f35b610489611518565b6040516104969190612f4b565b60405180910390f35b6104b960048036038101906104b49190612878565b61153c565b6040516104c79291906132d7565b60405180910390f35b6104ea60048036038101906104e59190612661565b6115a5565b005b6040518060400160405280600781526020017f47454e2e4152540000000000000000000000000000000000000000000000000081525081565b600061053961053261169d565b84846116a5565b6001905092915050565b60015481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60008061057861169d565b90506000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063590613138565b60405180910390fd5b610649868686611870565b61065582858303610525565b506001925050509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000804690508091505090565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106d63382611bc7565b50565b60066020528060005260406000206000915054906101000a900463ffffffff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60076020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600681526020017f47454e415254000000000000000000000000000000000000000000000000000081525081565b60006107cc338484611870565b6001905092915050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116108405760006108d5565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018361088e9190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff165b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600781526020017f47454e2e415254000000000000000000000000000000000000000000000000008152508051906020012061096361068c565b30604051602001610977949392919061300c565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016109c89493929190612fc7565b604051602081830303815290604052805190602001209050600082826040516020016109f5929190612ede565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610a329493929190613051565b6020604051602081039080840390855afa158015610a54573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac790613258565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610b2090613513565b919050558914610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c906130f8565b60405180910390fd5b87421115610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f90613158565b60405180910390fd5b610bb2818b611bc7565b50505050505050505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280600781526020017f47454e2e4152540000000000000000000000000000000000000000000000000081525080519060200120610c2661068c565b30604051602001610c3a949392919061300c565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610cc890613513565b919050558a604051602001610ce296959493929190612f66565b60405160208183030381529060405280519060200120905060008282604051602001610d0f929190612ede565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610d4c9493929190613051565b6020604051602081039080840390855afa158015610d6e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190613258565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4f90613178565b60405180910390fd5b87421115610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9290613158565b60405180910390fd5b88600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b604051610f799190613278565b60405180910390a35050505050505050505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000438263ffffffff161061105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690613218565b60405180910390fd5b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1614156110cc576000915050611512565b8263ffffffff16600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846111219190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161161121457600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836111a89190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050611512565b8263ffffffff16600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16111561129b576000915050611512565b6000806001836112ab9190613403565b90505b8163ffffffff168163ffffffff161115611466576000600283836112d29190613403565b6112dc91906133d2565b826112e79190613403565b90506000600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508663ffffffff16816000015163ffffffff16141561142f5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1695505050505050611512565b8663ffffffff16816000015163ffffffff16101561144f5781935061145f565b60018261145c9190613403565b92505b50506112ae565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693505050505b92915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6005602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905082565b6115ad61169d565b73ffffffffffffffffffffffffffffffffffffffff166115cb61075d565b73ffffffffffffffffffffffffffffffffffffffff1614611621576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161890613198565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611691576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611688906130d8565b60405180910390fd5b61169a81611d6f565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c906130b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90613238565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516118639190613278565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790613118565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611950576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611947906131d8565b60405180910390fd5b6119bc816040518060600160405280602f815260200161366f602f9139600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e339092919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a5181600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e8890919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611af19190613278565b60405180910390a3611bc2600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611e9e565b505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611d69828483611e9e565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000838311158290611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e729190613096565b60405180910390fd5b5082840390509392505050565b60008183611e969190613342565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611eda5750600081115b156121ee57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612073576000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611f7d576000612012565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611fcb9190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff165b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690506000612061846040518060600160405280602681526020016136496026913984611e339092919063ffffffff16565b905061206f868484846121f3565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121ed576000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116121115760006121a6565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461215f9190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff165b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905060006121db8483611e8890919063ffffffff16565b90506121e9858484846121f3565b5050505b5b505050565b60006121fe8261253a565b905060008463ffffffff16118015612296575043600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876122609190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b1561235a5780600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876122ea9190613403565b63ffffffff1663ffffffff16815260200190815260200160002060000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506124e3565b604051806040016040528061236e436125a5565b63ffffffff168152602001827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055509050506001846124859190613398565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724848360405161252b929190613293565b60405180910390a25050505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561259d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612594906131b8565b60405180910390fd5b819050919050565b600063ffffffff80168211156125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e7906131f8565b60405180910390fd5b819050919050565b600081359050612607816135d5565b92915050565b60008135905061261c816135ec565b92915050565b60008135905061263181613603565b92915050565b6000813590506126468161361a565b92915050565b60008135905061265b81613631565b92915050565b60006020828403121561267357600080fd5b6000612681848285016125f8565b91505092915050565b6000806040838503121561269d57600080fd5b60006126ab858286016125f8565b92505060206126bc858286016125f8565b9150509250929050565b6000806000606084860312156126db57600080fd5b60006126e9868287016125f8565b93505060206126fa868287016125f8565b925050604061270b86828701612622565b9150509250925092565b600080600080600080600060e0888a03121561273057600080fd5b600061273e8a828b016125f8565b975050602061274f8a828b016125f8565b96505060406127608a828b01612622565b95505060606127718a828b01612622565b94505060806127828a828b0161264c565b93505060a06127938a828b0161260d565b92505060c06127a48a828b0161260d565b91505092959891949750929550565b600080604083850312156127c657600080fd5b60006127d4858286016125f8565b92505060206127e585828601612622565b9150509250929050565b60008060008060008060c0878903121561280857600080fd5b600061281689828a016125f8565b965050602061282789828a01612622565b955050604061283889828a01612622565b945050606061284989828a0161264c565b935050608061285a89828a0161260d565b92505060a061286b89828a0161260d565b9150509295509295509295565b6000806040838503121561288b57600080fd5b6000612899858286016125f8565b92505060206128aa85828601612637565b9150509250929050565b6128bd81613437565b82525050565b6128cc81613449565b82525050565b6128db81613455565b82525050565b6128f26128ed82613455565b61355c565b82525050565b60006129038261331b565b61290d8185613326565b935061291d8185602086016134e0565b612926816135c4565b840191505092915050565b600061293e602d83613326565b91507f47656e417274476f76546f6b656e3a20617070726f76652066726f6d2074686560008301527f207a65726f2061646472657373000000000000000000000000000000000000006020830152604082019050919050565b60006129a4602683613326565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a0a601d83613326565b91507f47656e417274476f76546f6b656e3a20696e76616c6964206e6f6e63650000006000830152602082019050919050565b6000612a4a603583613326565b91507f47656e417274476f76546f6b656e3a2063616e6e6f74207472616e736665722060008301527f66726f6d20746865207a65726f206164647265737300000000000000000000006020830152604082019050919050565b6000612ab0603183613326565b91507f47656e417274476f76546f6b656e3a207472616e7366657220616d6f756e742060008301527f6578636565647320616c6c6f77616e63650000000000000000000000000000006020830152604082019050919050565b6000612b16602183613326565b91507f47656e417274476f76546f6b656e3a207369676e61747572652065787069726560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b7c600283613337565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000612bbc601c83613326565b91507f47656e417274476f76546f6b656e3a20756e617574686f72697a6564000000006000830152602082019050919050565b6000612bfc602083613326565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612c3c602783613326565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203260008301527f32342062697473000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ca2603383613326565b91507f47656e417274476f76546f6b656e3a2063616e6e6f74207472616e736665722060008301527f746f20746865207a65726f2061646472657373000000000000000000000000006020830152604082019050919050565b6000612d08602683613326565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203360008301527f32206269747300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d6e602283613326565b91507f47656e417274476f76546f6b656e3a206e6f74207965742064657465726d696e60008301527f65640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612dd4602b83613326565b91507f47656e417274476f76546f6b656e3a20617070726f766520746f20746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e3a602183613326565b91507f47656e417274476f76546f6b656e3a20696e76616c6964207369676e6174757260008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b612e9c8161347f565b82525050565b612eab816134ce565b82525050565b612eba816134a7565b82525050565b612ec9816134b1565b82525050565b612ed8816134c1565b82525050565b6000612ee982612b6f565b9150612ef582856128e1565b602082019150612f0582846128e1565b6020820191508190509392505050565b6000602082019050612f2a60008301846128b4565b92915050565b6000602082019050612f4560008301846128c3565b92915050565b6000602082019050612f6060008301846128d2565b92915050565b600060c082019050612f7b60008301896128d2565b612f8860208301886128b4565b612f9560408301876128b4565b612fa26060830186612eb1565b612faf6080830185612eb1565b612fbc60a0830184612eb1565b979650505050505050565b6000608082019050612fdc60008301876128d2565b612fe960208301866128b4565b612ff66040830185612eb1565b6130036060830184612eb1565b95945050505050565b600060808201905061302160008301876128d2565b61302e60208301866128d2565b61303b6040830185612eb1565b61304860608301846128b4565b95945050505050565b600060808201905061306660008301876128d2565b6130736020830186612ecf565b61308060408301856128d2565b61308d60608301846128d2565b95945050505050565b600060208201905081810360008301526130b081846128f8565b905092915050565b600060208201905081810360008301526130d181612931565b9050919050565b600060208201905081810360008301526130f181612997565b9050919050565b60006020820190508181036000830152613111816129fd565b9050919050565b6000602082019050818103600083015261313181612a3d565b9050919050565b6000602082019050818103600083015261315181612aa3565b9050919050565b6000602082019050818103600083015261317181612b09565b9050919050565b6000602082019050818103600083015261319181612baf565b9050919050565b600060208201905081810360008301526131b181612bef565b9050919050565b600060208201905081810360008301526131d181612c2f565b9050919050565b600060208201905081810360008301526131f181612c95565b9050919050565b6000602082019050818103600083015261321181612cfb565b9050919050565b6000602082019050818103600083015261323181612d61565b9050919050565b6000602082019050818103600083015261325181612dc7565b9050919050565b6000602082019050818103600083015261327181612e2d565b9050919050565b600060208201905061328d6000830184612eb1565b92915050565b60006040820190506132a86000830185612eb1565b6132b56020830184612ea2565b9392505050565b60006020820190506132d16000830184612ec0565b92915050565b60006040820190506132ec6000830185612ec0565b6132f96020830184612e93565b9392505050565b60006020820190506133156000830184612ecf565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061334d826134a7565b9150613358836134a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561338d5761338c613566565b5b828201905092915050565b60006133a3826134b1565b91506133ae836134b1565b92508263ffffffff038211156133c7576133c6613566565b5b828201905092915050565b60006133dd826134b1565b91506133e8836134b1565b9250826133f8576133f7613595565b5b828204905092915050565b600061340e826134b1565b9150613419836134b1565b92508282101561342c5761342b613566565b5b828203905092915050565b60006134428261345f565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60006134d98261347f565b9050919050565b60005b838110156134fe5780820151818401526020810190506134e3565b8381111561350d576000848401525b50505050565b600061351e826134a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561355157613550613566565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b6135de81613437565b81146135e957600080fd5b50565b6135f581613455565b811461360057600080fd5b50565b61360c816134a7565b811461361757600080fd5b50565b613623816134b1565b811461362e57600080fd5b50565b61363a816134c1565b811461364557600080fd5b5056fe47656e417274476f76546f6b656e3a20766f746520616d6f756e7420756e646572666c6f777347656e417274476f76546f6b656e3a207472616e7366657220616d6f756e7420657863656564732062616c616e6365a26469706673582212205300cb4b4d29fb0aabe7d4aad3096d57c7157314070aee4f5aa3057a4487db6164736f6c63430008000033

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

0000000000000000000000002b108db4f7563a3d8bc302f7f18af797fb4a2a97

-----Decoded View---------------
Arg [0] : treasury_ (address): 0x2b108dB4F7563A3d8bc302F7F18aF797FB4A2A97

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002b108db4f7563a3d8bc302f7f18af797fb4a2a97


Deployed Bytecode Sourcemap

15978:14848:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16138:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30631:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16440:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17236:155;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22688:550;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17701:170;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16341:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29981:176;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16689:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23386:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17115:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22159:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17952:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15106:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16238:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22530:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25131:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23922:1008;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20713:1243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19145:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25798:1285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17485:126;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16978:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;15561:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16138:39;;;;;;;;;;;;;;;;;;;:::o;30631:192::-;30732:4;30754:39;30763:12;:10;:12::i;:::-;30777:7;30786:6;30754:8;:39::i;:::-;30811:4;30804:11;;30631:192;;;;:::o;16440:43::-;;;;:::o;17236:155::-;17287:104;17236:155;:::o;22688:550::-;22811:4;22828:15;22846:12;:10;:12::i;:::-;22828:30;;22871:24;22898:10;:18;22909:6;22898:18;;;;;;;;;;;;;;;:27;22917:7;22898:27;;;;;;;;;;;;;;;;22871:54;;22978:6;22958:16;:26;;22936:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;23072:42;23088:6;23096:9;23107:6;23072:15;:42::i;:::-;23152:43;23160:7;23188:6;23169:16;:25;23152:7;:43::i;:::-;;23226:4;23219:11;;;;22688:550;;;;;:::o;17701:170::-;17752:119;17701:170;:::o;16341:35::-;16374:2;16341:35;:::o;29981:176::-;30024:7;30044:15;30105:9;30094:20;;30142:7;30135:14;;;29981:176;:::o;16689:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;23386:102::-;23448:32;23458:10;23470:9;23448;:32::i;:::-;23386:102;:::o;17115:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;22159:111::-;22218:7;22245:8;:17;22254:7;22245:17;;;;;;;;;;;;;;;;22238:24;;22159:111;;;:::o;17952:41::-;;;;;;;;;;;;;;;;;:::o;15106:87::-;15152:7;15179:6;;;;;;;;;;;15172:13;;15106:87;:::o;16238:40::-;;;;;;;;;;;;;;;;;;;:::o;22530:150::-;22594:4;22611:39;22627:10;22639:2;22643:6;22611:15;:39::i;:::-;22668:4;22661:11;;22530:150;;;;:::o;25131:236::-;25196:7;25216:19;25238:14;:23;25253:7;25238:23;;;;;;;;;;;;;;;;;;;;;;;;;25216:45;;25307:1;25292:12;:16;;;:67;;25358:1;25292:67;;;25311:11;:20;25323:7;25311:20;;;;;;;;;;;;;;;:38;25347:1;25332:12;:16;;;;:::i;:::-;25311:38;;;;;;;;;;;;;;;:44;;;;;;;;;;;;25292:67;25272:87;;;;;25131:236;;;:::o;23922:1008::-;24105:23;17287:104;24234:4;;;;;;;;;;;;;;;;;24218:22;;;;;;24259:12;:10;:12::i;:::-;24298:4;24155:163;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24131:198;;;;;;24105:224;;24340:18;17540:71;24417:9;24428:5;24435:6;24385:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24361:92;;;;;;24340:113;;24464:14;24534:15;24551:10;24505:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24481:92;;;;;;24464:109;;24584:17;24604:26;24614:6;24622:1;24625;24628;24604:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24584:46;;24670:1;24649:23;;:9;:23;;;;24641:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;24738:6;:17;24745:9;24738:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;24729:5;:28;24721:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;24829:6;24810:15;:25;;24802:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24891:31;24901:9;24912;24891;:31::i;:::-;24884:38;;;;23922:1008;;;;;;:::o;20713:1243::-;20916:23;17287:104;21045:4;;;;;;;;;;;;;;;;;21029:22;;;;;;21070:12;:10;:12::i;:::-;21109:4;20966:163;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20942:198;;;;;;20916:224;;21151:18;17752:119;21259:5;21283:7;21309:6;21334;:13;21341:5;21334:13;;;;;;;;;;;;;;;;:15;;;;;;;;;:::i;:::-;;;;;21368:8;21196:195;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21172:230;;;;;;21151:251;;21413:14;21483:15;21500:10;21454:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21430:92;;;;;;21413:109;;21533:17;21553:26;21563:6;21571:1;21574;21577;21553:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21533:46;;21619:1;21598:23;;:9;:23;;;;21590:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;21691:5;21678:18;;:9;:18;;;21670:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;21781:8;21762:15;:27;;21740:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;21892:6;21863:10;:17;21874:5;21863:17;;;;;;;;;;;;;;;:26;21881:7;21863:26;;;;;;;;;;;;;;;:35;;;;21932:7;21916:32;;21925:5;21916:32;;;21941:6;21916:32;;;;;;:::i;:::-;;;;;;;;20713:1243;;;;;;;;;;;:::o;19145:171::-;19248:7;19280:10;:19;19291:7;19280:19;;;;;;;;;;;;;;;:28;19300:7;19280:28;;;;;;;;;;;;;;;;19273:35;;19145:171;;;;:::o;25798:1285::-;25906:7;25967:12;25953:11;:26;;;25931:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26054:19;26076:14;:23;26091:7;26076:23;;;;;;;;;;;;;;;;;;;;;;;;;26054:45;;26130:1;26114:12;:17;;;26110:58;;;26155:1;26148:8;;;;;26110:58;26280:11;26228:63;;:11;:20;26240:7;26228:20;;;;;;;;;;;;;;;:38;26264:1;26249:12;:16;;;;:::i;:::-;26228:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;26224:147;;26315:11;:20;26327:7;26315:20;;;;;;;;;;;;;;;:38;26351:1;26336:12;:16;;;;:::i;:::-;26315:38;;;;;;;;;;;;;;;:44;;;;;;;;;;;;26308:51;;;;;;;26224:147;26468:11;26432:47;;:11;:20;26444:7;26432:20;;;;;;;;;;;;;;;:23;26453:1;26432:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;26428:88;;;26503:1;26496:8;;;;;26428:88;26528:12;26555;26585:1;26570:12;:16;;;;:::i;:::-;26555:31;;26597:428;26612:5;26604:13;;:5;:13;;;26597:428;;;26634:13;26676:1;26667:5;26659;:13;;;;:::i;:::-;26658:19;;;;:::i;:::-;26650:5;:27;;;;:::i;:::-;26634:43;;26719:20;26742:11;:20;26754:7;26742:20;;;;;;;;;;;;;;;:28;26763:6;26742:28;;;;;;;;;;;;;;;26719:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26805:11;26789:27;;:2;:12;;;:27;;;26785:229;;;26844:2;:8;;;26837:15;;;;;;;;;;;26785:229;26893:11;26878:26;;:2;:12;;;:26;;;26874:140;;;26933:6;26925:14;;26874:140;;;26997:1;26988:6;:10;;;;:::i;:::-;26980:18;;26874:140;26597:428;;;;;27042:11;:20;27054:7;27042:20;;;;;;;;;;;;;;;:27;27063:5;27042:27;;;;;;;;;;;;;;;:33;;;;;;;;;;;;27035:40;;;;;;;25798:1285;;;;;:::o;17485:126::-;17540:71;17485:126;:::o;16978:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15561:229::-;15337:12;:10;:12::i;:::-;15326:23;;:7;:5;:7::i;:::-;:23;;;15318:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15684:1:::1;15664:22;;:8;:22;;;;15642:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;15763:19;15773:8;15763:9;:19::i;:::-;15561:229:::0;:::o;14464:98::-;14517:7;14544:10;14537:17;;14464:98;:::o;19754:471::-;19921:1;19904:19;;:5;:19;;;;19882:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;20048:1;20029:21;;:7;:21;;;;20007:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;20163:6;20134:10;:17;20145:5;20134:17;;;;;;;;;;;;;;;:26;20152:7;20134:26;;;;;;;;;;;;;;;:35;;;;20201:7;20185:32;;20194:5;20185:32;;;20210:6;20185:32;;;;;;:::i;:::-;;;;;;;;19754:471;;;:::o;27475:685::-;27634:1;27618:18;;:4;:18;;;;27596:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;27764:1;27750:16;;:2;:16;;;;27728:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27875:114;27908:6;27875:114;;;;;;;;;;;;;;;;;:8;:14;27884:4;27875:14;;;;;;;;;;;;;;;;:18;;:114;;;;;:::i;:::-;27858:8;:14;27867:4;27858:14;;;;;;;;;;;;;;;:131;;;;28017:24;28034:6;28017:8;:12;28026:2;28017:12;;;;;;;;;;;;;;;;:16;;:24;;;;:::i;:::-;28002:8;:12;28011:2;28002:12;;;;;;;;;;;;;;;:39;;;;28074:2;28059:26;;28068:4;28059:26;;;28078:6;28059:26;;;;;;:::i;:::-;;;;;;;;28098:54;28113:9;:15;28123:4;28113:15;;;;;;;;;;;;;;;;;;;;;;;;;28130:9;:13;28140:2;28130:13;;;;;;;;;;;;;;;;;;;;;;;;;28145:6;28098:14;:54::i;:::-;27475:685;;;:::o;27091:376::-;27168:23;27194:9;:20;27204:9;27194:20;;;;;;;;;;;;;;;;;;;;;;;;;27168:46;;27225:24;27252:8;:19;27261:9;27252:19;;;;;;;;;;;;;;;;27225:46;;27305:9;27282;:20;27292:9;27282:20;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;27376:9;27332:54;;27359:15;27332:54;;27348:9;27332:54;;;;;;;;;;;;27399:60;27414:15;27431:9;27442:16;27399:14;:60::i;:::-;27091:376;;;;:::o;15798:173::-;15854:16;15873:6;;;;;;;;;;;15854:25;;15899:8;15890:6;;:17;;;;;;;;;;;;;;;;;;15954:8;15923:40;;15944:8;15923:40;;;;;;;;;;;;15798:173;;:::o;4850:240::-;4970:7;5028:1;5023;:6;;5031:12;5015:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5070:1;5066;:5;5059:12;;4850:240;;;;;:::o;2571:98::-;2629:7;2660:1;2656;:5;;;;:::i;:::-;2649:12;;2571:98;;;;:::o;28168:1076::-;28308:6;28298:16;;:6;:16;;;;:30;;;;;28327:1;28318:6;:10;28298:30;28294:943;;;28367:1;28349:20;;:6;:20;;;28345:484;;28390:16;28409:14;:22;28424:6;28409:22;;;;;;;;;;;;;;;;;;;;;;;;;28390:41;;28450:17;28482:1;28470:9;:13;;;:102;;28571:1;28470:102;;;28507:11;:19;28519:6;28507:19;;;;;;;;;;;;;;;:34;28539:1;28527:9;:13;;;;:::i;:::-;28507:34;;;;;;;;;;;;;;;:40;;;;;;;;;;;;28470:102;28450:122;;;;28591:17;28611:124;28647:6;28611:124;;;;;;;;;;;;;;;;;:9;:13;;:124;;;;;:::i;:::-;28591:144;;28756:57;28773:6;28781:9;28792;28803;28756:16;:57::i;:::-;28345:484;;;;28867:1;28849:20;;:6;:20;;;28845:381;;28890:16;28909:14;:22;28924:6;28909:22;;;;;;;;;;;;;;;;;;;;;;;;;28890:41;;28950:17;28982:1;28970:9;:13;;;:102;;29071:1;28970:102;;;29007:11;:19;29019:6;29007:19;;;;;;;;;;;;;;;:34;29039:1;29027:9;:13;;;;:::i;:::-;29007:34;;;;;;;;;;;;;;;:40;;;;;;;;;;;;28970:102;28950:122;;;;29091:17;29111:21;29125:6;29111:9;:13;;:21;;;;:::i;:::-;29091:41;;29153:57;29170:6;29178:9;29189;29200;29153:16;:57::i;:::-;28845:381;;;;28294:943;28168:1076;;;:::o;29252:721::-;29417:14;29434:20;:8;:18;:20::i;:::-;29417:37;;29498:1;29483:12;:16;;;:99;;;;;29570:12;29516:11;:22;29528:9;29516:22;;;;;;;;;;;;;;;:40;29554:1;29539:12;:16;;;;:::i;:::-;29516:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:66;;;29483:99;29465:434;;;29658:6;29609:11;:22;29621:9;29609:22;;;;;;;;;;;;;;;:40;29647:1;29632:12;:16;;;;:::i;:::-;29609:40;;;;;;;;;;;;;;;:46;;;:55;;;;;;;;;;;;;;;;;;29465:434;;;29736:92;;;;;;;;29765:23;:12;:21;:23::i;:::-;29736:92;;;;;;29807:6;29736:92;;;;;29697:11;:22;29709:9;29697:22;;;;;;;;;;;;;;;:36;29720:12;29697:36;;;;;;;;;;;;;;;:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29886:1;29871:12;:16;;;;:::i;:::-;29843:14;:25;29858:9;29843:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;29465:434;29937:9;29916:49;;;29948:8;29958:6;29916:49;;;;;;;:::i;:::-;;;;;;;;29252:721;;;;;:::o;7055:232::-;7112:7;7163:17;7154:26;;:5;:26;;7132:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;7273:5;7258:21;;7055:232;;;:::o;9173:227::-;9229:6;9279:16;9270:25;;:5;:25;;9248:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;9386:5;9372:20;;9173:227;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:139::-;;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;349:87;;;;:::o;442:137::-;;525:6;512:20;503:29;;541:32;567:5;541:32;:::i;:::-;493:86;;;;:::o;585:135::-;;667:6;654:20;645:29;;683:31;708:5;683:31;:::i;:::-;635:85;;;;:::o;726:262::-;;834:2;822:9;813:7;809:23;805:32;802:2;;;850:1;847;840:12;802:2;893:1;918:53;963:7;954:6;943:9;939:22;918:53;:::i;:::-;908:63;;864:117;792:196;;;;:::o;994:407::-;;;1119:2;1107:9;1098:7;1094:23;1090:32;1087:2;;;1135:1;1132;1125:12;1087:2;1178:1;1203:53;1248:7;1239:6;1228:9;1224:22;1203:53;:::i;:::-;1193:63;;1149:117;1305:2;1331:53;1376:7;1367:6;1356:9;1352:22;1331:53;:::i;:::-;1321:63;;1276:118;1077:324;;;;;:::o;1407:552::-;;;;1549:2;1537:9;1528:7;1524:23;1520:32;1517:2;;;1565:1;1562;1555:12;1517:2;1608:1;1633:53;1678:7;1669:6;1658:9;1654:22;1633:53;:::i;:::-;1623:63;;1579:117;1735:2;1761:53;1806:7;1797:6;1786:9;1782:22;1761:53;:::i;:::-;1751:63;;1706:118;1863:2;1889:53;1934:7;1925:6;1914:9;1910:22;1889:53;:::i;:::-;1879:63;;1834:118;1507:452;;;;;:::o;1965:1132::-;;;;;;;;2173:3;2161:9;2152:7;2148:23;2144:33;2141:2;;;2190:1;2187;2180:12;2141:2;2233:1;2258:53;2303:7;2294:6;2283:9;2279:22;2258:53;:::i;:::-;2248:63;;2204:117;2360:2;2386:53;2431:7;2422:6;2411:9;2407:22;2386:53;:::i;:::-;2376:63;;2331:118;2488:2;2514:53;2559:7;2550:6;2539:9;2535:22;2514:53;:::i;:::-;2504:63;;2459:118;2616:2;2642:53;2687:7;2678:6;2667:9;2663:22;2642:53;:::i;:::-;2632:63;;2587:118;2744:3;2771:51;2814:7;2805:6;2794:9;2790:22;2771:51;:::i;:::-;2761:61;;2715:117;2871:3;2898:53;2943:7;2934:6;2923:9;2919:22;2898:53;:::i;:::-;2888:63;;2842:119;3000:3;3027:53;3072:7;3063:6;3052:9;3048:22;3027:53;:::i;:::-;3017:63;;2971:119;2131:966;;;;;;;;;;:::o;3103:407::-;;;3228:2;3216:9;3207:7;3203:23;3199:32;3196:2;;;3244:1;3241;3234:12;3196:2;3287:1;3312:53;3357:7;3348:6;3337:9;3333:22;3312:53;:::i;:::-;3302:63;;3258:117;3414:2;3440:53;3485:7;3476:6;3465:9;3461:22;3440:53;:::i;:::-;3430:63;;3385:118;3186:324;;;;;:::o;3516:986::-;;;;;;;3707:3;3695:9;3686:7;3682:23;3678:33;3675:2;;;3724:1;3721;3714:12;3675:2;3767:1;3792:53;3837:7;3828:6;3817:9;3813:22;3792:53;:::i;:::-;3782:63;;3738:117;3894:2;3920:53;3965:7;3956:6;3945:9;3941:22;3920:53;:::i;:::-;3910:63;;3865:118;4022:2;4048:53;4093:7;4084:6;4073:9;4069:22;4048:53;:::i;:::-;4038:63;;3993:118;4150:2;4176:51;4219:7;4210:6;4199:9;4195:22;4176:51;:::i;:::-;4166:61;;4121:116;4276:3;4303:53;4348:7;4339:6;4328:9;4324:22;4303:53;:::i;:::-;4293:63;;4247:119;4405:3;4432:53;4477:7;4468:6;4457:9;4453:22;4432:53;:::i;:::-;4422:63;;4376:119;3665:837;;;;;;;;:::o;4508:405::-;;;4632:2;4620:9;4611:7;4607:23;4603:32;4600:2;;;4648:1;4645;4638:12;4600:2;4691:1;4716:53;4761:7;4752:6;4741:9;4737:22;4716:53;:::i;:::-;4706:63;;4662:117;4818:2;4844:52;4888:7;4879:6;4868:9;4864:22;4844:52;:::i;:::-;4834:62;;4789:117;4590:323;;;;;:::o;4919:118::-;5006:24;5024:5;5006:24;:::i;:::-;5001:3;4994:37;4984:53;;:::o;5043:109::-;5124:21;5139:5;5124:21;:::i;:::-;5119:3;5112:34;5102:50;;:::o;5158:118::-;5245:24;5263:5;5245:24;:::i;:::-;5240:3;5233:37;5223:53;;:::o;5282:157::-;5387:45;5407:24;5425:5;5407:24;:::i;:::-;5387:45;:::i;:::-;5382:3;5375:58;5365:74;;:::o;5445:364::-;;5561:39;5594:5;5561:39;:::i;:::-;5616:71;5680:6;5675:3;5616:71;:::i;:::-;5609:78;;5696:52;5741:6;5736:3;5729:4;5722:5;5718:16;5696:52;:::i;:::-;5773:29;5795:6;5773:29;:::i;:::-;5768:3;5764:39;5757:46;;5537:272;;;;;:::o;5815:377::-;;5978:67;6042:2;6037:3;5978:67;:::i;:::-;5971:74;;6075:34;6071:1;6066:3;6062:11;6055:55;6141:15;6136:2;6131:3;6127:12;6120:37;6183:2;6178:3;6174:12;6167:19;;5961:231;;;:::o;6198:370::-;;6361:67;6425:2;6420:3;6361:67;:::i;:::-;6354:74;;6458:34;6454:1;6449:3;6445:11;6438:55;6524:8;6519:2;6514:3;6510:12;6503:30;6559:2;6554:3;6550:12;6543:19;;6344:224;;;:::o;6574:327::-;;6737:67;6801:2;6796:3;6737:67;:::i;:::-;6730:74;;6834:31;6830:1;6825:3;6821:11;6814:52;6892:2;6887:3;6883:12;6876:19;;6720:181;;;:::o;6907:385::-;;7070:67;7134:2;7129:3;7070:67;:::i;:::-;7063:74;;7167:34;7163:1;7158:3;7154:11;7147:55;7233:23;7228:2;7223:3;7219:12;7212:45;7283:2;7278:3;7274:12;7267:19;;7053:239;;;:::o;7298:381::-;;7461:67;7525:2;7520:3;7461:67;:::i;:::-;7454:74;;7558:34;7554:1;7549:3;7545:11;7538:55;7624:19;7619:2;7614:3;7610:12;7603:41;7670:2;7665:3;7661:12;7654:19;;7444:235;;;:::o;7685:365::-;;7848:67;7912:2;7907:3;7848:67;:::i;:::-;7841:74;;7945:34;7941:1;7936:3;7932:11;7925:55;8011:3;8006:2;8001:3;7997:12;7990:25;8041:2;8036:3;8032:12;8025:19;;7831:219;;;:::o;8056:396::-;;8237:84;8319:1;8314:3;8237:84;:::i;:::-;8230:91;;8351:66;8347:1;8342:3;8338:11;8331:87;8444:1;8439:3;8435:11;8428:18;;8220:232;;;:::o;8458:326::-;;8621:67;8685:2;8680:3;8621:67;:::i;:::-;8614:74;;8718:30;8714:1;8709:3;8705:11;8698:51;8775:2;8770:3;8766:12;8759:19;;8604:180;;;:::o;8790:330::-;;8953:67;9017:2;9012:3;8953:67;:::i;:::-;8946:74;;9050:34;9046:1;9041:3;9037:11;9030:55;9111:2;9106:3;9102:12;9095:19;;8936:184;;;:::o;9126:371::-;;9289:67;9353:2;9348:3;9289:67;:::i;:::-;9282:74;;9386:34;9382:1;9377:3;9373:11;9366:55;9452:9;9447:2;9442:3;9438:12;9431:31;9488:2;9483:3;9479:12;9472:19;;9272:225;;;:::o;9503:383::-;;9666:67;9730:2;9725:3;9666:67;:::i;:::-;9659:74;;9763:34;9759:1;9754:3;9750:11;9743:55;9829:21;9824:2;9819:3;9815:12;9808:43;9877:2;9872:3;9868:12;9861:19;;9649:237;;;:::o;9892:370::-;;10055:67;10119:2;10114:3;10055:67;:::i;:::-;10048:74;;10152:34;10148:1;10143:3;10139:11;10132:55;10218:8;10213:2;10208:3;10204:12;10197:30;10253:2;10248:3;10244:12;10237:19;;10038:224;;;:::o;10268:366::-;;10431:67;10495:2;10490:3;10431:67;:::i;:::-;10424:74;;10528:34;10524:1;10519:3;10515:11;10508:55;10594:4;10589:2;10584:3;10580:12;10573:26;10625:2;10620:3;10616:12;10609:19;;10414:220;;;:::o;10640:375::-;;10803:67;10867:2;10862:3;10803:67;:::i;:::-;10796:74;;10900:34;10896:1;10891:3;10887:11;10880:55;10966:13;10961:2;10956:3;10952:12;10945:35;11006:2;11001:3;10997:12;10990:19;;10786:229;;;:::o;11021:365::-;;11184:67;11248:2;11243:3;11184:67;:::i;:::-;11177:74;;11281:34;11277:1;11272:3;11268:11;11261:55;11347:3;11342:2;11337:3;11333:12;11326:25;11377:2;11372:3;11368:12;11361:19;;11167:219;;;:::o;11392:118::-;11479:24;11497:5;11479:24;:::i;:::-;11474:3;11467:37;11457:53;;:::o;11516:131::-;11603:37;11634:5;11603:37;:::i;:::-;11598:3;11591:50;11581:66;;:::o;11653:118::-;11740:24;11758:5;11740:24;:::i;:::-;11735:3;11728:37;11718:53;;:::o;11777:115::-;11862:23;11879:5;11862:23;:::i;:::-;11857:3;11850:36;11840:52;;:::o;11898:112::-;11981:22;11997:5;11981:22;:::i;:::-;11976:3;11969:35;11959:51;;:::o;12016:663::-;;12279:148;12423:3;12279:148;:::i;:::-;12272:155;;12437:75;12508:3;12499:6;12437:75;:::i;:::-;12537:2;12532:3;12528:12;12521:19;;12550:75;12621:3;12612:6;12550:75;:::i;:::-;12650:2;12645:3;12641:12;12634:19;;12670:3;12663:10;;12261:418;;;;;:::o;12685:222::-;;12816:2;12805:9;12801:18;12793:26;;12829:71;12897:1;12886:9;12882:17;12873:6;12829:71;:::i;:::-;12783:124;;;;:::o;12913:210::-;;13038:2;13027:9;13023:18;13015:26;;13051:65;13113:1;13102:9;13098:17;13089:6;13051:65;:::i;:::-;13005:118;;;;:::o;13129:222::-;;13260:2;13249:9;13245:18;13237:26;;13273:71;13341:1;13330:9;13326:17;13317:6;13273:71;:::i;:::-;13227:124;;;;:::o;13357:775::-;;13628:3;13617:9;13613:19;13605:27;;13642:71;13710:1;13699:9;13695:17;13686:6;13642:71;:::i;:::-;13723:72;13791:2;13780:9;13776:18;13767:6;13723:72;:::i;:::-;13805;13873:2;13862:9;13858:18;13849:6;13805:72;:::i;:::-;13887;13955:2;13944:9;13940:18;13931:6;13887:72;:::i;:::-;13969:73;14037:3;14026:9;14022:19;14013:6;13969:73;:::i;:::-;14052;14120:3;14109:9;14105:19;14096:6;14052:73;:::i;:::-;13595:537;;;;;;;;;:::o;14138:553::-;;14353:3;14342:9;14338:19;14330:27;;14367:71;14435:1;14424:9;14420:17;14411:6;14367:71;:::i;:::-;14448:72;14516:2;14505:9;14501:18;14492:6;14448:72;:::i;:::-;14530;14598:2;14587:9;14583:18;14574:6;14530:72;:::i;:::-;14612;14680:2;14669:9;14665:18;14656:6;14612:72;:::i;:::-;14320:371;;;;;;;:::o;14697:553::-;;14912:3;14901:9;14897:19;14889:27;;14926:71;14994:1;14983:9;14979:17;14970:6;14926:71;:::i;:::-;15007:72;15075:2;15064:9;15060:18;15051:6;15007:72;:::i;:::-;15089;15157:2;15146:9;15142:18;15133:6;15089:72;:::i;:::-;15171;15239:2;15228:9;15224:18;15215:6;15171:72;:::i;:::-;14879:371;;;;;;;:::o;15256:545::-;;15467:3;15456:9;15452:19;15444:27;;15481:71;15549:1;15538:9;15534:17;15525:6;15481:71;:::i;:::-;15562:68;15626:2;15615:9;15611:18;15602:6;15562:68;:::i;:::-;15640:72;15708:2;15697:9;15693:18;15684:6;15640:72;:::i;:::-;15722;15790:2;15779:9;15775:18;15766:6;15722:72;:::i;:::-;15434:367;;;;;;;:::o;15807:313::-;;15958:2;15947:9;15943:18;15935:26;;16007:9;16001:4;15997:20;15993:1;15982:9;15978:17;15971:47;16035:78;16108:4;16099:6;16035:78;:::i;:::-;16027:86;;15925:195;;;;:::o;16126:419::-;;16330:2;16319:9;16315:18;16307:26;;16379:9;16373:4;16369:20;16365:1;16354:9;16350:17;16343:47;16407:131;16533:4;16407:131;:::i;:::-;16399:139;;16297:248;;;:::o;16551:419::-;;16755:2;16744:9;16740:18;16732:26;;16804:9;16798:4;16794:20;16790:1;16779:9;16775:17;16768:47;16832:131;16958:4;16832:131;:::i;:::-;16824:139;;16722:248;;;:::o;16976:419::-;;17180:2;17169:9;17165:18;17157:26;;17229:9;17223:4;17219:20;17215:1;17204:9;17200:17;17193:47;17257:131;17383:4;17257:131;:::i;:::-;17249:139;;17147:248;;;:::o;17401:419::-;;17605:2;17594:9;17590:18;17582:26;;17654:9;17648:4;17644:20;17640:1;17629:9;17625:17;17618:47;17682:131;17808:4;17682:131;:::i;:::-;17674:139;;17572:248;;;:::o;17826:419::-;;18030:2;18019:9;18015:18;18007:26;;18079:9;18073:4;18069:20;18065:1;18054:9;18050:17;18043:47;18107:131;18233:4;18107:131;:::i;:::-;18099:139;;17997:248;;;:::o;18251:419::-;;18455:2;18444:9;18440:18;18432:26;;18504:9;18498:4;18494:20;18490:1;18479:9;18475:17;18468:47;18532:131;18658:4;18532:131;:::i;:::-;18524:139;;18422:248;;;:::o;18676:419::-;;18880:2;18869:9;18865:18;18857:26;;18929:9;18923:4;18919:20;18915:1;18904:9;18900:17;18893:47;18957:131;19083:4;18957:131;:::i;:::-;18949:139;;18847:248;;;:::o;19101:419::-;;19305:2;19294:9;19290:18;19282:26;;19354:9;19348:4;19344:20;19340:1;19329:9;19325:17;19318:47;19382:131;19508:4;19382:131;:::i;:::-;19374:139;;19272:248;;;:::o;19526:419::-;;19730:2;19719:9;19715:18;19707:26;;19779:9;19773:4;19769:20;19765:1;19754:9;19750:17;19743:47;19807:131;19933:4;19807:131;:::i;:::-;19799:139;;19697:248;;;:::o;19951:419::-;;20155:2;20144:9;20140:18;20132:26;;20204:9;20198:4;20194:20;20190:1;20179:9;20175:17;20168:47;20232:131;20358:4;20232:131;:::i;:::-;20224:139;;20122:248;;;:::o;20376:419::-;;20580:2;20569:9;20565:18;20557:26;;20629:9;20623:4;20619:20;20615:1;20604:9;20600:17;20593:47;20657:131;20783:4;20657:131;:::i;:::-;20649:139;;20547:248;;;:::o;20801:419::-;;21005:2;20994:9;20990:18;20982:26;;21054:9;21048:4;21044:20;21040:1;21029:9;21025:17;21018:47;21082:131;21208:4;21082:131;:::i;:::-;21074:139;;20972:248;;;:::o;21226:419::-;;21430:2;21419:9;21415:18;21407:26;;21479:9;21473:4;21469:20;21465:1;21454:9;21450:17;21443:47;21507:131;21633:4;21507:131;:::i;:::-;21499:139;;21397:248;;;:::o;21651:419::-;;21855:2;21844:9;21840:18;21832:26;;21904:9;21898:4;21894:20;21890:1;21879:9;21875:17;21868:47;21932:131;22058:4;21932:131;:::i;:::-;21924:139;;21822:248;;;:::o;22076:222::-;;22207:2;22196:9;22192:18;22184:26;;22220:71;22288:1;22277:9;22273:17;22264:6;22220:71;:::i;:::-;22174:124;;;;:::o;22304:332::-;;22463:2;22452:9;22448:18;22440:26;;22476:71;22544:1;22533:9;22529:17;22520:6;22476:71;:::i;:::-;22557:72;22625:2;22614:9;22610:18;22601:6;22557:72;:::i;:::-;22430:206;;;;;:::o;22642:218::-;;22771:2;22760:9;22756:18;22748:26;;22784:69;22850:1;22839:9;22835:17;22826:6;22784:69;:::i;:::-;22738:122;;;;:::o;22866:328::-;;23023:2;23012:9;23008:18;23000:26;;23036:69;23102:1;23091:9;23087:17;23078:6;23036:69;:::i;:::-;23115:72;23183:2;23172:9;23168:18;23159:6;23115:72;:::i;:::-;22990:204;;;;;:::o;23200:214::-;;23327:2;23316:9;23312:18;23304:26;;23340:67;23404:1;23393:9;23389:17;23380:6;23340:67;:::i;:::-;23294:120;;;;:::o;23420:99::-;;23506:5;23500:12;23490:22;;23479:40;;;:::o;23525:169::-;;23643:6;23638:3;23631:19;23683:4;23678:3;23674:14;23659:29;;23621:73;;;;:::o;23700:148::-;;23839:3;23824:18;;23814:34;;;;:::o;23854:305::-;;23913:20;23931:1;23913:20;:::i;:::-;23908:25;;23947:20;23965:1;23947:20;:::i;:::-;23942:25;;24101:1;24033:66;24029:74;24026:1;24023:81;24020:2;;;24107:18;;:::i;:::-;24020:2;24151:1;24148;24144:9;24137:16;;23898:261;;;;:::o;24165:246::-;;24223:19;24240:1;24223:19;:::i;:::-;24218:24;;24256:19;24273:1;24256:19;:::i;:::-;24251:24;;24353:1;24341:10;24337:18;24334:1;24331:25;24328:2;;;24359:18;;:::i;:::-;24328:2;24403:1;24400;24396:9;24389:16;;24208:203;;;;:::o;24417:182::-;;24473:19;24490:1;24473:19;:::i;:::-;24468:24;;24506:19;24523:1;24506:19;:::i;:::-;24501:24;;24544:1;24534:2;;24549:18;;:::i;:::-;24534:2;24591:1;24588;24584:9;24579:14;;24458:141;;;;:::o;24605:188::-;;24664:19;24681:1;24664:19;:::i;:::-;24659:24;;24697:19;24714:1;24697:19;:::i;:::-;24692:24;;24735:1;24732;24729:8;24726:2;;;24740:18;;:::i;:::-;24726:2;24785:1;24782;24778:9;24770:17;;24649:144;;;;:::o;24799:96::-;;24865:24;24883:5;24865:24;:::i;:::-;24854:35;;24844:51;;;:::o;24901:90::-;;24978:5;24971:13;24964:21;24953:32;;24943:48;;;:::o;24997:77::-;;25063:5;25052:16;;25042:32;;;:::o;25080:126::-;;25157:42;25150:5;25146:54;25135:65;;25125:81;;;:::o;25212:142::-;;25289:58;25282:5;25278:70;25267:81;;25257:97;;;:::o;25360:77::-;;25426:5;25415:16;;25405:32;;;:::o;25443:93::-;;25519:10;25512:5;25508:22;25497:33;;25487:49;;;:::o;25542:86::-;;25617:4;25610:5;25606:16;25595:27;;25585:43;;;:::o;25634:113::-;;25717:24;25735:5;25717:24;:::i;:::-;25704:37;;25694:53;;;:::o;25753:307::-;25821:1;25831:113;25845:6;25842:1;25839:13;25831:113;;;25930:1;25925:3;25921:11;25915:18;25911:1;25906:3;25902:11;25895:39;25867:2;25864:1;25860:10;25855:15;;25831:113;;;25962:6;25959:1;25956:13;25953:2;;;26042:1;26033:6;26028:3;26024:16;26017:27;25953:2;25802:258;;;;:::o;26066:233::-;;26128:24;26146:5;26128:24;:::i;:::-;26119:33;;26174:66;26167:5;26164:77;26161:2;;;26244:18;;:::i;:::-;26161:2;26291:1;26284:5;26280:13;26273:20;;26109:190;;;:::o;26305:79::-;;26373:5;26362:16;;26352:32;;;:::o;26390:180::-;26438:77;26435:1;26428:88;26535:4;26532:1;26525:15;26559:4;26556:1;26549:15;26576:180;26624:77;26621:1;26614:88;26721:4;26718:1;26711:15;26745:4;26742:1;26735:15;26762:102;;26854:2;26850:7;26845:2;26838:5;26834:14;26830:28;26820:38;;26810:54;;;:::o;26870:122::-;26943:24;26961:5;26943:24;:::i;:::-;26936:5;26933:35;26923:2;;26982:1;26979;26972:12;26923:2;26913:79;:::o;26998:122::-;27071:24;27089:5;27071:24;:::i;:::-;27064:5;27061:35;27051:2;;27110:1;27107;27100:12;27051:2;27041:79;:::o;27126:122::-;27199:24;27217:5;27199:24;:::i;:::-;27192:5;27189:35;27179:2;;27238:1;27235;27228:12;27179:2;27169:79;:::o;27254:120::-;27326:23;27343:5;27326:23;:::i;:::-;27319:5;27316:34;27306:2;;27364:1;27361;27354:12;27306:2;27296:78;:::o;27380:118::-;27451:22;27467:5;27451:22;:::i;:::-;27444:5;27441:33;27431:2;;27488:1;27485;27478:12;27431:2;27421:77;:::o

Swarm Source

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