ETH Price: $3,419.14 (-6.73%)

Token

Wunks (WUNKS)
 

Overview

Max Total Supply

498 WUNKS

Holders

122

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 WUNKS
0x28d02f67316123dc0293849a0d254ad86b379b34
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Wunks

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-03
*/

// SPDX-License-Identifier: MIT

// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

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) {
        return msg.data;
    }
}

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity ^0.8.6;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

pragma solidity ^0.8.7;

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
    
    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) 
        public 
        view 
        virtual 
        override 
        returns (uint) 
    {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count;
        for( uint i; i < _owners.length; ++i ){
          if( owner == _owners[i] )
            ++count;
        }
        return count;
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.7;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account but rips out the core of the gas-wasting processing that comes from OpenZeppelin.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < _owners.length, "ERC721Enumerable: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");

        uint count;
        for(uint i; i < _owners.length; i++){
            if(owner == _owners[i]){
                if(count == index) return i;
                else count++;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}

// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}



pragma solidity ^0.8.11;
pragma abicoder v2;

contract Wunks is ERC721Enumerable, Ownable, ReentrancyGuard {
  using SafeMath for uint256;
  
  bool public saleIsActive = false;
  string public FINAL_PROVENANCE = "";
  uint256 public constant tokenPrice = 25000000000000000;
  
  uint public constant maxTokenPurchase = 36;
  
  uint256 public constant MAX_TOKENS = 10001;
  uint256 public constant MAX_FREE_PER_USER_TOKENS = 6;
  uint256 public constant FREE_TOKENS = 501;
  
  address public proxyRegistryAddress;
  mapping(address => bool) public projectProxy;
  string public baseURI;
    
  constructor() ERC721("Wunks", "WUNKS") {
    setBaseURI("https://blam.io/api/e73a28bc-cef7-4375-9a63-3698423b4c3d/token/");
    proxyRegistryAddress = address(0xa5409ec958C83C3f309868babACA7c86DCB077c1);

    for(uint i = 0; i < 3; i++) {
      _safeMint(msg.sender, totalSupply());
    }
  }
    
  function setProxyRegistryAddress(address _proxyRegistryAddress) external onlyOwner {
    proxyRegistryAddress = _proxyRegistryAddress;
  }
  
  function flipProxyState(address proxyAddress) public onlyOwner {
    projectProxy[proxyAddress] = !projectProxy[proxyAddress];
  }

  function withdraw() public onlyOwner nonReentrant {
    uint256 balance = address(this).balance;
    require(balance > 0);

    (bool ownerSuccess, ) = _msgSender().call{value: address(this).balance}("");
    require(ownerSuccess, "Failed to send to Owner.");
  }

  function setProvenanceHash(string memory provenanceHash) public onlyOwner {
    FINAL_PROVENANCE = provenanceHash;
  }

  function setBaseURI(string memory _baseURI) public onlyOwner {
    baseURI = _baseURI;
  }

  function flipSaleState() public onlyOwner {
    saleIsActive = !saleIsActive;
  }
  
  function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
      // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 index;
      for (index = 0; index < tokenCount; index++) {
        result[index] = tokenOfOwnerByIndex(_owner, index);
      }
      return result;
    }
  }
  
  function freeMint(uint numberOfTokens) public nonReentrant {
    require(saleIsActive, "Sale must be active to mint");
    require(balanceOf(msg.sender).add(numberOfTokens) < MAX_FREE_PER_USER_TOKENS, "You can't mint any more free Wunks.");
    require(numberOfTokens > 0 && numberOfTokens < MAX_FREE_PER_USER_TOKENS, "Can only mint 5 free Wunks");
    require(totalSupply().add(numberOfTokens) < FREE_TOKENS, "Purchase would exceed free supply");
    
    for(uint i = 0; i < numberOfTokens; i++) {
      _safeMint(msg.sender, totalSupply());
    }
  }
  
  function mintToken(uint numberOfTokens) public payable nonReentrant {
    require(saleIsActive, "Sale must be active to mint");
    require(balanceOf(msg.sender) < maxTokenPurchase, "You can't mint any more.");
    require(numberOfTokens > 0 && numberOfTokens < maxTokenPurchase, "Can only mint 35 tokens at a time");
    require(totalSupply().add(numberOfTokens) < MAX_TOKENS, "Purchase would exceed max supply");
    require(msg.value == tokenPrice.mul(numberOfTokens), "Ether value sent is not correct");
    
    for(uint i = 0; i < numberOfTokens; i++) {
      _safeMint(msg.sender, totalSupply());
    }
  }

  function tokenURI(uint256 _tokenId) external view returns (string memory) {
    require(_exists(_tokenId), "Token does not exist.");
    return string(abi.encodePacked(baseURI, Strings.toString(_tokenId)));
  }

  function isApprovedForAll(address _owner, address operator) public view override returns (bool) {
    OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(proxyRegistryAddress);
    if (address(proxyRegistry.proxies(_owner)) == operator || projectProxy[operator]) return true;
    return super.isApprovedForAll(_owner, operator);
  }
}

contract OwnableDelegateProxy {}
contract OpenSeaProxyRegistry {
  mapping(address => OwnableDelegateProxy) public proxies;
}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FINAL_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_PER_USER_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"projectProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600760006101000a81548160ff02191690831515021790555060405180602001604052806000815250600890805190602001906200004692919062000817565b503480156200005457600080fd5b506040518060400160405280600581526020017f57756e6b730000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f57554e4b530000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d992919062000817565b508060019080519060200190620000f292919062000817565b5050506200011562000109620001e760201b60201c565b620001ef60201b60201c565b6001600681905550620001476040518060600160405280603f8152602001620056e1603f9139620002b560201b60201c565b73a5409ec958c83c3f309868babaca7c86dcb077c1600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b6003811015620001e057620001ca33620001be6200036060201b60201c565b6200036d60201b60201c565b8080620001d79062000900565b9150506200019f565b5062000dc3565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002c5620001e760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002eb6200039360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000344576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033b90620009af565b60405180910390fd5b80600b90805190602001906200035c92919062000817565b5050565b6000600280549050905090565b6200038f828260405180602001604052806000815250620003bd60201b60201c565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620003cf83836200042b60201b60201c565b620003e46000848484620005c960201b60201c565b62000426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041d9062000a47565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200049e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004959062000ab9565b60405180910390fd5b620004af816200077360201b60201c565b15620004f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e99062000b2b565b60405180910390fd5b6200050660008383620007ff60201b60201c565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620005f78473ffffffffffffffffffffffffffffffffffffffff166200080460201b620021631760201c565b1562000766578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000629620001e760201b60201c565b8786866040518563ffffffff1660e01b81526004016200064d949392919062000c47565b6020604051808303816000875af19250505080156200068c57506040513d601f19601f8201168201806040525081019062000689919062000cfd565b60015b62000715573d8060008114620006bf576040519150601f19603f3d011682016040523d82523d6000602084013e620006c4565b606091505b506000815114156200070d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007049062000a47565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200076b565b600190505b949350505050565b600060028054905082108015620007f85750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110620007b457620007b362000d2f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b505050565b600080823b905060008111915050919050565b828054620008259062000d8d565b90600052602060002090601f01602090048101928262000849576000855562000895565b82601f106200086457805160ff191683800117855562000895565b8280016001018555821562000895579182015b828111156200089457825182559160200191906001019062000877565b5b509050620008a49190620008a8565b5090565b5b80821115620008c3576000816000905550600101620008a9565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006200090d82620008f6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620009435762000942620008c7565b5b600182019050919050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620009976020836200094e565b9150620009a4826200095f565b602082019050919050565b60006020820190508181036000830152620009ca8162000988565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600062000a2f6032836200094e565b915062000a3c82620009d1565b604082019050919050565b6000602082019050818103600083015262000a628162000a20565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600062000aa16020836200094e565b915062000aae8262000a69565b602082019050919050565b6000602082019050818103600083015262000ad48162000a92565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062000b13601c836200094e565b915062000b208262000adb565b602082019050919050565b6000602082019050818103600083015262000b468162000b04565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b7a8262000b4d565b9050919050565b62000b8c8162000b6d565b82525050565b62000b9d81620008f6565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000bdf57808201518184015260208101905062000bc2565b8381111562000bef576000848401525b50505050565b6000601f19601f8301169050919050565b600062000c138262000ba3565b62000c1f818562000bae565b935062000c3181856020860162000bbf565b62000c3c8162000bf5565b840191505092915050565b600060808201905062000c5e600083018762000b81565b62000c6d602083018662000b81565b62000c7c604083018562000b92565b818103606083015262000c90818462000c06565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000cd78162000ca0565b811462000ce357600080fd5b50565b60008151905062000cf78162000ccc565b92915050565b60006020828403121562000d165762000d1562000c9b565b5b600062000d268482850162000ce6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000da657607f821691505b6020821081141562000dbd5762000dbc62000d5e565b5b50919050565b61490e8062000dd36000396000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063c634d032116100ab578063eb8d24441161006f578063eb8d24441461080c578063eee97f9714610837578063f2fde38b14610862578063f47c84c51461088b578063f73c814b146108b657610225565b8063c634d03214610722578063c87b56dd1461073e578063cd7c03261461077b578063d26ea6c0146107a6578063e985e9c5146107cf57610225565b80638da5cb5b116100f25780638da5cb5b1461064f57806395d89b411461067a578063a22cb465146106a5578063b88d4fde146106ce578063b8d5ed2d146106f757610225565b8063715018a6146105a75780637c928fe9146105be5780637ff9b596146105e75780638462151c1461061257610225565b806334918dfd116101b15780635bab26e2116101755780635bab26e21461049a5780636352211e146104d75780636c0360eb146105145780636dbc45821461053f57806370a082311461056a57610225565b806334918dfd146103dd5780633ccfd60b146103f457806342842e0e1461040b5780634f6ccce71461043457806355f804b31461047157610225565b806309aa3dcf116101f857806309aa3dcf146102f8578063109695231461032357806318160ddd1461034c57806323b872dd146103775780632f745c59146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612e82565b6108df565b60405161025e9190612eca565b60405180910390f35b34801561027357600080fd5b5061027c610959565b6040516102899190612f7e565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612fd6565b6109eb565b6040516102c69190613044565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f1919061308b565b610a70565b005b34801561030457600080fd5b5061030d610b88565b60405161031a91906130da565b60405180910390f35b34801561032f57600080fd5b5061034a6004803603810190610345919061322a565b610b8d565b005b34801561035857600080fd5b50610361610c23565b60405161036e91906130da565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613273565b610c30565b005b3480156103ac57600080fd5b506103c760048036038101906103c2919061308b565b610c90565b6040516103d491906130da565b60405180910390f35b3480156103e957600080fd5b506103f2610dd5565b005b34801561040057600080fd5b50610409610e7d565b005b34801561041757600080fd5b50610432600480360381019061042d9190613273565b611018565b005b34801561044057600080fd5b5061045b60048036038101906104569190612fd6565b611038565b60405161046891906130da565b60405180910390f35b34801561047d57600080fd5b506104986004803603810190610493919061322a565b611089565b005b3480156104a657600080fd5b506104c160048036038101906104bc91906132c6565b61111f565b6040516104ce9190612eca565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190612fd6565b61113f565b60405161050b9190613044565b60405180910390f35b34801561052057600080fd5b506105296111fc565b6040516105369190612f7e565b60405180910390f35b34801561054b57600080fd5b5061055461128a565b60405161056191906130da565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c91906132c6565b611290565b60405161059e91906130da565b60405180910390f35b3480156105b357600080fd5b506105bc6113ac565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190612fd6565b611434565b005b3480156105f357600080fd5b506105fc611615565b60405161060991906130da565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906132c6565b611620565b60405161064691906133b1565b60405180910390f35b34801561065b57600080fd5b5061066461172a565b6040516106719190613044565b60405180910390f35b34801561068657600080fd5b5061068f611754565b60405161069c9190612f7e565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c791906133ff565b6117e6565b005b3480156106da57600080fd5b506106f560048036038101906106f091906134e0565b611967565b005b34801561070357600080fd5b5061070c6119c9565b60405161071991906130da565b60405180910390f35b61073c60048036038101906107379190612fd6565b6119ce565b005b34801561074a57600080fd5b5061076560048036038101906107609190612fd6565b611bf8565b6040516107729190612f7e565b60405180910390f35b34801561078757600080fd5b50610790611c74565b60405161079d9190613044565b60405180910390f35b3480156107b257600080fd5b506107cd60048036038101906107c891906132c6565b611c9a565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613563565b611d5a565b6040516108039190612eca565b60405180910390f35b34801561081857600080fd5b50610821611ea1565b60405161082e9190612eca565b60405180910390f35b34801561084357600080fd5b5061084c611eb4565b6040516108599190612f7e565b60405180910390f35b34801561086e57600080fd5b50610889600480360381019061088491906132c6565b611f42565b005b34801561089757600080fd5b506108a061203a565b6040516108ad91906130da565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d891906132c6565b612040565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610952575061095182612176565b5b9050919050565b606060008054610968906135d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610994906135d2565b80156109e15780601f106109b6576101008083540402835291602001916109e1565b820191906000526020600020905b8154815290600101906020018083116109c457829003601f168201915b5050505050905090565b60006109f682612258565b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613676565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7b8261113f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae390613708565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0b6122e0565b73ffffffffffffffffffffffffffffffffffffffff161480610b3a5750610b3981610b346122e0565b611d5a565b5b610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b709061379a565b60405180910390fd5b610b8383836122e8565b505050565b602481565b610b956122e0565b73ffffffffffffffffffffffffffffffffffffffff16610bb361172a565b73ffffffffffffffffffffffffffffffffffffffff1614610c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0090613806565b60405180910390fd5b8060089080519060200190610c1f929190612d73565b5050565b6000600280549050905090565b610c41610c3b6122e0565b826123a1565b610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7790613898565b60405180910390fd5b610c8b83838361247f565b505050565b6000610c9b83611290565b8210610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd39061392a565b60405180910390fd5b6000805b600280549050811015610d935760028181548110610d0157610d0061394a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d805783821415610d71578092505050610dcf565b8180610d7c906139a8565b9250505b8080610d8b906139a8565b915050610ce0565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061392a565b60405180910390fd5b92915050565b610ddd6122e0565b73ffffffffffffffffffffffffffffffffffffffff16610dfb61172a565b73ffffffffffffffffffffffffffffffffffffffff1614610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890613806565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b610e856122e0565b73ffffffffffffffffffffffffffffffffffffffff16610ea361172a565b73ffffffffffffffffffffffffffffffffffffffff1614610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090613806565b60405180910390fd5b60026006541415610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690613a3d565b60405180910390fd5b6002600681905550600047905060008111610f5957600080fd5b6000610f636122e0565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f8690613a8e565b60006040518083038185875af1925050503d8060008114610fc3576040519150601f19603f3d011682016040523d82523d6000602084013e610fc8565b606091505b505090508061100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390613aef565b60405180910390fd5b50506001600681905550565b61103383838360405180602001604052806000815250611967565b505050565b60006002805490508210611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890613b81565b60405180910390fd5b819050919050565b6110916122e0565b73ffffffffffffffffffffffffffffffffffffffff166110af61172a565b73ffffffffffffffffffffffffffffffffffffffff1614611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90613806565b60405180910390fd5b80600b908051906020019061111b929190612d73565b5050565b600a6020528060005260406000206000915054906101000a900460ff1681565b600080600283815481106111565761115561394a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90613c13565b60405180910390fd5b80915050919050565b600b8054611209906135d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611235906135d2565b80156112825780601f1061125757610100808354040283529160200191611282565b820191906000526020600020905b81548152906001019060200180831161126557829003601f168201915b505050505081565b6101f581565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f890613ca5565b60405180910390fd5b6000805b6002805490508110156113a257600281815481106113265761132561394a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611391578161138e906139a8565b91505b8061139b906139a8565b9050611305565b5080915050919050565b6113b46122e0565b73ffffffffffffffffffffffffffffffffffffffff166113d261172a565b73ffffffffffffffffffffffffffffffffffffffff1614611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90613806565b60405180910390fd5b6114326000612638565b565b6002600654141561147a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147190613a3d565b60405180910390fd5b6002600681905550600760009054906101000a900460ff166114d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c890613d11565b60405180910390fd5b60066114ee826114e033611290565b6126fe90919063ffffffff16565b1061152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613da3565b60405180910390fd5b60008111801561153e5750600681105b61157d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157490613e0f565b60405180910390fd5b6101f561159a8261158c610c23565b6126fe90919063ffffffff16565b106115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190613ea1565b60405180910390fd5b60005b81811015611609576115f6336115f1610c23565b612714565b8080611601906139a8565b9150506115dd565b50600160068190555050565b6658d15e1762800081565b6060600061162d83611290565b9050600081141561168a57600067ffffffffffffffff811115611653576116526130ff565b5b6040519080825280602002602001820160405280156116815781602001602082028036833780820191505090505b50915050611725565b60008167ffffffffffffffff8111156116a6576116a56130ff565b5b6040519080825280602002602001820160405280156116d45781602001602082028036833780820191505090505b50905060005b8281101561171e576116ec8582610c90565b8282815181106116ff576116fe61394a565b5b6020026020010181815250508080611716906139a8565b9150506116da565b8193505050505b919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611763906135d2565b80601f016020809104026020016040519081016040528092919081815260200182805461178f906135d2565b80156117dc5780601f106117b1576101008083540402835291602001916117dc565b820191906000526020600020905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b6117ee6122e0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390613f0d565b60405180910390fd5b80600460006118696122e0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119166122e0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161195b9190612eca565b60405180910390a35050565b6119786119726122e0565b836123a1565b6119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90613898565b60405180910390fd5b6119c384848484612732565b50505050565b600681565b60026006541415611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b90613a3d565b60405180910390fd5b6002600681905550600760009054906101000a900460ff16611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290613d11565b60405180910390fd5b6024611a7633611290565b10611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90613f79565b60405180910390fd5b600081118015611ac65750602481105b611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc9061400b565b60405180910390fd5b612711611b2282611b14610c23565b6126fe90919063ffffffff16565b10611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614077565b60405180910390fd5b611b7c816658d15e1762800061278e90919063ffffffff16565b3414611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb4906140e3565b60405180910390fd5b60005b81811015611bec57611bd933611bd4610c23565b612714565b8080611be4906139a8565b915050611bc0565b50600160068190555050565b6060611c0382612258565b611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c399061414f565b60405180910390fd5b600b611c4d836127a4565b604051602001611c5e92919061423f565b6040516020818303038152906040529050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ca26122e0565b73ffffffffffffffffffffffffffffffffffffffff16611cc061172a565b73ffffffffffffffffffffffffffffffffffffffff1614611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90613806565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611dd29190613044565b602060405180830381865afa158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1391906142a1565b73ffffffffffffffffffffffffffffffffffffffff161480611e7e5750600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611e8d576001915050611e9b565b611e978484612905565b9150505b92915050565b600760009054906101000a900460ff1681565b60088054611ec1906135d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611eed906135d2565b8015611f3a5780601f10611f0f57610100808354040283529160200191611f3a565b820191906000526020600020905b815481529060010190602001808311611f1d57829003601f168201915b505050505081565b611f4a6122e0565b73ffffffffffffffffffffffffffffffffffffffff16611f6861172a565b73ffffffffffffffffffffffffffffffffffffffff1614611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590613806565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561202e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202590614340565b60405180910390fd5b61203781612638565b50565b61271181565b6120486122e0565b73ffffffffffffffffffffffffffffffffffffffff1661206661172a565b73ffffffffffffffffffffffffffffffffffffffff16146120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b390613806565b60405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080823b905060008111915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061224157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612251575061225082612999565b5b9050919050565b6000600280549050821080156122d95750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106122955761229461394a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661235b8361113f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123ac82612258565b6123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e2906143d2565b60405180910390fd5b60006123f68361113f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061246557508373ffffffffffffffffffffffffffffffffffffffff1661244d846109eb565b73ffffffffffffffffffffffffffffffffffffffff16145b8061247657506124758185611d5a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661249f8261113f565b73ffffffffffffffffffffffffffffffffffffffff16146124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec90614464565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255c906144f6565b60405180910390fd5b612570838383612a03565b61257b6000826122e8565b81600282815481106125905761258f61394a565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361270c9190614516565b905092915050565b61272e828260405180602001604052806000815250612a08565b5050565b61273d84848461247f565b61274984848484612a63565b612788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277f906145de565b60405180910390fd5b50505050565b6000818361279c91906145fe565b905092915050565b606060008214156127ec576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612900565b600082905060005b6000821461281e578080612807906139a8565b915050600a826128179190614687565b91506127f4565b60008167ffffffffffffffff81111561283a576128396130ff565b5b6040519080825280601f01601f19166020018201604052801561286c5781602001600182028036833780820191505090505b5090505b600085146128f95760018261288591906146b8565b9150600a8561289491906146ec565b60306128a09190614516565b60f81b8183815181106128b6576128b561394a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128f29190614687565b9450612870565b8093505050505b919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b612a128383612beb565b612a1f6000848484612a63565b612a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a55906145de565b60405180910390fd5b505050565b6000612a848473ffffffffffffffffffffffffffffffffffffffff16612163565b15612bde578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612aad6122e0565b8786866040518563ffffffff1660e01b8152600401612acf9493929190614772565b6020604051808303816000875af1925050508015612b0b57506040513d601f19601f82011682018060405250810190612b0891906147d3565b60015b612b8e573d8060008114612b3b576040519150601f19603f3d011682016040523d82523d6000602084013e612b40565b606091505b50600081511415612b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7d906145de565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612be3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c529061484c565b60405180910390fd5b612c6481612258565b15612ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9b906148b8565b60405180910390fd5b612cb060008383612a03565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612d7f906135d2565b90600052602060002090601f016020900481019282612da15760008555612de8565b82601f10612dba57805160ff1916838001178555612de8565b82800160010185558215612de8579182015b82811115612de7578251825591602001919060010190612dcc565b5b509050612df59190612df9565b5090565b5b80821115612e12576000816000905550600101612dfa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5f81612e2a565b8114612e6a57600080fd5b50565b600081359050612e7c81612e56565b92915050565b600060208284031215612e9857612e97612e20565b5b6000612ea684828501612e6d565b91505092915050565b60008115159050919050565b612ec481612eaf565b82525050565b6000602082019050612edf6000830184612ebb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f1f578082015181840152602081019050612f04565b83811115612f2e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f5082612ee5565b612f5a8185612ef0565b9350612f6a818560208601612f01565b612f7381612f34565b840191505092915050565b60006020820190508181036000830152612f988184612f45565b905092915050565b6000819050919050565b612fb381612fa0565b8114612fbe57600080fd5b50565b600081359050612fd081612faa565b92915050565b600060208284031215612fec57612feb612e20565b5b6000612ffa84828501612fc1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302e82613003565b9050919050565b61303e81613023565b82525050565b60006020820190506130596000830184613035565b92915050565b61306881613023565b811461307357600080fd5b50565b6000813590506130858161305f565b92915050565b600080604083850312156130a2576130a1612e20565b5b60006130b085828601613076565b92505060206130c185828601612fc1565b9150509250929050565b6130d481612fa0565b82525050565b60006020820190506130ef60008301846130cb565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61313782612f34565b810181811067ffffffffffffffff82111715613156576131556130ff565b5b80604052505050565b6000613169612e16565b9050613175828261312e565b919050565b600067ffffffffffffffff821115613195576131946130ff565b5b61319e82612f34565b9050602081019050919050565b82818337600083830152505050565b60006131cd6131c88461317a565b61315f565b9050828152602081018484840111156131e9576131e86130fa565b5b6131f48482856131ab565b509392505050565b600082601f830112613211576132106130f5565b5b81356132218482602086016131ba565b91505092915050565b6000602082840312156132405761323f612e20565b5b600082013567ffffffffffffffff81111561325e5761325d612e25565b5b61326a848285016131fc565b91505092915050565b60008060006060848603121561328c5761328b612e20565b5b600061329a86828701613076565b93505060206132ab86828701613076565b92505060406132bc86828701612fc1565b9150509250925092565b6000602082840312156132dc576132db612e20565b5b60006132ea84828501613076565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61332881612fa0565b82525050565b600061333a838361331f565b60208301905092915050565b6000602082019050919050565b600061335e826132f3565b61336881856132fe565b93506133738361330f565b8060005b838110156133a457815161338b888261332e565b975061339683613346565b925050600181019050613377565b5085935050505092915050565b600060208201905081810360008301526133cb8184613353565b905092915050565b6133dc81612eaf565b81146133e757600080fd5b50565b6000813590506133f9816133d3565b92915050565b6000806040838503121561341657613415612e20565b5b600061342485828601613076565b9250506020613435858286016133ea565b9150509250929050565b600067ffffffffffffffff82111561345a576134596130ff565b5b61346382612f34565b9050602081019050919050565b600061348361347e8461343f565b61315f565b90508281526020810184848401111561349f5761349e6130fa565b5b6134aa8482856131ab565b509392505050565b600082601f8301126134c7576134c66130f5565b5b81356134d7848260208601613470565b91505092915050565b600080600080608085870312156134fa576134f9612e20565b5b600061350887828801613076565b945050602061351987828801613076565b935050604061352a87828801612fc1565b925050606085013567ffffffffffffffff81111561354b5761354a612e25565b5b613557878288016134b2565b91505092959194509250565b6000806040838503121561357a57613579612e20565b5b600061358885828601613076565b925050602061359985828601613076565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135ea57607f821691505b602082108114156135fe576135fd6135a3565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613660602c83612ef0565b915061366b82613604565b604082019050919050565b6000602082019050818103600083015261368f81613653565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006136f2602183612ef0565b91506136fd82613696565b604082019050919050565b60006020820190508181036000830152613721816136e5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613784603883612ef0565b915061378f82613728565b604082019050919050565b600060208201905081810360008301526137b381613777565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137f0602083612ef0565b91506137fb826137ba565b602082019050919050565b6000602082019050818103600083015261381f816137e3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613882603183612ef0565b915061388d82613826565b604082019050919050565b600060208201905081810360008301526138b181613875565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613914602b83612ef0565b915061391f826138b8565b604082019050919050565b6000602082019050818103600083015261394381613907565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139b382612fa0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139e6576139e5613979565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613a27601f83612ef0565b9150613a32826139f1565b602082019050919050565b60006020820190508181036000830152613a5681613a1a565b9050919050565b600081905092915050565b50565b6000613a78600083613a5d565b9150613a8382613a68565b600082019050919050565b6000613a9982613a6b565b9150819050919050565b7f4661696c656420746f2073656e6420746f204f776e65722e0000000000000000600082015250565b6000613ad9601883612ef0565b9150613ae482613aa3565b602082019050919050565b60006020820190508181036000830152613b0881613acc565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613b6b602c83612ef0565b9150613b7682613b0f565b604082019050919050565b60006020820190508181036000830152613b9a81613b5e565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613bfd602983612ef0565b9150613c0882613ba1565b604082019050919050565b60006020820190508181036000830152613c2c81613bf0565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613c8f602a83612ef0565b9150613c9a82613c33565b604082019050919050565b60006020820190508181036000830152613cbe81613c82565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b6000613cfb601b83612ef0565b9150613d0682613cc5565b602082019050919050565b60006020820190508181036000830152613d2a81613cee565b9050919050565b7f596f752063616e2774206d696e7420616e79206d6f726520667265652057756e60008201527f6b732e0000000000000000000000000000000000000000000000000000000000602082015250565b6000613d8d602383612ef0565b9150613d9882613d31565b604082019050919050565b60006020820190508181036000830152613dbc81613d80565b9050919050565b7f43616e206f6e6c79206d696e74203520667265652057756e6b73000000000000600082015250565b6000613df9601a83612ef0565b9150613e0482613dc3565b602082019050919050565b60006020820190508181036000830152613e2881613dec565b9050919050565b7f507572636861736520776f756c6420657863656564206672656520737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e8b602183612ef0565b9150613e9682613e2f565b604082019050919050565b60006020820190508181036000830152613eba81613e7e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613ef7601983612ef0565b9150613f0282613ec1565b602082019050919050565b60006020820190508181036000830152613f2681613eea565b9050919050565b7f596f752063616e2774206d696e7420616e79206d6f72652e0000000000000000600082015250565b6000613f63601883612ef0565b9150613f6e82613f2d565b602082019050919050565b60006020820190508181036000830152613f9281613f56565b9050919050565b7f43616e206f6e6c79206d696e7420333520746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ff5602183612ef0565b915061400082613f99565b604082019050919050565b6000602082019050818103600083015261402481613fe8565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b6000614061602083612ef0565b915061406c8261402b565b602082019050919050565b6000602082019050818103600083015261409081614054565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b60006140cd601f83612ef0565b91506140d882614097565b602082019050919050565b600060208201905081810360008301526140fc816140c0565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000614139601583612ef0565b915061414482614103565b602082019050919050565b600060208201905081810360008301526141688161412c565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461419c816135d2565b6141a6818661416f565b945060018216600081146141c157600181146141d257614205565b60ff19831686528186019350614205565b6141db8561417a565b60005b838110156141fd578154818901526001820191506020810190506141de565b838801955050505b50505092915050565b600061421982612ee5565b614223818561416f565b9350614233818560208601612f01565b80840191505092915050565b600061424b828561418f565b9150614257828461420e565b91508190509392505050565b600061426e82613023565b9050919050565b61427e81614263565b811461428957600080fd5b50565b60008151905061429b81614275565b92915050565b6000602082840312156142b7576142b6612e20565b5b60006142c58482850161428c565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061432a602683612ef0565b9150614335826142ce565b604082019050919050565b600060208201905081810360008301526143598161431d565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006143bc602c83612ef0565b91506143c782614360565b604082019050919050565b600060208201905081810360008301526143eb816143af565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061444e602983612ef0565b9150614459826143f2565b604082019050919050565b6000602082019050818103600083015261447d81614441565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144e0602483612ef0565b91506144eb82614484565b604082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b600061452182612fa0565b915061452c83612fa0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561456157614560613979565b5b828201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006145c8603283612ef0565b91506145d38261456c565b604082019050919050565b600060208201905081810360008301526145f7816145bb565b9050919050565b600061460982612fa0565b915061461483612fa0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561464d5761464c613979565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061469282612fa0565b915061469d83612fa0565b9250826146ad576146ac614658565b5b828204905092915050565b60006146c382612fa0565b91506146ce83612fa0565b9250828210156146e1576146e0613979565b5b828203905092915050565b60006146f782612fa0565b915061470283612fa0565b92508261471257614711614658565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147448261471d565b61474e8185614728565b935061475e818560208601612f01565b61476781612f34565b840191505092915050565b60006080820190506147876000830187613035565b6147946020830186613035565b6147a160408301856130cb565b81810360608301526147b38184614739565b905095945050505050565b6000815190506147cd81612e56565b92915050565b6000602082840312156147e9576147e8612e20565b5b60006147f7848285016147be565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614836602083612ef0565b915061484182614800565b602082019050919050565b6000602082019050818103600083015261486581614829565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148a2601c83612ef0565b91506148ad8261486c565b602082019050919050565b600060208201905081810360008301526148d181614895565b905091905056fea26469706673582212200f4f8daeafe76e2e5611372a771c712d5f2060073585dcaf7d5d4562498f5dfc64736f6c634300080b003368747470733a2f2f626c616d2e696f2f6170692f65373361323862632d636566372d343337352d396136332d3336393834323362346333642f746f6b656e2f

Deployed Bytecode

0x6080604052600436106102255760003560e01c8063715018a611610123578063c634d032116100ab578063eb8d24441161006f578063eb8d24441461080c578063eee97f9714610837578063f2fde38b14610862578063f47c84c51461088b578063f73c814b146108b657610225565b8063c634d03214610722578063c87b56dd1461073e578063cd7c03261461077b578063d26ea6c0146107a6578063e985e9c5146107cf57610225565b80638da5cb5b116100f25780638da5cb5b1461064f57806395d89b411461067a578063a22cb465146106a5578063b88d4fde146106ce578063b8d5ed2d146106f757610225565b8063715018a6146105a75780637c928fe9146105be5780637ff9b596146105e75780638462151c1461061257610225565b806334918dfd116101b15780635bab26e2116101755780635bab26e21461049a5780636352211e146104d75780636c0360eb146105145780636dbc45821461053f57806370a082311461056a57610225565b806334918dfd146103dd5780633ccfd60b146103f457806342842e0e1461040b5780634f6ccce71461043457806355f804b31461047157610225565b806309aa3dcf116101f857806309aa3dcf146102f8578063109695231461032357806318160ddd1461034c57806323b872dd146103775780632f745c59146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612e82565b6108df565b60405161025e9190612eca565b60405180910390f35b34801561027357600080fd5b5061027c610959565b6040516102899190612f7e565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612fd6565b6109eb565b6040516102c69190613044565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f1919061308b565b610a70565b005b34801561030457600080fd5b5061030d610b88565b60405161031a91906130da565b60405180910390f35b34801561032f57600080fd5b5061034a6004803603810190610345919061322a565b610b8d565b005b34801561035857600080fd5b50610361610c23565b60405161036e91906130da565b60405180910390f35b34801561038357600080fd5b5061039e60048036038101906103999190613273565b610c30565b005b3480156103ac57600080fd5b506103c760048036038101906103c2919061308b565b610c90565b6040516103d491906130da565b60405180910390f35b3480156103e957600080fd5b506103f2610dd5565b005b34801561040057600080fd5b50610409610e7d565b005b34801561041757600080fd5b50610432600480360381019061042d9190613273565b611018565b005b34801561044057600080fd5b5061045b60048036038101906104569190612fd6565b611038565b60405161046891906130da565b60405180910390f35b34801561047d57600080fd5b506104986004803603810190610493919061322a565b611089565b005b3480156104a657600080fd5b506104c160048036038101906104bc91906132c6565b61111f565b6040516104ce9190612eca565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190612fd6565b61113f565b60405161050b9190613044565b60405180910390f35b34801561052057600080fd5b506105296111fc565b6040516105369190612f7e565b60405180910390f35b34801561054b57600080fd5b5061055461128a565b60405161056191906130da565b60405180910390f35b34801561057657600080fd5b50610591600480360381019061058c91906132c6565b611290565b60405161059e91906130da565b60405180910390f35b3480156105b357600080fd5b506105bc6113ac565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190612fd6565b611434565b005b3480156105f357600080fd5b506105fc611615565b60405161060991906130da565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906132c6565b611620565b60405161064691906133b1565b60405180910390f35b34801561065b57600080fd5b5061066461172a565b6040516106719190613044565b60405180910390f35b34801561068657600080fd5b5061068f611754565b60405161069c9190612f7e565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c791906133ff565b6117e6565b005b3480156106da57600080fd5b506106f560048036038101906106f091906134e0565b611967565b005b34801561070357600080fd5b5061070c6119c9565b60405161071991906130da565b60405180910390f35b61073c60048036038101906107379190612fd6565b6119ce565b005b34801561074a57600080fd5b5061076560048036038101906107609190612fd6565b611bf8565b6040516107729190612f7e565b60405180910390f35b34801561078757600080fd5b50610790611c74565b60405161079d9190613044565b60405180910390f35b3480156107b257600080fd5b506107cd60048036038101906107c891906132c6565b611c9a565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613563565b611d5a565b6040516108039190612eca565b60405180910390f35b34801561081857600080fd5b50610821611ea1565b60405161082e9190612eca565b60405180910390f35b34801561084357600080fd5b5061084c611eb4565b6040516108599190612f7e565b60405180910390f35b34801561086e57600080fd5b50610889600480360381019061088491906132c6565b611f42565b005b34801561089757600080fd5b506108a061203a565b6040516108ad91906130da565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d891906132c6565b612040565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610952575061095182612176565b5b9050919050565b606060008054610968906135d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610994906135d2565b80156109e15780601f106109b6576101008083540402835291602001916109e1565b820191906000526020600020905b8154815290600101906020018083116109c457829003601f168201915b5050505050905090565b60006109f682612258565b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613676565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7b8261113f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae390613708565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0b6122e0565b73ffffffffffffffffffffffffffffffffffffffff161480610b3a5750610b3981610b346122e0565b611d5a565b5b610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b709061379a565b60405180910390fd5b610b8383836122e8565b505050565b602481565b610b956122e0565b73ffffffffffffffffffffffffffffffffffffffff16610bb361172a565b73ffffffffffffffffffffffffffffffffffffffff1614610c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0090613806565b60405180910390fd5b8060089080519060200190610c1f929190612d73565b5050565b6000600280549050905090565b610c41610c3b6122e0565b826123a1565b610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7790613898565b60405180910390fd5b610c8b83838361247f565b505050565b6000610c9b83611290565b8210610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd39061392a565b60405180910390fd5b6000805b600280549050811015610d935760028181548110610d0157610d0061394a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d805783821415610d71578092505050610dcf565b8180610d7c906139a8565b9250505b8080610d8b906139a8565b915050610ce0565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061392a565b60405180910390fd5b92915050565b610ddd6122e0565b73ffffffffffffffffffffffffffffffffffffffff16610dfb61172a565b73ffffffffffffffffffffffffffffffffffffffff1614610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890613806565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b610e856122e0565b73ffffffffffffffffffffffffffffffffffffffff16610ea361172a565b73ffffffffffffffffffffffffffffffffffffffff1614610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090613806565b60405180910390fd5b60026006541415610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690613a3d565b60405180910390fd5b6002600681905550600047905060008111610f5957600080fd5b6000610f636122e0565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f8690613a8e565b60006040518083038185875af1925050503d8060008114610fc3576040519150601f19603f3d011682016040523d82523d6000602084013e610fc8565b606091505b505090508061100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100390613aef565b60405180910390fd5b50506001600681905550565b61103383838360405180602001604052806000815250611967565b505050565b60006002805490508210611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890613b81565b60405180910390fd5b819050919050565b6110916122e0565b73ffffffffffffffffffffffffffffffffffffffff166110af61172a565b73ffffffffffffffffffffffffffffffffffffffff1614611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90613806565b60405180910390fd5b80600b908051906020019061111b929190612d73565b5050565b600a6020528060005260406000206000915054906101000a900460ff1681565b600080600283815481106111565761115561394a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90613c13565b60405180910390fd5b80915050919050565b600b8054611209906135d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611235906135d2565b80156112825780601f1061125757610100808354040283529160200191611282565b820191906000526020600020905b81548152906001019060200180831161126557829003601f168201915b505050505081565b6101f581565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f890613ca5565b60405180910390fd5b6000805b6002805490508110156113a257600281815481106113265761132561394a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611391578161138e906139a8565b91505b8061139b906139a8565b9050611305565b5080915050919050565b6113b46122e0565b73ffffffffffffffffffffffffffffffffffffffff166113d261172a565b73ffffffffffffffffffffffffffffffffffffffff1614611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f90613806565b60405180910390fd5b6114326000612638565b565b6002600654141561147a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147190613a3d565b60405180910390fd5b6002600681905550600760009054906101000a900460ff166114d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c890613d11565b60405180910390fd5b60066114ee826114e033611290565b6126fe90919063ffffffff16565b1061152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613da3565b60405180910390fd5b60008111801561153e5750600681105b61157d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157490613e0f565b60405180910390fd5b6101f561159a8261158c610c23565b6126fe90919063ffffffff16565b106115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190613ea1565b60405180910390fd5b60005b81811015611609576115f6336115f1610c23565b612714565b8080611601906139a8565b9150506115dd565b50600160068190555050565b6658d15e1762800081565b6060600061162d83611290565b9050600081141561168a57600067ffffffffffffffff811115611653576116526130ff565b5b6040519080825280602002602001820160405280156116815781602001602082028036833780820191505090505b50915050611725565b60008167ffffffffffffffff8111156116a6576116a56130ff565b5b6040519080825280602002602001820160405280156116d45781602001602082028036833780820191505090505b50905060005b8281101561171e576116ec8582610c90565b8282815181106116ff576116fe61394a565b5b6020026020010181815250508080611716906139a8565b9150506116da565b8193505050505b919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611763906135d2565b80601f016020809104026020016040519081016040528092919081815260200182805461178f906135d2565b80156117dc5780601f106117b1576101008083540402835291602001916117dc565b820191906000526020600020905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b6117ee6122e0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390613f0d565b60405180910390fd5b80600460006118696122e0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119166122e0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161195b9190612eca565b60405180910390a35050565b6119786119726122e0565b836123a1565b6119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90613898565b60405180910390fd5b6119c384848484612732565b50505050565b600681565b60026006541415611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b90613a3d565b60405180910390fd5b6002600681905550600760009054906101000a900460ff16611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290613d11565b60405180910390fd5b6024611a7633611290565b10611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90613f79565b60405180910390fd5b600081118015611ac65750602481105b611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc9061400b565b60405180910390fd5b612711611b2282611b14610c23565b6126fe90919063ffffffff16565b10611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614077565b60405180910390fd5b611b7c816658d15e1762800061278e90919063ffffffff16565b3414611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb4906140e3565b60405180910390fd5b60005b81811015611bec57611bd933611bd4610c23565b612714565b8080611be4906139a8565b915050611bc0565b50600160068190555050565b6060611c0382612258565b611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c399061414f565b60405180910390fd5b600b611c4d836127a4565b604051602001611c5e92919061423f565b6040516020818303038152906040529050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ca26122e0565b73ffffffffffffffffffffffffffffffffffffffff16611cc061172a565b73ffffffffffffffffffffffffffffffffffffffff1614611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90613806565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611dd29190613044565b602060405180830381865afa158015611def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1391906142a1565b73ffffffffffffffffffffffffffffffffffffffff161480611e7e5750600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611e8d576001915050611e9b565b611e978484612905565b9150505b92915050565b600760009054906101000a900460ff1681565b60088054611ec1906135d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611eed906135d2565b8015611f3a5780601f10611f0f57610100808354040283529160200191611f3a565b820191906000526020600020905b815481529060010190602001808311611f1d57829003601f168201915b505050505081565b611f4a6122e0565b73ffffffffffffffffffffffffffffffffffffffff16611f6861172a565b73ffffffffffffffffffffffffffffffffffffffff1614611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590613806565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561202e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202590614340565b60405180910390fd5b61203781612638565b50565b61271181565b6120486122e0565b73ffffffffffffffffffffffffffffffffffffffff1661206661172a565b73ffffffffffffffffffffffffffffffffffffffff16146120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b390613806565b60405180910390fd5b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080823b905060008111915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061224157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612251575061225082612999565b5b9050919050565b6000600280549050821080156122d95750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106122955761229461394a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661235b8361113f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123ac82612258565b6123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e2906143d2565b60405180910390fd5b60006123f68361113f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061246557508373ffffffffffffffffffffffffffffffffffffffff1661244d846109eb565b73ffffffffffffffffffffffffffffffffffffffff16145b8061247657506124758185611d5a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661249f8261113f565b73ffffffffffffffffffffffffffffffffffffffff16146124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec90614464565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255c906144f6565b60405180910390fd5b612570838383612a03565b61257b6000826122e8565b81600282815481106125905761258f61394a565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361270c9190614516565b905092915050565b61272e828260405180602001604052806000815250612a08565b5050565b61273d84848461247f565b61274984848484612a63565b612788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277f906145de565b60405180910390fd5b50505050565b6000818361279c91906145fe565b905092915050565b606060008214156127ec576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612900565b600082905060005b6000821461281e578080612807906139a8565b915050600a826128179190614687565b91506127f4565b60008167ffffffffffffffff81111561283a576128396130ff565b5b6040519080825280601f01601f19166020018201604052801561286c5781602001600182028036833780820191505090505b5090505b600085146128f95760018261288591906146b8565b9150600a8561289491906146ec565b60306128a09190614516565b60f81b8183815181106128b6576128b561394a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128f29190614687565b9450612870565b8093505050505b919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b612a128383612beb565b612a1f6000848484612a63565b612a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a55906145de565b60405180910390fd5b505050565b6000612a848473ffffffffffffffffffffffffffffffffffffffff16612163565b15612bde578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612aad6122e0565b8786866040518563ffffffff1660e01b8152600401612acf9493929190614772565b6020604051808303816000875af1925050508015612b0b57506040513d601f19601f82011682018060405250810190612b0891906147d3565b60015b612b8e573d8060008114612b3b576040519150601f19603f3d011682016040523d82523d6000602084013e612b40565b606091505b50600081511415612b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7d906145de565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612be3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c529061484c565b60405180910390fd5b612c6481612258565b15612ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9b906148b8565b60405180910390fd5b612cb060008383612a03565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612d7f906135d2565b90600052602060002090601f016020900481019282612da15760008555612de8565b82601f10612dba57805160ff1916838001178555612de8565b82800160010185558215612de8579182015b82811115612de7578251825591602001919060010190612dcc565b5b509050612df59190612df9565b5090565b5b80821115612e12576000816000905550600101612dfa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5f81612e2a565b8114612e6a57600080fd5b50565b600081359050612e7c81612e56565b92915050565b600060208284031215612e9857612e97612e20565b5b6000612ea684828501612e6d565b91505092915050565b60008115159050919050565b612ec481612eaf565b82525050565b6000602082019050612edf6000830184612ebb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f1f578082015181840152602081019050612f04565b83811115612f2e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f5082612ee5565b612f5a8185612ef0565b9350612f6a818560208601612f01565b612f7381612f34565b840191505092915050565b60006020820190508181036000830152612f988184612f45565b905092915050565b6000819050919050565b612fb381612fa0565b8114612fbe57600080fd5b50565b600081359050612fd081612faa565b92915050565b600060208284031215612fec57612feb612e20565b5b6000612ffa84828501612fc1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302e82613003565b9050919050565b61303e81613023565b82525050565b60006020820190506130596000830184613035565b92915050565b61306881613023565b811461307357600080fd5b50565b6000813590506130858161305f565b92915050565b600080604083850312156130a2576130a1612e20565b5b60006130b085828601613076565b92505060206130c185828601612fc1565b9150509250929050565b6130d481612fa0565b82525050565b60006020820190506130ef60008301846130cb565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61313782612f34565b810181811067ffffffffffffffff82111715613156576131556130ff565b5b80604052505050565b6000613169612e16565b9050613175828261312e565b919050565b600067ffffffffffffffff821115613195576131946130ff565b5b61319e82612f34565b9050602081019050919050565b82818337600083830152505050565b60006131cd6131c88461317a565b61315f565b9050828152602081018484840111156131e9576131e86130fa565b5b6131f48482856131ab565b509392505050565b600082601f830112613211576132106130f5565b5b81356132218482602086016131ba565b91505092915050565b6000602082840312156132405761323f612e20565b5b600082013567ffffffffffffffff81111561325e5761325d612e25565b5b61326a848285016131fc565b91505092915050565b60008060006060848603121561328c5761328b612e20565b5b600061329a86828701613076565b93505060206132ab86828701613076565b92505060406132bc86828701612fc1565b9150509250925092565b6000602082840312156132dc576132db612e20565b5b60006132ea84828501613076565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61332881612fa0565b82525050565b600061333a838361331f565b60208301905092915050565b6000602082019050919050565b600061335e826132f3565b61336881856132fe565b93506133738361330f565b8060005b838110156133a457815161338b888261332e565b975061339683613346565b925050600181019050613377565b5085935050505092915050565b600060208201905081810360008301526133cb8184613353565b905092915050565b6133dc81612eaf565b81146133e757600080fd5b50565b6000813590506133f9816133d3565b92915050565b6000806040838503121561341657613415612e20565b5b600061342485828601613076565b9250506020613435858286016133ea565b9150509250929050565b600067ffffffffffffffff82111561345a576134596130ff565b5b61346382612f34565b9050602081019050919050565b600061348361347e8461343f565b61315f565b90508281526020810184848401111561349f5761349e6130fa565b5b6134aa8482856131ab565b509392505050565b600082601f8301126134c7576134c66130f5565b5b81356134d7848260208601613470565b91505092915050565b600080600080608085870312156134fa576134f9612e20565b5b600061350887828801613076565b945050602061351987828801613076565b935050604061352a87828801612fc1565b925050606085013567ffffffffffffffff81111561354b5761354a612e25565b5b613557878288016134b2565b91505092959194509250565b6000806040838503121561357a57613579612e20565b5b600061358885828601613076565b925050602061359985828601613076565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135ea57607f821691505b602082108114156135fe576135fd6135a3565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613660602c83612ef0565b915061366b82613604565b604082019050919050565b6000602082019050818103600083015261368f81613653565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006136f2602183612ef0565b91506136fd82613696565b604082019050919050565b60006020820190508181036000830152613721816136e5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613784603883612ef0565b915061378f82613728565b604082019050919050565b600060208201905081810360008301526137b381613777565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137f0602083612ef0565b91506137fb826137ba565b602082019050919050565b6000602082019050818103600083015261381f816137e3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613882603183612ef0565b915061388d82613826565b604082019050919050565b600060208201905081810360008301526138b181613875565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613914602b83612ef0565b915061391f826138b8565b604082019050919050565b6000602082019050818103600083015261394381613907565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139b382612fa0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139e6576139e5613979565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613a27601f83612ef0565b9150613a32826139f1565b602082019050919050565b60006020820190508181036000830152613a5681613a1a565b9050919050565b600081905092915050565b50565b6000613a78600083613a5d565b9150613a8382613a68565b600082019050919050565b6000613a9982613a6b565b9150819050919050565b7f4661696c656420746f2073656e6420746f204f776e65722e0000000000000000600082015250565b6000613ad9601883612ef0565b9150613ae482613aa3565b602082019050919050565b60006020820190508181036000830152613b0881613acc565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613b6b602c83612ef0565b9150613b7682613b0f565b604082019050919050565b60006020820190508181036000830152613b9a81613b5e565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613bfd602983612ef0565b9150613c0882613ba1565b604082019050919050565b60006020820190508181036000830152613c2c81613bf0565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613c8f602a83612ef0565b9150613c9a82613c33565b604082019050919050565b60006020820190508181036000830152613cbe81613c82565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b6000613cfb601b83612ef0565b9150613d0682613cc5565b602082019050919050565b60006020820190508181036000830152613d2a81613cee565b9050919050565b7f596f752063616e2774206d696e7420616e79206d6f726520667265652057756e60008201527f6b732e0000000000000000000000000000000000000000000000000000000000602082015250565b6000613d8d602383612ef0565b9150613d9882613d31565b604082019050919050565b60006020820190508181036000830152613dbc81613d80565b9050919050565b7f43616e206f6e6c79206d696e74203520667265652057756e6b73000000000000600082015250565b6000613df9601a83612ef0565b9150613e0482613dc3565b602082019050919050565b60006020820190508181036000830152613e2881613dec565b9050919050565b7f507572636861736520776f756c6420657863656564206672656520737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e8b602183612ef0565b9150613e9682613e2f565b604082019050919050565b60006020820190508181036000830152613eba81613e7e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613ef7601983612ef0565b9150613f0282613ec1565b602082019050919050565b60006020820190508181036000830152613f2681613eea565b9050919050565b7f596f752063616e2774206d696e7420616e79206d6f72652e0000000000000000600082015250565b6000613f63601883612ef0565b9150613f6e82613f2d565b602082019050919050565b60006020820190508181036000830152613f9281613f56565b9050919050565b7f43616e206f6e6c79206d696e7420333520746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ff5602183612ef0565b915061400082613f99565b604082019050919050565b6000602082019050818103600083015261402481613fe8565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b6000614061602083612ef0565b915061406c8261402b565b602082019050919050565b6000602082019050818103600083015261409081614054565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b60006140cd601f83612ef0565b91506140d882614097565b602082019050919050565b600060208201905081810360008301526140fc816140c0565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000614139601583612ef0565b915061414482614103565b602082019050919050565b600060208201905081810360008301526141688161412c565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461419c816135d2565b6141a6818661416f565b945060018216600081146141c157600181146141d257614205565b60ff19831686528186019350614205565b6141db8561417a565b60005b838110156141fd578154818901526001820191506020810190506141de565b838801955050505b50505092915050565b600061421982612ee5565b614223818561416f565b9350614233818560208601612f01565b80840191505092915050565b600061424b828561418f565b9150614257828461420e565b91508190509392505050565b600061426e82613023565b9050919050565b61427e81614263565b811461428957600080fd5b50565b60008151905061429b81614275565b92915050565b6000602082840312156142b7576142b6612e20565b5b60006142c58482850161428c565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061432a602683612ef0565b9150614335826142ce565b604082019050919050565b600060208201905081810360008301526143598161431d565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006143bc602c83612ef0565b91506143c782614360565b604082019050919050565b600060208201905081810360008301526143eb816143af565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061444e602983612ef0565b9150614459826143f2565b604082019050919050565b6000602082019050818103600083015261447d81614441565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006144e0602483612ef0565b91506144eb82614484565b604082019050919050565b6000602082019050818103600083015261450f816144d3565b9050919050565b600061452182612fa0565b915061452c83612fa0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561456157614560613979565b5b828201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006145c8603283612ef0565b91506145d38261456c565b604082019050919050565b600060208201905081810360008301526145f7816145bb565b9050919050565b600061460982612fa0565b915061461483612fa0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561464d5761464c613979565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061469282612fa0565b915061469d83612fa0565b9250826146ad576146ac614658565b5b828204905092915050565b60006146c382612fa0565b91506146ce83612fa0565b9250828210156146e1576146e0613979565b5b828203905092915050565b60006146f782612fa0565b915061470283612fa0565b92508261471257614711614658565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147448261471d565b61474e8185614728565b935061475e818560208601612f01565b61476781612f34565b840191505092915050565b60006080820190506147876000830187613035565b6147946020830186613035565b6147a160408301856130cb565b81810360608301526147b38184614739565b905095945050505050565b6000815190506147cd81612e56565b92915050565b6000602082840312156147e9576147e8612e20565b5b60006147f7848285016147be565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614836602083612ef0565b915061484182614800565b602082019050919050565b6000602082019050818103600083015261486581614829565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148a2601c83612ef0565b91506148ad8261486c565b602082019050919050565b600060208201905081810360008301526148d181614895565b905091905056fea26469706673582212200f4f8daeafe76e2e5611372a771c712d5f2060073585dcaf7d5d4562498f5dfc64736f6c634300080b0033

Deployed Bytecode Sourcemap

39327:3995:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35530:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24147:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24959:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24482:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39568:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40764:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35830:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26018:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36306:490;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40988:83;;;;;;;;;;;;;:::i;:::-;;40489:269;;;;;;;;;;;;;:::i;:::-;;26465:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36017:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40890:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39813:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23754:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39862:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39723:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23300:392;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38457:103;;;;;;;;;;;;;:::i;:::-;;41559:562;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39505:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41079:472;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37806:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24316:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25339:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26721:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39666:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42129:623;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42758:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39773:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40203:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42977:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39428:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39465:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38715:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39619:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40351:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35530:224;35632:4;35671:35;35656:50;;;:11;:50;;;;:90;;;;35710:36;35734:11;35710:23;:36::i;:::-;35656:90;35649:97;;35530:224;;;:::o;24147:100::-;24201:13;24234:5;24227:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24147:100;:::o;24959:308::-;25080:7;25127:16;25135:7;25127;:16::i;:::-;25105:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25235:15;:24;25251:7;25235:24;;;;;;;;;;;;;;;;;;;;;25228:31;;24959:308;;;:::o;24482:411::-;24563:13;24579:23;24594:7;24579:14;:23::i;:::-;24563:39;;24627:5;24621:11;;:2;:11;;;;24613:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24721:5;24705:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24730:37;24747:5;24754:12;:10;:12::i;:::-;24730:16;:37::i;:::-;24705:62;24683:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24864:21;24873:2;24877:7;24864:8;:21::i;:::-;24552:341;24482:411;;:::o;39568:42::-;39608:2;39568:42;:::o;40764:120::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40864:14:::1;40845:16;:33;;;;;;;;;;;;:::i;:::-;;40764:120:::0;:::o;35830:110::-;35891:7;35918;:14;;;;35911:21;;35830:110;:::o;26018:376::-;26227:41;26246:12;:10;:12::i;:::-;26260:7;26227:18;:41::i;:::-;26205:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26358:28;26368:4;26374:2;26378:7;26358:9;:28::i;:::-;26018:376;;;:::o;36306:490::-;36403:15;36447:16;36457:5;36447:9;:16::i;:::-;36439:5;:24;36431:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;36524:10;36549:6;36545:178;36561:7;:14;;;;36557:1;:18;36545:178;;;36608:7;36616:1;36608:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36599:19;;:5;:19;;;36596:116;;;36650:5;36641;:14;36638:58;;;36664:1;36657:8;;;;;;36638:58;36689:7;;;;;:::i;:::-;;;;36596:116;36577:3;;;;;:::i;:::-;;;;36545:178;;;;36735:53;;;;;;;;;;:::i;:::-;;;;;;;;36306:490;;;;;:::o;40988:83::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41053:12:::1;;;;;;;;;;;41052:13;41037:12;;:28;;;;;;;;;;;;;;;;;;40988:83::o:0;40489:269::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2617:1:::1;3215:7;;:19;;3207:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2617:1;3348:7;:18;;;;40546:15:::2;40564:21;40546:39;;40610:1;40600:7;:11;40592:20;;;::::0;::::2;;40622:17;40645:12;:10;:12::i;:::-;:17;;40670:21;40645:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40621:75;;;40711:12;40703:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;40539:219;;2573:1:::1;3527:7;:22;;;;40489:269::o:0;26465:185::-;26603:39;26620:4;26626:2;26630:7;26603:39;;;;;;;;;;;;:16;:39::i;:::-;26465:185;;;:::o;36017:205::-;36092:7;36128;:14;;;;36120:5;:22;36112:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;36209:5;36202:12;;36017:205;;;:::o;40890:92::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40968:8:::1;40958:7;:18;;;;;;;;;;;;:::i;:::-;;40890:92:::0;:::o;39813:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;23754:326::-;23871:7;23896:13;23912:7;23920;23912:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23896:32;;23978:1;23961:19;;:5;:19;;;;23939:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24067:5;24060:12;;;23754:326;;;:::o;39862:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39723:41::-;39761:3;39723:41;:::o;23300:392::-;23422:4;23470:1;23453:19;;:5;:19;;;;23445:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23532:10;23558:6;23553:109;23570:7;:14;;;;23566:1;:18;23553:109;;;23617:7;23625:1;23617:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23608:19;;:5;:19;;;23604:46;;;23643:7;;;;:::i;:::-;;;23604:46;23586:3;;;;:::i;:::-;;;23553:109;;;;23679:5;23672:12;;;23300:392;;;:::o;38457:103::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38522:30:::1;38549:1;38522:18;:30::i;:::-;38457:103::o:0;41559:562::-;2617:1;3215:7;;:19;;3207:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2617:1;3348:7;:18;;;;41633:12:::1;;;;;;;;;;;41625:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;39717:1;41692:41;41718:14;41692:21;41702:10;41692:9;:21::i;:::-;:25;;:41;;;;:::i;:::-;:68;41684:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;41832:1;41815:14;:18;:63;;;;;39717:1;41837:14;:41;41815:63;41807:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;39761:3;41924:33;41942:14;41924:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;41916:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;42026:6;42022:94;42042:14;42038:1;:18;42022:94;;;42072:36;42082:10;42094:13;:11;:13::i;:::-;42072:9;:36::i;:::-;42058:3;;;;;:::i;:::-;;;;42022:94;;;;2573:1:::0;3527:7;:22;;;;41559:562;:::o;39505:54::-;39542:17;39505:54;:::o;41079:472::-;41140:16;41166:18;41187:17;41197:6;41187:9;:17::i;:::-;41166:38;;41229:1;41215:10;:15;41211:335;;;41294:1;41280:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41273:23;;;;;41211:335;41319:23;41359:10;41345:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41319:51;;41379:13;41401:116;41425:10;41417:5;:18;41401:116;;;41473:34;41493:6;41501:5;41473:19;:34::i;:::-;41457:6;41464:5;41457:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;41437:7;;;;;:::i;:::-;;;;41401:116;;;41532:6;41525:13;;;;;41079:472;;;;:::o;37806:87::-;37852:7;37879:6;;;;;;;;;;;37872:13;;37806:87;:::o;24316:104::-;24372:13;24405:7;24398:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24316:104;:::o;25339:327::-;25486:12;:10;:12::i;:::-;25474:24;;:8;:24;;;;25466:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25586:8;25541:18;:32;25560:12;:10;:12::i;:::-;25541:32;;;;;;;;;;;;;;;:42;25574:8;25541:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25639:8;25610:48;;25625:12;:10;:12::i;:::-;25610:48;;;25649:8;25610:48;;;;;;:::i;:::-;;;;;;;;25339:327;;:::o;26721:365::-;26910:41;26929:12;:10;:12::i;:::-;26943:7;26910:18;:41::i;:::-;26888:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;27039:39;27053:4;27059:2;27063:7;27072:5;27039:13;:39::i;:::-;26721:365;;;;:::o;39666:52::-;39717:1;39666:52;:::o;42129:623::-;2617:1;3215:7;;:19;;3207:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2617:1;3348:7;:18;;;;42212:12:::1;;;;;;;;;;;42204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;39608:2;42271:21;42281:10;42271:9;:21::i;:::-;:40;42263:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;42372:1;42355:14;:18;:55;;;;;39608:2;42377:14;:33;42355:55;42347:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;39656:5;42463:33;42481:14;42463:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;42455:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;42574:30;42589:14;39542:17;42574:14;;:30;;;;:::i;:::-;42561:9;:43;42553:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42657:6;42653:94;42673:14;42669:1;:18;42653:94;;;42703:36;42713:10;42725:13;:11;:13::i;:::-;42703:9;:36::i;:::-;42689:3;;;;;:::i;:::-;;;;42653:94;;;;2573:1:::0;3527:7;:22;;;;42129:623;:::o;42758:213::-;42817:13;42847:17;42855:8;42847:7;:17::i;:::-;42839:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;42928:7;42937:26;42954:8;42937:16;:26::i;:::-;42911:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42897:68;;42758:213;;;:::o;39773:35::-;;;;;;;;;;;;;:::o;40203:140::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40316:21:::1;40293:20;;:44;;;;;;;;;;;;;;;;;;40203:140:::0;:::o;42977:342::-;43067:4;43080:34;43138:20;;;;;;;;;;;43080:79;;43212:8;43170:50;;43178:13;:21;;;43200:6;43178:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43170:50;;;:76;;;;43224:12;:22;43237:8;43224:22;;;;;;;;;;;;;;;;;;;;;;;;;43170:76;43166:93;;;43255:4;43248:11;;;;;43166:93;43273:40;43296:6;43304:8;43273:22;:40::i;:::-;43266:47;;;42977:342;;;;;:::o;39428:32::-;;;;;;;;;;;;;:::o;39465:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38715:201::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38824:1:::1;38804:22;;:8;:22;;;;38796:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38880:28;38899:8;38880:18;:28::i;:::-;38715:201:::0;:::o;39619:42::-;39656:5;39619:42;:::o;40351:132::-;38037:12;:10;:12::i;:::-;38026:23;;:7;:5;:7::i;:::-;:23;;;38018:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40451:12:::1;:26;40464:12;40451:26;;;;;;;;;;;;;;;;;;;;;;;;;40450:27;40421:12;:26;40434:12;40421:26;;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;;;;40351:132:::0;:::o;19857:193::-;19917:4;19934:9;19998:7;19986:20;19978:28;;20041:1;20034:4;:8;20027:15;;;19857:193;;;:::o;22881:355::-;23028:4;23085:25;23070:40;;;:11;:40;;;;:105;;;;23142:33;23127:48;;;:11;:48;;;;23070:105;:158;;;;23192:36;23216:11;23192:23;:36::i;:::-;23070:158;23050:178;;22881:355;;;:::o;28633:155::-;28698:4;28732:7;:14;;;;28722:7;:24;:58;;;;;28778:1;28750:30;;:7;28758;28750:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:30;;;;28722:58;28715:65;;28633:155;;;:::o;658:98::-;711:7;738:10;731:17;;658:98;:::o;32658:174::-;32760:2;32733:15;:24;32749:7;32733:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32816:7;32812:2;32778:46;;32787:23;32802:7;32787:14;:23::i;:::-;32778:46;;;;;;;;;;;;32658:174;;:::o;28955:452::-;29084:4;29128:16;29136:7;29128;:16::i;:::-;29106:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29227:13;29243:23;29258:7;29243:14;:23::i;:::-;29227:39;;29296:5;29285:16;;:7;:16;;;:64;;;;29342:7;29318:31;;:20;29330:7;29318:11;:20::i;:::-;:31;;;29285:64;:113;;;;29366:32;29383:5;29390:7;29366:16;:32::i;:::-;29285:113;29277:122;;;28955:452;;;;:::o;31987:553::-;32160:4;32133:31;;:23;32148:7;32133:14;:23::i;:::-;:31;;;32111:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;32266:1;32252:16;;:2;:16;;;;32244:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32322:39;32343:4;32349:2;32353:7;32322:20;:39::i;:::-;32426:29;32443:1;32447:7;32426:8;:29::i;:::-;32485:2;32466:7;32474;32466:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32524:7;32520:2;32505:27;;32514:4;32505:27;;;;;;;;;;;;31987:553;;;:::o;39076:191::-;39150:16;39169:6;;;;;;;;;;;39150:25;;39195:8;39186:6;;:17;;;;;;;;;;;;;;;;;;39250:8;39219:40;;39240:8;39219:40;;;;;;;;;;;;39139:128;39076:191;:::o;15642:98::-;15700:7;15731:1;15727;:5;;;;:::i;:::-;15720:12;;15642:98;;;;:::o;29749:110::-;29825:26;29835:2;29839:7;29825:26;;;;;;;;;;;;:9;:26::i;:::-;29749:110;;:::o;27968:352::-;28125:28;28135:4;28141:2;28145:7;28125:9;:28::i;:::-;28186:48;28209:4;28215:2;28219:7;28228:5;28186:22;:48::i;:::-;28164:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27968:352;;;;:::o;16380:98::-;16438:7;16469:1;16465;:5;;;;:::i;:::-;16458:12;;16380:98;;;;:::o;20366:723::-;20422:13;20652:1;20643:5;:10;20639:53;;;20670:10;;;;;;;;;;;;;;;;;;;;;20639:53;20702:12;20717:5;20702:20;;20733:14;20758:78;20773:1;20765:4;:9;20758:78;;20791:8;;;;;:::i;:::-;;;;20822:2;20814:10;;;;;:::i;:::-;;;20758:78;;;20846:19;20878:6;20868:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20846:39;;20896:154;20912:1;20903:5;:10;20896:154;;20940:1;20930:11;;;;;:::i;:::-;;;21007:2;20999:5;:10;;;;:::i;:::-;20986:2;:24;;;;:::i;:::-;20973:39;;20956:6;20963;20956:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21036:2;21027:11;;;;;:::i;:::-;;;20896:154;;;21074:6;21060:21;;;;;20366:723;;;;:::o;25737:214::-;25879:4;25908:18;:25;25927:5;25908:25;;;;;;;;;;;;;;;:35;25934:8;25908:35;;;;;;;;;;;;;;;;;;;;;;;;;25901:42;;25737:214;;;;:::o;12678:157::-;12763:4;12802:25;12787:40;;;:11;:40;;;;12780:47;;12678:157;;;:::o;34949:126::-;;;;:::o;30086:321::-;30216:18;30222:2;30226:7;30216:5;:18::i;:::-;30267:54;30298:1;30302:2;30306:7;30315:5;30267:22;:54::i;:::-;30245:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30086:321;;;:::o;33397:980::-;33552:4;33573:15;:2;:13;;;:15::i;:::-;33569:801;;;33642:2;33626:36;;;33685:12;:10;:12::i;:::-;33720:4;33747:7;33777:5;33626:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33605:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34001:1;33984:6;:13;:18;33980:320;;;34027:108;;;;;;;;;;:::i;:::-;;;;;;;;33980:320;34250:6;34244:13;34235:6;34231:2;34227:15;34220:38;33605:710;33875:41;;;33865:51;;;:6;:51;;;;33858:58;;;;;33569:801;34354:4;34347:11;;33397:980;;;;;;;:::o;30743:346::-;30837:1;30823:16;;:2;:16;;;;30815:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30896:16;30904:7;30896;:16::i;:::-;30895:17;30887:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30958:45;30987:1;30991:2;30995:7;30958:20;:45::i;:::-;31014:7;31027:2;31014:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31073:7;31069:2;31048:33;;31065:1;31048:33;;;;;;;;;;;;30743:346;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:114::-;8938:6;8972:5;8966:12;8956:22;;8871:114;;;:::o;8991:184::-;9090:11;9124:6;9119:3;9112:19;9164:4;9159:3;9155:14;9140:29;;8991:184;;;;:::o;9181:132::-;9248:4;9271:3;9263:11;;9301:4;9296:3;9292:14;9284:22;;9181:132;;;:::o;9319:108::-;9396:24;9414:5;9396:24;:::i;:::-;9391:3;9384:37;9319:108;;:::o;9433:179::-;9502:10;9523:46;9565:3;9557:6;9523:46;:::i;:::-;9601:4;9596:3;9592:14;9578:28;;9433:179;;;;:::o;9618:113::-;9688:4;9720;9715:3;9711:14;9703:22;;9618:113;;;:::o;9767:732::-;9886:3;9915:54;9963:5;9915:54;:::i;:::-;9985:86;10064:6;10059:3;9985:86;:::i;:::-;9978:93;;10095:56;10145:5;10095:56;:::i;:::-;10174:7;10205:1;10190:284;10215:6;10212:1;10209:13;10190:284;;;10291:6;10285:13;10318:63;10377:3;10362:13;10318:63;:::i;:::-;10311:70;;10404:60;10457:6;10404:60;:::i;:::-;10394:70;;10250:224;10237:1;10234;10230:9;10225:14;;10190:284;;;10194:14;10490:3;10483:10;;9891:608;;;9767:732;;;;:::o;10505:373::-;10648:4;10686:2;10675:9;10671:18;10663:26;;10735:9;10729:4;10725:20;10721:1;10710:9;10706:17;10699:47;10763:108;10866:4;10857:6;10763:108;:::i;:::-;10755:116;;10505:373;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:474::-;13722:6;13730;13779:2;13767:9;13758:7;13754:23;13750:32;13747:119;;;13785:79;;:::i;:::-;13747:119;13905:1;13930:53;13975:7;13966:6;13955:9;13951:22;13930:53;:::i;:::-;13920:63;;13876:117;14032:2;14058:53;14103:7;14094:6;14083:9;14079:22;14058:53;:::i;:::-;14048:63;;14003:118;13654:474;;;;;:::o;14134:180::-;14182:77;14179:1;14172:88;14279:4;14276:1;14269:15;14303:4;14300:1;14293:15;14320:320;14364:6;14401:1;14395:4;14391:12;14381:22;;14448:1;14442:4;14438:12;14469:18;14459:81;;14525:4;14517:6;14513:17;14503:27;;14459:81;14587:2;14579:6;14576:14;14556:18;14553:38;14550:84;;;14606:18;;:::i;:::-;14550:84;14371:269;14320:320;;;:::o;14646:231::-;14786:34;14782:1;14774:6;14770:14;14763:58;14855:14;14850:2;14842:6;14838:15;14831:39;14646:231;:::o;14883:366::-;15025:3;15046:67;15110:2;15105:3;15046:67;:::i;:::-;15039:74;;15122:93;15211:3;15122:93;:::i;:::-;15240:2;15235:3;15231:12;15224:19;;14883:366;;;:::o;15255:419::-;15421:4;15459:2;15448:9;15444:18;15436:26;;15508:9;15502:4;15498:20;15494:1;15483:9;15479:17;15472:47;15536:131;15662:4;15536:131;:::i;:::-;15528:139;;15255:419;;;:::o;15680:220::-;15820:34;15816:1;15808:6;15804:14;15797:58;15889:3;15884:2;15876:6;15872:15;15865:28;15680:220;:::o;15906:366::-;16048:3;16069:67;16133:2;16128:3;16069:67;:::i;:::-;16062:74;;16145:93;16234:3;16145:93;:::i;:::-;16263:2;16258:3;16254:12;16247:19;;15906:366;;;:::o;16278:419::-;16444:4;16482:2;16471:9;16467:18;16459:26;;16531:9;16525:4;16521:20;16517:1;16506:9;16502:17;16495:47;16559:131;16685:4;16559:131;:::i;:::-;16551:139;;16278:419;;;:::o;16703:243::-;16843:34;16839:1;16831:6;16827:14;16820:58;16912:26;16907:2;16899:6;16895:15;16888:51;16703:243;:::o;16952:366::-;17094:3;17115:67;17179:2;17174:3;17115:67;:::i;:::-;17108:74;;17191:93;17280:3;17191:93;:::i;:::-;17309:2;17304:3;17300:12;17293:19;;16952:366;;;:::o;17324:419::-;17490:4;17528:2;17517:9;17513:18;17505:26;;17577:9;17571:4;17567:20;17563:1;17552:9;17548:17;17541:47;17605:131;17731:4;17605:131;:::i;:::-;17597:139;;17324:419;;;:::o;17749:182::-;17889:34;17885:1;17877:6;17873:14;17866:58;17749:182;:::o;17937:366::-;18079:3;18100:67;18164:2;18159:3;18100:67;:::i;:::-;18093:74;;18176:93;18265:3;18176:93;:::i;:::-;18294:2;18289:3;18285:12;18278:19;;17937:366;;;:::o;18309:419::-;18475:4;18513:2;18502:9;18498:18;18490:26;;18562:9;18556:4;18552:20;18548:1;18537:9;18533:17;18526:47;18590:131;18716:4;18590:131;:::i;:::-;18582:139;;18309:419;;;:::o;18734:236::-;18874:34;18870:1;18862:6;18858:14;18851:58;18943:19;18938:2;18930:6;18926:15;18919:44;18734:236;:::o;18976:366::-;19118:3;19139:67;19203:2;19198:3;19139:67;:::i;:::-;19132:74;;19215:93;19304:3;19215:93;:::i;:::-;19333:2;19328:3;19324:12;19317:19;;18976:366;;;:::o;19348:419::-;19514:4;19552:2;19541:9;19537:18;19529:26;;19601:9;19595:4;19591:20;19587:1;19576:9;19572:17;19565:47;19629:131;19755:4;19629:131;:::i;:::-;19621:139;;19348:419;;;:::o;19773:230::-;19913:34;19909:1;19901:6;19897:14;19890:58;19982:13;19977:2;19969:6;19965:15;19958:38;19773:230;:::o;20009:366::-;20151:3;20172:67;20236:2;20231:3;20172:67;:::i;:::-;20165:74;;20248:93;20337:3;20248:93;:::i;:::-;20366:2;20361:3;20357:12;20350:19;;20009:366;;;:::o;20381:419::-;20547:4;20585:2;20574:9;20570:18;20562:26;;20634:9;20628:4;20624:20;20620:1;20609:9;20605:17;20598:47;20662:131;20788:4;20662:131;:::i;:::-;20654:139;;20381:419;;;:::o;20806:180::-;20854:77;20851:1;20844:88;20951:4;20948:1;20941:15;20975:4;20972:1;20965:15;20992:180;21040:77;21037:1;21030:88;21137:4;21134:1;21127:15;21161:4;21158:1;21151:15;21178:233;21217:3;21240:24;21258:5;21240:24;:::i;:::-;21231:33;;21286:66;21279:5;21276:77;21273:103;;;21356:18;;:::i;:::-;21273:103;21403:1;21396:5;21392:13;21385:20;;21178:233;;;:::o;21417:181::-;21557:33;21553:1;21545:6;21541:14;21534:57;21417:181;:::o;21604:366::-;21746:3;21767:67;21831:2;21826:3;21767:67;:::i;:::-;21760:74;;21843:93;21932:3;21843:93;:::i;:::-;21961:2;21956:3;21952:12;21945:19;;21604:366;;;:::o;21976:419::-;22142:4;22180:2;22169:9;22165:18;22157:26;;22229:9;22223:4;22219:20;22215:1;22204:9;22200:17;22193:47;22257:131;22383:4;22257:131;:::i;:::-;22249:139;;21976:419;;;:::o;22401:147::-;22502:11;22539:3;22524:18;;22401:147;;;;:::o;22554:114::-;;:::o;22674:398::-;22833:3;22854:83;22935:1;22930:3;22854:83;:::i;:::-;22847:90;;22946:93;23035:3;22946:93;:::i;:::-;23064:1;23059:3;23055:11;23048:18;;22674:398;;;:::o;23078:379::-;23262:3;23284:147;23427:3;23284:147;:::i;:::-;23277:154;;23448:3;23441:10;;23078:379;;;:::o;23463:174::-;23603:26;23599:1;23591:6;23587:14;23580:50;23463:174;:::o;23643:366::-;23785:3;23806:67;23870:2;23865:3;23806:67;:::i;:::-;23799:74;;23882:93;23971:3;23882:93;:::i;:::-;24000:2;23995:3;23991:12;23984:19;;23643:366;;;:::o;24015:419::-;24181:4;24219:2;24208:9;24204:18;24196:26;;24268:9;24262:4;24258:20;24254:1;24243:9;24239:17;24232:47;24296:131;24422:4;24296:131;:::i;:::-;24288:139;;24015:419;;;:::o;24440:231::-;24580:34;24576:1;24568:6;24564:14;24557:58;24649:14;24644:2;24636:6;24632:15;24625:39;24440:231;:::o;24677:366::-;24819:3;24840:67;24904:2;24899:3;24840:67;:::i;:::-;24833:74;;24916:93;25005:3;24916:93;:::i;:::-;25034:2;25029:3;25025:12;25018:19;;24677:366;;;:::o;25049:419::-;25215:4;25253:2;25242:9;25238:18;25230:26;;25302:9;25296:4;25292:20;25288:1;25277:9;25273:17;25266:47;25330:131;25456:4;25330:131;:::i;:::-;25322:139;;25049:419;;;:::o;25474:228::-;25614:34;25610:1;25602:6;25598:14;25591:58;25683:11;25678:2;25670:6;25666:15;25659:36;25474:228;:::o;25708:366::-;25850:3;25871:67;25935:2;25930:3;25871:67;:::i;:::-;25864:74;;25947:93;26036:3;25947:93;:::i;:::-;26065:2;26060:3;26056:12;26049:19;;25708:366;;;:::o;26080:419::-;26246:4;26284:2;26273:9;26269:18;26261:26;;26333:9;26327:4;26323:20;26319:1;26308:9;26304:17;26297:47;26361:131;26487:4;26361:131;:::i;:::-;26353:139;;26080:419;;;:::o;26505:229::-;26645:34;26641:1;26633:6;26629:14;26622:58;26714:12;26709:2;26701:6;26697:15;26690:37;26505:229;:::o;26740:366::-;26882:3;26903:67;26967:2;26962:3;26903:67;:::i;:::-;26896:74;;26979:93;27068:3;26979:93;:::i;:::-;27097:2;27092:3;27088:12;27081:19;;26740:366;;;:::o;27112:419::-;27278:4;27316:2;27305:9;27301:18;27293:26;;27365:9;27359:4;27355:20;27351:1;27340:9;27336:17;27329:47;27393:131;27519:4;27393:131;:::i;:::-;27385:139;;27112:419;;;:::o;27537:177::-;27677:29;27673:1;27665:6;27661:14;27654:53;27537:177;:::o;27720:366::-;27862:3;27883:67;27947:2;27942:3;27883:67;:::i;:::-;27876:74;;27959:93;28048:3;27959:93;:::i;:::-;28077:2;28072:3;28068:12;28061:19;;27720:366;;;:::o;28092:419::-;28258:4;28296:2;28285:9;28281:18;28273:26;;28345:9;28339:4;28335:20;28331:1;28320:9;28316:17;28309:47;28373:131;28499:4;28373:131;:::i;:::-;28365:139;;28092:419;;;:::o;28517:222::-;28657:34;28653:1;28645:6;28641:14;28634:58;28726:5;28721:2;28713:6;28709:15;28702:30;28517:222;:::o;28745:366::-;28887:3;28908:67;28972:2;28967:3;28908:67;:::i;:::-;28901:74;;28984:93;29073:3;28984:93;:::i;:::-;29102:2;29097:3;29093:12;29086:19;;28745:366;;;:::o;29117:419::-;29283:4;29321:2;29310:9;29306:18;29298:26;;29370:9;29364:4;29360:20;29356:1;29345:9;29341:17;29334:47;29398:131;29524:4;29398:131;:::i;:::-;29390:139;;29117:419;;;:::o;29542:176::-;29682:28;29678:1;29670:6;29666:14;29659:52;29542:176;:::o;29724:366::-;29866:3;29887:67;29951:2;29946:3;29887:67;:::i;:::-;29880:74;;29963:93;30052:3;29963:93;:::i;:::-;30081:2;30076:3;30072:12;30065:19;;29724:366;;;:::o;30096:419::-;30262:4;30300:2;30289:9;30285:18;30277:26;;30349:9;30343:4;30339:20;30335:1;30324:9;30320:17;30313:47;30377:131;30503:4;30377:131;:::i;:::-;30369:139;;30096:419;;;:::o;30521:220::-;30661:34;30657:1;30649:6;30645:14;30638:58;30730:3;30725:2;30717:6;30713:15;30706:28;30521:220;:::o;30747:366::-;30889:3;30910:67;30974:2;30969:3;30910:67;:::i;:::-;30903:74;;30986:93;31075:3;30986:93;:::i;:::-;31104:2;31099:3;31095:12;31088:19;;30747:366;;;:::o;31119:419::-;31285:4;31323:2;31312:9;31308:18;31300:26;;31372:9;31366:4;31362:20;31358:1;31347:9;31343:17;31336:47;31400:131;31526:4;31400:131;:::i;:::-;31392:139;;31119:419;;;:::o;31544:175::-;31684:27;31680:1;31672:6;31668:14;31661:51;31544:175;:::o;31725:366::-;31867:3;31888:67;31952:2;31947:3;31888:67;:::i;:::-;31881:74;;31964:93;32053:3;31964:93;:::i;:::-;32082:2;32077:3;32073:12;32066:19;;31725:366;;;:::o;32097:419::-;32263:4;32301:2;32290:9;32286:18;32278:26;;32350:9;32344:4;32340:20;32336:1;32325:9;32321:17;32314:47;32378:131;32504:4;32378:131;:::i;:::-;32370:139;;32097:419;;;:::o;32522:174::-;32662:26;32658:1;32650:6;32646:14;32639:50;32522:174;:::o;32702:366::-;32844:3;32865:67;32929:2;32924:3;32865:67;:::i;:::-;32858:74;;32941:93;33030:3;32941:93;:::i;:::-;33059:2;33054:3;33050:12;33043:19;;32702:366;;;:::o;33074:419::-;33240:4;33278:2;33267:9;33263:18;33255:26;;33327:9;33321:4;33317:20;33313:1;33302:9;33298:17;33291:47;33355:131;33481:4;33355:131;:::i;:::-;33347:139;;33074:419;;;:::o;33499:220::-;33639:34;33635:1;33627:6;33623:14;33616:58;33708:3;33703:2;33695:6;33691:15;33684:28;33499:220;:::o;33725:366::-;33867:3;33888:67;33952:2;33947:3;33888:67;:::i;:::-;33881:74;;33964:93;34053:3;33964:93;:::i;:::-;34082:2;34077:3;34073:12;34066:19;;33725:366;;;:::o;34097:419::-;34263:4;34301:2;34290:9;34286:18;34278:26;;34350:9;34344:4;34340:20;34336:1;34325:9;34321:17;34314:47;34378:131;34504:4;34378:131;:::i;:::-;34370:139;;34097:419;;;:::o;34522:182::-;34662:34;34658:1;34650:6;34646:14;34639:58;34522:182;:::o;34710:366::-;34852:3;34873:67;34937:2;34932:3;34873:67;:::i;:::-;34866:74;;34949:93;35038:3;34949:93;:::i;:::-;35067:2;35062:3;35058:12;35051:19;;34710:366;;;:::o;35082:419::-;35248:4;35286:2;35275:9;35271:18;35263:26;;35335:9;35329:4;35325:20;35321:1;35310:9;35306:17;35299:47;35363:131;35489:4;35363:131;:::i;:::-;35355:139;;35082:419;;;:::o;35507:181::-;35647:33;35643:1;35635:6;35631:14;35624:57;35507:181;:::o;35694:366::-;35836:3;35857:67;35921:2;35916:3;35857:67;:::i;:::-;35850:74;;35933:93;36022:3;35933:93;:::i;:::-;36051:2;36046:3;36042:12;36035:19;;35694:366;;;:::o;36066:419::-;36232:4;36270:2;36259:9;36255:18;36247:26;;36319:9;36313:4;36309:20;36305:1;36294:9;36290:17;36283:47;36347:131;36473:4;36347:131;:::i;:::-;36339:139;;36066:419;;;:::o;36491:171::-;36631:23;36627:1;36619:6;36615:14;36608:47;36491:171;:::o;36668:366::-;36810:3;36831:67;36895:2;36890:3;36831:67;:::i;:::-;36824:74;;36907:93;36996:3;36907:93;:::i;:::-;37025:2;37020:3;37016:12;37009:19;;36668:366;;;:::o;37040:419::-;37206:4;37244:2;37233:9;37229:18;37221:26;;37293:9;37287:4;37283:20;37279:1;37268:9;37264:17;37257:47;37321:131;37447:4;37321:131;:::i;:::-;37313:139;;37040:419;;;:::o;37465:148::-;37567:11;37604:3;37589:18;;37465:148;;;;:::o;37619:141::-;37668:4;37691:3;37683:11;;37714:3;37711:1;37704:14;37748:4;37745:1;37735:18;37727:26;;37619:141;;;:::o;37790:845::-;37893:3;37930:5;37924:12;37959:36;37985:9;37959:36;:::i;:::-;38011:89;38093:6;38088:3;38011:89;:::i;:::-;38004:96;;38131:1;38120:9;38116:17;38147:1;38142:137;;;;38293:1;38288:341;;;;38109:520;;38142:137;38226:4;38222:9;38211;38207:25;38202:3;38195:38;38262:6;38257:3;38253:16;38246:23;;38142:137;;38288:341;38355:38;38387:5;38355:38;:::i;:::-;38415:1;38429:154;38443:6;38440:1;38437:13;38429:154;;;38517:7;38511:14;38507:1;38502:3;38498:11;38491:35;38567:1;38558:7;38554:15;38543:26;;38465:4;38462:1;38458:12;38453:17;;38429:154;;;38612:6;38607:3;38603:16;38596:23;;38295:334;;38109:520;;37897:738;;37790:845;;;;:::o;38641:377::-;38747:3;38775:39;38808:5;38775:39;:::i;:::-;38830:89;38912:6;38907:3;38830:89;:::i;:::-;38823:96;;38928:52;38973:6;38968:3;38961:4;38954:5;38950:16;38928:52;:::i;:::-;39005:6;39000:3;38996:16;38989:23;;38751:267;38641:377;;;;:::o;39024:429::-;39201:3;39223:92;39311:3;39302:6;39223:92;:::i;:::-;39216:99;;39332:95;39423:3;39414:6;39332:95;:::i;:::-;39325:102;;39444:3;39437:10;;39024:429;;;;;:::o;39459:125::-;39525:7;39554:24;39572:5;39554:24;:::i;:::-;39543:35;;39459:125;;;:::o;39590:180::-;39692:53;39739:5;39692:53;:::i;:::-;39685:5;39682:64;39672:92;;39760:1;39757;39750:12;39672:92;39590:180;:::o;39776:201::-;39862:5;39893:6;39887:13;39878:22;;39909:62;39965:5;39909:62;:::i;:::-;39776:201;;;;:::o;39983:409::-;40082:6;40131:2;40119:9;40110:7;40106:23;40102:32;40099:119;;;40137:79;;:::i;:::-;40099:119;40257:1;40282:93;40367:7;40358:6;40347:9;40343:22;40282:93;:::i;:::-;40272:103;;40228:157;39983:409;;;;:::o;40398:225::-;40538:34;40534:1;40526:6;40522:14;40515:58;40607:8;40602:2;40594:6;40590:15;40583:33;40398:225;:::o;40629:366::-;40771:3;40792:67;40856:2;40851:3;40792:67;:::i;:::-;40785:74;;40868:93;40957:3;40868:93;:::i;:::-;40986:2;40981:3;40977:12;40970:19;;40629:366;;;:::o;41001:419::-;41167:4;41205:2;41194:9;41190:18;41182:26;;41254:9;41248:4;41244:20;41240:1;41229:9;41225:17;41218:47;41282:131;41408:4;41282:131;:::i;:::-;41274:139;;41001:419;;;:::o;41426:231::-;41566:34;41562:1;41554:6;41550:14;41543:58;41635:14;41630:2;41622:6;41618:15;41611:39;41426:231;:::o;41663:366::-;41805:3;41826:67;41890:2;41885:3;41826:67;:::i;:::-;41819:74;;41902:93;41991:3;41902:93;:::i;:::-;42020:2;42015:3;42011:12;42004:19;;41663:366;;;:::o;42035:419::-;42201:4;42239:2;42228:9;42224:18;42216:26;;42288:9;42282:4;42278:20;42274:1;42263:9;42259:17;42252:47;42316:131;42442:4;42316:131;:::i;:::-;42308:139;;42035:419;;;:::o;42460:228::-;42600:34;42596:1;42588:6;42584:14;42577:58;42669:11;42664:2;42656:6;42652:15;42645:36;42460:228;:::o;42694:366::-;42836:3;42857:67;42921:2;42916:3;42857:67;:::i;:::-;42850:74;;42933:93;43022:3;42933:93;:::i;:::-;43051:2;43046:3;43042:12;43035:19;;42694:366;;;:::o;43066:419::-;43232:4;43270:2;43259:9;43255:18;43247:26;;43319:9;43313:4;43309:20;43305:1;43294:9;43290:17;43283:47;43347:131;43473:4;43347:131;:::i;:::-;43339:139;;43066:419;;;:::o;43491:223::-;43631:34;43627:1;43619:6;43615:14;43608:58;43700:6;43695:2;43687:6;43683:15;43676:31;43491:223;:::o;43720:366::-;43862:3;43883:67;43947:2;43942:3;43883:67;:::i;:::-;43876:74;;43959:93;44048:3;43959:93;:::i;:::-;44077:2;44072:3;44068:12;44061:19;;43720:366;;;:::o;44092:419::-;44258:4;44296:2;44285:9;44281:18;44273:26;;44345:9;44339:4;44335:20;44331:1;44320:9;44316:17;44309:47;44373:131;44499:4;44373:131;:::i;:::-;44365:139;;44092:419;;;:::o;44517:305::-;44557:3;44576:20;44594:1;44576:20;:::i;:::-;44571:25;;44610:20;44628:1;44610:20;:::i;:::-;44605:25;;44764:1;44696:66;44692:74;44689:1;44686:81;44683:107;;;44770:18;;:::i;:::-;44683:107;44814:1;44811;44807:9;44800:16;;44517:305;;;;:::o;44828:237::-;44968:34;44964:1;44956:6;44952:14;44945:58;45037:20;45032:2;45024:6;45020:15;45013:45;44828:237;:::o;45071:366::-;45213:3;45234:67;45298:2;45293:3;45234:67;:::i;:::-;45227:74;;45310:93;45399:3;45310:93;:::i;:::-;45428:2;45423:3;45419:12;45412:19;;45071:366;;;:::o;45443:419::-;45609:4;45647:2;45636:9;45632:18;45624:26;;45696:9;45690:4;45686:20;45682:1;45671:9;45667:17;45660:47;45724:131;45850:4;45724:131;:::i;:::-;45716:139;;45443:419;;;:::o;45868:348::-;45908:7;45931:20;45949:1;45931:20;:::i;:::-;45926:25;;45965:20;45983:1;45965:20;:::i;:::-;45960:25;;46153:1;46085:66;46081:74;46078:1;46075:81;46070:1;46063:9;46056:17;46052:105;46049:131;;;46160:18;;:::i;:::-;46049:131;46208:1;46205;46201:9;46190:20;;45868:348;;;;:::o;46222:180::-;46270:77;46267:1;46260:88;46367:4;46364:1;46357:15;46391:4;46388:1;46381:15;46408:185;46448:1;46465:20;46483:1;46465:20;:::i;:::-;46460:25;;46499:20;46517:1;46499:20;:::i;:::-;46494:25;;46538:1;46528:35;;46543:18;;:::i;:::-;46528:35;46585:1;46582;46578:9;46573:14;;46408:185;;;;:::o;46599:191::-;46639:4;46659:20;46677:1;46659:20;:::i;:::-;46654:25;;46693:20;46711:1;46693:20;:::i;:::-;46688:25;;46732:1;46729;46726:8;46723:34;;;46737:18;;:::i;:::-;46723:34;46782:1;46779;46775:9;46767:17;;46599:191;;;;:::o;46796:176::-;46828:1;46845:20;46863:1;46845:20;:::i;:::-;46840:25;;46879:20;46897:1;46879:20;:::i;:::-;46874:25;;46918:1;46908:35;;46923:18;;:::i;:::-;46908:35;46964:1;46961;46957:9;46952:14;;46796:176;;;;:::o;46978:98::-;47029:6;47063:5;47057:12;47047:22;;46978:98;;;:::o;47082:168::-;47165:11;47199:6;47194:3;47187:19;47239:4;47234:3;47230:14;47215:29;;47082:168;;;;:::o;47256:360::-;47342:3;47370:38;47402:5;47370:38;:::i;:::-;47424:70;47487:6;47482:3;47424:70;:::i;:::-;47417:77;;47503:52;47548:6;47543:3;47536:4;47529:5;47525:16;47503:52;:::i;:::-;47580:29;47602:6;47580:29;:::i;:::-;47575:3;47571:39;47564:46;;47346:270;47256:360;;;;:::o;47622:640::-;47817:4;47855:3;47844:9;47840:19;47832:27;;47869:71;47937:1;47926:9;47922:17;47913:6;47869:71;:::i;:::-;47950:72;48018:2;48007:9;48003:18;47994:6;47950:72;:::i;:::-;48032;48100:2;48089:9;48085:18;48076:6;48032:72;:::i;:::-;48151:9;48145:4;48141:20;48136:2;48125:9;48121:18;48114:48;48179:76;48250:4;48241:6;48179:76;:::i;:::-;48171:84;;47622:640;;;;;;;:::o;48268:141::-;48324:5;48355:6;48349:13;48340:22;;48371:32;48397:5;48371:32;:::i;:::-;48268:141;;;;:::o;48415:349::-;48484:6;48533:2;48521:9;48512:7;48508:23;48504:32;48501:119;;;48539:79;;:::i;:::-;48501:119;48659:1;48684:63;48739:7;48730:6;48719:9;48715:22;48684:63;:::i;:::-;48674:73;;48630:127;48415:349;;;;:::o;48770:182::-;48910:34;48906:1;48898:6;48894:14;48887:58;48770:182;:::o;48958:366::-;49100:3;49121:67;49185:2;49180:3;49121:67;:::i;:::-;49114:74;;49197:93;49286:3;49197:93;:::i;:::-;49315:2;49310:3;49306:12;49299:19;;48958:366;;;:::o;49330:419::-;49496:4;49534:2;49523:9;49519:18;49511:26;;49583:9;49577:4;49573:20;49569:1;49558:9;49554:17;49547:47;49611:131;49737:4;49611:131;:::i;:::-;49603:139;;49330:419;;;:::o;49755:178::-;49895:30;49891:1;49883:6;49879:14;49872:54;49755:178;:::o;49939:366::-;50081:3;50102:67;50166:2;50161:3;50102:67;:::i;:::-;50095:74;;50178:93;50267:3;50178:93;:::i;:::-;50296:2;50291:3;50287:12;50280:19;;49939:366;;;:::o;50311:419::-;50477:4;50515:2;50504:9;50500:18;50492:26;;50564:9;50558:4;50554:20;50550:1;50539:9;50535:17;50528:47;50592:131;50718:4;50592:131;:::i;:::-;50584:139;;50311:419;;;:::o

Swarm Source

ipfs://0f4f8daeafe76e2e5611372a771c712d5f2060073585dcaf7d5d4562498f5dfc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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