ETH Price: $3,107.24 (+1.25%)
Gas: 6 Gwei

Token

Puppers (PUPPERS)
 

Overview

Max Total Supply

158 PUPPERS

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
sliptrick.eth
Balance
4 PUPPERS
0xd730258eafb9a390b69d83b15550b2332f0f1d52
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:
Puppers

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 13: Puppers.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import './Ownable.sol';
import "./Strings.sol";
import "./ERC721Enumerable.sol";


contract Puppers is ERC721Enumerable, Ownable {
    using Strings for uint256;
    
    bool public private_sale_minting = false;
    bool public public_sale_minting = false;
    
    mapping(address => uint) public allocations;

    constructor () ERC721("Puppers", "PUPPERS") { }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        return string(abi.encodePacked("https://meta.puppersnft.com/", tokenId.toString()));
    }   

    function privateSaleMint(uint _quantity) external payable {
        require(allocations[msg.sender] >= _quantity, "Not enough allocation to mint presale");
        require(private_sale_minting, "Minting is currently disabled");
        require(msg.value == 0.05 ether * _quantity, "Incorrect ETH sent to mint");
        require(totalSupply() + _quantity <= 5555, "Not enough tokens left to mint");
        
        for (uint i = 0; i < _quantity; ++i) {
            --allocations[msg.sender];
            _safeMint(msg.sender, totalSupply());
        }
    }
    
    function publicSaleMint(uint _quantity) external payable {
        require(public_sale_minting, "Minting is currently disabled");
        require(_quantity <= 10, "Invalid number of tokens queries for minting");
        require(msg.value == 0.05 ether * _quantity, "Incorrect ETH sent to mint");
        require(totalSupply() + _quantity <= 5555, "Not enough tokens left to mint");
        
        for (uint i = 0; i < _quantity; ++i) _safeMint(msg.sender, totalSupply());
    }

    function ownerMint(address _to, uint _quantity) external onlyOwner {
        require(_quantity <= 10, "Invalid number of tokens queries for minting");
        require(totalSupply() + _quantity <= 5555, "Not enough tokens left to mint");
        
        for (uint i = 0; i < _quantity; ++i) _safeMint(_to, totalSupply());
    }

    function addPresale(address [] memory addresses) external onlyOwner {
        for (uint i = 0; i < addresses.length; ++i) {
            allocations[addresses[i]] += 3;
        }
    }
    
    function togglePrivateSale() external onlyOwner {
        private_sale_minting = !private_sale_minting;
    }

    function togglePublicSale() external onlyOwner {
        public_sale_minting = !public_sale_minting;
    }
    
    function withdraw() external onlyOwner {
        payable(0xAfCA9a21Ae7c376CEf7844373380c81BAda0dcB9).transfer(address(this).balance);
    }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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 2 of 13: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 13: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 4 of 13: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

File 5 of 13: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

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

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

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

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 6 of 13: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 7 of 13: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 8 of 13: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 9 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 10 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 11 of 13: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 13 of 13: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allocations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"privateSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"private_sale_minting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"public_sale_minting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":[],"name":"togglePrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600781526020017f50757070657273000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f50555050455253000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620001dc565b508060019080519060200190620000e5929190620001dc565b50505062000108620000fc6200010e60201b60201c565b6200011660201b60201c565b620002f1565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001ea906200028c565b90600052602060002090601f0160209004810192826200020e57600085556200025a565b82601f106200022957805160ff19168380011785556200025a565b828001600101855582156200025a579182015b82811115620002595782518255916020019190600101906200023c565b5b5090506200026991906200026d565b5090565b5b80821115620002885760008160009055506001016200026e565b5090565b60006002820490506001821680620002a557607f821691505b60208210811415620002bc57620002bb620002c2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6140cf80620003016000396000f3fe6080604052600436106101c25760003560e01c80636352211e116100f7578063b09afa3011610095578063dfe5dd6811610064578063dfe5dd6814610636578063e222c7f91461064d578063e985e9c514610664578063f2fde38b146106a1576101c2565b8063b09afa301461058b578063b3ab66b0146105b4578063b88d4fde146105d0578063c87b56dd146105f9576101c2565b8063814e0d47116100d1578063814e0d47146104e15780638da5cb5b1461050c57806395d89b4114610537578063a22cb46514610562576101c2565b80636352211e1461045057806370a082311461048d578063715018a6146104ca576101c2565b8063346f0d4811610164578063484b973c1161013e578063484b973c146103825780634f6ccce7146103ab57806352a9039c146103e85780635651392314610425576101c2565b8063346f0d48146103265780633ccfd60b1461034257806342842e0e14610359576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632f745c59146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612d5c565b6106ca565b6040516101fb9190613261565b60405180910390f35b34801561021057600080fd5b50610219610744565b604051610226919061327c565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612db6565b6107d6565b60405161026391906131fa565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612cd3565b61085b565b005b3480156102a157600080fd5b506102aa610973565b6040516102b7919061355e565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612bbd565b610980565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612cd3565b6109e0565b60405161031d919061355e565b60405180910390f35b610340600480360381019061033b9190612db6565b610a85565b005b34801561034e57600080fd5b50610357610c85565b005b34801561036557600080fd5b50610380600480360381019061037b9190612bbd565b610d5e565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612cd3565b610d7e565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190612db6565b610ec7565b6040516103df919061355e565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190612b50565b610f38565b60405161041c919061355e565b60405180910390f35b34801561043157600080fd5b5061043a610f50565b6040516104479190613261565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190612db6565b610f63565b60405161048491906131fa565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190612b50565b611015565b6040516104c1919061355e565b60405180910390f35b3480156104d657600080fd5b506104df6110cd565b005b3480156104ed57600080fd5b506104f6611155565b6040516105039190613261565b60405180910390f35b34801561051857600080fd5b50610521611168565b60405161052e91906131fa565b60405180910390f35b34801561054357600080fd5b5061054c611192565b604051610559919061327c565b60405180910390f35b34801561056e57600080fd5b5061058960048036038101906105849190612c93565b611224565b005b34801561059757600080fd5b506105b260048036038101906105ad9190612d13565b61123a565b005b6105ce60048036038101906105c99190612db6565b611348565b005b3480156105dc57600080fd5b506105f760048036038101906105f29190612c10565b6114b7565b005b34801561060557600080fd5b50610620600480360381019061061b9190612db6565b611519565b60405161062d919061327c565b60405180910390f35b34801561064257600080fd5b5061064b61154a565b005b34801561065957600080fd5b506106626115f2565b005b34801561067057600080fd5b5061068b60048036038101906106869190612b7d565b61169a565b6040516106989190613261565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190612b50565b61172e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073d575061073c82611826565b5b9050919050565b60606000805461075390613833565b80601f016020809104026020016040519081016040528092919081815260200182805461077f90613833565b80156107cc5780601f106107a1576101008083540402835291602001916107cc565b820191906000526020600020905b8154815290600101906020018083116107af57829003601f168201915b5050505050905090565b60006107e182611908565b610820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108179061345e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086682610f63565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce906134de565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f6611974565b73ffffffffffffffffffffffffffffffffffffffff16148061092557506109248161091f611974565b61169a565b5b610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b906133be565b60405180910390fd5b61096e838361197c565b505050565b6000600880549050905090565b61099161098b611974565b82611a35565b6109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c7906134fe565b60405180910390fd5b6109db838383611b13565b505050565b60006109eb83611015565b8210610a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a239061329e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe906133fe565b60405180910390fd5b600a60149054906101000a900460ff16610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d9061339e565b60405180910390fd5b8066b1a2bc2ec50000610b6991906136c5565b3414610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba19061353e565b60405180910390fd5b6115b381610bb6610973565b610bc0919061363e565b1115610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf8906134be565b60405180910390fd5b60005b81811015610c8157600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154610c5890613809565b91905081905550610c7033610c6b610973565b611d6f565b80610c7a90613896565b9050610c04565b5050565b610c8d611974565b73ffffffffffffffffffffffffffffffffffffffff16610cab611168565b73ffffffffffffffffffffffffffffffffffffffff1614610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf89061347e565b60405180910390fd5b73afca9a21ae7c376cef7844373380c81bada0dcb973ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d5b573d6000803e3d6000fd5b50565b610d79838383604051806020016040528060008152506114b7565b505050565b610d86611974565b73ffffffffffffffffffffffffffffffffffffffff16610da4611168565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df19061347e565b60405180910390fd5b600a811115610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e35906132be565b60405180910390fd5b6115b381610e4a610973565b610e54919061363e565b1115610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c906134be565b60405180910390fd5b60005b81811015610ec257610eb183610eac610973565b611d6f565b80610ebb90613896565b9050610e98565b505050565b6000610ed1610973565b8210610f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f099061351e565b60405180910390fd5b60088281548110610f2657610f256139cc565b5b90600052602060002001549050919050565b600b6020528060005260406000206000915090505481565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561100c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110039061341e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d906133de565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110d5611974565b73ffffffffffffffffffffffffffffffffffffffff166110f3611168565b73ffffffffffffffffffffffffffffffffffffffff1614611149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111409061347e565b60405180910390fd5b6111536000611d8d565b565b600a60159054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111a190613833565b80601f01602080910402602001604051908101604052809291908181526020018280546111cd90613833565b801561121a5780601f106111ef5761010080835404028352916020019161121a565b820191906000526020600020905b8154815290600101906020018083116111fd57829003601f168201915b5050505050905090565b61123661122f611974565b8383611e53565b5050565b611242611974565b73ffffffffffffffffffffffffffffffffffffffff16611260611168565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad9061347e565b60405180910390fd5b60005b8151811015611344576003600b60008484815181106112db576112da6139cc565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461132c919061363e565b925050819055508061133d90613896565b90506112b9565b5050565b600a60159054906101000a900460ff16611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e9061339e565b60405180910390fd5b600a8111156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d2906132be565b60405180910390fd5b8066b1a2bc2ec500006113ee91906136c5565b341461142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114269061353e565b60405180910390fd5b6115b38161143b610973565b611445919061363e565b1115611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d906134be565b60405180910390fd5b60005b818110156114b3576114a23361149d610973565b611d6f565b806114ac90613896565b9050611489565b5050565b6114c86114c2611974565b83611a35565b611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe906134fe565b60405180910390fd5b61151384848484611fc0565b50505050565b60606115248261201c565b60405160200161153491906131d8565b6040516020818303038152906040529050919050565b611552611974565b73ffffffffffffffffffffffffffffffffffffffff16611570611168565b73ffffffffffffffffffffffffffffffffffffffff16146115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd9061347e565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b6115fa611974565b73ffffffffffffffffffffffffffffffffffffffff16611618611168565b73ffffffffffffffffffffffffffffffffffffffff161461166e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116659061347e565b60405180910390fd5b600a60159054906101000a900460ff1615600a60156101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611736611974565b73ffffffffffffffffffffffffffffffffffffffff16611754611168565b73ffffffffffffffffffffffffffffffffffffffff16146117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a19061347e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611811906132fe565b60405180910390fd5b61182381611d8d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118f157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061190157506119008261217d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119ef83610f63565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a4082611908565b611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a769061337e565b60405180910390fd5b6000611a8a83610f63565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611af957508373ffffffffffffffffffffffffffffffffffffffff16611ae1846107d6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b0a5750611b09818561169a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b3382610f63565b73ffffffffffffffffffffffffffffffffffffffff1614611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b809061349e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf09061333e565b60405180910390fd5b611c048383836121e7565b611c0f60008261197c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5f919061371f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb6919061363e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d898282604051806020016040528060008152506122fb565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb99061335e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fb39190613261565b60405180910390a3505050565b611fcb848484611b13565b611fd784848484612356565b612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d906132de565b60405180910390fd5b50505050565b60606000821415612064576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612178565b600082905060005b6000821461209657808061207f90613896565b915050600a8261208f9190613694565b915061206c565b60008167ffffffffffffffff8111156120b2576120b16139fb565b5b6040519080825280601f01601f1916602001820160405280156120e45781602001600182028036833780820191505090505b5090505b60008514612171576001826120fd919061371f565b9150600a8561210c91906138df565b6030612118919061363e565b60f81b81838151811061212e5761212d6139cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561216a9190613694565b94506120e8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121f28383836124ed565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561223557612230816124f2565b612274565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461227357612272838261253b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b7576122b2816126a8565b6122f6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122f5576122f48282612779565b5b5b505050565b61230583836127f8565b6123126000848484612356565b612351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612348906132de565b60405180910390fd5b505050565b60006123778473ffffffffffffffffffffffffffffffffffffffff166129c6565b156124e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a0611974565b8786866040518563ffffffff1660e01b81526004016123c29493929190613215565b602060405180830381600087803b1580156123dc57600080fd5b505af192505050801561240d57506040513d601f19601f8201168201806040525081019061240a9190612d89565b60015b612490573d806000811461243d576040519150601f19603f3d011682016040523d82523d6000602084013e612442565b606091505b50600081511415612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f906132de565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124e5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161254884611015565b612552919061371f565b9050600060076000848152602001908152602001600020549050818114612637576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126bc919061371f565b90506000600960008481526020019081526020016000205490506000600883815481106126ec576126eb6139cc565b5b90600052602060002001549050806008838154811061270e5761270d6139cc565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061275d5761275c61399d565b5b6001900381819060005260206000200160009055905550505050565b600061278483611015565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f9061343e565b60405180910390fd5b61287181611908565b156128b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a89061331e565b60405180910390fd5b6128bd600083836121e7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290d919061363e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006129ec6129e78461359e565b613579565b90508083825260208201905082856020860282011115612a0f57612a0e613a2f565b5b60005b85811015612a3f5781612a258882612a8b565b845260208401935060208301925050600181019050612a12565b5050509392505050565b6000612a5c612a57846135ca565b613579565b905082815260208101848484011115612a7857612a77613a34565b5b612a838482856137c7565b509392505050565b600081359050612a9a8161403d565b92915050565b600082601f830112612ab557612ab4613a2a565b5b8135612ac58482602086016129d9565b91505092915050565b600081359050612add81614054565b92915050565b600081359050612af28161406b565b92915050565b600081519050612b078161406b565b92915050565b600082601f830112612b2257612b21613a2a565b5b8135612b32848260208601612a49565b91505092915050565b600081359050612b4a81614082565b92915050565b600060208284031215612b6657612b65613a3e565b5b6000612b7484828501612a8b565b91505092915050565b60008060408385031215612b9457612b93613a3e565b5b6000612ba285828601612a8b565b9250506020612bb385828601612a8b565b9150509250929050565b600080600060608486031215612bd657612bd5613a3e565b5b6000612be486828701612a8b565b9350506020612bf586828701612a8b565b9250506040612c0686828701612b3b565b9150509250925092565b60008060008060808587031215612c2a57612c29613a3e565b5b6000612c3887828801612a8b565b9450506020612c4987828801612a8b565b9350506040612c5a87828801612b3b565b925050606085013567ffffffffffffffff811115612c7b57612c7a613a39565b5b612c8787828801612b0d565b91505092959194509250565b60008060408385031215612caa57612ca9613a3e565b5b6000612cb885828601612a8b565b9250506020612cc985828601612ace565b9150509250929050565b60008060408385031215612cea57612ce9613a3e565b5b6000612cf885828601612a8b565b9250506020612d0985828601612b3b565b9150509250929050565b600060208284031215612d2957612d28613a3e565b5b600082013567ffffffffffffffff811115612d4757612d46613a39565b5b612d5384828501612aa0565b91505092915050565b600060208284031215612d7257612d71613a3e565b5b6000612d8084828501612ae3565b91505092915050565b600060208284031215612d9f57612d9e613a3e565b5b6000612dad84828501612af8565b91505092915050565b600060208284031215612dcc57612dcb613a3e565b5b6000612dda84828501612b3b565b91505092915050565b612dec81613753565b82525050565b612dfb81613765565b82525050565b6000612e0c826135fb565b612e168185613611565b9350612e268185602086016137d6565b612e2f81613a43565b840191505092915050565b6000612e4582613606565b612e4f8185613622565b9350612e5f8185602086016137d6565b612e6881613a43565b840191505092915050565b6000612e7e82613606565b612e888185613633565b9350612e988185602086016137d6565b80840191505092915050565b6000612eb1602b83613622565b9150612ebc82613a54565b604082019050919050565b6000612ed4602c83613622565b9150612edf82613aa3565b604082019050919050565b6000612ef7603283613622565b9150612f0282613af2565b604082019050919050565b6000612f1a602683613622565b9150612f2582613b41565b604082019050919050565b6000612f3d601c83613622565b9150612f4882613b90565b602082019050919050565b6000612f60601c83613633565b9150612f6b82613bb9565b601c82019050919050565b6000612f83602483613622565b9150612f8e82613be2565b604082019050919050565b6000612fa6601983613622565b9150612fb182613c31565b602082019050919050565b6000612fc9602c83613622565b9150612fd482613c5a565b604082019050919050565b6000612fec601d83613622565b9150612ff782613ca9565b602082019050919050565b600061300f603883613622565b915061301a82613cd2565b604082019050919050565b6000613032602a83613622565b915061303d82613d21565b604082019050919050565b6000613055602583613622565b915061306082613d70565b604082019050919050565b6000613078602983613622565b915061308382613dbf565b604082019050919050565b600061309b602083613622565b91506130a682613e0e565b602082019050919050565b60006130be602c83613622565b91506130c982613e37565b604082019050919050565b60006130e1602083613622565b91506130ec82613e86565b602082019050919050565b6000613104602983613622565b915061310f82613eaf565b604082019050919050565b6000613127601e83613622565b915061313282613efe565b602082019050919050565b600061314a602183613622565b915061315582613f27565b604082019050919050565b600061316d603183613622565b915061317882613f76565b604082019050919050565b6000613190602c83613622565b915061319b82613fc5565b604082019050919050565b60006131b3601a83613622565b91506131be82614014565b602082019050919050565b6131d2816137bd565b82525050565b60006131e382612f53565b91506131ef8284612e73565b915081905092915050565b600060208201905061320f6000830184612de3565b92915050565b600060808201905061322a6000830187612de3565b6132376020830186612de3565b61324460408301856131c9565b81810360608301526132568184612e01565b905095945050505050565b60006020820190506132766000830184612df2565b92915050565b600060208201905081810360008301526132968184612e3a565b905092915050565b600060208201905081810360008301526132b781612ea4565b9050919050565b600060208201905081810360008301526132d781612ec7565b9050919050565b600060208201905081810360008301526132f781612eea565b9050919050565b6000602082019050818103600083015261331781612f0d565b9050919050565b6000602082019050818103600083015261333781612f30565b9050919050565b6000602082019050818103600083015261335781612f76565b9050919050565b6000602082019050818103600083015261337781612f99565b9050919050565b6000602082019050818103600083015261339781612fbc565b9050919050565b600060208201905081810360008301526133b781612fdf565b9050919050565b600060208201905081810360008301526133d781613002565b9050919050565b600060208201905081810360008301526133f781613025565b9050919050565b6000602082019050818103600083015261341781613048565b9050919050565b600060208201905081810360008301526134378161306b565b9050919050565b600060208201905081810360008301526134578161308e565b9050919050565b60006020820190508181036000830152613477816130b1565b9050919050565b60006020820190508181036000830152613497816130d4565b9050919050565b600060208201905081810360008301526134b7816130f7565b9050919050565b600060208201905081810360008301526134d78161311a565b9050919050565b600060208201905081810360008301526134f78161313d565b9050919050565b6000602082019050818103600083015261351781613160565b9050919050565b6000602082019050818103600083015261353781613183565b9050919050565b60006020820190508181036000830152613557816131a6565b9050919050565b600060208201905061357360008301846131c9565b92915050565b6000613583613594565b905061358f8282613865565b919050565b6000604051905090565b600067ffffffffffffffff8211156135b9576135b86139fb565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156135e5576135e46139fb565b5b6135ee82613a43565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613649826137bd565b9150613654836137bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561368957613688613910565b5b828201905092915050565b600061369f826137bd565b91506136aa836137bd565b9250826136ba576136b961393f565b5b828204905092915050565b60006136d0826137bd565b91506136db836137bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561371457613713613910565b5b828202905092915050565b600061372a826137bd565b9150613735836137bd565b92508282101561374857613747613910565b5b828203905092915050565b600061375e8261379d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156137f45780820151818401526020810190506137d9565b83811115613803576000848401525b50505050565b6000613814826137bd565b9150600082141561382857613827613910565b5b600182039050919050565b6000600282049050600182168061384b57607f821691505b6020821081141561385f5761385e61396e565b5b50919050565b61386e82613a43565b810181811067ffffffffffffffff8211171561388d5761388c6139fb565b5b80604052505050565b60006138a1826137bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138d4576138d3613910565b5b600182019050919050565b60006138ea826137bd565b91506138f5836137bd565b9250826139055761390461393f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008201527f20666f72206d696e74696e670000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f68747470733a2f2f6d6574612e707570706572736e66742e636f6d2f00000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74696e672069732063757272656e746c792064697361626c6564000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820616c6c6f636174696f6e20746f206d696e7420707260008201527f6573616c65000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482073656e7420746f206d696e74000000000000600082015250565b61404681613753565b811461405157600080fd5b50565b61405d81613765565b811461406857600080fd5b50565b61407481613771565b811461407f57600080fd5b50565b61408b816137bd565b811461409657600080fd5b5056fea26469706673582212202cba23b18f075d44ce83ea269685b3160cadbf61cdfd71885adbfc663cc123a364736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80636352211e116100f7578063b09afa3011610095578063dfe5dd6811610064578063dfe5dd6814610636578063e222c7f91461064d578063e985e9c514610664578063f2fde38b146106a1576101c2565b8063b09afa301461058b578063b3ab66b0146105b4578063b88d4fde146105d0578063c87b56dd146105f9576101c2565b8063814e0d47116100d1578063814e0d47146104e15780638da5cb5b1461050c57806395d89b4114610537578063a22cb46514610562576101c2565b80636352211e1461045057806370a082311461048d578063715018a6146104ca576101c2565b8063346f0d4811610164578063484b973c1161013e578063484b973c146103825780634f6ccce7146103ab57806352a9039c146103e85780635651392314610425576101c2565b8063346f0d48146103265780633ccfd60b1461034257806342842e0e14610359576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632f745c59146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612d5c565b6106ca565b6040516101fb9190613261565b60405180910390f35b34801561021057600080fd5b50610219610744565b604051610226919061327c565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612db6565b6107d6565b60405161026391906131fa565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612cd3565b61085b565b005b3480156102a157600080fd5b506102aa610973565b6040516102b7919061355e565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612bbd565b610980565b005b3480156102f557600080fd5b50610310600480360381019061030b9190612cd3565b6109e0565b60405161031d919061355e565b60405180910390f35b610340600480360381019061033b9190612db6565b610a85565b005b34801561034e57600080fd5b50610357610c85565b005b34801561036557600080fd5b50610380600480360381019061037b9190612bbd565b610d5e565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612cd3565b610d7e565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190612db6565b610ec7565b6040516103df919061355e565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190612b50565b610f38565b60405161041c919061355e565b60405180910390f35b34801561043157600080fd5b5061043a610f50565b6040516104479190613261565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190612db6565b610f63565b60405161048491906131fa565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190612b50565b611015565b6040516104c1919061355e565b60405180910390f35b3480156104d657600080fd5b506104df6110cd565b005b3480156104ed57600080fd5b506104f6611155565b6040516105039190613261565b60405180910390f35b34801561051857600080fd5b50610521611168565b60405161052e91906131fa565b60405180910390f35b34801561054357600080fd5b5061054c611192565b604051610559919061327c565b60405180910390f35b34801561056e57600080fd5b5061058960048036038101906105849190612c93565b611224565b005b34801561059757600080fd5b506105b260048036038101906105ad9190612d13565b61123a565b005b6105ce60048036038101906105c99190612db6565b611348565b005b3480156105dc57600080fd5b506105f760048036038101906105f29190612c10565b6114b7565b005b34801561060557600080fd5b50610620600480360381019061061b9190612db6565b611519565b60405161062d919061327c565b60405180910390f35b34801561064257600080fd5b5061064b61154a565b005b34801561065957600080fd5b506106626115f2565b005b34801561067057600080fd5b5061068b60048036038101906106869190612b7d565b61169a565b6040516106989190613261565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190612b50565b61172e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073d575061073c82611826565b5b9050919050565b60606000805461075390613833565b80601f016020809104026020016040519081016040528092919081815260200182805461077f90613833565b80156107cc5780601f106107a1576101008083540402835291602001916107cc565b820191906000526020600020905b8154815290600101906020018083116107af57829003601f168201915b5050505050905090565b60006107e182611908565b610820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108179061345e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086682610f63565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce906134de565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f6611974565b73ffffffffffffffffffffffffffffffffffffffff16148061092557506109248161091f611974565b61169a565b5b610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b906133be565b60405180910390fd5b61096e838361197c565b505050565b6000600880549050905090565b61099161098b611974565b82611a35565b6109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c7906134fe565b60405180910390fd5b6109db838383611b13565b505050565b60006109eb83611015565b8210610a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a239061329e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afe906133fe565b60405180910390fd5b600a60149054906101000a900460ff16610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d9061339e565b60405180910390fd5b8066b1a2bc2ec50000610b6991906136c5565b3414610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba19061353e565b60405180910390fd5b6115b381610bb6610973565b610bc0919061363e565b1115610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf8906134be565b60405180910390fd5b60005b81811015610c8157600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154610c5890613809565b91905081905550610c7033610c6b610973565b611d6f565b80610c7a90613896565b9050610c04565b5050565b610c8d611974565b73ffffffffffffffffffffffffffffffffffffffff16610cab611168565b73ffffffffffffffffffffffffffffffffffffffff1614610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf89061347e565b60405180910390fd5b73afca9a21ae7c376cef7844373380c81bada0dcb973ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d5b573d6000803e3d6000fd5b50565b610d79838383604051806020016040528060008152506114b7565b505050565b610d86611974565b73ffffffffffffffffffffffffffffffffffffffff16610da4611168565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df19061347e565b60405180910390fd5b600a811115610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e35906132be565b60405180910390fd5b6115b381610e4a610973565b610e54919061363e565b1115610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c906134be565b60405180910390fd5b60005b81811015610ec257610eb183610eac610973565b611d6f565b80610ebb90613896565b9050610e98565b505050565b6000610ed1610973565b8210610f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f099061351e565b60405180910390fd5b60088281548110610f2657610f256139cc565b5b90600052602060002001549050919050565b600b6020528060005260406000206000915090505481565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561100c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110039061341e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d906133de565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110d5611974565b73ffffffffffffffffffffffffffffffffffffffff166110f3611168565b73ffffffffffffffffffffffffffffffffffffffff1614611149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111409061347e565b60405180910390fd5b6111536000611d8d565b565b600a60159054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111a190613833565b80601f01602080910402602001604051908101604052809291908181526020018280546111cd90613833565b801561121a5780601f106111ef5761010080835404028352916020019161121a565b820191906000526020600020905b8154815290600101906020018083116111fd57829003601f168201915b5050505050905090565b61123661122f611974565b8383611e53565b5050565b611242611974565b73ffffffffffffffffffffffffffffffffffffffff16611260611168565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad9061347e565b60405180910390fd5b60005b8151811015611344576003600b60008484815181106112db576112da6139cc565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461132c919061363e565b925050819055508061133d90613896565b90506112b9565b5050565b600a60159054906101000a900460ff16611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e9061339e565b60405180910390fd5b600a8111156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d2906132be565b60405180910390fd5b8066b1a2bc2ec500006113ee91906136c5565b341461142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114269061353e565b60405180910390fd5b6115b38161143b610973565b611445919061363e565b1115611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d906134be565b60405180910390fd5b60005b818110156114b3576114a23361149d610973565b611d6f565b806114ac90613896565b9050611489565b5050565b6114c86114c2611974565b83611a35565b611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe906134fe565b60405180910390fd5b61151384848484611fc0565b50505050565b60606115248261201c565b60405160200161153491906131d8565b6040516020818303038152906040529050919050565b611552611974565b73ffffffffffffffffffffffffffffffffffffffff16611570611168565b73ffffffffffffffffffffffffffffffffffffffff16146115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd9061347e565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b6115fa611974565b73ffffffffffffffffffffffffffffffffffffffff16611618611168565b73ffffffffffffffffffffffffffffffffffffffff161461166e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116659061347e565b60405180910390fd5b600a60159054906101000a900460ff1615600a60156101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611736611974565b73ffffffffffffffffffffffffffffffffffffffff16611754611168565b73ffffffffffffffffffffffffffffffffffffffff16146117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a19061347e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611811906132fe565b60405180910390fd5b61182381611d8d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118f157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061190157506119008261217d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119ef83610f63565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a4082611908565b611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a769061337e565b60405180910390fd5b6000611a8a83610f63565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611af957508373ffffffffffffffffffffffffffffffffffffffff16611ae1846107d6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b0a5750611b09818561169a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b3382610f63565b73ffffffffffffffffffffffffffffffffffffffff1614611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b809061349e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf09061333e565b60405180910390fd5b611c048383836121e7565b611c0f60008261197c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5f919061371f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb6919061363e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d898282604051806020016040528060008152506122fb565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb99061335e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fb39190613261565b60405180910390a3505050565b611fcb848484611b13565b611fd784848484612356565b612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d906132de565b60405180910390fd5b50505050565b60606000821415612064576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612178565b600082905060005b6000821461209657808061207f90613896565b915050600a8261208f9190613694565b915061206c565b60008167ffffffffffffffff8111156120b2576120b16139fb565b5b6040519080825280601f01601f1916602001820160405280156120e45781602001600182028036833780820191505090505b5090505b60008514612171576001826120fd919061371f565b9150600a8561210c91906138df565b6030612118919061363e565b60f81b81838151811061212e5761212d6139cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561216a9190613694565b94506120e8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121f28383836124ed565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561223557612230816124f2565b612274565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461227357612272838261253b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b7576122b2816126a8565b6122f6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122f5576122f48282612779565b5b5b505050565b61230583836127f8565b6123126000848484612356565b612351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612348906132de565b60405180910390fd5b505050565b60006123778473ffffffffffffffffffffffffffffffffffffffff166129c6565b156124e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a0611974565b8786866040518563ffffffff1660e01b81526004016123c29493929190613215565b602060405180830381600087803b1580156123dc57600080fd5b505af192505050801561240d57506040513d601f19601f8201168201806040525081019061240a9190612d89565b60015b612490573d806000811461243d576040519150601f19603f3d011682016040523d82523d6000602084013e612442565b606091505b50600081511415612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f906132de565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124e5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161254884611015565b612552919061371f565b9050600060076000848152602001908152602001600020549050818114612637576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126bc919061371f565b90506000600960008481526020019081526020016000205490506000600883815481106126ec576126eb6139cc565b5b90600052602060002001549050806008838154811061270e5761270d6139cc565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061275d5761275c61399d565b5b6001900381819060005260206000200160009055905550505050565b600061278483611015565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f9061343e565b60405180910390fd5b61287181611908565b156128b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a89061331e565b60405180910390fd5b6128bd600083836121e7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290d919061363e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006129ec6129e78461359e565b613579565b90508083825260208201905082856020860282011115612a0f57612a0e613a2f565b5b60005b85811015612a3f5781612a258882612a8b565b845260208401935060208301925050600181019050612a12565b5050509392505050565b6000612a5c612a57846135ca565b613579565b905082815260208101848484011115612a7857612a77613a34565b5b612a838482856137c7565b509392505050565b600081359050612a9a8161403d565b92915050565b600082601f830112612ab557612ab4613a2a565b5b8135612ac58482602086016129d9565b91505092915050565b600081359050612add81614054565b92915050565b600081359050612af28161406b565b92915050565b600081519050612b078161406b565b92915050565b600082601f830112612b2257612b21613a2a565b5b8135612b32848260208601612a49565b91505092915050565b600081359050612b4a81614082565b92915050565b600060208284031215612b6657612b65613a3e565b5b6000612b7484828501612a8b565b91505092915050565b60008060408385031215612b9457612b93613a3e565b5b6000612ba285828601612a8b565b9250506020612bb385828601612a8b565b9150509250929050565b600080600060608486031215612bd657612bd5613a3e565b5b6000612be486828701612a8b565b9350506020612bf586828701612a8b565b9250506040612c0686828701612b3b565b9150509250925092565b60008060008060808587031215612c2a57612c29613a3e565b5b6000612c3887828801612a8b565b9450506020612c4987828801612a8b565b9350506040612c5a87828801612b3b565b925050606085013567ffffffffffffffff811115612c7b57612c7a613a39565b5b612c8787828801612b0d565b91505092959194509250565b60008060408385031215612caa57612ca9613a3e565b5b6000612cb885828601612a8b565b9250506020612cc985828601612ace565b9150509250929050565b60008060408385031215612cea57612ce9613a3e565b5b6000612cf885828601612a8b565b9250506020612d0985828601612b3b565b9150509250929050565b600060208284031215612d2957612d28613a3e565b5b600082013567ffffffffffffffff811115612d4757612d46613a39565b5b612d5384828501612aa0565b91505092915050565b600060208284031215612d7257612d71613a3e565b5b6000612d8084828501612ae3565b91505092915050565b600060208284031215612d9f57612d9e613a3e565b5b6000612dad84828501612af8565b91505092915050565b600060208284031215612dcc57612dcb613a3e565b5b6000612dda84828501612b3b565b91505092915050565b612dec81613753565b82525050565b612dfb81613765565b82525050565b6000612e0c826135fb565b612e168185613611565b9350612e268185602086016137d6565b612e2f81613a43565b840191505092915050565b6000612e4582613606565b612e4f8185613622565b9350612e5f8185602086016137d6565b612e6881613a43565b840191505092915050565b6000612e7e82613606565b612e888185613633565b9350612e988185602086016137d6565b80840191505092915050565b6000612eb1602b83613622565b9150612ebc82613a54565b604082019050919050565b6000612ed4602c83613622565b9150612edf82613aa3565b604082019050919050565b6000612ef7603283613622565b9150612f0282613af2565b604082019050919050565b6000612f1a602683613622565b9150612f2582613b41565b604082019050919050565b6000612f3d601c83613622565b9150612f4882613b90565b602082019050919050565b6000612f60601c83613633565b9150612f6b82613bb9565b601c82019050919050565b6000612f83602483613622565b9150612f8e82613be2565b604082019050919050565b6000612fa6601983613622565b9150612fb182613c31565b602082019050919050565b6000612fc9602c83613622565b9150612fd482613c5a565b604082019050919050565b6000612fec601d83613622565b9150612ff782613ca9565b602082019050919050565b600061300f603883613622565b915061301a82613cd2565b604082019050919050565b6000613032602a83613622565b915061303d82613d21565b604082019050919050565b6000613055602583613622565b915061306082613d70565b604082019050919050565b6000613078602983613622565b915061308382613dbf565b604082019050919050565b600061309b602083613622565b91506130a682613e0e565b602082019050919050565b60006130be602c83613622565b91506130c982613e37565b604082019050919050565b60006130e1602083613622565b91506130ec82613e86565b602082019050919050565b6000613104602983613622565b915061310f82613eaf565b604082019050919050565b6000613127601e83613622565b915061313282613efe565b602082019050919050565b600061314a602183613622565b915061315582613f27565b604082019050919050565b600061316d603183613622565b915061317882613f76565b604082019050919050565b6000613190602c83613622565b915061319b82613fc5565b604082019050919050565b60006131b3601a83613622565b91506131be82614014565b602082019050919050565b6131d2816137bd565b82525050565b60006131e382612f53565b91506131ef8284612e73565b915081905092915050565b600060208201905061320f6000830184612de3565b92915050565b600060808201905061322a6000830187612de3565b6132376020830186612de3565b61324460408301856131c9565b81810360608301526132568184612e01565b905095945050505050565b60006020820190506132766000830184612df2565b92915050565b600060208201905081810360008301526132968184612e3a565b905092915050565b600060208201905081810360008301526132b781612ea4565b9050919050565b600060208201905081810360008301526132d781612ec7565b9050919050565b600060208201905081810360008301526132f781612eea565b9050919050565b6000602082019050818103600083015261331781612f0d565b9050919050565b6000602082019050818103600083015261333781612f30565b9050919050565b6000602082019050818103600083015261335781612f76565b9050919050565b6000602082019050818103600083015261337781612f99565b9050919050565b6000602082019050818103600083015261339781612fbc565b9050919050565b600060208201905081810360008301526133b781612fdf565b9050919050565b600060208201905081810360008301526133d781613002565b9050919050565b600060208201905081810360008301526133f781613025565b9050919050565b6000602082019050818103600083015261341781613048565b9050919050565b600060208201905081810360008301526134378161306b565b9050919050565b600060208201905081810360008301526134578161308e565b9050919050565b60006020820190508181036000830152613477816130b1565b9050919050565b60006020820190508181036000830152613497816130d4565b9050919050565b600060208201905081810360008301526134b7816130f7565b9050919050565b600060208201905081810360008301526134d78161311a565b9050919050565b600060208201905081810360008301526134f78161313d565b9050919050565b6000602082019050818103600083015261351781613160565b9050919050565b6000602082019050818103600083015261353781613183565b9050919050565b60006020820190508181036000830152613557816131a6565b9050919050565b600060208201905061357360008301846131c9565b92915050565b6000613583613594565b905061358f8282613865565b919050565b6000604051905090565b600067ffffffffffffffff8211156135b9576135b86139fb565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156135e5576135e46139fb565b5b6135ee82613a43565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613649826137bd565b9150613654836137bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561368957613688613910565b5b828201905092915050565b600061369f826137bd565b91506136aa836137bd565b9250826136ba576136b961393f565b5b828204905092915050565b60006136d0826137bd565b91506136db836137bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561371457613713613910565b5b828202905092915050565b600061372a826137bd565b9150613735836137bd565b92508282101561374857613747613910565b5b828203905092915050565b600061375e8261379d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156137f45780820151818401526020810190506137d9565b83811115613803576000848401525b50505050565b6000613814826137bd565b9150600082141561382857613827613910565b5b600182039050919050565b6000600282049050600182168061384b57607f821691505b6020821081141561385f5761385e61396e565b5b50919050565b61386e82613a43565b810181811067ffffffffffffffff8211171561388d5761388c6139fb565b5b80604052505050565b60006138a1826137bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138d4576138d3613910565b5b600182019050919050565b60006138ea826137bd565b91506138f5836137bd565b9250826139055761390461393f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008201527f20666f72206d696e74696e670000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f68747470733a2f2f6d6574612e707570706572736e66742e636f6d2f00000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e74696e672069732063757272656e746c792064697361626c6564000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820616c6c6f636174696f6e20746f206d696e7420707260008201527f6573616c65000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e740000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482073656e7420746f206d696e74000000000000600082015250565b61404681613753565b811461405157600080fd5b50565b61405d81613765565b811461406857600080fd5b50565b61407481613771565b811461407f57600080fd5b50565b61408b816137bd565b811461409657600080fd5b5056fea26469706673582212202cba23b18f075d44ce83ea269685b3160cadbf61cdfd71885adbfc663cc123a364736f6c63430008070033

Deployed Bytecode Sourcemap

172:2439:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;915:222:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2418:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3929:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3467:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1540:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4656:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1216:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;660:558:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2470:139;;;;;;;;;;;;;:::i;:::-;;5052:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1713:327:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1723:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;356:43:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;260:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2121:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1859:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:10;;;;;;;;;;;;;:::i;:::-;;306:39:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2580:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4213:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2046:183:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1228:479;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5297:320:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;463:188:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2239:109;;;;;;;;;;;;;:::i;:::-;;2354:106;;;;;;;;;;;;;:::i;:::-;;4432:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;915:222:4;1017:4;1055:35;1040:50;;;:11;:50;;;;:90;;;;1094:36;1118:11;1094:23;:36::i;:::-;1040:90;1033:97;;915:222;;;:::o;2418:98:3:-;2472:13;2504:5;2497:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2418:98;:::o;3929:217::-;4005:7;4032:16;4040:7;4032;:16::i;:::-;4024:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4115:15;:24;4131:7;4115:24;;;;;;;;;;;;;;;;;;;;;4108:31;;3929:217;;;:::o;3467:401::-;3547:13;3563:23;3578:7;3563:14;:23::i;:::-;3547:39;;3610:5;3604:11;;:2;:11;;;;3596:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3701:5;3685:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3710:37;3727:5;3734:12;:10;:12::i;:::-;3710:16;:37::i;:::-;3685:62;3664:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3840:21;3849:2;3853:7;3840:8;:21::i;:::-;3537:331;3467:401;;:::o;1540:111:4:-;1601:7;1627:10;:17;;;;1620:24;;1540:111;:::o;4656:330:3:-;4845:41;4864:12;:10;:12::i;:::-;4878:7;4845:18;:41::i;:::-;4837:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4951:28;4961:4;4967:2;4971:7;4951:9;:28::i;:::-;4656:330;;;:::o;1216:253:4:-;1313:7;1348:23;1365:5;1348:16;:23::i;:::-;1340:5;:31;1332:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1436:12;:19;1449:5;1436:19;;;;;;;;;;;;;;;:26;1456:5;1436:26;;;;;;;;;;;;1429:33;;1216:253;;;;:::o;660:558:11:-;763:9;736:11;:23;748:10;736:23;;;;;;;;;;;;;;;;:36;;728:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;832:20;;;;;;;;;;;824:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;930:9;917:10;:22;;;;:::i;:::-;904:9;:35;896:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1017:4;1004:9;988:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:33;;980:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1080:6;1075:137;1096:9;1092:1;:13;1075:137;;;1128:11;:23;1140:10;1128:23;;;;;;;;;;;;;;;;1126:25;;;;;:::i;:::-;;;;;;;;1165:36;1175:10;1187:13;:11;:13::i;:::-;1165:9;:36::i;:::-;1107:3;;;;:::i;:::-;;;1075:137;;;;660:558;:::o;2470:139::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2527:42:11::1;2519:60;;:83;2580:21;2519:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2470:139::o:0;5052:179:3:-;5185:39;5202:4;5208:2;5212:7;5185:39;;;;;;;;;;;;:16;:39::i;:::-;5052:179;;;:::o;1713:327:11:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1811:2:11::1;1798:9;:15;;1790:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1909:4;1896:9;1880:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:33;;1872:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1972:6;1967:66;1988:9;1984:1;:13;1967:66;;;2004:29;2014:3;2019:13;:11;:13::i;:::-;2004:9;:29::i;:::-;1999:3;;;;:::i;:::-;;;1967:66;;;;1713:327:::0;;:::o;1723:230:4:-;1798:7;1833:30;:28;:30::i;:::-;1825:5;:38;1817:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1929:10;1940:5;1929:17;;;;;;;;:::i;:::-;;;;;;;;;;1922:24;;1723:230;;;:::o;356:43:11:-;;;;;;;;;;;;;;;;;:::o;260:40::-;;;;;;;;;;;;;:::o;2121:235:3:-;2193:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2279:1;2262:19;;:5;:19;;;;2254:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2344:5;2337:12;;;2121:235;;;:::o;1859:205::-;1931:7;1975:1;1958:19;;:5;:19;;;;1950:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2041:9;:16;2051:5;2041:16;;;;;;;;;;;;;;;;2034:23;;1859:205;;;:::o;1661:101:10:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;306:39:11:-;;;;;;;;;;;;;:::o;1029:85:10:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;2580:102:3:-;2636:13;2668:7;2661:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2580:102;:::o;4213:153::-;4307:52;4326:12;:10;:12::i;:::-;4340:8;4350;4307:18;:52::i;:::-;4213:153;;:::o;2046:183:11:-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2129:6:11::1;2124:99;2145:9;:16;2141:1;:20;2124:99;;;2211:1;2182:11;:25;2194:9;2204:1;2194:12;;;;;;;;:::i;:::-;;;;;;;;2182:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;2163:3;;;;:::i;:::-;;;2124:99;;;;2046:183:::0;:::o;1228:479::-;1303:19;;;;;;;;;;;1295:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;1387:2;1374:9;:15;;1366:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1482:9;1469:10;:22;;;;:::i;:::-;1456:9;:35;1448:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1569:4;1556:9;1540:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:33;;1532:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1632:6;1627:73;1648:9;1644:1;:13;1627:73;;;1664:36;1674:10;1686:13;:11;:13::i;:::-;1664:9;:36::i;:::-;1659:3;;;;:::i;:::-;;;1627:73;;;;1228:479;:::o;5297:320:3:-;5466:41;5485:12;:10;:12::i;:::-;5499:7;5466:18;:41::i;:::-;5458:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5571:39;5585:4;5591:2;5595:7;5604:5;5571:13;:39::i;:::-;5297:320;;;;:::o;463:188:11:-;536:13;624:18;:7;:16;:18::i;:::-;575:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;561:83;;463:188;;;:::o;2239:109::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2321:20:11::1;;;;;;;;;;;2320:21;2297:20;;:44;;;;;;;;;;;;;;;;;;2239:109::o:0;2354:106::-;1252:12:10;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2434:19:11::1;;;;;;;;;;;2433:20;2411:19;;:42;;;;;;;;;;;;;;;;;;2354:106::o:0;4432:162:3:-;4529:4;4552:18;:25;4571:5;4552:25;;;;;;;;;;;;;;;:35;4578:8;4552:35;;;;;;;;;;;;;;;;;;;;;;;;;4545:42;;4432:162;;;;:::o;1911:198:10:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;1500:300:3:-;1602:4;1652:25;1637:40;;;:11;:40;;;;:104;;;;1708:33;1693:48;;;:11;:48;;;;1637:104;:156;;;;1757:36;1781:11;1757:23;:36::i;:::-;1637:156;1618:175;;1500:300;;;:::o;7089:125::-;7154:4;7205:1;7177:30;;:7;:16;7185:7;7177:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7170:37;;7089:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;10940:171:3:-;11041:2;11014:15;:24;11030:7;11014:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11096:7;11092:2;11058:46;;11067:23;11082:7;11067:14;:23::i;:::-;11058:46;;;;;;;;;;;;10940:171;;:::o;7372:344::-;7465:4;7489:16;7497:7;7489;:16::i;:::-;7481:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7564:13;7580:23;7595:7;7580:14;:23::i;:::-;7564:39;;7632:5;7621:16;;:7;:16;;;:51;;;;7665:7;7641:31;;:20;7653:7;7641:11;:20::i;:::-;:31;;;7621:51;:87;;;;7676:32;7693:5;7700:7;7676:16;:32::i;:::-;7621:87;7613:96;;;7372:344;;;;:::o;10269:560::-;10423:4;10396:31;;:23;10411:7;10396:14;:23::i;:::-;:31;;;10388:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10505:1;10491:16;;:2;:16;;;;10483:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10559:39;10580:4;10586:2;10590:7;10559:20;:39::i;:::-;10660:29;10677:1;10681:7;10660:8;:29::i;:::-;10719:1;10700:9;:15;10710:4;10700:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10747:1;10730:9;:13;10740:2;10730:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10777:2;10758:7;:16;10766:7;10758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10814:7;10810:2;10795:27;;10804:4;10795:27;;;;;;;;;;;;10269:560;;;:::o;8046:108::-;8121:26;8131:2;8135:7;8121:26;;;;;;;;;;;;:9;:26::i;:::-;8046:108;;:::o;2263:187:10:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;11246:307:3:-;11396:8;11387:17;;:5;:17;;;;11379:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11482:8;11444:18;:25;11463:5;11444:25;;;;;;;;;;;;;;;:35;11470:8;11444:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11527:8;11505:41;;11520:5;11505:41;;;11537:8;11505:41;;;;;;:::i;:::-;;;;;;;;11246:307;;;:::o;6479:::-;6630:28;6640:4;6646:2;6650:7;6630:9;:28::i;:::-;6676:48;6699:4;6705:2;6709:7;6718:5;6676:22;:48::i;:::-;6668:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6479:307;;;;:::o;328:703:12:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2549:572:4:-;2688:45;2715:4;2721:2;2725:7;2688:26;:45::i;:::-;2764:1;2748:18;;:4;:18;;;2744:183;;;2782:40;2814:7;2782:31;:40::i;:::-;2744:183;;;2851:2;2843:10;;:4;:10;;;2839:88;;2869:47;2902:4;2908:7;2869:32;:47::i;:::-;2839:88;2744:183;2954:1;2940:16;;:2;:16;;;2936:179;;;2972:45;3009:7;2972:36;:45::i;:::-;2936:179;;;3044:4;3038:10;;:2;:10;;;3034:81;;3064:40;3092:2;3096:7;3064:27;:40::i;:::-;3034:81;2936:179;2549:572;;;:::o;8375:311:3:-;8500:18;8506:2;8510:7;8500:5;:18::i;:::-;8549:54;8580:1;8584:2;8588:7;8597:5;8549:22;:54::i;:::-;8528:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8375:311;;;:::o;12106:778::-;12256:4;12276:15;:2;:13;;;:15::i;:::-;12272:606;;;12327:2;12311:36;;;12348:12;:10;:12::i;:::-;12362:4;12368:7;12377:5;12311:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12307:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12567:1;12550:6;:13;:18;12546:266;;;12592:60;;;;;;;;;;:::i;:::-;;;;;;;;12546:266;12764:6;12758:13;12749:6;12745:2;12741:15;12734:38;12307:519;12443:41;;;12433:51;;;:6;:51;;;;12426:58;;;;;12272:606;12863:4;12856:11;;12106:778;;;;;;;:::o;13440:122::-;;;;:::o;3827:161:4:-;3930:10;:17;;;;3903:15;:24;3919:7;3903:24;;;;;;;;;;;:44;;;;3957:10;3973:7;3957:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3827:161;:::o;4605:970::-;4867:22;4917:1;4892:22;4909:4;4892:16;:22::i;:::-;:26;;;;:::i;:::-;4867:51;;4928:18;4949:17;:26;4967:7;4949:26;;;;;;;;;;;;4928:47;;5093:14;5079:10;:28;5075:323;;5123:19;5145:12;:18;5158:4;5145:18;;;;;;;;;;;;;;;:34;5164:14;5145:34;;;;;;;;;;;;5123:56;;5227:11;5194:12;:18;5207:4;5194:18;;;;;;;;;;;;;;;:30;5213:10;5194:30;;;;;;;;;;;:44;;;;5343:10;5310:17;:30;5328:11;5310:30;;;;;;;;;;;:43;;;;5109:289;5075:323;5491:17;:26;5509:7;5491:26;;;;;;;;;;;5484:33;;;5534:12;:18;5547:4;5534:18;;;;;;;;;;;;;;;:34;5553:14;5534:34;;;;;;;;;;;5527:41;;;4686:889;;4605:970;;:::o;5863:1061::-;6112:22;6157:1;6137:10;:17;;;;:21;;;;:::i;:::-;6112:46;;6168:18;6189:15;:24;6205:7;6189:24;;;;;;;;;;;;6168:45;;6535:19;6557:10;6568:14;6557:26;;;;;;;;:::i;:::-;;;;;;;;;;6535:48;;6619:11;6594:10;6605;6594:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6729:10;6698:15;:28;6714:11;6698:28;;;;;;;;;;;:41;;;;6867:15;:24;6883:7;6867:24;;;;;;;;;;;6860:31;;;6901:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5934:990;;;5863:1061;:::o;3415:217::-;3499:14;3516:20;3533:2;3516:16;:20::i;:::-;3499:37;;3573:7;3546:12;:16;3559:2;3546:16;;;;;;;;;;;;;;;:24;3563:6;3546:24;;;;;;;;;;;:34;;;;3619:6;3590:17;:26;3608:7;3590:26;;;;;;;;;;;:35;;;;3489:143;3415:217;;:::o;9008:372:3:-;9101:1;9087:16;;:2;:16;;;;9079:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9159:16;9167:7;9159;:16::i;:::-;9158:17;9150:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9219:45;9248:1;9252:2;9256:7;9219:20;:45::i;:::-;9292:1;9275:9;:13;9285:2;9275:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9322:2;9303:7;:16;9311:7;9303:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9365:7;9361:2;9340:33;;9357:1;9340:33;;;;;;;;;;;;9008:372;;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;24:722:13:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:137::-;1890:5;1928:6;1915:20;1906:29;;1944:32;1970:5;1944:32;:::i;:::-;1845:137;;;;:::o;1988:141::-;2044:5;2075:6;2069:13;2060:22;;2091:32;2117:5;2091:32;:::i;:::-;1988:141;;;;:::o;2148:338::-;2203:5;2252:3;2245:4;2237:6;2233:17;2229:27;2219:122;;2260:79;;:::i;:::-;2219:122;2377:6;2364:20;2402:78;2476:3;2468:6;2461:4;2453:6;2449:17;2402:78;:::i;:::-;2393:87;;2209:277;2148:338;;;;:::o;2492:139::-;2538:5;2576:6;2563:20;2554:29;;2592:33;2619:5;2592:33;:::i;:::-;2492:139;;;;:::o;2637:329::-;2696:6;2745:2;2733:9;2724:7;2720:23;2716:32;2713:119;;;2751:79;;:::i;:::-;2713:119;2871:1;2896:53;2941:7;2932:6;2921:9;2917:22;2896:53;:::i;:::-;2886:63;;2842:117;2637:329;;;;:::o;2972:474::-;3040:6;3048;3097:2;3085:9;3076:7;3072:23;3068:32;3065:119;;;3103:79;;:::i;:::-;3065:119;3223:1;3248:53;3293:7;3284:6;3273:9;3269:22;3248:53;:::i;:::-;3238:63;;3194:117;3350:2;3376:53;3421:7;3412:6;3401:9;3397:22;3376:53;:::i;:::-;3366:63;;3321:118;2972:474;;;;;:::o;3452:619::-;3529:6;3537;3545;3594:2;3582:9;3573:7;3569:23;3565:32;3562:119;;;3600:79;;:::i;:::-;3562:119;3720:1;3745:53;3790:7;3781:6;3770:9;3766:22;3745:53;:::i;:::-;3735:63;;3691:117;3847:2;3873:53;3918:7;3909:6;3898:9;3894:22;3873:53;:::i;:::-;3863:63;;3818:118;3975:2;4001:53;4046:7;4037:6;4026:9;4022:22;4001:53;:::i;:::-;3991:63;;3946:118;3452:619;;;;;:::o;4077:943::-;4172:6;4180;4188;4196;4245:3;4233:9;4224:7;4220:23;4216:33;4213:120;;;4252:79;;:::i;:::-;4213:120;4372:1;4397:53;4442:7;4433:6;4422:9;4418:22;4397:53;:::i;:::-;4387:63;;4343:117;4499:2;4525:53;4570:7;4561:6;4550:9;4546:22;4525:53;:::i;:::-;4515:63;;4470:118;4627:2;4653:53;4698:7;4689:6;4678:9;4674:22;4653:53;:::i;:::-;4643:63;;4598:118;4783:2;4772:9;4768:18;4755:32;4814:18;4806:6;4803:30;4800:117;;;4836:79;;:::i;:::-;4800:117;4941:62;4995:7;4986:6;4975:9;4971:22;4941:62;:::i;:::-;4931:72;;4726:287;4077:943;;;;;;;:::o;5026:468::-;5091:6;5099;5148:2;5136:9;5127:7;5123:23;5119:32;5116:119;;;5154:79;;:::i;:::-;5116:119;5274:1;5299:53;5344:7;5335:6;5324:9;5320:22;5299:53;:::i;:::-;5289:63;;5245:117;5401:2;5427:50;5469:7;5460:6;5449:9;5445:22;5427:50;:::i;:::-;5417:60;;5372:115;5026:468;;;;;:::o;5500:474::-;5568:6;5576;5625:2;5613:9;5604:7;5600:23;5596:32;5593:119;;;5631:79;;:::i;:::-;5593:119;5751:1;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5722:117;5878:2;5904:53;5949:7;5940:6;5929:9;5925:22;5904:53;:::i;:::-;5894:63;;5849:118;5500:474;;;;;:::o;5980:539::-;6064:6;6113:2;6101:9;6092:7;6088:23;6084:32;6081:119;;;6119:79;;:::i;:::-;6081:119;6267:1;6256:9;6252:17;6239:31;6297:18;6289:6;6286:30;6283:117;;;6319:79;;:::i;:::-;6283:117;6424:78;6494:7;6485:6;6474:9;6470:22;6424:78;:::i;:::-;6414:88;;6210:302;5980:539;;;;:::o;6525:327::-;6583:6;6632:2;6620:9;6611:7;6607:23;6603:32;6600:119;;;6638:79;;:::i;:::-;6600:119;6758:1;6783:52;6827:7;6818:6;6807:9;6803:22;6783:52;:::i;:::-;6773:62;;6729:116;6525:327;;;;:::o;6858:349::-;6927:6;6976:2;6964:9;6955:7;6951:23;6947:32;6944:119;;;6982:79;;:::i;:::-;6944:119;7102:1;7127:63;7182:7;7173:6;7162:9;7158:22;7127:63;:::i;:::-;7117:73;;7073:127;6858:349;;;;:::o;7213:329::-;7272:6;7321:2;7309:9;7300:7;7296:23;7292:32;7289:119;;;7327:79;;:::i;:::-;7289:119;7447:1;7472:53;7517:7;7508:6;7497:9;7493:22;7472:53;:::i;:::-;7462:63;;7418:117;7213:329;;;;:::o;7548:118::-;7635:24;7653:5;7635:24;:::i;:::-;7630:3;7623:37;7548:118;;:::o;7672:109::-;7753:21;7768:5;7753:21;:::i;:::-;7748:3;7741:34;7672:109;;:::o;7787:360::-;7873:3;7901:38;7933:5;7901:38;:::i;:::-;7955:70;8018:6;8013:3;7955:70;:::i;:::-;7948:77;;8034:52;8079:6;8074:3;8067:4;8060:5;8056:16;8034:52;:::i;:::-;8111:29;8133:6;8111:29;:::i;:::-;8106:3;8102:39;8095:46;;7877:270;7787:360;;;;:::o;8153:364::-;8241:3;8269:39;8302:5;8269:39;:::i;:::-;8324:71;8388:6;8383:3;8324:71;:::i;:::-;8317:78;;8404:52;8449:6;8444:3;8437:4;8430:5;8426:16;8404:52;:::i;:::-;8481:29;8503:6;8481:29;:::i;:::-;8476:3;8472:39;8465:46;;8245:272;8153:364;;;;:::o;8523:377::-;8629:3;8657:39;8690:5;8657:39;:::i;:::-;8712:89;8794:6;8789:3;8712:89;:::i;:::-;8705:96;;8810:52;8855:6;8850:3;8843:4;8836:5;8832:16;8810:52;:::i;:::-;8887:6;8882:3;8878:16;8871:23;;8633:267;8523:377;;;;:::o;8906:366::-;9048:3;9069:67;9133:2;9128:3;9069:67;:::i;:::-;9062:74;;9145:93;9234:3;9145:93;:::i;:::-;9263:2;9258:3;9254:12;9247:19;;8906:366;;;:::o;9278:::-;9420:3;9441:67;9505:2;9500:3;9441:67;:::i;:::-;9434:74;;9517:93;9606:3;9517:93;:::i;:::-;9635:2;9630:3;9626:12;9619:19;;9278:366;;;:::o;9650:::-;9792:3;9813:67;9877:2;9872:3;9813:67;:::i;:::-;9806:74;;9889:93;9978:3;9889:93;:::i;:::-;10007:2;10002:3;9998:12;9991:19;;9650:366;;;:::o;10022:::-;10164:3;10185:67;10249:2;10244:3;10185:67;:::i;:::-;10178:74;;10261:93;10350:3;10261:93;:::i;:::-;10379:2;10374:3;10370:12;10363:19;;10022:366;;;:::o;10394:::-;10536:3;10557:67;10621:2;10616:3;10557:67;:::i;:::-;10550:74;;10633:93;10722:3;10633:93;:::i;:::-;10751:2;10746:3;10742:12;10735:19;;10394:366;;;:::o;10766:402::-;10926:3;10947:85;11029:2;11024:3;10947:85;:::i;:::-;10940:92;;11041:93;11130:3;11041:93;:::i;:::-;11159:2;11154:3;11150:12;11143:19;;10766:402;;;:::o;11174:366::-;11316:3;11337:67;11401:2;11396:3;11337:67;:::i;:::-;11330:74;;11413:93;11502:3;11413:93;:::i;:::-;11531:2;11526:3;11522:12;11515:19;;11174:366;;;:::o;11546:::-;11688:3;11709:67;11773:2;11768:3;11709:67;:::i;:::-;11702:74;;11785:93;11874:3;11785:93;:::i;:::-;11903:2;11898:3;11894:12;11887:19;;11546:366;;;:::o;11918:::-;12060:3;12081:67;12145:2;12140:3;12081:67;:::i;:::-;12074:74;;12157:93;12246:3;12157:93;:::i;:::-;12275:2;12270:3;12266:12;12259:19;;11918:366;;;:::o;12290:::-;12432:3;12453:67;12517:2;12512:3;12453:67;:::i;:::-;12446:74;;12529:93;12618:3;12529:93;:::i;:::-;12647:2;12642:3;12638:12;12631:19;;12290:366;;;:::o;12662:::-;12804:3;12825:67;12889:2;12884:3;12825:67;:::i;:::-;12818:74;;12901:93;12990:3;12901:93;:::i;:::-;13019:2;13014:3;13010:12;13003:19;;12662:366;;;:::o;13034:::-;13176:3;13197:67;13261:2;13256:3;13197:67;:::i;:::-;13190:74;;13273:93;13362:3;13273:93;:::i;:::-;13391:2;13386:3;13382:12;13375:19;;13034:366;;;:::o;13406:::-;13548:3;13569:67;13633:2;13628:3;13569:67;:::i;:::-;13562:74;;13645:93;13734:3;13645:93;:::i;:::-;13763:2;13758:3;13754:12;13747:19;;13406:366;;;:::o;13778:::-;13920:3;13941:67;14005:2;14000:3;13941:67;:::i;:::-;13934:74;;14017:93;14106:3;14017:93;:::i;:::-;14135:2;14130:3;14126:12;14119:19;;13778:366;;;:::o;14150:::-;14292:3;14313:67;14377:2;14372:3;14313:67;:::i;:::-;14306:74;;14389:93;14478:3;14389:93;:::i;:::-;14507:2;14502:3;14498:12;14491:19;;14150:366;;;:::o;14522:::-;14664:3;14685:67;14749:2;14744:3;14685:67;:::i;:::-;14678:74;;14761:93;14850:3;14761:93;:::i;:::-;14879:2;14874:3;14870:12;14863:19;;14522:366;;;:::o;14894:::-;15036:3;15057:67;15121:2;15116:3;15057:67;:::i;:::-;15050:74;;15133:93;15222:3;15133:93;:::i;:::-;15251:2;15246:3;15242:12;15235:19;;14894:366;;;:::o;15266:::-;15408:3;15429:67;15493:2;15488:3;15429:67;:::i;:::-;15422:74;;15505:93;15594:3;15505:93;:::i;:::-;15623:2;15618:3;15614:12;15607:19;;15266:366;;;:::o;15638:::-;15780:3;15801:67;15865:2;15860:3;15801:67;:::i;:::-;15794:74;;15877:93;15966:3;15877:93;:::i;:::-;15995:2;15990:3;15986:12;15979:19;;15638:366;;;:::o;16010:::-;16152:3;16173:67;16237:2;16232:3;16173:67;:::i;:::-;16166:74;;16249:93;16338:3;16249:93;:::i;:::-;16367:2;16362:3;16358:12;16351:19;;16010:366;;;:::o;16382:::-;16524:3;16545:67;16609:2;16604:3;16545:67;:::i;:::-;16538:74;;16621:93;16710:3;16621:93;:::i;:::-;16739:2;16734:3;16730:12;16723:19;;16382:366;;;:::o;16754:::-;16896:3;16917:67;16981:2;16976:3;16917:67;:::i;:::-;16910:74;;16993:93;17082:3;16993:93;:::i;:::-;17111:2;17106:3;17102:12;17095:19;;16754:366;;;:::o;17126:::-;17268:3;17289:67;17353:2;17348:3;17289:67;:::i;:::-;17282:74;;17365:93;17454:3;17365:93;:::i;:::-;17483:2;17478:3;17474:12;17467:19;;17126:366;;;:::o;17498:118::-;17585:24;17603:5;17585:24;:::i;:::-;17580:3;17573:37;17498:118;;:::o;17622:541::-;17855:3;17877:148;18021:3;17877:148;:::i;:::-;17870:155;;18042:95;18133:3;18124:6;18042:95;:::i;:::-;18035:102;;18154:3;18147:10;;17622:541;;;;:::o;18169:222::-;18262:4;18300:2;18289:9;18285:18;18277:26;;18313:71;18381:1;18370:9;18366:17;18357:6;18313:71;:::i;:::-;18169:222;;;;:::o;18397:640::-;18592:4;18630:3;18619:9;18615:19;18607:27;;18644:71;18712:1;18701:9;18697:17;18688:6;18644:71;:::i;:::-;18725:72;18793:2;18782:9;18778:18;18769:6;18725:72;:::i;:::-;18807;18875:2;18864:9;18860:18;18851:6;18807:72;:::i;:::-;18926:9;18920:4;18916:20;18911:2;18900:9;18896:18;18889:48;18954:76;19025:4;19016:6;18954:76;:::i;:::-;18946:84;;18397:640;;;;;;;:::o;19043:210::-;19130:4;19168:2;19157:9;19153:18;19145:26;;19181:65;19243:1;19232:9;19228:17;19219:6;19181:65;:::i;:::-;19043:210;;;;:::o;19259:313::-;19372:4;19410:2;19399:9;19395:18;19387:26;;19459:9;19453:4;19449:20;19445:1;19434:9;19430:17;19423:47;19487:78;19560:4;19551:6;19487:78;:::i;:::-;19479:86;;19259:313;;;;:::o;19578:419::-;19744:4;19782:2;19771:9;19767:18;19759:26;;19831:9;19825:4;19821:20;19817:1;19806:9;19802:17;19795:47;19859:131;19985:4;19859:131;:::i;:::-;19851:139;;19578:419;;;:::o;20003:::-;20169:4;20207:2;20196:9;20192:18;20184:26;;20256:9;20250:4;20246:20;20242:1;20231:9;20227:17;20220:47;20284:131;20410:4;20284:131;:::i;:::-;20276:139;;20003:419;;;:::o;20428:::-;20594:4;20632:2;20621:9;20617:18;20609:26;;20681:9;20675:4;20671:20;20667:1;20656:9;20652:17;20645:47;20709:131;20835:4;20709:131;:::i;:::-;20701:139;;20428:419;;;:::o;20853:::-;21019:4;21057:2;21046:9;21042:18;21034:26;;21106:9;21100:4;21096:20;21092:1;21081:9;21077:17;21070:47;21134:131;21260:4;21134:131;:::i;:::-;21126:139;;20853:419;;;:::o;21278:::-;21444:4;21482:2;21471:9;21467:18;21459:26;;21531:9;21525:4;21521:20;21517:1;21506:9;21502:17;21495:47;21559:131;21685:4;21559:131;:::i;:::-;21551:139;;21278:419;;;:::o;21703:::-;21869:4;21907:2;21896:9;21892:18;21884:26;;21956:9;21950:4;21946:20;21942:1;21931:9;21927:17;21920:47;21984:131;22110:4;21984:131;:::i;:::-;21976:139;;21703:419;;;:::o;22128:::-;22294:4;22332:2;22321:9;22317:18;22309:26;;22381:9;22375:4;22371:20;22367:1;22356:9;22352:17;22345:47;22409:131;22535:4;22409:131;:::i;:::-;22401:139;;22128:419;;;:::o;22553:::-;22719:4;22757:2;22746:9;22742:18;22734:26;;22806:9;22800:4;22796:20;22792:1;22781:9;22777:17;22770:47;22834:131;22960:4;22834:131;:::i;:::-;22826:139;;22553:419;;;:::o;22978:::-;23144:4;23182:2;23171:9;23167:18;23159:26;;23231:9;23225:4;23221:20;23217:1;23206:9;23202:17;23195:47;23259:131;23385:4;23259:131;:::i;:::-;23251:139;;22978:419;;;:::o;23403:::-;23569:4;23607:2;23596:9;23592:18;23584:26;;23656:9;23650:4;23646:20;23642:1;23631:9;23627:17;23620:47;23684:131;23810:4;23684:131;:::i;:::-;23676:139;;23403:419;;;:::o;23828:::-;23994:4;24032:2;24021:9;24017:18;24009:26;;24081:9;24075:4;24071:20;24067:1;24056:9;24052:17;24045:47;24109:131;24235:4;24109:131;:::i;:::-;24101:139;;23828:419;;;:::o;24253:::-;24419:4;24457:2;24446:9;24442:18;24434:26;;24506:9;24500:4;24496:20;24492:1;24481:9;24477:17;24470:47;24534:131;24660:4;24534:131;:::i;:::-;24526:139;;24253:419;;;:::o;24678:::-;24844:4;24882:2;24871:9;24867:18;24859:26;;24931:9;24925:4;24921:20;24917:1;24906:9;24902:17;24895:47;24959:131;25085:4;24959:131;:::i;:::-;24951:139;;24678:419;;;:::o;25103:::-;25269:4;25307:2;25296:9;25292:18;25284:26;;25356:9;25350:4;25346:20;25342:1;25331:9;25327:17;25320:47;25384:131;25510:4;25384:131;:::i;:::-;25376:139;;25103:419;;;:::o;25528:::-;25694:4;25732:2;25721:9;25717:18;25709:26;;25781:9;25775:4;25771:20;25767:1;25756:9;25752:17;25745:47;25809:131;25935:4;25809:131;:::i;:::-;25801:139;;25528:419;;;:::o;25953:::-;26119:4;26157:2;26146:9;26142:18;26134:26;;26206:9;26200:4;26196:20;26192:1;26181:9;26177:17;26170:47;26234:131;26360:4;26234:131;:::i;:::-;26226:139;;25953:419;;;:::o;26378:::-;26544:4;26582:2;26571:9;26567:18;26559:26;;26631:9;26625:4;26621:20;26617:1;26606:9;26602:17;26595:47;26659:131;26785:4;26659:131;:::i;:::-;26651:139;;26378:419;;;:::o;26803:::-;26969:4;27007:2;26996:9;26992:18;26984:26;;27056:9;27050:4;27046:20;27042:1;27031:9;27027:17;27020:47;27084:131;27210:4;27084:131;:::i;:::-;27076:139;;26803:419;;;:::o;27228:::-;27394:4;27432:2;27421:9;27417:18;27409:26;;27481:9;27475:4;27471:20;27467:1;27456:9;27452:17;27445:47;27509:131;27635:4;27509:131;:::i;:::-;27501:139;;27228:419;;;:::o;27653:::-;27819:4;27857:2;27846:9;27842:18;27834:26;;27906:9;27900:4;27896:20;27892:1;27881:9;27877:17;27870:47;27934:131;28060:4;27934:131;:::i;:::-;27926:139;;27653:419;;;:::o;28078:::-;28244:4;28282:2;28271:9;28267:18;28259:26;;28331:9;28325:4;28321:20;28317:1;28306:9;28302:17;28295:47;28359:131;28485:4;28359:131;:::i;:::-;28351:139;;28078:419;;;:::o;28503:::-;28669:4;28707:2;28696:9;28692:18;28684:26;;28756:9;28750:4;28746:20;28742:1;28731:9;28727:17;28720:47;28784:131;28910:4;28784:131;:::i;:::-;28776:139;;28503:419;;;:::o;28928:222::-;29021:4;29059:2;29048:9;29044:18;29036:26;;29072:71;29140:1;29129:9;29125:17;29116:6;29072:71;:::i;:::-;28928:222;;;;:::o;29156:129::-;29190:6;29217:20;;:::i;:::-;29207:30;;29246:33;29274:4;29266:6;29246:33;:::i;:::-;29156:129;;;:::o;29291:75::-;29324:6;29357:2;29351:9;29341:19;;29291:75;:::o;29372:311::-;29449:4;29539:18;29531:6;29528:30;29525:56;;;29561:18;;:::i;:::-;29525:56;29611:4;29603:6;29599:17;29591:25;;29671:4;29665;29661:15;29653:23;;29372:311;;;:::o;29689:307::-;29750:4;29840:18;29832:6;29829:30;29826:56;;;29862:18;;:::i;:::-;29826:56;29900:29;29922:6;29900:29;:::i;:::-;29892:37;;29984:4;29978;29974:15;29966:23;;29689:307;;;:::o;30002:98::-;30053:6;30087:5;30081:12;30071:22;;30002:98;;;:::o;30106:99::-;30158:6;30192:5;30186:12;30176:22;;30106:99;;;:::o;30211:168::-;30294:11;30328:6;30323:3;30316:19;30368:4;30363:3;30359:14;30344:29;;30211:168;;;;:::o;30385:169::-;30469:11;30503:6;30498:3;30491:19;30543:4;30538:3;30534:14;30519:29;;30385:169;;;;:::o;30560:148::-;30662:11;30699:3;30684:18;;30560:148;;;;:::o;30714:305::-;30754:3;30773:20;30791:1;30773:20;:::i;:::-;30768:25;;30807:20;30825:1;30807:20;:::i;:::-;30802:25;;30961:1;30893:66;30889:74;30886:1;30883:81;30880:107;;;30967:18;;:::i;:::-;30880:107;31011:1;31008;31004:9;30997:16;;30714:305;;;;:::o;31025:185::-;31065:1;31082:20;31100:1;31082:20;:::i;:::-;31077:25;;31116:20;31134:1;31116:20;:::i;:::-;31111:25;;31155:1;31145:35;;31160:18;;:::i;:::-;31145:35;31202:1;31199;31195:9;31190:14;;31025:185;;;;:::o;31216:348::-;31256:7;31279:20;31297:1;31279:20;:::i;:::-;31274:25;;31313:20;31331:1;31313:20;:::i;:::-;31308:25;;31501:1;31433:66;31429:74;31426:1;31423:81;31418:1;31411:9;31404:17;31400:105;31397:131;;;31508:18;;:::i;:::-;31397:131;31556:1;31553;31549:9;31538:20;;31216:348;;;;:::o;31570:191::-;31610:4;31630:20;31648:1;31630:20;:::i;:::-;31625:25;;31664:20;31682:1;31664:20;:::i;:::-;31659:25;;31703:1;31700;31697:8;31694:34;;;31708:18;;:::i;:::-;31694:34;31753:1;31750;31746:9;31738:17;;31570:191;;;;:::o;31767:96::-;31804:7;31833:24;31851:5;31833:24;:::i;:::-;31822:35;;31767:96;;;:::o;31869:90::-;31903:7;31946:5;31939:13;31932:21;31921:32;;31869:90;;;:::o;31965:149::-;32001:7;32041:66;32034:5;32030:78;32019:89;;31965:149;;;:::o;32120:126::-;32157:7;32197:42;32190:5;32186:54;32175:65;;32120:126;;;:::o;32252:77::-;32289:7;32318:5;32307:16;;32252:77;;;:::o;32335:154::-;32419:6;32414:3;32409;32396:30;32481:1;32472:6;32467:3;32463:16;32456:27;32335:154;;;:::o;32495:307::-;32563:1;32573:113;32587:6;32584:1;32581:13;32573:113;;;32672:1;32667:3;32663:11;32657:18;32653:1;32648:3;32644:11;32637:39;32609:2;32606:1;32602:10;32597:15;;32573:113;;;32704:6;32701:1;32698:13;32695:101;;;32784:1;32775:6;32770:3;32766:16;32759:27;32695:101;32544:258;32495:307;;;:::o;32808:171::-;32847:3;32870:24;32888:5;32870:24;:::i;:::-;32861:33;;32916:4;32909:5;32906:15;32903:41;;;32924:18;;:::i;:::-;32903:41;32971:1;32964:5;32960:13;32953:20;;32808:171;;;:::o;32985:320::-;33029:6;33066:1;33060:4;33056:12;33046:22;;33113:1;33107:4;33103:12;33134:18;33124:81;;33190:4;33182:6;33178:17;33168:27;;33124:81;33252:2;33244:6;33241:14;33221:18;33218:38;33215:84;;;33271:18;;:::i;:::-;33215:84;33036:269;32985:320;;;:::o;33311:281::-;33394:27;33416:4;33394:27;:::i;:::-;33386:6;33382:40;33524:6;33512:10;33509:22;33488:18;33476:10;33473:34;33470:62;33467:88;;;33535:18;;:::i;:::-;33467:88;33575:10;33571:2;33564:22;33354:238;33311:281;;:::o;33598:233::-;33637:3;33660:24;33678:5;33660:24;:::i;:::-;33651:33;;33706:66;33699:5;33696:77;33693:103;;;33776:18;;:::i;:::-;33693:103;33823:1;33816:5;33812:13;33805:20;;33598:233;;;:::o;33837:176::-;33869:1;33886:20;33904:1;33886:20;:::i;:::-;33881:25;;33920:20;33938:1;33920:20;:::i;:::-;33915:25;;33959:1;33949:35;;33964:18;;:::i;:::-;33949:35;34005:1;34002;33998:9;33993:14;;33837:176;;;;:::o;34019:180::-;34067:77;34064:1;34057:88;34164:4;34161:1;34154:15;34188:4;34185:1;34178:15;34205:180;34253:77;34250:1;34243:88;34350:4;34347:1;34340:15;34374:4;34371:1;34364:15;34391:180;34439:77;34436:1;34429:88;34536:4;34533:1;34526:15;34560:4;34557:1;34550:15;34577:180;34625:77;34622:1;34615:88;34722:4;34719:1;34712:15;34746:4;34743:1;34736:15;34763:180;34811:77;34808:1;34801:88;34908:4;34905:1;34898:15;34932:4;34929:1;34922:15;34949:180;34997:77;34994:1;34987:88;35094:4;35091:1;35084:15;35118:4;35115:1;35108:15;35135:117;35244:1;35241;35234:12;35258:117;35367:1;35364;35357:12;35381:117;35490:1;35487;35480:12;35504:117;35613:1;35610;35603:12;35627:117;35736:1;35733;35726:12;35750:102;35791:6;35842:2;35838:7;35833:2;35826:5;35822:14;35818:28;35808:38;;35750:102;;;:::o;35858:230::-;35998:34;35994:1;35986:6;35982:14;35975:58;36067:13;36062:2;36054:6;36050:15;36043:38;35858:230;:::o;36094:231::-;36234:34;36230:1;36222:6;36218:14;36211:58;36303:14;36298:2;36290:6;36286:15;36279:39;36094:231;:::o;36331:237::-;36471:34;36467:1;36459:6;36455:14;36448:58;36540:20;36535:2;36527:6;36523:15;36516:45;36331:237;:::o;36574:225::-;36714:34;36710:1;36702:6;36698:14;36691:58;36783:8;36778:2;36770:6;36766:15;36759:33;36574:225;:::o;36805:178::-;36945:30;36941:1;36933:6;36929:14;36922:54;36805:178;:::o;36989:182::-;37129:30;37125:1;37117:6;37113:14;37106:54;36989:182;:::o;37181:235::-;37325:34;37321:1;37313:6;37309:14;37302:58;37398:6;37393:2;37385:6;37381:15;37374:31;37181:235;:::o;37426:183::-;37570:27;37566:1;37558:6;37554:14;37547:51;37426:183;:::o;37619:243::-;37763:34;37759:1;37751:6;37747:14;37740:58;37836:14;37831:2;37823:6;37819:15;37812:39;37619:243;:::o;37872:187::-;38016:31;38012:1;38004:6;38000:14;37993:55;37872:187;:::o;38069:255::-;38213:34;38209:1;38201:6;38197:14;38190:58;38286:26;38281:2;38273:6;38269:15;38262:51;38069:255;:::o;38334:241::-;38478:34;38474:1;38466:6;38462:14;38455:58;38551:12;38546:2;38538:6;38534:15;38527:37;38334:241;:::o;38585:236::-;38729:34;38725:1;38717:6;38713:14;38706:58;38802:7;38797:2;38789:6;38785:15;38778:32;38585:236;:::o;38831:240::-;38975:34;38971:1;38963:6;38959:14;38952:58;39048:11;39043:2;39035:6;39031:15;39024:36;38831:240;:::o;39081:190::-;39225:34;39221:1;39213:6;39209:14;39202:58;39081:190;:::o;39281:243::-;39425:34;39421:1;39413:6;39409:14;39402:58;39498:14;39493:2;39485:6;39481:15;39474:39;39281:243;:::o;39534:190::-;39678:34;39674:1;39666:6;39662:14;39655:58;39534:190;:::o;39734:240::-;39878:34;39874:1;39866:6;39862:14;39855:58;39951:11;39946:2;39938:6;39934:15;39927:36;39734:240;:::o;39984:188::-;40128:32;40124:1;40116:6;40112:14;40105:56;39984:188;:::o;40182:232::-;40326:34;40322:1;40314:6;40310:14;40303:58;40399:3;40394:2;40386:6;40382:15;40375:28;40182:232;:::o;40424:248::-;40568:34;40564:1;40556:6;40552:14;40545:58;40641:19;40636:2;40628:6;40624:15;40617:44;40424:248;:::o;40682:243::-;40826:34;40822:1;40814:6;40810:14;40803:58;40899:14;40894:2;40886:6;40882:15;40875:39;40682:243;:::o;40935:184::-;41079:28;41075:1;41067:6;41063:14;41056:52;40935:184;:::o;41129:130::-;41206:24;41224:5;41206:24;:::i;:::-;41199:5;41196:35;41186:63;;41245:1;41242;41235:12;41186:63;41129:130;:::o;41269:124::-;41343:21;41358:5;41343:21;:::i;:::-;41336:5;41333:32;41323:60;;41379:1;41376;41369:12;41323:60;41269:124;:::o;41403:128::-;41479:23;41496:5;41479:23;:::i;:::-;41472:5;41469:34;41459:62;;41517:1;41514;41507:12;41459:62;41403:128;:::o;41541:130::-;41618:24;41636:5;41618:24;:::i;:::-;41611:5;41608:35;41598:63;;41657:1;41654;41647:12;41598:63;41541:130;:::o

Swarm Source

ipfs://2cba23b18f075d44ce83ea269685b3160cadbf61cdfd71885adbfc663cc123a3
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.