Token 8bitcats.com - Fantom Metaverse

 

Overview ERC-20

Price
$0.00 @ 0.000000 FTM
Fully Diluted Market Cap
Total Supply:
263,100 8bitcats.com

Holders:
31,213 addresses
Contract:
0x630277E37fd2Ddf81e4683f3692dD817aa6225Cb0x630277E37fd2Ddf81e4683f3692dD817aa6225Cb

Decimals:
18

Social Profiles:
Not Available, Update ?

Balance
4 8bitcats.com

Value
$0.00
0xa5c89cd824b27e588b2b700deb56a8fa7044b096
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BitCats

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-11
*/

/**
 *Submitted for verification at FtmScan.com on 2021-04-25
*/

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

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with 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;
    }
}

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

/**
 * @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 {
    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 three 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 returns (string memory) {
        return _name;
    }

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

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


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;
    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
        return keccak256(
            abi.encode(
                typeHash,
                name,
                version,
                block.chainid,
                address(this)
            )
        );
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}


// This version of ERC20Permit is from OpenZeppelin as of commit
// https://github.com/OpenZeppelin/openzeppelin-contracts/commit/5171e46c47bd6be781aa92315944ca37126d4a73


/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping (address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {
    }

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {
        // solhint-disable-next-line not-rely-on-time
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(
            abi.encode(
                _PERMIT_TYPEHASH,
                owner,
                spender,
                value,
                _useNonce(owner),
                deadline
            )
        );

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}


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

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

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

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

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

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

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

    constructor() ERC20("8bitcats.com - Fantom Metaverse", "8bitcats.com") ERC20Permit("8bitcats.com - Fantom Metaverse")
    {

    }

    uint256 constant private _maxTotalSupply = 13666000e18; // 13,666,000 max boos

    function mint(address _to, uint256 _amount) public onlyOwner {
        require(totalSupply() + _amount <= _maxTotalSupply, "ERC20: minting more then MaxTotalSupply");

        _mint(_to, _amount);
        _moveDelegates(address(0), _to, _amount);
    }


    // Returns maximum total supply of the token
    function getMaxTotalSupply() external pure returns (uint256) {
        return _maxTotalSupply;
    }

    // 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)");

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) 
    public virtual override returns (bool)
    {
        bool result = super.transferFrom(sender, recipient, amount); // Call parent hook
        _moveDelegates(sender, recipient, amount);

        return result;
    }

    function transfer(address recipient, uint256 amount) 
    public virtual override returns (bool)
    {
        bool result = super.transfer(recipient, amount); // Call parent hook
        _moveDelegates(_msgSender(), recipient, amount);

        return result;
    }

    /**
     * @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, uint nonce, uint 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), "BOO::delegateBySig: invalid signature");
        require(nonce == _useNonce(signatory), "BOO::delegateBySig: invalid nonce");
        require(block.timestamp <= expiry, "BOO::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

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

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber)
        external
        view
        returns (uint256)
    {
        require(blockNumber < block.number, "BOO::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 BOOs (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 - 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 + amount;
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

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

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

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

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

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



}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","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":[],"name":"getMaxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120908152503480156200003a57600080fd5b506040518060400160405280601f81526020017f38626974636174732e636f6d202d2046616e746f6d204d657461766572736500815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280601f81526020017f38626974636174732e636f6d202d2046616e746f6d204d6574617665727365008152506040518060400160405280600c81526020017f38626974636174732e636f6d000000000000000000000000000000000000000081525081600390805190602001906200012c929190620002c1565b50806004908051906020019062000145929190620002c1565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a08181525050620001b08184846200027d60201b60201c565b608081815250508061010081815250505050505050506000620001d8620002b960201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620004ae565b600083838346306040516020016200029a959493929190620003a4565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b828054620002cf9062000449565b90600052602060002090601f016020900481019282620002f357600085556200033f565b82601f106200030e57805160ff19168380011785556200033f565b828001600101855582156200033f579182015b828111156200033e57825182559160200191906001019062000321565b5b5090506200034e919062000352565b5090565b5b808211156200036d57600081600090555060010162000353565b5090565b6200037c8162000401565b82525050565b6200038d8162000415565b82525050565b6200039e816200043f565b82525050565b600060a082019050620003bb600083018862000382565b620003ca602083018762000382565b620003d9604083018662000382565b620003e8606083018562000393565b620003f7608083018462000371565b9695505050505050565b60006200040e826200041f565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200046257607f821691505b602082108114156200047957620004786200047f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160e0516101005161012051613e06620004fe600039600061143f01526000611d9e01526000611de001526000611dbf01526000611d4b01526000611d730152613e066000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b4b5ea5711610097578063dd62ed3e11610071578063dd62ed3e14610543578063e7a324dc14610573578063f1127ed814610591578063f2fde38b146105c2576101c4565b8063b4b5ea57146104db578063c3cda5201461050b578063d505accf14610527576101c4565b80638da5cb5b116100d35780638da5cb5b1461043f57806395d89b411461045d578063a457c2d71461047b578063a9059cbb146104ab576101c4565b8063715018a6146103d5578063782d6fe1146103df5780637ecebe001461040f576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461033b5780635db30bb1146103575780636fcfff451461037557806370a08231146103a5576101c4565b806339509351146102bf57806340c10f19146102ef578063587cde1e1461030b576101c4565b806320606b70116101a257806320606b701461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610217575b600080fd5b6101d16105de565b6040516101de919061317d565b60405180910390f35b61020160048036038101906101fc9190612adc565b610670565b60405161020e9190612fc4565b60405180910390f35b61021f61068e565b60405161022c919061341f565b60405180910390f35b61023d610698565b60405161024a9190612fdf565b60405180910390f35b61026d600480360381019061026891906129e7565b6106bc565b60405161027a9190612fc4565b60405180910390f35b61028b6106e2565b60405161029891906134a7565b60405180910390f35b6102a96106eb565b6040516102b69190612fdf565b60405180910390f35b6102d960048036038101906102d49190612adc565b6106fa565b6040516102e69190612fc4565b60405180910390f35b61030960048036038101906103049190612adc565b6107a6565b005b6103256004803603810190610320919061297a565b61089c565b6040516103329190612fa9565b60405180910390f35b6103556004803603810190610350919061297a565b610905565b005b61035f610912565b60405161036c919061341f565b60405180910390f35b61038f600480360381019061038a919061297a565b610925565b60405161039c9190613463565b60405180910390f35b6103bf60048036038101906103ba919061297a565b610948565b6040516103cc919061341f565b60405180910390f35b6103dd610990565b005b6103f960048036038101906103f49190612adc565b610acd565b604051610406919061341f565b60405180910390f35b6104296004803603810190610424919061297a565b610ea4565b604051610436919061341f565b60405180910390f35b610447610ef4565b6040516104549190612fa9565b60405180910390f35b610465610f1e565b604051610472919061317d565b60405180910390f35b61049560048036038101906104909190612adc565b610fb0565b6040516104a29190612fc4565b60405180910390f35b6104c560048036038101906104c09190612adc565b6110a4565b6040516104d29190612fc4565b60405180910390f35b6104f560048036038101906104f0919061297a565b6110cf565b604051610502919061341f565b60405180910390f35b61052560048036038101906105209190612b1c565b6111ae565b005b610541600480360381019061053c9190612a3a565b6113f8565b005b61055d600480360381019061055891906129a7565b61153a565b60405161056a919061341f565b60405180910390f35b61057b6115c1565b6040516105889190612fdf565b60405180910390f35b6105ab60048036038101906105a69190612ba9565b6115e5565b6040516105b992919061347e565b60405180910390f35b6105dc60048036038101906105d7919061297a565b611626565b005b6060600380546105ed906136b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610619906136b4565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050905090565b600061068461067d6117d2565b84846117da565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000806106ca8585856119a5565b90506106d7858585611aa6565b809150509392505050565b60006012905090565b60006106f5611d47565b905090565b600061079c6107076117d2565b8484600160006107156117d2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461079791906134e9565b6117da565b6001905092915050565b6107ae6117d2565b73ffffffffffffffffffffffffffffffffffffffff166107cc610ef4565b73ffffffffffffffffffffffffffffffffffffffff1614610822576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108199061333f565b60405180910390fd5b6a0b4de3582e7cd6594000008161083761068e565b61084191906134e9565b1115610882576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610879906132df565b60405180910390fd5b61088c8282611e0a565b61089860008383611aa6565b5050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61090f3382611f5e565b50565b60006a0b4de3582e7cd659400000905090565b60096020528060005260406000206000915054906101000a900463ffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109986117d2565b73ffffffffffffffffffffffffffffffffffffffff166109b6610ef4565b73ffffffffffffffffffffffffffffffffffffffff1614610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a039061333f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000438210610b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b089061327f565b60405180910390fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff161415610b7e576000915050610e9e565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610bcd91906135de565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610c7a57600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610c5491906135de565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610e9e565b82600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610cfb576000915050610e9e565b600080600183610d0b91906135de565b90505b8163ffffffff168163ffffffff161115610e3857600060028383610d3291906135de565b610d3c9190613579565b82610d4791906135de565b90506000600860008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff161415610e0757806020015195505050505050610e9e565b86816000015163ffffffff161015610e2157819350610e31565b600182610e2e91906135de565b92505b5050610d0e565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b6000610eed600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206120cf565b9050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f2d906136b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610f59906136b4565b8015610fa65780601f10610f7b57610100808354040283529160200191610fa6565b820191906000526020600020905b815481529060010190602001808311610f8957829003601f168201915b5050505050905090565b60008060016000610fbf6117d2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561107c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611073906133df565b60405180910390fd5b6110996110876117d2565b85858461109491906135aa565b6117da565b600191505092915050565b6000806110b184846120dd565b90506110c56110be6117d2565b8585611aa6565b8091505092915050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116111395760006111a6565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018361118791906135de565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666111d96105de565b805190602001206111e86120fb565b306040516020016111fc94939291906130f3565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf88888860405160200161124d949392919061305b565b6040516020818303038152906040528051906020012090506000828260405160200161127a929190612f72565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516112b79493929190613138565b6020604051602081039080840390855afa1580156112d9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c9061329f565b60405180910390fd5b61135e81612108565b891461139f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113969061337f565b60405180910390fd5b874211156113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d9906133bf565b60405180910390fd5b6113ec818b611f5e565b50505050505050505050565b8342111561143b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114329061321f565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000088888861146a8c612108565b8960405160200161148096959493929190612ffa565b60405160208183030381529060405280519060200120905060006114a382612166565b905060006114b382878787612180565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a906132ff565b60405180910390fd5b61152e8a8a8a6117da565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6008602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b61162e6117d2565b73ffffffffffffffffffffffffffffffffffffffff1661164c610ef4565b73ffffffffffffffffffffffffffffffffffffffff16146116a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116999061333f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611709906131df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561184a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118419061339f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b1906131ff565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611998919061341f565b60405180910390a3505050565b60006119b284848461230b565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006119fd6117d2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a749061331f565b60405180910390fd5b611a9a85611a896117d2565b8584611a9591906135aa565b6117da565b60019150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611ae25750600081115b15611d4257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611c14576000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611b85576000611bf2565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611bd391906135de565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060008382611c0291906135aa565b9050611c108684848461258a565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611d41576000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff1611611cb2576000611d1f565b600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184611d0091906135de565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060008382611d2f91906134e9565b9050611d3d8584848461258a565b5050505b5b505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611d99577f00000000000000000000000000000000000000000000000000000000000000009050611e07565b611e047f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612833565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e71906133ff565b60405180910390fd5b611e866000838361286d565b8060026000828254611e9891906134e9565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eed91906134e9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f52919061341f565b60405180910390a35050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611fcd84610948565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46120c9828483611aa6565b50505050565b600081600001549050919050565b60006120f16120ea6117d2565b848461230b565b6001905092915050565b6000804690508091505090565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612155816120cf565b915061216081612872565b50919050565b6000612179612173611d47565b83612888565b9050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df9061325f565b60405180910390fd5b601b8460ff1614806121fd5750601c8460ff16145b61223c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612233906132bf565b60405180910390fd5b6000600186868686604051600081526020016040526040516122619493929190613138565b6020604051602081039080840390855afa158015612283573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f69061319f565b60405180910390fd5b80915050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561237b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123729061335f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e2906131bf565b60405180910390fd5b6123f683838361286d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561247c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124739061323f565b60405180910390fd5b818161248891906135aa565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251891906134e9565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161257c919061341f565b60405180910390a350505050565b60006125ae43604051806060016040528060338152602001613d9e603391396128bb565b905060008463ffffffff1611801561264c57508063ffffffff16600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018761261691906135de565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b156126c65781600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876126a091906135de565b63ffffffff1663ffffffff168152602001908152602001600020600101819055506127dc565b60405180604001604052808263ffffffff16815260200183815250600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff1602179055506020820151816001015590505060018461277e919061353f565b600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724848460405161282492919061343a565b60405180910390a25050505050565b6000838383463060405160200161284e9594939291906130a0565b6040516020818303038152906040528051906020012090509392505050565b505050565b6001816000016000828254019250508190555050565b6000828260405160200161289d929190612f72565b60405160208183030381529060405280519060200120905092915050565b600064010000000083108290612907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fe919061317d565b60405180910390fd5b5082905092915050565b60008135905061292081613d2a565b92915050565b60008135905061293581613d41565b92915050565b60008135905061294a81613d58565b92915050565b60008135905061295f81613d6f565b92915050565b60008135905061297481613d86565b92915050565b6000602082840312156129905761298f61377d565b5b600061299e84828501612911565b91505092915050565b600080604083850312156129be576129bd61377d565b5b60006129cc85828601612911565b92505060206129dd85828601612911565b9150509250929050565b600080600060608486031215612a00576129ff61377d565b5b6000612a0e86828701612911565b9350506020612a1f86828701612911565b9250506040612a308682870161293b565b9150509250925092565b600080600080600080600060e0888a031215612a5957612a5861377d565b5b6000612a678a828b01612911565b9750506020612a788a828b01612911565b9650506040612a898a828b0161293b565b9550506060612a9a8a828b0161293b565b9450506080612aab8a828b01612965565b93505060a0612abc8a828b01612926565b92505060c0612acd8a828b01612926565b91505092959891949750929550565b60008060408385031215612af357612af261377d565b5b6000612b0185828601612911565b9250506020612b128582860161293b565b9150509250929050565b60008060008060008060c08789031215612b3957612b3861377d565b5b6000612b4789828a01612911565b9650506020612b5889828a0161293b565b9550506040612b6989828a0161293b565b9450506060612b7a89828a01612965565b9350506080612b8b89828a01612926565b92505060a0612b9c89828a01612926565b9150509295509295509295565b60008060408385031215612bc057612bbf61377d565b5b6000612bce85828601612911565b9250506020612bdf85828601612950565b9150509250929050565b612bf281613612565b82525050565b612c0181613624565b82525050565b612c1081613630565b82525050565b612c27612c2282613630565b6136e6565b82525050565b6000612c38826134c2565b612c4281856134cd565b9350612c52818560208601613681565b612c5b81613782565b840191505092915050565b6000612c736018836134cd565b9150612c7e82613793565b602082019050919050565b6000612c966023836134cd565b9150612ca1826137bc565b604082019050919050565b6000612cb96026836134cd565b9150612cc48261380b565b604082019050919050565b6000612cdc6022836134cd565b9150612ce78261385a565b604082019050919050565b6000612cff6002836134de565b9150612d0a826138a9565b600282019050919050565b6000612d22601d836134cd565b9150612d2d826138d2565b602082019050919050565b6000612d456026836134cd565b9150612d50826138fb565b604082019050919050565b6000612d686022836134cd565b9150612d738261394a565b604082019050919050565b6000612d8b6026836134cd565b9150612d9682613999565b604082019050919050565b6000612dae6025836134cd565b9150612db9826139e8565b604082019050919050565b6000612dd16022836134cd565b9150612ddc82613a37565b604082019050919050565b6000612df46027836134cd565b9150612dff82613a86565b604082019050919050565b6000612e17601e836134cd565b9150612e2282613ad5565b602082019050919050565b6000612e3a6028836134cd565b9150612e4582613afe565b604082019050919050565b6000612e5d6020836134cd565b9150612e6882613b4d565b602082019050919050565b6000612e806025836134cd565b9150612e8b82613b76565b604082019050919050565b6000612ea36021836134cd565b9150612eae82613bc5565b604082019050919050565b6000612ec66024836134cd565b9150612ed182613c14565b604082019050919050565b6000612ee96025836134cd565b9150612ef482613c63565b604082019050919050565b6000612f0c6025836134cd565b9150612f1782613cb2565b604082019050919050565b6000612f2f601f836134cd565b9150612f3a82613d01565b602082019050919050565b612f4e8161365a565b82525050565b612f5d81613664565b82525050565b612f6c81613674565b82525050565b6000612f7d82612cf2565b9150612f898285612c16565b602082019150612f998284612c16565b6020820191508190509392505050565b6000602082019050612fbe6000830184612be9565b92915050565b6000602082019050612fd96000830184612bf8565b92915050565b6000602082019050612ff46000830184612c07565b92915050565b600060c08201905061300f6000830189612c07565b61301c6020830188612be9565b6130296040830187612be9565b6130366060830186612f45565b6130436080830185612f45565b61305060a0830184612f45565b979650505050505050565b60006080820190506130706000830187612c07565b61307d6020830186612be9565b61308a6040830185612f45565b6130976060830184612f45565b95945050505050565b600060a0820190506130b56000830188612c07565b6130c26020830187612c07565b6130cf6040830186612c07565b6130dc6060830185612f45565b6130e96080830184612be9565b9695505050505050565b60006080820190506131086000830187612c07565b6131156020830186612c07565b6131226040830185612f45565b61312f6060830184612be9565b95945050505050565b600060808201905061314d6000830187612c07565b61315a6020830186612f63565b6131676040830185612c07565b6131746060830184612c07565b95945050505050565b600060208201905081810360008301526131978184612c2d565b905092915050565b600060208201905081810360008301526131b881612c66565b9050919050565b600060208201905081810360008301526131d881612c89565b9050919050565b600060208201905081810360008301526131f881612cac565b9050919050565b6000602082019050818103600083015261321881612ccf565b9050919050565b6000602082019050818103600083015261323881612d15565b9050919050565b6000602082019050818103600083015261325881612d38565b9050919050565b6000602082019050818103600083015261327881612d5b565b9050919050565b6000602082019050818103600083015261329881612d7e565b9050919050565b600060208201905081810360008301526132b881612da1565b9050919050565b600060208201905081810360008301526132d881612dc4565b9050919050565b600060208201905081810360008301526132f881612de7565b9050919050565b6000602082019050818103600083015261331881612e0a565b9050919050565b6000602082019050818103600083015261333881612e2d565b9050919050565b6000602082019050818103600083015261335881612e50565b9050919050565b6000602082019050818103600083015261337881612e73565b9050919050565b6000602082019050818103600083015261339881612e96565b9050919050565b600060208201905081810360008301526133b881612eb9565b9050919050565b600060208201905081810360008301526133d881612edc565b9050919050565b600060208201905081810360008301526133f881612eff565b9050919050565b6000602082019050818103600083015261341881612f22565b9050919050565b60006020820190506134346000830184612f45565b92915050565b600060408201905061344f6000830185612f45565b61345c6020830184612f45565b9392505050565b60006020820190506134786000830184612f54565b92915050565b60006040820190506134936000830185612f54565b6134a06020830184612f45565b9392505050565b60006020820190506134bc6000830184612f63565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006134f48261365a565b91506134ff8361365a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613534576135336136f0565b5b828201905092915050565b600061354a82613664565b915061355583613664565b92508263ffffffff0382111561356e5761356d6136f0565b5b828201905092915050565b600061358482613664565b915061358f83613664565b92508261359f5761359e61371f565b5b828204905092915050565b60006135b58261365a565b91506135c08361365a565b9250828210156135d3576135d26136f0565b5b828203905092915050565b60006135e982613664565b91506135f483613664565b925082821015613607576136066136f0565b5b828203905092915050565b600061361d8261363a565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b8381101561369f578082015181840152602081019050613684565b838111156136ae576000848401525b50505050565b600060028204905060018216806136cc57607f821691505b602082108114156136e0576136df61374e565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f424f4f3a3a6765745072696f72566f7465733a206e6f7420796574206465746560008201527f726d696e65640000000000000000000000000000000000000000000000000000602082015250565b7f424f4f3a3a64656c656761746542795369673a20696e76616c6964207369676e60008201527f6174757265000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e74696e67206d6f7265207468656e204d6178546f746160008201527f6c537570706c7900000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f424f4f3a3a64656c656761746542795369673a20696e76616c6964206e6f6e6360008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f424f4f3a3a64656c656761746542795369673a207369676e617475726520657860008201527f7069726564000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613d3381613612565b8114613d3e57600080fd5b50565b613d4a81613630565b8114613d5557600080fd5b50565b613d618161365a565b8114613d6c57600080fd5b50565b613d7881613664565b8114613d8357600080fd5b50565b613d8f81613674565b8114613d9a57600080fd5b5056fe424f4f3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220fdf1ba415f7eadd3c49ceb06ee3388d21d9b21dfa213685332ae54aabc5e13ad64736f6c63430008070033

Deployed ByteCode Sourcemap

31802:9739:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5686:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7826:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6779:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33507:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34349:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6630:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29162:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9308:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32079:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35013:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35306:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32396:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33385:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6950:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31250:148;;;:::i;:::-;;37845:1252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28904:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30599:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5896:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10026:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34656:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37159:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35844:1114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28067:771;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7528:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33723:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33246:70;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;31553:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5686:91;5731:13;5764:5;5757:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5686:91;:::o;7826:169::-;7909:4;7926:39;7935:12;:10;:12::i;:::-;7949:7;7958:6;7926:8;:39::i;:::-;7983:4;7976:11;;7826:169;;;;:::o;6779:108::-;6840:7;6867:12;;6860:19;;6779:108;:::o;33507:122::-;33549:80;33507:122;:::o;34349:299::-;34461:4;34483:11;34497:45;34516:6;34524:9;34535:6;34497:18;:45::i;:::-;34483:59;;34573:41;34588:6;34596:9;34607:6;34573:14;:41::i;:::-;34634:6;34627:13;;;34349:299;;;;;:::o;6630:84::-;6679:5;6704:2;6697:9;;6630:84;:::o;29162:115::-;29222:7;29249:20;:18;:20::i;:::-;29242:27;;29162:115;:::o;9308:215::-;9396:4;9413:80;9422:12;:10;:12::i;:::-;9436:7;9482:10;9445:11;:25;9457:12;:10;:12::i;:::-;9445:25;;;;;;;;;;;;;;;:34;9471:7;9445:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;9413:8;:80::i;:::-;9511:4;9504:11;;9308:215;;;;:::o;32079:257::-;30830:12;:10;:12::i;:::-;30819:23;;:7;:5;:7::i;:::-;:23;;;30811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32036:11:::1;32175:7;32159:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:42;;32151:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;32258:19;32264:3;32269:7;32258:5;:19::i;:::-;32288:40;32311:1;32315:3;32320:7;32288:14;:40::i;:::-;32079:257:::0;;:::o;35013:149::-;35101:7;35133:10;:21;35144:9;35133:21;;;;;;;;;;;;;;;;;;;;;;;;;35126:28;;35013:149;;;:::o;35306:104::-;35370:32;35380:10;35392:9;35370;:32::i;:::-;35306:104;:::o;32396:102::-;32448:7;32036:11;32468:22;;32396:102;:::o;33385:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;6950:127::-;7024:7;7051:9;:18;7061:7;7051:18;;;;;;;;;;;;;;;;7044:25;;6950:127;;;:::o;31250:148::-;30830:12;:10;:12::i;:::-;30819:23;;:7;:5;:7::i;:::-;:23;;;30811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31357:1:::1;31320:40;;31341:6;;;;;;;;;;;31320:40;;;;;;;;;;;;31388:1;31371:6;;:19;;;;;;;;;;;;;;;;;;31250:148::o:0;37845:1252::-;37953:7;38000:12;37986:11;:26;37978:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;38068:19;38090:14;:23;38105:7;38090:23;;;;;;;;;;;;;;;;;;;;;;;;;38068:45;;38144:1;38128:12;:17;;;38124:58;;;38169:1;38162:8;;;;;38124:58;38294:11;38242;:20;38254:7;38242:20;;;;;;;;;;;;;;;:38;38278:1;38263:12;:16;;;;:::i;:::-;38242:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;38238:147;;38329:11;:20;38341:7;38329:20;;;;;;;;;;;;;;;:38;38365:1;38350:12;:16;;;;:::i;:::-;38329:38;;;;;;;;;;;;;;;:44;;;38322:51;;;;;38238:147;38482:11;38446;:20;38458:7;38446:20;;;;;;;;;;;;;;;:23;38467:1;38446:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;38442:88;;;38517:1;38510:8;;;;;38442:88;38542:12;38569;38599:1;38584:12;:16;;;;:::i;:::-;38569:31;;38611:428;38626:5;38618:13;;:5;:13;;;38611:428;;;38648:13;38690:1;38681:5;38673;:13;;;;:::i;:::-;38672:19;;;;:::i;:::-;38664:5;:27;;;;:::i;:::-;38648:43;;38733:20;38756:11;:20;38768:7;38756:20;;;;;;;;;;;;;;;:28;38777:6;38756:28;;;;;;;;;;;;;;;38733:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38819:11;38803:2;:12;;;:27;;;38799:229;;;38858:2;:8;;;38851:15;;;;;;;;;38799:229;38907:11;38892:2;:12;;;:26;;;38888:140;;;38947:6;38939:14;;38888:140;;;39011:1;39002:6;:10;;;;:::i;:::-;38994:18;;38888:140;38633:406;;38611:428;;;39056:11;:20;39068:7;39056:20;;;;;;;;;;;;;;;:27;39077:5;39056:27;;;;;;;;;;;;;;;:33;;;39049:40;;;;;37845:1252;;;;;:::o;28904:128::-;28973:7;29000:24;:7;:14;29008:5;29000:14;;;;;;;;;;;;;;;:22;:24::i;:::-;28993:31;;28904:128;;;:::o;30599:87::-;30645:7;30672:6;;;;;;;;;;;30665:13;;30599:87;:::o;5896:95::-;5943:13;5976:7;5969:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5896:95;:::o;10026:377::-;10119:4;10136:24;10163:11;:25;10175:12;:10;:12::i;:::-;10163:25;;;;;;;;;;;;;;;:34;10189:7;10163:34;;;;;;;;;;;;;;;;10136:61;;10236:15;10216:16;:35;;10208:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:67;10313:12;:10;:12::i;:::-;10327:7;10355:15;10336:16;:34;;;;:::i;:::-;10304:8;:67::i;:::-;10391:4;10384:11;;;10026:377;;;;:::o;34656:273::-;34748:4;34770:11;34784:33;34799:9;34810:6;34784:14;:33::i;:::-;34770:47;;34848;34863:12;:10;:12::i;:::-;34877:9;34888:6;34848:14;:47::i;:::-;34915:6;34908:13;;;34656:273;;;;:::o;37159:255::-;37251:7;37276:19;37298:14;:23;37313:7;37298:23;;;;;;;;;;;;;;;;;;;;;;;;;37276:45;;37354:1;37339:12;:16;;;:67;;37405:1;37339:67;;;37358:11;:20;37370:7;37358:20;;;;;;;;;;;;;;;:38;37394:1;37379:12;:16;;;;:::i;:::-;37358:38;;;;;;;;;;;;;;;:44;;;37339:67;37332:74;;;37159:255;;;:::o;35844:1114::-;35963:23;33549:80;36092:6;:4;:6::i;:::-;36076:24;;;;;;36119:12;:10;:12::i;:::-;36158:4;36013:165;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35989:200;;;;;;35963:226;;36202:18;33769:71;36314:9;36342:5;36366:6;36247:140;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36223:175;;;;;;36202:196;;36411:14;36516:15;36550:10;36452:123;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36428:158;;;;;;36411:175;;36599:17;36619:26;36629:6;36637:1;36640;36643;36619:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36599:46;;36685:1;36664:23;;:9;:23;;;;36656:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36757:20;36767:9;36757;:20::i;:::-;36748:5;:29;36740:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;36853:6;36834:15;:25;;36826:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;36919:31;36929:9;36940;36919;:31::i;:::-;36912:38;;;;35844:1114;;;;;;:::o;28067:771::-;28296:8;28277:15;:27;;28269:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28351:18;28425:16;28460:5;28484:7;28510:5;28534:16;28544:5;28534:9;:16::i;:::-;28569:8;28396:196;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28372:231;;;;;;28351:252;;28616:12;28631:28;28648:10;28631:16;:28::i;:::-;28616:43;;28672:14;28689:28;28703:4;28709:1;28712;28715;28689:13;:28::i;:::-;28672:45;;28746:5;28736:15;;:6;:15;;;28728:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28799:31;28808:5;28815:7;28824:5;28799:8;:31::i;:::-;28203:635;;;28067:771;;;;;;;:::o;7528:151::-;7617:7;7644:11;:18;7656:5;7644:18;;;;;;;;;;;;;;;:27;7663:7;7644:27;;;;;;;;;;;;;;;;7637:34;;7528:151;;;;:::o;33723:117::-;33769:71;33723:117;:::o;33246:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31553:244::-;30830:12;:10;:12::i;:::-;30819:23;;:7;:5;:7::i;:::-;:23;;;30811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31662:1:::1;31642:22;;:8;:22;;;;31634:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31752:8;31723:38;;31744:6;;;;;;;;;;;31723:38;;;;;;;;;;;;31781:8;31772:6;;:17;;;;;;;;;;;;;;;;;;31553:244:::0;:::o;669:98::-;722:7;749:10;742:17;;669:98;:::o;13382:346::-;13501:1;13484:19;;:5;:19;;;;13476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13582:1;13563:21;;:7;:21;;;;13555:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13666:6;13636:11;:18;13648:5;13636:18;;;;;;;;;;;;;;;:27;13655:7;13636:27;;;;;;;;;;;;;;;:36;;;;13704:7;13688:32;;13697:5;13688:32;;;13713:6;13688:32;;;;;;:::i;:::-;;;;;;;;13382:346;;;:::o;8477:422::-;8583:4;8600:36;8610:6;8618:9;8629:6;8600:9;:36::i;:::-;8649:24;8676:11;:19;8688:6;8676:19;;;;;;;;;;;;;;;:33;8696:12;:10;:12::i;:::-;8676:33;;;;;;;;;;;;;;;;8649:60;;8748:6;8728:16;:26;;8720:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;8810:57;8819:6;8827:12;:10;:12::i;:::-;8860:6;8841:16;:25;;;;:::i;:::-;8810:8;:57::i;:::-;8887:4;8880:11;;;8477:422;;;;;:::o;39550:941::-;39656:6;39646:16;;:6;:16;;;;:30;;;;;39675:1;39666:6;:10;39646:30;39642:842;;;39715:1;39697:20;;:6;:20;;;39693:382;;39786:16;39805:14;:22;39820:6;39805:22;;;;;;;;;;;;;;;;;;;;;;;;;39786:41;;39846:17;39878:1;39866:9;:13;;;:60;;39925:1;39866:60;;;39882:11;:19;39894:6;39882:19;;;;;;;;;;;;;;;:34;39914:1;39902:9;:13;;;;:::i;:::-;39882:34;;;;;;;;;;;;;;;:40;;;39866:60;39846:80;;39945:17;39977:6;39965:9;:18;;;;:::i;:::-;39945:38;;40002:57;40019:6;40027:9;40038;40049;40002:16;:57::i;:::-;39719:356;;;39693:382;40113:1;40095:20;;:6;:20;;;40091:382;;40184:16;40203:14;:22;40218:6;40203:22;;;;;;;;;;;;;;;;;;;;;;;;;40184:41;;40244:17;40276:1;40264:9;:13;;;:60;;40323:1;40264:60;;;40280:11;:19;40292:6;40280:19;;;;;;;;;;;;;;;:34;40312:1;40300:9;:13;;;;:::i;:::-;40280:34;;;;;;;;;;;;;;;:40;;;40264:60;40244:80;;40343:17;40375:6;40363:9;:18;;;;:::i;:::-;40343:38;;40400:57;40417:6;40425:9;40436;40447;40400:16;:57::i;:::-;40117:356;;;40091:382;39642:842;39550:941;;;:::o;21858:281::-;21911:7;21952:16;21935:13;:33;21931:201;;;21992:24;21985:31;;;;21931:201;22056:64;22078:10;22090:12;22104:15;22056:21;:64::i;:::-;22049:71;;21858:281;;:::o;11779:338::-;11882:1;11863:21;;:7;:21;;;;11855:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11933:49;11962:1;11966:7;11975:6;11933:20;:49::i;:::-;12011:6;11995:12;;:22;;;;;;;:::i;:::-;;;;;;;;12050:6;12028:9;:18;12038:7;12028:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;12093:7;12072:37;;12089:1;12072:37;;;12102:6;12072:37;;;;;;:::i;:::-;;;;;;;;11779:338;;:::o;39105:437::-;39196:23;39222:10;:21;39233:9;39222:21;;;;;;;;;;;;;;;;;;;;;;;;;39196:47;;39254:24;39281:20;39291:9;39281;:20::i;:::-;39254:47;;39380:9;39356:10;:21;39367:9;39356:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;39451:9;39407:54;;39434:15;39407:54;;39423:9;39407:54;;;;;;;;;;;;39474:60;39489:15;39506:9;39517:16;39474:14;:60::i;:::-;39185:357;;39105:437;;:::o;24031:114::-;24096:7;24123;:14;;;24116:21;;24031:114;;;:::o;7290:175::-;7376:4;7393:42;7403:12;:10;:12::i;:::-;7417:9;7428:6;7393:9;:42::i;:::-;7453:4;7446:11;;7290:175;;;;:::o;41379:153::-;41424:4;41441:15;41489:9;41478:20;;41517:7;41510:14;;;41379:153;:::o;29375:207::-;29435:15;29463:30;29496:7;:14;29504:5;29496:14;;;;;;;;;;;;;;;29463:47;;29531:15;:5;:13;:15::i;:::-;29521:25;;29557:17;:5;:15;:17::i;:::-;29452:130;29375:207;;;:::o;23126:167::-;23203:7;23230:55;23252:20;:18;:20::i;:::-;23274:10;23230:21;:55::i;:::-;23223:62;;23126:167;;;:::o;16359:1432::-;16444:7;17369:66;17363:1;17355:10;;:80;;17347:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;17498:2;17493:1;:7;;;:18;;;;17509:2;17504:1;:7;;;17493:18;17485:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;17648:14;17665:24;17675:4;17681:1;17684;17687;17665:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17648:41;;17726:1;17708:20;;:6;:20;;;;17700:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;17777:6;17770:13;;;16359:1432;;;;;;:::o;10893:604::-;11017:1;10999:20;;:6;:20;;;;10991:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11101:1;11080:23;;:9;:23;;;;11072:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11156:47;11177:6;11185:9;11196:6;11156:20;:47::i;:::-;11216:21;11240:9;:17;11250:6;11240:17;;;;;;;;;;;;;;;;11216:41;;11293:6;11276:13;:23;;11268:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;11389:6;11373:13;:22;;;;:::i;:::-;11353:9;:17;11363:6;11353:17;;;;;;;;;;;;;;;:42;;;;11430:6;11406:9;:20;11416:9;11406:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;11471:9;11454:35;;11463:6;11454:35;;;11482:6;11454:35;;;;;;:::i;:::-;;;;;;;;10980:517;10893:604;;;:::o;40499:703::-;40678:18;40699:75;40706:12;40699:75;;;;;;;;;;;;;;;;;:6;:75::i;:::-;40678:96;;40806:1;40791:12;:16;;;:85;;;;;40865:11;40811:65;;:11;:22;40823:9;40811:22;;;;;;;;;;;;;;;:40;40849:1;40834:12;:16;;;;:::i;:::-;40811:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;40791:85;40787:339;;;40942:8;40893:11;:22;40905:9;40893:22;;;;;;;;;;;;;;;:40;40931:1;40916:12;:16;;;;:::i;:::-;40893:40;;;;;;;;;;;;;;;:46;;:57;;;;40787:339;;;41022:33;;;;;;;;41033:11;41022:33;;;;;;41046:8;41022:33;;;40983:11;:22;40995:9;40983:22;;;;;;;;;;;;;;;:36;41006:12;40983:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41113:1;41098:12;:16;;;;:::i;:::-;41070:14;:25;41085:9;41070:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;40787:339;41164:9;41143:51;;;41175:8;41185;41143:51;;;;;;;:::i;:::-;;;;;;;;40667:535;40499:703;;;;:::o;22147:337::-;22249:7;22329:8;22356:4;22379:7;22405:13;22445:4;22300:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22276:200;;;;;;22269:207;;22147:337;;;;;:::o;14331:92::-;;;;:::o;24153:127::-;24260:1;24242:7;:14;;;:19;;;;;;;;;;;24153:127;:::o;18710:196::-;18803:7;18869:15;18886:10;18840:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18830:68;;;;;;18823:75;;18710:196;;;;:::o;41210:161::-;41285:6;41316:5;41312:1;:9;41323:12;41304:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41361:1;41347:16;;41210:161;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:::-;343:5;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;297:139;;;;:::o;442:137::-;487:5;525:6;512:20;503:29;;541:32;567:5;541:32;:::i;:::-;442:137;;;;:::o;585:135::-;629:5;667:6;654:20;645:29;;683:31;708:5;683:31;:::i;:::-;585:135;;;;:::o;726:329::-;785:6;834:2;822:9;813:7;809:23;805:32;802:119;;;840:79;;:::i;:::-;802:119;960:1;985:53;1030:7;1021:6;1010:9;1006:22;985:53;:::i;:::-;975:63;;931:117;726:329;;;;:::o;1061:474::-;1129:6;1137;1186:2;1174:9;1165:7;1161:23;1157:32;1154:119;;;1192:79;;:::i;:::-;1154:119;1312:1;1337:53;1382:7;1373:6;1362:9;1358:22;1337:53;:::i;:::-;1327:63;;1283:117;1439:2;1465:53;1510:7;1501:6;1490:9;1486:22;1465:53;:::i;:::-;1455:63;;1410:118;1061:474;;;;;:::o;1541:619::-;1618:6;1626;1634;1683:2;1671:9;1662:7;1658:23;1654:32;1651:119;;;1689:79;;:::i;:::-;1651:119;1809:1;1834:53;1879:7;1870:6;1859:9;1855:22;1834:53;:::i;:::-;1824:63;;1780:117;1936:2;1962:53;2007:7;1998:6;1987:9;1983:22;1962:53;:::i;:::-;1952:63;;1907:118;2064:2;2090:53;2135:7;2126:6;2115:9;2111:22;2090:53;:::i;:::-;2080:63;;2035:118;1541:619;;;;;:::o;2166:1199::-;2277:6;2285;2293;2301;2309;2317;2325;2374:3;2362:9;2353:7;2349:23;2345:33;2342:120;;;2381:79;;:::i;:::-;2342:120;2501:1;2526:53;2571:7;2562:6;2551:9;2547:22;2526:53;:::i;:::-;2516:63;;2472:117;2628:2;2654:53;2699:7;2690:6;2679:9;2675:22;2654:53;:::i;:::-;2644:63;;2599:118;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:3;3039:51;3082:7;3073:6;3062:9;3058:22;3039:51;:::i;:::-;3029:61;;2983:117;3139:3;3166:53;3211:7;3202:6;3191:9;3187:22;3166:53;:::i;:::-;3156:63;;3110:119;3268:3;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3239:119;2166:1199;;;;;;;;;;:::o;3371:474::-;3439:6;3447;3496:2;3484:9;3475:7;3471:23;3467:32;3464:119;;;3502:79;;:::i;:::-;3464:119;3622:1;3647:53;3692:7;3683:6;3672:9;3668:22;3647:53;:::i;:::-;3637:63;;3593:117;3749:2;3775:53;3820:7;3811:6;3800:9;3796:22;3775:53;:::i;:::-;3765:63;;3720:118;3371:474;;;;;:::o;3851:1053::-;3953:6;3961;3969;3977;3985;3993;4042:3;4030:9;4021:7;4017:23;4013:33;4010:120;;;4049:79;;:::i;:::-;4010:120;4169:1;4194:53;4239:7;4230:6;4219:9;4215:22;4194:53;:::i;:::-;4184:63;;4140:117;4296:2;4322:53;4367:7;4358:6;4347:9;4343:22;4322:53;:::i;:::-;4312:63;;4267:118;4424:2;4450:53;4495:7;4486:6;4475:9;4471:22;4450:53;:::i;:::-;4440:63;;4395:118;4552:2;4578:51;4621:7;4612:6;4601:9;4597:22;4578:51;:::i;:::-;4568:61;;4523:116;4678:3;4705:53;4750:7;4741:6;4730:9;4726:22;4705:53;:::i;:::-;4695:63;;4649:119;4807:3;4834:53;4879:7;4870:6;4859:9;4855:22;4834:53;:::i;:::-;4824:63;;4778:119;3851:1053;;;;;;;;:::o;4910:472::-;4977:6;4985;5034:2;5022:9;5013:7;5009:23;5005:32;5002:119;;;5040:79;;:::i;:::-;5002:119;5160:1;5185:53;5230:7;5221:6;5210:9;5206:22;5185:53;:::i;:::-;5175:63;;5131:117;5287:2;5313:52;5357:7;5348:6;5337:9;5333:22;5313:52;:::i;:::-;5303:62;;5258:117;4910:472;;;;;:::o;5388:118::-;5475:24;5493:5;5475:24;:::i;:::-;5470:3;5463:37;5388:118;;:::o;5512:109::-;5593:21;5608:5;5593:21;:::i;:::-;5588:3;5581:34;5512:109;;:::o;5627:118::-;5714:24;5732:5;5714:24;:::i;:::-;5709:3;5702:37;5627:118;;:::o;5751:157::-;5856:45;5876:24;5894:5;5876:24;:::i;:::-;5856:45;:::i;:::-;5851:3;5844:58;5751:157;;:::o;5914:364::-;6002:3;6030:39;6063:5;6030:39;:::i;:::-;6085:71;6149:6;6144:3;6085:71;:::i;:::-;6078:78;;6165:52;6210:6;6205:3;6198:4;6191:5;6187:16;6165:52;:::i;:::-;6242:29;6264:6;6242:29;:::i;:::-;6237:3;6233:39;6226:46;;6006:272;5914:364;;;;:::o;6284:366::-;6426:3;6447:67;6511:2;6506:3;6447:67;:::i;:::-;6440:74;;6523:93;6612:3;6523:93;:::i;:::-;6641:2;6636:3;6632:12;6625:19;;6284:366;;;:::o;6656:::-;6798:3;6819:67;6883:2;6878:3;6819:67;:::i;:::-;6812:74;;6895:93;6984:3;6895:93;:::i;:::-;7013:2;7008:3;7004:12;6997:19;;6656:366;;;:::o;7028:::-;7170:3;7191:67;7255:2;7250:3;7191:67;:::i;:::-;7184:74;;7267:93;7356:3;7267:93;:::i;:::-;7385:2;7380:3;7376:12;7369:19;;7028:366;;;:::o;7400:::-;7542:3;7563:67;7627:2;7622:3;7563:67;:::i;:::-;7556:74;;7639:93;7728:3;7639:93;:::i;:::-;7757:2;7752:3;7748:12;7741:19;;7400:366;;;:::o;7772:400::-;7932:3;7953:84;8035:1;8030:3;7953:84;:::i;:::-;7946:91;;8046:93;8135:3;8046:93;:::i;:::-;8164:1;8159:3;8155:11;8148:18;;7772:400;;;:::o;8178:366::-;8320:3;8341:67;8405:2;8400:3;8341:67;:::i;:::-;8334:74;;8417:93;8506:3;8417:93;:::i;:::-;8535:2;8530:3;8526:12;8519:19;;8178:366;;;:::o;8550:::-;8692:3;8713:67;8777:2;8772:3;8713:67;:::i;:::-;8706:74;;8789:93;8878:3;8789:93;:::i;:::-;8907:2;8902:3;8898:12;8891:19;;8550:366;;;:::o;8922:::-;9064:3;9085:67;9149:2;9144:3;9085:67;:::i;:::-;9078:74;;9161:93;9250:3;9161:93;:::i;:::-;9279:2;9274:3;9270:12;9263:19;;8922:366;;;:::o;9294:::-;9436:3;9457:67;9521:2;9516:3;9457:67;:::i;:::-;9450:74;;9533:93;9622:3;9533:93;:::i;:::-;9651:2;9646:3;9642:12;9635:19;;9294:366;;;:::o;9666:::-;9808:3;9829:67;9893:2;9888:3;9829:67;:::i;:::-;9822:74;;9905:93;9994:3;9905:93;:::i;:::-;10023:2;10018:3;10014:12;10007:19;;9666:366;;;:::o;10038:::-;10180:3;10201:67;10265:2;10260:3;10201:67;:::i;:::-;10194:74;;10277:93;10366:3;10277:93;:::i;:::-;10395:2;10390:3;10386:12;10379:19;;10038:366;;;:::o;10410:::-;10552:3;10573:67;10637:2;10632:3;10573:67;:::i;:::-;10566:74;;10649:93;10738:3;10649:93;:::i;:::-;10767:2;10762:3;10758:12;10751:19;;10410:366;;;:::o;10782:::-;10924:3;10945:67;11009:2;11004:3;10945:67;:::i;:::-;10938:74;;11021:93;11110:3;11021:93;:::i;:::-;11139:2;11134:3;11130:12;11123:19;;10782:366;;;:::o;11154:::-;11296:3;11317:67;11381:2;11376:3;11317:67;:::i;:::-;11310:74;;11393:93;11482:3;11393:93;:::i;:::-;11511:2;11506:3;11502:12;11495:19;;11154:366;;;:::o;11526:::-;11668:3;11689:67;11753:2;11748:3;11689:67;:::i;:::-;11682:74;;11765:93;11854:3;11765:93;:::i;:::-;11883:2;11878:3;11874:12;11867:19;;11526:366;;;:::o;11898:::-;12040:3;12061:67;12125:2;12120:3;12061:67;:::i;:::-;12054:74;;12137:93;12226:3;12137:93;:::i;:::-;12255:2;12250:3;12246:12;12239:19;;11898:366;;;:::o;12270:::-;12412:3;12433:67;12497:2;12492:3;12433:67;:::i;:::-;12426:74;;12509:93;12598:3;12509:93;:::i;:::-;12627:2;12622:3;12618:12;12611:19;;12270:366;;;:::o;12642:::-;12784:3;12805:67;12869:2;12864:3;12805:67;:::i;:::-;12798:74;;12881:93;12970:3;12881:93;:::i;:::-;12999:2;12994:3;12990:12;12983:19;;12642:366;;;:::o;13014:::-;13156:3;13177:67;13241:2;13236:3;13177:67;:::i;:::-;13170:74;;13253:93;13342:3;13253:93;:::i;:::-;13371:2;13366:3;13362:12;13355:19;;13014:366;;;:::o;13386:::-;13528:3;13549:67;13613:2;13608:3;13549:67;:::i;:::-;13542:74;;13625:93;13714:3;13625:93;:::i;:::-;13743:2;13738:3;13734:12;13727:19;;13386:366;;;:::o;13758:::-;13900:3;13921:67;13985:2;13980:3;13921:67;:::i;:::-;13914:74;;13997:93;14086:3;13997:93;:::i;:::-;14115:2;14110:3;14106:12;14099:19;;13758:366;;;:::o;14130:118::-;14217:24;14235:5;14217:24;:::i;:::-;14212:3;14205:37;14130:118;;:::o;14254:115::-;14339:23;14356:5;14339:23;:::i;:::-;14334:3;14327:36;14254:115;;:::o;14375:112::-;14458:22;14474:5;14458:22;:::i;:::-;14453:3;14446:35;14375:112;;:::o;14493:663::-;14734:3;14756:148;14900:3;14756:148;:::i;:::-;14749:155;;14914:75;14985:3;14976:6;14914:75;:::i;:::-;15014:2;15009:3;15005:12;14998:19;;15027:75;15098:3;15089:6;15027:75;:::i;:::-;15127:2;15122:3;15118:12;15111:19;;15147:3;15140:10;;14493:663;;;;;:::o;15162:222::-;15255:4;15293:2;15282:9;15278:18;15270:26;;15306:71;15374:1;15363:9;15359:17;15350:6;15306:71;:::i;:::-;15162:222;;;;:::o;15390:210::-;15477:4;15515:2;15504:9;15500:18;15492:26;;15528:65;15590:1;15579:9;15575:17;15566:6;15528:65;:::i;:::-;15390:210;;;;:::o;15606:222::-;15699:4;15737:2;15726:9;15722:18;15714:26;;15750:71;15818:1;15807:9;15803:17;15794:6;15750:71;:::i;:::-;15606:222;;;;:::o;15834:775::-;16067:4;16105:3;16094:9;16090:19;16082:27;;16119:71;16187:1;16176:9;16172:17;16163:6;16119:71;:::i;:::-;16200:72;16268:2;16257:9;16253:18;16244:6;16200:72;:::i;:::-;16282;16350:2;16339:9;16335:18;16326:6;16282:72;:::i;:::-;16364;16432:2;16421:9;16417:18;16408:6;16364:72;:::i;:::-;16446:73;16514:3;16503:9;16499:19;16490:6;16446:73;:::i;:::-;16529;16597:3;16586:9;16582:19;16573:6;16529:73;:::i;:::-;15834:775;;;;;;;;;:::o;16615:553::-;16792:4;16830:3;16819:9;16815:19;16807:27;;16844:71;16912:1;16901:9;16897:17;16888:6;16844:71;:::i;:::-;16925:72;16993:2;16982:9;16978:18;16969:6;16925:72;:::i;:::-;17007;17075:2;17064:9;17060:18;17051:6;17007:72;:::i;:::-;17089;17157:2;17146:9;17142:18;17133:6;17089:72;:::i;:::-;16615:553;;;;;;;:::o;17174:664::-;17379:4;17417:3;17406:9;17402:19;17394:27;;17431:71;17499:1;17488:9;17484:17;17475:6;17431:71;:::i;:::-;17512:72;17580:2;17569:9;17565:18;17556:6;17512:72;:::i;:::-;17594;17662:2;17651:9;17647:18;17638:6;17594:72;:::i;:::-;17676;17744:2;17733:9;17729:18;17720:6;17676:72;:::i;:::-;17758:73;17826:3;17815:9;17811:19;17802:6;17758:73;:::i;:::-;17174:664;;;;;;;;:::o;17844:553::-;18021:4;18059:3;18048:9;18044:19;18036:27;;18073:71;18141:1;18130:9;18126:17;18117:6;18073:71;:::i;:::-;18154:72;18222:2;18211:9;18207:18;18198:6;18154:72;:::i;:::-;18236;18304:2;18293:9;18289:18;18280:6;18236:72;:::i;:::-;18318;18386:2;18375:9;18371:18;18362:6;18318:72;:::i;:::-;17844:553;;;;;;;:::o;18403:545::-;18576:4;18614:3;18603:9;18599:19;18591:27;;18628:71;18696:1;18685:9;18681:17;18672:6;18628:71;:::i;:::-;18709:68;18773:2;18762:9;18758:18;18749:6;18709:68;:::i;:::-;18787:72;18855:2;18844:9;18840:18;18831:6;18787:72;:::i;:::-;18869;18937:2;18926:9;18922:18;18913:6;18869:72;:::i;:::-;18403:545;;;;;;;:::o;18954:313::-;19067:4;19105:2;19094:9;19090:18;19082:26;;19154:9;19148:4;19144:20;19140:1;19129:9;19125:17;19118:47;19182:78;19255:4;19246:6;19182:78;:::i;:::-;19174:86;;18954:313;;;;:::o;19273:419::-;19439:4;19477:2;19466:9;19462:18;19454:26;;19526:9;19520:4;19516:20;19512:1;19501:9;19497:17;19490:47;19554:131;19680:4;19554:131;:::i;:::-;19546:139;;19273:419;;;:::o;19698:::-;19864:4;19902:2;19891:9;19887:18;19879:26;;19951:9;19945:4;19941:20;19937:1;19926:9;19922:17;19915:47;19979:131;20105:4;19979:131;:::i;:::-;19971:139;;19698:419;;;:::o;20123:::-;20289:4;20327:2;20316:9;20312:18;20304:26;;20376:9;20370:4;20366:20;20362:1;20351:9;20347:17;20340:47;20404:131;20530:4;20404:131;:::i;:::-;20396:139;;20123:419;;;:::o;20548:::-;20714:4;20752:2;20741:9;20737:18;20729:26;;20801:9;20795:4;20791:20;20787:1;20776:9;20772:17;20765:47;20829:131;20955:4;20829:131;:::i;:::-;20821:139;;20548:419;;;:::o;20973:::-;21139:4;21177:2;21166:9;21162:18;21154:26;;21226:9;21220:4;21216:20;21212:1;21201:9;21197:17;21190:47;21254:131;21380:4;21254:131;:::i;:::-;21246:139;;20973:419;;;:::o;21398:::-;21564:4;21602:2;21591:9;21587:18;21579:26;;21651:9;21645:4;21641:20;21637:1;21626:9;21622:17;21615:47;21679:131;21805:4;21679:131;:::i;:::-;21671:139;;21398:419;;;:::o;21823:::-;21989:4;22027:2;22016:9;22012:18;22004:26;;22076:9;22070:4;22066:20;22062:1;22051:9;22047:17;22040:47;22104:131;22230:4;22104:131;:::i;:::-;22096:139;;21823:419;;;:::o;22248:::-;22414:4;22452:2;22441:9;22437:18;22429:26;;22501:9;22495:4;22491:20;22487:1;22476:9;22472:17;22465:47;22529:131;22655:4;22529:131;:::i;:::-;22521:139;;22248:419;;;:::o;22673:::-;22839:4;22877:2;22866:9;22862:18;22854:26;;22926:9;22920:4;22916:20;22912:1;22901:9;22897:17;22890:47;22954:131;23080:4;22954:131;:::i;:::-;22946:139;;22673:419;;;:::o;23098:::-;23264:4;23302:2;23291:9;23287:18;23279:26;;23351:9;23345:4;23341:20;23337:1;23326:9;23322:17;23315:47;23379:131;23505:4;23379:131;:::i;:::-;23371:139;;23098:419;;;:::o;23523:::-;23689:4;23727:2;23716:9;23712:18;23704:26;;23776:9;23770:4;23766:20;23762:1;23751:9;23747:17;23740:47;23804:131;23930:4;23804:131;:::i;:::-;23796:139;;23523:419;;;:::o;23948:::-;24114:4;24152:2;24141:9;24137:18;24129:26;;24201:9;24195:4;24191:20;24187:1;24176:9;24172:17;24165:47;24229:131;24355:4;24229:131;:::i;:::-;24221:139;;23948:419;;;:::o;24373:::-;24539:4;24577:2;24566:9;24562:18;24554:26;;24626:9;24620:4;24616:20;24612:1;24601:9;24597:17;24590:47;24654:131;24780:4;24654:131;:::i;:::-;24646:139;;24373:419;;;:::o;24798:::-;24964:4;25002:2;24991:9;24987:18;24979:26;;25051:9;25045:4;25041:20;25037:1;25026:9;25022:17;25015:47;25079:131;25205:4;25079:131;:::i;:::-;25071:139;;24798:419;;;:::o;25223:::-;25389:4;25427:2;25416:9;25412:18;25404:26;;25476:9;25470:4;25466:20;25462:1;25451:9;25447:17;25440:47;25504:131;25630:4;25504:131;:::i;:::-;25496:139;;25223:419;;;:::o;25648:::-;25814:4;25852:2;25841:9;25837:18;25829:26;;25901:9;25895:4;25891:20;25887:1;25876:9;25872:17;25865:47;25929:131;26055:4;25929:131;:::i;:::-;25921:139;;25648:419;;;:::o;26073:::-;26239:4;26277:2;26266:9;26262:18;26254:26;;26326:9;26320:4;26316:20;26312:1;26301:9;26297:17;26290:47;26354:131;26480:4;26354:131;:::i;:::-;26346:139;;26073:419;;;:::o;26498:::-;26664:4;26702:2;26691:9;26687:18;26679:26;;26751:9;26745:4;26741:20;26737:1;26726:9;26722:17;26715:47;26779:131;26905:4;26779:131;:::i;:::-;26771:139;;26498:419;;;:::o;26923:::-;27089:4;27127:2;27116:9;27112:18;27104:26;;27176:9;27170:4;27166:20;27162:1;27151:9;27147:17;27140:47;27204:131;27330:4;27204:131;:::i;:::-;27196:139;;26923:419;;;:::o;27348:::-;27514:4;27552:2;27541:9;27537:18;27529:26;;27601:9;27595:4;27591:20;27587:1;27576:9;27572:17;27565:47;27629:131;27755:4;27629:131;:::i;:::-;27621:139;;27348:419;;;:::o;27773:222::-;27866:4;27904:2;27893:9;27889:18;27881:26;;27917:71;27985:1;27974:9;27970:17;27961:6;27917:71;:::i;:::-;27773:222;;;;:::o;28001:332::-;28122:4;28160:2;28149:9;28145:18;28137:26;;28173:71;28241:1;28230:9;28226:17;28217:6;28173:71;:::i;:::-;28254:72;28322:2;28311:9;28307:18;28298:6;28254:72;:::i;:::-;28001:332;;;;;:::o;28339:218::-;28430:4;28468:2;28457:9;28453:18;28445:26;;28481:69;28547:1;28536:9;28532:17;28523:6;28481:69;:::i;:::-;28339:218;;;;:::o;28563:328::-;28682:4;28720:2;28709:9;28705:18;28697:26;;28733:69;28799:1;28788:9;28784:17;28775:6;28733:69;:::i;:::-;28812:72;28880:2;28869:9;28865:18;28856:6;28812:72;:::i;:::-;28563:328;;;;;:::o;28897:214::-;28986:4;29024:2;29013:9;29009:18;29001:26;;29037:67;29101:1;29090:9;29086:17;29077:6;29037:67;:::i;:::-;28897:214;;;;:::o;29198:99::-;29250:6;29284:5;29278:12;29268:22;;29198:99;;;:::o;29303:169::-;29387:11;29421:6;29416:3;29409:19;29461:4;29456:3;29452:14;29437:29;;29303:169;;;;:::o;29478:148::-;29580:11;29617:3;29602:18;;29478:148;;;;:::o;29632:305::-;29672:3;29691:20;29709:1;29691:20;:::i;:::-;29686:25;;29725:20;29743:1;29725:20;:::i;:::-;29720:25;;29879:1;29811:66;29807:74;29804:1;29801:81;29798:107;;;29885:18;;:::i;:::-;29798:107;29929:1;29926;29922:9;29915:16;;29632:305;;;;:::o;29943:246::-;29982:3;30001:19;30018:1;30001:19;:::i;:::-;29996:24;;30034:19;30051:1;30034:19;:::i;:::-;30029:24;;30131:1;30119:10;30115:18;30112:1;30109:25;30106:51;;;30137:18;;:::i;:::-;30106:51;30181:1;30178;30174:9;30167:16;;29943:246;;;;:::o;30195:182::-;30234:1;30251:19;30268:1;30251:19;:::i;:::-;30246:24;;30284:19;30301:1;30284:19;:::i;:::-;30279:24;;30322:1;30312:35;;30327:18;;:::i;:::-;30312:35;30369:1;30366;30362:9;30357:14;;30195:182;;;;:::o;30383:191::-;30423:4;30443:20;30461:1;30443:20;:::i;:::-;30438:25;;30477:20;30495:1;30477:20;:::i;:::-;30472:25;;30516:1;30513;30510:8;30507:34;;;30521:18;;:::i;:::-;30507:34;30566:1;30563;30559:9;30551:17;;30383:191;;;;:::o;30580:188::-;30619:4;30639:19;30656:1;30639:19;:::i;:::-;30634:24;;30672:19;30689:1;30672:19;:::i;:::-;30667:24;;30710:1;30707;30704:8;30701:34;;;30715:18;;:::i;:::-;30701:34;30760:1;30757;30753:9;30745:17;;30580:188;;;;:::o;30774:96::-;30811:7;30840:24;30858:5;30840:24;:::i;:::-;30829:35;;30774:96;;;:::o;30876:90::-;30910:7;30953:5;30946:13;30939:21;30928:32;;30876:90;;;:::o;30972:77::-;31009:7;31038:5;31027:16;;30972:77;;;:::o;31055:126::-;31092:7;31132:42;31125:5;31121:54;31110:65;;31055:126;;;:::o;31187:77::-;31224:7;31253:5;31242:16;;31187:77;;;:::o;31270:93::-;31306:7;31346:10;31339:5;31335:22;31324:33;;31270:93;;;:::o;31369:86::-;31404:7;31444:4;31437:5;31433:16;31422:27;;31369:86;;;:::o;31461:307::-;31529:1;31539:113;31553:6;31550:1;31547:13;31539:113;;;31638:1;31633:3;31629:11;31623:18;31619:1;31614:3;31610:11;31603:39;31575:2;31572:1;31568:10;31563:15;;31539:113;;;31670:6;31667:1;31664:13;31661:101;;;31750:1;31741:6;31736:3;31732:16;31725:27;31661:101;31510:258;31461:307;;;:::o;31774:320::-;31818:6;31855:1;31849:4;31845:12;31835:22;;31902:1;31896:4;31892:12;31923:18;31913:81;;31979:4;31971:6;31967:17;31957:27;;31913:81;32041:2;32033:6;32030:14;32010:18;32007:38;32004:84;;;32060:18;;:::i;:::-;32004:84;31825:269;31774:320;;;:::o;32100:79::-;32139:7;32168:5;32157:16;;32100:79;;;:::o;32185:180::-;32233:77;32230:1;32223:88;32330:4;32327:1;32320:15;32354:4;32351:1;32344:15;32371:180;32419:77;32416:1;32409:88;32516:4;32513:1;32506:15;32540:4;32537:1;32530:15;32557:180;32605:77;32602:1;32595:88;32702:4;32699:1;32692:15;32726:4;32723:1;32716:15;32866:117;32975:1;32972;32965:12;32989:102;33030:6;33081:2;33077:7;33072:2;33065:5;33061:14;33057:28;33047:38;;32989:102;;;:::o;33097:174::-;33237:26;33233:1;33225:6;33221:14;33214:50;33097:174;:::o;33277:222::-;33417:34;33413:1;33405:6;33401:14;33394:58;33486:5;33481:2;33473:6;33469:15;33462:30;33277:222;:::o;33505:225::-;33645:34;33641:1;33633:6;33629:14;33622:58;33714:8;33709:2;33701:6;33697:15;33690:33;33505:225;:::o;33736:221::-;33876:34;33872:1;33864:6;33860:14;33853:58;33945:4;33940:2;33932:6;33928:15;33921:29;33736:221;:::o;33963:214::-;34103:66;34099:1;34091:6;34087:14;34080:90;33963:214;:::o;34183:179::-;34323:31;34319:1;34311:6;34307:14;34300:55;34183:179;:::o;34368:225::-;34508:34;34504:1;34496:6;34492:14;34485:58;34577:8;34572:2;34564:6;34560:15;34553:33;34368:225;:::o;34599:221::-;34739:34;34735:1;34727:6;34723:14;34716:58;34808:4;34803:2;34795:6;34791:15;34784:29;34599:221;:::o;34826:225::-;34966:34;34962:1;34954:6;34950:14;34943:58;35035:8;35030:2;35022:6;35018:15;35011:33;34826:225;:::o;35057:224::-;35197:34;35193:1;35185:6;35181:14;35174:58;35266:7;35261:2;35253:6;35249:15;35242:32;35057:224;:::o;35287:221::-;35427:34;35423:1;35415:6;35411:14;35404:58;35496:4;35491:2;35483:6;35479:15;35472:29;35287:221;:::o;35514:226::-;35654:34;35650:1;35642:6;35638:14;35631:58;35723:9;35718:2;35710:6;35706:15;35699:34;35514:226;:::o;35746:180::-;35886:32;35882:1;35874:6;35870:14;35863:56;35746:180;:::o;35932:227::-;36072:34;36068:1;36060:6;36056:14;36049:58;36141:10;36136:2;36128:6;36124:15;36117:35;35932:227;:::o;36165:182::-;36305:34;36301:1;36293:6;36289:14;36282:58;36165:182;:::o;36353:224::-;36493:34;36489:1;36481:6;36477:14;36470:58;36562:7;36557:2;36549:6;36545:15;36538:32;36353:224;:::o;36583:220::-;36723:34;36719:1;36711:6;36707:14;36700:58;36792:3;36787:2;36779:6;36775:15;36768:28;36583:220;:::o;36809:223::-;36949:34;36945:1;36937:6;36933:14;36926:58;37018:6;37013:2;37005:6;37001:15;36994:31;36809:223;:::o;37038:224::-;37178:34;37174:1;37166:6;37162:14;37155:58;37247:7;37242:2;37234:6;37230:15;37223:32;37038:224;:::o;37268:::-;37408:34;37404:1;37396:6;37392:14;37385:58;37477:7;37472:2;37464:6;37460:15;37453:32;37268:224;:::o;37498:181::-;37638:33;37634:1;37626:6;37622:14;37615:57;37498:181;:::o;37685:122::-;37758:24;37776:5;37758:24;:::i;:::-;37751:5;37748:35;37738:63;;37797:1;37794;37787:12;37738:63;37685:122;:::o;37813:::-;37886:24;37904:5;37886:24;:::i;:::-;37879:5;37876:35;37866:63;;37925:1;37922;37915:12;37866:63;37813:122;:::o;37941:::-;38014:24;38032:5;38014:24;:::i;:::-;38007:5;38004:35;37994:63;;38053:1;38050;38043:12;37994:63;37941:122;:::o;38069:120::-;38141:23;38158:5;38141:23;:::i;:::-;38134:5;38131:34;38121:62;;38179:1;38176;38169:12;38121:62;38069:120;:::o;38195:118::-;38266:22;38282:5;38266:22;:::i;:::-;38259:5;38256:33;38246:61;;38303:1;38300;38293:12;38246:61;38195:118;:::o

Swarm Source

ipfs://fdf1ba415f7eadd3c49ceb06ee3388d21d9b21dfa213685332ae54aabc5e13ad
Loading