ETH Price: $3,506.81 (-0.08%)
Gas: 2 Gwei

Token

CanalStFun (CSF1)
 

Overview

Max Total Supply

0 CSF1

Holders

6

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
successionhbo.eth
Balance
1 CSF1
0xDEC3705633912c024911d3a5f357E8256A43ff7e
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:
CanalStFun

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.4.3 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/access/[email protected]

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() {
        _setOwner(_msgSender());
    }

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

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

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]

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);
}

// File @openzeppelin/contracts/token/ERC721/[email protected]

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

// File @openzeppelin/contracts/token/ERC721/[email protected]

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);
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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);
}

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File @openzeppelin/contracts/utils/[email protected]

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);
    }
}

// File @openzeppelin/contracts/utils/introspection/[email protected]

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

// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    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 (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @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 {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

        _balances[to] += 1;
        _owners[tokenId] = 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);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _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(to).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 {}
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721URIStorage: URI query for nonexistent token"
        );

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI)
        internal
        virtual
    {
        require(
            _exists(tokenId),
            "ERC721URIStorage: URI set of nonexistent token"
        );
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File contracts/SafeAddress.sol

pragma solidity ^0.8.4;

/**
 * An upgrade-safe version of OpenZeppelin's Address utility (does not use delegatecall).
 */
library SafeAddress {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }
}

// File contracts/CanalStFun.sol

pragma solidity ^0.8.4;

contract CanalStFun is ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    /** The minimum value accepted in makeReplica calls */
    uint256 public makeReplicaPrice;

    /** Event emitted when the makeReplicaPrice changes */
    event MakeReplicaPriceChanged(uint256 newMakeReplicaPrice);
    /** Event emitted someone makes a replica */
    event ReplicaCreated(
        address recipient,
        address originalTokenAddress,
        uint256 originalTokenId,
        uint256 replicaTokenId,
        string comment
    );

    constructor() ERC721("CanalStFun", "CSF1") {
        // Initialize makeReplicaPrice to 0
        // Can be overridden by owner
        makeReplicaPrice = 0;
    }

    /** Owner-Only Set makeReplica Price */
    function setMakeReplicaPrice(uint256 newMakeReplicaPrice) public onlyOwner {
        makeReplicaPrice = newMakeReplicaPrice;
        emit MakeReplicaPriceChanged(newMakeReplicaPrice);
    }

    /** Owner-Only safety measure to withdraw any stuck funds */
    function safeWithdraw() public onlyOwner {
        SafeAddress.sendValue(payable(owner()), address(this).balance);
    }

    /** ERC721 tokenURI view */
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    /** CSF1: Make a replica of an original ERC721 token */
    function makeReplica(
        address originalTokenAddress,
        uint256 originalTokenId,
        string memory replicaTokenURI,
        address feeSplitRecipient,
        string calldata optionalComment
    ) public payable returns (uint256) {
        require(
            msg.value >= makeReplicaPrice,
            "calls to makeReplica must have a msg.value of at least makeReplicaPrice"
        );

        // Mint the replica token and set its tokenURI
        _tokenIdCounter.increment();
        uint256 replicaTokenId = _tokenIdCounter.current();
        _safeMint(msg.sender, replicaTokenId);
        _setTokenURI(replicaTokenId, replicaTokenURI);

        // If the feeSplitRecipient address is not a contract, send it half of msg.value
        // Else: Send the contract owner the full msg.value
        if (
            !SafeAddress.isContract(feeSplitRecipient) &&
            feeSplitRecipient != address(0)
        ) {
            uint256 originalTokenOwnerPayment = msg.value / 2;
            uint256 ownerPayment = msg.value - originalTokenOwnerPayment;

            SafeAddress.sendValue(payable(owner()), ownerPayment);
            SafeAddress.sendValue(
                payable(feeSplitRecipient),
                originalTokenOwnerPayment
            );
        } else {
            SafeAddress.sendValue(payable(owner()), msg.value);
        }

        // Emit ReplicaCreated event
        emit ReplicaCreated(
            msg.sender,
            originalTokenAddress,
            originalTokenId,
            replicaTokenId,
            optionalComment
        );

        return replicaTokenId;
    }
}

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":false,"internalType":"uint256","name":"newMakeReplicaPrice","type":"uint256"}],"name":"MakeReplicaPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"originalTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"originalTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"replicaTokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"comment","type":"string"}],"name":"ReplicaCreated","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":[{"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":[{"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":[{"internalType":"address","name":"originalTokenAddress","type":"address"},{"internalType":"uint256","name":"originalTokenId","type":"uint256"},{"internalType":"string","name":"replicaTokenURI","type":"string"},{"internalType":"address","name":"feeSplitRecipient","type":"address"},{"internalType":"string","name":"optionalComment","type":"string"}],"name":"makeReplica","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"makeReplicaPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"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":"safeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMakeReplicaPrice","type":"uint256"}],"name":"setMakeReplicaPrice","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f43616e616c537446756e000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4353463100000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001ae565b508060019080519060200190620000af929190620001ae565b505050620000d2620000c6620000e060201b60201c565b620000e860201b60201c565b6000600981905550620002c3565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001bc906200025e565b90600052602060002090601f016020900481019282620001e057600085556200022c565b82601f10620001fb57805160ff19168380011785556200022c565b828001600101855582156200022c579182015b828111156200022b5782518255916020019190600101906200020e565b5b5090506200023b91906200023f565b5090565b5b808211156200025a57600081600090555060010162000240565b5090565b600060028204905060018216806200027757607f821691505b602082108114156200028e576200028d62000294565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6137be80620002d36000396000f3fe60806040526004361061011f5760003560e01c8063715018a6116100a0578063a22cb46511610064578063a22cb465146103c6578063b88d4fde146103ef578063c87b56dd14610418578063e985e9c514610455578063f2fde38b146104925761011f565b8063715018a6146103125780637fd42617146103295780638da5cb5b146103405780638fd108281461036b57806395d89b411461039b5761011f565b806323b872dd116100e757806323b872dd1461021b57806323b99d2c1461024457806342842e0e1461026f5780636352211e1461029857806370a08231146102d55761011f565b806301ffc9a71461012457806306fdde0314610161578063081812fc1461018c578063095ea7b3146101c9578063116da38a146101f2575b600080fd5b34801561013057600080fd5b5061014b600480360381019061014691906124e8565b6104bb565b6040516101589190612a5e565b60405180910390f35b34801561016d57600080fd5b5061017661059d565b6040516101839190612a79565b60405180910390f35b34801561019857600080fd5b506101b360048036038101906101ae919061253a565b61062f565b6040516101c0919061299b565b60405180910390f35b3480156101d557600080fd5b506101f060048036038101906101eb9190612402565b6106b4565b005b3480156101fe57600080fd5b506102196004803603810190610214919061253a565b6107cc565b005b34801561022757600080fd5b50610242600480360381019061023d91906122fc565b610889565b005b34801561025057600080fd5b506102596108e9565b6040516102669190612d3b565b60405180910390f35b34801561027b57600080fd5b50610296600480360381019061029191906122fc565b6108ef565b005b3480156102a457600080fd5b506102bf60048036038101906102ba919061253a565b61090f565b6040516102cc919061299b565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190612297565b6109c1565b6040516103099190612d3b565b60405180910390f35b34801561031e57600080fd5b50610327610a79565b005b34801561033557600080fd5b5061033e610b01565b005b34801561034c57600080fd5b50610355610b90565b604051610362919061299b565b60405180910390f35b6103856004803603810190610380919061243e565b610bba565b6040516103929190612d3b565b60405180910390f35b3480156103a757600080fd5b506103b0610d19565b6040516103bd9190612a79565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e891906123c6565b610dab565b005b3480156103fb57600080fd5b506104166004803603810190610411919061234b565b610f2c565b005b34801561042457600080fd5b5061043f600480360381019061043a919061253a565b610f8e565b60405161044c9190612a79565b60405180910390f35b34801561046157600080fd5b5061047c600480360381019061047791906122c0565b610fa0565b6040516104899190612a5e565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190612297565b611034565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061059657506105958261112c565b5b9050919050565b6060600080546105ac90612f9c565b80601f01602080910402602001604051908101604052809291908181526020018280546105d890612f9c565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b600061063a82611196565b610679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067090612c7b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106bf8261090f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072790612cfb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074f611202565b73ffffffffffffffffffffffffffffffffffffffff16148061077e575061077d81610778611202565b610fa0565b5b6107bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b490612bbb565b60405180910390fd5b6107c7838361120a565b505050565b6107d4611202565b73ffffffffffffffffffffffffffffffffffffffff166107f2610b90565b73ffffffffffffffffffffffffffffffffffffffff1614610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90612c9b565b60405180910390fd5b806009819055507fca59414ff5b2703353d1ebcd870f486d6ab02e5e8a9be6ec4035919caff0fb7e8160405161087e9190612d3b565b60405180910390a150565b61089a610894611202565b826112c3565b6108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612d1b565b60405180910390fd5b6108e48383836113a1565b505050565b60095481565b61090a83838360405180602001604052806000815250610f2c565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90612bfb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2990612bdb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a81611202565b73ffffffffffffffffffffffffffffffffffffffff16610a9f610b90565b73ffffffffffffffffffffffffffffffffffffffff1614610af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aec90612c9b565b60405180910390fd5b610aff60006115fd565b565b610b09611202565b73ffffffffffffffffffffffffffffffffffffffff16610b27610b90565b73ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490612c9b565b60405180910390fd5b610b8e610b88610b90565b476116c3565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600954341015610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890612afb565b60405180910390fd5b610c0b60086117b7565b6000610c1760086117cd565b9050610c2333826117db565b610c2d81876117f9565b610c368561186d565b158015610c705750600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15610cb8576000600234610c849190612e81565b905060008134610c949190612eb2565b9050610ca7610ca1610b90565b826116c3565b610cb187836116c3565b5050610cca565b610cc9610cc3610b90565b346116c3565b5b7fcb40d58e8154d5a46b8add0a3aee4bf99efd1a2d42266c7be1a6d41398e47c02338989848888604051610d0396959493929190612a02565b60405180910390a1809150509695505050505050565b606060018054610d2890612f9c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5490612f9c565b8015610da15780601f10610d7657610100808354040283529160200191610da1565b820191906000526020600020905b815481529060010190602001808311610d8457829003601f168201915b5050505050905090565b610db3611202565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890612b3b565b60405180910390fd5b8060056000610e2e611202565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610edb611202565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f209190612a5e565b60405180910390a35050565b610f3d610f37611202565b836112c3565b610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390612d1b565b60405180910390fd5b610f8884848484611880565b50505050565b6060610f99826118dc565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61103c611202565b73ffffffffffffffffffffffffffffffffffffffff1661105a610b90565b73ffffffffffffffffffffffffffffffffffffffff16146110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a790612c9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111790612abb565b60405180910390fd5b611129816115fd565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661127d8361090f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112ce82611196565b61130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490612b9b565b60405180910390fd5b60006113188361090f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061138757508373ffffffffffffffffffffffffffffffffffffffff1661136f8461062f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061139857506113978185610fa0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113c18261090f565b73ffffffffffffffffffffffffffffffffffffffff1614611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e90612cbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e90612b1b565b60405180910390fd5b611492838383611a2e565b61149d60008261120a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114ed9190612eb2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115449190612e2b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80471015611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90612b7b565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161172c90612986565b60006040518083038185875af1925050503d8060008114611769576040519150601f19603f3d011682016040523d82523d6000602084013e61176e565b606091505b50509050806117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990612b5b565b60405180910390fd5b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6117f5828260405180602001604052806000815250611a33565b5050565b61180282611196565b611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890612c1b565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611868929190612071565b505050565b600080823b905060008111915050919050565b61188b8484846113a1565b61189784848484611a8e565b6118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd90612a9b565b60405180910390fd5b50505050565b60606118e782611196565b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90612c5b565b60405180910390fd5b600060066000848152602001908152602001600020805461194690612f9c565b80601f016020809104026020016040519081016040528092919081815260200182805461197290612f9c565b80156119bf5780601f10611994576101008083540402835291602001916119bf565b820191906000526020600020905b8154815290600101906020018083116119a257829003601f168201915b5050505050905060006119d0611c25565b90506000815114156119e6578192505050611a29565b600082511115611a1b578082604051602001611a03929190612962565b60405160208183030381529060405292505050611a29565b611a2484611c3c565b925050505b919050565b505050565b611a3d8383611ce3565b611a4a6000848484611a8e565b611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090612a9b565b60405180910390fd5b505050565b6000611aaf8473ffffffffffffffffffffffffffffffffffffffff16611eb1565b15611c18578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ad8611202565b8786866040518563ffffffff1660e01b8152600401611afa94939291906129b6565b602060405180830381600087803b158015611b1457600080fd5b505af1925050508015611b4557506040513d601f19601f82011682018060405250810190611b429190612511565b60015b611bc8573d8060008114611b75576040519150601f19603f3d011682016040523d82523d6000602084013e611b7a565b606091505b50600081511415611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb790612a9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c1d565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611c4782611196565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90612cdb565b60405180910390fd5b6000611c90611c25565b90506000815111611cb05760405180602001604052806000815250611cdb565b80611cba84611ec4565b604051602001611ccb929190612962565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90612c3b565b60405180910390fd5b611d5c81611196565b15611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9390612adb565b60405180910390fd5b611da860008383611a2e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611df89190612e2b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415611f0c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061206c565b600082905060005b60008214611f3e578080611f2790612fff565b915050600a82611f379190612e81565b9150611f14565b60008167ffffffffffffffff811115611f80577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fb25781602001600182028036833780820191505090505b5090505b6000851461206557600182611fcb9190612eb2565b9150600a85611fda9190613048565b6030611fe69190612e2b565b60f81b818381518110612022577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561205e9190612e81565b9450611fb6565b8093505050505b919050565b82805461207d90612f9c565b90600052602060002090601f01602090048101928261209f57600085556120e6565b82601f106120b857805160ff19168380011785556120e6565b828001600101855582156120e6579182015b828111156120e55782518255916020019190600101906120ca565b5b5090506120f391906120f7565b5090565b5b808211156121105760008160009055506001016120f8565b5090565b600061212761212284612d7b565b612d56565b90508281526020810184848401111561213f57600080fd5b61214a848285612f5a565b509392505050565b600061216561216084612dac565b612d56565b90508281526020810184848401111561217d57600080fd5b612188848285612f5a565b509392505050565b60008135905061219f8161372c565b92915050565b6000813590506121b481613743565b92915050565b6000813590506121c98161375a565b92915050565b6000815190506121de8161375a565b92915050565b600082601f8301126121f557600080fd5b8135612205848260208601612114565b91505092915050565b60008083601f84011261222057600080fd5b8235905067ffffffffffffffff81111561223957600080fd5b60208301915083600182028301111561225157600080fd5b9250929050565b600082601f83011261226957600080fd5b8135612279848260208601612152565b91505092915050565b60008135905061229181613771565b92915050565b6000602082840312156122a957600080fd5b60006122b784828501612190565b91505092915050565b600080604083850312156122d357600080fd5b60006122e185828601612190565b92505060206122f285828601612190565b9150509250929050565b60008060006060848603121561231157600080fd5b600061231f86828701612190565b935050602061233086828701612190565b925050604061234186828701612282565b9150509250925092565b6000806000806080858703121561236157600080fd5b600061236f87828801612190565b945050602061238087828801612190565b935050604061239187828801612282565b925050606085013567ffffffffffffffff8111156123ae57600080fd5b6123ba878288016121e4565b91505092959194509250565b600080604083850312156123d957600080fd5b60006123e785828601612190565b92505060206123f8858286016121a5565b9150509250929050565b6000806040838503121561241557600080fd5b600061242385828601612190565b925050602061243485828601612282565b9150509250929050565b60008060008060008060a0878903121561245757600080fd5b600061246589828a01612190565b965050602061247689828a01612282565b955050604087013567ffffffffffffffff81111561249357600080fd5b61249f89828a01612258565b94505060606124b089828a01612190565b935050608087013567ffffffffffffffff8111156124cd57600080fd5b6124d989828a0161220e565b92509250509295509295509295565b6000602082840312156124fa57600080fd5b6000612508848285016121ba565b91505092915050565b60006020828403121561252357600080fd5b6000612531848285016121cf565b91505092915050565b60006020828403121561254c57600080fd5b600061255a84828501612282565b91505092915050565b61256c81612ee6565b82525050565b61257b81612ef8565b82525050565b600061258c82612ddd565b6125968185612df3565b93506125a6818560208601612f69565b6125af81613135565b840191505092915050565b60006125c68385612e0f565b93506125d3838584612f5a565b6125dc83613135565b840190509392505050565b60006125f282612de8565b6125fc8185612e0f565b935061260c818560208601612f69565b61261581613135565b840191505092915050565b600061262b82612de8565b6126358185612e20565b9350612645818560208601612f69565b80840191505092915050565b600061265e603283612e0f565b915061266982613146565b604082019050919050565b6000612681602683612e0f565b915061268c82613195565b604082019050919050565b60006126a4601c83612e0f565b91506126af826131e4565b602082019050919050565b60006126c7604783612e0f565b91506126d28261320d565b606082019050919050565b60006126ea602483612e0f565b91506126f582613282565b604082019050919050565b600061270d601983612e0f565b9150612718826132d1565b602082019050919050565b6000612730603a83612e0f565b915061273b826132fa565b604082019050919050565b6000612753601d83612e0f565b915061275e82613349565b602082019050919050565b6000612776602c83612e0f565b915061278182613372565b604082019050919050565b6000612799603883612e0f565b91506127a4826133c1565b604082019050919050565b60006127bc602a83612e0f565b91506127c782613410565b604082019050919050565b60006127df602983612e0f565b91506127ea8261345f565b604082019050919050565b6000612802602e83612e0f565b915061280d826134ae565b604082019050919050565b6000612825602083612e0f565b9150612830826134fd565b602082019050919050565b6000612848603183612e0f565b915061285382613526565b604082019050919050565b600061286b602c83612e0f565b915061287682613575565b604082019050919050565b600061288e602083612e0f565b9150612899826135c4565b602082019050919050565b60006128b1602983612e0f565b91506128bc826135ed565b604082019050919050565b60006128d4602f83612e0f565b91506128df8261363c565b604082019050919050565b60006128f7602183612e0f565b91506129028261368b565b604082019050919050565b600061291a600083612e04565b9150612925826136da565b600082019050919050565b600061293d603183612e0f565b9150612948826136dd565b604082019050919050565b61295c81612f50565b82525050565b600061296e8285612620565b915061297a8284612620565b91508190509392505050565b60006129918261290d565b9150819050919050565b60006020820190506129b06000830184612563565b92915050565b60006080820190506129cb6000830187612563565b6129d86020830186612563565b6129e56040830185612953565b81810360608301526129f78184612581565b905095945050505050565b600060a082019050612a176000830189612563565b612a246020830188612563565b612a316040830187612953565b612a3e6060830186612953565b8181036080830152612a518184866125ba565b9050979650505050505050565b6000602082019050612a736000830184612572565b92915050565b60006020820190508181036000830152612a9381846125e7565b905092915050565b60006020820190508181036000830152612ab481612651565b9050919050565b60006020820190508181036000830152612ad481612674565b9050919050565b60006020820190508181036000830152612af481612697565b9050919050565b60006020820190508181036000830152612b14816126ba565b9050919050565b60006020820190508181036000830152612b34816126dd565b9050919050565b60006020820190508181036000830152612b5481612700565b9050919050565b60006020820190508181036000830152612b7481612723565b9050919050565b60006020820190508181036000830152612b9481612746565b9050919050565b60006020820190508181036000830152612bb481612769565b9050919050565b60006020820190508181036000830152612bd48161278c565b9050919050565b60006020820190508181036000830152612bf4816127af565b9050919050565b60006020820190508181036000830152612c14816127d2565b9050919050565b60006020820190508181036000830152612c34816127f5565b9050919050565b60006020820190508181036000830152612c5481612818565b9050919050565b60006020820190508181036000830152612c748161283b565b9050919050565b60006020820190508181036000830152612c948161285e565b9050919050565b60006020820190508181036000830152612cb481612881565b9050919050565b60006020820190508181036000830152612cd4816128a4565b9050919050565b60006020820190508181036000830152612cf4816128c7565b9050919050565b60006020820190508181036000830152612d14816128ea565b9050919050565b60006020820190508181036000830152612d3481612930565b9050919050565b6000602082019050612d506000830184612953565b92915050565b6000612d60612d71565b9050612d6c8282612fce565b919050565b6000604051905090565b600067ffffffffffffffff821115612d9657612d95613106565b5b612d9f82613135565b9050602081019050919050565b600067ffffffffffffffff821115612dc757612dc6613106565b5b612dd082613135565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612e3682612f50565b9150612e4183612f50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e7657612e75613079565b5b828201905092915050565b6000612e8c82612f50565b9150612e9783612f50565b925082612ea757612ea66130a8565b5b828204905092915050565b6000612ebd82612f50565b9150612ec883612f50565b925082821015612edb57612eda613079565b5b828203905092915050565b6000612ef182612f30565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f87578082015181840152602081019050612f6c565b83811115612f96576000848401525b50505050565b60006002820490506001821680612fb457607f821691505b60208210811415612fc857612fc76130d7565b5b50919050565b612fd782613135565b810181811067ffffffffffffffff82111715612ff657612ff5613106565b5b80604052505050565b600061300a82612f50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561303d5761303c613079565b5b600182019050919050565b600061305382612f50565b915061305e83612f50565b92508261306e5761306d6130a8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f63616c6c7320746f206d616b655265706c696361206d7573742068617665206160008201527f206d73672e76616c7565206f66206174206c65617374206d616b655265706c6960208201527f6361507269636500000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61373581612ee6565b811461374057600080fd5b50565b61374c81612ef8565b811461375757600080fd5b50565b61376381612f04565b811461376e57600080fd5b50565b61377a81612f50565b811461378557600080fd5b5056fea26469706673582212200bff747392440cb984211c1257a04736087198b4120f0102ff233303b863cf4d64736f6c63430008040033

Deployed Bytecode

0x60806040526004361061011f5760003560e01c8063715018a6116100a0578063a22cb46511610064578063a22cb465146103c6578063b88d4fde146103ef578063c87b56dd14610418578063e985e9c514610455578063f2fde38b146104925761011f565b8063715018a6146103125780637fd42617146103295780638da5cb5b146103405780638fd108281461036b57806395d89b411461039b5761011f565b806323b872dd116100e757806323b872dd1461021b57806323b99d2c1461024457806342842e0e1461026f5780636352211e1461029857806370a08231146102d55761011f565b806301ffc9a71461012457806306fdde0314610161578063081812fc1461018c578063095ea7b3146101c9578063116da38a146101f2575b600080fd5b34801561013057600080fd5b5061014b600480360381019061014691906124e8565b6104bb565b6040516101589190612a5e565b60405180910390f35b34801561016d57600080fd5b5061017661059d565b6040516101839190612a79565b60405180910390f35b34801561019857600080fd5b506101b360048036038101906101ae919061253a565b61062f565b6040516101c0919061299b565b60405180910390f35b3480156101d557600080fd5b506101f060048036038101906101eb9190612402565b6106b4565b005b3480156101fe57600080fd5b506102196004803603810190610214919061253a565b6107cc565b005b34801561022757600080fd5b50610242600480360381019061023d91906122fc565b610889565b005b34801561025057600080fd5b506102596108e9565b6040516102669190612d3b565b60405180910390f35b34801561027b57600080fd5b50610296600480360381019061029191906122fc565b6108ef565b005b3480156102a457600080fd5b506102bf60048036038101906102ba919061253a565b61090f565b6040516102cc919061299b565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190612297565b6109c1565b6040516103099190612d3b565b60405180910390f35b34801561031e57600080fd5b50610327610a79565b005b34801561033557600080fd5b5061033e610b01565b005b34801561034c57600080fd5b50610355610b90565b604051610362919061299b565b60405180910390f35b6103856004803603810190610380919061243e565b610bba565b6040516103929190612d3b565b60405180910390f35b3480156103a757600080fd5b506103b0610d19565b6040516103bd9190612a79565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e891906123c6565b610dab565b005b3480156103fb57600080fd5b506104166004803603810190610411919061234b565b610f2c565b005b34801561042457600080fd5b5061043f600480360381019061043a919061253a565b610f8e565b60405161044c9190612a79565b60405180910390f35b34801561046157600080fd5b5061047c600480360381019061047791906122c0565b610fa0565b6040516104899190612a5e565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190612297565b611034565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061059657506105958261112c565b5b9050919050565b6060600080546105ac90612f9c565b80601f01602080910402602001604051908101604052809291908181526020018280546105d890612f9c565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b600061063a82611196565b610679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067090612c7b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106bf8261090f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072790612cfb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074f611202565b73ffffffffffffffffffffffffffffffffffffffff16148061077e575061077d81610778611202565b610fa0565b5b6107bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b490612bbb565b60405180910390fd5b6107c7838361120a565b505050565b6107d4611202565b73ffffffffffffffffffffffffffffffffffffffff166107f2610b90565b73ffffffffffffffffffffffffffffffffffffffff1614610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90612c9b565b60405180910390fd5b806009819055507fca59414ff5b2703353d1ebcd870f486d6ab02e5e8a9be6ec4035919caff0fb7e8160405161087e9190612d3b565b60405180910390a150565b61089a610894611202565b826112c3565b6108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612d1b565b60405180910390fd5b6108e48383836113a1565b505050565b60095481565b61090a83838360405180602001604052806000815250610f2c565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90612bfb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2990612bdb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a81611202565b73ffffffffffffffffffffffffffffffffffffffff16610a9f610b90565b73ffffffffffffffffffffffffffffffffffffffff1614610af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aec90612c9b565b60405180910390fd5b610aff60006115fd565b565b610b09611202565b73ffffffffffffffffffffffffffffffffffffffff16610b27610b90565b73ffffffffffffffffffffffffffffffffffffffff1614610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490612c9b565b60405180910390fd5b610b8e610b88610b90565b476116c3565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600954341015610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890612afb565b60405180910390fd5b610c0b60086117b7565b6000610c1760086117cd565b9050610c2333826117db565b610c2d81876117f9565b610c368561186d565b158015610c705750600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15610cb8576000600234610c849190612e81565b905060008134610c949190612eb2565b9050610ca7610ca1610b90565b826116c3565b610cb187836116c3565b5050610cca565b610cc9610cc3610b90565b346116c3565b5b7fcb40d58e8154d5a46b8add0a3aee4bf99efd1a2d42266c7be1a6d41398e47c02338989848888604051610d0396959493929190612a02565b60405180910390a1809150509695505050505050565b606060018054610d2890612f9c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5490612f9c565b8015610da15780601f10610d7657610100808354040283529160200191610da1565b820191906000526020600020905b815481529060010190602001808311610d8457829003601f168201915b5050505050905090565b610db3611202565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890612b3b565b60405180910390fd5b8060056000610e2e611202565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610edb611202565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610f209190612a5e565b60405180910390a35050565b610f3d610f37611202565b836112c3565b610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390612d1b565b60405180910390fd5b610f8884848484611880565b50505050565b6060610f99826118dc565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61103c611202565b73ffffffffffffffffffffffffffffffffffffffff1661105a610b90565b73ffffffffffffffffffffffffffffffffffffffff16146110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a790612c9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111790612abb565b60405180910390fd5b611129816115fd565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661127d8361090f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112ce82611196565b61130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490612b9b565b60405180910390fd5b60006113188361090f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061138757508373ffffffffffffffffffffffffffffffffffffffff1661136f8461062f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061139857506113978185610fa0565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113c18261090f565b73ffffffffffffffffffffffffffffffffffffffff1614611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e90612cbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e90612b1b565b60405180910390fd5b611492838383611a2e565b61149d60008261120a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114ed9190612eb2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115449190612e2b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80471015611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90612b7b565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161172c90612986565b60006040518083038185875af1925050503d8060008114611769576040519150601f19603f3d011682016040523d82523d6000602084013e61176e565b606091505b50509050806117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990612b5b565b60405180910390fd5b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6117f5828260405180602001604052806000815250611a33565b5050565b61180282611196565b611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890612c1b565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611868929190612071565b505050565b600080823b905060008111915050919050565b61188b8484846113a1565b61189784848484611a8e565b6118d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cd90612a9b565b60405180910390fd5b50505050565b60606118e782611196565b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90612c5b565b60405180910390fd5b600060066000848152602001908152602001600020805461194690612f9c565b80601f016020809104026020016040519081016040528092919081815260200182805461197290612f9c565b80156119bf5780601f10611994576101008083540402835291602001916119bf565b820191906000526020600020905b8154815290600101906020018083116119a257829003601f168201915b5050505050905060006119d0611c25565b90506000815114156119e6578192505050611a29565b600082511115611a1b578082604051602001611a03929190612962565b60405160208183030381529060405292505050611a29565b611a2484611c3c565b925050505b919050565b505050565b611a3d8383611ce3565b611a4a6000848484611a8e565b611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090612a9b565b60405180910390fd5b505050565b6000611aaf8473ffffffffffffffffffffffffffffffffffffffff16611eb1565b15611c18578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ad8611202565b8786866040518563ffffffff1660e01b8152600401611afa94939291906129b6565b602060405180830381600087803b158015611b1457600080fd5b505af1925050508015611b4557506040513d601f19601f82011682018060405250810190611b429190612511565b60015b611bc8573d8060008114611b75576040519150601f19603f3d011682016040523d82523d6000602084013e611b7a565b606091505b50600081511415611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb790612a9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611c1d565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060611c4782611196565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90612cdb565b60405180910390fd5b6000611c90611c25565b90506000815111611cb05760405180602001604052806000815250611cdb565b80611cba84611ec4565b604051602001611ccb929190612962565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90612c3b565b60405180910390fd5b611d5c81611196565b15611d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9390612adb565b60405180910390fd5b611da860008383611a2e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611df89190612e2b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415611f0c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061206c565b600082905060005b60008214611f3e578080611f2790612fff565b915050600a82611f379190612e81565b9150611f14565b60008167ffffffffffffffff811115611f80577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fb25781602001600182028036833780820191505090505b5090505b6000851461206557600182611fcb9190612eb2565b9150600a85611fda9190613048565b6030611fe69190612e2b565b60f81b818381518110612022577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561205e9190612e81565b9450611fb6565b8093505050505b919050565b82805461207d90612f9c565b90600052602060002090601f01602090048101928261209f57600085556120e6565b82601f106120b857805160ff19168380011785556120e6565b828001600101855582156120e6579182015b828111156120e55782518255916020019190600101906120ca565b5b5090506120f391906120f7565b5090565b5b808211156121105760008160009055506001016120f8565b5090565b600061212761212284612d7b565b612d56565b90508281526020810184848401111561213f57600080fd5b61214a848285612f5a565b509392505050565b600061216561216084612dac565b612d56565b90508281526020810184848401111561217d57600080fd5b612188848285612f5a565b509392505050565b60008135905061219f8161372c565b92915050565b6000813590506121b481613743565b92915050565b6000813590506121c98161375a565b92915050565b6000815190506121de8161375a565b92915050565b600082601f8301126121f557600080fd5b8135612205848260208601612114565b91505092915050565b60008083601f84011261222057600080fd5b8235905067ffffffffffffffff81111561223957600080fd5b60208301915083600182028301111561225157600080fd5b9250929050565b600082601f83011261226957600080fd5b8135612279848260208601612152565b91505092915050565b60008135905061229181613771565b92915050565b6000602082840312156122a957600080fd5b60006122b784828501612190565b91505092915050565b600080604083850312156122d357600080fd5b60006122e185828601612190565b92505060206122f285828601612190565b9150509250929050565b60008060006060848603121561231157600080fd5b600061231f86828701612190565b935050602061233086828701612190565b925050604061234186828701612282565b9150509250925092565b6000806000806080858703121561236157600080fd5b600061236f87828801612190565b945050602061238087828801612190565b935050604061239187828801612282565b925050606085013567ffffffffffffffff8111156123ae57600080fd5b6123ba878288016121e4565b91505092959194509250565b600080604083850312156123d957600080fd5b60006123e785828601612190565b92505060206123f8858286016121a5565b9150509250929050565b6000806040838503121561241557600080fd5b600061242385828601612190565b925050602061243485828601612282565b9150509250929050565b60008060008060008060a0878903121561245757600080fd5b600061246589828a01612190565b965050602061247689828a01612282565b955050604087013567ffffffffffffffff81111561249357600080fd5b61249f89828a01612258565b94505060606124b089828a01612190565b935050608087013567ffffffffffffffff8111156124cd57600080fd5b6124d989828a0161220e565b92509250509295509295509295565b6000602082840312156124fa57600080fd5b6000612508848285016121ba565b91505092915050565b60006020828403121561252357600080fd5b6000612531848285016121cf565b91505092915050565b60006020828403121561254c57600080fd5b600061255a84828501612282565b91505092915050565b61256c81612ee6565b82525050565b61257b81612ef8565b82525050565b600061258c82612ddd565b6125968185612df3565b93506125a6818560208601612f69565b6125af81613135565b840191505092915050565b60006125c68385612e0f565b93506125d3838584612f5a565b6125dc83613135565b840190509392505050565b60006125f282612de8565b6125fc8185612e0f565b935061260c818560208601612f69565b61261581613135565b840191505092915050565b600061262b82612de8565b6126358185612e20565b9350612645818560208601612f69565b80840191505092915050565b600061265e603283612e0f565b915061266982613146565b604082019050919050565b6000612681602683612e0f565b915061268c82613195565b604082019050919050565b60006126a4601c83612e0f565b91506126af826131e4565b602082019050919050565b60006126c7604783612e0f565b91506126d28261320d565b606082019050919050565b60006126ea602483612e0f565b91506126f582613282565b604082019050919050565b600061270d601983612e0f565b9150612718826132d1565b602082019050919050565b6000612730603a83612e0f565b915061273b826132fa565b604082019050919050565b6000612753601d83612e0f565b915061275e82613349565b602082019050919050565b6000612776602c83612e0f565b915061278182613372565b604082019050919050565b6000612799603883612e0f565b91506127a4826133c1565b604082019050919050565b60006127bc602a83612e0f565b91506127c782613410565b604082019050919050565b60006127df602983612e0f565b91506127ea8261345f565b604082019050919050565b6000612802602e83612e0f565b915061280d826134ae565b604082019050919050565b6000612825602083612e0f565b9150612830826134fd565b602082019050919050565b6000612848603183612e0f565b915061285382613526565b604082019050919050565b600061286b602c83612e0f565b915061287682613575565b604082019050919050565b600061288e602083612e0f565b9150612899826135c4565b602082019050919050565b60006128b1602983612e0f565b91506128bc826135ed565b604082019050919050565b60006128d4602f83612e0f565b91506128df8261363c565b604082019050919050565b60006128f7602183612e0f565b91506129028261368b565b604082019050919050565b600061291a600083612e04565b9150612925826136da565b600082019050919050565b600061293d603183612e0f565b9150612948826136dd565b604082019050919050565b61295c81612f50565b82525050565b600061296e8285612620565b915061297a8284612620565b91508190509392505050565b60006129918261290d565b9150819050919050565b60006020820190506129b06000830184612563565b92915050565b60006080820190506129cb6000830187612563565b6129d86020830186612563565b6129e56040830185612953565b81810360608301526129f78184612581565b905095945050505050565b600060a082019050612a176000830189612563565b612a246020830188612563565b612a316040830187612953565b612a3e6060830186612953565b8181036080830152612a518184866125ba565b9050979650505050505050565b6000602082019050612a736000830184612572565b92915050565b60006020820190508181036000830152612a9381846125e7565b905092915050565b60006020820190508181036000830152612ab481612651565b9050919050565b60006020820190508181036000830152612ad481612674565b9050919050565b60006020820190508181036000830152612af481612697565b9050919050565b60006020820190508181036000830152612b14816126ba565b9050919050565b60006020820190508181036000830152612b34816126dd565b9050919050565b60006020820190508181036000830152612b5481612700565b9050919050565b60006020820190508181036000830152612b7481612723565b9050919050565b60006020820190508181036000830152612b9481612746565b9050919050565b60006020820190508181036000830152612bb481612769565b9050919050565b60006020820190508181036000830152612bd48161278c565b9050919050565b60006020820190508181036000830152612bf4816127af565b9050919050565b60006020820190508181036000830152612c14816127d2565b9050919050565b60006020820190508181036000830152612c34816127f5565b9050919050565b60006020820190508181036000830152612c5481612818565b9050919050565b60006020820190508181036000830152612c748161283b565b9050919050565b60006020820190508181036000830152612c948161285e565b9050919050565b60006020820190508181036000830152612cb481612881565b9050919050565b60006020820190508181036000830152612cd4816128a4565b9050919050565b60006020820190508181036000830152612cf4816128c7565b9050919050565b60006020820190508181036000830152612d14816128ea565b9050919050565b60006020820190508181036000830152612d3481612930565b9050919050565b6000602082019050612d506000830184612953565b92915050565b6000612d60612d71565b9050612d6c8282612fce565b919050565b6000604051905090565b600067ffffffffffffffff821115612d9657612d95613106565b5b612d9f82613135565b9050602081019050919050565b600067ffffffffffffffff821115612dc757612dc6613106565b5b612dd082613135565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612e3682612f50565b9150612e4183612f50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e7657612e75613079565b5b828201905092915050565b6000612e8c82612f50565b9150612e9783612f50565b925082612ea757612ea66130a8565b5b828204905092915050565b6000612ebd82612f50565b9150612ec883612f50565b925082821015612edb57612eda613079565b5b828203905092915050565b6000612ef182612f30565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f87578082015181840152602081019050612f6c565b83811115612f96576000848401525b50505050565b60006002820490506001821680612fb457607f821691505b60208210811415612fc857612fc76130d7565b5b50919050565b612fd782613135565b810181811067ffffffffffffffff82111715612ff657612ff5613106565b5b80604052505050565b600061300a82612f50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561303d5761303c613079565b5b600182019050919050565b600061305382612f50565b915061305e83612f50565b92508261306e5761306d6130a8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f63616c6c7320746f206d616b655265706c696361206d7573742068617665206160008201527f206d73672e76616c7565206f66206174206c65617374206d616b655265706c6960208201527f6361507269636500000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61373581612ee6565b811461374057600080fd5b50565b61374c81612ef8565b811461375757600080fd5b50565b61376381612f04565b811461376e57600080fd5b50565b61377a81612f50565b811461378557600080fd5b5056fea26469706673582212200bff747392440cb984211c1257a04736087198b4120f0102ff233303b863cf4d64736f6c63430008040033

Deployed Bytecode Sourcemap

42701:3198:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23569:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24738:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26431:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25954:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43537:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27490:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42908:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27937:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24345:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23988:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2613:94;;;;;;;;;;;;;:::i;:::-;;43803:122;;;;;;;;;;;;;:::i;:::-;;1962:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44223:1673;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24907:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26811:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28193:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43966:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27209:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2862:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23569:355;23716:4;23773:25;23758:40;;;:11;:40;;;;:105;;;;23830:33;23815:48;;;:11;:48;;;;23758:105;:158;;;;23880:36;23904:11;23880:23;:36::i;:::-;23758:158;23738:178;;23569:355;;;:::o;24738:100::-;24792:13;24825:5;24818:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24738:100;:::o;26431:308::-;26552:7;26599:16;26607:7;26599;:16::i;:::-;26577:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26707:15;:24;26723:7;26707:24;;;;;;;;;;;;;;;;;;;;;26700:31;;26431:308;;;:::o;25954:411::-;26035:13;26051:23;26066:7;26051:14;:23::i;:::-;26035:39;;26099:5;26093:11;;:2;:11;;;;26085:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26193:5;26177:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26202:37;26219:5;26226:12;:10;:12::i;:::-;26202:16;:37::i;:::-;26177:62;26155:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26336:21;26345:2;26349:7;26336:8;:21::i;:::-;25954:411;;;:::o;43537:192::-;2193:12;:10;:12::i;:::-;2182:23;;:7;:5;:7::i;:::-;:23;;;2174:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43642:19:::1;43623:16;:38;;;;43677:44;43701:19;43677:44;;;;;;:::i;:::-;;;;;;;;43537:192:::0;:::o;27490:376::-;27699:41;27718:12;:10;:12::i;:::-;27732:7;27699:18;:41::i;:::-;27677:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;27830:28;27840:4;27846:2;27850:7;27830:9;:28::i;:::-;27490:376;;;:::o;42908:31::-;;;;:::o;27937:185::-;28075:39;28092:4;28098:2;28102:7;28075:39;;;;;;;;;;;;:16;:39::i;:::-;27937:185;;;:::o;24345:326::-;24462:7;24487:13;24503:7;:16;24511:7;24503:16;;;;;;;;;;;;;;;;;;;;;24487:32;;24569:1;24552:19;;:5;:19;;;;24530:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24658:5;24651:12;;;24345:326;;;:::o;23988:295::-;24105:7;24169:1;24152:19;;:5;:19;;;;24130:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24259:9;:16;24269:5;24259:16;;;;;;;;;;;;;;;;24252:23;;23988:295;;;:::o;2613:94::-;2193:12;:10;:12::i;:::-;2182:23;;:7;:5;:7::i;:::-;:23;;;2174:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2678:21:::1;2696:1;2678:9;:21::i;:::-;2613:94::o:0;43803:122::-;2193:12;:10;:12::i;:::-;2182:23;;:7;:5;:7::i;:::-;:23;;;2174:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43855:62:::1;43885:7;:5;:7::i;:::-;43895:21;43855;:62::i;:::-;43803:122::o:0;1962:87::-;2008:7;2035:6;;;;;;;;;;;2028:13;;1962:87;:::o;44223:1673::-;44466:7;44521:16;;44508:9;:29;;44486:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;44705:27;:15;:25;:27::i;:::-;44743:22;44768:25;:15;:23;:25::i;:::-;44743:50;;44804:37;44814:10;44826:14;44804:9;:37::i;:::-;44852:45;44865:14;44881:15;44852:12;:45::i;:::-;45080:41;45103:17;45080:22;:41::i;:::-;45079:42;:90;;;;;45167:1;45138:31;;:17;:31;;;;45079:90;45061:564;;;45196:33;45244:1;45232:9;:13;;;;:::i;:::-;45196:49;;45260:20;45295:25;45283:9;:37;;;;:::i;:::-;45260:60;;45337:53;45367:7;:5;:7::i;:::-;45377:12;45337:21;:53::i;:::-;45405:125;45453:17;45490:25;45405:21;:125::i;:::-;45061:564;;;;;45563:50;45593:7;:5;:7::i;:::-;45603:9;45563:21;:50::i;:::-;45061:564;45680:174;45709:10;45734:20;45769:15;45799:14;45828:15;;45680:174;;;;;;;;;;;:::i;:::-;;;;;;;;45874:14;45867:21;;;44223:1673;;;;;;;;:::o;24907:104::-;24963:13;24996:7;24989:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24907:104;:::o;26811:327::-;26958:12;:10;:12::i;:::-;26946:24;;:8;:24;;;;26938:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27058:8;27013:18;:32;27032:12;:10;:12::i;:::-;27013:32;;;;;;;;;;;;;;;:42;27046:8;27013:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27111:8;27082:48;;27097:12;:10;:12::i;:::-;27082:48;;;27121:8;27082:48;;;;;;:::i;:::-;;;;;;;;26811:327;;:::o;28193:365::-;28382:41;28401:12;:10;:12::i;:::-;28415:7;28382:18;:41::i;:::-;28360:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;28511:39;28525:4;28531:2;28535:7;28544:5;28511:13;:39::i;:::-;28193:365;;;;:::o;43966:188::-;44085:13;44123:23;44138:7;44123:14;:23::i;:::-;44116:30;;43966:188;;;:::o;27209:214::-;27351:4;27380:18;:25;27399:5;27380:25;;;;;;;;;;;;;;;:35;27406:8;27380:35;;;;;;;;;;;;;;;;;;;;;;;;;27373:42;;27209:214;;;;:::o;2862:229::-;2193:12;:10;:12::i;:::-;2182:23;;:7;:5;:7::i;:::-;:23;;;2174:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2985:1:::1;2965:22;;:8;:22;;;;2943:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3064:19;3074:8;3064:9;:19::i;:::-;2862:229:::0;:::o;22035:207::-;22165:4;22209:25;22194:40;;;:11;:40;;;;22187:47;;22035:207;;;:::o;30105:127::-;30170:4;30222:1;30194:30;;:7;:16;30202:7;30194:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30187:37;;30105:127;;;:::o;725:98::-;778:7;805:10;798:17;;725:98;:::o;34228:174::-;34330:2;34303:15;:24;34319:7;34303:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34386:7;34382:2;34348:46;;34357:23;34372:7;34357:14;:23::i;:::-;34348:46;;;;;;;;;;;;34228:174;;:::o;30399:452::-;30528:4;30572:16;30580:7;30572;:16::i;:::-;30550:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30671:13;30687:23;30702:7;30687:14;:23::i;:::-;30671:39;;30740:5;30729:16;;:7;:16;;;:64;;;;30786:7;30762:31;;:20;30774:7;30762:11;:20::i;:::-;:31;;;30729:64;:113;;;;30810:32;30827:5;30834:7;30810:16;:32::i;:::-;30729:113;30721:122;;;30399:452;;;;:::o;33495:615::-;33668:4;33641:31;;:23;33656:7;33641:14;:23::i;:::-;:31;;;33619:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;33774:1;33760:16;;:2;:16;;;;33752:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33830:39;33851:4;33857:2;33861:7;33830:20;:39::i;:::-;33934:29;33951:1;33955:7;33934:8;:29::i;:::-;33995:1;33976:9;:15;33986:4;33976:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34024:1;34007:9;:13;34017:2;34007:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34055:2;34036:7;:16;34044:7;34036:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34094:7;34090:2;34075:27;;34084:4;34075:27;;;;;;;;;;;;33495:615;;;:::o;3099:173::-;3155:16;3174:6;;;;;;;;;;;3155:25;;3200:8;3191:6;;:17;;;;;;;;;;;;;;;;;;3255:8;3224:40;;3245:8;3224:40;;;;;;;;;;;;3099:173;;:::o;42240:391::-;42369:6;42344:21;:31;;42322:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;42446:12;42464:9;:14;;42486:6;42464:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42445:52;;;42530:7;42508:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;42240:391;;;:::o;39668:127::-;39775:1;39757:7;:14;;;:19;;;;;;;;;;;39668:127;:::o;39546:114::-;39611:7;39638;:14;;;39631:21;;39546:114;;;:::o;31193:110::-;31269:26;31279:2;31283:7;31269:26;;;;;;;;;;;;:9;:26::i;:::-;31193:110;;:::o;38008:277::-;38145:16;38153:7;38145;:16::i;:::-;38123:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;38268:9;38246:10;:19;38257:7;38246:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;38008:277;;:::o;40918:387::-;40978:4;41186:12;41253:7;41241:20;41233:28;;41296:1;41289:4;:8;41282:15;;;40918:387;;;:::o;29440:352::-;29597:28;29607:4;29613:2;29617:7;29597:9;:28::i;:::-;29658:48;29681:4;29687:2;29691:7;29700:5;29658:22;:48::i;:::-;29636:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;29440:352;;;;:::o;37086:766::-;37204:13;37257:16;37265:7;37257;:16::i;:::-;37235:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;37363:23;37389:10;:19;37400:7;37389:19;;;;;;;;;;;37363:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37419:18;37440:10;:8;:10::i;:::-;37419:31;;37548:1;37532:4;37526:18;:23;37522:72;;;37573:9;37566:16;;;;;;37522:72;37724:1;37704:9;37698:23;:27;37694:108;;;37773:4;37779:9;37756:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37742:48;;;;;;37694:108;37821:23;37836:7;37821:14;:23::i;:::-;37814:30;;;;37086:766;;;;:::o;36523:126::-;;;;:::o;31530:321::-;31660:18;31666:2;31670:7;31660:5;:18::i;:::-;31711:54;31742:1;31746:2;31750:7;31759:5;31711:22;:54::i;:::-;31689:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31530:321;;;:::o;34967:984::-;35122:4;35143:15;:2;:13;;;:15::i;:::-;35139:805;;;35212:2;35196:36;;;35255:12;:10;:12::i;:::-;35290:4;35317:7;35347:5;35196:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35175:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35575:1;35558:6;:13;:18;35554:320;;;35601:108;;;;;;;;;;:::i;:::-;;;;;;;;35554:320;35824:6;35818:13;35809:6;35805:2;35801:15;35794:38;35175:714;35445:45;;;35435:55;;;:6;:55;;;;35428:62;;;;;35139:805;35928:4;35921:11;;34967:984;;;;;;;:::o;25798:94::-;25849:13;25875:9;;;;;;;;;;;;;;25798:94;:::o;25082:468::-;25200:13;25253:16;25261:7;25253;:16::i;:::-;25231:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;25357:21;25381:10;:8;:10::i;:::-;25357:34;;25446:1;25428:7;25422:21;:25;:120;;;;;;;;;;;;;;;;;25491:7;25500:18;:7;:16;:18::i;:::-;25474:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25422:120;25402:140;;;25082:468;;;:::o;32187:382::-;32281:1;32267:16;;:2;:16;;;;32259:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32340:16;32348:7;32340;:16::i;:::-;32339:17;32331:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32402:45;32431:1;32435:2;32439:7;32402:20;:45::i;:::-;32477:1;32460:9;:13;32470:2;32460:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32508:2;32489:7;:16;32497:7;32489:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32553:7;32549:2;32528:33;;32545:1;32528:33;;;;;;;;;;;;32187:382;;:::o;11552:387::-;11612:4;11820:12;11887:7;11875:20;11867:28;;11930:1;11923:4;:8;11916:15;;;11552:387;;;:::o;19446:723::-;19502:13;19732:1;19723:5;:10;19719:53;;;19750:10;;;;;;;;;;;;;;;;;;;;;19719:53;19782:12;19797:5;19782:20;;19813:14;19838:78;19853:1;19845:4;:9;19838:78;;19871:8;;;;;:::i;:::-;;;;19902:2;19894:10;;;;;:::i;:::-;;;19838:78;;;19926:19;19958:6;19948:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19926:39;;19976:154;19992:1;19983:5;:10;19976:154;;20020:1;20010:11;;;;;:::i;:::-;;;20087:2;20079:5;:10;;;;:::i;:::-;20066:2;:24;;;;:::i;:::-;20053:39;;20036:6;20043;20036:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;20116:2;20107:11;;;;;:::i;:::-;;;19976:154;;;20154:6;20140:21;;;;;19446:723;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:352::-;1643:8;1653:6;1703:3;1696:4;1688:6;1684:17;1680:27;1670:2;;1721:1;1718;1711:12;1670:2;1757:6;1744:20;1734:30;;1787:18;1779:6;1776:30;1773:2;;;1819:1;1816;1809:12;1773:2;1856:4;1848:6;1844:17;1832:29;;1910:3;1902:4;1894:6;1890:17;1880:8;1876:32;1873:41;1870:2;;;1927:1;1924;1917:12;1870:2;1660:277;;;;;:::o;1957:273::-;2013:5;2062:3;2055:4;2047:6;2043:17;2039:27;2029:2;;2080:1;2077;2070:12;2029:2;2120:6;2107:20;2145:79;2220:3;2212:6;2205:4;2197:6;2193:17;2145:79;:::i;:::-;2136:88;;2019:211;;;;;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2288:87;;;;:::o;2381:262::-;2440:6;2489:2;2477:9;2468:7;2464:23;2460:32;2457:2;;;2505:1;2502;2495:12;2457:2;2548:1;2573:53;2618:7;2609:6;2598:9;2594:22;2573:53;:::i;:::-;2563:63;;2519:117;2447:196;;;;:::o;2649:407::-;2717:6;2725;2774:2;2762:9;2753:7;2749:23;2745:32;2742:2;;;2790:1;2787;2780:12;2742:2;2833:1;2858:53;2903:7;2894:6;2883:9;2879:22;2858:53;:::i;:::-;2848:63;;2804:117;2960:2;2986:53;3031:7;3022:6;3011:9;3007:22;2986:53;:::i;:::-;2976:63;;2931:118;2732:324;;;;;:::o;3062:552::-;3139:6;3147;3155;3204:2;3192:9;3183:7;3179:23;3175:32;3172:2;;;3220:1;3217;3210:12;3172:2;3263:1;3288:53;3333:7;3324:6;3313:9;3309:22;3288:53;:::i;:::-;3278:63;;3234:117;3390:2;3416:53;3461:7;3452:6;3441:9;3437:22;3416:53;:::i;:::-;3406:63;;3361:118;3518:2;3544:53;3589:7;3580:6;3569:9;3565:22;3544:53;:::i;:::-;3534:63;;3489:118;3162:452;;;;;:::o;3620:809::-;3715:6;3723;3731;3739;3788:3;3776:9;3767:7;3763:23;3759:33;3756:2;;;3805:1;3802;3795:12;3756:2;3848:1;3873:53;3918:7;3909:6;3898:9;3894:22;3873:53;:::i;:::-;3863:63;;3819:117;3975:2;4001:53;4046:7;4037:6;4026:9;4022:22;4001:53;:::i;:::-;3991:63;;3946:118;4103:2;4129:53;4174:7;4165:6;4154:9;4150:22;4129:53;:::i;:::-;4119:63;;4074:118;4259:2;4248:9;4244:18;4231:32;4290:18;4282:6;4279:30;4276:2;;;4322:1;4319;4312:12;4276:2;4350:62;4404:7;4395:6;4384:9;4380:22;4350:62;:::i;:::-;4340:72;;4202:220;3746:683;;;;;;;:::o;4435:401::-;4500:6;4508;4557:2;4545:9;4536:7;4532:23;4528:32;4525:2;;;4573:1;4570;4563:12;4525:2;4616:1;4641:53;4686:7;4677:6;4666:9;4662:22;4641:53;:::i;:::-;4631:63;;4587:117;4743:2;4769:50;4811:7;4802:6;4791:9;4787:22;4769:50;:::i;:::-;4759:60;;4714:115;4515:321;;;;;:::o;4842:407::-;4910:6;4918;4967:2;4955:9;4946:7;4942:23;4938:32;4935:2;;;4983:1;4980;4973:12;4935:2;5026:1;5051:53;5096:7;5087:6;5076:9;5072:22;5051:53;:::i;:::-;5041:63;;4997:117;5153:2;5179:53;5224:7;5215:6;5204:9;5200:22;5179:53;:::i;:::-;5169:63;;5124:118;4925:324;;;;;:::o;5255:1090::-;5372:6;5380;5388;5396;5404;5412;5461:3;5449:9;5440:7;5436:23;5432:33;5429:2;;;5478:1;5475;5468:12;5429:2;5521:1;5546:53;5591:7;5582:6;5571:9;5567:22;5546:53;:::i;:::-;5536:63;;5492:117;5648:2;5674:53;5719:7;5710:6;5699:9;5695:22;5674:53;:::i;:::-;5664:63;;5619:118;5804:2;5793:9;5789:18;5776:32;5835:18;5827:6;5824:30;5821:2;;;5867:1;5864;5857:12;5821:2;5895:63;5950:7;5941:6;5930:9;5926:22;5895:63;:::i;:::-;5885:73;;5747:221;6007:2;6033:53;6078:7;6069:6;6058:9;6054:22;6033:53;:::i;:::-;6023:63;;5978:118;6163:3;6152:9;6148:19;6135:33;6195:18;6187:6;6184:30;6181:2;;;6227:1;6224;6217:12;6181:2;6263:65;6320:7;6311:6;6300:9;6296:22;6263:65;:::i;:::-;6245:83;;;;6106:232;5419:926;;;;;;;;:::o;6351:260::-;6409:6;6458:2;6446:9;6437:7;6433:23;6429:32;6426:2;;;6474:1;6471;6464:12;6426:2;6517:1;6542:52;6586:7;6577:6;6566:9;6562:22;6542:52;:::i;:::-;6532:62;;6488:116;6416:195;;;;:::o;6617:282::-;6686:6;6735:2;6723:9;6714:7;6710:23;6706:32;6703:2;;;6751:1;6748;6741:12;6703:2;6794:1;6819:63;6874:7;6865:6;6854:9;6850:22;6819:63;:::i;:::-;6809:73;;6765:127;6693:206;;;;:::o;6905:262::-;6964:6;7013:2;7001:9;6992:7;6988:23;6984:32;6981:2;;;7029:1;7026;7019:12;6981:2;7072:1;7097:53;7142:7;7133:6;7122:9;7118:22;7097:53;:::i;:::-;7087:63;;7043:117;6971:196;;;;:::o;7173:118::-;7260:24;7278:5;7260:24;:::i;:::-;7255:3;7248:37;7238:53;;:::o;7297:109::-;7378:21;7393:5;7378:21;:::i;:::-;7373:3;7366:34;7356:50;;:::o;7412:360::-;7498:3;7526:38;7558:5;7526:38;:::i;:::-;7580:70;7643:6;7638:3;7580:70;:::i;:::-;7573:77;;7659:52;7704:6;7699:3;7692:4;7685:5;7681:16;7659:52;:::i;:::-;7736:29;7758:6;7736:29;:::i;:::-;7731:3;7727:39;7720:46;;7502:270;;;;;:::o;7802:304::-;7900:3;7921:71;7985:6;7980:3;7921:71;:::i;:::-;7914:78;;8002:43;8038:6;8033:3;8026:5;8002:43;:::i;:::-;8070:29;8092:6;8070:29;:::i;:::-;8065:3;8061:39;8054:46;;7904:202;;;;;:::o;8112:364::-;8200:3;8228:39;8261:5;8228:39;:::i;:::-;8283:71;8347:6;8342:3;8283:71;:::i;:::-;8276:78;;8363:52;8408:6;8403:3;8396:4;8389:5;8385:16;8363:52;:::i;:::-;8440:29;8462:6;8440:29;:::i;:::-;8435:3;8431:39;8424:46;;8204:272;;;;;:::o;8482:377::-;8588:3;8616:39;8649:5;8616:39;:::i;:::-;8671:89;8753:6;8748:3;8671:89;:::i;:::-;8664:96;;8769:52;8814:6;8809:3;8802:4;8795:5;8791:16;8769:52;:::i;:::-;8846:6;8841:3;8837:16;8830:23;;8592:267;;;;;:::o;8865:366::-;9007:3;9028:67;9092:2;9087:3;9028:67;:::i;:::-;9021:74;;9104:93;9193:3;9104:93;:::i;:::-;9222:2;9217:3;9213:12;9206:19;;9011:220;;;:::o;9237:366::-;9379:3;9400:67;9464:2;9459:3;9400:67;:::i;:::-;9393:74;;9476:93;9565:3;9476:93;:::i;:::-;9594:2;9589:3;9585:12;9578:19;;9383:220;;;:::o;9609:366::-;9751:3;9772:67;9836:2;9831:3;9772:67;:::i;:::-;9765:74;;9848:93;9937:3;9848:93;:::i;:::-;9966:2;9961:3;9957:12;9950:19;;9755:220;;;:::o;9981:366::-;10123:3;10144:67;10208:2;10203:3;10144:67;:::i;:::-;10137:74;;10220:93;10309:3;10220:93;:::i;:::-;10338:2;10333:3;10329:12;10322:19;;10127:220;;;:::o;10353:366::-;10495:3;10516:67;10580:2;10575:3;10516:67;:::i;:::-;10509:74;;10592:93;10681:3;10592:93;:::i;:::-;10710:2;10705:3;10701:12;10694:19;;10499:220;;;:::o;10725:366::-;10867:3;10888:67;10952:2;10947:3;10888:67;:::i;:::-;10881:74;;10964:93;11053:3;10964:93;:::i;:::-;11082:2;11077:3;11073:12;11066:19;;10871:220;;;:::o;11097:366::-;11239:3;11260:67;11324:2;11319:3;11260:67;:::i;:::-;11253:74;;11336:93;11425:3;11336:93;:::i;:::-;11454:2;11449:3;11445:12;11438:19;;11243:220;;;:::o;11469:366::-;11611:3;11632:67;11696:2;11691:3;11632:67;:::i;:::-;11625:74;;11708:93;11797:3;11708:93;:::i;:::-;11826:2;11821:3;11817:12;11810:19;;11615:220;;;:::o;11841:366::-;11983:3;12004:67;12068:2;12063:3;12004:67;:::i;:::-;11997:74;;12080:93;12169:3;12080:93;:::i;:::-;12198:2;12193:3;12189:12;12182:19;;11987:220;;;:::o;12213:366::-;12355:3;12376:67;12440:2;12435:3;12376:67;:::i;:::-;12369:74;;12452:93;12541:3;12452:93;:::i;:::-;12570:2;12565:3;12561:12;12554:19;;12359:220;;;:::o;12585:366::-;12727:3;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12731:220;;;:::o;12957:366::-;13099:3;13120:67;13184:2;13179:3;13120:67;:::i;:::-;13113:74;;13196:93;13285:3;13196:93;:::i;:::-;13314:2;13309:3;13305:12;13298:19;;13103:220;;;:::o;13329:366::-;13471:3;13492:67;13556:2;13551:3;13492:67;:::i;:::-;13485:74;;13568:93;13657:3;13568:93;:::i;:::-;13686:2;13681:3;13677:12;13670:19;;13475:220;;;:::o;13701:366::-;13843:3;13864:67;13928:2;13923:3;13864:67;:::i;:::-;13857:74;;13940:93;14029:3;13940:93;:::i;:::-;14058:2;14053:3;14049:12;14042:19;;13847:220;;;:::o;14073:366::-;14215:3;14236:67;14300:2;14295:3;14236:67;:::i;:::-;14229:74;;14312:93;14401:3;14312:93;:::i;:::-;14430:2;14425:3;14421:12;14414:19;;14219:220;;;:::o;14445:366::-;14587:3;14608:67;14672:2;14667:3;14608:67;:::i;:::-;14601:74;;14684:93;14773:3;14684:93;:::i;:::-;14802:2;14797:3;14793:12;14786:19;;14591:220;;;:::o;14817:366::-;14959:3;14980:67;15044:2;15039:3;14980:67;:::i;:::-;14973:74;;15056:93;15145:3;15056:93;:::i;:::-;15174:2;15169:3;15165:12;15158:19;;14963:220;;;:::o;15189:366::-;15331:3;15352:67;15416:2;15411:3;15352:67;:::i;:::-;15345:74;;15428:93;15517:3;15428:93;:::i;:::-;15546:2;15541:3;15537:12;15530:19;;15335:220;;;:::o;15561:366::-;15703:3;15724:67;15788:2;15783:3;15724:67;:::i;:::-;15717:74;;15800:93;15889:3;15800:93;:::i;:::-;15918:2;15913:3;15909:12;15902:19;;15707:220;;;:::o;15933:366::-;16075:3;16096:67;16160:2;16155:3;16096:67;:::i;:::-;16089:74;;16172:93;16261:3;16172:93;:::i;:::-;16290:2;16285:3;16281:12;16274:19;;16079:220;;;:::o;16305:398::-;16464:3;16485:83;16566:1;16561:3;16485:83;:::i;:::-;16478:90;;16577:93;16666:3;16577:93;:::i;:::-;16695:1;16690:3;16686:11;16679:18;;16468:235;;;:::o;16709:366::-;16851:3;16872:67;16936:2;16931:3;16872:67;:::i;:::-;16865:74;;16948:93;17037:3;16948:93;:::i;:::-;17066:2;17061:3;17057:12;17050:19;;16855:220;;;:::o;17081:118::-;17168:24;17186:5;17168:24;:::i;:::-;17163:3;17156:37;17146:53;;:::o;17205:435::-;17385:3;17407:95;17498:3;17489:6;17407:95;:::i;:::-;17400:102;;17519:95;17610:3;17601:6;17519:95;:::i;:::-;17512:102;;17631:3;17624:10;;17389:251;;;;;:::o;17646:379::-;17830:3;17852:147;17995:3;17852:147;:::i;:::-;17845:154;;18016:3;18009:10;;17834:191;;;:::o;18031:222::-;18124:4;18162:2;18151:9;18147:18;18139:26;;18175:71;18243:1;18232:9;18228:17;18219:6;18175:71;:::i;:::-;18129:124;;;;:::o;18259:640::-;18454:4;18492:3;18481:9;18477:19;18469:27;;18506:71;18574:1;18563:9;18559:17;18550:6;18506:71;:::i;:::-;18587:72;18655:2;18644:9;18640:18;18631:6;18587:72;:::i;:::-;18669;18737:2;18726:9;18722:18;18713:6;18669:72;:::i;:::-;18788:9;18782:4;18778:20;18773:2;18762:9;18758:18;18751:48;18816:76;18887:4;18878:6;18816:76;:::i;:::-;18808:84;;18459:440;;;;;;;:::o;18905:775::-;19140:4;19178:3;19167:9;19163:19;19155:27;;19192:71;19260:1;19249:9;19245:17;19236:6;19192:71;:::i;:::-;19273:72;19341:2;19330:9;19326:18;19317:6;19273:72;:::i;:::-;19355;19423:2;19412:9;19408:18;19399:6;19355:72;:::i;:::-;19437;19505:2;19494:9;19490:18;19481:6;19437:72;:::i;:::-;19557:9;19551:4;19547:20;19541:3;19530:9;19526:19;19519:49;19585:88;19668:4;19659:6;19651;19585:88;:::i;:::-;19577:96;;19145:535;;;;;;;;;:::o;19686:210::-;19773:4;19811:2;19800:9;19796:18;19788:26;;19824:65;19886:1;19875:9;19871:17;19862:6;19824:65;:::i;:::-;19778:118;;;;:::o;19902:313::-;20015:4;20053:2;20042:9;20038:18;20030:26;;20102:9;20096:4;20092:20;20088:1;20077:9;20073:17;20066:47;20130:78;20203:4;20194:6;20130:78;:::i;:::-;20122:86;;20020:195;;;;:::o;20221:419::-;20387:4;20425:2;20414:9;20410:18;20402:26;;20474:9;20468:4;20464:20;20460:1;20449:9;20445:17;20438:47;20502:131;20628:4;20502:131;:::i;:::-;20494:139;;20392:248;;;:::o;20646:419::-;20812:4;20850:2;20839:9;20835:18;20827:26;;20899:9;20893:4;20889:20;20885:1;20874:9;20870:17;20863:47;20927:131;21053:4;20927:131;:::i;:::-;20919:139;;20817:248;;;:::o;21071:419::-;21237:4;21275:2;21264:9;21260:18;21252:26;;21324:9;21318:4;21314:20;21310:1;21299:9;21295:17;21288:47;21352:131;21478:4;21352:131;:::i;:::-;21344:139;;21242:248;;;:::o;21496:419::-;21662:4;21700:2;21689:9;21685:18;21677:26;;21749:9;21743:4;21739:20;21735:1;21724:9;21720:17;21713:47;21777:131;21903:4;21777:131;:::i;:::-;21769:139;;21667:248;;;:::o;21921:419::-;22087:4;22125:2;22114:9;22110:18;22102:26;;22174:9;22168:4;22164:20;22160:1;22149:9;22145:17;22138:47;22202:131;22328:4;22202:131;:::i;:::-;22194:139;;22092:248;;;:::o;22346:419::-;22512:4;22550:2;22539:9;22535:18;22527:26;;22599:9;22593:4;22589:20;22585:1;22574:9;22570:17;22563:47;22627:131;22753:4;22627:131;:::i;:::-;22619:139;;22517:248;;;:::o;22771:419::-;22937:4;22975:2;22964:9;22960:18;22952:26;;23024:9;23018:4;23014:20;23010:1;22999:9;22995:17;22988:47;23052:131;23178:4;23052:131;:::i;:::-;23044:139;;22942:248;;;:::o;23196:419::-;23362:4;23400:2;23389:9;23385:18;23377:26;;23449:9;23443:4;23439:20;23435:1;23424:9;23420:17;23413:47;23477:131;23603:4;23477:131;:::i;:::-;23469:139;;23367:248;;;:::o;23621:419::-;23787:4;23825:2;23814:9;23810:18;23802:26;;23874:9;23868:4;23864:20;23860:1;23849:9;23845:17;23838:47;23902:131;24028:4;23902:131;:::i;:::-;23894:139;;23792:248;;;:::o;24046:419::-;24212:4;24250:2;24239:9;24235:18;24227:26;;24299:9;24293:4;24289:20;24285:1;24274:9;24270:17;24263:47;24327:131;24453:4;24327:131;:::i;:::-;24319:139;;24217:248;;;:::o;24471:419::-;24637:4;24675:2;24664:9;24660:18;24652:26;;24724:9;24718:4;24714:20;24710:1;24699:9;24695:17;24688:47;24752:131;24878:4;24752:131;:::i;:::-;24744:139;;24642:248;;;:::o;24896:419::-;25062:4;25100:2;25089:9;25085:18;25077:26;;25149:9;25143:4;25139:20;25135:1;25124:9;25120:17;25113:47;25177:131;25303:4;25177:131;:::i;:::-;25169:139;;25067:248;;;:::o;25321:419::-;25487:4;25525:2;25514:9;25510:18;25502:26;;25574:9;25568:4;25564:20;25560:1;25549:9;25545:17;25538:47;25602:131;25728:4;25602:131;:::i;:::-;25594:139;;25492:248;;;:::o;25746:419::-;25912:4;25950:2;25939:9;25935:18;25927:26;;25999:9;25993:4;25989:20;25985:1;25974:9;25970:17;25963:47;26027:131;26153:4;26027:131;:::i;:::-;26019:139;;25917:248;;;:::o;26171:419::-;26337:4;26375:2;26364:9;26360:18;26352:26;;26424:9;26418:4;26414:20;26410:1;26399:9;26395:17;26388:47;26452:131;26578:4;26452:131;:::i;:::-;26444:139;;26342:248;;;:::o;26596:419::-;26762:4;26800:2;26789:9;26785:18;26777:26;;26849:9;26843:4;26839:20;26835:1;26824:9;26820:17;26813:47;26877:131;27003:4;26877:131;:::i;:::-;26869:139;;26767:248;;;:::o;27021:419::-;27187:4;27225:2;27214:9;27210:18;27202:26;;27274:9;27268:4;27264:20;27260:1;27249:9;27245:17;27238:47;27302:131;27428:4;27302:131;:::i;:::-;27294:139;;27192:248;;;:::o;27446:419::-;27612:4;27650:2;27639:9;27635:18;27627:26;;27699:9;27693:4;27689:20;27685:1;27674:9;27670:17;27663:47;27727:131;27853:4;27727:131;:::i;:::-;27719:139;;27617:248;;;:::o;27871:419::-;28037:4;28075:2;28064:9;28060:18;28052:26;;28124:9;28118:4;28114:20;28110:1;28099:9;28095:17;28088:47;28152:131;28278:4;28152:131;:::i;:::-;28144:139;;28042:248;;;:::o;28296:419::-;28462:4;28500:2;28489:9;28485:18;28477:26;;28549:9;28543:4;28539:20;28535:1;28524:9;28520:17;28513:47;28577:131;28703:4;28577:131;:::i;:::-;28569:139;;28467:248;;;:::o;28721:419::-;28887:4;28925:2;28914:9;28910:18;28902:26;;28974:9;28968:4;28964:20;28960:1;28949:9;28945:17;28938:47;29002:131;29128:4;29002:131;:::i;:::-;28994:139;;28892:248;;;:::o;29146:222::-;29239:4;29277:2;29266:9;29262:18;29254:26;;29290:71;29358:1;29347:9;29343:17;29334:6;29290:71;:::i;:::-;29244:124;;;;:::o;29374:129::-;29408:6;29435:20;;:::i;:::-;29425:30;;29464:33;29492:4;29484:6;29464:33;:::i;:::-;29415:88;;;:::o;29509:75::-;29542:6;29575:2;29569:9;29559:19;;29549:35;:::o;29590:307::-;29651:4;29741:18;29733:6;29730:30;29727:2;;;29763:18;;:::i;:::-;29727:2;29801:29;29823:6;29801:29;:::i;:::-;29793:37;;29885:4;29879;29875:15;29867:23;;29656:241;;;:::o;29903:308::-;29965:4;30055:18;30047:6;30044:30;30041:2;;;30077:18;;:::i;:::-;30041:2;30115:29;30137:6;30115:29;:::i;:::-;30107:37;;30199:4;30193;30189:15;30181:23;;29970:241;;;:::o;30217:98::-;30268:6;30302:5;30296:12;30286:22;;30275:40;;;:::o;30321:99::-;30373:6;30407:5;30401:12;30391:22;;30380:40;;;:::o;30426:168::-;30509:11;30543:6;30538:3;30531:19;30583:4;30578:3;30574:14;30559:29;;30521:73;;;;:::o;30600:147::-;30701:11;30738:3;30723:18;;30713:34;;;;:::o;30753:169::-;30837:11;30871:6;30866:3;30859:19;30911:4;30906:3;30902:14;30887:29;;30849:73;;;;:::o;30928:148::-;31030:11;31067:3;31052:18;;31042:34;;;;:::o;31082:305::-;31122:3;31141:20;31159:1;31141:20;:::i;:::-;31136:25;;31175:20;31193:1;31175:20;:::i;:::-;31170:25;;31329:1;31261:66;31257:74;31254:1;31251:81;31248:2;;;31335:18;;:::i;:::-;31248:2;31379:1;31376;31372:9;31365:16;;31126:261;;;;:::o;31393:185::-;31433:1;31450:20;31468:1;31450:20;:::i;:::-;31445:25;;31484:20;31502:1;31484:20;:::i;:::-;31479:25;;31523:1;31513:2;;31528:18;;:::i;:::-;31513:2;31570:1;31567;31563:9;31558:14;;31435:143;;;;:::o;31584:191::-;31624:4;31644:20;31662:1;31644:20;:::i;:::-;31639:25;;31678:20;31696:1;31678:20;:::i;:::-;31673:25;;31717:1;31714;31711:8;31708:2;;;31722:18;;:::i;:::-;31708:2;31767:1;31764;31760:9;31752:17;;31629:146;;;;:::o;31781:96::-;31818:7;31847:24;31865:5;31847:24;:::i;:::-;31836:35;;31826:51;;;:::o;31883:90::-;31917:7;31960:5;31953:13;31946:21;31935:32;;31925:48;;;:::o;31979:149::-;32015:7;32055:66;32048:5;32044:78;32033:89;;32023:105;;;:::o;32134:126::-;32171:7;32211:42;32204:5;32200:54;32189:65;;32179:81;;;:::o;32266:77::-;32303:7;32332:5;32321:16;;32311:32;;;:::o;32349:154::-;32433:6;32428:3;32423;32410:30;32495:1;32486:6;32481:3;32477:16;32470:27;32400:103;;;:::o;32509:307::-;32577:1;32587:113;32601:6;32598:1;32595:13;32587:113;;;32686:1;32681:3;32677:11;32671:18;32667:1;32662:3;32658:11;32651:39;32623:2;32620:1;32616:10;32611:15;;32587:113;;;32718:6;32715:1;32712:13;32709:2;;;32798:1;32789:6;32784:3;32780:16;32773:27;32709:2;32558:258;;;;:::o;32822:320::-;32866:6;32903:1;32897:4;32893:12;32883:22;;32950:1;32944:4;32940:12;32971:18;32961:2;;33027:4;33019:6;33015:17;33005:27;;32961:2;33089;33081:6;33078:14;33058:18;33055:38;33052:2;;;33108:18;;:::i;:::-;33052:2;32873:269;;;;:::o;33148:281::-;33231:27;33253:4;33231:27;:::i;:::-;33223:6;33219:40;33361:6;33349:10;33346:22;33325:18;33313:10;33310:34;33307:62;33304:2;;;33372:18;;:::i;:::-;33304:2;33412:10;33408:2;33401:22;33191:238;;;:::o;33435:233::-;33474:3;33497:24;33515:5;33497:24;:::i;:::-;33488:33;;33543:66;33536:5;33533:77;33530:2;;;33613:18;;:::i;:::-;33530:2;33660:1;33653:5;33649:13;33642:20;;33478:190;;;:::o;33674:176::-;33706:1;33723:20;33741:1;33723:20;:::i;:::-;33718:25;;33757:20;33775:1;33757:20;:::i;:::-;33752:25;;33796:1;33786:2;;33801:18;;:::i;:::-;33786:2;33842:1;33839;33835:9;33830:14;;33708:142;;;;:::o;33856:180::-;33904:77;33901:1;33894:88;34001:4;33998:1;33991:15;34025:4;34022:1;34015:15;34042:180;34090:77;34087:1;34080:88;34187:4;34184:1;34177:15;34211:4;34208:1;34201:15;34228:180;34276:77;34273:1;34266:88;34373:4;34370:1;34363:15;34397:4;34394:1;34387:15;34414:180;34462:77;34459:1;34452:88;34559:4;34556:1;34549:15;34583:4;34580:1;34573:15;34600:102;34641:6;34692:2;34688:7;34683:2;34676:5;34672:14;34668:28;34658:38;;34648:54;;;:::o;34708:237::-;34848:34;34844:1;34836:6;34832:14;34825:58;34917:20;34912:2;34904:6;34900:15;34893:45;34814:131;:::o;34951:225::-;35091:34;35087:1;35079:6;35075:14;35068:58;35160:8;35155:2;35147:6;35143:15;35136:33;35057:119;:::o;35182:178::-;35322:30;35318:1;35310:6;35306:14;35299:54;35288:72;:::o;35366:295::-;35506:34;35502:1;35494:6;35490:14;35483:58;35575:34;35570:2;35562:6;35558:15;35551:59;35644:9;35639:2;35631:6;35627:15;35620:34;35472:189;:::o;35667:223::-;35807:34;35803:1;35795:6;35791:14;35784:58;35876:6;35871:2;35863:6;35859:15;35852:31;35773:117;:::o;35896:175::-;36036:27;36032:1;36024:6;36020:14;36013:51;36002:69;:::o;36077:245::-;36217:34;36213:1;36205:6;36201:14;36194:58;36286:28;36281:2;36273:6;36269:15;36262:53;36183:139;:::o;36328:179::-;36468:31;36464:1;36456:6;36452:14;36445:55;36434:73;:::o;36513:231::-;36653:34;36649:1;36641:6;36637:14;36630:58;36722:14;36717:2;36709:6;36705:15;36698:39;36619:125;:::o;36750:243::-;36890:34;36886:1;36878:6;36874:14;36867:58;36959:26;36954:2;36946:6;36942:15;36935:51;36856:137;:::o;36999:229::-;37139:34;37135:1;37127:6;37123:14;37116:58;37208:12;37203:2;37195:6;37191:15;37184:37;37105:123;:::o;37234:228::-;37374:34;37370:1;37362:6;37358:14;37351:58;37443:11;37438:2;37430:6;37426:15;37419:36;37340:122;:::o;37468:233::-;37608:34;37604:1;37596:6;37592:14;37585:58;37677:16;37672:2;37664:6;37660:15;37653:41;37574:127;:::o;37707:182::-;37847:34;37843:1;37835:6;37831:14;37824:58;37813:76;:::o;37895:236::-;38035:34;38031:1;38023:6;38019:14;38012:58;38104:19;38099:2;38091:6;38087:15;38080:44;38001:130;:::o;38137:231::-;38277:34;38273:1;38265:6;38261:14;38254:58;38346:14;38341:2;38333:6;38329:15;38322:39;38243:125;:::o;38374:182::-;38514:34;38510:1;38502:6;38498:14;38491:58;38480:76;:::o;38562:228::-;38702:34;38698:1;38690:6;38686:14;38679:58;38771:11;38766:2;38758:6;38754:15;38747:36;38668:122;:::o;38796:234::-;38936:34;38932:1;38924:6;38920:14;38913:58;39005:17;39000:2;38992:6;38988:15;38981:42;38902:128;:::o;39036:220::-;39176:34;39172:1;39164:6;39160:14;39153:58;39245:3;39240:2;39232:6;39228:15;39221:28;39142:114;:::o;39262:::-;39368:8;:::o;39382:236::-;39522:34;39518:1;39510:6;39506:14;39499:58;39591:19;39586:2;39578:6;39574:15;39567:44;39488:130;:::o;39624:122::-;39697:24;39715:5;39697:24;:::i;:::-;39690:5;39687:35;39677:2;;39736:1;39733;39726:12;39677:2;39667:79;:::o;39752:116::-;39822:21;39837:5;39822:21;:::i;:::-;39815:5;39812:32;39802:2;;39858:1;39855;39848:12;39802:2;39792:76;:::o;39874:120::-;39946:23;39963:5;39946:23;:::i;:::-;39939:5;39936:34;39926:2;;39984:1;39981;39974:12;39926:2;39916:78;:::o;40000:122::-;40073:24;40091:5;40073:24;:::i;:::-;40066:5;40063:35;40053:2;;40112:1;40109;40102:12;40053:2;40043:79;:::o

Swarm Source

ipfs://0bff747392440cb984211c1257a04736087198b4120f0102ff233303b863cf4d
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.