ETH Price: $3,474.95 (+4.91%)

Token

Kindergarten BabyApes (KBA)
 

Overview

Max Total Supply

10,000 KBA

Holders

5,320

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 KBA
0x58fc7ba80ea54c4aa7def5071f4b37aba5fdcab0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Kindergarten BabyApes (KBA) is a collection of 10,000 BabyApes living on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
KBA

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 14: kba.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Context.sol";
import "./Ownable.sol";
import "./Strings.sol";
import "./Pausable.sol";

contract KBA is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public MAX_KBA = 10000; 
    uint256 public kbaPrice = 0.06 ether; 
    uint256 public MAX_KBA_MINT = 25;
    uint256 public MAX_PER_TX = 5;

    uint256 public constant PRESIDENTS_MAX_MINT = 5;
    uint256 public constant WL_MAX_MINT = 3;
    uint256 public constant FREE_MAX_MINT = 1;

    uint256 public constant RESERVED_KBA = 125; 
    address public constant founderAddress = 0x6f452562D7e0E9DF2135b5f797cfF9a34b0B550c; 

    uint256 public reservedClaimed;

    uint256 public numBabyapesMinted;

    string public baseTokenURI;

    bool public publicSaleStarted;
    bool public preSaleStarted;

    mapping(address => bool) private _wlEligible;
    mapping(address => bool) private _presidentsEligible;
    mapping(address => bool) private _freeEligible;


    mapping(address => uint256) public totalClaimed;

    mapping(address => uint256) private _totalClaimedWl;
    mapping(address => uint256) private _totalClaimedPresident;
    mapping(address => uint256) private _totalClaimedFree;


    event BaseURIChanged(string baseURI);
    event WlMint(address minter, uint256 amountOfBabyapes);
    event PresidentMint(address minter, uint256 amountOfBabyapes);
    event FreeMint(address minter, uint256 amountOfBabyapes);

    event PresaleMint(address minter, uint256 amountOfBabyapes);
    event PublicSaleMint(address minter, uint256 amountOfBabyapes);

    modifier whenPresaleStarted() {
        require(preSaleStarted, "Presale has not started");
        _;
    }

    modifier whenPublicSaleStarted() {
        require(publicSaleStarted, "Public sale has not started");
        _;
    }

    constructor(string memory baseURI) ERC721("Kindergarten BabyApes", "KBA") {
        baseTokenURI = baseURI;
    }

    function claimReserved(address recipient, uint256 amount) external onlyOwner {
        require(reservedClaimed + amount <= RESERVED_KBA, "Minting would exceed max reserved KBA");
        require(recipient != address(0), "Cannot add null address");
        require(totalSupply() + amount <= MAX_KBA, "Minting would exceed max supply");

        uint256 _nextTokenId = numBabyapesMinted;

        for (uint256 i = 0; i < amount; i++) {
            _safeMint(recipient, _nextTokenId + i);
        }
        numBabyapesMinted += amount;
        reservedClaimed += amount;
    }

    function addToWlPresale(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add null address");

            _wlEligible[addresses[i]] = true;
        }
    }

    function addToPresidentPresale(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add null address");

            _presidentsEligible[addresses[i]] = true;
        }
    }

    function addToFreeMint(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add null address");

            _freeEligible[addresses[i]] = true;
        }
    }    

    function checkWlEligibility(address addr) external view returns (bool) {
        return _wlEligible[addr];
    }

    function checkPresidentEligibility(address addr) external view returns (bool) {
        return _presidentsEligible[addr];
    }

    function checkFreeEligibility(address addr) external view returns (bool) {
        return _freeEligible[addr];
    }    

    function getWlMintsClaimed(address addr) external view returns (uint256) {
        return _totalClaimedWl[addr];
    }

    function getPresidentsMintsClaimed(address addr) external view returns (uint256) {
        return _totalClaimedPresident[addr];
    }

    function getFreeMintsClaimed(address addr) external view returns (uint256) {
        return _totalClaimedFree[addr];
    }

    function mintWlPresale(uint256 amountOfBabyapes) external payable whenPresaleStarted {
        require(_wlEligible[msg.sender], "You are not eligible for the handpicked presale");
        require(totalSupply() + amountOfBabyapes <= MAX_KBA - (RESERVED_KBA - reservedClaimed), "Minting would exceed max supply");
        require(_totalClaimedWl[msg.sender] + amountOfBabyapes <= WL_MAX_MINT, "Purchase exceeds max allowed");
        require(amountOfBabyapes > 0, "Must mint at least one KBA");
        require(kbaPrice * amountOfBabyapes <= msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfBabyapes; i++) {
            uint256 tokenId = numBabyapesMinted;

            numBabyapesMinted += 1;
            totalClaimed[msg.sender] += 1;
            _totalClaimedWl[msg.sender] += 1;
            _safeMint(msg.sender, tokenId);
        }

        emit WlMint(msg.sender, amountOfBabyapes);
    }

    function mintPresidentsPresale(uint256 amountOfBabyapes) external payable whenPresaleStarted {
        require(_presidentsEligible[msg.sender], "You are not eligible for the Class Presidents presale");
        require(totalSupply() + amountOfBabyapes <= MAX_KBA - (RESERVED_KBA - reservedClaimed), "Minting would exceed max supply");
        require(_totalClaimedWl[msg.sender] + amountOfBabyapes <= PRESIDENTS_MAX_MINT, "Purchase exceeds max allowed");
        require(amountOfBabyapes > 0, "Must mint at least one KBA");
        require(kbaPrice * amountOfBabyapes <= msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfBabyapes; i++) {
            uint256 tokenId = numBabyapesMinted;

            numBabyapesMinted += 1;
            totalClaimed[msg.sender] += 1;
            _totalClaimedWl[msg.sender] += 1;
            _safeMint(msg.sender, tokenId);
        }

        emit PresidentMint(msg.sender, amountOfBabyapes);
    }

    function mintFree(uint256 amountOfBabyapes) external payable whenPresaleStarted {
        require(_freeEligible[msg.sender], "You are not eligible for the Free mint :shrug:");
        require(totalSupply() + amountOfBabyapes <= MAX_KBA - (RESERVED_KBA - reservedClaimed), "Minting would exceed max supply");
        require(_totalClaimedFree[msg.sender] + amountOfBabyapes <= FREE_MAX_MINT, "You can only claim 1 Free.");
        require(amountOfBabyapes < 2, "You can only claim one free KBA");

        for (uint256 i = 0; i < amountOfBabyapes; i++) {
            uint256 tokenId = numBabyapesMinted;

            numBabyapesMinted += 1;
            totalClaimed[msg.sender] += 1;
            _totalClaimedFree[msg.sender] += 1;
            _safeMint(msg.sender, tokenId);
        }

        emit FreeMint(msg.sender, amountOfBabyapes);
    }                

    function mint(uint256 amountOfBabyapes) external payable whenPublicSaleStarted {
        require(totalSupply() + amountOfBabyapes <= MAX_KBA - (RESERVED_KBA - reservedClaimed), "Minting would exceed max supply");
        require(totalClaimed[msg.sender] + amountOfBabyapes <= MAX_KBA_MINT, "Purchase exceeds max allowed per address");
        require(amountOfBabyapes > 0, "Must mint at least one KBA");
        require(amountOfBabyapes <= MAX_PER_TX, "Amount over max per transaction. ");
        require(kbaPrice * amountOfBabyapes <= msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfBabyapes; i++) {
            uint256 tokenId = numBabyapesMinted;

            numBabyapesMinted += 1;
            totalClaimed[msg.sender] += 1;
            _safeMint(msg.sender, tokenId);
        }

        emit PublicSaleMint(msg.sender, amountOfBabyapes);
    }

    function togglePresaleStarted() external onlyOwner {
        preSaleStarted = !preSaleStarted;
    }

    function togglePublicSaleStarted() external onlyOwner {
        publicSaleStarted = !publicSaleStarted;
    }

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

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
        emit BaseURIChanged(baseURI);
    }

    function setMaxTokens(uint256 newMax) external onlyOwner {
        MAX_KBA = newMax;
    } 

    function setNewPrice(uint256 newPriceInWEI) external onlyOwner {
        kbaPrice = newPriceInWEI;
    }

    function setNewMaxMintPerAddress(uint256 newMax) external onlyOwner {
        MAX_KBA_MINT = newMax;
    } 

    function setNewMaxPerTx(uint256 newMax) external onlyOwner {
        MAX_PER_TX = newMax;
    }

    function withdrawrouted() external onlyOwner {
        uint256 sendAmount = address(this).balance;

        address founder1 = payable(0x81Db670cF7f5208454a07Cc8DD4AdF24FD0a4232);
        address founder2 = payable(0xb70E84202beA66D4af3d079b20196a94b0632825);
        address apeyard1 = payable(0x9aAb7614EdaaEA8A2BB145C3BfEFC10C6fb1bdE0);
        address apeyard2 = payable(0x95012c8A2E28e689e51a15Aa83C3A82AB9BCf170);
        address consultant = payable(0x2C8a40e48c31C167664f71d5235e7E67E9696407);
        address community = payable(0x6f452562D7e0E9DF2135b5f797cfF9a34b0B550c);

        bool success;
        (success, ) = founder1.call{value: ((sendAmount * 40)/100)}("");
        require(success, "Transaction Unsuccessful");

        (success, ) = founder2.call{value: ((sendAmount * 31)/100)}("");
        require(success, "Transaction Unsuccessful");

        (success, ) = apeyard1.call{value: ((sendAmount * 16)/100)}("");
        require(success, "Transaction Unsuccessful");

        (success, ) = apeyard2.call{value: ((sendAmount * 3)/100)}("");
        require(success, "Transaction Unsuccessful");        

        (success, ) = consultant.call{value: ((sendAmount * 3)/100)}("");
        require(success, "Transaction Unsuccessful");

        (success, ) = community.call{value: ((sendAmount * 7)/100)}("");
        require(success, "Transaction Unsuccessful");
     }

    function withdrawAll() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "Insufficent balance");
        _withdraw(founderAddress, address(this).balance);
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{ value: _amount }("");
        require(success, "Failed to withdraw Ether");
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 2 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 14: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

File 5 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 10 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 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 13 of 14: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfBabyapes","type":"uint256"}],"name":"FreeMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfBabyapes","type":"uint256"}],"name":"PresaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfBabyapes","type":"uint256"}],"name":"PresidentMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfBabyapes","type":"uint256"}],"name":"PublicSaleMint","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfBabyapes","type":"uint256"}],"name":"WlMint","type":"event"},{"inputs":[],"name":"FREE_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_KBA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_KBA_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESIDENTS_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_KBA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToPresidentPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWlPresale","outputs":[],"stateMutability":"nonpayable","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkFreeEligibility","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkPresidentEligibility","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkWlEligibility","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"founderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"addr","type":"address"}],"name":"getFreeMintsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getPresidentsMintsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getWlMintsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kbaPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfBabyapes","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfBabyapes","type":"uint256"}],"name":"mintFree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfBabyapes","type":"uint256"}],"name":"mintPresidentsPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfBabyapes","type":"uint256"}],"name":"mintWlPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numBabyapesMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"preSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedClaimed","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":"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setNewMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setNewMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceInWEI","type":"uint256"}],"name":"setNewPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawrouted","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600b5566d529ae9e860000600c556019600d556005600e553480156200002c57600080fd5b5060405162003fc738038062003fc78339810160408190526200004f91620001fb565b604080518082018252601581527f4b696e64657267617274656e20426162794170657300000000000000000000006020808301918252835180850190945260038452624b424160e81b908401528151919291620000af9160009162000155565b508051620000c590600190602084019062000155565b505050620000e2620000dc620000ff60201b60201c565b62000103565b8051620000f790601190602084019062000155565b50506200031d565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016390620002ca565b90600052602060002090601f016020900481019282620001875760008555620001d2565b82601f10620001a257805160ff1916838001178555620001d2565b82800160010185558215620001d2579182015b82811115620001d2578251825591602001919060010190620001b5565b50620001e0929150620001e4565b5090565b5b80821115620001e05760008155600101620001e5565b600060208083850312156200020e578182fd5b82516001600160401b038082111562000225578384fd5b818501915085601f83011262000239578384fd5b8151818111156200024e576200024e62000307565b604051601f8201601f191681018501838111828210171562000274576200027462000307565b60405281815283820185018810156200028b578586fd5b8592505b81831015620002ae57838301850151818401860152918401916200028f565b81831115620002bf57858583830101525b979650505050505050565b600281046001821680620002df57607f821691505b602082108114156200030157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b613c9a806200032d6000396000f3fe6080604052600436106103765760003560e01c806370a08231116101d1578063c771dbd011610102578063ed1fc2a2116100a0578063f2fde38b1161006f578063f2fde38b1461094a578063f43a22dc1461096a578063f4f4d1071461097f578063fcc35baa1461099457610376565b8063ed1fc2a2146108e0578063ed276606146108f5578063ee8cdd4e1461090a578063ef5d9ae81461092a57610376565b8063d6499512116100dc578063d64995121461086d578063db70cb2f1461088d578063df6e7795146108a0578063e985e9c5146108c057610376565b8063c771dbd014610818578063c87b56dd14610838578063d547cfb71461085857610376565b80639b7f4fc01161016f578063a2e9147711610149578063a2e91477146107bd578063a4146733146107d2578063acde66df146107e5578063b88d4fde146107f857610376565b80639b7f4fc01461076a578063a0712d681461078a578063a22cb4651461079d57610376565b8063853828b6116101ab578063853828b61461070b5780638da5cb5b14610720578063945d589e1461073557806395d89b411461075557610376565b806370a08231146106c1578063715018a6146106e15780637289409d146106f657610376565b806335c1b84d116102ab5780635741cbf3116102495780636352211e116102235780636352211e14610657578063690cf0d1146106775780636c105a791461068c5780636f904c43146106a157610376565b80635741cbf31461060d578063616be0b9146106225780636189f0831461063757610376565b806346bb28331161028557806346bb2833146105985780634f6ccce7146105ad5780635408367e146105cd57806355f804b3146105ed57610376565b806335c1b84d1461053857806340da8b781461055857806342842e0e1461057857610376565b806318160ddd1161031857806324510043116102f257806324510043146104d9578063282b357d146104ee5780632f745c59146105035780632f8145751461052357610376565b806318160ddd146104845780631b5757f21461049957806323b872dd146104b957610376565b8063081812fc11610354578063081812fc14610400578063095ea7b31461042d5780630d0f38b81461044f57806311e776fe1461046457610376565b806301ff9fdf1461037b57806301ffc9a7146103b157806306fdde03146103de575b600080fd5b34801561038757600080fd5b5061039b610396366004612e76565b6109a9565b6040516103a89190613b0b565b60405180910390f35b3480156103bd57600080fd5b506103d16103cc366004613048565b6109c8565b6040516103a891906131a6565b3480156103ea57600080fd5b506103f36109f3565b6040516103a891906131b1565b34801561040c57600080fd5b5061042061041b3660046130c6565b610a85565b6040516103a8919061313c565b34801561043957600080fd5b5061044d610448366004612fb0565b610ad1565b005b34801561045b57600080fd5b5061039b610b69565b34801561047057600080fd5b5061044d61047f3660046130c6565b610b6e565b34801561049057600080fd5b5061039b610bb2565b3480156104a557600080fd5b5061044d6104b4366004612fb0565b610bb8565b3480156104c557600080fd5b5061044d6104d4366004612ec2565b610ce8565b3480156104e557600080fd5b5061039b610d20565b3480156104fa57600080fd5b5061039b610d26565b34801561050f57600080fd5b5061039b61051e366004612fb0565b610d2b565b34801561052f57600080fd5b5061044d610d7d565b34801561054457600080fd5b506103d1610553366004612e76565b610dd0565b34801561056457600080fd5b5061039b610573366004612e76565b610dee565b34801561058457600080fd5b5061044d610593366004612ec2565b610e09565b3480156105a457600080fd5b50610420610e24565b3480156105b957600080fd5b5061039b6105c83660046130c6565b610e3c565b3480156105d957600080fd5b506103d16105e8366004612e76565b610e97565b3480156105f957600080fd5b5061044d610608366004613080565b610eb5565b34801561061957600080fd5b5061044d610f42565b34801561062e57600080fd5b5061039b61136f565b34801561064357600080fd5b5061044d6106523660046130c6565b611375565b34801561066357600080fd5b506104206106723660046130c6565b6113b9565b34801561068357600080fd5b506103d16113ee565b34801561069857600080fd5b5061039b6113fc565b3480156106ad57600080fd5b5061044d6106bc366004612fd9565b611402565b3480156106cd57600080fd5b5061039b6106dc366004612e76565b61151f565b3480156106ed57600080fd5b5061044d611563565b34801561070257600080fd5b5061039b6115ae565b34801561071757600080fd5b5061044d6115b4565b34801561072c57600080fd5b50610420611632565b34801561074157600080fd5b5061039b610750366004612e76565b611641565b34801561076157600080fd5b506103f361165c565b34801561077657600080fd5b506103d1610785366004612e76565b61166b565b61044d6107983660046130c6565b611689565b3480156107a957600080fd5b5061044d6107b8366004612f76565b61183b565b3480156107c957600080fd5b506103d1611851565b61044d6107e03660046130c6565b61185a565b61044d6107f33660046130c6565b611a16565b34801561080457600080fd5b5061044d610813366004612efd565b611bff565b34801561082457600080fd5b5061044d610833366004612fd9565b611c3e565b34801561084457600080fd5b506103f36108533660046130c6565b611d5b565b34801561086457600080fd5b506103f3611dde565b34801561087957600080fd5b5061044d6108883660046130c6565b611e6c565b61044d61089b3660046130c6565b611eb0565b3480156108ac57600080fd5b5061044d6108bb366004612fd9565b612099565b3480156108cc57600080fd5b506103d16108db366004612e90565b6121b6565b3480156108ec57600080fd5b5061044d6121e4565b34801561090157600080fd5b5061039b612240565b34801561091657600080fd5b5061044d6109253660046130c6565b612246565b34801561093657600080fd5b5061039b610945366004612e76565b61228a565b34801561095657600080fd5b5061044d610965366004612e76565b61229c565b34801561097657600080fd5b5061039b61230a565b34801561098b57600080fd5b5061039b612310565b3480156109a057600080fd5b5061039b612315565b6001600160a01b0381166000908152601860205260409020545b919050565b60006001600160e01b0319821663780e9d6360e01b14806109ed57506109ed8261231a565b92915050565b606060008054610a0290613ba2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2e90613ba2565b8015610a7b5780601f10610a5057610100808354040283529160200191610a7b565b820191906000526020600020905b815481529060010190602001808311610a5e57829003601f168201915b5050505050905090565b6000610a908261235a565b610ab55760405162461bcd60e51b8152600401610aac90613734565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610adc826113b9565b9050806001600160a01b0316836001600160a01b03161415610b105760405162461bcd60e51b8152600401610aac906138f9565b806001600160a01b0316610b22612377565b6001600160a01b03161480610b3e5750610b3e816108db612377565b610b5a5760405162461bcd60e51b8152600401610aac906134c6565b610b64838361237b565b505050565b600381565b610b76612377565b6001600160a01b0316610b87611632565b6001600160a01b031614610bad5760405162461bcd60e51b8152600401610aac906137ad565b600b55565b60085490565b610bc0612377565b6001600160a01b0316610bd1611632565b6001600160a01b031614610bf75760405162461bcd60e51b8152600401610aac906137ad565b607d81600f54610c079190613b14565b1115610c255760405162461bcd60e51b8152600401610aac90613315565b6001600160a01b038216610c4b5760405162461bcd60e51b8152600401610aac90613988565b600b5481610c57610bb2565b610c619190613b14565b1115610c7f5760405162461bcd60e51b8152600401610aac90613642565b60105460005b82811015610cb257610ca084610c9b8385613b14565b6123e9565b80610caa81613bdd565b915050610c85565b508160106000828254610cc59190613b14565b9250508190555081600f6000828254610cde9190613b14565b9091555050505050565b610cf9610cf3612377565b82612403565b610d155760405162461bcd60e51b8152600401610aac906139bf565b610b64838383612488565b600f5481565b607d81565b6000610d368361151f565b8210610d545760405162461bcd60e51b8152600401610aac906131fb565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d85612377565b6001600160a01b0316610d96611632565b6001600160a01b031614610dbc5760405162461bcd60e51b8152600401610aac906137ad565b6012805460ff19811660ff90911615179055565b6001600160a01b031660009081526013602052604090205460ff1690565b6001600160a01b031660009081526019602052604090205490565b610b6483838360405180602001604052806000815250611bff565b736f452562d7e0e9df2135b5f797cff9a34b0b550c81565b6000610e46610bb2565b8210610e645760405162461bcd60e51b8152600401610aac90613a10565b60088281548110610e8557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6001600160a01b031660009081526014602052604090205460ff1690565b610ebd612377565b6001600160a01b0316610ece611632565b6001600160a01b031614610ef45760405162461bcd60e51b8152600401610aac906137ad565b8051610f07906011906020840190612d56565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610f3791906131b1565b60405180910390a150565b610f4a612377565b6001600160a01b0316610f5b611632565b6001600160a01b031614610f815760405162461bcd60e51b8152600401610aac906137ad565b477381db670cf7f5208454a07cc8dd4adf24fd0a423273b70e84202bea66d4af3d079b20196a94b0632825739aab7614edaaea8a2bb145c3bfefc10c6fb1bde07395012c8a2e28e689e51a15aa83c3a82ab9bcf170732c8a40e48c31c167664f71d5235e7e67e9696407736f452562d7e0e9df2135b5f797cff9a34b0b550c60008660646110108a6028613b40565b61101a9190613b2c565b60405161102690613139565b60006040518083038185875af1925050503d8060008114611063576040519150601f19603f3d011682016040523d82523d6000602084013e611068565b606091505b5050809150508061108b5760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03861660646110a28a601f613b40565b6110ac9190613b2c565b6040516110b890613139565b60006040518083038185875af1925050503d80600081146110f5576040519150601f19603f3d011682016040523d82523d6000602084013e6110fa565b606091505b5050809150508061111d5760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03851660646111348a6010613b40565b61113e9190613b2c565b60405161114a90613139565b60006040518083038185875af1925050503d8060008114611187576040519150601f19603f3d011682016040523d82523d6000602084013e61118c565b606091505b505080915050806111af5760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03841660646111c68a6003613b40565b6111d09190613b2c565b6040516111dc90613139565b60006040518083038185875af1925050503d8060008114611219576040519150601f19603f3d011682016040523d82523d6000602084013e61121e565b606091505b505080915050806112415760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03831660646112588a6003613b40565b6112629190613b2c565b60405161126e90613139565b60006040518083038185875af1925050503d80600081146112ab576040519150601f19603f3d011682016040523d82523d6000602084013e6112b0565b606091505b505080915050806112d35760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03821660646112ea8a6007613b40565b6112f49190613b2c565b60405161130090613139565b60006040518083038185875af1925050503d806000811461133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b505080915050806113655760405162461bcd60e51b8152600401610aac90613391565b5050505050505050565b60105481565b61137d612377565b6001600160a01b031661138e611632565b6001600160a01b0316146113b45760405162461bcd60e51b8152600401610aac906137ad565b600d55565b6000818152600260205260408120546001600160a01b0316806109ed5760405162461bcd60e51b8152600401610aac906135c2565b601254610100900460ff1681565b600d5481565b61140a612377565b6001600160a01b031661141b611632565b6001600160a01b0316146114415760405162461bcd60e51b8152600401610aac906137ad565b60005b81811015610b6457600083838381811061146e57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114839190612e76565b6001600160a01b031614156114aa5760405162461bcd60e51b8152600401610aac90613988565b6001601460008585858181106114d057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114e59190612e76565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061151781613bdd565b915050611444565b60006001600160a01b0382166115475760405162461bcd60e51b8152600401610aac90613578565b506001600160a01b031660009081526003602052604090205490565b61156b612377565b6001600160a01b031661157c611632565b6001600160a01b0316146115a25760405162461bcd60e51b8152600401610aac906137ad565b6115ac60006125b5565b565b600b5481565b6115bc612377565b6001600160a01b03166115cd611632565b6001600160a01b0316146115f35760405162461bcd60e51b8152600401610aac906137ad565b47806116115760405162461bcd60e51b8152600401610aac90613780565b61162f736f452562d7e0e9df2135b5f797cff9a34b0b550c47612607565b50565b600a546001600160a01b031690565b6001600160a01b031660009081526017602052604090205490565b606060018054610a0290613ba2565b6001600160a01b031660009081526015602052604090205460ff1690565b60125460ff166116ab5760405162461bcd60e51b8152600401610aac9061335a565b600f546116b990607d613b5f565b600b546116c69190613b5f565b816116cf610bb2565b6116d99190613b14565b11156116f75760405162461bcd60e51b8152600401610aac90613642565b600d5433600090815260166020526040902054611715908390613b14565b11156117335760405162461bcd60e51b8152600401610aac906138b1565b600081116117535760405162461bcd60e51b8152600401610aac9061360b565b600e548111156117755760405162461bcd60e51b8152600401610aac90613aca565b3481600c546117849190613b40565b11156117a25760405162461bcd60e51b8152600401610aac906136fd565b60005b8181101561180957601080549060019060006117c18385613b14565b90915550503360009081526016602052604081208054600192906117e6908490613b14565b909155506117f6905033826123e9565b508061180181613bdd565b9150506117a5565b507f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b53382604051610f3792919061318d565b61184d611846612377565b8383612683565b5050565b60125460ff1681565b601254610100900460ff166118815760405162461bcd60e51b8152600401610aac906131c4565b3360009081526015602052604090205460ff166118b05760405162461bcd60e51b8152600401610aac9061393a565b600f546118be90607d613b5f565b600b546118cb9190613b5f565b816118d4610bb2565b6118de9190613b14565b11156118fc5760405162461bcd60e51b8152600401610aac90613642565b3360009081526019602052604090205460019061191a908390613b14565b11156119385760405162461bcd60e51b8152600401610aac90613a5c565b600281106119585760405162461bcd60e51b8152600401610aac90613443565b60005b818110156119e457601080549060019060006119778385613b14565b909155505033600090815260166020526040812080546001929061199c908490613b14565b90915550503360009081526019602052604081208054600192906119c1908490613b14565b909155506119d1905033826123e9565b50806119dc81613bdd565b91505061195b565b507f1a75c98f3caa5c596c30e5e4c83e0802685273950677d98a322c514a03b05b573382604051610f3792919061318d565b601254610100900460ff16611a3d5760405162461bcd60e51b8152600401610aac906131c4565b3360009081526013602052604090205460ff16611a6c5760405162461bcd60e51b8152600401610aac90613679565b600f54611a7a90607d613b5f565b600b54611a879190613b5f565b81611a90610bb2565b611a9a9190613b14565b1115611ab85760405162461bcd60e51b8152600401610aac90613642565b33600090815260176020526040902054600390611ad6908390613b14565b1115611af45760405162461bcd60e51b8152600401610aac90613a93565b60008111611b145760405162461bcd60e51b8152600401610aac9061360b565b3481600c54611b239190613b40565b1115611b415760405162461bcd60e51b8152600401610aac906136fd565b60005b81811015611bcd5760108054906001906000611b608385613b14565b9091555050336000908152601660205260408120805460019290611b85908490613b14565b9091555050336000908152601760205260408120805460019290611baa908490613b14565b90915550611bba905033826123e9565b5080611bc581613bdd565b915050611b44565b507fdcc508bb1343b5f16be8b6748c4a4b84a60717b2586d6393401a2a9b21e572313382604051610f3792919061318d565b611c10611c0a612377565b83612403565b611c2c5760405162461bcd60e51b8152600401610aac906139bf565b611c3884848484612726565b50505050565b611c46612377565b6001600160a01b0316611c57611632565b6001600160a01b031614611c7d5760405162461bcd60e51b8152600401610aac906137ad565b60005b81811015610b64576000838383818110611caa57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611cbf9190612e76565b6001600160a01b03161415611ce65760405162461bcd60e51b8152600401610aac90613988565b600160156000858585818110611d0c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d219190612e76565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611d5381613bdd565b915050611c80565b6060611d668261235a565b611d825760405162461bcd60e51b8152600401610aac9061382b565b6000611d8c612759565b90506000815111611dac5760405180602001604052806000815250611dd7565b80611db684612768565b604051602001611dc792919061310a565b6040516020818303038152906040525b9392505050565b60118054611deb90613ba2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1790613ba2565b8015611e645780601f10611e3957610100808354040283529160200191611e64565b820191906000526020600020905b815481529060010190602001808311611e4757829003601f168201915b505050505081565b611e74612377565b6001600160a01b0316611e85611632565b6001600160a01b031614611eab5760405162461bcd60e51b8152600401610aac906137ad565b600e55565b601254610100900460ff16611ed75760405162461bcd60e51b8152600401610aac906131c4565b3360009081526014602052604090205460ff16611f065760405162461bcd60e51b8152600401610aac90613523565b600f54611f1490607d613b5f565b600b54611f219190613b5f565b81611f2a610bb2565b611f349190613b14565b1115611f525760405162461bcd60e51b8152600401610aac90613642565b33600090815260176020526040902054600590611f70908390613b14565b1115611f8e5760405162461bcd60e51b8152600401610aac90613a93565b60008111611fae5760405162461bcd60e51b8152600401610aac9061360b565b3481600c54611fbd9190613b40565b1115611fdb5760405162461bcd60e51b8152600401610aac906136fd565b60005b818110156120675760108054906001906000611ffa8385613b14565b909155505033600090815260166020526040812080546001929061201f908490613b14565b9091555050336000908152601760205260408120805460019290612044908490613b14565b90915550612054905033826123e9565b508061205f81613bdd565b915050611fde565b507fbff48f099ef54992004a057882a32cfbbc347a3c9fd3f785b55844a94a296f2d3382604051610f3792919061318d565b6120a1612377565b6001600160a01b03166120b2611632565b6001600160a01b0316146120d85760405162461bcd60e51b8152600401610aac906137ad565b60005b81811015610b6457600083838381811061210557634e487b7160e01b600052603260045260246000fd5b905060200201602081019061211a9190612e76565b6001600160a01b031614156121415760405162461bcd60e51b8152600401610aac90613988565b60016013600085858581811061216757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061217c9190612e76565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806121ae81613bdd565b9150506120db565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6121ec612377565b6001600160a01b03166121fd611632565b6001600160a01b0316146122235760405162461bcd60e51b8152600401610aac906137ad565b6012805461ff001981166101009182900460ff1615909102179055565b600c5481565b61224e612377565b6001600160a01b031661225f611632565b6001600160a01b0316146122855760405162461bcd60e51b8152600401610aac906137ad565b600c55565b60166020526000908152604090205481565b6122a4612377565b6001600160a01b03166122b5611632565b6001600160a01b0316146122db5760405162461bcd60e51b8152600401610aac906137ad565b6001600160a01b0381166123015760405162461bcd60e51b8152600401610aac90613298565b61162f816125b5565b600e5481565b600181565b600581565b60006001600160e01b031982166380ac58cd60e01b148061234b57506001600160e01b03198216635b5e139f60e01b145b806109ed57506109ed82612883565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123b0826113b9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61184d82826040518060200160405280600081525061289c565b600061240e8261235a565b61242a5760405162461bcd60e51b8152600401610aac9061347a565b6000612435836113b9565b9050806001600160a01b0316846001600160a01b031614806124705750836001600160a01b031661246584610a85565b6001600160a01b0316145b80612480575061248081856121b6565b949350505050565b826001600160a01b031661249b826113b9565b6001600160a01b0316146124c15760405162461bcd60e51b8152600401610aac906137e2565b6001600160a01b0382166124e75760405162461bcd60e51b8152600401610aac906133c8565b6124f28383836128cf565b6124fd60008261237b565b6001600160a01b0383166000908152600360205260408120805460019290612526908490613b5f565b90915550506001600160a01b0382166000908152600360205260408120805460019290612554908490613b14565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405161262090613139565b60006040518083038185875af1925050503d806000811461265d576040519150601f19603f3d011682016040523d82523d6000602084013e612662565b606091505b5050905080610b645760405162461bcd60e51b8152600401610aac9061387a565b816001600160a01b0316836001600160a01b031614156126b55760405162461bcd60e51b8152600401610aac9061340c565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906127199085906131a6565b60405180910390a3505050565b612731848484612488565b61273d84848484612958565b611c385760405162461bcd60e51b8152600401610aac90613246565b606060118054610a0290613ba2565b60608161278d57506040805180820190915260018152600360fc1b60208201526109c3565b8160005b81156127b757806127a181613bdd565b91506127b09050600a83613b2c565b9150612791565b60008167ffffffffffffffff8111156127e057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561280a576020820181803683370190505b5090505b84156124805761281f600183613b5f565b915061282c600a86613bf8565b612837906030613b14565b60f81b81838151811061285a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061287c600a86613b2c565b945061280e565b6001600160e01b031981166301ffc9a760e01b14919050565b6128a68383612a73565b6128b36000848484612958565b610b645760405162461bcd60e51b8152600401610aac90613246565b6128da838383610b64565b6001600160a01b0383166128f6576128f181612b52565b612919565b816001600160a01b0316836001600160a01b031614612919576129198382612b96565b6001600160a01b0382166129355761293081612c33565b610b64565b826001600160a01b0316826001600160a01b031614610b6457610b648282612d0c565b600061296c846001600160a01b0316612d50565b15612a6857836001600160a01b031663150b7a02612988612377565b8786866040518563ffffffff1660e01b81526004016129aa9493929190613150565b602060405180830381600087803b1580156129c457600080fd5b505af19250505080156129f4575060408051601f3d908101601f191682019092526129f191810190613064565b60015b612a4e573d808015612a22576040519150601f19603f3d011682016040523d82523d6000602084013e612a27565b606091505b508051612a465760405162461bcd60e51b8152600401610aac90613246565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612480565b506001949350505050565b6001600160a01b038216612a995760405162461bcd60e51b8152600401610aac906136c8565b612aa28161235a565b15612abf5760405162461bcd60e51b8152600401610aac906132de565b612acb600083836128cf565b6001600160a01b0382166000908152600360205260408120805460019290612af4908490613b14565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612ba38461151f565b612bad9190613b5f565b600083815260076020526040902054909150808214612c00576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c4590600190613b5f565b60008381526009602052604081205460088054939450909284908110612c7b57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612caa57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612cf057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d178361151f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b828054612d6290613ba2565b90600052602060002090601f016020900481019282612d845760008555612dca565b82601f10612d9d57805160ff1916838001178555612dca565b82800160010185558215612dca579182015b82811115612dca578251825591602001919060010190612daf565b50612dd6929150612dda565b5090565b5b80821115612dd65760008155600101612ddb565b600067ffffffffffffffff80841115612e0a57612e0a613c38565b604051601f8501601f191681016020018281118282101715612e2e57612e2e613c38565b604052848152915081838501861015612e4657600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146109c357600080fd5b600060208284031215612e87578081fd5b611dd782612e5f565b60008060408385031215612ea2578081fd5b612eab83612e5f565b9150612eb960208401612e5f565b90509250929050565b600080600060608486031215612ed6578081fd5b612edf84612e5f565b9250612eed60208501612e5f565b9150604084013590509250925092565b60008060008060808587031215612f12578081fd5b612f1b85612e5f565b9350612f2960208601612e5f565b925060408501359150606085013567ffffffffffffffff811115612f4b578182fd5b8501601f81018713612f5b578182fd5b612f6a87823560208401612def565b91505092959194509250565b60008060408385031215612f88578182fd5b612f9183612e5f565b915060208301358015158114612fa5578182fd5b809150509250929050565b60008060408385031215612fc2578182fd5b612fcb83612e5f565b946020939093013593505050565b60008060208385031215612feb578182fd5b823567ffffffffffffffff80821115613002578384fd5b818501915085601f830112613015578384fd5b813581811115613023578485fd5b8660208083028501011115613036578485fd5b60209290920196919550909350505050565b600060208284031215613059578081fd5b8135611dd781613c4e565b600060208284031215613075578081fd5b8151611dd781613c4e565b600060208284031215613091578081fd5b813567ffffffffffffffff8111156130a7578182fd5b8201601f810184136130b7578182fd5b61248084823560208401612def565b6000602082840312156130d7578081fd5b5035919050565b600081518084526130f6816020860160208601613b76565b601f01601f19169290920160200192915050565b6000835161311c818460208801613b76565b835190830190613130818360208801613b76565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613183908301846130de565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611dd760208301846130de565b60208082526017908201527f50726573616c6520686173206e6f742073746172746564000000000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526025908201527f4d696e74696e6720776f756c6420657863656564206d6178207265736572766560408201526464204b424160d81b606082015260800190565b6020808252601b908201527f5075626c69632073616c6520686173206e6f7420737461727465640000000000604082015260600190565b60208082526018908201527f5472616e73616374696f6e20556e7375636365737366756c0000000000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f596f752063616e206f6e6c7920636c61696d206f6e652066726565204b424100604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526035908201527f596f7520617265206e6f7420656c696769626c6520666f722074686520436c61604082015274737320507265736964656e74732070726573616c6560581b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601a908201527f4d757374206d696e74206174206c65617374206f6e65204b4241000000000000604082015260600190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b6020808252602f908201527f596f7520617265206e6f7420656c696769626c6520666f72207468652068616e60408201526e647069636b65642070726573616c6560881b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f45544820616d6f756e7420697320696e636f7272656374000000000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260139082015272496e737566666963656e742062616c616e636560681b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526018908201527f4661696c656420746f2077697468647261772045746865720000000000000000604082015260600190565b60208082526028908201527f50757263686173652065786365656473206d617820616c6c6f77656420706572604082015267206164647265737360c01b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252602e908201527f596f7520617265206e6f7420656c696769626c6520666f72207468652046726560408201526d329036b4b73a101d39b4393ab39d60911b606082015260800190565b60208082526017908201527f43616e6e6f7420616464206e756c6c2061646472657373000000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601a908201527f596f752063616e206f6e6c7920636c61696d203120467265652e000000000000604082015260600190565b6020808252601c908201527f50757263686173652065786365656473206d617820616c6c6f77656400000000604082015260600190565b60208082526021908201527f416d6f756e74206f766572206d617820706572207472616e73616374696f6e2e6040820152600160fd1b606082015260800190565b90815260200190565b60008219821115613b2757613b27613c0c565b500190565b600082613b3b57613b3b613c22565b500490565b6000816000190483118215151615613b5a57613b5a613c0c565b500290565b600082821015613b7157613b71613c0c565b500390565b60005b83811015613b91578181015183820152602001613b79565b83811115611c385750506000910152565b600281046001821680613bb657607f821691505b60208210811415613bd757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613bf157613bf1613c0c565b5060010190565b600082613c0757613c07613c22565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461162f57600080fdfea2646970667358221220f745c296dc4a23fa90f8e59e6260155a449aa9c0a304ec1254227e1eac29d82164736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103765760003560e01c806370a08231116101d1578063c771dbd011610102578063ed1fc2a2116100a0578063f2fde38b1161006f578063f2fde38b1461094a578063f43a22dc1461096a578063f4f4d1071461097f578063fcc35baa1461099457610376565b8063ed1fc2a2146108e0578063ed276606146108f5578063ee8cdd4e1461090a578063ef5d9ae81461092a57610376565b8063d6499512116100dc578063d64995121461086d578063db70cb2f1461088d578063df6e7795146108a0578063e985e9c5146108c057610376565b8063c771dbd014610818578063c87b56dd14610838578063d547cfb71461085857610376565b80639b7f4fc01161016f578063a2e9147711610149578063a2e91477146107bd578063a4146733146107d2578063acde66df146107e5578063b88d4fde146107f857610376565b80639b7f4fc01461076a578063a0712d681461078a578063a22cb4651461079d57610376565b8063853828b6116101ab578063853828b61461070b5780638da5cb5b14610720578063945d589e1461073557806395d89b411461075557610376565b806370a08231146106c1578063715018a6146106e15780637289409d146106f657610376565b806335c1b84d116102ab5780635741cbf3116102495780636352211e116102235780636352211e14610657578063690cf0d1146106775780636c105a791461068c5780636f904c43146106a157610376565b80635741cbf31461060d578063616be0b9146106225780636189f0831461063757610376565b806346bb28331161028557806346bb2833146105985780634f6ccce7146105ad5780635408367e146105cd57806355f804b3146105ed57610376565b806335c1b84d1461053857806340da8b781461055857806342842e0e1461057857610376565b806318160ddd1161031857806324510043116102f257806324510043146104d9578063282b357d146104ee5780632f745c59146105035780632f8145751461052357610376565b806318160ddd146104845780631b5757f21461049957806323b872dd146104b957610376565b8063081812fc11610354578063081812fc14610400578063095ea7b31461042d5780630d0f38b81461044f57806311e776fe1461046457610376565b806301ff9fdf1461037b57806301ffc9a7146103b157806306fdde03146103de575b600080fd5b34801561038757600080fd5b5061039b610396366004612e76565b6109a9565b6040516103a89190613b0b565b60405180910390f35b3480156103bd57600080fd5b506103d16103cc366004613048565b6109c8565b6040516103a891906131a6565b3480156103ea57600080fd5b506103f36109f3565b6040516103a891906131b1565b34801561040c57600080fd5b5061042061041b3660046130c6565b610a85565b6040516103a8919061313c565b34801561043957600080fd5b5061044d610448366004612fb0565b610ad1565b005b34801561045b57600080fd5b5061039b610b69565b34801561047057600080fd5b5061044d61047f3660046130c6565b610b6e565b34801561049057600080fd5b5061039b610bb2565b3480156104a557600080fd5b5061044d6104b4366004612fb0565b610bb8565b3480156104c557600080fd5b5061044d6104d4366004612ec2565b610ce8565b3480156104e557600080fd5b5061039b610d20565b3480156104fa57600080fd5b5061039b610d26565b34801561050f57600080fd5b5061039b61051e366004612fb0565b610d2b565b34801561052f57600080fd5b5061044d610d7d565b34801561054457600080fd5b506103d1610553366004612e76565b610dd0565b34801561056457600080fd5b5061039b610573366004612e76565b610dee565b34801561058457600080fd5b5061044d610593366004612ec2565b610e09565b3480156105a457600080fd5b50610420610e24565b3480156105b957600080fd5b5061039b6105c83660046130c6565b610e3c565b3480156105d957600080fd5b506103d16105e8366004612e76565b610e97565b3480156105f957600080fd5b5061044d610608366004613080565b610eb5565b34801561061957600080fd5b5061044d610f42565b34801561062e57600080fd5b5061039b61136f565b34801561064357600080fd5b5061044d6106523660046130c6565b611375565b34801561066357600080fd5b506104206106723660046130c6565b6113b9565b34801561068357600080fd5b506103d16113ee565b34801561069857600080fd5b5061039b6113fc565b3480156106ad57600080fd5b5061044d6106bc366004612fd9565b611402565b3480156106cd57600080fd5b5061039b6106dc366004612e76565b61151f565b3480156106ed57600080fd5b5061044d611563565b34801561070257600080fd5b5061039b6115ae565b34801561071757600080fd5b5061044d6115b4565b34801561072c57600080fd5b50610420611632565b34801561074157600080fd5b5061039b610750366004612e76565b611641565b34801561076157600080fd5b506103f361165c565b34801561077657600080fd5b506103d1610785366004612e76565b61166b565b61044d6107983660046130c6565b611689565b3480156107a957600080fd5b5061044d6107b8366004612f76565b61183b565b3480156107c957600080fd5b506103d1611851565b61044d6107e03660046130c6565b61185a565b61044d6107f33660046130c6565b611a16565b34801561080457600080fd5b5061044d610813366004612efd565b611bff565b34801561082457600080fd5b5061044d610833366004612fd9565b611c3e565b34801561084457600080fd5b506103f36108533660046130c6565b611d5b565b34801561086457600080fd5b506103f3611dde565b34801561087957600080fd5b5061044d6108883660046130c6565b611e6c565b61044d61089b3660046130c6565b611eb0565b3480156108ac57600080fd5b5061044d6108bb366004612fd9565b612099565b3480156108cc57600080fd5b506103d16108db366004612e90565b6121b6565b3480156108ec57600080fd5b5061044d6121e4565b34801561090157600080fd5b5061039b612240565b34801561091657600080fd5b5061044d6109253660046130c6565b612246565b34801561093657600080fd5b5061039b610945366004612e76565b61228a565b34801561095657600080fd5b5061044d610965366004612e76565b61229c565b34801561097657600080fd5b5061039b61230a565b34801561098b57600080fd5b5061039b612310565b3480156109a057600080fd5b5061039b612315565b6001600160a01b0381166000908152601860205260409020545b919050565b60006001600160e01b0319821663780e9d6360e01b14806109ed57506109ed8261231a565b92915050565b606060008054610a0290613ba2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2e90613ba2565b8015610a7b5780601f10610a5057610100808354040283529160200191610a7b565b820191906000526020600020905b815481529060010190602001808311610a5e57829003601f168201915b5050505050905090565b6000610a908261235a565b610ab55760405162461bcd60e51b8152600401610aac90613734565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610adc826113b9565b9050806001600160a01b0316836001600160a01b03161415610b105760405162461bcd60e51b8152600401610aac906138f9565b806001600160a01b0316610b22612377565b6001600160a01b03161480610b3e5750610b3e816108db612377565b610b5a5760405162461bcd60e51b8152600401610aac906134c6565b610b64838361237b565b505050565b600381565b610b76612377565b6001600160a01b0316610b87611632565b6001600160a01b031614610bad5760405162461bcd60e51b8152600401610aac906137ad565b600b55565b60085490565b610bc0612377565b6001600160a01b0316610bd1611632565b6001600160a01b031614610bf75760405162461bcd60e51b8152600401610aac906137ad565b607d81600f54610c079190613b14565b1115610c255760405162461bcd60e51b8152600401610aac90613315565b6001600160a01b038216610c4b5760405162461bcd60e51b8152600401610aac90613988565b600b5481610c57610bb2565b610c619190613b14565b1115610c7f5760405162461bcd60e51b8152600401610aac90613642565b60105460005b82811015610cb257610ca084610c9b8385613b14565b6123e9565b80610caa81613bdd565b915050610c85565b508160106000828254610cc59190613b14565b9250508190555081600f6000828254610cde9190613b14565b9091555050505050565b610cf9610cf3612377565b82612403565b610d155760405162461bcd60e51b8152600401610aac906139bf565b610b64838383612488565b600f5481565b607d81565b6000610d368361151f565b8210610d545760405162461bcd60e51b8152600401610aac906131fb565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d85612377565b6001600160a01b0316610d96611632565b6001600160a01b031614610dbc5760405162461bcd60e51b8152600401610aac906137ad565b6012805460ff19811660ff90911615179055565b6001600160a01b031660009081526013602052604090205460ff1690565b6001600160a01b031660009081526019602052604090205490565b610b6483838360405180602001604052806000815250611bff565b736f452562d7e0e9df2135b5f797cff9a34b0b550c81565b6000610e46610bb2565b8210610e645760405162461bcd60e51b8152600401610aac90613a10565b60088281548110610e8557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6001600160a01b031660009081526014602052604090205460ff1690565b610ebd612377565b6001600160a01b0316610ece611632565b6001600160a01b031614610ef45760405162461bcd60e51b8152600401610aac906137ad565b8051610f07906011906020840190612d56565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610f3791906131b1565b60405180910390a150565b610f4a612377565b6001600160a01b0316610f5b611632565b6001600160a01b031614610f815760405162461bcd60e51b8152600401610aac906137ad565b477381db670cf7f5208454a07cc8dd4adf24fd0a423273b70e84202bea66d4af3d079b20196a94b0632825739aab7614edaaea8a2bb145c3bfefc10c6fb1bde07395012c8a2e28e689e51a15aa83c3a82ab9bcf170732c8a40e48c31c167664f71d5235e7e67e9696407736f452562d7e0e9df2135b5f797cff9a34b0b550c60008660646110108a6028613b40565b61101a9190613b2c565b60405161102690613139565b60006040518083038185875af1925050503d8060008114611063576040519150601f19603f3d011682016040523d82523d6000602084013e611068565b606091505b5050809150508061108b5760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03861660646110a28a601f613b40565b6110ac9190613b2c565b6040516110b890613139565b60006040518083038185875af1925050503d80600081146110f5576040519150601f19603f3d011682016040523d82523d6000602084013e6110fa565b606091505b5050809150508061111d5760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03851660646111348a6010613b40565b61113e9190613b2c565b60405161114a90613139565b60006040518083038185875af1925050503d8060008114611187576040519150601f19603f3d011682016040523d82523d6000602084013e61118c565b606091505b505080915050806111af5760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03841660646111c68a6003613b40565b6111d09190613b2c565b6040516111dc90613139565b60006040518083038185875af1925050503d8060008114611219576040519150601f19603f3d011682016040523d82523d6000602084013e61121e565b606091505b505080915050806112415760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03831660646112588a6003613b40565b6112629190613b2c565b60405161126e90613139565b60006040518083038185875af1925050503d80600081146112ab576040519150601f19603f3d011682016040523d82523d6000602084013e6112b0565b606091505b505080915050806112d35760405162461bcd60e51b8152600401610aac90613391565b6001600160a01b03821660646112ea8a6007613b40565b6112f49190613b2c565b60405161130090613139565b60006040518083038185875af1925050503d806000811461133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b505080915050806113655760405162461bcd60e51b8152600401610aac90613391565b5050505050505050565b60105481565b61137d612377565b6001600160a01b031661138e611632565b6001600160a01b0316146113b45760405162461bcd60e51b8152600401610aac906137ad565b600d55565b6000818152600260205260408120546001600160a01b0316806109ed5760405162461bcd60e51b8152600401610aac906135c2565b601254610100900460ff1681565b600d5481565b61140a612377565b6001600160a01b031661141b611632565b6001600160a01b0316146114415760405162461bcd60e51b8152600401610aac906137ad565b60005b81811015610b6457600083838381811061146e57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114839190612e76565b6001600160a01b031614156114aa5760405162461bcd60e51b8152600401610aac90613988565b6001601460008585858181106114d057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114e59190612e76565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061151781613bdd565b915050611444565b60006001600160a01b0382166115475760405162461bcd60e51b8152600401610aac90613578565b506001600160a01b031660009081526003602052604090205490565b61156b612377565b6001600160a01b031661157c611632565b6001600160a01b0316146115a25760405162461bcd60e51b8152600401610aac906137ad565b6115ac60006125b5565b565b600b5481565b6115bc612377565b6001600160a01b03166115cd611632565b6001600160a01b0316146115f35760405162461bcd60e51b8152600401610aac906137ad565b47806116115760405162461bcd60e51b8152600401610aac90613780565b61162f736f452562d7e0e9df2135b5f797cff9a34b0b550c47612607565b50565b600a546001600160a01b031690565b6001600160a01b031660009081526017602052604090205490565b606060018054610a0290613ba2565b6001600160a01b031660009081526015602052604090205460ff1690565b60125460ff166116ab5760405162461bcd60e51b8152600401610aac9061335a565b600f546116b990607d613b5f565b600b546116c69190613b5f565b816116cf610bb2565b6116d99190613b14565b11156116f75760405162461bcd60e51b8152600401610aac90613642565b600d5433600090815260166020526040902054611715908390613b14565b11156117335760405162461bcd60e51b8152600401610aac906138b1565b600081116117535760405162461bcd60e51b8152600401610aac9061360b565b600e548111156117755760405162461bcd60e51b8152600401610aac90613aca565b3481600c546117849190613b40565b11156117a25760405162461bcd60e51b8152600401610aac906136fd565b60005b8181101561180957601080549060019060006117c18385613b14565b90915550503360009081526016602052604081208054600192906117e6908490613b14565b909155506117f6905033826123e9565b508061180181613bdd565b9150506117a5565b507f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b53382604051610f3792919061318d565b61184d611846612377565b8383612683565b5050565b60125460ff1681565b601254610100900460ff166118815760405162461bcd60e51b8152600401610aac906131c4565b3360009081526015602052604090205460ff166118b05760405162461bcd60e51b8152600401610aac9061393a565b600f546118be90607d613b5f565b600b546118cb9190613b5f565b816118d4610bb2565b6118de9190613b14565b11156118fc5760405162461bcd60e51b8152600401610aac90613642565b3360009081526019602052604090205460019061191a908390613b14565b11156119385760405162461bcd60e51b8152600401610aac90613a5c565b600281106119585760405162461bcd60e51b8152600401610aac90613443565b60005b818110156119e457601080549060019060006119778385613b14565b909155505033600090815260166020526040812080546001929061199c908490613b14565b90915550503360009081526019602052604081208054600192906119c1908490613b14565b909155506119d1905033826123e9565b50806119dc81613bdd565b91505061195b565b507f1a75c98f3caa5c596c30e5e4c83e0802685273950677d98a322c514a03b05b573382604051610f3792919061318d565b601254610100900460ff16611a3d5760405162461bcd60e51b8152600401610aac906131c4565b3360009081526013602052604090205460ff16611a6c5760405162461bcd60e51b8152600401610aac90613679565b600f54611a7a90607d613b5f565b600b54611a879190613b5f565b81611a90610bb2565b611a9a9190613b14565b1115611ab85760405162461bcd60e51b8152600401610aac90613642565b33600090815260176020526040902054600390611ad6908390613b14565b1115611af45760405162461bcd60e51b8152600401610aac90613a93565b60008111611b145760405162461bcd60e51b8152600401610aac9061360b565b3481600c54611b239190613b40565b1115611b415760405162461bcd60e51b8152600401610aac906136fd565b60005b81811015611bcd5760108054906001906000611b608385613b14565b9091555050336000908152601660205260408120805460019290611b85908490613b14565b9091555050336000908152601760205260408120805460019290611baa908490613b14565b90915550611bba905033826123e9565b5080611bc581613bdd565b915050611b44565b507fdcc508bb1343b5f16be8b6748c4a4b84a60717b2586d6393401a2a9b21e572313382604051610f3792919061318d565b611c10611c0a612377565b83612403565b611c2c5760405162461bcd60e51b8152600401610aac906139bf565b611c3884848484612726565b50505050565b611c46612377565b6001600160a01b0316611c57611632565b6001600160a01b031614611c7d5760405162461bcd60e51b8152600401610aac906137ad565b60005b81811015610b64576000838383818110611caa57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611cbf9190612e76565b6001600160a01b03161415611ce65760405162461bcd60e51b8152600401610aac90613988565b600160156000858585818110611d0c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d219190612e76565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611d5381613bdd565b915050611c80565b6060611d668261235a565b611d825760405162461bcd60e51b8152600401610aac9061382b565b6000611d8c612759565b90506000815111611dac5760405180602001604052806000815250611dd7565b80611db684612768565b604051602001611dc792919061310a565b6040516020818303038152906040525b9392505050565b60118054611deb90613ba2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1790613ba2565b8015611e645780601f10611e3957610100808354040283529160200191611e64565b820191906000526020600020905b815481529060010190602001808311611e4757829003601f168201915b505050505081565b611e74612377565b6001600160a01b0316611e85611632565b6001600160a01b031614611eab5760405162461bcd60e51b8152600401610aac906137ad565b600e55565b601254610100900460ff16611ed75760405162461bcd60e51b8152600401610aac906131c4565b3360009081526014602052604090205460ff16611f065760405162461bcd60e51b8152600401610aac90613523565b600f54611f1490607d613b5f565b600b54611f219190613b5f565b81611f2a610bb2565b611f349190613b14565b1115611f525760405162461bcd60e51b8152600401610aac90613642565b33600090815260176020526040902054600590611f70908390613b14565b1115611f8e5760405162461bcd60e51b8152600401610aac90613a93565b60008111611fae5760405162461bcd60e51b8152600401610aac9061360b565b3481600c54611fbd9190613b40565b1115611fdb5760405162461bcd60e51b8152600401610aac906136fd565b60005b818110156120675760108054906001906000611ffa8385613b14565b909155505033600090815260166020526040812080546001929061201f908490613b14565b9091555050336000908152601760205260408120805460019290612044908490613b14565b90915550612054905033826123e9565b508061205f81613bdd565b915050611fde565b507fbff48f099ef54992004a057882a32cfbbc347a3c9fd3f785b55844a94a296f2d3382604051610f3792919061318d565b6120a1612377565b6001600160a01b03166120b2611632565b6001600160a01b0316146120d85760405162461bcd60e51b8152600401610aac906137ad565b60005b81811015610b6457600083838381811061210557634e487b7160e01b600052603260045260246000fd5b905060200201602081019061211a9190612e76565b6001600160a01b031614156121415760405162461bcd60e51b8152600401610aac90613988565b60016013600085858581811061216757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061217c9190612e76565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806121ae81613bdd565b9150506120db565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6121ec612377565b6001600160a01b03166121fd611632565b6001600160a01b0316146122235760405162461bcd60e51b8152600401610aac906137ad565b6012805461ff001981166101009182900460ff1615909102179055565b600c5481565b61224e612377565b6001600160a01b031661225f611632565b6001600160a01b0316146122855760405162461bcd60e51b8152600401610aac906137ad565b600c55565b60166020526000908152604090205481565b6122a4612377565b6001600160a01b03166122b5611632565b6001600160a01b0316146122db5760405162461bcd60e51b8152600401610aac906137ad565b6001600160a01b0381166123015760405162461bcd60e51b8152600401610aac90613298565b61162f816125b5565b600e5481565b600181565b600581565b60006001600160e01b031982166380ac58cd60e01b148061234b57506001600160e01b03198216635b5e139f60e01b145b806109ed57506109ed82612883565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123b0826113b9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61184d82826040518060200160405280600081525061289c565b600061240e8261235a565b61242a5760405162461bcd60e51b8152600401610aac9061347a565b6000612435836113b9565b9050806001600160a01b0316846001600160a01b031614806124705750836001600160a01b031661246584610a85565b6001600160a01b0316145b80612480575061248081856121b6565b949350505050565b826001600160a01b031661249b826113b9565b6001600160a01b0316146124c15760405162461bcd60e51b8152600401610aac906137e2565b6001600160a01b0382166124e75760405162461bcd60e51b8152600401610aac906133c8565b6124f28383836128cf565b6124fd60008261237b565b6001600160a01b0383166000908152600360205260408120805460019290612526908490613b5f565b90915550506001600160a01b0382166000908152600360205260408120805460019290612554908490613b14565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405161262090613139565b60006040518083038185875af1925050503d806000811461265d576040519150601f19603f3d011682016040523d82523d6000602084013e612662565b606091505b5050905080610b645760405162461bcd60e51b8152600401610aac9061387a565b816001600160a01b0316836001600160a01b031614156126b55760405162461bcd60e51b8152600401610aac9061340c565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906127199085906131a6565b60405180910390a3505050565b612731848484612488565b61273d84848484612958565b611c385760405162461bcd60e51b8152600401610aac90613246565b606060118054610a0290613ba2565b60608161278d57506040805180820190915260018152600360fc1b60208201526109c3565b8160005b81156127b757806127a181613bdd565b91506127b09050600a83613b2c565b9150612791565b60008167ffffffffffffffff8111156127e057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561280a576020820181803683370190505b5090505b84156124805761281f600183613b5f565b915061282c600a86613bf8565b612837906030613b14565b60f81b81838151811061285a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061287c600a86613b2c565b945061280e565b6001600160e01b031981166301ffc9a760e01b14919050565b6128a68383612a73565b6128b36000848484612958565b610b645760405162461bcd60e51b8152600401610aac90613246565b6128da838383610b64565b6001600160a01b0383166128f6576128f181612b52565b612919565b816001600160a01b0316836001600160a01b031614612919576129198382612b96565b6001600160a01b0382166129355761293081612c33565b610b64565b826001600160a01b0316826001600160a01b031614610b6457610b648282612d0c565b600061296c846001600160a01b0316612d50565b15612a6857836001600160a01b031663150b7a02612988612377565b8786866040518563ffffffff1660e01b81526004016129aa9493929190613150565b602060405180830381600087803b1580156129c457600080fd5b505af19250505080156129f4575060408051601f3d908101601f191682019092526129f191810190613064565b60015b612a4e573d808015612a22576040519150601f19603f3d011682016040523d82523d6000602084013e612a27565b606091505b508051612a465760405162461bcd60e51b8152600401610aac90613246565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612480565b506001949350505050565b6001600160a01b038216612a995760405162461bcd60e51b8152600401610aac906136c8565b612aa28161235a565b15612abf5760405162461bcd60e51b8152600401610aac906132de565b612acb600083836128cf565b6001600160a01b0382166000908152600360205260408120805460019290612af4908490613b14565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612ba38461151f565b612bad9190613b5f565b600083815260076020526040902054909150808214612c00576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c4590600190613b5f565b60008381526009602052604081205460088054939450909284908110612c7b57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110612caa57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612cf057634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d178361151f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b828054612d6290613ba2565b90600052602060002090601f016020900481019282612d845760008555612dca565b82601f10612d9d57805160ff1916838001178555612dca565b82800160010185558215612dca579182015b82811115612dca578251825591602001919060010190612daf565b50612dd6929150612dda565b5090565b5b80821115612dd65760008155600101612ddb565b600067ffffffffffffffff80841115612e0a57612e0a613c38565b604051601f8501601f191681016020018281118282101715612e2e57612e2e613c38565b604052848152915081838501861015612e4657600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146109c357600080fd5b600060208284031215612e87578081fd5b611dd782612e5f565b60008060408385031215612ea2578081fd5b612eab83612e5f565b9150612eb960208401612e5f565b90509250929050565b600080600060608486031215612ed6578081fd5b612edf84612e5f565b9250612eed60208501612e5f565b9150604084013590509250925092565b60008060008060808587031215612f12578081fd5b612f1b85612e5f565b9350612f2960208601612e5f565b925060408501359150606085013567ffffffffffffffff811115612f4b578182fd5b8501601f81018713612f5b578182fd5b612f6a87823560208401612def565b91505092959194509250565b60008060408385031215612f88578182fd5b612f9183612e5f565b915060208301358015158114612fa5578182fd5b809150509250929050565b60008060408385031215612fc2578182fd5b612fcb83612e5f565b946020939093013593505050565b60008060208385031215612feb578182fd5b823567ffffffffffffffff80821115613002578384fd5b818501915085601f830112613015578384fd5b813581811115613023578485fd5b8660208083028501011115613036578485fd5b60209290920196919550909350505050565b600060208284031215613059578081fd5b8135611dd781613c4e565b600060208284031215613075578081fd5b8151611dd781613c4e565b600060208284031215613091578081fd5b813567ffffffffffffffff8111156130a7578182fd5b8201601f810184136130b7578182fd5b61248084823560208401612def565b6000602082840312156130d7578081fd5b5035919050565b600081518084526130f6816020860160208601613b76565b601f01601f19169290920160200192915050565b6000835161311c818460208801613b76565b835190830190613130818360208801613b76565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613183908301846130de565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252611dd760208301846130de565b60208082526017908201527f50726573616c6520686173206e6f742073746172746564000000000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526025908201527f4d696e74696e6720776f756c6420657863656564206d6178207265736572766560408201526464204b424160d81b606082015260800190565b6020808252601b908201527f5075626c69632073616c6520686173206e6f7420737461727465640000000000604082015260600190565b60208082526018908201527f5472616e73616374696f6e20556e7375636365737366756c0000000000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f596f752063616e206f6e6c7920636c61696d206f6e652066726565204b424100604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526035908201527f596f7520617265206e6f7420656c696769626c6520666f722074686520436c61604082015274737320507265736964656e74732070726573616c6560581b606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601a908201527f4d757374206d696e74206174206c65617374206f6e65204b4241000000000000604082015260600190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b6020808252602f908201527f596f7520617265206e6f7420656c696769626c6520666f72207468652068616e60408201526e647069636b65642070726573616c6560881b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f45544820616d6f756e7420697320696e636f7272656374000000000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260139082015272496e737566666963656e742062616c616e636560681b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526018908201527f4661696c656420746f2077697468647261772045746865720000000000000000604082015260600190565b60208082526028908201527f50757263686173652065786365656473206d617820616c6c6f77656420706572604082015267206164647265737360c01b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252602e908201527f596f7520617265206e6f7420656c696769626c6520666f72207468652046726560408201526d329036b4b73a101d39b4393ab39d60911b606082015260800190565b60208082526017908201527f43616e6e6f7420616464206e756c6c2061646472657373000000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601a908201527f596f752063616e206f6e6c7920636c61696d203120467265652e000000000000604082015260600190565b6020808252601c908201527f50757263686173652065786365656473206d617820616c6c6f77656400000000604082015260600190565b60208082526021908201527f416d6f756e74206f766572206d617820706572207472616e73616374696f6e2e6040820152600160fd1b606082015260800190565b90815260200190565b60008219821115613b2757613b27613c0c565b500190565b600082613b3b57613b3b613c22565b500490565b6000816000190483118215151615613b5a57613b5a613c0c565b500290565b600082821015613b7157613b71613c0c565b500390565b60005b83811015613b91578181015183820152602001613b79565b83811115611c385750506000910152565b600281046001821680613bb657607f821691505b60208210811415613bd757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613bf157613bf1613c0c565b5060010190565b600082613c0757613c07613c22565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461162f57600080fdfea2646970667358221220f745c296dc4a23fa90f8e59e6260155a449aa9c0a304ec1254227e1eac29d82164736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

211:10359:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3957:133;;;;;;;;;;-1:-1:-1;3957:133:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;989:222:4;;;;;;;;;;-1:-1:-1;989:222:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2408:98:3:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3457:401::-;;;;;;;;;;-1:-1:-1;3457:401:3;;;;;:::i;:::-;;:::i;:::-;;498:39:13;;;;;;;;;;;;;:::i;8354:90::-;;;;;;;;;;-1:-1:-1;8354:90:13;;;;;:::i;:::-;;:::i;1614:111:4:-;;;;;;;;;;;;;:::i;2029:573:13:-;;;;;;;;;;-1:-1:-1;2029:573:13;;;;;:::i;:::-;;:::i;4646:330:3:-;;;;;;;;;;-1:-1:-1;4646:330:3;;;;;:::i;:::-;;:::i;731:30:13:-;;;;;;;;;;;;;:::i;591:42::-;;;;;;;;;;;;;:::i;1290:253:4:-;;;;;;;;;;-1:-1:-1;1290:253:4;;;;;:::i;:::-;;:::i;7979:109:13:-;;;;;;;;;;;;;:::i;3456:112::-;;;;;;;;;;-1:-1:-1;3456:112:13;;;;;:::i;:::-;;:::i;4096:122::-;;;;;;;;;;-1:-1:-1;4096:122:13;;;;;:::i;:::-;;:::i;5042:179:3:-;;;;;;;;;;-1:-1:-1;5042:179:3;;;;;:::i;:::-;;:::i;640:83:13:-;;;;;;;;;;;;;:::i;1797:230:4:-;;;;;;;;;;-1:-1:-1;1797:230:4;;;;;:::i;:::-;;:::i;3574:127:13:-;;;;;;;;;;-1:-1:-1;3574:127:13;;;;;:::i;:::-;;:::i;8211:137::-;;;;;;;;;;-1:-1:-1;8211:137:13;;;;;:::i;:::-;;:::i;8775:1387::-;;;;;;;;;;;;;:::i;768:32::-;;;;;;;;;;;;;:::i;8561:106::-;;;;;;;;;;-1:-1:-1;8561:106:13;;;;;:::i;:::-;;:::i;2111:235:3:-;;;;;;;;;;-1:-1:-1;2111:235:3;;;;;:::i;:::-;;:::i;875:26:13:-;;;;;;;;;;;;;:::i;371:32::-;;;;;;;;;;;;;:::i;2884:285::-;;;;;;;;;;-1:-1:-1;2884:285:13;;;;;:::i;:::-;;:::i;1849:205:3:-;;;;;;;;;;-1:-1:-1;1849:205:3;;;;;:::i;:::-;;:::i;1661:101:10:-;;;;;;;;;;;;;:::i;291:30:13:-;;;;;;;;;;;;;:::i;10168:207::-;;;;;;;;;;;;;:::i;1029:85:10:-;;;;;;;;;;;;;:::i;3833:118:13:-;;;;;;;;;;-1:-1:-1;3833:118:13;;;;;:::i;:::-;;:::i;2570:102:3:-;;;;;;;;;;;;;:::i;3707:116:13:-;;;;;;;;;;-1:-1:-1;3707:116:13;;;;;:::i;:::-;;:::i;6985:882::-;;;;;;:::i;:::-;;:::i;4203:153:3:-;;;;;;;;;;-1:-1:-1;4203:153:3;;;;;:::i;:::-;;:::i;840:29:13:-;;;;;;;;;;;;;:::i;6119:844::-;;;;;;:::i;:::-;;:::i;4224:923::-;;;;;;:::i;:::-;;:::i;5287:320:3:-;;;;;;;;;;-1:-1:-1;5287:320:3;;;;;:::i;:::-;;:::i;3175:271:13:-;;;;;;;;;;-1:-1:-1;3175:271:13;;;;;:::i;:::-;;:::i;2738:329:3:-;;;;;;;;;;-1:-1:-1;2738:329:3;;;;;:::i;:::-;;:::i;807:26:13:-;;;;;;;;;;;;;:::i;8674:95::-;;;;;;;;;;-1:-1:-1;8674:95:13;;;;;:::i;:::-;;:::i;5153:960::-;;;;;;:::i;:::-;;:::i;2608:270::-;;;;;;;;;;-1:-1:-1;2608:270:13;;;;;:::i;:::-;;:::i;4422:162:3:-;;;;;;;;;;-1:-1:-1;4422:162:3;;;;;:::i;:::-;;:::i;7873:100:13:-;;;;;;;;;;;;;:::i;328:36::-;;;;;;;;;;;;;:::i;8451:104::-;;;;;;;;;;-1:-1:-1;8451:104:13;;;;;:::i;:::-;;:::i;1070:47::-;;;;;;;;;;-1:-1:-1;1070:47:13;;;;;:::i;:::-;;:::i;1911:198:10:-;;;;;;;;;;-1:-1:-1;1911:198:10;;;;;:::i;:::-;;:::i;409:29:13:-;;;;;;;;;;;;;:::i;543:41::-;;;;;;;;;;;;;:::i;445:47::-;;;;;;;;;;;;;:::i;3957:133::-;-1:-1:-1;;;;;4055:28:13;;4029:7;4055:28;;;:22;:28;;;;;;3957:133;;;;:::o;989:222:4:-;1091:4;-1:-1:-1;;;;;;1114:50:4;;-1:-1:-1;;;1114:50:4;;:90;;;1168:36;1192:11;1168:23;:36::i;:::-;1107:97;989:222;-1:-1:-1;;989:222:4:o;2408:98:3:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;-1:-1:-1;;;4014:73:3;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;4105:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4105:24:3;;3919:217::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;-1:-1:-1;;;;;3594:11:3;:2;-1:-1:-1;;;;;3594:11:3;;;3586:57;;;;-1:-1:-1;;;3586:57:3;;;;;;;:::i;:::-;3691:5;-1:-1:-1;;;;;3675:21:3;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3675:21:3;;:62;;;;3700:37;3717:5;3724:12;:10;:12::i;3700:37::-;3654:165;;;;-1:-1:-1;;;3654:165:3;;;;;;;:::i;:::-;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3457:401;;;:::o;498:39:13:-;536:1;498:39;:::o;8354:90::-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;8421:7:13::1;:16:::0;8354:90::o;1614:111:4:-;1701:10;:17;1614:111;:::o;2029:573:13:-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;630:3:13::1;2142:6;2124:15;;:24;;;;:::i;:::-;:40;;2116:90;;;;-1:-1:-1::0;;;2116:90:13::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2224:23:13;::::1;2216:59;;;;-1:-1:-1::0;;;2216:59:13::1;;;;;;;:::i;:::-;2319:7;;2309:6;2293:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:33;;2285:77;;;;-1:-1:-1::0;;;2285:77:13::1;;;;;;;:::i;:::-;2396:17;::::0;2373:20:::1;2424:100;2448:6;2444:1;:10;2424:100;;;2475:38;2485:9:::0;2496:16:::1;2511:1:::0;2496:12;:16:::1;:::i;:::-;2475:9;:38::i;:::-;2456:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2424:100;;;;2554:6;2533:17;;:27;;;;;;;:::i;:::-;;;;;;;;2589:6;2570:15;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;2029:573:13:o;4646:330:3:-;4835:41;4854:12;:10;:12::i;:::-;4868:7;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:3;;;;;;;:::i;:::-;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;731:30:13:-;;;;:::o;591:42::-;630:3;591:42;:::o;1290:253:4:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;-1:-1:-1;;;1406:87:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1510:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1290:253::o;7979:109:13:-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;8064:17:13::1;::::0;;-1:-1:-1;;8043:38:13;::::1;8064:17;::::0;;::::1;8063:18;8043:38;::::0;;7979:109::o;3456:112::-;-1:-1:-1;;;;;3544:17:13;3521:4;3544:17;;;:11;:17;;;;;;;;;3456:112::o;4096:122::-;-1:-1:-1;;;;;4188:23:13;4162:7;4188:23;;;:17;:23;;;;;;;4096:122::o;5042:179:3:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;640:83:13:-;681:42;640:83;:::o;1797:230:4:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;-1:-1:-1;;;1891:95:4;;;;;;;:::i;:::-;2003:10;2014:5;2003:17;;;;;;-1:-1:-1;;;2003:17:4;;;;;;;;;;;;;;;;;1996:24;;1797:230;;;:::o;3574:127:13:-;-1:-1:-1;;;;;3669:25:13;3646:4;3669:25;;;:19;:25;;;;;;;;;3574:127::o;8211:137::-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;8281:22:13;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;8318:23;8333:7;8318:23;;;;;;:::i;:::-;;;;;;;;8211:137:::0;:::o;8775:1387::-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;8851:21:13::1;8910:42;8990;9070;9150;9232;9313;8830:18;8910:42:::0;9443:3:::1;9426:15;8851:21:::0;9439:2:::1;9426:15;:::i;:::-;9425:21;;;;:::i;:::-;9403:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9389:63;;;;;9470:7;9462:44;;;;-1:-1:-1::0;;;9462:44:13::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;9531:13:13;::::1;9571:3;9554:15;:10:::0;9567:2:::1;9554:15;:::i;:::-;9553:21;;;;:::i;:::-;9531:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9517:63;;;;;9598:7;9590:44;;;;-1:-1:-1::0;;;9590:44:13::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;9659:13:13;::::1;9699:3;9682:15;:10:::0;9695:2:::1;9682:15;:::i;:::-;9681:21;;;;:::i;:::-;9659:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9645:63;;;;;9726:7;9718:44;;;;-1:-1:-1::0;;;9718:44:13::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;9787:13:13;::::1;9826:3;9810:14;:10:::0;9823:1:::1;9810:14;:::i;:::-;9809:20;;;;:::i;:::-;9787:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9773:62;;;;;9853:7;9845:44;;;;-1:-1:-1::0;;;9845:44:13::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;9922:15:13;::::1;9963:3;9947:14;:10:::0;9960:1:::1;9947:14;:::i;:::-;9946:20;;;;:::i;:::-;9922:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9908:64;;;;;9990:7;9982:44;;;;-1:-1:-1::0;;;9982:44:13::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10051:14:13;::::1;10091:3;10075:14;:10:::0;10088:1:::1;10075:14;:::i;:::-;10074:20;;;;:::i;:::-;10051:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10037:63;;;;;10118:7;10110:44;;;;-1:-1:-1::0;;;10110:44:13::1;;;;;;;:::i;:::-;1311:1:10;;;;;;;;8775:1387:13:o:0;768:32::-;;;;:::o;8561:106::-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;8639:12:13::1;:21:::0;8561:106::o;2111:235:3:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:3;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:3;;;;;;;:::i;875:26:13:-;;;;;;;;;:::o;371:32::-;;;;:::o;2884:285::-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;2979:9:13::1;2974:189;2994:20:::0;;::::1;2974:189;;;3067:1;3043:9:::0;;3053:1;3043:12;;::::1;;;-1:-1:-1::0;;;3043:12:13::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3043:26:13::1;;;3035:62;;;;-1:-1:-1::0;;;3035:62:13::1;;;;;;;:::i;:::-;3148:4;3112:19;:33;3132:9;;3142:1;3132:12;;;;;-1:-1:-1::0;;;3132:12:13::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3112:33:13::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;3112:33:13;:40;;-1:-1:-1;;3112:40:13::1;::::0;::::1;;::::0;;;::::1;::::0;;3016:3;::::1;::::0;::::1;:::i;:::-;;;;2974:189;;1849:205:3::0;1921:7;-1:-1:-1;;;;;1948:19:3;;1940:74;;;;-1:-1:-1;;;1940:74:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;;2031:16:3;;;;;:9;:16;;;;;;;1849:205::o;1661:101:10:-;1252:12;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;291:30:13:-;;;;:::o;10168:207::-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;10236:21:13::1;10275:11:::0;10267:43:::1;;;;-1:-1:-1::0;;;10267:43:13::1;;;;;;;:::i;:::-;10320:48;681:42;10346:21;10320:9;:48::i;:::-;1311:1:10;10168:207:13:o:0;1029:85:10:-;1101:6;;-1:-1:-1;;;;;1101:6:10;1029:85;:::o;3833:118:13:-;-1:-1:-1;;;;;3923:21:13;3897:7;3923:21;;;:15;:21;;;;;;;3833:118::o;2570:102:3:-;2626:13;2658:7;2651:14;;;;;:::i;3707:116:13:-;-1:-1:-1;;;;;3797:19:13;3774:4;3797:19;;;:13;:19;;;;;;;;;3707:116::o;6985:882::-;1837:17;;;;1829:57;;;;-1:-1:-1;;;1829:57:13;;;;;;;:::i;:::-;7144:15:::1;::::0;7129:30:::1;::::0;630:3:::1;7129:30;:::i;:::-;7118:7;;:42;;;;:::i;:::-;7098:16;7082:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:78;;7074:122;;;;-1:-1:-1::0;;;7074:122:13::1;;;;;;;:::i;:::-;7261:12;::::0;7227:10:::1;7214:24;::::0;;;:12:::1;:24;::::0;;;;;:43:::1;::::0;7241:16;;7214:43:::1;:::i;:::-;:59;;7206:112;;;;-1:-1:-1::0;;;7206:112:13::1;;;;;;;:::i;:::-;7355:1;7336:16;:20;7328:59;;;;-1:-1:-1::0;;;7328:59:13::1;;;;;;;:::i;:::-;7425:10;;7405:16;:30;;7397:76;;;;-1:-1:-1::0;;;7397:76:13::1;;;;;;;:::i;:::-;7522:9;7502:16;7491:8;;:27;;;;:::i;:::-;:40;;7483:76;;;;-1:-1:-1::0;;;7483:76:13::1;;;;;;;:::i;:::-;7575:9;7570:231;7594:16;7590:1;:20;7570:231;;;7649:17;::::0;;;7702:1:::1;::::0;7631:15:::1;7681:22;7702:1:::0;7649:17;7681:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;7730:10:13::1;7717:24;::::0;;;:12:::1;:24;::::0;;;;:29;;7745:1:::1;::::0;7717:24;:29:::1;::::0;7745:1;;7717:29:::1;:::i;:::-;::::0;;;-1:-1:-1;7760:30:13::1;::::0;-1:-1:-1;7770:10:13::1;7782:7:::0;7760:9:::1;:30::i;:::-;-1:-1:-1::0;7612:3:13;::::1;::::0;::::1;:::i;:::-;;;;7570:231;;;;7816:44;7831:10;7843:16;7816:44;;;;;;;:::i;4203:153:3:-:0;4297:52;4316:12;:10;:12::i;:::-;4330:8;4340;4297:18;:52::i;:::-;4203:153;;:::o;840:29:13:-;;;;;;:::o;6119:844::-;1720:14;;;;;;;1712:50;;;;-1:-1:-1;;;1712:50:13;;;;;;;:::i;:::-;6231:10:::1;6217:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;6209:84;;;;-1:-1:-1::0;;;6209:84:13::1;;;;;;;:::i;:::-;6373:15;::::0;6358:30:::1;::::0;630:3:::1;6358:30;:::i;:::-;6347:7;;:42;;;;:::i;:::-;6327:16;6311:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:78;;6303:122;;;;-1:-1:-1::0;;;6303:122:13::1;;;;;;;:::i;:::-;6461:10;6443:29;::::0;;;:17:::1;:29;::::0;;;;;583:1:::1;::::0;6443:48:::1;::::0;6475:16;;6443:48:::1;:::i;:::-;:65;;6435:104;;;;-1:-1:-1::0;;;6435:104:13::1;;;;;;;:::i;:::-;6576:1;6557:16;:20;6549:64;;;;-1:-1:-1::0;;;6549:64:13::1;;;;;;;:::i;:::-;6629:9;6624:279;6648:16;6644:1;:20;6624:279;;;6703:17;::::0;;;6756:1:::1;::::0;6685:15:::1;6735:22;6756:1:::0;6703:17;6735:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;6784:10:13::1;6771:24;::::0;;;:12:::1;:24;::::0;;;;:29;;6799:1:::1;::::0;6771:24;:29:::1;::::0;6799:1;;6771:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;6832:10:13::1;6814:29;::::0;;;:17:::1;:29;::::0;;;;:34;;6847:1:::1;::::0;6814:29;:34:::1;::::0;6847:1;;6814:34:::1;:::i;:::-;::::0;;;-1:-1:-1;6862:30:13::1;::::0;-1:-1:-1;6872:10:13::1;6884:7:::0;6862:9:::1;:30::i;:::-;-1:-1:-1::0;6666:3:13;::::1;::::0;::::1;:::i;:::-;;;;6624:279;;;;6918:38;6927:10;6939:16;6918:38;;;;;;;:::i;4224:923::-:0;1720:14;;;;;;;1712:50;;;;-1:-1:-1;;;1712:50:13;;;;;;;:::i;:::-;4339:10:::1;4327:23;::::0;;;:11:::1;:23;::::0;;;;;::::1;;4319:83;;;;-1:-1:-1::0;;;4319:83:13::1;;;;;;;:::i;:::-;4482:15;::::0;4467:30:::1;::::0;630:3:::1;4467:30;:::i;:::-;4456:7;;:42;;;;:::i;:::-;4436:16;4420:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:78;;4412:122;;;;-1:-1:-1::0;;;4412:122:13::1;;;;;;;:::i;:::-;4568:10;4552:27;::::0;;;:15:::1;:27;::::0;;;;;536:1:::1;::::0;4552:46:::1;::::0;4582:16;;4552:46:::1;:::i;:::-;:61;;4544:102;;;;-1:-1:-1::0;;;4544:102:13::1;;;;;;;:::i;:::-;4683:1;4664:16;:20;4656:59;;;;-1:-1:-1::0;;;4656:59:13::1;;;;;;;:::i;:::-;4764:9;4744:16;4733:8;;:27;;;;:::i;:::-;:40;;4725:76;;;;-1:-1:-1::0;;;4725:76:13::1;;;;;;;:::i;:::-;4817:9;4812:277;4836:16;4832:1;:20;4812:277;;;4891:17;::::0;;;4944:1:::1;::::0;4873:15:::1;4923:22;4944:1:::0;4891:17;4923:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;4972:10:13::1;4959:24;::::0;;;:12:::1;:24;::::0;;;;:29;;4987:1:::1;::::0;4959:24;:29:::1;::::0;4987:1;;4959:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;5018:10:13::1;5002:27;::::0;;;:15:::1;:27;::::0;;;;:32;;5033:1:::1;::::0;5002:27;:32:::1;::::0;5033:1;;5002:32:::1;:::i;:::-;::::0;;;-1:-1:-1;5048:30:13::1;::::0;-1:-1:-1;5058:10:13::1;5070:7:::0;5048:9:::1;:30::i;:::-;-1:-1:-1::0;4854:3:13;::::1;::::0;::::1;:::i;:::-;;;;4812:277;;;;5104:36;5111:10;5123:16;5104:36;;;;;;;:::i;5287:320:3:-:0;5456:41;5475:12;:10;:12::i;:::-;5489:7;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:3;;;;;;;:::i;:::-;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;3175:271:13:-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;3262:9:13::1;3257:183;3277:20:::0;;::::1;3257:183;;;3350:1;3326:9:::0;;3336:1;3326:12;;::::1;;;-1:-1:-1::0;;;3326:12:13::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3326:26:13::1;;;3318:62;;;;-1:-1:-1::0;;;3318:62:13::1;;;;;;;:::i;:::-;3425:4;3395:13;:27;3409:9;;3419:1;3409:12;;;;;-1:-1:-1::0;;;3409:12:13::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3395:27:13::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;3395:27:13;:34;;-1:-1:-1;;3395:34:13::1;::::0;::::1;;::::0;;;::::1;::::0;;3299:3;::::1;::::0;::::1;:::i;:::-;;;;3257:183;;2738:329:3::0;2811:13;2844:16;2852:7;2844;:16::i;:::-;2836:76;;;;-1:-1:-1;;;2836:76:3;;;;;;;:::i;:::-;2923:21;2947:10;:8;:10::i;:::-;2923:34;;2998:1;2980:7;2974:21;:25;:86;;;;;;;;;;;;;;;;;3026:7;3035:18;:7;:16;:18::i;:::-;3009:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2974:86;2967:93;2738:329;-1:-1:-1;;;2738:329:3:o;807:26:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8674:95::-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;8743:10:13::1;:19:::0;8674:95::o;5153:960::-;1720:14;;;;;;;1712:50;;;;-1:-1:-1;;;1712:50:13;;;;;;;:::i;:::-;5284:10:::1;5264:31;::::0;;;:19:::1;:31;::::0;;;;;::::1;;5256:97;;;;-1:-1:-1::0;;;5256:97:13::1;;;;;;;:::i;:::-;5433:15;::::0;5418:30:::1;::::0;630:3:::1;5418:30;:::i;:::-;5407:7;;:42;;;;:::i;:::-;5387:16;5371:13;:11;:13::i;:::-;:32;;;;:::i;:::-;:78;;5363:122;;;;-1:-1:-1::0;;;5363:122:13::1;;;;;;;:::i;:::-;5519:10;5503:27;::::0;;;:15:::1;:27;::::0;;;;;491:1:::1;::::0;5503:46:::1;::::0;5533:16;;5503:46:::1;:::i;:::-;:69;;5495:110;;;;-1:-1:-1::0;;;5495:110:13::1;;;;;;;:::i;:::-;5642:1;5623:16;:20;5615:59;;;;-1:-1:-1::0;;;5615:59:13::1;;;;;;;:::i;:::-;5723:9;5703:16;5692:8;;:27;;;;:::i;:::-;:40;;5684:76;;;;-1:-1:-1::0;;;5684:76:13::1;;;;;;;:::i;:::-;5776:9;5771:277;5795:16;5791:1;:20;5771:277;;;5850:17;::::0;;;5903:1:::1;::::0;5832:15:::1;5882:22;5903:1:::0;5850:17;5882:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;5931:10:13::1;5918:24;::::0;;;:12:::1;:24;::::0;;;;:29;;5946:1:::1;::::0;5918:24;:29:::1;::::0;5946:1;;5918:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;5977:10:13::1;5961:27;::::0;;;:15:::1;:27;::::0;;;;:32;;5992:1:::1;::::0;5961:27;:32:::1;::::0;5992:1;;5961:32:::1;:::i;:::-;::::0;;;-1:-1:-1;6007:30:13::1;::::0;-1:-1:-1;6017:10:13::1;6029:7:::0;6007:9:::1;:30::i;:::-;-1:-1:-1::0;5813:3:13;::::1;::::0;::::1;:::i;:::-;;;;5771:277;;;;6063:43;6077:10;6089:16;6063:43;;;;;;;:::i;2608:270::-:0;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;2696:9:13::1;2691:181;2711:20:::0;;::::1;2691:181;;;2784:1;2760:9:::0;;2770:1;2760:12;;::::1;;;-1:-1:-1::0;;;2760:12:13::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2760:26:13::1;;;2752:62;;;;-1:-1:-1::0;;;2752:62:13::1;;;;;;;:::i;:::-;2857:4;2829:11;:25;2841:9;;2851:1;2841:12;;;;;-1:-1:-1::0;;;2841:12:13::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2829:25:13::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;2829:25:13;:32;;-1:-1:-1;;2829:32:13::1;::::0;::::1;;::::0;;;::::1;::::0;;2733:3;::::1;::::0;::::1;:::i;:::-;;;;2691:181;;4422:162:3::0;-1:-1:-1;;;;;4542:25:3;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4422:162::o;7873:100:13:-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;7952:14:13::1;::::0;;-1:-1:-1;;7934:32:13;::::1;7952:14;::::0;;;::::1;;;7951:15;7934:32:::0;;::::1;;::::0;;7873:100::o;328:36::-;;;;:::o;8451:104::-;1252:12:10;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;8524:8:13::1;:24:::0;8451:104::o;1070:47::-;;;;;;;;;;;;;:::o;1911:198:10:-;1252:12;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:10;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1241:23:10;;1233:68;;;;-1:-1:-1;;;1233:68:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:10;::::1;1991:73;;;;-1:-1:-1::0;;;1991:73:10::1;;;;;;;:::i;:::-;2074:28;2093:8;2074:18;:28::i;409:29:13:-:0;;;;:::o;543:41::-;583:1;543:41;:::o;445:47::-;491:1;445:47;:::o;1490:300:3:-;1592:4;-1:-1:-1;;;;;;1627:40:3;;-1:-1:-1;;;1627:40:3;;:104;;-1:-1:-1;;;;;;;1683:48:3;;-1:-1:-1;;;1683:48:3;1627:104;:156;;;;1747:36;1771:11;1747:23;:36::i;7079:125::-;7144:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;:30;;;7079:125::o;640:96:1:-;719:10;640:96;:::o;10930:171:3:-;11004:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11004:29:3;-1:-1:-1;;;;;11004:29:3;;;;;;;;:24;;11057:23;11004:24;11057:14;:23::i;:::-;-1:-1:-1;;;;;11048:46:3;;;;;;;;;;;10930:171;;:::o;8036:108::-;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;7362:344::-;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;-1:-1:-1;;;7471:73:3;;;;;;;:::i;:::-;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;-1:-1:-1;;;;;7611:16:3;:7;-1:-1:-1;;;;;7611:16:3;;:51;;;;7655:7;-1:-1:-1;;;;;7631:31:3;:20;7643:7;7631:11;:20::i;:::-;-1:-1:-1;;;;;7631:31:3;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7603:96;7362:344;-1:-1:-1;;;;7362:344:3:o;10259:560::-;10413:4;-1:-1:-1;;;;;10386:31:3;:23;10401:7;10386:14;:23::i;:::-;-1:-1:-1;;;;;10386:31:3;;10378:85;;;;-1:-1:-1;;;10378:85:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;10481:16:3;;10473:65;;;;-1:-1:-1;;;10473:65:3;;;;;;;:::i;:::-;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;-1:-1:-1;;;;;10690:15:3;;;;;;:9;:15;;;;;:20;;10709:1;;10690:15;:20;;10709:1;;10690:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10720:13:3;;;;;;:9;:13;;;;;:18;;10737:1;;10720:13;:18;;10737:1;;10720:18;:::i;:::-;;;;-1:-1:-1;;10748:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10748:21:3;-1:-1:-1;;;;;10748:21:3;;;;;;;;;10785:27;;10748:16;;10785:27;;;;;;;10259:560;;;:::o;2263:187:10:-;2355:6;;;-1:-1:-1;;;;;2371:17:10;;;-1:-1:-1;;;;;;2371:17:10;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2263:187;;:::o;10381::13:-;10454:12;10472:8;-1:-1:-1;;;;;10472:13:13;10494:7;10472:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10453:54;;;10525:7;10517:44;;;;-1:-1:-1;;;10517:44:13;;;;;;;:::i;11236:307:3:-;11386:8;-1:-1:-1;;;;;11377:17:3;:5;-1:-1:-1;;;;;11377:17:3;;;11369:55;;;;-1:-1:-1;;;11369:55:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;11434:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;11434:46:3;;;;;;;11495:41;;;;;11434:46;;11495:41;:::i;:::-;;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:3;;;;;;;:::i;8094::13:-;8154:13;8186:12;8179:19;;;;;:::i;328:703:12:-;384:13;601:10;597:51;;-1:-1:-1;627:10:12;;;;;;;;;;;;-1:-1:-1;;;627:10:12;;;;;;597:51;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:12;;-1:-1:-1;773:2:12;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;-1:-1:-1;;;817:17:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:12;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:12;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;-1:-1:-1;;;902:14:12;;;;;;;;;;;;:56;-1:-1:-1;;;;;902:56:12;;;;;;;;-1:-1:-1;972:11:12;981:2;972:11;;:::i;:::-;;;844:150;;829:155:2;-1:-1:-1;;;;;;937:40:2;;-1:-1:-1;;;937:40:2;829:155;;;:::o;8365:311:3:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;-1:-1:-1;;;8518:151:3;;;;;;;:::i;2623:572:4:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;-1:-1:-1;;;;;2822:18:4;;2818:183;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;-1:-1:-1;;;;;2917:10:4;:4;-1:-1:-1;;;;;2917:10:4;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;-1:-1:-1;;;;;3014:16:4;;3010:179;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;-1:-1:-1;;;;;3112:10:4;:2;-1:-1:-1;;;;;3112:10:4;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;12096:778:3:-;12246:4;12266:15;:2;-1:-1:-1;;;;;12266:13:3;;:15::i;:::-;12262:606;;;12317:2;-1:-1:-1;;;;;12301:36:3;;12338:12;:10;:12::i;:::-;12352:4;12358:7;12367:5;12301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12301:72:3;;;;;;;;-1:-1:-1;;12301:72:3;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12540:13:3;;12536:266;;12582:60;;-1:-1:-1;;;12582:60:3;;;;;;;:::i;12536:266::-;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;-1:-1:-1;;;;;;12423:51:3;-1:-1:-1;;;12423:51:3;;-1:-1:-1;12416:58:3;;12262:606;-1:-1:-1;12853:4:3;12096:778;;;;;;:::o;8998:372::-;-1:-1:-1;;;;;9077:16:3;;9069:61;;;;-1:-1:-1;;;9069:61:3;;;;;;;:::i;:::-;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;-1:-1:-1;;;9140:58:3;;;;;;;:::i;:::-;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;-1:-1:-1;;;;;9265:13:3;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9293:21:3;-1:-1:-1;;;;;9293:21:3;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;8998:372;;:::o;3901:161:4:-;4004:10;:17;;3977:24;;;;:15;:24;;;;;:44;;;4031:24;;;;;;;;;;;;3901:161::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;5002:18;5023:26;;;:17;:26;;;;;;4941:51;;-1:-1:-1;5153:28:4;;;5149:323;;-1:-1:-1;;;;;5219:18:4;;5197:19;5219:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5268:30;;;;;;:44;;;5384:30;;:17;:30;;;;;:43;;;5149:323;-1:-1:-1;5565:26:4;;;;:17;:26;;;;;;;;5558:33;;;-1:-1:-1;;;;;5608:18:4;;;;;:12;:18;;;;;:34;;;;;;;5601:41;4679:970::o;5937:1061::-;6211:10;:17;6186:22;;6211:21;;6231:1;;6211:21;:::i;:::-;6242:18;6263:24;;;:15;:24;;;;;;6631:10;:26;;6186:46;;-1:-1:-1;6263:24:4;;6186:46;;6631:26;;;;-1:-1:-1;;;6631:26:4;;;;;;;;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;-1:-1:-1;;;6668:22:4;;;;;;;;;;;;;;;;;;;;:36;;;;6772:28;;;:15;:28;;;;;;;:41;;;6941:24;;;;;6934:31;6975:10;:16;;;;;-1:-1:-1;;;6975:16:4;;;;;;;;;;;;;;;;;;;;;;;;;;5937:1061;;;;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;-1:-1:-1;;;;;3620:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3664:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3489:217:4:o;771:377:0:-;1087:20;1133:8;;;771:377::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:14;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:14;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:14;473:16;;;470:25;-1:-1:-1;467:2:14;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:14;;735:42;;725:2;;791:1;788;781:12;806:198;;918:2;906:9;897:7;893:23;889:32;886:2;;;939:6;931;924:22;886:2;967:31;988:9;967:31;:::i;1009:274::-;;;1138:2;1126:9;1117:7;1113:23;1109:32;1106:2;;;1159:6;1151;1144:22;1106:2;1187:31;1208:9;1187:31;:::i;:::-;1177:41;;1237:40;1273:2;1262:9;1258:18;1237:40;:::i;:::-;1227:50;;1096:187;;;;;:::o;1288:342::-;;;;1434:2;1422:9;1413:7;1409:23;1405:32;1402:2;;;1455:6;1447;1440:22;1402:2;1483:31;1504:9;1483:31;:::i;:::-;1473:41;;1533:40;1569:2;1558:9;1554:18;1533:40;:::i;:::-;1523:50;;1620:2;1609:9;1605:18;1592:32;1582:42;;1392:238;;;;;:::o;1635:702::-;;;;;1807:3;1795:9;1786:7;1782:23;1778:33;1775:2;;;1829:6;1821;1814:22;1775:2;1857:31;1878:9;1857:31;:::i;:::-;1847:41;;1907:40;1943:2;1932:9;1928:18;1907:40;:::i;:::-;1897:50;;1994:2;1983:9;1979:18;1966:32;1956:42;;2049:2;2038:9;2034:18;2021:32;2076:18;2068:6;2065:30;2062:2;;;2113:6;2105;2098:22;2062:2;2141:22;;2194:4;2186:13;;2182:27;-1:-1:-1;2172:2:14;;2228:6;2220;2213:22;2172:2;2256:75;2323:7;2318:2;2305:16;2300:2;2296;2292:11;2256:75;:::i;:::-;2246:85;;;1765:572;;;;;;;:::o;2342:369::-;;;2468:2;2456:9;2447:7;2443:23;2439:32;2436:2;;;2489:6;2481;2474:22;2436:2;2517:31;2538:9;2517:31;:::i;:::-;2507:41;;2598:2;2587:9;2583:18;2570:32;2645:5;2638:13;2631:21;2624:5;2621:32;2611:2;;2672:6;2664;2657:22;2611:2;2700:5;2690:15;;;2426:285;;;;;:::o;2716:266::-;;;2845:2;2833:9;2824:7;2820:23;2816:32;2813:2;;;2866:6;2858;2851:22;2813:2;2894:31;2915:9;2894:31;:::i;:::-;2884:41;2972:2;2957:18;;;;2944:32;;-1:-1:-1;;;2803:179:14:o;2987:666::-;;;3134:2;3122:9;3113:7;3109:23;3105:32;3102:2;;;3155:6;3147;3140:22;3102:2;3200:9;3187:23;3229:18;3270:2;3262:6;3259:14;3256:2;;;3291:6;3283;3276:22;3256:2;3334:6;3323:9;3319:22;3309:32;;3379:7;3372:4;3368:2;3364:13;3360:27;3350:2;;3406:6;3398;3391:22;3350:2;3451;3438:16;3477:2;3469:6;3466:14;3463:2;;;3498:6;3490;3483:22;3463:2;3557:7;3552:2;3546;3538:6;3534:15;3530:2;3526:24;3522:33;3519:46;3516:2;;;3583:6;3575;3568:22;3516:2;3619;3611:11;;;;;3641:6;;-1:-1:-1;3092:561:14;;-1:-1:-1;;;;3092:561:14:o;3658:257::-;;3769:2;3757:9;3748:7;3744:23;3740:32;3737:2;;;3790:6;3782;3775:22;3737:2;3834:9;3821:23;3853:32;3879:5;3853:32;:::i;3920:261::-;;4042:2;4030:9;4021:7;4017:23;4013:32;4010:2;;;4063:6;4055;4048:22;4010:2;4100:9;4094:16;4119:32;4145:5;4119:32;:::i;4186:482::-;;4308:2;4296:9;4287:7;4283:23;4279:32;4276:2;;;4329:6;4321;4314:22;4276:2;4374:9;4361:23;4407:18;4399:6;4396:30;4393:2;;;4444:6;4436;4429:22;4393:2;4472:22;;4525:4;4517:13;;4513:27;-1:-1:-1;4503:2:14;;4559:6;4551;4544:22;4503:2;4587:75;4654:7;4649:2;4636:16;4631:2;4627;4623:11;4587:75;:::i;4673:190::-;;4785:2;4773:9;4764:7;4760:23;4756:32;4753:2;;;4806:6;4798;4791:22;4753:2;-1:-1:-1;4834:23:14;;4743:120;-1:-1:-1;4743:120:14:o;4868:259::-;;4949:5;4943:12;4976:6;4971:3;4964:19;4992:63;5048:6;5041:4;5036:3;5032:14;5025:4;5018:5;5014:16;4992:63;:::i;:::-;5109:2;5088:15;-1:-1:-1;;5084:29:14;5075:39;;;;5116:4;5071:50;;4919:208;-1:-1:-1;;4919:208:14:o;5132:470::-;;5349:6;5343:13;5365:53;5411:6;5406:3;5399:4;5391:6;5387:17;5365:53;:::i;:::-;5481:13;;5440:16;;;;5503:57;5481:13;5440:16;5537:4;5525:17;;5503:57;:::i;:::-;5576:20;;5319:283;-1:-1:-1;;;;5319:283:14:o;5607:205::-;5807:3;5798:14::o;5817:203::-;-1:-1:-1;;;;;5981:32:14;;;;5963:51;;5951:2;5936:18;;5918:102::o;6025:490::-;-1:-1:-1;;;;;6294:15:14;;;6276:34;;6346:15;;6341:2;6326:18;;6319:43;6393:2;6378:18;;6371:34;;;6441:3;6436:2;6421:18;;6414:31;;;6025:490;;6462:47;;6489:19;;6481:6;6462:47;:::i;:::-;6454:55;6228:287;-1:-1:-1;;;;;;6228:287:14:o;6520:274::-;-1:-1:-1;;;;;6712:32:14;;;;6694:51;;6776:2;6761:18;;6754:34;6682:2;6667:18;;6649:145::o;6799:187::-;6964:14;;6957:22;6939:41;;6927:2;6912:18;;6894:92::o;6991:221::-;;7140:2;7129:9;7122:21;7160:46;7202:2;7191:9;7187:18;7179:6;7160:46;:::i;7217:347::-;7419:2;7401:21;;;7458:2;7438:18;;;7431:30;7497:25;7492:2;7477:18;;7470:53;7555:2;7540:18;;7391:173::o;7569:407::-;7771:2;7753:21;;;7810:2;7790:18;;;7783:30;7849:34;7844:2;7829:18;;7822:62;-1:-1:-1;;;7915:2:14;7900:18;;7893:41;7966:3;7951:19;;7743:233::o;7981:414::-;8183:2;8165:21;;;8222:2;8202:18;;;8195:30;8261:34;8256:2;8241:18;;8234:62;-1:-1:-1;;;8327:2:14;8312:18;;8305:48;8385:3;8370:19;;8155:240::o;8400:402::-;8602:2;8584:21;;;8641:2;8621:18;;;8614:30;8680:34;8675:2;8660:18;;8653:62;-1:-1:-1;;;8746:2:14;8731:18;;8724:36;8792:3;8777:19;;8574:228::o;8807:352::-;9009:2;8991:21;;;9048:2;9028:18;;;9021:30;9087;9082:2;9067:18;;9060:58;9150:2;9135:18;;8981:178::o;9164:401::-;9366:2;9348:21;;;9405:2;9385:18;;;9378:30;9444:34;9439:2;9424:18;;9417:62;-1:-1:-1;;;9510:2:14;9495:18;;9488:35;9555:3;9540:19;;9338:227::o;9570:351::-;9772:2;9754:21;;;9811:2;9791:18;;;9784:30;9850:29;9845:2;9830:18;;9823:57;9912:2;9897:18;;9744:177::o;9926:348::-;10128:2;10110:21;;;10167:2;10147:18;;;10140:30;10206:26;10201:2;10186:18;;10179:54;10265:2;10250:18;;10100:174::o;10279:400::-;10481:2;10463:21;;;10520:2;10500:18;;;10493:30;10559:34;10554:2;10539:18;;10532:62;-1:-1:-1;;;10625:2:14;10610:18;;10603:34;10669:3;10654:19;;10453:226::o;10684:349::-;10886:2;10868:21;;;10925:2;10905:18;;;10898:30;10964:27;10959:2;10944:18;;10937:55;11024:2;11009:18;;10858:175::o;11038:355::-;11240:2;11222:21;;;11279:2;11259:18;;;11252:30;11318:33;11313:2;11298:18;;11291:61;11384:2;11369:18;;11212:181::o;11398:408::-;11600:2;11582:21;;;11639:2;11619:18;;;11612:30;11678:34;11673:2;11658:18;;11651:62;-1:-1:-1;;;11744:2:14;11729:18;;11722:42;11796:3;11781:19;;11572:234::o;11811:420::-;12013:2;11995:21;;;12052:2;12032:18;;;12025:30;12091:34;12086:2;12071:18;;12064:62;12162:26;12157:2;12142:18;;12135:54;12221:3;12206:19;;11985:246::o;12236:417::-;12438:2;12420:21;;;12477:2;12457:18;;;12450:30;12516:34;12511:2;12496:18;;12489:62;-1:-1:-1;;;12582:2:14;12567:18;;12560:51;12643:3;12628:19;;12410:243::o;12658:406::-;12860:2;12842:21;;;12899:2;12879:18;;;12872:30;12938:34;12933:2;12918:18;;12911:62;-1:-1:-1;;;13004:2:14;12989:18;;12982:40;13054:3;13039:19;;12832:232::o;13069:405::-;13271:2;13253:21;;;13310:2;13290:18;;;13283:30;13349:34;13344:2;13329:18;;13322:62;-1:-1:-1;;;13415:2:14;13400:18;;13393:39;13464:3;13449:19;;13243:231::o;13479:350::-;13681:2;13663:21;;;13720:2;13700:18;;;13693:30;13759:28;13754:2;13739:18;;13732:56;13820:2;13805:18;;13653:176::o;13834:355::-;14036:2;14018:21;;;14075:2;14055:18;;;14048:30;14114:33;14109:2;14094:18;;14087:61;14180:2;14165:18;;14008:181::o;14194:411::-;14396:2;14378:21;;;14435:2;14415:18;;;14408:30;14474:34;14469:2;14454:18;;14447:62;-1:-1:-1;;;14540:2:14;14525:18;;14518:45;14595:3;14580:19;;14368:237::o;14610:356::-;14812:2;14794:21;;;14831:18;;;14824:30;14890:34;14885:2;14870:18;;14863:62;14957:2;14942:18;;14784:182::o;14971:347::-;15173:2;15155:21;;;15212:2;15192:18;;;15185:30;15251:25;15246:2;15231:18;;15224:53;15309:2;15294:18;;15145:173::o;15323:408::-;15525:2;15507:21;;;15564:2;15544:18;;;15537:30;15603:34;15598:2;15583:18;;15576:62;-1:-1:-1;;;15669:2:14;15654:18;;15647:42;15721:3;15706:19;;15497:234::o;15736:343::-;15938:2;15920:21;;;15977:2;15957:18;;;15950:30;-1:-1:-1;;;16011:2:14;15996:18;;15989:49;16070:2;16055:18;;15910:169::o;16084:356::-;16286:2;16268:21;;;16305:18;;;16298:30;16364:34;16359:2;16344:18;;16337:62;16431:2;16416:18;;16258:182::o;16445:405::-;16647:2;16629:21;;;16686:2;16666:18;;;16659:30;16725:34;16720:2;16705:18;;16698:62;-1:-1:-1;;;16791:2:14;16776:18;;16769:39;16840:3;16825:19;;16619:231::o;16855:411::-;17057:2;17039:21;;;17096:2;17076:18;;;17069:30;17135:34;17130:2;17115:18;;17108:62;-1:-1:-1;;;17201:2:14;17186:18;;17179:45;17256:3;17241:19;;17029:237::o;17271:348::-;17473:2;17455:21;;;17512:2;17492:18;;;17485:30;17551:26;17546:2;17531:18;;17524:54;17610:2;17595:18;;17445:174::o;17624:404::-;17826:2;17808:21;;;17865:2;17845:18;;;17838:30;17904:34;17899:2;17884:18;;17877:62;-1:-1:-1;;;17970:2:14;17955:18;;17948:38;18018:3;18003:19;;17798:230::o;18033:397::-;18235:2;18217:21;;;18274:2;18254:18;;;18247:30;18313:34;18308:2;18293:18;;18286:62;-1:-1:-1;;;18379:2:14;18364:18;;18357:31;18420:3;18405:19;;18207:223::o;18435:410::-;18637:2;18619:21;;;18676:2;18656:18;;;18649:30;18715:34;18710:2;18695:18;;18688:62;-1:-1:-1;;;18781:2:14;18766:18;;18759:44;18835:3;18820:19;;18609:236::o;18850:347::-;19052:2;19034:21;;;19091:2;19071:18;;;19064:30;19130:25;19125:2;19110:18;;19103:53;19188:2;19173:18;;19024:173::o;19202:413::-;19404:2;19386:21;;;19443:2;19423:18;;;19416:30;19482:34;19477:2;19462:18;;19455:62;-1:-1:-1;;;19548:2:14;19533:18;;19526:47;19605:3;19590:19;;19376:239::o;19620:408::-;19822:2;19804:21;;;19861:2;19841:18;;;19834:30;19900:34;19895:2;19880:18;;19873:62;-1:-1:-1;;;19966:2:14;19951:18;;19944:42;20018:3;20003:19;;19794:234::o;20033:350::-;20235:2;20217:21;;;20274:2;20254:18;;;20247:30;20313:28;20308:2;20293:18;;20286:56;20374:2;20359:18;;20207:176::o;20388:352::-;20590:2;20572:21;;;20629:2;20609:18;;;20602:30;20668;20663:2;20648:18;;20641:58;20731:2;20716:18;;20562:178::o;20745:397::-;20947:2;20929:21;;;20986:2;20966:18;;;20959:30;21025:34;21020:2;21005:18;;20998:62;-1:-1:-1;;;21091:2:14;21076:18;;21069:31;21132:3;21117:19;;20919:223::o;21147:177::-;21293:25;;;21281:2;21266:18;;21248:76::o;21329:128::-;;21400:1;21396:6;21393:1;21390:13;21387:2;;;21406:18;;:::i;:::-;-1:-1:-1;21442:9:14;;21377:80::o;21462:120::-;;21528:1;21518:2;;21533:18;;:::i;:::-;-1:-1:-1;21567:9:14;;21508:74::o;21587:168::-;;21693:1;21689;21685:6;21681:14;21678:1;21675:21;21670:1;21663:9;21656:17;21652:45;21649:2;;;21700:18;;:::i;:::-;-1:-1:-1;21740:9:14;;21639:116::o;21760:125::-;;21828:1;21825;21822:8;21819:2;;;21833:18;;:::i;:::-;-1:-1:-1;21870:9:14;;21809:76::o;21890:258::-;21962:1;21972:113;21986:6;21983:1;21980:13;21972:113;;;22062:11;;;22056:18;22043:11;;;22036:39;22008:2;22001:10;21972:113;;;22103:6;22100:1;22097:13;22094:2;;;-1:-1:-1;;22138:1:14;22120:16;;22113:27;21943:205::o;22153:380::-;22238:1;22228:12;;22285:1;22275:12;;;22296:2;;22350:4;22342:6;22338:17;22328:27;;22296:2;22403;22395:6;22392:14;22372:18;22369:38;22366:2;;;22449:10;22444:3;22440:20;22437:1;22430:31;22484:4;22481:1;22474:15;22512:4;22509:1;22502:15;22366:2;;22208:325;;;:::o;22538:135::-;;-1:-1:-1;;22598:17:14;;22595:2;;;22618:18;;:::i;:::-;-1:-1:-1;22665:1:14;22654:13;;22585:88::o;22678:112::-;;22736:1;22726:2;;22741:18;;:::i;:::-;-1:-1:-1;22775:9:14;;22716:74::o;22795:127::-;22856:10;22851:3;22847:20;22844:1;22837:31;22887:4;22884:1;22877:15;22911:4;22908:1;22901:15;22927:127;22988:10;22983:3;22979:20;22976:1;22969:31;23019:4;23016:1;23009:15;23043:4;23040:1;23033:15;23059:127;23120:10;23115:3;23111:20;23108:1;23101:31;23151:4;23148:1;23141:15;23175:4;23172:1;23165:15;23191:133;-1:-1:-1;;;;;;23267:32:14;;23257:43;;23247:2;;23314:1;23311;23304:12

Swarm Source

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