ETH Price: $3,353.19 (+2.39%)
Gas: 4 Gwei

Token

The Martian Mansion (TMM)
 

Overview

Max Total Supply

1,200 TMM

Holders

190

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 TMM
0xa80176a1ab0915c43cdea20272abeffee9ea04e7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Discover a new way of life and become immersed in our extraterrestrial world.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MartianMansion

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 11 of 14: MartianMansion.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;
import "./ERC721.sol";
import "./Ownable.sol";
import "./Strings.sol";
import "./Address.sol";
import "./MerkleProof.sol";

contract MartianMansion is ERC721, Ownable {
    using Strings for uint256;

    string public baseURI;
    string public baseExtension = ".json";
    string public notRevealedUri;
    uint256 public cost = 0.03 ether;
    uint256 public costWL = 0.03 ether;
    uint256 public maxSupply = 1200;
    uint256 public maxMintAmountWL = 10;
    uint256 public maxMintAmount = 10;
    uint256 public nftPerAddressLimitWL = 10;
    uint256 public nftPerAddressLimit = 10;
    uint256 allTokens = 0;
    bool public revealed = true;
    mapping(address => uint256) public addressMintedBalance;

    uint256 public currentState = 1;
    address[] public whitelistedAddresses;

    bytes32 public merkleRootWhitelist =
        0x9d2af9a2bb58d43c5fbe37139a71186dbe2bd63b3c8b1e12f0941b24b8f59bc0;

    constructor() ERC721("The Martian Mansion", "TMM") {
        setBaseURI(
            "ipfs://QmPHcao5BrxiZr2fvSor221x7iF4NFANoEbmKs8AF6DRvy/"
        );
    }

    // internal
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function mint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable {
        uint256 supply = totalSupply();
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");
        if (msg.sender != owner()) {
            require(currentState > 0, "the contract is paused");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];

            if (currentState == 1) {
                require(isWhitelisted(msg.sender, _merkleProof), "user is not whitelisted");
                require(
                    msg.value >= costWL * _mintAmount,
                    "insufficient funds"
                );
                require(
                    _mintAmount <= maxMintAmountWL,
                    "max mint amount per session exceeded"
                );
                require(
                    ownerMintedCount + _mintAmount <= nftPerAddressLimitWL,
                    "max NFT per address exceeded"
                );
            } else {
                require(msg.value >= cost * _mintAmount, "insufficient funds");
            }
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            _safeMint(msg.sender, supply + i);
            allTokens++;
        }
    }

    function totalSupply() public view returns (uint256) {
        return allTokens;
    }

    function isWhitelisted(address _user, bytes32[] calldata _merkleProof) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(_user));
        require(
            MerkleProof.verify(_merkleProof, merkleRootWhitelist, leaf),
            "Invalid Merkle Proof."
        );
        return true;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return notRevealedUri;
        }

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

    //only owner
    function reveal() public onlyOwner {
        revealed = true;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

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

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function pause() public onlyOwner {
        currentState = 0;
    }

    function setOnlyWhitelisted() public onlyOwner {
        currentState = 1;
    }

    function setPublic() public onlyOwner {
        currentState = 2;
    }

    function setMerkleRoot(bytes32 _newMerkleRoot) public onlyOwner {
        merkleRootWhitelist = _newMerkleRoot;
    }

    function setPublicCost(uint256 _price) public onlyOwner {
        cost = _price;
    }

    function setWLCost(uint256 _price) public onlyOwner {
        costWL = _price;
    }

    function withdraw() public payable onlyOwner {
        // This will payout the owner the contract balance.
        // Do not remove this otherwise you will not be able to withdraw the funds.
        // =============================================================================
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
        // =============================================================================
    }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

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

/**
 * @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 14: Context.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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 14: ERC165.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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 14: ERC721.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;
import './Address.sol';
import './Strings.sol';
import './Context.sol';
import './ERC165.sol';
import './IERC721.sol';
import './IERC721Metadata.sol';
import './IERC721Receiver.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
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _balances[to] += 1;
        _owners[tokenId] = to;

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

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

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

        // Clear approvals
        _approve(address(0), tokenId);

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.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 14: ERC721Enumerable.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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 14: IERC165.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
/**
 * @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 14: IERC721.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import './IERC165.sol';

// File: @openzeppelin/contracts/token/ERC721/IERC721.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 14: IERC721Enumerable.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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 14: IERC721Metadata.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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 14: IERC721Receiver.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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 12 of 14: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

File 13 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 14 of 14: Strings.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.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":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootWhitelist","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimitWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setWLCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060089080519060200190620000519291906200036f565b50666a94d74f430000600a55666a94d74f430000600b556104b0600c55600a600d55600a600e55600a600f55600a60105560006011556001601260006101000a81548160ff02191690831515021790555060016014557f9d2af9a2bb58d43c5fbe37139a71186dbe2bd63b3c8b1e12f0941b24b8f59bc060001b601655348015620000db57600080fd5b506040518060400160405280601381526020017f546865204d61727469616e204d616e73696f6e000000000000000000000000008152506040518060400160405280600381526020017f544d4d00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001609291906200036f565b508060019080519060200190620001799291906200036f565b5050506200019c62000190620001cc60201b60201c565b620001d460201b60201c565b620001c66040518060600160405280603681526020016200507d603691396200029a60201b60201c565b62000507565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002aa620001cc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d06200034560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000329576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003209062000446565b60405180910390fd5b8060079080519060200190620003419291906200036f565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200037d9062000479565b90600052602060002090601f016020900481019282620003a15760008555620003ed565b82601f10620003bc57805160ff1916838001178555620003ed565b82800160010185558215620003ed579182015b82811115620003ec578251825591602001919060010190620003cf565b5b509050620003fc919062000400565b5090565b5b808211156200041b57600081600090555060010162000401565b5090565b60006200042e60208362000468565b91506200043b82620004de565b602082019050919050565b6000602082019050818103600083015262000461816200041f565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200049257607f821691505b60208210811415620004a957620004a8620004af565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614b6680620005176000396000f3fe6080604052600436106102935760003560e01c806377e563571161015a578063ba41b0c6116100c1578063d1d192131161007a578063d1d192131461098c578063d5abeb01146109b5578063da3ef23f146109e0578063e985e9c514610a09578063f2c4ce1e14610a46578063f2fde38b14610a6f57610293565b8063ba41b0c614610877578063ba4e5c4914610893578063ba7d2c76146108d0578063c6682862146108fb578063c87b56dd14610926578063d0eb26b01461096357610293565b80638da5cb5b116101135780638da5cb5b1461078d5780638e1f9cfe146107b857806395d89b41146107e3578063a22cb4651461080e578063a475b5dd14610837578063b88d4fde1461084e57610293565b806377e56357146106b95780637cb64759146106d05780637f00c7a6146106f9578063811d2437146107225780638456cb591461074b578063872d10ea1461076257610293565b806323b872dd116101fe57806355f804b3116101b757806355f804b3146105975780635a23dd99146105c05780636352211e146105fd5780636c0360eb1461063a57806370a0823114610665578063715018a6146106a257610293565b806323b872dd146104d0578063295e4c33146104f95780633ccfd60b1461051057806342842e0e1461051a57806344a0d68a14610543578063518302271461056c57610293565b80630c3f6acf116102505780630c3f6acf146103bc57806313093b1d146103e757806313faede61461041257806318160ddd1461043d57806318cae26914610468578063239c70ae146104a557610293565b806301ffc9a71461029857806306afd592146102d557806306fdde0314610300578063081812fc1461032b578063081c8c4414610368578063095ea7b314610393575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba91906135de565b610a98565b6040516102cc9190613cdd565b60405180910390f35b3480156102e157600080fd5b506102ea610b7a565b6040516102f79190614035565b60405180910390f35b34801561030c57600080fd5b50610315610b80565b6040516103229190613d13565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190613671565b610c12565b60405161035f9190613c76565b60405180910390f35b34801561037457600080fd5b5061037d610c97565b60405161038a9190613d13565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190613579565b610d25565b005b3480156103c857600080fd5b506103d1610e3d565b6040516103de9190614035565b60405180910390f35b3480156103f357600080fd5b506103fc610e43565b6040516104099190614035565b60405180910390f35b34801561041e57600080fd5b50610427610e49565b6040516104349190614035565b60405180910390f35b34801561044957600080fd5b50610452610e4f565b60405161045f9190614035565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a91906133b6565b610e59565b60405161049c9190614035565b60405180910390f35b3480156104b157600080fd5b506104ba610e71565b6040516104c79190614035565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f2919061341b565b610e77565b005b34801561050557600080fd5b5061050e610ed7565b005b610518610f5d565b005b34801561052657600080fd5b50610541600480360381019061053c919061341b565b611059565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613671565b611079565b005b34801561057857600080fd5b506105816110ff565b60405161058e9190613cdd565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b99190613630565b611112565b005b3480156105cc57600080fd5b506105e760048036038101906105e291906134e5565b6111a8565b6040516105f49190613cdd565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613671565b61126d565b6040516106319190613c76565b60405180910390f35b34801561064657600080fd5b5061064f61131f565b60405161065c9190613d13565b60405180910390f35b34801561067157600080fd5b5061068c600480360381019061068791906133b6565b6113ad565b6040516106999190614035565b60405180910390f35b3480156106ae57600080fd5b506106b7611465565b005b3480156106c557600080fd5b506106ce6114ed565b005b3480156106dc57600080fd5b506106f760048036038101906106f291906135b5565b611573565b005b34801561070557600080fd5b50610720600480360381019061071b9190613671565b6115f9565b005b34801561072e57600080fd5b5061074960048036038101906107449190613671565b61167f565b005b34801561075757600080fd5b50610760611705565b005b34801561076e57600080fd5b5061077761178b565b6040516107849190614035565b60405180910390f35b34801561079957600080fd5b506107a2611791565b6040516107af9190613c76565b60405180910390f35b3480156107c457600080fd5b506107cd6117bb565b6040516107da9190613cf8565b60405180910390f35b3480156107ef57600080fd5b506107f86117c1565b6040516108059190613d13565b60405180910390f35b34801561081a57600080fd5b506108356004803603810190610830919061353d565b611853565b005b34801561084357600080fd5b5061084c6119d4565b005b34801561085a57600080fd5b506108756004803603810190610870919061346a565b611a6d565b005b610891600480360381019061088c919061369a565b611acf565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190613671565b611e6d565b6040516108c79190613c76565b60405180910390f35b3480156108dc57600080fd5b506108e5611eac565b6040516108f29190614035565b60405180910390f35b34801561090757600080fd5b50610910611eb2565b60405161091d9190613d13565b60405180910390f35b34801561093257600080fd5b5061094d60048036038101906109489190613671565b611f40565b60405161095a9190613d13565b60405180910390f35b34801561096f57600080fd5b5061098a60048036038101906109859190613671565b612099565b005b34801561099857600080fd5b506109b360048036038101906109ae9190613671565b61211f565b005b3480156109c157600080fd5b506109ca6121a5565b6040516109d79190614035565b60405180910390f35b3480156109ec57600080fd5b50610a076004803603810190610a029190613630565b6121ab565b005b348015610a1557600080fd5b50610a306004803603810190610a2b91906133df565b612241565b604051610a3d9190613cdd565b60405180910390f35b348015610a5257600080fd5b50610a6d6004803603810190610a689190613630565b6122d5565b005b348015610a7b57600080fd5b50610a966004803603810190610a9191906133b6565b61236b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b735750610b7282612463565b5b9050919050565b600b5481565b606060008054610b8f9061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbb9061430f565b8015610c085780601f10610bdd57610100808354040283529160200191610c08565b820191906000526020600020905b815481529060010190602001808311610beb57829003601f168201915b5050505050905090565b6000610c1d826124cd565b610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390613ef5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610ca49061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd09061430f565b8015610d1d5780601f10610cf257610100808354040283529160200191610d1d565b820191906000526020600020905b815481529060010190602001808311610d0057829003601f168201915b505050505081565b6000610d308261126d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890613f95565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dc0612539565b73ffffffffffffffffffffffffffffffffffffffff161480610def5750610dee81610de9612539565b612241565b5b610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590613e35565b60405180910390fd5b610e388383612541565b505050565b60145481565b600d5481565b600a5481565b6000601154905090565b60136020528060005260406000206000915090505481565b600e5481565b610e88610e82612539565b826125fa565b610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe90613fd5565b60405180910390fd5b610ed28383836126d8565b505050565b610edf612539565b73ffffffffffffffffffffffffffffffffffffffff16610efd611791565b73ffffffffffffffffffffffffffffffffffffffff1614610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90613f15565b60405180910390fd5b6001601481905550565b610f65612539565b73ffffffffffffffffffffffffffffffffffffffff16610f83611791565b73ffffffffffffffffffffffffffffffffffffffff1614610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090613f15565b60405180910390fd5b6000610fe3611791565b73ffffffffffffffffffffffffffffffffffffffff164760405161100690613c61565b60006040518083038185875af1925050503d8060008114611043576040519150601f19603f3d011682016040523d82523d6000602084013e611048565b606091505b505090508061105657600080fd5b50565b61107483838360405180602001604052806000815250611a6d565b505050565b611081612539565b73ffffffffffffffffffffffffffffffffffffffff1661109f611791565b73ffffffffffffffffffffffffffffffffffffffff16146110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90613f15565b60405180910390fd5b80600a8190555050565b601260009054906101000a900460ff1681565b61111a612539565b73ffffffffffffffffffffffffffffffffffffffff16611138611791565b73ffffffffffffffffffffffffffffffffffffffff161461118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590613f15565b60405180910390fd5b80600790805190602001906111a492919061317b565b5050565b600080846040516020016111bc9190613be9565b604051602081830303815290604052805190602001209050611222848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165483612934565b611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890613df5565b60405180910390fd5b60019150509392505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d90613e75565b60405180910390fd5b80915050919050565b6007805461132c9061430f565b80601f01602080910402602001604051908101604052809291908181526020018280546113589061430f565b80156113a55780601f1061137a576101008083540402835291602001916113a5565b820191906000526020600020905b81548152906001019060200180831161138857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590613e55565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61146d612539565b73ffffffffffffffffffffffffffffffffffffffff1661148b611791565b73ffffffffffffffffffffffffffffffffffffffff16146114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890613f15565b60405180910390fd5b6114eb600061294b565b565b6114f5612539565b73ffffffffffffffffffffffffffffffffffffffff16611513611791565b73ffffffffffffffffffffffffffffffffffffffff1614611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090613f15565b60405180910390fd5b6002601481905550565b61157b612539565b73ffffffffffffffffffffffffffffffffffffffff16611599611791565b73ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690613f15565b60405180910390fd5b8060168190555050565b611601612539565b73ffffffffffffffffffffffffffffffffffffffff1661161f611791565b73ffffffffffffffffffffffffffffffffffffffff1614611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90613f15565b60405180910390fd5b80600e8190555050565b611687612539565b73ffffffffffffffffffffffffffffffffffffffff166116a5611791565b73ffffffffffffffffffffffffffffffffffffffff16146116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613f15565b60405180910390fd5b80600a8190555050565b61170d612539565b73ffffffffffffffffffffffffffffffffffffffff1661172b611791565b73ffffffffffffffffffffffffffffffffffffffff1614611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890613f15565b60405180910390fd5b6000601481905550565b600f5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60165481565b6060600180546117d09061430f565b80601f01602080910402602001604051908101604052809291908181526020018280546117fc9061430f565b80156118495780601f1061181e57610100808354040283529160200191611849565b820191906000526020600020905b81548152906001019060200180831161182c57829003601f168201915b5050505050905090565b61185b612539565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090613dd5565b60405180910390fd5b80600560006118d6612539565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611983612539565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119c89190613cdd565b60405180910390a35050565b6119dc612539565b73ffffffffffffffffffffffffffffffffffffffff166119fa611791565b73ffffffffffffffffffffffffffffffffffffffff1614611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4790613f15565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b611a7e611a78612539565b836125fa565b611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab490613fd5565b60405180910390fd5b611ac984848484612a11565b50505050565b6000611ad9610e4f565b905060008411611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1590614015565b60405180910390fd5b600c548482611b2d919061413a565b1115611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6590613e95565b60405180910390fd5b611b76611791565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dc357600060145411611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be490613f35565b60405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060016014541415611d7057611c473385856111a8565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90613ff5565b60405180910390fd5b84600b54611c9491906141c1565b341015611cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccd90613fb5565b60405180910390fd5b600d54851115611d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1290613eb5565b60405180910390fd5b600f548582611d2a919061413a565b1115611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6290613d95565b60405180910390fd5b611dc1565b84600a54611d7e91906141c1565b341015611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db790613fb5565b60405180910390fd5b5b505b6000600190505b848111611e6657601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611e2190614372565b9190505550611e3b338284611e36919061413a565b612a6d565b60116000815480929190611e4e90614372565b91905055508080611e5e90614372565b915050611dca565b5050505050565b60158181548110611e7d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b60088054611ebf9061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054611eeb9061430f565b8015611f385780601f10611f0d57610100808354040283529160200191611f38565b820191906000526020600020905b815481529060010190602001808311611f1b57829003601f168201915b505050505081565b6060611f4b826124cd565b611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8190613f75565b60405180910390fd5b60001515601260009054906101000a900460ff16151514156120385760098054611fb39061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054611fdf9061430f565b801561202c5780601f106120015761010080835404028352916020019161202c565b820191906000526020600020905b81548152906001019060200180831161200f57829003601f168201915b50505050509050612094565b6000612042612a8b565b905060008151116120625760405180602001604052806000815250612090565b8061206c84612b1d565b600860405160200161208093929190613c30565b6040516020818303038152906040525b9150505b919050565b6120a1612539565b73ffffffffffffffffffffffffffffffffffffffff166120bf611791565b73ffffffffffffffffffffffffffffffffffffffff1614612115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210c90613f15565b60405180910390fd5b8060108190555050565b612127612539565b73ffffffffffffffffffffffffffffffffffffffff16612145611791565b73ffffffffffffffffffffffffffffffffffffffff161461219b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219290613f15565b60405180910390fd5b80600b8190555050565b600c5481565b6121b3612539565b73ffffffffffffffffffffffffffffffffffffffff166121d1611791565b73ffffffffffffffffffffffffffffffffffffffff1614612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e90613f15565b60405180910390fd5b806008908051906020019061223d92919061317b565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122dd612539565b73ffffffffffffffffffffffffffffffffffffffff166122fb611791565b73ffffffffffffffffffffffffffffffffffffffff1614612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890613f15565b60405180910390fd5b806009908051906020019061236792919061317b565b5050565b612373612539565b73ffffffffffffffffffffffffffffffffffffffff16612391611791565b73ffffffffffffffffffffffffffffffffffffffff16146123e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123de90613f15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e90613d55565b60405180910390fd5b6124608161294b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125b48361126d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612605826124cd565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90613e15565b60405180910390fd5b600061264f8361126d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126be57508373ffffffffffffffffffffffffffffffffffffffff166126a684610c12565b73ffffffffffffffffffffffffffffffffffffffff16145b806126cf57506126ce8185612241565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126f88261126d565b73ffffffffffffffffffffffffffffffffffffffff161461274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590613f55565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b590613db5565b60405180910390fd5b6127c9838383612cca565b6127d4600082612541565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612824919061421b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287b919061413a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000826129418584612ccf565b1490509392505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a1c8484846126d8565b612a2884848484612da8565b612a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5e90613d35565b60405180910390fd5b50505050565b612a87828260405180602001604052806000815250612f3f565b5050565b606060078054612a9a9061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054612ac69061430f565b8015612b135780601f10612ae857610100808354040283529160200191612b13565b820191906000526020600020905b815481529060010190602001808311612af657829003601f168201915b5050505050905090565b60606000821415612b65576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cc5565b600082905060005b60008214612b97578080612b8090614372565b915050600a82612b909190614190565b9150612b6d565b60008167ffffffffffffffff811115612bd9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c0b5781602001600182028036833780820191505090505b5090505b60008514612cbe57600182612c24919061421b565b9150600a85612c3391906143e9565b6030612c3f919061413a565b60f81b818381518110612c7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cb79190614190565b9450612c0f565b8093505050505b919050565b505050565b60008082905060005b8451811015612d9d576000858281518110612d1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612d5d578281604051602001612d40929190613c04565b604051602081830303815290604052805190602001209250612d89565b8083604051602001612d70929190613c04565b6040516020818303038152906040528051906020012092505b508080612d9590614372565b915050612cd8565b508091505092915050565b6000612dc98473ffffffffffffffffffffffffffffffffffffffff16612f9a565b15612f32578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df2612539565b8786866040518563ffffffff1660e01b8152600401612e149493929190613c91565b602060405180830381600087803b158015612e2e57600080fd5b505af1925050508015612e5f57506040513d601f19601f82011682018060405250810190612e5c9190613607565b60015b612ee2573d8060008114612e8f576040519150601f19603f3d011682016040523d82523d6000602084013e612e94565b606091505b50600081511415612eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed190613d35565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f37565b600190505b949350505050565b612f498383612fad565b612f566000848484612da8565b612f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8c90613d35565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561301d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301490613ed5565b60405180910390fd5b613026816124cd565b15613066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305d90613d75565b60405180910390fd5b61307260008383612cca565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130c2919061413a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546131879061430f565b90600052602060002090601f0160209004810192826131a957600085556131f0565b82601f106131c257805160ff19168380011785556131f0565b828001600101855582156131f0579182015b828111156131ef5782518255916020019190600101906131d4565b5b5090506131fd9190613201565b5090565b5b8082111561321a576000816000905550600101613202565b5090565b600061323161322c84614075565b614050565b90508281526020810184848401111561324957600080fd5b6132548482856142cd565b509392505050565b600061326f61326a846140a6565b614050565b90508281526020810184848401111561328757600080fd5b6132928482856142cd565b509392505050565b6000813590506132a981614abd565b92915050565b60008083601f8401126132c157600080fd5b8235905067ffffffffffffffff8111156132da57600080fd5b6020830191508360208202830111156132f257600080fd5b9250929050565b60008135905061330881614ad4565b92915050565b60008135905061331d81614aeb565b92915050565b60008135905061333281614b02565b92915050565b60008151905061334781614b02565b92915050565b600082601f83011261335e57600080fd5b813561336e84826020860161321e565b91505092915050565b600082601f83011261338857600080fd5b813561339884826020860161325c565b91505092915050565b6000813590506133b081614b19565b92915050565b6000602082840312156133c857600080fd5b60006133d68482850161329a565b91505092915050565b600080604083850312156133f257600080fd5b60006134008582860161329a565b92505060206134118582860161329a565b9150509250929050565b60008060006060848603121561343057600080fd5b600061343e8682870161329a565b935050602061344f8682870161329a565b9250506040613460868287016133a1565b9150509250925092565b6000806000806080858703121561348057600080fd5b600061348e8782880161329a565b945050602061349f8782880161329a565b93505060406134b0878288016133a1565b925050606085013567ffffffffffffffff8111156134cd57600080fd5b6134d98782880161334d565b91505092959194509250565b6000806000604084860312156134fa57600080fd5b60006135088682870161329a565b935050602084013567ffffffffffffffff81111561352557600080fd5b613531868287016132af565b92509250509250925092565b6000806040838503121561355057600080fd5b600061355e8582860161329a565b925050602061356f858286016132f9565b9150509250929050565b6000806040838503121561358c57600080fd5b600061359a8582860161329a565b92505060206135ab858286016133a1565b9150509250929050565b6000602082840312156135c757600080fd5b60006135d58482850161330e565b91505092915050565b6000602082840312156135f057600080fd5b60006135fe84828501613323565b91505092915050565b60006020828403121561361957600080fd5b600061362784828501613338565b91505092915050565b60006020828403121561364257600080fd5b600082013567ffffffffffffffff81111561365c57600080fd5b61366884828501613377565b91505092915050565b60006020828403121561368357600080fd5b6000613691848285016133a1565b91505092915050565b6000806000604084860312156136af57600080fd5b60006136bd868287016133a1565b935050602084013567ffffffffffffffff8111156136da57600080fd5b6136e6868287016132af565b92509250509250925092565b6136fb8161424f565b82525050565b61371261370d8261424f565b6143bb565b82525050565b61372181614261565b82525050565b6137308161426d565b82525050565b6137476137428261426d565b6143cd565b82525050565b6000613758826140ec565b6137628185614102565b93506137728185602086016142dc565b61377b816144d6565b840191505092915050565b6000613791826140f7565b61379b818561411e565b93506137ab8185602086016142dc565b6137b4816144d6565b840191505092915050565b60006137ca826140f7565b6137d4818561412f565b93506137e48185602086016142dc565b80840191505092915050565b600081546137fd8161430f565b613807818661412f565b94506001821660008114613822576001811461383357613866565b60ff19831686528186019350613866565b61383c856140d7565b60005b8381101561385e5781548189015260018201915060208101905061383f565b838801955050505b50505092915050565b600061387c60328361411e565b9150613887826144f4565b604082019050919050565b600061389f60268361411e565b91506138aa82614543565b604082019050919050565b60006138c2601c8361411e565b91506138cd82614592565b602082019050919050565b60006138e5601c8361411e565b91506138f0826145bb565b602082019050919050565b600061390860248361411e565b9150613913826145e4565b604082019050919050565b600061392b60198361411e565b915061393682614633565b602082019050919050565b600061394e60158361411e565b91506139598261465c565b602082019050919050565b6000613971602c8361411e565b915061397c82614685565b604082019050919050565b600061399460388361411e565b915061399f826146d4565b604082019050919050565b60006139b7602a8361411e565b91506139c282614723565b604082019050919050565b60006139da60298361411e565b91506139e582614772565b604082019050919050565b60006139fd60168361411e565b9150613a08826147c1565b602082019050919050565b6000613a2060248361411e565b9150613a2b826147ea565b604082019050919050565b6000613a4360208361411e565b9150613a4e82614839565b602082019050919050565b6000613a66602c8361411e565b9150613a7182614862565b604082019050919050565b6000613a8960208361411e565b9150613a94826148b1565b602082019050919050565b6000613aac60168361411e565b9150613ab7826148da565b602082019050919050565b6000613acf60298361411e565b9150613ada82614903565b604082019050919050565b6000613af2602f8361411e565b9150613afd82614952565b604082019050919050565b6000613b1560218361411e565b9150613b20826149a1565b604082019050919050565b6000613b38600083614113565b9150613b43826149f0565b600082019050919050565b6000613b5b60128361411e565b9150613b66826149f3565b602082019050919050565b6000613b7e60318361411e565b9150613b8982614a1c565b604082019050919050565b6000613ba160178361411e565b9150613bac82614a6b565b602082019050919050565b6000613bc4601b8361411e565b9150613bcf82614a94565b602082019050919050565b613be3816142c3565b82525050565b6000613bf58284613701565b60148201915081905092915050565b6000613c108285613736565b602082019150613c208284613736565b6020820191508190509392505050565b6000613c3c82866137bf565b9150613c4882856137bf565b9150613c5482846137f0565b9150819050949350505050565b6000613c6c82613b2b565b9150819050919050565b6000602082019050613c8b60008301846136f2565b92915050565b6000608082019050613ca660008301876136f2565b613cb360208301866136f2565b613cc06040830185613bda565b8181036060830152613cd2818461374d565b905095945050505050565b6000602082019050613cf26000830184613718565b92915050565b6000602082019050613d0d6000830184613727565b92915050565b60006020820190508181036000830152613d2d8184613786565b905092915050565b60006020820190508181036000830152613d4e8161386f565b9050919050565b60006020820190508181036000830152613d6e81613892565b9050919050565b60006020820190508181036000830152613d8e816138b5565b9050919050565b60006020820190508181036000830152613dae816138d8565b9050919050565b60006020820190508181036000830152613dce816138fb565b9050919050565b60006020820190508181036000830152613dee8161391e565b9050919050565b60006020820190508181036000830152613e0e81613941565b9050919050565b60006020820190508181036000830152613e2e81613964565b9050919050565b60006020820190508181036000830152613e4e81613987565b9050919050565b60006020820190508181036000830152613e6e816139aa565b9050919050565b60006020820190508181036000830152613e8e816139cd565b9050919050565b60006020820190508181036000830152613eae816139f0565b9050919050565b60006020820190508181036000830152613ece81613a13565b9050919050565b60006020820190508181036000830152613eee81613a36565b9050919050565b60006020820190508181036000830152613f0e81613a59565b9050919050565b60006020820190508181036000830152613f2e81613a7c565b9050919050565b60006020820190508181036000830152613f4e81613a9f565b9050919050565b60006020820190508181036000830152613f6e81613ac2565b9050919050565b60006020820190508181036000830152613f8e81613ae5565b9050919050565b60006020820190508181036000830152613fae81613b08565b9050919050565b60006020820190508181036000830152613fce81613b4e565b9050919050565b60006020820190508181036000830152613fee81613b71565b9050919050565b6000602082019050818103600083015261400e81613b94565b9050919050565b6000602082019050818103600083015261402e81613bb7565b9050919050565b600060208201905061404a6000830184613bda565b92915050565b600061405a61406b565b90506140668282614341565b919050565b6000604051905090565b600067ffffffffffffffff8211156140905761408f6144a7565b5b614099826144d6565b9050602081019050919050565b600067ffffffffffffffff8211156140c1576140c06144a7565b5b6140ca826144d6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614145826142c3565b9150614150836142c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141855761418461441a565b5b828201905092915050565b600061419b826142c3565b91506141a6836142c3565b9250826141b6576141b5614449565b5b828204905092915050565b60006141cc826142c3565b91506141d7836142c3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142105761420f61441a565b5b828202905092915050565b6000614226826142c3565b9150614231836142c3565b9250828210156142445761424361441a565b5b828203905092915050565b600061425a826142a3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142fa5780820151818401526020810190506142df565b83811115614309576000848401525b50505050565b6000600282049050600182168061432757607f821691505b6020821081141561433b5761433a614478565b5b50919050565b61434a826144d6565b810181811067ffffffffffffffff82111715614369576143686144a7565b5b80604052505050565b600061437d826142c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143b0576143af61441a565b5b600182019050919050565b60006143c6826143d7565b9050919050565b6000819050919050565b60006143e2826144e7565b9050919050565b60006143f4826142c3565b91506143ff836142c3565b92508261440f5761440e614449565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b614ac68161424f565b8114614ad157600080fd5b50565b614add81614261565b8114614ae857600080fd5b50565b614af48161426d565b8114614aff57600080fd5b50565b614b0b81614277565b8114614b1657600080fd5b50565b614b22816142c3565b8114614b2d57600080fd5b5056fea264697066735822122015e2b0eee55b93bbfeb484e6deb2ddea0aeb52d134aa9a4b7e7d2bb6c49e64c764736f6c63430008040033697066733a2f2f516d504863616f35427278695a72326676536f7232323178376946344e46414e6f45626d4b7338414636445276792f

Deployed Bytecode

0x6080604052600436106102935760003560e01c806377e563571161015a578063ba41b0c6116100c1578063d1d192131161007a578063d1d192131461098c578063d5abeb01146109b5578063da3ef23f146109e0578063e985e9c514610a09578063f2c4ce1e14610a46578063f2fde38b14610a6f57610293565b8063ba41b0c614610877578063ba4e5c4914610893578063ba7d2c76146108d0578063c6682862146108fb578063c87b56dd14610926578063d0eb26b01461096357610293565b80638da5cb5b116101135780638da5cb5b1461078d5780638e1f9cfe146107b857806395d89b41146107e3578063a22cb4651461080e578063a475b5dd14610837578063b88d4fde1461084e57610293565b806377e56357146106b95780637cb64759146106d05780637f00c7a6146106f9578063811d2437146107225780638456cb591461074b578063872d10ea1461076257610293565b806323b872dd116101fe57806355f804b3116101b757806355f804b3146105975780635a23dd99146105c05780636352211e146105fd5780636c0360eb1461063a57806370a0823114610665578063715018a6146106a257610293565b806323b872dd146104d0578063295e4c33146104f95780633ccfd60b1461051057806342842e0e1461051a57806344a0d68a14610543578063518302271461056c57610293565b80630c3f6acf116102505780630c3f6acf146103bc57806313093b1d146103e757806313faede61461041257806318160ddd1461043d57806318cae26914610468578063239c70ae146104a557610293565b806301ffc9a71461029857806306afd592146102d557806306fdde0314610300578063081812fc1461032b578063081c8c4414610368578063095ea7b314610393575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba91906135de565b610a98565b6040516102cc9190613cdd565b60405180910390f35b3480156102e157600080fd5b506102ea610b7a565b6040516102f79190614035565b60405180910390f35b34801561030c57600080fd5b50610315610b80565b6040516103229190613d13565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190613671565b610c12565b60405161035f9190613c76565b60405180910390f35b34801561037457600080fd5b5061037d610c97565b60405161038a9190613d13565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190613579565b610d25565b005b3480156103c857600080fd5b506103d1610e3d565b6040516103de9190614035565b60405180910390f35b3480156103f357600080fd5b506103fc610e43565b6040516104099190614035565b60405180910390f35b34801561041e57600080fd5b50610427610e49565b6040516104349190614035565b60405180910390f35b34801561044957600080fd5b50610452610e4f565b60405161045f9190614035565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a91906133b6565b610e59565b60405161049c9190614035565b60405180910390f35b3480156104b157600080fd5b506104ba610e71565b6040516104c79190614035565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f2919061341b565b610e77565b005b34801561050557600080fd5b5061050e610ed7565b005b610518610f5d565b005b34801561052657600080fd5b50610541600480360381019061053c919061341b565b611059565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613671565b611079565b005b34801561057857600080fd5b506105816110ff565b60405161058e9190613cdd565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b99190613630565b611112565b005b3480156105cc57600080fd5b506105e760048036038101906105e291906134e5565b6111a8565b6040516105f49190613cdd565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613671565b61126d565b6040516106319190613c76565b60405180910390f35b34801561064657600080fd5b5061064f61131f565b60405161065c9190613d13565b60405180910390f35b34801561067157600080fd5b5061068c600480360381019061068791906133b6565b6113ad565b6040516106999190614035565b60405180910390f35b3480156106ae57600080fd5b506106b7611465565b005b3480156106c557600080fd5b506106ce6114ed565b005b3480156106dc57600080fd5b506106f760048036038101906106f291906135b5565b611573565b005b34801561070557600080fd5b50610720600480360381019061071b9190613671565b6115f9565b005b34801561072e57600080fd5b5061074960048036038101906107449190613671565b61167f565b005b34801561075757600080fd5b50610760611705565b005b34801561076e57600080fd5b5061077761178b565b6040516107849190614035565b60405180910390f35b34801561079957600080fd5b506107a2611791565b6040516107af9190613c76565b60405180910390f35b3480156107c457600080fd5b506107cd6117bb565b6040516107da9190613cf8565b60405180910390f35b3480156107ef57600080fd5b506107f86117c1565b6040516108059190613d13565b60405180910390f35b34801561081a57600080fd5b506108356004803603810190610830919061353d565b611853565b005b34801561084357600080fd5b5061084c6119d4565b005b34801561085a57600080fd5b506108756004803603810190610870919061346a565b611a6d565b005b610891600480360381019061088c919061369a565b611acf565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190613671565b611e6d565b6040516108c79190613c76565b60405180910390f35b3480156108dc57600080fd5b506108e5611eac565b6040516108f29190614035565b60405180910390f35b34801561090757600080fd5b50610910611eb2565b60405161091d9190613d13565b60405180910390f35b34801561093257600080fd5b5061094d60048036038101906109489190613671565b611f40565b60405161095a9190613d13565b60405180910390f35b34801561096f57600080fd5b5061098a60048036038101906109859190613671565b612099565b005b34801561099857600080fd5b506109b360048036038101906109ae9190613671565b61211f565b005b3480156109c157600080fd5b506109ca6121a5565b6040516109d79190614035565b60405180910390f35b3480156109ec57600080fd5b50610a076004803603810190610a029190613630565b6121ab565b005b348015610a1557600080fd5b50610a306004803603810190610a2b91906133df565b612241565b604051610a3d9190613cdd565b60405180910390f35b348015610a5257600080fd5b50610a6d6004803603810190610a689190613630565b6122d5565b005b348015610a7b57600080fd5b50610a966004803603810190610a9191906133b6565b61236b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b735750610b7282612463565b5b9050919050565b600b5481565b606060008054610b8f9061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbb9061430f565b8015610c085780601f10610bdd57610100808354040283529160200191610c08565b820191906000526020600020905b815481529060010190602001808311610beb57829003601f168201915b5050505050905090565b6000610c1d826124cd565b610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390613ef5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610ca49061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd09061430f565b8015610d1d5780601f10610cf257610100808354040283529160200191610d1d565b820191906000526020600020905b815481529060010190602001808311610d0057829003601f168201915b505050505081565b6000610d308261126d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890613f95565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dc0612539565b73ffffffffffffffffffffffffffffffffffffffff161480610def5750610dee81610de9612539565b612241565b5b610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590613e35565b60405180910390fd5b610e388383612541565b505050565b60145481565b600d5481565b600a5481565b6000601154905090565b60136020528060005260406000206000915090505481565b600e5481565b610e88610e82612539565b826125fa565b610ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebe90613fd5565b60405180910390fd5b610ed28383836126d8565b505050565b610edf612539565b73ffffffffffffffffffffffffffffffffffffffff16610efd611791565b73ffffffffffffffffffffffffffffffffffffffff1614610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90613f15565b60405180910390fd5b6001601481905550565b610f65612539565b73ffffffffffffffffffffffffffffffffffffffff16610f83611791565b73ffffffffffffffffffffffffffffffffffffffff1614610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090613f15565b60405180910390fd5b6000610fe3611791565b73ffffffffffffffffffffffffffffffffffffffff164760405161100690613c61565b60006040518083038185875af1925050503d8060008114611043576040519150601f19603f3d011682016040523d82523d6000602084013e611048565b606091505b505090508061105657600080fd5b50565b61107483838360405180602001604052806000815250611a6d565b505050565b611081612539565b73ffffffffffffffffffffffffffffffffffffffff1661109f611791565b73ffffffffffffffffffffffffffffffffffffffff16146110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90613f15565b60405180910390fd5b80600a8190555050565b601260009054906101000a900460ff1681565b61111a612539565b73ffffffffffffffffffffffffffffffffffffffff16611138611791565b73ffffffffffffffffffffffffffffffffffffffff161461118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590613f15565b60405180910390fd5b80600790805190602001906111a492919061317b565b5050565b600080846040516020016111bc9190613be9565b604051602081830303815290604052805190602001209050611222848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165483612934565b611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890613df5565b60405180910390fd5b60019150509392505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d90613e75565b60405180910390fd5b80915050919050565b6007805461132c9061430f565b80601f01602080910402602001604051908101604052809291908181526020018280546113589061430f565b80156113a55780601f1061137a576101008083540402835291602001916113a5565b820191906000526020600020905b81548152906001019060200180831161138857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561141e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141590613e55565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61146d612539565b73ffffffffffffffffffffffffffffffffffffffff1661148b611791565b73ffffffffffffffffffffffffffffffffffffffff16146114e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d890613f15565b60405180910390fd5b6114eb600061294b565b565b6114f5612539565b73ffffffffffffffffffffffffffffffffffffffff16611513611791565b73ffffffffffffffffffffffffffffffffffffffff1614611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090613f15565b60405180910390fd5b6002601481905550565b61157b612539565b73ffffffffffffffffffffffffffffffffffffffff16611599611791565b73ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690613f15565b60405180910390fd5b8060168190555050565b611601612539565b73ffffffffffffffffffffffffffffffffffffffff1661161f611791565b73ffffffffffffffffffffffffffffffffffffffff1614611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90613f15565b60405180910390fd5b80600e8190555050565b611687612539565b73ffffffffffffffffffffffffffffffffffffffff166116a5611791565b73ffffffffffffffffffffffffffffffffffffffff16146116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613f15565b60405180910390fd5b80600a8190555050565b61170d612539565b73ffffffffffffffffffffffffffffffffffffffff1661172b611791565b73ffffffffffffffffffffffffffffffffffffffff1614611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890613f15565b60405180910390fd5b6000601481905550565b600f5481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60165481565b6060600180546117d09061430f565b80601f01602080910402602001604051908101604052809291908181526020018280546117fc9061430f565b80156118495780601f1061181e57610100808354040283529160200191611849565b820191906000526020600020905b81548152906001019060200180831161182c57829003601f168201915b5050505050905090565b61185b612539565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090613dd5565b60405180910390fd5b80600560006118d6612539565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611983612539565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119c89190613cdd565b60405180910390a35050565b6119dc612539565b73ffffffffffffffffffffffffffffffffffffffff166119fa611791565b73ffffffffffffffffffffffffffffffffffffffff1614611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4790613f15565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b611a7e611a78612539565b836125fa565b611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab490613fd5565b60405180910390fd5b611ac984848484612a11565b50505050565b6000611ad9610e4f565b905060008411611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1590614015565b60405180910390fd5b600c548482611b2d919061413a565b1115611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6590613e95565b60405180910390fd5b611b76611791565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dc357600060145411611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be490613f35565b60405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060016014541415611d7057611c473385856111a8565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90613ff5565b60405180910390fd5b84600b54611c9491906141c1565b341015611cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccd90613fb5565b60405180910390fd5b600d54851115611d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1290613eb5565b60405180910390fd5b600f548582611d2a919061413a565b1115611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6290613d95565b60405180910390fd5b611dc1565b84600a54611d7e91906141c1565b341015611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db790613fb5565b60405180910390fd5b5b505b6000600190505b848111611e6657601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611e2190614372565b9190505550611e3b338284611e36919061413a565b612a6d565b60116000815480929190611e4e90614372565b91905055508080611e5e90614372565b915050611dca565b5050505050565b60158181548110611e7d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b60088054611ebf9061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054611eeb9061430f565b8015611f385780601f10611f0d57610100808354040283529160200191611f38565b820191906000526020600020905b815481529060010190602001808311611f1b57829003601f168201915b505050505081565b6060611f4b826124cd565b611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8190613f75565b60405180910390fd5b60001515601260009054906101000a900460ff16151514156120385760098054611fb39061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054611fdf9061430f565b801561202c5780601f106120015761010080835404028352916020019161202c565b820191906000526020600020905b81548152906001019060200180831161200f57829003601f168201915b50505050509050612094565b6000612042612a8b565b905060008151116120625760405180602001604052806000815250612090565b8061206c84612b1d565b600860405160200161208093929190613c30565b6040516020818303038152906040525b9150505b919050565b6120a1612539565b73ffffffffffffffffffffffffffffffffffffffff166120bf611791565b73ffffffffffffffffffffffffffffffffffffffff1614612115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210c90613f15565b60405180910390fd5b8060108190555050565b612127612539565b73ffffffffffffffffffffffffffffffffffffffff16612145611791565b73ffffffffffffffffffffffffffffffffffffffff161461219b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219290613f15565b60405180910390fd5b80600b8190555050565b600c5481565b6121b3612539565b73ffffffffffffffffffffffffffffffffffffffff166121d1611791565b73ffffffffffffffffffffffffffffffffffffffff1614612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e90613f15565b60405180910390fd5b806008908051906020019061223d92919061317b565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122dd612539565b73ffffffffffffffffffffffffffffffffffffffff166122fb611791565b73ffffffffffffffffffffffffffffffffffffffff1614612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890613f15565b60405180910390fd5b806009908051906020019061236792919061317b565b5050565b612373612539565b73ffffffffffffffffffffffffffffffffffffffff16612391611791565b73ffffffffffffffffffffffffffffffffffffffff16146123e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123de90613f15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244e90613d55565b60405180910390fd5b6124608161294b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125b48361126d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612605826124cd565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90613e15565b60405180910390fd5b600061264f8361126d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126be57508373ffffffffffffffffffffffffffffffffffffffff166126a684610c12565b73ffffffffffffffffffffffffffffffffffffffff16145b806126cf57506126ce8185612241565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126f88261126d565b73ffffffffffffffffffffffffffffffffffffffff161461274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590613f55565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b590613db5565b60405180910390fd5b6127c9838383612cca565b6127d4600082612541565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612824919061421b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287b919061413a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000826129418584612ccf565b1490509392505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a1c8484846126d8565b612a2884848484612da8565b612a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5e90613d35565b60405180910390fd5b50505050565b612a87828260405180602001604052806000815250612f3f565b5050565b606060078054612a9a9061430f565b80601f0160208091040260200160405190810160405280929190818152602001828054612ac69061430f565b8015612b135780601f10612ae857610100808354040283529160200191612b13565b820191906000526020600020905b815481529060010190602001808311612af657829003601f168201915b5050505050905090565b60606000821415612b65576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cc5565b600082905060005b60008214612b97578080612b8090614372565b915050600a82612b909190614190565b9150612b6d565b60008167ffffffffffffffff811115612bd9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c0b5781602001600182028036833780820191505090505b5090505b60008514612cbe57600182612c24919061421b565b9150600a85612c3391906143e9565b6030612c3f919061413a565b60f81b818381518110612c7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cb79190614190565b9450612c0f565b8093505050505b919050565b505050565b60008082905060005b8451811015612d9d576000858281518110612d1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612d5d578281604051602001612d40929190613c04565b604051602081830303815290604052805190602001209250612d89565b8083604051602001612d70929190613c04565b6040516020818303038152906040528051906020012092505b508080612d9590614372565b915050612cd8565b508091505092915050565b6000612dc98473ffffffffffffffffffffffffffffffffffffffff16612f9a565b15612f32578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df2612539565b8786866040518563ffffffff1660e01b8152600401612e149493929190613c91565b602060405180830381600087803b158015612e2e57600080fd5b505af1925050508015612e5f57506040513d601f19601f82011682018060405250810190612e5c9190613607565b60015b612ee2573d8060008114612e8f576040519150601f19603f3d011682016040523d82523d6000602084013e612e94565b606091505b50600081511415612eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed190613d35565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f37565b600190505b949350505050565b612f498383612fad565b612f566000848484612da8565b612f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8c90613d35565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561301d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301490613ed5565b60405180910390fd5b613026816124cd565b15613066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305d90613d75565b60405180910390fd5b61307260008383612cca565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130c2919061413a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546131879061430f565b90600052602060002090601f0160209004810192826131a957600085556131f0565b82601f106131c257805160ff19168380011785556131f0565b828001600101855582156131f0579182015b828111156131ef5782518255916020019190600101906131d4565b5b5090506131fd9190613201565b5090565b5b8082111561321a576000816000905550600101613202565b5090565b600061323161322c84614075565b614050565b90508281526020810184848401111561324957600080fd5b6132548482856142cd565b509392505050565b600061326f61326a846140a6565b614050565b90508281526020810184848401111561328757600080fd5b6132928482856142cd565b509392505050565b6000813590506132a981614abd565b92915050565b60008083601f8401126132c157600080fd5b8235905067ffffffffffffffff8111156132da57600080fd5b6020830191508360208202830111156132f257600080fd5b9250929050565b60008135905061330881614ad4565b92915050565b60008135905061331d81614aeb565b92915050565b60008135905061333281614b02565b92915050565b60008151905061334781614b02565b92915050565b600082601f83011261335e57600080fd5b813561336e84826020860161321e565b91505092915050565b600082601f83011261338857600080fd5b813561339884826020860161325c565b91505092915050565b6000813590506133b081614b19565b92915050565b6000602082840312156133c857600080fd5b60006133d68482850161329a565b91505092915050565b600080604083850312156133f257600080fd5b60006134008582860161329a565b92505060206134118582860161329a565b9150509250929050565b60008060006060848603121561343057600080fd5b600061343e8682870161329a565b935050602061344f8682870161329a565b9250506040613460868287016133a1565b9150509250925092565b6000806000806080858703121561348057600080fd5b600061348e8782880161329a565b945050602061349f8782880161329a565b93505060406134b0878288016133a1565b925050606085013567ffffffffffffffff8111156134cd57600080fd5b6134d98782880161334d565b91505092959194509250565b6000806000604084860312156134fa57600080fd5b60006135088682870161329a565b935050602084013567ffffffffffffffff81111561352557600080fd5b613531868287016132af565b92509250509250925092565b6000806040838503121561355057600080fd5b600061355e8582860161329a565b925050602061356f858286016132f9565b9150509250929050565b6000806040838503121561358c57600080fd5b600061359a8582860161329a565b92505060206135ab858286016133a1565b9150509250929050565b6000602082840312156135c757600080fd5b60006135d58482850161330e565b91505092915050565b6000602082840312156135f057600080fd5b60006135fe84828501613323565b91505092915050565b60006020828403121561361957600080fd5b600061362784828501613338565b91505092915050565b60006020828403121561364257600080fd5b600082013567ffffffffffffffff81111561365c57600080fd5b61366884828501613377565b91505092915050565b60006020828403121561368357600080fd5b6000613691848285016133a1565b91505092915050565b6000806000604084860312156136af57600080fd5b60006136bd868287016133a1565b935050602084013567ffffffffffffffff8111156136da57600080fd5b6136e6868287016132af565b92509250509250925092565b6136fb8161424f565b82525050565b61371261370d8261424f565b6143bb565b82525050565b61372181614261565b82525050565b6137308161426d565b82525050565b6137476137428261426d565b6143cd565b82525050565b6000613758826140ec565b6137628185614102565b93506137728185602086016142dc565b61377b816144d6565b840191505092915050565b6000613791826140f7565b61379b818561411e565b93506137ab8185602086016142dc565b6137b4816144d6565b840191505092915050565b60006137ca826140f7565b6137d4818561412f565b93506137e48185602086016142dc565b80840191505092915050565b600081546137fd8161430f565b613807818661412f565b94506001821660008114613822576001811461383357613866565b60ff19831686528186019350613866565b61383c856140d7565b60005b8381101561385e5781548189015260018201915060208101905061383f565b838801955050505b50505092915050565b600061387c60328361411e565b9150613887826144f4565b604082019050919050565b600061389f60268361411e565b91506138aa82614543565b604082019050919050565b60006138c2601c8361411e565b91506138cd82614592565b602082019050919050565b60006138e5601c8361411e565b91506138f0826145bb565b602082019050919050565b600061390860248361411e565b9150613913826145e4565b604082019050919050565b600061392b60198361411e565b915061393682614633565b602082019050919050565b600061394e60158361411e565b91506139598261465c565b602082019050919050565b6000613971602c8361411e565b915061397c82614685565b604082019050919050565b600061399460388361411e565b915061399f826146d4565b604082019050919050565b60006139b7602a8361411e565b91506139c282614723565b604082019050919050565b60006139da60298361411e565b91506139e582614772565b604082019050919050565b60006139fd60168361411e565b9150613a08826147c1565b602082019050919050565b6000613a2060248361411e565b9150613a2b826147ea565b604082019050919050565b6000613a4360208361411e565b9150613a4e82614839565b602082019050919050565b6000613a66602c8361411e565b9150613a7182614862565b604082019050919050565b6000613a8960208361411e565b9150613a94826148b1565b602082019050919050565b6000613aac60168361411e565b9150613ab7826148da565b602082019050919050565b6000613acf60298361411e565b9150613ada82614903565b604082019050919050565b6000613af2602f8361411e565b9150613afd82614952565b604082019050919050565b6000613b1560218361411e565b9150613b20826149a1565b604082019050919050565b6000613b38600083614113565b9150613b43826149f0565b600082019050919050565b6000613b5b60128361411e565b9150613b66826149f3565b602082019050919050565b6000613b7e60318361411e565b9150613b8982614a1c565b604082019050919050565b6000613ba160178361411e565b9150613bac82614a6b565b602082019050919050565b6000613bc4601b8361411e565b9150613bcf82614a94565b602082019050919050565b613be3816142c3565b82525050565b6000613bf58284613701565b60148201915081905092915050565b6000613c108285613736565b602082019150613c208284613736565b6020820191508190509392505050565b6000613c3c82866137bf565b9150613c4882856137bf565b9150613c5482846137f0565b9150819050949350505050565b6000613c6c82613b2b565b9150819050919050565b6000602082019050613c8b60008301846136f2565b92915050565b6000608082019050613ca660008301876136f2565b613cb360208301866136f2565b613cc06040830185613bda565b8181036060830152613cd2818461374d565b905095945050505050565b6000602082019050613cf26000830184613718565b92915050565b6000602082019050613d0d6000830184613727565b92915050565b60006020820190508181036000830152613d2d8184613786565b905092915050565b60006020820190508181036000830152613d4e8161386f565b9050919050565b60006020820190508181036000830152613d6e81613892565b9050919050565b60006020820190508181036000830152613d8e816138b5565b9050919050565b60006020820190508181036000830152613dae816138d8565b9050919050565b60006020820190508181036000830152613dce816138fb565b9050919050565b60006020820190508181036000830152613dee8161391e565b9050919050565b60006020820190508181036000830152613e0e81613941565b9050919050565b60006020820190508181036000830152613e2e81613964565b9050919050565b60006020820190508181036000830152613e4e81613987565b9050919050565b60006020820190508181036000830152613e6e816139aa565b9050919050565b60006020820190508181036000830152613e8e816139cd565b9050919050565b60006020820190508181036000830152613eae816139f0565b9050919050565b60006020820190508181036000830152613ece81613a13565b9050919050565b60006020820190508181036000830152613eee81613a36565b9050919050565b60006020820190508181036000830152613f0e81613a59565b9050919050565b60006020820190508181036000830152613f2e81613a7c565b9050919050565b60006020820190508181036000830152613f4e81613a9f565b9050919050565b60006020820190508181036000830152613f6e81613ac2565b9050919050565b60006020820190508181036000830152613f8e81613ae5565b9050919050565b60006020820190508181036000830152613fae81613b08565b9050919050565b60006020820190508181036000830152613fce81613b4e565b9050919050565b60006020820190508181036000830152613fee81613b71565b9050919050565b6000602082019050818103600083015261400e81613b94565b9050919050565b6000602082019050818103600083015261402e81613bb7565b9050919050565b600060208201905061404a6000830184613bda565b92915050565b600061405a61406b565b90506140668282614341565b919050565b6000604051905090565b600067ffffffffffffffff8211156140905761408f6144a7565b5b614099826144d6565b9050602081019050919050565b600067ffffffffffffffff8211156140c1576140c06144a7565b5b6140ca826144d6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614145826142c3565b9150614150836142c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141855761418461441a565b5b828201905092915050565b600061419b826142c3565b91506141a6836142c3565b9250826141b6576141b5614449565b5b828204905092915050565b60006141cc826142c3565b91506141d7836142c3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142105761420f61441a565b5b828202905092915050565b6000614226826142c3565b9150614231836142c3565b9250828210156142445761424361441a565b5b828203905092915050565b600061425a826142a3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142fa5780820151818401526020810190506142df565b83811115614309576000848401525b50505050565b6000600282049050600182168061432757607f821691505b6020821081141561433b5761433a614478565b5b50919050565b61434a826144d6565b810181811067ffffffffffffffff82111715614369576143686144a7565b5b80604052505050565b600061437d826142c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143b0576143af61441a565b5b600182019050919050565b60006143c6826143d7565b9050919050565b6000819050919050565b60006143e2826144e7565b9050919050565b60006143f4826142c3565b91506143ff836142c3565b92508261440f5761440e614449565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b614ac68161424f565b8114614ad157600080fd5b50565b614add81614261565b8114614ae857600080fd5b50565b614af48161426d565b8114614aff57600080fd5b50565b614b0b81614277565b8114614b1657600080fd5b50565b614b22816142c3565b8114614b2d57600080fd5b5056fea264697066735822122015e2b0eee55b93bbfeb484e6deb2ddea0aeb52d134aa9a4b7e7d2bb6c49e64c764736f6c63430008040033

Deployed Bytecode Sourcemap

193:5262:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1442:344:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;416:34:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2560:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4193:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;344:28:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3731:401:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;785:31:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;493:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;378:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2636:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;723:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;534:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5207:364:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4511:80:10;;;;;;;;;;;;;:::i;:::-;;4979:474;;;:::i;:::-;;5637:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3832:84:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;690:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4048:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2728:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2185:313:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;274:21:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1845:283:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:12;;;;;;;;;;;;;:::i;:::-;;4597:71:10;;;;;;;;;;;;;:::i;:::-;;4674:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3922:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4797:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4438:67;;;;;;;;;;;;;:::i;:::-;;573:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;866:111:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2722:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4555:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3645:67:10;;;;;;;;;;;;;:::i;:::-;;5882:354:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1276:1354:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;822:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;619:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;301:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3056:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3718:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4889:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;456:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4156:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4939:206:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4308:124:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1911:198:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1442:344:3;1584:4;1638:25;1623:40;;;:11;:40;;;;:104;;;;1694:33;1679:48;;;:11;:48;;;;1623:104;:156;;;;1743:36;1767:11;1743:23;:36::i;:::-;1623:156;1604:175;;1442:344;;;:::o;416:34:10:-;;;;:::o;2560:98:3:-;2614:13;2646:5;2639:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2560:98;:::o;4193:295::-;4309:7;4353:16;4361:7;4353;:16::i;:::-;4332:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;4457:15;:24;4473:7;4457:24;;;;;;;;;;;;;;;;;;;;;4450:31;;4193:295;;;:::o;344:28:10:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3731:401:3:-;3811:13;3827:23;3842:7;3827:14;:23::i;:::-;3811:39;;3874:5;3868:11;;:2;:11;;;;3860:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3965:5;3949:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3974:37;3991:5;3998:12;:10;:12::i;:::-;3974:16;:37::i;:::-;3949:62;3928:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;4104:21;4113:2;4117:7;4104:8;:21::i;:::-;3731:401;;;:::o;785:31:10:-;;;;:::o;493:35::-;;;;:::o;378:32::-;;;;:::o;2636:86::-;2680:7;2706:9;;2699:16;;2636:86;:::o;723:55::-;;;;;;;;;;;;;;;;;:::o;534:33::-;;;;:::o;5207:364:3:-;5409:41;5428:12;:10;:12::i;:::-;5442:7;5409:18;:41::i;:::-;5388:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;5536:28;5546:4;5552:2;5556:7;5536:9;:28::i;:::-;5207:364;;;:::o;4511:80:10:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4583:1:10::1;4568:12;:16;;;;4511:80::o:0;4979:474::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5268:7:10::1;5289;:5;:7::i;:::-;5281:21;;5310;5281:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5267:69;;;5354:2;5346:11;;;::::0;::::1;;1311:1:12;4979:474:10:o:0;5637:179:3:-;5770:39;5787:4;5793:2;5797:7;5770:39;;;;;;;;;;;;:16;:39::i;:::-;5637:179;;;:::o;3832:84:10:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3901:8:10::1;3894:4;:15;;;;3832:84:::0;:::o;690:27::-;;;;;;;;;;;;;:::o;4048:102::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4132:11:10::1;4122:7;:21;;;;;;;;;;;;:::i;:::-;;4048:102:::0;:::o;2728:322::-;2820:4;2836:12;2878:5;2861:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;2851:34;;;;;;2836:49;;2916:59;2935:12;;2916:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2949:19;;2970:4;2916:18;:59::i;:::-;2895:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;3039:4;3032:11;;;2728:322;;;;;:::o;2185:313:3:-;2297:7;2320:13;2336:7;:16;2344:7;2336:16;;;;;;;;;;;;;;;;;;;;;2320:32;;2400:1;2383:19;;:5;:19;;;;2362:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;2486:5;2479:12;;;2185:313;;;:::o;274:21:10:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1845:283:3:-;1957:7;2018:1;2001:19;;:5;:19;;;;1980:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2105:9;:16;2115:5;2105:16;;;;;;;;;;;;;;;;2098:23;;1845:283;;;:::o;1661:101:12:-;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;4597:71:10:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4660:1:10::1;4645:12;:16;;;;4597:71::o:0;4674:117::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4770:14:10::1;4748:19;:36;;;;4674:117:::0;:::o;3922:120::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4018:17:10::1;4002:13;:33;;;;3922:120:::0;:::o;4797:86::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4870:6:10::1;4863:4;:13;;;;4797:86:::0;:::o;4438:67::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4497:1:10::1;4482:12;:16;;;;4438:67::o:0;573:40::-;;;;:::o;1029:85:12:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;866:111:10:-;;;;:::o;2722:102:3:-;2778:13;2810:7;2803:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2722:102;:::o;4555:318::-;4697:12;:10;:12::i;:::-;4685:24;;:8;:24;;;;4677:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:8;4750:18;:32;4769:12;:10;:12::i;:::-;4750:32;;;;;;;;;;;;;;;:42;4783:8;4750:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4847:8;4818:48;;4833:12;:10;:12::i;:::-;4818:48;;;4857:8;4818:48;;;;;;:::i;:::-;;;;;;;;4555:318;;:::o;3645:67:10:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3701:4:10::1;3690:8;;:15;;;;;;;;;;;;;;;;;;3645:67::o:0;5882:354:3:-;6064:41;6083:12;:10;:12::i;:::-;6097:7;6064:18;:41::i;:::-;6043:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;6190:39;6204:4;6210:2;6214:7;6223:5;6190:13;:39::i;:::-;5882:354;;;;:::o;1276:1354:10:-;1369:14;1386:13;:11;:13::i;:::-;1369:30;;1431:1;1417:11;:15;1409:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1506:9;;1491:11;1482:6;:20;;;;:::i;:::-;:33;;1474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1570:7;:5;:7::i;:::-;1556:21;;:10;:21;;;1552:888;;1616:1;1601:12;;:16;1593:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1658:24;1685:20;:32;1706:10;1685:32;;;;;;;;;;;;;;;;1658:59;;1752:1;1736:12;;:17;1732:698;;;1781:39;1795:10;1807:12;;1781:13;:39::i;:::-;1773:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1917:11;1908:6;;:20;;;;:::i;:::-;1895:9;:33;;1866:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;2050:15;;2035:11;:30;;2006:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;2224:20;;2209:11;2190:16;:30;;;;:::i;:::-;:54;;2161:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:698;;;2381:11;2374:4;;:18;;;;:::i;:::-;2361:9;:31;;2353:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:698;1552:888;;2455:9;2467:1;2455:13;;2450:174;2475:11;2470:1;:16;2450:174;;2507:20;:32;2528:10;2507:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;2555:33;2565:10;2586:1;2577:6;:10;;;;:::i;:::-;2555:9;:33::i;:::-;2602:9;;:11;;;;;;;;;:::i;:::-;;;;;;2488:3;;;;;:::i;:::-;;;;2450:174;;;;1276:1354;;;;:::o;822:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;619:38::-;;;;:::o;301:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3056:566::-;3169:13;3219:16;3227:7;3219;:16::i;:::-;3198:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3335:5;3323:17;;:8;;;;;;;;;;;:17;;;3319:69;;;3363:14;3356:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3319:69;3398:28;3429:10;:8;:10::i;:::-;3398:41;;3499:1;3474:14;3468:28;:32;:147;;;;;;;;;;;;;;;;;3543:14;3559:18;:7;:16;:18::i;:::-;3579:13;3526:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3468:147;3449:166;;;3056:566;;;;:::o;3718:108::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3813:6:10::1;3792:18;:27;;;;3718:108:::0;:::o;4889:84::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4960:6:10::1;4951;:15;;;;4889:84:::0;:::o;456:31::-;;;;:::o;4156:146::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4278:17:10::1;4262:13;:33;;;;;;;;;;;;:::i;:::-;;4156:146:::0;:::o;4939:206:3:-;5076:4;5103:18;:25;5122:5;5103:25;;;;;;;;;;;;;;;:35;5129:8;5103:35;;;;;;;;;;;;;;;;;;;;;;;;;5096:42;;4939:206;;;;:::o;4308:124:10:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4410:15:10::1;4393:14;:32;;;;;;;;;;;;:::i;:::-;;4308:124:::0;:::o;1911:198:12:-;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;775:199:2:-;900:4;942:25;927:40;;;:11;:40;;;;920:47;;775:199;;;:::o;7742:125:3:-;7807:4;7858:1;7830:30;;:7;:16;7838:7;7830:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7823:37;;7742:125;;;:::o;599:96:1:-;652:7;678:10;671:17;;599:96;:::o;11721:171:3:-;11822:2;11795:15;:24;11811:7;11795:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11877:7;11873:2;11839:46;;11848:23;11863:7;11848:14;:23::i;:::-;11839:46;;;;;;;;;;;;11721:171;;:::o;8025:438::-;8150:4;8191:16;8199:7;8191;:16::i;:::-;8170:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;8287:13;8303:23;8318:7;8303:14;:23::i;:::-;8287:39;;8355:5;8344:16;;:7;:16;;;:63;;;;8400:7;8376:31;;:20;8388:7;8376:11;:20::i;:::-;:31;;;8344:63;:111;;;;8423:32;8440:5;8447:7;8423:16;:32::i;:::-;8344:111;8336:120;;;8025:438;;;;:::o;11016:594::-;11183:4;11156:31;;:23;11171:7;11156:14;:23::i;:::-;:31;;;11135:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;11286:1;11272:16;;:2;:16;;;;11264:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11340:39;11361:4;11367:2;11371:7;11340:20;:39::i;:::-;11441:29;11458:1;11462:7;11441:8;:29::i;:::-;11500:1;11481:9;:15;11491:4;11481:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11528:1;11511:9;:13;11521:2;11511:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11558:2;11539:7;:16;11547:7;11539:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11595:7;11591:2;11576:27;;11585:4;11576:27;;;;;;;;;;;;11016:594;;;:::o;847:184:11:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;984:40;;847:184;;;;;:::o;2263:187:12:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2263:187;;:::o;7098:341:3:-;7249:28;7259:4;7265:2;7269:7;7249:9;:28::i;:::-;7308:48;7331:4;7337:2;7341:7;7350:5;7308:22;:48::i;:::-;7287:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;7098:341;;;;:::o;8793:108::-;8868:26;8878:2;8882:7;8868:26;;;;;;;;;;;;:9;:26::i;:::-;8793:108;;:::o;1164:106:10:-;1224:13;1256:7;1249:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1164:106;:::o;287:703:13:-;343:13;569:1;560:5;:10;556:51;;;586:10;;;;;;;;;;;;;;;;;;;;;556:51;616:12;631:5;616:20;;646:14;670:75;685:1;677:4;:9;670:75;;702:8;;;;;:::i;:::-;;;;732:2;724:10;;;;;:::i;:::-;;;670:75;;;754:19;786:6;776:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;754:39;;803:150;819:1;810:5;:10;803:150;;846:1;836:11;;;;;:::i;:::-;;;912:2;904:5;:10;;;;:::i;:::-;891:2;:24;;;;:::i;:::-;878:39;;861:6;868;861:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;940:2;931:11;;;;;:::i;:::-;;;803:150;;;976:6;962:21;;;;;287:703;;;;:::o;13951:122:3:-;;;;:::o;1383:688:11:-;1466:7;1485:20;1508:4;1485:27;;1527:9;1522:514;1546:5;:12;1542:1;:16;1522:514;;;1579:20;1602:5;1608:1;1602:8;;;;;;;;;;;;;;;;;;;;;;1579:31;;1644:12;1628;:28;1624:402;;1796:12;1810;1779:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1769:55;;;;;;1754:70;;1624:402;;;1983:12;1997;1966:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1956:55;;;;;;1941:70;;1624:402;1522:514;1560:3;;;;;:::i;:::-;;;;1522:514;;;;2052:12;2045:19;;;1383:688;;;;:::o;12445:950:3:-;12595:4;12615:15;:2;:13;;;:15::i;:::-;12611:778;;;12682:2;12666:36;;;12724:12;:10;:12::i;:::-;12758:4;12784:7;12813:5;12666:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12646:691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13032:1;13015:6;:13;:18;13011:312;;;13057:106;;;;;;;;;;:::i;:::-;;;;;;;;13011:312;13275:6;13269:13;13260:6;13256:2;13252:15;13245:38;12646:691;12908:41;;;12898:51;;;:6;:51;;;;12891:58;;;;;12611:778;13374:4;13367:11;;12445:950;;;;;;;:::o;9122:311::-;9247:18;9253:2;9257:7;9247:5;:18::i;:::-;9296:54;9327:1;9331:2;9335:7;9344:5;9296:22;:54::i;:::-;9275:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;9122:311;;;:::o;782:377:0:-;842:4;1045:12;1110:7;1098:20;1090:28;;1151:1;1144:4;:8;1137:15;;;782:377;;;:::o;9755:372:3:-;9848:1;9834:16;;:2;:16;;;;9826:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9906:16;9914:7;9906;:16::i;:::-;9905:17;9897:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9966:45;9995:1;9999:2;10003:7;9966:20;:45::i;:::-;10039:1;10022:9;:13;10032:2;10022:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10069:2;10050:7;:16;10058:7;10050:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10112:7;10108:2;10087:33;;10104:1;10087:33;;;;;;;;;;;;9755:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:14:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:139::-;1427:5;1465:6;1452:20;1443:29;;1481:33;1508:5;1481:33;:::i;:::-;1433:87;;;;:::o;1526:137::-;1571:5;1609:6;1596:20;1587:29;;1625:32;1651:5;1625:32;:::i;:::-;1577:86;;;;:::o;1669:141::-;1725:5;1756:6;1750:13;1741:22;;1772:32;1798:5;1772:32;:::i;:::-;1731:79;;;;:::o;1829:271::-;1884:5;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;2176:5;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:139::-;2445:5;2483:6;2470:20;2461:29;;2499:33;2526:5;2499:33;:::i;:::-;2451:87;;;;:::o;2544:262::-;2603:6;2652:2;2640:9;2631:7;2627:23;2623:32;2620:2;;;2668:1;2665;2658:12;2620:2;2711:1;2736:53;2781:7;2772:6;2761:9;2757:22;2736:53;:::i;:::-;2726:63;;2682:117;2610:196;;;;:::o;2812:407::-;2880:6;2888;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2953:1;2950;2943:12;2905:2;2996:1;3021:53;3066:7;3057:6;3046:9;3042:22;3021:53;:::i;:::-;3011:63;;2967:117;3123:2;3149:53;3194:7;3185:6;3174:9;3170:22;3149:53;:::i;:::-;3139:63;;3094:118;2895:324;;;;;:::o;3225:552::-;3302:6;3310;3318;3367:2;3355:9;3346:7;3342:23;3338:32;3335:2;;;3383:1;3380;3373:12;3335:2;3426:1;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3397:117;3553:2;3579:53;3624:7;3615:6;3604:9;3600:22;3579:53;:::i;:::-;3569:63;;3524:118;3681:2;3707:53;3752:7;3743:6;3732:9;3728:22;3707:53;:::i;:::-;3697:63;;3652:118;3325:452;;;;;:::o;3783:809::-;3878:6;3886;3894;3902;3951:3;3939:9;3930:7;3926:23;3922:33;3919:2;;;3968:1;3965;3958:12;3919:2;4011:1;4036:53;4081:7;4072:6;4061:9;4057:22;4036:53;:::i;:::-;4026:63;;3982:117;4138:2;4164:53;4209:7;4200:6;4189:9;4185:22;4164:53;:::i;:::-;4154:63;;4109:118;4266:2;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4237:118;4422:2;4411:9;4407:18;4394:32;4453:18;4445:6;4442:30;4439:2;;;4485:1;4482;4475:12;4439:2;4513:62;4567:7;4558:6;4547:9;4543:22;4513:62;:::i;:::-;4503:72;;4365:220;3909:683;;;;;;;:::o;4598:570::-;4693:6;4701;4709;4758:2;4746:9;4737:7;4733:23;4729:32;4726:2;;;4774:1;4771;4764:12;4726:2;4817:1;4842:53;4887:7;4878:6;4867:9;4863:22;4842:53;:::i;:::-;4832:63;;4788:117;4972:2;4961:9;4957:18;4944:32;5003:18;4995:6;4992:30;4989:2;;;5035:1;5032;5025:12;4989:2;5071:80;5143:7;5134:6;5123:9;5119:22;5071:80;:::i;:::-;5053:98;;;;4915:246;4716:452;;;;;:::o;5174:401::-;5239:6;5247;5296:2;5284:9;5275:7;5271:23;5267:32;5264:2;;;5312:1;5309;5302:12;5264:2;5355:1;5380:53;5425:7;5416:6;5405:9;5401:22;5380:53;:::i;:::-;5370:63;;5326:117;5482:2;5508:50;5550:7;5541:6;5530:9;5526:22;5508:50;:::i;:::-;5498:60;;5453:115;5254:321;;;;;:::o;5581:407::-;5649:6;5657;5706:2;5694:9;5685:7;5681:23;5677:32;5674:2;;;5722:1;5719;5712:12;5674:2;5765:1;5790:53;5835:7;5826:6;5815:9;5811:22;5790:53;:::i;:::-;5780:63;;5736:117;5892:2;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5863:118;5664:324;;;;;:::o;5994:262::-;6053:6;6102:2;6090:9;6081:7;6077:23;6073:32;6070:2;;;6118:1;6115;6108:12;6070:2;6161:1;6186:53;6231:7;6222:6;6211:9;6207:22;6186:53;:::i;:::-;6176:63;;6132:117;6060:196;;;;:::o;6262:260::-;6320:6;6369:2;6357:9;6348:7;6344:23;6340:32;6337:2;;;6385:1;6382;6375:12;6337:2;6428:1;6453:52;6497:7;6488:6;6477:9;6473:22;6453:52;:::i;:::-;6443:62;;6399:116;6327:195;;;;:::o;6528:282::-;6597:6;6646:2;6634:9;6625:7;6621:23;6617:32;6614:2;;;6662:1;6659;6652:12;6614:2;6705:1;6730:63;6785:7;6776:6;6765:9;6761:22;6730:63;:::i;:::-;6720:73;;6676:127;6604:206;;;;:::o;6816:375::-;6885:6;6934:2;6922:9;6913:7;6909:23;6905:32;6902:2;;;6950:1;6947;6940:12;6902:2;7021:1;7010:9;7006:17;6993:31;7051:18;7043:6;7040:30;7037:2;;;7083:1;7080;7073:12;7037:2;7111:63;7166:7;7157:6;7146:9;7142:22;7111:63;:::i;:::-;7101:73;;6964:220;6892:299;;;;:::o;7197:262::-;7256:6;7305:2;7293:9;7284:7;7280:23;7276:32;7273:2;;;7321:1;7318;7311:12;7273:2;7364:1;7389:53;7434:7;7425:6;7414:9;7410:22;7389:53;:::i;:::-;7379:63;;7335:117;7263:196;;;;:::o;7465:570::-;7560:6;7568;7576;7625:2;7613:9;7604:7;7600:23;7596:32;7593:2;;;7641:1;7638;7631:12;7593:2;7684:1;7709:53;7754:7;7745:6;7734:9;7730:22;7709:53;:::i;:::-;7699:63;;7655:117;7839:2;7828:9;7824:18;7811:32;7870:18;7862:6;7859:30;7856:2;;;7902:1;7899;7892:12;7856:2;7938:80;8010:7;8001:6;7990:9;7986:22;7938:80;:::i;:::-;7920:98;;;;7782:246;7583:452;;;;;:::o;8041:118::-;8128:24;8146:5;8128:24;:::i;:::-;8123:3;8116:37;8106:53;;:::o;8165:157::-;8270:45;8290:24;8308:5;8290:24;:::i;:::-;8270:45;:::i;:::-;8265:3;8258:58;8248:74;;:::o;8328:109::-;8409:21;8424:5;8409:21;:::i;:::-;8404:3;8397:34;8387:50;;:::o;8443:118::-;8530:24;8548:5;8530:24;:::i;:::-;8525:3;8518:37;8508:53;;:::o;8567:157::-;8672:45;8692:24;8710:5;8692:24;:::i;:::-;8672:45;:::i;:::-;8667:3;8660:58;8650:74;;:::o;8730:360::-;8816:3;8844:38;8876:5;8844:38;:::i;:::-;8898:70;8961:6;8956:3;8898:70;:::i;:::-;8891:77;;8977:52;9022:6;9017:3;9010:4;9003:5;8999:16;8977:52;:::i;:::-;9054:29;9076:6;9054:29;:::i;:::-;9049:3;9045:39;9038:46;;8820:270;;;;;:::o;9096:364::-;9184:3;9212:39;9245:5;9212:39;:::i;:::-;9267:71;9331:6;9326:3;9267:71;:::i;:::-;9260:78;;9347:52;9392:6;9387:3;9380:4;9373:5;9369:16;9347:52;:::i;:::-;9424:29;9446:6;9424:29;:::i;:::-;9419:3;9415:39;9408:46;;9188:272;;;;;:::o;9466:377::-;9572:3;9600:39;9633:5;9600:39;:::i;:::-;9655:89;9737:6;9732:3;9655:89;:::i;:::-;9648:96;;9753:52;9798:6;9793:3;9786:4;9779:5;9775:16;9753:52;:::i;:::-;9830:6;9825:3;9821:16;9814:23;;9576:267;;;;;:::o;9873:845::-;9976:3;10013:5;10007:12;10042:36;10068:9;10042:36;:::i;:::-;10094:89;10176:6;10171:3;10094:89;:::i;:::-;10087:96;;10214:1;10203:9;10199:17;10230:1;10225:137;;;;10376:1;10371:341;;;;10192:520;;10225:137;10309:4;10305:9;10294;10290:25;10285:3;10278:38;10345:6;10340:3;10336:16;10329:23;;10225:137;;10371:341;10438:38;10470:5;10438:38;:::i;:::-;10498:1;10512:154;10526:6;10523:1;10520:13;10512:154;;;10600:7;10594:14;10590:1;10585:3;10581:11;10574:35;10650:1;10641:7;10637:15;10626:26;;10548:4;10545:1;10541:12;10536:17;;10512:154;;;10695:6;10690:3;10686:16;10679:23;;10378:334;;10192:520;;9980:738;;;;;;:::o;10724:366::-;10866:3;10887:67;10951:2;10946:3;10887:67;:::i;:::-;10880:74;;10963:93;11052:3;10963:93;:::i;:::-;11081:2;11076:3;11072:12;11065:19;;10870:220;;;:::o;11096:366::-;11238:3;11259:67;11323:2;11318:3;11259:67;:::i;:::-;11252:74;;11335:93;11424:3;11335:93;:::i;:::-;11453:2;11448:3;11444:12;11437:19;;11242:220;;;:::o;11468:366::-;11610:3;11631:67;11695:2;11690:3;11631:67;:::i;:::-;11624:74;;11707:93;11796:3;11707:93;:::i;:::-;11825:2;11820:3;11816:12;11809:19;;11614:220;;;:::o;11840:366::-;11982:3;12003:67;12067:2;12062:3;12003:67;:::i;:::-;11996:74;;12079:93;12168:3;12079:93;:::i;:::-;12197:2;12192:3;12188:12;12181:19;;11986:220;;;:::o;12212:366::-;12354:3;12375:67;12439:2;12434:3;12375:67;:::i;:::-;12368:74;;12451:93;12540:3;12451:93;:::i;:::-;12569:2;12564:3;12560:12;12553:19;;12358:220;;;:::o;12584:366::-;12726:3;12747:67;12811:2;12806:3;12747:67;:::i;:::-;12740:74;;12823:93;12912:3;12823:93;:::i;:::-;12941:2;12936:3;12932:12;12925:19;;12730:220;;;:::o;12956:366::-;13098:3;13119:67;13183:2;13178:3;13119:67;:::i;:::-;13112:74;;13195:93;13284:3;13195:93;:::i;:::-;13313:2;13308:3;13304:12;13297:19;;13102:220;;;:::o;13328:366::-;13470:3;13491:67;13555:2;13550:3;13491:67;:::i;:::-;13484:74;;13567:93;13656:3;13567:93;:::i;:::-;13685:2;13680:3;13676:12;13669:19;;13474:220;;;:::o;13700:366::-;13842:3;13863:67;13927:2;13922:3;13863:67;:::i;:::-;13856:74;;13939:93;14028:3;13939:93;:::i;:::-;14057:2;14052:3;14048:12;14041:19;;13846:220;;;:::o;14072:366::-;14214:3;14235:67;14299:2;14294:3;14235:67;:::i;:::-;14228:74;;14311:93;14400:3;14311:93;:::i;:::-;14429:2;14424:3;14420:12;14413:19;;14218:220;;;:::o;14444:366::-;14586:3;14607:67;14671:2;14666:3;14607:67;:::i;:::-;14600:74;;14683:93;14772:3;14683:93;:::i;:::-;14801:2;14796:3;14792:12;14785:19;;14590:220;;;:::o;14816:366::-;14958:3;14979:67;15043:2;15038:3;14979:67;:::i;:::-;14972:74;;15055:93;15144:3;15055:93;:::i;:::-;15173:2;15168:3;15164:12;15157:19;;14962:220;;;:::o;15188:366::-;15330:3;15351:67;15415:2;15410:3;15351:67;:::i;:::-;15344:74;;15427:93;15516:3;15427:93;:::i;:::-;15545:2;15540:3;15536:12;15529:19;;15334:220;;;:::o;15560:366::-;15702:3;15723:67;15787:2;15782:3;15723:67;:::i;:::-;15716:74;;15799:93;15888:3;15799:93;:::i;:::-;15917:2;15912:3;15908:12;15901:19;;15706:220;;;:::o;15932:366::-;16074:3;16095:67;16159:2;16154:3;16095:67;:::i;:::-;16088:74;;16171:93;16260:3;16171:93;:::i;:::-;16289:2;16284:3;16280:12;16273:19;;16078:220;;;:::o;16304:366::-;16446:3;16467:67;16531:2;16526:3;16467:67;:::i;:::-;16460:74;;16543:93;16632:3;16543:93;:::i;:::-;16661:2;16656:3;16652:12;16645:19;;16450:220;;;:::o;16676:366::-;16818:3;16839:67;16903:2;16898:3;16839:67;:::i;:::-;16832:74;;16915:93;17004:3;16915:93;:::i;:::-;17033:2;17028:3;17024:12;17017:19;;16822:220;;;:::o;17048:366::-;17190:3;17211:67;17275:2;17270:3;17211:67;:::i;:::-;17204:74;;17287:93;17376:3;17287:93;:::i;:::-;17405:2;17400:3;17396:12;17389:19;;17194:220;;;:::o;17420:366::-;17562:3;17583:67;17647:2;17642:3;17583:67;:::i;:::-;17576:74;;17659:93;17748:3;17659:93;:::i;:::-;17777:2;17772:3;17768:12;17761:19;;17566:220;;;:::o;17792:366::-;17934:3;17955:67;18019:2;18014:3;17955:67;:::i;:::-;17948:74;;18031:93;18120:3;18031:93;:::i;:::-;18149:2;18144:3;18140:12;18133:19;;17938:220;;;:::o;18164:398::-;18323:3;18344:83;18425:1;18420:3;18344:83;:::i;:::-;18337:90;;18436:93;18525:3;18436:93;:::i;:::-;18554:1;18549:3;18545:11;18538:18;;18327:235;;;:::o;18568:366::-;18710:3;18731:67;18795:2;18790:3;18731:67;:::i;:::-;18724:74;;18807:93;18896:3;18807:93;:::i;:::-;18925:2;18920:3;18916:12;18909:19;;18714:220;;;:::o;18940:366::-;19082:3;19103:67;19167:2;19162:3;19103:67;:::i;:::-;19096:74;;19179:93;19268:3;19179:93;:::i;:::-;19297:2;19292:3;19288:12;19281:19;;19086:220;;;:::o;19312:366::-;19454:3;19475:67;19539:2;19534:3;19475:67;:::i;:::-;19468:74;;19551:93;19640:3;19551:93;:::i;:::-;19669:2;19664:3;19660:12;19653:19;;19458:220;;;:::o;19684:366::-;19826:3;19847:67;19911:2;19906:3;19847:67;:::i;:::-;19840:74;;19923:93;20012:3;19923:93;:::i;:::-;20041:2;20036:3;20032:12;20025:19;;19830:220;;;:::o;20056:118::-;20143:24;20161:5;20143:24;:::i;:::-;20138:3;20131:37;20121:53;;:::o;20180:256::-;20292:3;20307:75;20378:3;20369:6;20307:75;:::i;:::-;20407:2;20402:3;20398:12;20391:19;;20427:3;20420:10;;20296:140;;;;:::o;20442:397::-;20582:3;20597:75;20668:3;20659:6;20597:75;:::i;:::-;20697:2;20692:3;20688:12;20681:19;;20710:75;20781:3;20772:6;20710:75;:::i;:::-;20810:2;20805:3;20801:12;20794:19;;20830:3;20823:10;;20586:253;;;;;:::o;20845:589::-;21070:3;21092:95;21183:3;21174:6;21092:95;:::i;:::-;21085:102;;21204:95;21295:3;21286:6;21204:95;:::i;:::-;21197:102;;21316:92;21404:3;21395:6;21316:92;:::i;:::-;21309:99;;21425:3;21418:10;;21074:360;;;;;;:::o;21440:379::-;21624:3;21646:147;21789:3;21646:147;:::i;:::-;21639:154;;21810:3;21803:10;;21628:191;;;:::o;21825:222::-;21918:4;21956:2;21945:9;21941:18;21933:26;;21969:71;22037:1;22026:9;22022:17;22013:6;21969:71;:::i;:::-;21923:124;;;;:::o;22053:640::-;22248:4;22286:3;22275:9;22271:19;22263:27;;22300:71;22368:1;22357:9;22353:17;22344:6;22300:71;:::i;:::-;22381:72;22449:2;22438:9;22434:18;22425:6;22381:72;:::i;:::-;22463;22531:2;22520:9;22516:18;22507:6;22463:72;:::i;:::-;22582:9;22576:4;22572:20;22567:2;22556:9;22552:18;22545:48;22610:76;22681:4;22672:6;22610:76;:::i;:::-;22602:84;;22253:440;;;;;;;:::o;22699:210::-;22786:4;22824:2;22813:9;22809:18;22801:26;;22837:65;22899:1;22888:9;22884:17;22875:6;22837:65;:::i;:::-;22791:118;;;;:::o;22915:222::-;23008:4;23046:2;23035:9;23031:18;23023:26;;23059:71;23127:1;23116:9;23112:17;23103:6;23059:71;:::i;:::-;23013:124;;;;:::o;23143:313::-;23256:4;23294:2;23283:9;23279:18;23271:26;;23343:9;23337:4;23333:20;23329:1;23318:9;23314:17;23307:47;23371:78;23444:4;23435:6;23371:78;:::i;:::-;23363:86;;23261:195;;;;:::o;23462:419::-;23628:4;23666:2;23655:9;23651:18;23643:26;;23715:9;23709:4;23705:20;23701:1;23690:9;23686:17;23679:47;23743:131;23869:4;23743:131;:::i;:::-;23735:139;;23633:248;;;:::o;23887:419::-;24053:4;24091:2;24080:9;24076:18;24068:26;;24140:9;24134:4;24130:20;24126:1;24115:9;24111:17;24104:47;24168:131;24294:4;24168:131;:::i;:::-;24160:139;;24058:248;;;:::o;24312:419::-;24478:4;24516:2;24505:9;24501:18;24493:26;;24565:9;24559:4;24555:20;24551:1;24540:9;24536:17;24529:47;24593:131;24719:4;24593:131;:::i;:::-;24585:139;;24483:248;;;:::o;24737:419::-;24903:4;24941:2;24930:9;24926:18;24918:26;;24990:9;24984:4;24980:20;24976:1;24965:9;24961:17;24954:47;25018:131;25144:4;25018:131;:::i;:::-;25010:139;;24908:248;;;:::o;25162:419::-;25328:4;25366:2;25355:9;25351:18;25343:26;;25415:9;25409:4;25405:20;25401:1;25390:9;25386:17;25379:47;25443:131;25569:4;25443:131;:::i;:::-;25435:139;;25333:248;;;:::o;25587:419::-;25753:4;25791:2;25780:9;25776:18;25768:26;;25840:9;25834:4;25830:20;25826:1;25815:9;25811:17;25804:47;25868:131;25994:4;25868:131;:::i;:::-;25860:139;;25758:248;;;:::o;26012:419::-;26178:4;26216:2;26205:9;26201:18;26193:26;;26265:9;26259:4;26255:20;26251:1;26240:9;26236:17;26229:47;26293:131;26419:4;26293:131;:::i;:::-;26285:139;;26183:248;;;:::o;26437:419::-;26603:4;26641:2;26630:9;26626:18;26618:26;;26690:9;26684:4;26680:20;26676:1;26665:9;26661:17;26654:47;26718:131;26844:4;26718:131;:::i;:::-;26710:139;;26608:248;;;:::o;26862:419::-;27028:4;27066:2;27055:9;27051:18;27043:26;;27115:9;27109:4;27105:20;27101:1;27090:9;27086:17;27079:47;27143:131;27269:4;27143:131;:::i;:::-;27135:139;;27033:248;;;:::o;27287:419::-;27453:4;27491:2;27480:9;27476:18;27468:26;;27540:9;27534:4;27530:20;27526:1;27515:9;27511:17;27504:47;27568:131;27694:4;27568:131;:::i;:::-;27560:139;;27458:248;;;:::o;27712:419::-;27878:4;27916:2;27905:9;27901:18;27893:26;;27965:9;27959:4;27955:20;27951:1;27940:9;27936:17;27929:47;27993:131;28119:4;27993:131;:::i;:::-;27985:139;;27883:248;;;:::o;28137:419::-;28303:4;28341:2;28330:9;28326:18;28318:26;;28390:9;28384:4;28380:20;28376:1;28365:9;28361:17;28354:47;28418:131;28544:4;28418:131;:::i;:::-;28410:139;;28308:248;;;:::o;28562:419::-;28728:4;28766:2;28755:9;28751:18;28743:26;;28815:9;28809:4;28805:20;28801:1;28790:9;28786:17;28779:47;28843:131;28969:4;28843:131;:::i;:::-;28835:139;;28733:248;;;:::o;28987:419::-;29153:4;29191:2;29180:9;29176:18;29168:26;;29240:9;29234:4;29230:20;29226:1;29215:9;29211:17;29204:47;29268:131;29394:4;29268:131;:::i;:::-;29260:139;;29158:248;;;:::o;29412:419::-;29578:4;29616:2;29605:9;29601:18;29593:26;;29665:9;29659:4;29655:20;29651:1;29640:9;29636:17;29629:47;29693:131;29819:4;29693:131;:::i;:::-;29685:139;;29583:248;;;:::o;29837:419::-;30003:4;30041:2;30030:9;30026:18;30018:26;;30090:9;30084:4;30080:20;30076:1;30065:9;30061:17;30054:47;30118:131;30244:4;30118:131;:::i;:::-;30110:139;;30008:248;;;:::o;30262:419::-;30428:4;30466:2;30455:9;30451:18;30443:26;;30515:9;30509:4;30505:20;30501:1;30490:9;30486:17;30479:47;30543:131;30669:4;30543:131;:::i;:::-;30535:139;;30433:248;;;:::o;30687:419::-;30853:4;30891:2;30880:9;30876:18;30868:26;;30940:9;30934:4;30930:20;30926:1;30915:9;30911:17;30904:47;30968:131;31094:4;30968:131;:::i;:::-;30960:139;;30858:248;;;:::o;31112:419::-;31278:4;31316:2;31305:9;31301:18;31293:26;;31365:9;31359:4;31355:20;31351:1;31340:9;31336:17;31329:47;31393:131;31519:4;31393:131;:::i;:::-;31385:139;;31283:248;;;:::o;31537:419::-;31703:4;31741:2;31730:9;31726:18;31718:26;;31790:9;31784:4;31780:20;31776:1;31765:9;31761:17;31754:47;31818:131;31944:4;31818:131;:::i;:::-;31810:139;;31708:248;;;:::o;31962:419::-;32128:4;32166:2;32155:9;32151:18;32143:26;;32215:9;32209:4;32205:20;32201:1;32190:9;32186:17;32179:47;32243:131;32369:4;32243:131;:::i;:::-;32235:139;;32133:248;;;:::o;32387:419::-;32553:4;32591:2;32580:9;32576:18;32568:26;;32640:9;32634:4;32630:20;32626:1;32615:9;32611:17;32604:47;32668:131;32794:4;32668:131;:::i;:::-;32660:139;;32558:248;;;:::o;32812:419::-;32978:4;33016:2;33005:9;33001:18;32993:26;;33065:9;33059:4;33055:20;33051:1;33040:9;33036:17;33029:47;33093:131;33219:4;33093:131;:::i;:::-;33085:139;;32983:248;;;:::o;33237:419::-;33403:4;33441:2;33430:9;33426:18;33418:26;;33490:9;33484:4;33480:20;33476:1;33465:9;33461:17;33454:47;33518:131;33644:4;33518:131;:::i;:::-;33510:139;;33408:248;;;:::o;33662:222::-;33755:4;33793:2;33782:9;33778:18;33770:26;;33806:71;33874:1;33863:9;33859:17;33850:6;33806:71;:::i;:::-;33760:124;;;;:::o;33890:129::-;33924:6;33951:20;;:::i;:::-;33941:30;;33980:33;34008:4;34000:6;33980:33;:::i;:::-;33931:88;;;:::o;34025:75::-;34058:6;34091:2;34085:9;34075:19;;34065:35;:::o;34106:307::-;34167:4;34257:18;34249:6;34246:30;34243:2;;;34279:18;;:::i;:::-;34243:2;34317:29;34339:6;34317:29;:::i;:::-;34309:37;;34401:4;34395;34391:15;34383:23;;34172:241;;;:::o;34419:308::-;34481:4;34571:18;34563:6;34560:30;34557:2;;;34593:18;;:::i;:::-;34557:2;34631:29;34653:6;34631:29;:::i;:::-;34623:37;;34715:4;34709;34705:15;34697:23;;34486:241;;;:::o;34733:141::-;34782:4;34805:3;34797:11;;34828:3;34825:1;34818:14;34862:4;34859:1;34849:18;34841:26;;34787:87;;;:::o;34880:98::-;34931:6;34965:5;34959:12;34949:22;;34938:40;;;:::o;34984:99::-;35036:6;35070:5;35064:12;35054:22;;35043:40;;;:::o;35089:168::-;35172:11;35206:6;35201:3;35194:19;35246:4;35241:3;35237:14;35222:29;;35184:73;;;;:::o;35263:147::-;35364:11;35401:3;35386:18;;35376:34;;;;:::o;35416:169::-;35500:11;35534:6;35529:3;35522:19;35574:4;35569:3;35565:14;35550:29;;35512:73;;;;:::o;35591:148::-;35693:11;35730:3;35715:18;;35705:34;;;;:::o;35745:305::-;35785:3;35804:20;35822:1;35804:20;:::i;:::-;35799:25;;35838:20;35856:1;35838:20;:::i;:::-;35833:25;;35992:1;35924:66;35920:74;35917:1;35914:81;35911:2;;;35998:18;;:::i;:::-;35911:2;36042:1;36039;36035:9;36028:16;;35789:261;;;;:::o;36056:185::-;36096:1;36113:20;36131:1;36113:20;:::i;:::-;36108:25;;36147:20;36165:1;36147:20;:::i;:::-;36142:25;;36186:1;36176:2;;36191:18;;:::i;:::-;36176:2;36233:1;36230;36226:9;36221:14;;36098:143;;;;:::o;36247:348::-;36287:7;36310:20;36328:1;36310:20;:::i;:::-;36305:25;;36344:20;36362:1;36344:20;:::i;:::-;36339:25;;36532:1;36464:66;36460:74;36457:1;36454:81;36449:1;36442:9;36435:17;36431:105;36428:2;;;36539:18;;:::i;:::-;36428:2;36587:1;36584;36580:9;36569:20;;36295:300;;;;:::o;36601:191::-;36641:4;36661:20;36679:1;36661:20;:::i;:::-;36656:25;;36695:20;36713:1;36695:20;:::i;:::-;36690:25;;36734:1;36731;36728:8;36725:2;;;36739:18;;:::i;:::-;36725:2;36784:1;36781;36777:9;36769:17;;36646:146;;;;:::o;36798:96::-;36835:7;36864:24;36882:5;36864:24;:::i;:::-;36853:35;;36843:51;;;:::o;36900:90::-;36934:7;36977:5;36970:13;36963:21;36952:32;;36942:48;;;:::o;36996:77::-;37033:7;37062:5;37051:16;;37041:32;;;:::o;37079:149::-;37115:7;37155:66;37148:5;37144:78;37133:89;;37123:105;;;:::o;37234:126::-;37271:7;37311:42;37304:5;37300:54;37289:65;;37279:81;;;:::o;37366:77::-;37403:7;37432:5;37421:16;;37411:32;;;:::o;37449:154::-;37533:6;37528:3;37523;37510:30;37595:1;37586:6;37581:3;37577:16;37570:27;37500:103;;;:::o;37609:307::-;37677:1;37687:113;37701:6;37698:1;37695:13;37687:113;;;37786:1;37781:3;37777:11;37771:18;37767:1;37762:3;37758:11;37751:39;37723:2;37720:1;37716:10;37711:15;;37687:113;;;37818:6;37815:1;37812:13;37809:2;;;37898:1;37889:6;37884:3;37880:16;37873:27;37809:2;37658:258;;;;:::o;37922:320::-;37966:6;38003:1;37997:4;37993:12;37983:22;;38050:1;38044:4;38040:12;38071:18;38061:2;;38127:4;38119:6;38115:17;38105:27;;38061:2;38189;38181:6;38178:14;38158:18;38155:38;38152:2;;;38208:18;;:::i;:::-;38152:2;37973:269;;;;:::o;38248:281::-;38331:27;38353:4;38331:27;:::i;:::-;38323:6;38319:40;38461:6;38449:10;38446:22;38425:18;38413:10;38410:34;38407:62;38404:2;;;38472:18;;:::i;:::-;38404:2;38512:10;38508:2;38501:22;38291:238;;;:::o;38535:233::-;38574:3;38597:24;38615:5;38597:24;:::i;:::-;38588:33;;38643:66;38636:5;38633:77;38630:2;;;38713:18;;:::i;:::-;38630:2;38760:1;38753:5;38749:13;38742:20;;38578:190;;;:::o;38774:100::-;38813:7;38842:26;38862:5;38842:26;:::i;:::-;38831:37;;38821:53;;;:::o;38880:79::-;38919:7;38948:5;38937:16;;38927:32;;;:::o;38965:94::-;39004:7;39033:20;39047:5;39033:20;:::i;:::-;39022:31;;39012:47;;;:::o;39065:176::-;39097:1;39114:20;39132:1;39114:20;:::i;:::-;39109:25;;39148:20;39166:1;39148:20;:::i;:::-;39143:25;;39187:1;39177:2;;39192:18;;:::i;:::-;39177:2;39233:1;39230;39226:9;39221:14;;39099:142;;;;:::o;39247:180::-;39295:77;39292:1;39285:88;39392:4;39389:1;39382:15;39416:4;39413:1;39406:15;39433:180;39481:77;39478:1;39471:88;39578:4;39575:1;39568:15;39602:4;39599:1;39592:15;39619:180;39667:77;39664:1;39657:88;39764:4;39761:1;39754:15;39788:4;39785:1;39778:15;39805:180;39853:77;39850:1;39843:88;39950:4;39947:1;39940:15;39974:4;39971:1;39964:15;39991:102;40032:6;40083:2;40079:7;40074:2;40067:5;40063:14;40059:28;40049:38;;40039:54;;;:::o;40099:94::-;40132:8;40180:5;40176:2;40172:14;40151:35;;40141:52;;;:::o;40199:237::-;40339:34;40335:1;40327:6;40323:14;40316:58;40408:20;40403:2;40395:6;40391:15;40384:45;40305:131;:::o;40442:225::-;40582:34;40578:1;40570:6;40566:14;40559:58;40651:8;40646:2;40638:6;40634:15;40627:33;40548:119;:::o;40673:178::-;40813:30;40809:1;40801:6;40797:14;40790:54;40779:72;:::o;40857:178::-;40997:30;40993:1;40985:6;40981:14;40974:54;40963:72;:::o;41041:223::-;41181:34;41177:1;41169:6;41165:14;41158:58;41250:6;41245:2;41237:6;41233:15;41226:31;41147:117;:::o;41270:175::-;41410:27;41406:1;41398:6;41394:14;41387:51;41376:69;:::o;41451:171::-;41591:23;41587:1;41579:6;41575:14;41568:47;41557:65;:::o;41628:231::-;41768:34;41764:1;41756:6;41752:14;41745:58;41837:14;41832:2;41824:6;41820:15;41813:39;41734:125;:::o;41865:243::-;42005:34;42001:1;41993:6;41989:14;41982:58;42074:26;42069:2;42061:6;42057:15;42050:51;41971:137;:::o;42114:229::-;42254:34;42250:1;42242:6;42238:14;42231:58;42323:12;42318:2;42310:6;42306:15;42299:37;42220:123;:::o;42349:228::-;42489:34;42485:1;42477:6;42473:14;42466:58;42558:11;42553:2;42545:6;42541:15;42534:36;42455:122;:::o;42583:172::-;42723:24;42719:1;42711:6;42707:14;42700:48;42689:66;:::o;42761:223::-;42901:34;42897:1;42889:6;42885:14;42878:58;42970:6;42965:2;42957:6;42953:15;42946:31;42867:117;:::o;42990:182::-;43130:34;43126:1;43118:6;43114:14;43107:58;43096:76;:::o;43178:231::-;43318:34;43314:1;43306:6;43302:14;43295:58;43387:14;43382:2;43374:6;43370:15;43363:39;43284:125;:::o;43415:182::-;43555:34;43551:1;43543:6;43539:14;43532:58;43521:76;:::o;43603:172::-;43743:24;43739:1;43731:6;43727:14;43720:48;43709:66;:::o;43781:228::-;43921:34;43917:1;43909:6;43905:14;43898:58;43990:11;43985:2;43977:6;43973:15;43966:36;43887:122;:::o;44015:234::-;44155:34;44151:1;44143:6;44139:14;44132:58;44224:17;44219:2;44211:6;44207:15;44200:42;44121:128;:::o;44255:220::-;44395:34;44391:1;44383:6;44379:14;44372:58;44464:3;44459:2;44451:6;44447:15;44440:28;44361:114;:::o;44481:::-;44587:8;:::o;44601:168::-;44741:20;44737:1;44729:6;44725:14;44718:44;44707:62;:::o;44775:236::-;44915:34;44911:1;44903:6;44899:14;44892:58;44984:19;44979:2;44971:6;44967:15;44960:44;44881:130;:::o;45017:173::-;45157:25;45153:1;45145:6;45141:14;45134:49;45123:67;:::o;45196:177::-;45336:29;45332:1;45324:6;45320:14;45313:53;45302:71;:::o;45379:122::-;45452:24;45470:5;45452:24;:::i;:::-;45445:5;45442:35;45432:2;;45491:1;45488;45481:12;45432:2;45422:79;:::o;45507:116::-;45577:21;45592:5;45577:21;:::i;:::-;45570:5;45567:32;45557:2;;45613:1;45610;45603:12;45557:2;45547:76;:::o;45629:122::-;45702:24;45720:5;45702:24;:::i;:::-;45695:5;45692:35;45682:2;;45741:1;45738;45731:12;45682:2;45672:79;:::o;45757:120::-;45829:23;45846:5;45829:23;:::i;:::-;45822:5;45819:34;45809:2;;45867:1;45864;45857:12;45809:2;45799:78;:::o;45883:122::-;45956:24;45974:5;45956:24;:::i;:::-;45949:5;45946:35;45936:2;;45995:1;45992;45985:12;45936:2;45926:79;:::o

Swarm Source

ipfs://15e2b0eee55b93bbfeb484e6deb2ddea0aeb52d134aa9a4b7e7d2bb6c49e64c7
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.