ETH Price: $3,104.82 (-0.03%)
Gas: 5 Gwei

Token

SafeSwap (SSGT)
 

Overview

Max Total Supply

210,000,000 SSGT

Holders

245 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
580.028561516572339733 SSGT

Value
$0.00
0x58a7640f2486983ed682b808082efd7ed5b5d8a8
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

SSGT is YFDAI Decentralised Exchange Name Safeswap and YFDAI community Voted Secondary Token by YFDAI.FINANCE. It will provide a mechanism to streamline YFDAI governance voting. Additional utility baked in to SSGT is also designed to provide SafeSwap liquidity.

Market

Volume (24H):$0.00
Market Capitalization:$0.00
Circulating Supply:0.00 SSGT
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SafeSwap

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity)Audit Report

/**
 *Submitted for verification at Etherscan.io on 2021-05-07
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

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

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

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

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






/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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





/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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








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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The defaut value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

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

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

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

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

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

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

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

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





// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
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. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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;
        }
    }
}

// File: contracts/SSGT.sol







// StackToken with Governance.
contract SafeSwap is ERC20("SafeSwap", "SSGT") {
    /// @notice Mints 100 Million STACK token to the 'token_holder' address.
    using SafeMath for uint256;
    constructor(address token_holder)  {
        uint256 amount = 210000000e18;
        _mint(token_holder, amount);
        _moveDelegates(address(0), _delegates[token_holder], amount);
    }

    // Copied and modified from YAM code:
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol

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

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

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

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

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

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

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

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

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

    /**
     * @notice Returns delegates for delegator
     * @param delegator The address to get delegates for
     */
    function delegates(address delegator) external view returns (address) {
        return _delegates[delegator];
    }

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

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

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

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

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

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

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

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

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

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

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

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); // balance of underlying STACKs (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

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

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

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

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

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

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

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        _moveDelegates(_delegates[from], _delegates[to], amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"token_holder","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":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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"}]

60806040523480156200001157600080fd5b5060405162003bef38038062003bef833981810160405281019062000037919062000a95565b6040518060400160405280600881526020017f53616665537761700000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f53534754000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000bb929190620009ce565b508060049080519060200190620000d4929190620009ce565b50505060006aadb53acfa41aee120000009050620000f982826200017460201b60201c565b6200016c6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683620002d960201b60201c565b505062000e58565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001de9062000b79565b60405180910390fd5b620001fb60008383620005b260201b60201c565b80600260008282546200020f919062000c01565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000266919062000c01565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002cd919062000b9b565b60405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015620003165750600081115b15620005ad57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000464576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611620003bd5760006200042c565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846200040d919062000cda565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006200044a84836200068860201b620012011790919060201c565b90506200046086848484620006a060201b60201c565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620005ac576000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116200050557600062000574565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018462000555919062000cda565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006200059284836200095d60201b620012171790919060201c565b9050620005a885848484620006a060201b60201c565b5050505b5b505050565b62000683600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683620002d960201b60201c565b505050565b6000818362000698919062000c9f565b905092915050565b6000620006cd4360405180606001604052806035815260200162003bba603591396200097560201b60201c565b905060008463ffffffff161180156200076e57508063ffffffff16600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018762000738919062000cda565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b15620007ec5781600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187620007c5919062000cda565b63ffffffff1663ffffffff1681526020019081526020016000206001018190555062000904565b60405180604001604052808263ffffffff16815260200183815250600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160010155905050600184620008a6919062000c5e565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516200094e92919062000bb8565b60405180910390a25050505050565b600081836200096d919062000c01565b905092915050565b600064010000000083108290620009c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009bb919062000b55565b60405180910390fd5b5082905092915050565b828054620009dc9062000d99565b90600052602060002090601f01602090048101928262000a00576000855562000a4c565b82601f1062000a1b57805160ff191683800117855562000a4c565b8280016001018555821562000a4c579182015b8281111562000a4b57825182559160200191906001019062000a2e565b5b50905062000a5b919062000a5f565b5090565b5b8082111562000a7a57600081600090555060010162000a60565b5090565b60008151905062000a8f8162000e3e565b92915050565b60006020828403121562000aa857600080fd5b600062000ab88482850162000a7e565b91505092915050565b600062000ace8262000be5565b62000ada818562000bf0565b935062000aec81856020860162000d63565b62000af78162000e2d565b840191505092915050565b600062000b11601f8362000bf0565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b62000b4f8162000d49565b82525050565b6000602082019050818103600083015262000b71818462000ac1565b905092915050565b6000602082019050818103600083015262000b948162000b02565b9050919050565b600060208201905062000bb2600083018462000b44565b92915050565b600060408201905062000bcf600083018562000b44565b62000bde602083018462000b44565b9392505050565b600081519050919050565b600082825260208201905092915050565b600062000c0e8262000d49565b915062000c1b8362000d49565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c535762000c5262000dcf565b5b828201905092915050565b600062000c6b8262000d53565b915062000c788362000d53565b92508263ffffffff0382111562000c945762000c9362000dcf565b5b828201905092915050565b600062000cac8262000d49565b915062000cb98362000d49565b92508282101562000ccf5762000cce62000dcf565b5b828203905092915050565b600062000ce78262000d53565b915062000cf48362000d53565b92508282101562000d0a5762000d0962000dcf565b5b828203905092915050565b600062000d228262000d29565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60005b8381101562000d8357808201518184015260208101905062000d66565b8381111562000d93576000848401525b50505050565b6000600282049050600182168062000db257607f821691505b6020821081141562000dc95762000dc862000dfe565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b62000e498162000d15565b811462000e5557600080fd5b50565b612d528062000e686000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a9059cbb1161007c578063a9059cbb1461039e578063b4b5ea57146103ce578063c3cda520146103fe578063dd62ed3e1461041a578063e7a324dc1461044a578063f1127ed81461046857610137565b806370a08231146102c0578063782d6fe1146102f05780637ecebe001461032057806395d89b4114610350578063a457c2d71461036e57610137565b8063313ce567116100ff578063313ce567146101f65780633950935114610214578063587cde1e146102445780635c19a95c146102745780636fcfff451461029057610137565b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461018a57806320606b70146101a857806323b872dd146101c6575b600080fd5b610144610499565b604051610151919061273a565b60405180910390f35b610174600480360381019061016f9190611f96565b61052b565b6040516101819190612635565b60405180910390f35b610192610549565b60405161019f91906128bc565b60405180910390f35b6101b0610553565b6040516101bd9190612650565b60405180910390f35b6101e060048036038101906101db9190611f47565b610577565b6040516101ed9190612635565b60405180910390f35b6101fe610678565b60405161020b9190612944565b60405180910390f35b61022e60048036038101906102299190611f96565b610681565b60405161023b9190612635565b60405180910390f35b61025e60048036038101906102599190611ee2565b61072d565b60405161026b919061261a565b60405180910390f35b61028e60048036038101906102899190611ee2565b610796565b005b6102aa60048036038101906102a59190611ee2565b6107a3565b6040516102b79190612900565b60405180910390f35b6102da60048036038101906102d59190611ee2565b6107c6565b6040516102e791906128bc565b60405180910390f35b61030a60048036038101906103059190611f96565b61080e565b60405161031791906128bc565b60405180910390f35b61033a60048036038101906103359190611ee2565b610be5565b60405161034791906128bc565b60405180910390f35b610358610bfd565b604051610365919061273a565b60405180910390f35b61038860048036038101906103839190611f96565b610c8f565b6040516103959190612635565b60405180910390f35b6103b860048036038101906103b39190611f96565b610d83565b6040516103c59190612635565b60405180910390f35b6103e860048036038101906103e39190611ee2565b610da1565b6040516103f591906128bc565b60405180910390f35b61041860048036038101906104139190611fd2565b610e80565b005b610434600480360381019061042f9190611f0b565b611115565b60405161044191906128bc565b60405180910390f35b61045261119c565b60405161045f9190612650565b60405180910390f35b610482600480360381019061047d919061205b565b6111c0565b60405161049092919061291b565b60405180910390f35b6060600380546104a890612b51565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490612b51565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050505050905090565b600061053f61053861122d565b8484611235565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610584848484611400565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006105cf61122d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561064f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610646906127fc565b60405180910390fd5b61066c8561065b61122d565b85846106679190612a47565b611235565b60019150509392505050565b60006012905090565b600061072361068e61122d565b84846001600061069c61122d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461071e9190612986565b611235565b6001905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6107a0338261167f565b50565b60076020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000438210610852576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610849906127dc565b60405180910390fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1614156108bf576000915050610bdf565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461090e9190612a7b565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16116109bb57600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836109959190612a7b565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610bdf565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610a3c576000915050610bdf565b600080600183610a4c9190612a7b565b90505b8163ffffffff168163ffffffff161115610b7957600060028383610a739190612a7b565b610a7d9190612a16565b82610a889190612a7b565b90506000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415610b4857806020015195505050505050610bdf565b86816000015163ffffffff161015610b6257819350610b72565b600182610b6f9190612a7b565b92505b5050610a4f565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60086020528060005260406000206000915090505481565b606060048054610c0c90612b51565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3890612b51565b8015610c855780601f10610c5a57610100808354040283529160200191610c85565b820191906000526020600020905b815481529060010190602001808311610c6857829003601f168201915b5050505050905090565b60008060016000610c9e61122d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d529061289c565b60405180910390fd5b610d78610d6661122d565b858584610d739190612a47565b611235565b600191505092915050565b6000610d97610d9061122d565b8484611400565b6001905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611610e0b576000610e78565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610e599190612a7b565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610eab610499565b80519060200120610eba6117f0565b30604051602001610ece94939291906126b0565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001610f1f949392919061266b565b60405160208183030381529060405280519060200120905060008282604051602001610f4c9291906125e3565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610f8994939291906126f5565b6020604051602081039080840390855afa158015610fab573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e9061285c565b60405180910390fd5b600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061107790612b83565b9190505589146110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b39061279c565b60405180910390fd5b874211156110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f69061283c565b60405180910390fd5b611109818b61167f565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6006602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b6000818361120f9190612a47565b905092915050565b600081836112259190612986565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c9061287c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c9061277c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113f391906128bc565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114679061281c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d79061275c565b60405180910390fd5b6114eb8383836117fd565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611571576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611568906127bc565b60405180910390fd5b818161157d9190612a47565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160d9190612986565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167191906128bc565b60405180910390a350505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006116ee846107c6565b905082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46117ea8284836118cb565b50505050565b6000804690508091505090565b6118c6600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836118cb565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156119075750600081115b15611b7557600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611a40576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116119aa576000611a17565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846119f89190612a7b565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611a2e848361120190919063ffffffff16565b9050611a3c86848484611b7a565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611b74576000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611ade576000611b4b565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611b2c9190612a7b565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611b62848361121790919063ffffffff16565b9050611b7085848484611b7a565b5050505b5b505050565b6000611b9e43604051806060016040528060358152602001612ce860359139611e23565b905060008463ffffffff16118015611c3c57508063ffffffff16600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187611c069190612a7b565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b15611cb65781600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187611c909190612a7b565b63ffffffff1663ffffffff16815260200190815260200160002060010181905550611dcc565b60405180604001604052808263ffffffff16815260200183815250600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160010155905050600184611d6e91906129dc565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611e149291906128d7565b60405180910390a25050505050565b600064010000000083108290611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e66919061273a565b60405180910390fd5b5082905092915050565b600081359050611e8881612c74565b92915050565b600081359050611e9d81612c8b565b92915050565b600081359050611eb281612ca2565b92915050565b600081359050611ec781612cb9565b92915050565b600081359050611edc81612cd0565b92915050565b600060208284031215611ef457600080fd5b6000611f0284828501611e79565b91505092915050565b60008060408385031215611f1e57600080fd5b6000611f2c85828601611e79565b9250506020611f3d85828601611e79565b9150509250929050565b600080600060608486031215611f5c57600080fd5b6000611f6a86828701611e79565b9350506020611f7b86828701611e79565b9250506040611f8c86828701611ea3565b9150509250925092565b60008060408385031215611fa957600080fd5b6000611fb785828601611e79565b9250506020611fc885828601611ea3565b9150509250929050565b60008060008060008060c08789031215611feb57600080fd5b6000611ff989828a01611e79565b965050602061200a89828a01611ea3565b955050604061201b89828a01611ea3565b945050606061202c89828a01611ecd565b935050608061203d89828a01611e8e565b92505060a061204e89828a01611e8e565b9150509295509295509295565b6000806040838503121561206e57600080fd5b600061207c85828601611e79565b925050602061208d85828601611eb8565b9150509250929050565b6120a081612aaf565b82525050565b6120af81612ac1565b82525050565b6120be81612acd565b82525050565b6120d56120d082612acd565b612bcc565b82525050565b60006120e68261295f565b6120f0818561296a565b9350612100818560208601612b1e565b61210981612c63565b840191505092915050565b600061212160238361296a565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061218760228361296a565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006121ed60028361297b565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061222d60238361296a565b91507f535441434b3a3a64656c656761746542795369673a20696e76616c6964206e6f60008301527f6e636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061229360268361296a565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122f960288361296a565b91507f535441434b3a3a6765745072696f72566f7465733a206e6f742079657420646560008301527f7465726d696e65640000000000000000000000000000000000000000000000006020830152604082019050919050565b600061235f60288361296a565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123c560258361296a565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061242b60278361296a565b91507f535441434b3a3a64656c656761746542795369673a207369676e61747572652060008301527f65787069726564000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061249160278361296a565b91507f535441434b3a3a64656c656761746542795369673a20696e76616c696420736960008301527f676e6174757265000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006124f760248361296a565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061255d60258361296a565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6125bf81612af7565b82525050565b6125ce81612b01565b82525050565b6125dd81612b11565b82525050565b60006125ee826121e0565b91506125fa82856120c4565b60208201915061260a82846120c4565b6020820191508190509392505050565b600060208201905061262f6000830184612097565b92915050565b600060208201905061264a60008301846120a6565b92915050565b600060208201905061266560008301846120b5565b92915050565b600060808201905061268060008301876120b5565b61268d6020830186612097565b61269a60408301856125b6565b6126a760608301846125b6565b95945050505050565b60006080820190506126c560008301876120b5565b6126d260208301866120b5565b6126df60408301856125b6565b6126ec6060830184612097565b95945050505050565b600060808201905061270a60008301876120b5565b61271760208301866125d4565b61272460408301856120b5565b61273160608301846120b5565b95945050505050565b6000602082019050818103600083015261275481846120db565b905092915050565b6000602082019050818103600083015261277581612114565b9050919050565b600060208201905081810360008301526127958161217a565b9050919050565b600060208201905081810360008301526127b581612220565b9050919050565b600060208201905081810360008301526127d581612286565b9050919050565b600060208201905081810360008301526127f5816122ec565b9050919050565b6000602082019050818103600083015261281581612352565b9050919050565b60006020820190508181036000830152612835816123b8565b9050919050565b600060208201905081810360008301526128558161241e565b9050919050565b6000602082019050818103600083015261287581612484565b9050919050565b60006020820190508181036000830152612895816124ea565b9050919050565b600060208201905081810360008301526128b581612550565b9050919050565b60006020820190506128d160008301846125b6565b92915050565b60006040820190506128ec60008301856125b6565b6128f960208301846125b6565b9392505050565b600060208201905061291560008301846125c5565b92915050565b600060408201905061293060008301856125c5565b61293d60208301846125b6565b9392505050565b600060208201905061295960008301846125d4565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061299182612af7565b915061299c83612af7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129d1576129d0612bd6565b5b828201905092915050565b60006129e782612b01565b91506129f283612b01565b92508263ffffffff03821115612a0b57612a0a612bd6565b5b828201905092915050565b6000612a2182612b01565b9150612a2c83612b01565b925082612a3c57612a3b612c05565b5b828204905092915050565b6000612a5282612af7565b9150612a5d83612af7565b925082821015612a7057612a6f612bd6565b5b828203905092915050565b6000612a8682612b01565b9150612a9183612b01565b925082821015612aa457612aa3612bd6565b5b828203905092915050565b6000612aba82612ad7565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b83811015612b3c578082015181840152602081019050612b21565b83811115612b4b576000848401525b50505050565b60006002820490506001821680612b6957607f821691505b60208210811415612b7d57612b7c612c34565b5b50919050565b6000612b8e82612af7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612bc157612bc0612bd6565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b612c7d81612aaf565b8114612c8857600080fd5b50565b612c9481612acd565b8114612c9f57600080fd5b50565b612cab81612af7565b8114612cb657600080fd5b50565b612cc281612b01565b8114612ccd57600080fd5b50565b612cd981612b11565b8114612ce457600080fd5b5056fe535441434b3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212205c5be70741553f737fb5cde9f3600a78c4fc9446a09f16fb8d9c752d48bf408164736f6c63430008000033535441434b3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473000000000000000000000000ca267fa4ca5f90fc5ac5005ef1f7b3c49a3ab3ab

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a9059cbb1161007c578063a9059cbb1461039e578063b4b5ea57146103ce578063c3cda520146103fe578063dd62ed3e1461041a578063e7a324dc1461044a578063f1127ed81461046857610137565b806370a08231146102c0578063782d6fe1146102f05780637ecebe001461032057806395d89b4114610350578063a457c2d71461036e57610137565b8063313ce567116100ff578063313ce567146101f65780633950935114610214578063587cde1e146102445780635c19a95c146102745780636fcfff451461029057610137565b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461018a57806320606b70146101a857806323b872dd146101c6575b600080fd5b610144610499565b604051610151919061273a565b60405180910390f35b610174600480360381019061016f9190611f96565b61052b565b6040516101819190612635565b60405180910390f35b610192610549565b60405161019f91906128bc565b60405180910390f35b6101b0610553565b6040516101bd9190612650565b60405180910390f35b6101e060048036038101906101db9190611f47565b610577565b6040516101ed9190612635565b60405180910390f35b6101fe610678565b60405161020b9190612944565b60405180910390f35b61022e60048036038101906102299190611f96565b610681565b60405161023b9190612635565b60405180910390f35b61025e60048036038101906102599190611ee2565b61072d565b60405161026b919061261a565b60405180910390f35b61028e60048036038101906102899190611ee2565b610796565b005b6102aa60048036038101906102a59190611ee2565b6107a3565b6040516102b79190612900565b60405180910390f35b6102da60048036038101906102d59190611ee2565b6107c6565b6040516102e791906128bc565b60405180910390f35b61030a60048036038101906103059190611f96565b61080e565b60405161031791906128bc565b60405180910390f35b61033a60048036038101906103359190611ee2565b610be5565b60405161034791906128bc565b60405180910390f35b610358610bfd565b604051610365919061273a565b60405180910390f35b61038860048036038101906103839190611f96565b610c8f565b6040516103959190612635565b60405180910390f35b6103b860048036038101906103b39190611f96565b610d83565b6040516103c59190612635565b60405180910390f35b6103e860048036038101906103e39190611ee2565b610da1565b6040516103f591906128bc565b60405180910390f35b61041860048036038101906104139190611fd2565b610e80565b005b610434600480360381019061042f9190611f0b565b611115565b60405161044191906128bc565b60405180910390f35b61045261119c565b60405161045f9190612650565b60405180910390f35b610482600480360381019061047d919061205b565b6111c0565b60405161049092919061291b565b60405180910390f35b6060600380546104a890612b51565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490612b51565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050505050905090565b600061053f61053861122d565b8484611235565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610584848484611400565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006105cf61122d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561064f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610646906127fc565b60405180910390fd5b61066c8561065b61122d565b85846106679190612a47565b611235565b60019150509392505050565b60006012905090565b600061072361068e61122d565b84846001600061069c61122d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461071e9190612986565b611235565b6001905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6107a0338261167f565b50565b60076020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000438210610852576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610849906127dc565b60405180910390fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1614156108bf576000915050610bdf565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018461090e9190612a7b565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16116109bb57600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001836109959190612a7b565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610bdf565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610a3c576000915050610bdf565b600080600183610a4c9190612a7b565b90505b8163ffffffff168163ffffffff161115610b7957600060028383610a739190612a7b565b610a7d9190612a16565b82610a889190612a7b565b90506000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415610b4857806020015195505050505050610bdf565b86816000015163ffffffff161015610b6257819350610b72565b600182610b6f9190612a7b565b92505b5050610a4f565b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60086020528060005260406000206000915090505481565b606060048054610c0c90612b51565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3890612b51565b8015610c855780601f10610c5a57610100808354040283529160200191610c85565b820191906000526020600020905b815481529060010190602001808311610c6857829003601f168201915b5050505050905090565b60008060016000610c9e61122d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d529061289c565b60405180910390fd5b610d78610d6661122d565b858584610d739190612a47565b611235565b600191505092915050565b6000610d97610d9061122d565b8484611400565b6001905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1611610e0b576000610e78565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610e599190612a7b565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610eab610499565b80519060200120610eba6117f0565b30604051602001610ece94939291906126b0565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001610f1f949392919061266b565b60405160208183030381529060405280519060200120905060008282604051602001610f4c9291906125e3565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610f8994939291906126f5565b6020604051602081039080840390855afa158015610fab573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e9061285c565b60405180910390fd5b600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061107790612b83565b9190505589146110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b39061279c565b60405180910390fd5b874211156110ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f69061283c565b60405180910390fd5b611109818b61167f565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6006602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b6000818361120f9190612a47565b905092915050565b600081836112259190612986565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c9061287c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130c9061277c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113f391906128bc565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114679061281c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d79061275c565b60405180910390fd5b6114eb8383836117fd565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611571576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611568906127bc565b60405180910390fd5b818161157d9190612a47565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160d9190612986565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167191906128bc565b60405180910390a350505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006116ee846107c6565b905082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46117ea8284836118cb565b50505050565b6000804690508091505090565b6118c6600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836118cb565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156119075750600081115b15611b7557600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611a40576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116119aa576000611a17565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846119f89190612a7b565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611a2e848361120190919063ffffffff16565b9050611a3c86848484611b7a565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611b74576000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611ade576000611b4b565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611b2c9190612a7b565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611b62848361121790919063ffffffff16565b9050611b7085848484611b7a565b5050505b5b505050565b6000611b9e43604051806060016040528060358152602001612ce860359139611e23565b905060008463ffffffff16118015611c3c57508063ffffffff16600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187611c069190612a7b565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b15611cb65781600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600187611c909190612a7b565b63ffffffff1663ffffffff16815260200190815260200160002060010181905550611dcc565b60405180604001604052808263ffffffff16815260200183815250600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160010155905050600184611d6e91906129dc565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611e149291906128d7565b60405180910390a25050505050565b600064010000000083108290611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e66919061273a565b60405180910390fd5b5082905092915050565b600081359050611e8881612c74565b92915050565b600081359050611e9d81612c8b565b92915050565b600081359050611eb281612ca2565b92915050565b600081359050611ec781612cb9565b92915050565b600081359050611edc81612cd0565b92915050565b600060208284031215611ef457600080fd5b6000611f0284828501611e79565b91505092915050565b60008060408385031215611f1e57600080fd5b6000611f2c85828601611e79565b9250506020611f3d85828601611e79565b9150509250929050565b600080600060608486031215611f5c57600080fd5b6000611f6a86828701611e79565b9350506020611f7b86828701611e79565b9250506040611f8c86828701611ea3565b9150509250925092565b60008060408385031215611fa957600080fd5b6000611fb785828601611e79565b9250506020611fc885828601611ea3565b9150509250929050565b60008060008060008060c08789031215611feb57600080fd5b6000611ff989828a01611e79565b965050602061200a89828a01611ea3565b955050604061201b89828a01611ea3565b945050606061202c89828a01611ecd565b935050608061203d89828a01611e8e565b92505060a061204e89828a01611e8e565b9150509295509295509295565b6000806040838503121561206e57600080fd5b600061207c85828601611e79565b925050602061208d85828601611eb8565b9150509250929050565b6120a081612aaf565b82525050565b6120af81612ac1565b82525050565b6120be81612acd565b82525050565b6120d56120d082612acd565b612bcc565b82525050565b60006120e68261295f565b6120f0818561296a565b9350612100818560208601612b1e565b61210981612c63565b840191505092915050565b600061212160238361296a565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061218760228361296a565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006121ed60028361297b565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061222d60238361296a565b91507f535441434b3a3a64656c656761746542795369673a20696e76616c6964206e6f60008301527f6e636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061229360268361296a565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122f960288361296a565b91507f535441434b3a3a6765745072696f72566f7465733a206e6f742079657420646560008301527f7465726d696e65640000000000000000000000000000000000000000000000006020830152604082019050919050565b600061235f60288361296a565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123c560258361296a565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061242b60278361296a565b91507f535441434b3a3a64656c656761746542795369673a207369676e61747572652060008301527f65787069726564000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061249160278361296a565b91507f535441434b3a3a64656c656761746542795369673a20696e76616c696420736960008301527f676e6174757265000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006124f760248361296a565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061255d60258361296a565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6125bf81612af7565b82525050565b6125ce81612b01565b82525050565b6125dd81612b11565b82525050565b60006125ee826121e0565b91506125fa82856120c4565b60208201915061260a82846120c4565b6020820191508190509392505050565b600060208201905061262f6000830184612097565b92915050565b600060208201905061264a60008301846120a6565b92915050565b600060208201905061266560008301846120b5565b92915050565b600060808201905061268060008301876120b5565b61268d6020830186612097565b61269a60408301856125b6565b6126a760608301846125b6565b95945050505050565b60006080820190506126c560008301876120b5565b6126d260208301866120b5565b6126df60408301856125b6565b6126ec6060830184612097565b95945050505050565b600060808201905061270a60008301876120b5565b61271760208301866125d4565b61272460408301856120b5565b61273160608301846120b5565b95945050505050565b6000602082019050818103600083015261275481846120db565b905092915050565b6000602082019050818103600083015261277581612114565b9050919050565b600060208201905081810360008301526127958161217a565b9050919050565b600060208201905081810360008301526127b581612220565b9050919050565b600060208201905081810360008301526127d581612286565b9050919050565b600060208201905081810360008301526127f5816122ec565b9050919050565b6000602082019050818103600083015261281581612352565b9050919050565b60006020820190508181036000830152612835816123b8565b9050919050565b600060208201905081810360008301526128558161241e565b9050919050565b6000602082019050818103600083015261287581612484565b9050919050565b60006020820190508181036000830152612895816124ea565b9050919050565b600060208201905081810360008301526128b581612550565b9050919050565b60006020820190506128d160008301846125b6565b92915050565b60006040820190506128ec60008301856125b6565b6128f960208301846125b6565b9392505050565b600060208201905061291560008301846125c5565b92915050565b600060408201905061293060008301856125c5565b61293d60208301846125b6565b9392505050565b600060208201905061295960008301846125d4565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600061299182612af7565b915061299c83612af7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156129d1576129d0612bd6565b5b828201905092915050565b60006129e782612b01565b91506129f283612b01565b92508263ffffffff03821115612a0b57612a0a612bd6565b5b828201905092915050565b6000612a2182612b01565b9150612a2c83612b01565b925082612a3c57612a3b612c05565b5b828204905092915050565b6000612a5282612af7565b9150612a5d83612af7565b925082821015612a7057612a6f612bd6565b5b828203905092915050565b6000612a8682612b01565b9150612a9183612b01565b925082821015612aa457612aa3612bd6565b5b828203905092915050565b6000612aba82612ad7565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b83811015612b3c578082015181840152602081019050612b21565b83811115612b4b576000848401525b50505050565b60006002820490506001821680612b6957607f821691505b60208210811415612b7d57612b7c612c34565b5b50919050565b6000612b8e82612af7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612bc157612bc0612bd6565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b612c7d81612aaf565b8114612c8857600080fd5b50565b612c9481612acd565b8114612c9f57600080fd5b50565b612cab81612af7565b8114612cb657600080fd5b50565b612cc281612b01565b8114612ccd57600080fd5b50565b612cd981612b11565b8114612ce457600080fd5b5056fe535441434b3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212205c5be70741553f737fb5cde9f3600a78c4fc9446a09f16fb8d9c752d48bf408164736f6c63430008000033

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

000000000000000000000000ca267fa4ca5f90fc5ac5005ef1f7b3c49a3ab3ab

-----Decoded View---------------
Arg [0] : token_holder (address): 0xca267fA4CA5f90fC5aC5005eF1f7b3c49A3AB3Ab

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


Deployed Bytecode Sourcemap

22364:9622:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6459:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8626:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7579:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23726:155;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9277:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7421:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10108:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24809:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25074:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23605:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7750:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27673:1294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24182:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6678:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10826:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8090:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27006:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25612:1193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8328:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23975:126;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23468:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;6459:100;6513:13;6546:5;6539:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6459:100;:::o;8626:169::-;8709:4;8726:39;8735:12;:10;:12::i;:::-;8749:7;8758:6;8726:8;:39::i;:::-;8783:4;8776:11;;8626:169;;;;:::o;7579:108::-;7640:7;7667:12;;7660:19;;7579:108;:::o;23726:155::-;23777:104;23726:155;:::o;9277:422::-;9383:4;9400:36;9410:6;9418:9;9429:6;9400:9;:36::i;:::-;9449:24;9476:11;:19;9488:6;9476:19;;;;;;;;;;;;;;;:33;9496:12;:10;:12::i;:::-;9476:33;;;;;;;;;;;;;;;;9449:60;;9548:6;9528:16;:26;;9520:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9610:57;9619:6;9627:12;:10;:12::i;:::-;9660:6;9641:16;:25;;;;:::i;:::-;9610:8;:57::i;:::-;9687:4;9680:11;;;9277:422;;;;;:::o;7421:93::-;7479:5;7504:2;7497:9;;7421:93;:::o;10108:215::-;10196:4;10213:80;10222:12;:10;:12::i;:::-;10236:7;10282:10;10245:11;:25;10257:12;:10;:12::i;:::-;10245:25;;;;;;;;;;;;;;;:34;10271:7;10245:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;10213:8;:80::i;:::-;10311:4;10304:11;;10108:215;;;;:::o;24809:117::-;24870:7;24897:10;:21;24908:9;24897:21;;;;;;;;;;;;;;;;;;;;;;;;;24890:28;;24809:117;;;:::o;25074:104::-;25138:32;25148:10;25160:9;25138;:32::i;:::-;25074:104;:::o;23605:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;7750:127::-;7824:7;7851:9;:18;7861:7;7851:18;;;;;;;;;;;;;;;;7844:25;;7750:127;;;:::o;27673:1294::-;27784:7;27845:12;27831:11;:26;27809:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;27938:19;27960:14;:23;27975:7;27960:23;;;;;;;;;;;;;;;;;;;;;;;;;27938:45;;28014:1;27998:12;:17;;;27994:58;;;28039:1;28032:8;;;;;27994:58;28164:11;28112;:20;28124:7;28112:20;;;;;;;;;;;;;;;:38;28148:1;28133:12;:16;;;;:::i;:::-;28112:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;28108:147;;28199:11;:20;28211:7;28199:20;;;;;;;;;;;;;;;:38;28235:1;28220:12;:16;;;;:::i;:::-;28199:38;;;;;;;;;;;;;;;:44;;;28192:51;;;;;28108:147;28352:11;28316;:20;28328:7;28316:20;;;;;;;;;;;;;;;:23;28337:1;28316:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;28312:88;;;28387:1;28380:8;;;;;28312:88;28412:12;28439;28469:1;28454:12;:16;;;;:::i;:::-;28439:31;;28481:428;28496:5;28488:13;;:5;:13;;;28481:428;;;28518:13;28560:1;28551:5;28543;:13;;;;:::i;:::-;28542:19;;;;:::i;:::-;28534:5;:27;;;;:::i;:::-;28518:43;;28603:20;28626:11;:20;28638:7;28626:20;;;;;;;;;;;;;;;:28;28647:6;28626:28;;;;;;;;;;;;;;;28603:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28689:11;28673:2;:12;;;:27;;;28669:229;;;28728:2;:8;;;28721:15;;;;;;;;;28669:229;28777:11;28762:2;:12;;;:26;;;28758:140;;;28817:6;28809:14;;28758:140;;;28881:1;28872:6;:10;;;;:::i;:::-;28864:18;;28758:140;28481:428;;;;;28926:11;:20;28938:7;28926:20;;;;;;;;;;;;;;;:27;28947:5;28926:27;;;;;;;;;;;;;;;:33;;;28919:40;;;;;27673:1294;;;;;:::o;24182:41::-;;;;;;;;;;;;;;;;;:::o;6678:104::-;6734:13;6767:7;6760:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6678:104;:::o;10826:377::-;10919:4;10936:24;10963:11;:25;10975:12;:10;:12::i;:::-;10963:25;;;;;;;;;;;;;;;:34;10989:7;10963:34;;;;;;;;;;;;;;;;10936:61;;11036:15;11016:16;:35;;11008:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11104:67;11113:12;:10;:12::i;:::-;11127:7;11155:15;11136:16;:34;;;;:::i;:::-;11104:8;:67::i;:::-;11191:4;11184:11;;;10826:377;;;;:::o;8090:175::-;8176:4;8193:42;8203:12;:10;:12::i;:::-;8217:9;8228:6;8193:9;:42::i;:::-;8253:4;8246:11;;8090:175;;;;:::o;27006:236::-;27071:7;27091:19;27113:14;:23;27128:7;27113:23;;;;;;;;;;;;;;;;;;;;;;;;;27091:45;;27182:1;27167:12;:16;;;:67;;27233:1;27167:67;;;27186:11;:20;27198:7;27186:20;;;;;;;;;;;;;;;:38;27222:1;27207:12;:16;;;;:::i;:::-;27186:38;;;;;;;;;;;;;;;:44;;;27167:67;27147:87;;;27006:236;;;:::o;25612:1193::-;25797:23;23777:104;25951:6;:4;:6::i;:::-;25935:24;;;;;;25982:12;:10;:12::i;:::-;26025:4;25864:185;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25836:228;;;;;;25797:267;;26077:18;24030:71;26171:9;26182:5;26189:6;26139:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26111:100;;;;;;26077:134;;26224:14;26311:15;26328:10;26282:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26254:100;;;;;;26224:130;;26367:17;26387:26;26397:6;26405:1;26408;26411;26387:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26367:46;;26467:1;26446:23;;:9;:23;;;;26424:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;26578:6;:17;26585:9;26578:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;26569:5;:28;26547:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;26698:6;26679:15;:25;;26671:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;26766:31;26776:9;26787;26766;:31::i;:::-;26759:38;;;;25612:1193;;;;;;:::o;8328:151::-;8417:7;8444:11;:18;8456:5;8444:18;;;;;;;;;;;;;;;:27;8463:7;8444:27;;;;;;;;;;;;;;;;8437:34;;8328:151;;;;:::o;23975:126::-;24030:71;23975:126;:::o;23468:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18380:98::-;18438:7;18469:1;18465;:5;;;;:::i;:::-;18458:12;;18380:98;;;;:::o;17999:::-;18057:7;18088:1;18084;:5;;;;:::i;:::-;18077:12;;17999:98;;;;:::o;4069:::-;4122:7;4149:10;4142:17;;4069:98;:::o;14182:346::-;14301:1;14284:19;;:5;:19;;;;14276:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14382:1;14363:21;;:7;:21;;;;14355:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14466:6;14436:11;:18;14448:5;14436:18;;;;;;;;;;;;;;;:27;14455:7;14436:27;;;;;;;;;;;;;;;:36;;;;14504:7;14488:32;;14497:5;14488:32;;;14513:6;14488:32;;;;;;:::i;:::-;;;;;;;;14182:346;;;:::o;11693:604::-;11817:1;11799:20;;:6;:20;;;;11791:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11901:1;11880:23;;:9;:23;;;;11872:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11956:47;11977:6;11985:9;11996:6;11956:20;:47::i;:::-;12016:21;12040:9;:17;12050:6;12040:17;;;;;;;;;;;;;;;;12016:41;;12093:6;12076:13;:23;;12068:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12189:6;12173:13;:22;;;;:::i;:::-;12153:9;:17;12163:6;12153:17;;;;;;;;;;;;;;;:42;;;;12230:6;12206:9;:20;12216:9;12206:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12271:9;12254:35;;12263:6;12254:35;;;12282:6;12254:35;;;;;;:::i;:::-;;;;;;;;11693:604;;;;:::o;28975:425::-;29052:23;29078:10;:21;29089:9;29078:21;;;;;;;;;;;;;;;;;;;;;;;;;29052:47;;29110:24;29137:20;29147:9;29137;:20::i;:::-;29110:47;;29238:9;29214:10;:21;29225:9;29214:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;29309:9;29265:54;;29292:15;29265:54;;29281:9;29265:54;;;;;;;;;;;;29332:60;29347:15;29364:9;29375:16;29332:14;:60::i;:::-;28975:425;;;;:::o;31590:178::-;31635:7;31655:15;31716:9;31705:20;;31753:7;31746:14;;;31590:178;:::o;31776:207::-;31919:56;31934:10;:16;31945:4;31934:16;;;;;;;;;;;;;;;;;;;;;;;;;31952:10;:14;31963:2;31952:14;;;;;;;;;;;;;;;;;;;;;;;;;31968:6;31919:14;:56::i;:::-;31776:207;;;:::o;29408:1123::-;29548:6;29538:16;;:6;:16;;;;:30;;;;;29567:1;29558:6;:10;29538:30;29534:990;;;29607:1;29589:20;;:6;:20;;;29585:456;;29678:16;29697:14;:22;29712:6;29697:22;;;;;;;;;;;;;;;;;;;;;;;;;29678:41;;29738:17;29791:1;29779:9;:13;;;:110;;29888:1;29779:110;;;29820:11;:19;29832:6;29820:19;;;;;;;;;;;;;;;:34;29852:1;29840:9;:13;;;;:::i;:::-;29820:34;;;;;;;;;;;;;;;:40;;;29779:110;29738:151;;29908:17;29928:21;29942:6;29928:9;:13;;:21;;;;:::i;:::-;29908:41;;29968:57;29985:6;29993:9;30004;30015;29968:16;:57::i;:::-;29585:456;;;;30079:1;30061:20;;:6;:20;;;30057:456;;30150:16;30169:14;:22;30184:6;30169:22;;;;;;;;;;;;;;;;;;;;;;;;;30150:41;;30210:17;30263:1;30251:9;:13;;;:110;;30360:1;30251:110;;;30292:11;:19;30304:6;30292:19;;;;;;;;;;;;;;;:34;30324:1;30312:9;:13;;;;:::i;:::-;30292:34;;;;;;;;;;;;;;;:40;;;30251:110;30210:151;;30380:17;30400:21;30414:6;30400:9;:13;;:21;;;;:::i;:::-;30380:41;;30440:57;30457:6;30465:9;30476;30487;30440:16;:57::i;:::-;30057:456;;;;29534:990;29408:1123;;;:::o;30539:839::-;30704:18;30738:126;30763:12;30738:126;;;;;;;;;;;;;;;;;:6;:126::i;:::-;30704:160;;30910:1;30895:12;:16;;;:98;;;;;30982:11;30928:65;;:11;:22;30940:9;30928:22;;;;;;;;;;;;;;;:40;30966:1;30951:12;:16;;;;:::i;:::-;30928:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;30895:98;30877:425;;;31069:8;31020:11;:22;31032:9;31020:22;;;;;;;;;;;;;;;:40;31058:1;31043:12;:16;;;;:::i;:::-;31020:40;;;;;;;;;;;;;;;:46;;:57;;;;30877:425;;;31149:82;;;;;;;;31178:11;31149:82;;;;;;31208:8;31149:82;;;31110:11;:22;31122:9;31110:22;;;;;;;;;;;;;;;:36;31133:12;31110:36;;;;;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31289:1;31274:12;:16;;;;:::i;:::-;31246:14;:25;31261:9;31246:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;30877:425;31340:9;31319:51;;;31351:8;31361;31319:51;;;;;;;:::i;:::-;;;;;;;;30539:839;;;;;:::o;31386:196::-;31491:6;31527:5;31523:1;:9;31534:12;31515:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31572:1;31558:16;;31386:196;;;;:::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:407::-;;;2090:2;2078:9;2069:7;2065:23;2061:32;2058:2;;;2106:1;2103;2096:12;2058:2;2149:1;2174:53;2219:7;2210:6;2199:9;2195:22;2174:53;:::i;:::-;2164:63;;2120:117;2276:2;2302:53;2347:7;2338:6;2327:9;2323:22;2302:53;:::i;:::-;2292:63;;2247:118;2048:324;;;;;:::o;2378:986::-;;;;;;;2569:3;2557:9;2548:7;2544:23;2540:33;2537:2;;;2586:1;2583;2576:12;2537:2;2629:1;2654:53;2699:7;2690:6;2679:9;2675:22;2654:53;:::i;:::-;2644:63;;2600:117;2756:2;2782:53;2827:7;2818:6;2807:9;2803:22;2782:53;:::i;:::-;2772:63;;2727:118;2884:2;2910:53;2955:7;2946:6;2935:9;2931:22;2910:53;:::i;:::-;2900:63;;2855:118;3012:2;3038:51;3081:7;3072:6;3061:9;3057:22;3038:51;:::i;:::-;3028:61;;2983:116;3138:3;3165:53;3210:7;3201:6;3190:9;3186:22;3165:53;:::i;:::-;3155:63;;3109:119;3267:3;3294:53;3339:7;3330:6;3319:9;3315:22;3294:53;:::i;:::-;3284:63;;3238:119;2527:837;;;;;;;;:::o;3370:405::-;;;3494:2;3482:9;3473:7;3469:23;3465:32;3462:2;;;3510:1;3507;3500:12;3462:2;3553:1;3578:53;3623:7;3614:6;3603:9;3599:22;3578:53;:::i;:::-;3568:63;;3524:117;3680:2;3706:52;3750:7;3741:6;3730:9;3726:22;3706:52;:::i;:::-;3696:62;;3651:117;3452:323;;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3846:53;;:::o;3905:109::-;3986:21;4001:5;3986:21;:::i;:::-;3981:3;3974:34;3964:50;;:::o;4020:118::-;4107:24;4125:5;4107:24;:::i;:::-;4102:3;4095:37;4085:53;;:::o;4144:157::-;4249:45;4269:24;4287:5;4269:24;:::i;:::-;4249:45;:::i;:::-;4244:3;4237:58;4227:74;;:::o;4307:364::-;;4423:39;4456:5;4423:39;:::i;:::-;4478:71;4542:6;4537:3;4478:71;:::i;:::-;4471:78;;4558:52;4603:6;4598:3;4591:4;4584:5;4580:16;4558:52;:::i;:::-;4635:29;4657:6;4635:29;:::i;:::-;4630:3;4626:39;4619:46;;4399:272;;;;;:::o;4677:367::-;;4840:67;4904:2;4899:3;4840:67;:::i;:::-;4833:74;;4937:34;4933:1;4928:3;4924:11;4917:55;5003:5;4998:2;4993:3;4989:12;4982:27;5035:2;5030:3;5026:12;5019:19;;4823:221;;;:::o;5050:366::-;;5213:67;5277:2;5272:3;5213:67;:::i;:::-;5206:74;;5310:34;5306:1;5301:3;5297:11;5290:55;5376:4;5371:2;5366:3;5362:12;5355:26;5407:2;5402:3;5398:12;5391:19;;5196:220;;;:::o;5422:396::-;;5603:84;5685:1;5680:3;5603:84;:::i;:::-;5596:91;;5717:66;5713:1;5708:3;5704:11;5697:87;5810:1;5805:3;5801:11;5794:18;;5586:232;;;:::o;5824:367::-;;5987:67;6051:2;6046:3;5987:67;:::i;:::-;5980:74;;6084:34;6080:1;6075:3;6071:11;6064:55;6150:5;6145:2;6140:3;6136:12;6129:27;6182:2;6177:3;6173:12;6166:19;;5970:221;;;:::o;6197:370::-;;6360:67;6424:2;6419:3;6360:67;:::i;:::-;6353:74;;6457:34;6453:1;6448:3;6444:11;6437:55;6523:8;6518:2;6513:3;6509:12;6502:30;6558:2;6553:3;6549:12;6542:19;;6343:224;;;:::o;6573:372::-;;6736:67;6800:2;6795:3;6736:67;:::i;:::-;6729:74;;6833:34;6829:1;6824:3;6820:11;6813:55;6899:10;6894:2;6889:3;6885:12;6878:32;6936:2;6931:3;6927:12;6920:19;;6719:226;;;:::o;6951:372::-;;7114:67;7178:2;7173:3;7114:67;:::i;:::-;7107:74;;7211:34;7207:1;7202:3;7198:11;7191:55;7277:10;7272:2;7267:3;7263:12;7256:32;7314:2;7309:3;7305:12;7298:19;;7097:226;;;:::o;7329:369::-;;7492:67;7556:2;7551:3;7492:67;:::i;:::-;7485:74;;7589:34;7585:1;7580:3;7576:11;7569:55;7655:7;7650:2;7645:3;7641:12;7634:29;7689:2;7684:3;7680:12;7673:19;;7475:223;;;:::o;7704:371::-;;7867:67;7931:2;7926:3;7867:67;:::i;:::-;7860:74;;7964:34;7960:1;7955:3;7951:11;7944:55;8030:9;8025:2;8020:3;8016:12;8009:31;8066:2;8061:3;8057:12;8050:19;;7850:225;;;:::o;8081:371::-;;8244:67;8308:2;8303:3;8244:67;:::i;:::-;8237:74;;8341:34;8337:1;8332:3;8328:11;8321:55;8407:9;8402:2;8397:3;8393:12;8386:31;8443:2;8438:3;8434:12;8427:19;;8227:225;;;:::o;8458:368::-;;8621:67;8685:2;8680:3;8621:67;:::i;:::-;8614:74;;8718:34;8714:1;8709:3;8705:11;8698:55;8784:6;8779:2;8774:3;8770:12;8763:28;8817:2;8812:3;8808:12;8801:19;;8604:222;;;:::o;8832:369::-;;8995:67;9059:2;9054:3;8995:67;:::i;:::-;8988:74;;9092:34;9088:1;9083:3;9079:11;9072:55;9158:7;9153:2;9148:3;9144:12;9137:29;9192:2;9187:3;9183:12;9176:19;;8978:223;;;:::o;9207:118::-;9294:24;9312:5;9294:24;:::i;:::-;9289:3;9282:37;9272:53;;:::o;9331:115::-;9416:23;9433:5;9416:23;:::i;:::-;9411:3;9404:36;9394:52;;:::o;9452:112::-;9535:22;9551:5;9535:22;:::i;:::-;9530:3;9523:35;9513:51;;:::o;9570:663::-;;9833:148;9977:3;9833:148;:::i;:::-;9826:155;;9991:75;10062:3;10053:6;9991:75;:::i;:::-;10091:2;10086:3;10082:12;10075:19;;10104:75;10175:3;10166:6;10104:75;:::i;:::-;10204:2;10199:3;10195:12;10188:19;;10224:3;10217:10;;9815:418;;;;;:::o;10239:222::-;;10370:2;10359:9;10355:18;10347:26;;10383:71;10451:1;10440:9;10436:17;10427:6;10383:71;:::i;:::-;10337:124;;;;:::o;10467:210::-;;10592:2;10581:9;10577:18;10569:26;;10605:65;10667:1;10656:9;10652:17;10643:6;10605:65;:::i;:::-;10559:118;;;;:::o;10683:222::-;;10814:2;10803:9;10799:18;10791:26;;10827:71;10895:1;10884:9;10880:17;10871:6;10827:71;:::i;:::-;10781:124;;;;:::o;10911:553::-;;11126:3;11115:9;11111:19;11103:27;;11140:71;11208:1;11197:9;11193:17;11184:6;11140:71;:::i;:::-;11221:72;11289:2;11278:9;11274:18;11265:6;11221:72;:::i;:::-;11303;11371:2;11360:9;11356:18;11347:6;11303:72;:::i;:::-;11385;11453:2;11442:9;11438:18;11429:6;11385:72;:::i;:::-;11093:371;;;;;;;:::o;11470:553::-;;11685:3;11674:9;11670:19;11662:27;;11699:71;11767:1;11756:9;11752:17;11743:6;11699:71;:::i;:::-;11780:72;11848:2;11837:9;11833:18;11824:6;11780:72;:::i;:::-;11862;11930:2;11919:9;11915:18;11906:6;11862:72;:::i;:::-;11944;12012:2;12001:9;11997:18;11988:6;11944:72;:::i;:::-;11652:371;;;;;;;:::o;12029:545::-;;12240:3;12229:9;12225:19;12217:27;;12254:71;12322:1;12311:9;12307:17;12298:6;12254:71;:::i;:::-;12335:68;12399:2;12388:9;12384:18;12375:6;12335:68;:::i;:::-;12413:72;12481:2;12470:9;12466:18;12457:6;12413:72;:::i;:::-;12495;12563:2;12552:9;12548:18;12539:6;12495:72;:::i;:::-;12207:367;;;;;;;:::o;12580:313::-;;12731:2;12720:9;12716:18;12708:26;;12780:9;12774:4;12770:20;12766:1;12755:9;12751:17;12744:47;12808:78;12881:4;12872:6;12808:78;:::i;:::-;12800:86;;12698:195;;;;:::o;12899:419::-;;13103:2;13092:9;13088:18;13080:26;;13152:9;13146:4;13142:20;13138:1;13127:9;13123:17;13116:47;13180:131;13306:4;13180:131;:::i;:::-;13172:139;;13070:248;;;:::o;13324:419::-;;13528:2;13517:9;13513:18;13505:26;;13577:9;13571:4;13567:20;13563:1;13552:9;13548:17;13541:47;13605:131;13731:4;13605:131;:::i;:::-;13597:139;;13495:248;;;:::o;13749:419::-;;13953:2;13942:9;13938:18;13930:26;;14002:9;13996:4;13992:20;13988:1;13977:9;13973:17;13966:47;14030:131;14156:4;14030:131;:::i;:::-;14022:139;;13920:248;;;:::o;14174:419::-;;14378:2;14367:9;14363:18;14355:26;;14427:9;14421:4;14417:20;14413:1;14402:9;14398:17;14391:47;14455:131;14581:4;14455:131;:::i;:::-;14447:139;;14345:248;;;:::o;14599:419::-;;14803:2;14792:9;14788:18;14780:26;;14852:9;14846:4;14842:20;14838:1;14827:9;14823:17;14816:47;14880:131;15006:4;14880:131;:::i;:::-;14872:139;;14770:248;;;:::o;15024:419::-;;15228:2;15217:9;15213:18;15205:26;;15277:9;15271:4;15267:20;15263:1;15252:9;15248:17;15241:47;15305:131;15431:4;15305:131;:::i;:::-;15297:139;;15195:248;;;:::o;15449:419::-;;15653:2;15642:9;15638:18;15630:26;;15702:9;15696:4;15692:20;15688:1;15677:9;15673:17;15666:47;15730:131;15856:4;15730:131;:::i;:::-;15722:139;;15620:248;;;:::o;15874:419::-;;16078:2;16067:9;16063:18;16055:26;;16127:9;16121:4;16117:20;16113:1;16102:9;16098:17;16091:47;16155:131;16281:4;16155:131;:::i;:::-;16147:139;;16045:248;;;:::o;16299:419::-;;16503:2;16492:9;16488:18;16480:26;;16552:9;16546:4;16542:20;16538:1;16527:9;16523:17;16516:47;16580:131;16706:4;16580:131;:::i;:::-;16572:139;;16470:248;;;:::o;16724:419::-;;16928:2;16917:9;16913:18;16905:26;;16977:9;16971:4;16967:20;16963:1;16952:9;16948:17;16941:47;17005:131;17131:4;17005:131;:::i;:::-;16997:139;;16895:248;;;:::o;17149:419::-;;17353:2;17342:9;17338:18;17330:26;;17402:9;17396:4;17392:20;17388:1;17377:9;17373:17;17366:47;17430:131;17556:4;17430:131;:::i;:::-;17422:139;;17320:248;;;:::o;17574:222::-;;17705:2;17694:9;17690:18;17682:26;;17718:71;17786:1;17775:9;17771:17;17762:6;17718:71;:::i;:::-;17672:124;;;;:::o;17802:332::-;;17961:2;17950:9;17946:18;17938:26;;17974:71;18042:1;18031:9;18027:17;18018:6;17974:71;:::i;:::-;18055:72;18123:2;18112:9;18108:18;18099:6;18055:72;:::i;:::-;17928:206;;;;;:::o;18140:218::-;;18269:2;18258:9;18254:18;18246:26;;18282:69;18348:1;18337:9;18333:17;18324:6;18282:69;:::i;:::-;18236:122;;;;:::o;18364:328::-;;18521:2;18510:9;18506:18;18498:26;;18534:69;18600:1;18589:9;18585:17;18576:6;18534:69;:::i;:::-;18613:72;18681:2;18670:9;18666:18;18657:6;18613:72;:::i;:::-;18488:204;;;;;:::o;18698:214::-;;18825:2;18814:9;18810:18;18802:26;;18838:67;18902:1;18891:9;18887:17;18878:6;18838:67;:::i;:::-;18792:120;;;;:::o;18918:99::-;;19004:5;18998:12;18988:22;;18977:40;;;:::o;19023:169::-;;19141:6;19136:3;19129:19;19181:4;19176:3;19172:14;19157:29;;19119:73;;;;:::o;19198:148::-;;19337:3;19322:18;;19312:34;;;;:::o;19352:305::-;;19411:20;19429:1;19411:20;:::i;:::-;19406:25;;19445:20;19463:1;19445:20;:::i;:::-;19440:25;;19599:1;19531:66;19527:74;19524:1;19521:81;19518:2;;;19605:18;;:::i;:::-;19518:2;19649:1;19646;19642:9;19635:16;;19396:261;;;;:::o;19663:246::-;;19721:19;19738:1;19721:19;:::i;:::-;19716:24;;19754:19;19771:1;19754:19;:::i;:::-;19749:24;;19851:1;19839:10;19835:18;19832:1;19829:25;19826:2;;;19857:18;;:::i;:::-;19826:2;19901:1;19898;19894:9;19887:16;;19706:203;;;;:::o;19915:182::-;;19971:19;19988:1;19971:19;:::i;:::-;19966:24;;20004:19;20021:1;20004:19;:::i;:::-;19999:24;;20042:1;20032:2;;20047:18;;:::i;:::-;20032:2;20089:1;20086;20082:9;20077:14;;19956:141;;;;:::o;20103:191::-;;20163:20;20181:1;20163:20;:::i;:::-;20158:25;;20197:20;20215:1;20197:20;:::i;:::-;20192:25;;20236:1;20233;20230:8;20227:2;;;20241:18;;:::i;:::-;20227:2;20286:1;20283;20279:9;20271:17;;20148:146;;;;:::o;20300:188::-;;20359:19;20376:1;20359:19;:::i;:::-;20354:24;;20392:19;20409:1;20392:19;:::i;:::-;20387:24;;20430:1;20427;20424:8;20421:2;;;20435:18;;:::i;:::-;20421:2;20480:1;20477;20473:9;20465:17;;20344:144;;;;:::o;20494:96::-;;20560:24;20578:5;20560:24;:::i;:::-;20549:35;;20539:51;;;:::o;20596:90::-;;20673:5;20666:13;20659:21;20648:32;;20638:48;;;:::o;20692:77::-;;20758:5;20747:16;;20737:32;;;:::o;20775:126::-;;20852:42;20845:5;20841:54;20830:65;;20820:81;;;:::o;20907:77::-;;20973:5;20962:16;;20952:32;;;:::o;20990:93::-;;21066:10;21059:5;21055:22;21044:33;;21034:49;;;:::o;21089:86::-;;21164:4;21157:5;21153:16;21142:27;;21132:43;;;:::o;21181:307::-;21249:1;21259:113;21273:6;21270:1;21267:13;21259:113;;;21358:1;21353:3;21349:11;21343:18;21339:1;21334:3;21330:11;21323:39;21295:2;21292:1;21288:10;21283:15;;21259:113;;;21390:6;21387:1;21384:13;21381:2;;;21470:1;21461:6;21456:3;21452:16;21445:27;21381:2;21230:258;;;;:::o;21494:320::-;;21575:1;21569:4;21565:12;21555:22;;21622:1;21616:4;21612:12;21643:18;21633:2;;21699:4;21691:6;21687:17;21677:27;;21633:2;21761;21753:6;21750:14;21730:18;21727:38;21724:2;;;21780:18;;:::i;:::-;21724:2;21545:269;;;;:::o;21820:233::-;;21882:24;21900:5;21882:24;:::i;:::-;21873:33;;21928:66;21921:5;21918:77;21915:2;;;21998:18;;:::i;:::-;21915:2;22045:1;22038:5;22034:13;22027:20;;21863:190;;;:::o;22059:79::-;;22127:5;22116:16;;22106:32;;;:::o;22144:180::-;22192:77;22189:1;22182:88;22289:4;22286:1;22279:15;22313:4;22310:1;22303:15;22330:180;22378:77;22375:1;22368:88;22475:4;22472:1;22465:15;22499:4;22496:1;22489:15;22516:180;22564:77;22561:1;22554:88;22661:4;22658:1;22651:15;22685:4;22682:1;22675:15;22702:102;;22794:2;22790:7;22785:2;22778:5;22774:14;22770:28;22760:38;;22750:54;;;:::o;22810:122::-;22883:24;22901:5;22883:24;:::i;:::-;22876:5;22873:35;22863:2;;22922:1;22919;22912:12;22863:2;22853:79;:::o;22938:122::-;23011:24;23029:5;23011:24;:::i;:::-;23004:5;23001:35;22991:2;;23050:1;23047;23040:12;22991:2;22981:79;:::o;23066:122::-;23139:24;23157:5;23139:24;:::i;:::-;23132:5;23129:35;23119:2;;23178:1;23175;23168:12;23119:2;23109:79;:::o;23194:120::-;23266:23;23283:5;23266:23;:::i;:::-;23259:5;23256:34;23246:2;;23304:1;23301;23294:12;23246:2;23236:78;:::o;23320:118::-;23391:22;23407:5;23391:22;:::i;:::-;23384:5;23381:33;23371:2;;23428:1;23425;23418:12;23371:2;23361:77;:::o

Swarm Source

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