Token CRO CROW

Overview CRC721

Total Supply:
7,777 CROW

Holders:
887 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

OVERVIEW

The first ERC-721 token minted on Cronos. Each crow is an ERC-721 token representing a crow, randomly generated from a list of different attributes and rarities.


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

Contract Source Code Verified (Exact Match)

Contract Name:
CROCROW

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 18: CROCROW.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Burnable.sol";
import "./Context.sol";
import "./Counters.sol";
import "./IERC20.sol";

contract CROCROW is
    Context,
    Ownable,
    ERC721Enumerable,
    ERC721Burnable
{
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdTracker;

    string private _baseTokenURI;
    string private _contractURI;
    uint256 public max = 7777;
    uint256 public maxMintPerTx = 20;
    uint256 public maxMintPerTxWL = 4;

    mapping(address => bool) whitelist;

    bool public publicSaleStarted = false;

    bool public tokenURIFrozen = false;
    uint256 public cost = 100 ether;
    
    constructor(
        string memory name,
        string memory symbol,
        string memory baseTokenURI,
        uint256 reserved,
        address[] memory _address
    ) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;
        _tokenIdTracker.increment();
        
        for (uint256 i = 1; i <= reserved; i++) {
            require(_tokenIdTracker.current() <= max, "Transaction exceeds max mint amount");
            _mint(_msgSender(), _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
        
        uint256 count = _address.length;
        for (uint256 i = 0; i < count; i++){
            whitelist[_address[i]] = true;
        }
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }
    
    function adminMint(uint256 _mintAmount) public onlyOwner{
        for (uint256 i = 1; i <= _mintAmount; i++) {
            require(_tokenIdTracker.current() <= max, "Transaction exceeds max mint amount");
            _mint(_msgSender(), _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
    }
    function whitelistMint(uint256 _mintAmount) public payable {
        require(whitelist[_msgSender()] == true, "User is not whitelisted");
        require(_mintAmount <= maxMintPerTxWL, "Exceeds max amount per WL mint");
        require(msg.value >= cost * _mintAmount, "Not enough ether provided");
        for (uint256 i = 1; i <= _mintAmount; i++) {
            require(_tokenIdTracker.current() <= max, "Transaction exceeds max mint amount");
            _mint(_msgSender(), _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
        whitelist[_msgSender()] = false;
    }
    function mint(uint256 _mintAmount) public payable {
        require(publicSaleStarted == true, "Public Sale not started yet");
        require(_mintAmount <= maxMintPerTx, "Exceeds max amount per mint");
        require(msg.value >= cost * _mintAmount, "Not enough ether provided");
        for (uint256 i = 1; i <= _mintAmount; i++) {
            require(_tokenIdTracker.current() <= max, "Transaction exceeds max mint amount");
            _mint(_msgSender(), _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
    }
    function withdraw(address token, uint256 amount) public onlyOwner {
        if(token == address(0)) { 
            payable(_msgSender()).transfer(amount);
        } else {
            IERC20(token).transfer(_msgSender(), amount);
        }
    }
    
    function setContractURI(string memory uri) public onlyOwner {
        require(tokenURIFrozen == false, "Token URIs are frozen");
        _contractURI = uri;
    }
    function setBaseTokenURI(string memory uri) public onlyOwner {
        require(tokenURIFrozen == false, "Token URIs are frozen");
        _baseTokenURI = uri;
    }
    
    function setCost(uint256 price) public onlyOwner {
        cost = price;
    }
    
    function freezeBaseURI() public onlyOwner {
        tokenURIFrozen = true;
    }
    
    function startPublicSale() public onlyOwner {
        publicSaleStarted = true;
    }
    
    function setWL(address[] memory _address) public onlyOwner {
        uint256 count = _address.length;
        for (uint256 i = 0; i < count; i++){
            whitelist[_address[i]] = true;
        }
    }

    function isWhitelisted(address _address) public view returns(bool) {
        return whitelist[_address];
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

File 1 of 18: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 18: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 3 of 18: Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

File 5 of 18: ERC165.sol
// SPDX-License-Identifier: MIT

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 6 of 18: ERC721.sol
// SPDX-License-Identifier: MIT

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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 7 of 18: ERC721Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

File 8 of 18: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 18: ERC721Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Pausable.sol";

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

File 10 of 18: IERC165.sol
// SPDX-License-Identifier: MIT

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 11 of 18: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 12 of 18: IERC721.sol
// SPDX-License-Identifier: MIT

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 13 of 18: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

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 14 of 18: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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 15 of 18: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 16 of 18: Ownable.sol
// SPDX-License-Identifier: MIT

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

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

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

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

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

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

File 17 of 18: 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 18 of 18: Strings.sol
// SPDX-License-Identifier: MIT

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":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"uint256","name":"reserved","type":"uint256"},{"internalType":"address[]","name":"_address","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"adminMint","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTxWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"setWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURIFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611e61600e556014600f5560046010556000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff02191690831515021790555068056bc75e2d631000006013553480156200006457600080fd5b50604051620062923803806200629283398181016040528101906200008a919062000da2565b8484620000ac620000a0620002b060201b60201c565b620002b860201b60201c565b8160019080519060200190620000c492919062000bb0565b508060029080519060200190620000dd92919062000bb0565b50505082600c9080519060200190620000f892919062000bb0565b5062000110600b6200037c60201b620021701760201c565b6000600190505b828111620001e157600e5462000139600b6200039260201b620021861760201c565b11156200017d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001749062000f24565b60405180910390fd5b620001b462000191620002b060201b60201c565b620001a8600b6200039260201b620021861760201c565b620003a060201b60201c565b620001cb600b6200037c60201b620021701760201c565b8080620001d890620011c3565b91505062000117565b5060008151905060005b81811015620002a35760016011600085848151811062000234577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806200029a90620011c3565b915050620001eb565b50505050505050620013d3565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000413576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200040a9062000f8a565b60405180910390fd5b62000424816200058660201b60201c565b1562000467576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200045e9062000f46565b60405180910390fd5b6200047b60008383620005f260201b60201c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004cd91906200104b565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200060a8383836200060f60201b620021941760201c565b505050565b620006278383836200075660201b620022a81760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000674576200066e816200075b60201b60201c565b620006bc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620006bb57620006ba8382620007a460201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620007095762000703816200092160201b60201c565b62000751565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000750576200074f828262000a6960201b60201c565b5b5b505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001620007be8462000af560201b620011811760201c565b620007ca9190620010a8565b9050600060086000848152602001908152602001600020549050818114620008b0576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050620009379190620010a8565b90506000600a60008481526020019081526020016000205490506000600983815481106200098e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110620009d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548062000a4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000a818362000af560201b620011811760201c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b609062000f68565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000bbe9062001157565b90600052602060002090601f01602090048101928262000be2576000855562000c2e565b82601f1062000bfd57805160ff191683800117855562000c2e565b8280016001018555821562000c2e579182015b8281111562000c2d57825182559160200191906001019062000c10565b5b50905062000c3d919062000c41565b5090565b5b8082111562000c5c57600081600090555060010162000c42565b5090565b600062000c7762000c718462000fd5565b62000fac565b9050808382526020820190508285602086028201111562000c9757600080fd5b60005b8581101562000ccb578162000cb0888262000d1a565b84526020840193506020830192505060018101905062000c9a565b5050509392505050565b600062000cec62000ce68462001004565b62000fac565b90508281526020810184848401111562000d0557600080fd5b62000d1284828562001121565b509392505050565b60008151905062000d2b816200139f565b92915050565b600082601f83011262000d4357600080fd5b815162000d5584826020860162000c60565b91505092915050565b600082601f83011262000d7057600080fd5b815162000d8284826020860162000cd5565b91505092915050565b60008151905062000d9c81620013b9565b92915050565b600080600080600060a0868803121562000dbb57600080fd5b600086015167ffffffffffffffff81111562000dd657600080fd5b62000de48882890162000d5e565b955050602086015167ffffffffffffffff81111562000e0257600080fd5b62000e108882890162000d5e565b945050604086015167ffffffffffffffff81111562000e2e57600080fd5b62000e3c8882890162000d5e565b935050606062000e4f8882890162000d8b565b925050608086015167ffffffffffffffff81111562000e6d57600080fd5b62000e7b8882890162000d31565b9150509295509295909350565b600062000e976023836200103a565b915062000ea482620012af565b604082019050919050565b600062000ebe601c836200103a565b915062000ecb82620012fe565b602082019050919050565b600062000ee5602a836200103a565b915062000ef28262001327565b604082019050919050565b600062000f0c6020836200103a565b915062000f198262001376565b602082019050919050565b6000602082019050818103600083015262000f3f8162000e88565b9050919050565b6000602082019050818103600083015262000f618162000eaf565b9050919050565b6000602082019050818103600083015262000f838162000ed6565b9050919050565b6000602082019050818103600083015262000fa58162000efd565b9050919050565b600062000fb862000fcb565b905062000fc682826200118d565b919050565b6000604051905090565b600067ffffffffffffffff82111562000ff35762000ff26200126f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156200102257620010216200126f565b5b6200102d826200129e565b9050602081019050919050565b600082825260208201905092915050565b6000620010588262001117565b9150620010658362001117565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200109d576200109c62001211565b5b828201905092915050565b6000620010b58262001117565b9150620010c28362001117565b925082821015620010d857620010d762001211565b5b828203905092915050565b6000620010f082620010f7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200114157808201518184015260208101905062001124565b8381111562001151576000848401525b50505050565b600060028204905060018216806200117057607f821691505b6020821081141562001187576200118662001240565b5b50919050565b62001198826200129e565b810181811067ffffffffffffffff82111715620011ba57620011b96200126f565b5b80604052505050565b6000620011d08262001117565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562001206576200120562001211565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5472616e73616374696f6e2065786365656473206d6178206d696e7420616d6f60008201527f756e740000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b620013aa81620010e3565b8114620013b657600080fd5b50565b620013c48162001117565b8114620013d057600080fd5b50565b614eaf80620013e36000396000f3fe6080604052600436106102305760003560e01c8063715018a61161012e578063c29de630116100ab578063e7bc82081161006f578063e7bc820814610831578063e8a3d48514610848578063e985e9c514610873578063f2fde38b146108b0578063f3fef3a3146108d957610230565b8063c29de6301461074a578063c3f1d18514610775578063c87b56dd1461079e578063cce44fcf146107db578063de7fcb1d1461080657610230565b8063a0712d68116100f2578063a0712d6814610688578063a22cb465146106a4578063a2e91477146106cd578063b88d4fde146106f8578063c1f261231461072157610230565b8063715018a6146105d6578063868ff4a2146105ed5780638da5cb5b14610609578063938e3d7b1461063457806395d89b411461065d57610230565b806330176e13116101bc57806344a0d68a1161018057806344a0d68a146104cb5780634f6ccce7146104f45780636352211e146105315780636ac5db191461056e57806370a082311461059957610230565b806330176e13146103d65780633af32abf146103ff57806342842e0e1461043c57806342966c6814610465578063438b63001461048e57610230565b80630c1c972a116102035780630c1c972a1461030357806313faede61461031a57806318160ddd1461034557806323b872dd146103705780632f745c591461039957610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906138e2565b610902565b6040516102699190613f57565b60405180910390f35b34801561027e57600080fd5b50610287610914565b6040516102949190613f72565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613975565b6109a6565b6040516102d19190613ea5565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061383c565b610a2b565b005b34801561030f57600080fd5b50610318610b43565b005b34801561032657600080fd5b5061032f610bdc565b60405161033c91906142d4565b60405180910390f35b34801561035157600080fd5b5061035a610be2565b60405161036791906142d4565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190613736565b610bef565b005b3480156103a557600080fd5b506103c060048036038101906103bb919061383c565b610c4f565b6040516103cd91906142d4565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190613934565b610cf4565b005b34801561040b57600080fd5b50610426600480360381019061042191906136d1565b610de0565b6040516104339190613f57565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e9190613736565b610e36565b005b34801561047157600080fd5b5061048c60048036038101906104879190613975565b610e56565b005b34801561049a57600080fd5b506104b560048036038101906104b091906136d1565b610eb2565b6040516104c29190613f35565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed9190613975565b610fac565b005b34801561050057600080fd5b5061051b60048036038101906105169190613975565b611032565b60405161052891906142d4565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613975565b6110c9565b6040516105659190613ea5565b60405180910390f35b34801561057a57600080fd5b5061058361117b565b60405161059091906142d4565b60405180910390f35b3480156105a557600080fd5b506105c060048036038101906105bb91906136d1565b611181565b6040516105cd91906142d4565b60405180910390f35b3480156105e257600080fd5b506105eb611239565b005b61060760048036038101906106029190613975565b6112c1565b005b34801561061557600080fd5b5061061e6114e6565b60405161062b9190613ea5565b60405180910390f35b34801561064057600080fd5b5061065b60048036038101906106569190613934565b61150f565b005b34801561066957600080fd5b506106726115fb565b60405161067f9190613f72565b60405180910390f35b6106a2600480360381019061069d9190613975565b61168d565b005b3480156106b057600080fd5b506106cb60048036038101906106c69190613800565b61180f565b005b3480156106d957600080fd5b506106e2611990565b6040516106ef9190613f57565b60405180910390f35b34801561070457600080fd5b5061071f600480360381019061071a9190613785565b6119a3565b005b34801561072d57600080fd5b5061074860048036038101906107439190613975565b611a05565b005b34801561075657600080fd5b5061075f611b18565b60405161076c9190613f57565b60405180910390f35b34801561078157600080fd5b5061079c60048036038101906107979190613878565b611b2b565b005b3480156107aa57600080fd5b506107c560048036038101906107c09190613975565b611c68565b6040516107d29190613f72565b60405180910390f35b3480156107e757600080fd5b506107f0611d0f565b6040516107fd91906142d4565b60405180910390f35b34801561081257600080fd5b5061081b611d15565b60405161082891906142d4565b60405180910390f35b34801561083d57600080fd5b50610846611d1b565b005b34801561085457600080fd5b5061085d611db4565b60405161086a9190613f72565b60405180910390f35b34801561087f57600080fd5b5061089a600480360381019061089591906136fa565b611e46565b6040516108a79190613f57565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d291906136d1565b611eda565b005b3480156108e557600080fd5b5061090060048036038101906108fb919061383c565b611fd2565b005b600061090d826122ad565b9050919050565b606060018054610923906145e9565b80601f016020809104026020016040519081016040528092919081815260200182805461094f906145e9565b801561099c5780601f106109715761010080835404028352916020019161099c565b820191906000526020600020905b81548152906001019060200180831161097f57829003601f168201915b5050505050905090565b60006109b182612327565b6109f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e790614174565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a36826110c9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e906141f4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac6612393565b73ffffffffffffffffffffffffffffffffffffffff161480610af55750610af481610aef612393565b611e46565b5b610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b906140f4565b60405180910390fd5b610b3e838361239b565b505050565b610b4b612393565b73ffffffffffffffffffffffffffffffffffffffff16610b696114e6565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb690614194565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b60135481565b6000600980549050905090565b610c00610bfa612393565b82612454565b610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690614214565b60405180910390fd5b610c4a838383612532565b505050565b6000610c5a83611181565b8210610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290613fb4565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610cfc612393565b73ffffffffffffffffffffffffffffffffffffffff16610d1a6114e6565b73ffffffffffffffffffffffffffffffffffffffff1614610d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6790614194565b60405180910390fd5b60001515601260019054906101000a900460ff16151514610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614234565b60405180910390fd5b80600c9080519060200190610ddc92919061344a565b5050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610e51838383604051806020016040528060008152506119a3565b505050565b610e67610e61612393565b82612454565b610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d90614294565b60405180910390fd5b610eaf8161278e565b50565b60606000610ebf83611181565b905060008167ffffffffffffffff811115610f03577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f315781602001602082028036833780820191505090505b50905060005b82811015610fa157610f498582610c4f565b828281518110610f82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f999061464c565b915050610f37565b508092505050919050565b610fb4612393565b73ffffffffffffffffffffffffffffffffffffffff16610fd26114e6565b73ffffffffffffffffffffffffffffffffffffffff1614611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f90614194565b60405180910390fd5b8060138190555050565b600061103c610be2565b821061107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490614254565b60405180910390fd5b600982815481106110b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614134565b60405180910390fd5b80915050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e990614114565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611241612393565b73ffffffffffffffffffffffffffffffffffffffff1661125f6114e6565b73ffffffffffffffffffffffffffffffffffffffff16146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac90614194565b60405180910390fd5b6112bf600061289f565b565b60011515601160006112d1612393565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461135b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611352906140d4565b60405180910390fd5b6010548111156113a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139790614094565b60405180910390fd5b806013546113ae91906144a5565b3410156113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e7906142b4565b60405180910390fd5b6000600190505b81811161148357600e5461140b600b612186565b111561144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390613f94565b60405180910390fd5b611466611457612393565b611461600b612186565b612963565b611470600b612170565b808061147b9061464c565b9150506113f7565b50600060116000611492612393565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611517612393565b73ffffffffffffffffffffffffffffffffffffffff166115356114e6565b73ffffffffffffffffffffffffffffffffffffffff161461158b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158290614194565b60405180910390fd5b60001515601260019054906101000a900460ff161515146115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d890614234565b60405180910390fd5b80600d90805190602001906115f792919061344a565b5050565b60606002805461160a906145e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611636906145e9565b80156116835780601f1061165857610100808354040283529160200191611683565b820191906000526020600020905b81548152906001019060200180831161166657829003601f168201915b5050505050905090565b60011515601260009054906101000a900460ff161515146116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da90613fd4565b60405180910390fd5b600f54811115611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f90614274565b60405180910390fd5b8060135461173691906144a5565b341015611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906142b4565b60405180910390fd5b6000600190505b81811161180b57600e54611793600b612186565b11156117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb90613f94565b60405180910390fd5b6117ee6117df612393565b6117e9600b612186565b612963565b6117f8600b612170565b80806118039061464c565b91505061177f565b5050565b611817612393565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c90614074565b60405180910390fd5b8060066000611892612393565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661193f612393565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119849190613f57565b60405180910390a35050565b601260009054906101000a900460ff1681565b6119b46119ae612393565b83612454565b6119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea90614214565b60405180910390fd5b6119ff84848484612b31565b50505050565b611a0d612393565b73ffffffffffffffffffffffffffffffffffffffff16611a2b6114e6565b73ffffffffffffffffffffffffffffffffffffffff1614611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7890614194565b60405180910390fd5b6000600190505b818111611b1457600e54611a9c600b612186565b1115611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490613f94565b60405180910390fd5b611af7611ae8612393565b611af2600b612186565b612963565b611b01600b612170565b8080611b0c9061464c565b915050611a88565b5050565b601260019054906101000a900460ff1681565b611b33612393565b73ffffffffffffffffffffffffffffffffffffffff16611b516114e6565b73ffffffffffffffffffffffffffffffffffffffff1614611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90614194565b60405180910390fd5b60008151905060005b81811015611c6357600160116000858481518110611bf7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c5b9061464c565b915050611bb0565b505050565b6060611c7382612327565b611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca9906141d4565b60405180910390fd5b6000611cbc612b8d565b90506000815111611cdc5760405180602001604052806000815250611d07565b80611ce684612c1f565b604051602001611cf7929190613e81565b6040516020818303038152906040525b915050919050565b60105481565b600f5481565b611d23612393565b73ffffffffffffffffffffffffffffffffffffffff16611d416114e6565b73ffffffffffffffffffffffffffffffffffffffff1614611d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8e90614194565b60405180910390fd5b6001601260016101000a81548160ff021916908315150217905550565b6060600d8054611dc3906145e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611def906145e9565b8015611e3c5780601f10611e1157610100808354040283529160200191611e3c565b820191906000526020600020905b815481529060010190602001808311611e1f57829003601f168201915b5050505050905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ee2612393565b73ffffffffffffffffffffffffffffffffffffffff16611f006114e6565b73ffffffffffffffffffffffffffffffffffffffff1614611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d90614194565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbd90614014565b60405180910390fd5b611fcf8161289f565b50565b611fda612393565b73ffffffffffffffffffffffffffffffffffffffff16611ff86114e6565b73ffffffffffffffffffffffffffffffffffffffff161461204e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204590614194565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120d65761208b612393565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156120d0573d6000803e3d6000fd5b5061216c565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6120fa612393565b836040518363ffffffff1660e01b8152600401612118929190613f0c565b602060405180830381600087803b15801561213257600080fd5b505af1158015612146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216a91906138b9565b505b5050565b6001816000016000828254019250508190555050565b600081600001549050919050565b61219f8383836122a8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121e2576121dd81612dcc565b612221565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122205761221f8382612e15565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122645761225f81612f82565b6122a3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122a2576122a182826130c5565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612320575061231f82613144565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661240e836110c9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061245f82612327565b61249e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612495906140b4565b60405180910390fd5b60006124a9836110c9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061251857508373ffffffffffffffffffffffffffffffffffffffff16612500846109a6565b73ffffffffffffffffffffffffffffffffffffffff16145b8061252957506125288185611e46565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612552826110c9565b73ffffffffffffffffffffffffffffffffffffffff16146125a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259f906141b4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614054565b60405180910390fd5b612623838383613226565b61262e60008261239b565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461267e91906144ff565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126d5919061441e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612799826110c9565b90506127a781600084613226565b6127b260008361239b565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461280291906144ff565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ca90614154565b60405180910390fd5b6129dc81612327565b15612a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1390614034565b60405180910390fd5b612a2860008383613226565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a78919061441e565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612b3c848484612532565b612b4884848484613236565b612b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7e90613ff4565b60405180910390fd5b50505050565b6060600c8054612b9c906145e9565b80601f0160208091040260200160405190810160405280929190818152602001828054612bc8906145e9565b8015612c155780601f10612bea57610100808354040283529160200191612c15565b820191906000526020600020905b815481529060010190602001808311612bf857829003601f168201915b5050505050905090565b60606000821415612c67576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dc7565b600082905060005b60008214612c99578080612c829061464c565b915050600a82612c929190614474565b9150612c6f565b60008167ffffffffffffffff811115612cdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612d0d5781602001600182028036833780820191505090505b5090505b60008514612dc057600182612d2691906144ff565b9150600a85612d359190614695565b6030612d41919061441e565b60f81b818381518110612d7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612db99190614474565b9450612d11565b8093505050505b919050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e2284611181565b612e2c91906144ff565b9050600060086000848152602001908152602001600020549050818114612f11576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612f9691906144ff565b90506000600a6000848152602001908152602001600020549050600060098381548110612fec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110613034577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806130a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006130d083611181565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061320f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061321f575061321e826133cd565b5b9050919050565b613231838383612194565b505050565b60006132578473ffffffffffffffffffffffffffffffffffffffff16613437565b156133c0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613280612393565b8786866040518563ffffffff1660e01b81526004016132a29493929190613ec0565b602060405180830381600087803b1580156132bc57600080fd5b505af19250505080156132ed57506040513d601f19601f820116820180604052508101906132ea919061390b565b60015b613370573d806000811461331d576040519150601f19603f3d011682016040523d82523d6000602084013e613322565b606091505b50600081511415613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90613ff4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133c5565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080823b905060008111915050919050565b828054613456906145e9565b90600052602060002090601f01602090048101928261347857600085556134bf565b82601f1061349157805160ff19168380011785556134bf565b828001600101855582156134bf579182015b828111156134be5782518255916020019190600101906134a3565b5b5090506134cc91906134d0565b5090565b5b808211156134e95760008160009055506001016134d1565b5090565b60006135006134fb84614314565b6142ef565b9050808382526020820190508285602086028201111561351f57600080fd5b60005b8581101561354f578161353588826135d5565b845260208401935060208301925050600181019050613522565b5050509392505050565b600061356c61356784614340565b6142ef565b90508281526020810184848401111561358457600080fd5b61358f8482856145a7565b509392505050565b60006135aa6135a584614371565b6142ef565b9050828152602081018484840111156135c257600080fd5b6135cd8482856145a7565b509392505050565b6000813590506135e481614e1d565b92915050565b600082601f8301126135fb57600080fd5b813561360b8482602086016134ed565b91505092915050565b60008135905061362381614e34565b92915050565b60008151905061363881614e34565b92915050565b60008135905061364d81614e4b565b92915050565b60008151905061366281614e4b565b92915050565b600082601f83011261367957600080fd5b8135613689848260208601613559565b91505092915050565b600082601f8301126136a357600080fd5b81356136b3848260208601613597565b91505092915050565b6000813590506136cb81614e62565b92915050565b6000602082840312156136e357600080fd5b60006136f1848285016135d5565b91505092915050565b6000806040838503121561370d57600080fd5b600061371b858286016135d5565b925050602061372c858286016135d5565b9150509250929050565b60008060006060848603121561374b57600080fd5b6000613759868287016135d5565b935050602061376a868287016135d5565b925050604061377b868287016136bc565b9150509250925092565b6000806000806080858703121561379b57600080fd5b60006137a9878288016135d5565b94505060206137ba878288016135d5565b93505060406137cb878288016136bc565b925050606085013567ffffffffffffffff8111156137e857600080fd5b6137f487828801613668565b91505092959194509250565b6000806040838503121561381357600080fd5b6000613821858286016135d5565b925050602061383285828601613614565b9150509250929050565b6000806040838503121561384f57600080fd5b600061385d858286016135d5565b925050602061386e858286016136bc565b9150509250929050565b60006020828403121561388a57600080fd5b600082013567ffffffffffffffff8111156138a457600080fd5b6138b0848285016135ea565b91505092915050565b6000602082840312156138cb57600080fd5b60006138d984828501613629565b91505092915050565b6000602082840312156138f457600080fd5b60006139028482850161363e565b91505092915050565b60006020828403121561391d57600080fd5b600061392b84828501613653565b91505092915050565b60006020828403121561394657600080fd5b600082013567ffffffffffffffff81111561396057600080fd5b61396c84828501613692565b91505092915050565b60006020828403121561398757600080fd5b6000613995848285016136bc565b91505092915050565b60006139aa8383613e63565b60208301905092915050565b6139bf81614533565b82525050565b60006139d0826143b2565b6139da81856143e0565b93506139e5836143a2565b8060005b83811015613a165781516139fd888261399e565b9750613a08836143d3565b9250506001810190506139e9565b5085935050505092915050565b613a2c81614545565b82525050565b6000613a3d826143bd565b613a4781856143f1565b9350613a578185602086016145b6565b613a6081614782565b840191505092915050565b6000613a76826143c8565b613a808185614402565b9350613a908185602086016145b6565b613a9981614782565b840191505092915050565b6000613aaf826143c8565b613ab98185614413565b9350613ac98185602086016145b6565b80840191505092915050565b6000613ae2602383614402565b9150613aed82614793565b604082019050919050565b6000613b05602b83614402565b9150613b10826147e2565b604082019050919050565b6000613b28601b83614402565b9150613b3382614831565b602082019050919050565b6000613b4b603283614402565b9150613b568261485a565b604082019050919050565b6000613b6e602683614402565b9150613b79826148a9565b604082019050919050565b6000613b91601c83614402565b9150613b9c826148f8565b602082019050919050565b6000613bb4602483614402565b9150613bbf82614921565b604082019050919050565b6000613bd7601983614402565b9150613be282614970565b602082019050919050565b6000613bfa601e83614402565b9150613c0582614999565b602082019050919050565b6000613c1d602c83614402565b9150613c28826149c2565b604082019050919050565b6000613c40601783614402565b9150613c4b82614a11565b602082019050919050565b6000613c63603883614402565b9150613c6e82614a3a565b604082019050919050565b6000613c86602a83614402565b9150613c9182614a89565b604082019050919050565b6000613ca9602983614402565b9150613cb482614ad8565b604082019050919050565b6000613ccc602083614402565b9150613cd782614b27565b602082019050919050565b6000613cef602c83614402565b9150613cfa82614b50565b604082019050919050565b6000613d12602083614402565b9150613d1d82614b9f565b602082019050919050565b6000613d35602983614402565b9150613d4082614bc8565b604082019050919050565b6000613d58602f83614402565b9150613d6382614c17565b604082019050919050565b6000613d7b602183614402565b9150613d8682614c66565b604082019050919050565b6000613d9e603183614402565b9150613da982614cb5565b604082019050919050565b6000613dc1601583614402565b9150613dcc82614d04565b602082019050919050565b6000613de4602c83614402565b9150613def82614d2d565b604082019050919050565b6000613e07601b83614402565b9150613e1282614d7c565b602082019050919050565b6000613e2a603083614402565b9150613e3582614da5565b604082019050919050565b6000613e4d601983614402565b9150613e5882614df4565b602082019050919050565b613e6c8161459d565b82525050565b613e7b8161459d565b82525050565b6000613e8d8285613aa4565b9150613e998284613aa4565b91508190509392505050565b6000602082019050613eba60008301846139b6565b92915050565b6000608082019050613ed560008301876139b6565b613ee260208301866139b6565b613eef6040830185613e72565b8181036060830152613f018184613a32565b905095945050505050565b6000604082019050613f2160008301856139b6565b613f2e6020830184613e72565b9392505050565b60006020820190508181036000830152613f4f81846139c5565b905092915050565b6000602082019050613f6c6000830184613a23565b92915050565b60006020820190508181036000830152613f8c8184613a6b565b905092915050565b60006020820190508181036000830152613fad81613ad5565b9050919050565b60006020820190508181036000830152613fcd81613af8565b9050919050565b60006020820190508181036000830152613fed81613b1b565b9050919050565b6000602082019050818103600083015261400d81613b3e565b9050919050565b6000602082019050818103600083015261402d81613b61565b9050919050565b6000602082019050818103600083015261404d81613b84565b9050919050565b6000602082019050818103600083015261406d81613ba7565b9050919050565b6000602082019050818103600083015261408d81613bca565b9050919050565b600060208201905081810360008301526140ad81613bed565b9050919050565b600060208201905081810360008301526140cd81613c10565b9050919050565b600060208201905081810360008301526140ed81613c33565b9050919050565b6000602082019050818103600083015261410d81613c56565b9050919050565b6000602082019050818103600083015261412d81613c79565b9050919050565b6000602082019050818103600083015261414d81613c9c565b9050919050565b6000602082019050818103600083015261416d81613cbf565b9050919050565b6000602082019050818103600083015261418d81613ce2565b9050919050565b600060208201905081810360008301526141ad81613d05565b9050919050565b600060208201905081810360008301526141cd81613d28565b9050919050565b600060208201905081810360008301526141ed81613d4b565b9050919050565b6000602082019050818103600083015261420d81613d6e565b9050919050565b6000602082019050818103600083015261422d81613d91565b9050919050565b6000602082019050818103600083015261424d81613db4565b9050919050565b6000602082019050818103600083015261426d81613dd7565b9050919050565b6000602082019050818103600083015261428d81613dfa565b9050919050565b600060208201905081810360008301526142ad81613e1d565b9050919050565b600060208201905081810360008301526142cd81613e40565b9050919050565b60006020820190506142e96000830184613e72565b92915050565b60006142f961430a565b9050614305828261461b565b919050565b6000604051905090565b600067ffffffffffffffff82111561432f5761432e614753565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561435b5761435a614753565b5b61436482614782565b9050602081019050919050565b600067ffffffffffffffff82111561438c5761438b614753565b5b61439582614782565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144298261459d565b91506144348361459d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614469576144686146c6565b5b828201905092915050565b600061447f8261459d565b915061448a8361459d565b92508261449a576144996146f5565b5b828204905092915050565b60006144b08261459d565b91506144bb8361459d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144f4576144f36146c6565b5b828202905092915050565b600061450a8261459d565b91506145158361459d565b925082821015614528576145276146c6565b5b828203905092915050565b600061453e8261457d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156145d45780820151818401526020810190506145b9565b838111156145e3576000848401525b50505050565b6000600282049050600182168061460157607f821691505b6020821081141561461557614614614724565b5b50919050565b61462482614782565b810181811067ffffffffffffffff8211171561464357614642614753565b5b80604052505050565b60006146578261459d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561468a576146896146c6565b5b600182019050919050565b60006146a08261459d565b91506146ab8361459d565b9250826146bb576146ba6146f5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5472616e73616374696f6e2065786365656473206d6178206d696e7420616d6f60008201527f756e740000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f5075626c69632053616c65206e6f742073746172746564207965740000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45786365656473206d617820616d6f756e742070657220574c206d696e740000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546f6b656e2055524973206172652066726f7a656e0000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820616d6f756e7420706572206d696e740000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682065746865722070726f766964656400000000000000600082015250565b614e2681614533565b8114614e3157600080fd5b50565b614e3d81614545565b8114614e4857600080fd5b50565b614e5481614551565b8114614e5f57600080fd5b50565b614e6b8161459d565b8114614e7657600080fd5b5056fea26469706673582212202014a42603946c1a34e49c9ad0013281302bb154e259bf9eabaf2b0d4187a4f664736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000843524f2043524f57000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443524f57000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569656e6d7635787673347a37366a767a6e6465796e7136683577346d636374646d70616d6c61797670626d6775356b356c36326b692f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000582f7c906f15f6fe913f890fd4d11e07ae3b4468

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000843524f2043524f57000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443524f57000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569656e6d7635787673347a37366a767a6e6465796e7136683577346d636374646d70616d6c61797670626d6775356b356c36326b692f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000582f7c906f15f6fe913f890fd4d11e07ae3b4468

-----Decoded View---------------
Arg [0] : name (string): CRO CROW
Arg [1] : symbol (string): CROW
Arg [2] : baseTokenURI (string): ipfs://bafybeienmv5xvs4z76jvzndeynq6h5w4mcctdmpamlayvpbmgu5k5l62ki/
Arg [3] : reserved (uint256): 1
Arg [4] : _address (address[]): 0x582f7c906f15f6fe913f890fd4d11e07ae3b4468

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 43524f2043524f57000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 43524f5700000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [10] : 697066733a2f2f62616679626569656e6d7635787673347a37366a767a6e6465
Arg [11] : 796e7136683577346d636374646d70616d6c61797670626d6775356b356c3632
Arg [12] : 6b692f0000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 000000000000000000000000582f7c906f15f6fe913f890fd4d11e07ae3b4468


Deployed ByteCode Sourcemap

254:5139:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5161:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4063:87:1;;;;;;;;;;;;;:::i;:::-;;756:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1577:113:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:339:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1245:256:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3698:167:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4380:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5285:185:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;456:245:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4500:358:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3877:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1767:233:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:239:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;513:25:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1850:208:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:15;;;;;;;;;;;;;:::i;:::-;;2084:613:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;999:87:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3527:165:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2595:104:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2703:555:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4278:295:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;669:37:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5541:328:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1751:327:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;715:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4162:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2770:334:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;584:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;545:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3969:82;;;;;;;;;;;;;:::i;:::-;;1642:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4644:164:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3264:251:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5161:229;5317:4;5346:36;5370:11;5346:23;:36::i;:::-;5339:43;;5161:229;;;:::o;2426:100:5:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3508:411;;;:::o;4063:87:1:-;1230:12:15;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4138:4:1::1;4118:17;;:24;;;;;;;;;;;;;;;;;;4063:87::o:0;756:31::-;;;;:::o;1577:113:7:-;1638:7;1665:10;:17;;;;1658:24;;1577:113;:::o;4875:339:5:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;1245:256:7:-;1342:7;1378:23;1395:5;1378:16;:23::i;:::-;1370:5;:31;1362:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1467:12;:19;1480:5;1467:19;;;;;;;;;;;;;;;:26;1487:5;1467:26;;;;;;;;;;;;1460:33;;1245:256;;;;:::o;3698:167:1:-;1230:12:15;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3796:5:1::1;3778:23;;:14;;;;;;;;;;;:23;;;3770:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3854:3;3838:13;:19;;;;;;;;;;;;:::i;:::-;;3698:167:::0;:::o;4380:112::-;4441:4;4465:9;:19;4475:8;4465:19;;;;;;;;;;;;;;;;;;;;;;;;;4458:26;;4380:112;;;:::o;5285:185:5:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;456:245:6:-;574:41;593:12;:10;:12::i;:::-;607:7;574:18;:41::i;:::-;566:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;679:14;685:7;679:5;:14::i;:::-;456:245;:::o;4500:358:1:-;4560:16;4589:23;4615:17;4625:6;4615:9;:17::i;:::-;4589:43;;4643:25;4685:15;4671:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4643:58;;4717:9;4712:113;4732:15;4728:1;:19;4712:113;;;4783:30;4803:6;4811:1;4783:19;:30::i;:::-;4769:8;4778:1;4769:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;4749:3;;;;;:::i;:::-;;;;4712:113;;;;4842:8;4835:15;;;;4500:358;;;:::o;3877:80::-;1230:12:15;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3944:5:1::1;3937:4;:12;;;;3877:80:::0;:::o;1767:233:7:-;1842:7;1878:30;:28;:30::i;:::-;1870:5;:38;1862:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1975:10;1986:5;1975:17;;;;;;;;;;;;;;;;;;;;;;;;1968:24;;1767:233;;;:::o;2120:239:5:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;513:25:1:-;;;;:::o;1850:208:5:-;1922:7;1967:1;1950:19;;:5;:19;;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1650:94:15:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;2084:613:1:-;2189:4;2162:31;;:9;:23;2172:12;:10;:12::i;:::-;2162:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;2154:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2255:14;;2240:11;:29;;2232:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;2343:11;2336:4;;:18;;;;:::i;:::-;2323:9;:31;;2315:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2400:9;2412:1;2400:13;;2395:253;2420:11;2415:1;:16;2395:253;;2490:3;;2461:25;:15;:23;:25::i;:::-;:32;;2453:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;2548:46;2554:12;:10;:12::i;:::-;2568:25;:15;:23;:25::i;:::-;2548:5;:46::i;:::-;2609:27;:15;:25;:27::i;:::-;2433:3;;;;;:::i;:::-;;;;2395:253;;;;2684:5;2658:9;:23;2668:12;:10;:12::i;:::-;2658:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;2084:613;:::o;999:87:15:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;3527:165:1:-;1230:12:15;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3624:5:1::1;3606:23;;:14;;;;;;;;;;;:23;;;3598:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3681:3;3666:12;:18;;;;;;;;;;;;:::i;:::-;;3527:165:::0;:::o;2595:104:5:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;2703:555:1:-;2793:4;2772:25;;:17;;;;;;;;;;;:25;;;2764:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;2863:12;;2848:11;:27;;2840:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2946:11;2939:4;;:18;;;;:::i;:::-;2926:9;:31;;2918:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3003:9;3015:1;3003:13;;2998:253;3023:11;3018:1;:16;2998:253;;3093:3;;3064:25;:15;:23;:25::i;:::-;:32;;3056:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;3151:46;3157:12;:10;:12::i;:::-;3171:25;:15;:23;:25::i;:::-;3151:5;:46::i;:::-;3212:27;:15;:25;:27::i;:::-;3036:3;;;;;:::i;:::-;;;;2998:253;;;;2703:555;:::o;4278:295:5:-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;669:37:1:-;;;;;;;;;;;;;:::o;5541:328:5:-;5716:41;5735:12;:10;:12::i;:::-;5749:7;5716:18;:41::i;:::-;5708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5822:39;5836:4;5842:2;5846:7;5855:5;5822:13;:39::i;:::-;5541:328;;;;:::o;1751:327:1:-;1230:12:15;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1823:9:1::1;1835:1;1823:13;;1818:253;1843:11;1838:1;:16;1818:253;;1913:3;;1884:25;:15;:23;:25::i;:::-;:32;;1876:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;1971:46;1977:12;:10;:12::i;:::-;1991:25;:15;:23;:25::i;:::-;1971:5;:46::i;:::-;2032:27;:15;:25;:27::i;:::-;1856:3;;;;;:::i;:::-;;;;1818:253;;;;1751:327:::0;:::o;715:34::-;;;;;;;;;;;;;:::o;4162:210::-;1230:12:15;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4232:13:1::1;4248:8;:15;4232:31;;4279:9;4274:91;4298:5;4294:1;:9;4274:91;;;4349:4;4324:9;:22;4334:8;4343:1;4334:11;;;;;;;;;;;;;;;;;;;;;;4324:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;4305:3;;;;;:::i;:::-;;;;4274:91;;;;1290:1:15;4162:210:1::0;:::o;2770:334:5:-;2843:13;2877:16;2885:7;2877;:16::i;:::-;2869:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2958:21;2982:10;:8;:10::i;:::-;2958:34;;3034:1;3016:7;3010:21;:25;:86;;;;;;;;;;;;;;;;;3062:7;3071:18;:7;:16;:18::i;:::-;3045:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3010:86;3003:93;;;2770:334;;;:::o;584:33:1:-;;;;:::o;545:32::-;;;;:::o;3969:82::-;1230:12:15;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4039:4:1::1;4022:14;;:21;;;;;;;;;;;;;;;;;;3969:82::o:0;1642:97::-;1686:13;1719:12;1712:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1642:97;:::o;4644:164:5:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;1899:192:15:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;3264:251:1:-;1230:12:15;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3361:1:1::1;3344:19;;:5;:19;;;3341:167;;;3389:12;:10;:12::i;:::-;3381:30;;:38;3412:6;3381:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3341:167;;;3459:5;3452:22;;;3475:12;:10;:12::i;:::-;3489:6;3452:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3341:167;3264:251:::0;;:::o;915:127:3:-;1022:1;1004:7;:14;;;:19;;;;;;;;;;;915:127;:::o;793:114::-;858:7;885;:14;;;878:21;;793:114;;;:::o;2613:589:7:-;2757:45;2784:4;2790:2;2794:7;2757:26;:45::i;:::-;2835:1;2819:18;;:4;:18;;;2815:187;;;2854:40;2886:7;2854:31;:40::i;:::-;2815:187;;;2924:2;2916:10;;:4;:10;;;2912:90;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2912:90;2815:187;3030:1;3016:16;;:2;:16;;;3012:183;;;3049:45;3086:7;3049:36;:45::i;:::-;3012:183;;;3122:4;3116:10;;:2;:10;;;3112:83;;3143:40;3171:2;3175:7;3143:27;:40::i;:::-;3112:83;3012:183;2613:589;;;:::o;13475:126:5:-;;;;:::o;937:224:7:-;1039:4;1078:35;1063:50;;;:11;:50;;;;:90;;;;1117:36;1141:11;1117:23;:36::i;:::-;1063:90;1056:97;;937:224;;;:::o;7379:127:5:-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;601:98:2:-;654:7;681:10;674:17;;601:98;:::o;11361:174:5:-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;7673:348::-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;9968:360::-;10028:13;10044:23;10059:7;10044:14;:23::i;:::-;10028:39;;10080:48;10101:5;10116:1;10120:7;10080:20;:48::i;:::-;10169:29;10186:1;10190:7;10169:8;:29::i;:::-;10231:1;10211:9;:16;10221:5;10211:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;10250:7;:16;10258:7;10250:16;;;;;;;;;;;;10243:23;;;;;;;;;;;10312:7;10308:1;10284:36;;10293:5;10284:36;;;;;;;;;;;;9968:360;;:::o;2099:173:15:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2099:173;;:::o;9357:382:5:-;9451:1;9437:16;;:2;:16;;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::o;6751:315::-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;1516:114:1:-;1576:13;1609;1602:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1516:114;:::o;288:723:17:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;3925:164:7:-;4029:10;:17;;;;4002:15;:24;4018:7;4002:24;;;;;;;;;;;:44;;;;4057:10;4073:7;4057:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:164;:::o;4716:988::-;4982:22;5032:1;5007:22;5024:4;5007:16;:22::i;:::-;:26;;;;:::i;:::-;4982:51;;5044:18;5065:17;:26;5083:7;5065:26;;;;;;;;;;;;5044:47;;5212:14;5198:10;:28;5194:328;;5243:19;5265:12;:18;5278:4;5265:18;;;;;;;;;;;;;;;:34;5284:14;5265:34;;;;;;;;;;;;5243:56;;5349:11;5316:12;:18;5329:4;5316:18;;;;;;;;;;;;;;;:30;5335:10;5316:30;;;;;;;;;;;:44;;;;5466:10;5433:17;:30;5451:11;5433:30;;;;;;;;;;;:43;;;;5194:328;;5618:17;:26;5636:7;5618:26;;;;;;;;;;;5611:33;;;5662:12;:18;5675:4;5662:18;;;;;;;;;;;;;;;:34;5681:14;5662:34;;;;;;;;;;;5655:41;;;4716:988;;;;:::o;5999:1079::-;6252:22;6297:1;6277:10;:17;;;;:21;;;;:::i;:::-;6252:46;;6309:18;6330:15;:24;6346:7;6330:24;;;;;;;;;;;;6309:45;;6681:19;6703:10;6714:14;6703:26;;;;;;;;;;;;;;;;;;;;;;;;6681:48;;6767:11;6742:10;6753;6742:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6878:10;6847:15;:28;6863:11;6847:28;;;;;;;;;;;:41;;;;7019:15;:24;7035:7;7019:24;;;;;;;;;;;7012:31;;;7054:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5999:1079;;;;:::o;3503:221::-;3588:14;3605:20;3622:2;3605:16;:20::i;:::-;3588:37;;3663:7;3636:12;:16;3649:2;3636:16;;;;;;;;;;;;;;;:24;3653:6;3636:24;;;;;;;;;;;:34;;;;3710:6;3681:17;:26;3699:7;3681:26;;;;;;;;;;;:35;;;;3503:221;;;:::o;1481:305:5:-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;4866:223:1:-;5036:45;5063:4;5069:2;5073:7;5036:26;:45::i;:::-;4866:223;;;:::o;12100:803:5:-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:624;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12575:1;12558:6;:13;:18;12554:272;;;12601:60;;;;;;;;;;:::i;:::-;;;;;;;;12554:272;12776:6;12770:13;12761:6;12757:2;12753:15;12746:38;12308:533;12445:45;;;12435:55;;;:6;:55;;;;12428:62;;;;;12272:624;12880:4;12873:11;;12100:803;;;;;;;:::o;787:157:4:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:18:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2049:5;2080:6;2074:13;2065:22;;2096:30;2120:5;2096:30;:::i;:::-;2055:77;;;;:::o;2138:137::-;2183:5;2221:6;2208:20;2199:29;;2237:32;2263:5;2237:32;:::i;:::-;2189:86;;;;:::o;2281:141::-;2337:5;2368:6;2362:13;2353:22;;2384:32;2410:5;2384:32;:::i;:::-;2343:79;;;;:::o;2441:271::-;2496:5;2545:3;2538:4;2530:6;2526:17;2522:27;2512:2;;2563:1;2560;2553:12;2512:2;2603:6;2590:20;2628:78;2702:3;2694:6;2687:4;2679:6;2675:17;2628:78;:::i;:::-;2619:87;;2502:210;;;;;:::o;2732:273::-;2788:5;2837:3;2830:4;2822:6;2818:17;2814:27;2804:2;;2855:1;2852;2845:12;2804:2;2895:6;2882:20;2920:79;2995:3;2987:6;2980:4;2972:6;2968:17;2920:79;:::i;:::-;2911:88;;2794:211;;;;;:::o;3011:139::-;3057:5;3095:6;3082:20;3073:29;;3111:33;3138:5;3111:33;:::i;:::-;3063:87;;;;:::o;3156:262::-;3215:6;3264:2;3252:9;3243:7;3239:23;3235:32;3232:2;;;3280:1;3277;3270:12;3232:2;3323:1;3348:53;3393:7;3384:6;3373:9;3369:22;3348:53;:::i;:::-;3338:63;;3294:117;3222:196;;;;:::o;3424:407::-;3492:6;3500;3549:2;3537:9;3528:7;3524:23;3520:32;3517:2;;;3565:1;3562;3555:12;3517:2;3608:1;3633:53;3678:7;3669:6;3658:9;3654:22;3633:53;:::i;:::-;3623:63;;3579:117;3735:2;3761:53;3806:7;3797:6;3786:9;3782:22;3761:53;:::i;:::-;3751:63;;3706:118;3507:324;;;;;:::o;3837:552::-;3914:6;3922;3930;3979:2;3967:9;3958:7;3954:23;3950:32;3947:2;;;3995:1;3992;3985:12;3947:2;4038:1;4063:53;4108:7;4099:6;4088:9;4084:22;4063:53;:::i;:::-;4053:63;;4009:117;4165:2;4191:53;4236:7;4227:6;4216:9;4212:22;4191:53;:::i;:::-;4181:63;;4136:118;4293:2;4319:53;4364:7;4355:6;4344:9;4340:22;4319:53;:::i;:::-;4309:63;;4264:118;3937:452;;;;;:::o;4395:809::-;4490:6;4498;4506;4514;4563:3;4551:9;4542:7;4538:23;4534:33;4531:2;;;4580:1;4577;4570:12;4531:2;4623:1;4648:53;4693:7;4684:6;4673:9;4669:22;4648:53;:::i;:::-;4638:63;;4594:117;4750:2;4776:53;4821:7;4812:6;4801:9;4797:22;4776:53;:::i;:::-;4766:63;;4721:118;4878:2;4904:53;4949:7;4940:6;4929:9;4925:22;4904:53;:::i;:::-;4894:63;;4849:118;5034:2;5023:9;5019:18;5006:32;5065:18;5057:6;5054:30;5051:2;;;5097:1;5094;5087:12;5051:2;5125:62;5179:7;5170:6;5159:9;5155:22;5125:62;:::i;:::-;5115:72;;4977:220;4521:683;;;;;;;:::o;5210:401::-;5275:6;5283;5332:2;5320:9;5311:7;5307:23;5303:32;5300:2;;;5348:1;5345;5338:12;5300:2;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:50;5586:7;5577:6;5566:9;5562:22;5544:50;:::i;:::-;5534:60;;5489:115;5290:321;;;;;:::o;5617:407::-;5685:6;5693;5742:2;5730:9;5721:7;5717:23;5713:32;5710:2;;;5758:1;5755;5748:12;5710:2;5801:1;5826:53;5871:7;5862:6;5851:9;5847:22;5826:53;:::i;:::-;5816:63;;5772:117;5928:2;5954:53;5999:7;5990:6;5979:9;5975:22;5954:53;:::i;:::-;5944:63;;5899:118;5700:324;;;;;:::o;6030:405::-;6114:6;6163:2;6151:9;6142:7;6138:23;6134:32;6131:2;;;6179:1;6176;6169:12;6131:2;6250:1;6239:9;6235:17;6222:31;6280:18;6272:6;6269:30;6266:2;;;6312:1;6309;6302:12;6266:2;6340:78;6410:7;6401:6;6390:9;6386:22;6340:78;:::i;:::-;6330:88;;6193:235;6121:314;;;;:::o;6441:278::-;6508:6;6557:2;6545:9;6536:7;6532:23;6528:32;6525:2;;;6573:1;6570;6563:12;6525:2;6616:1;6641:61;6694:7;6685:6;6674:9;6670:22;6641:61;:::i;:::-;6631:71;;6587:125;6515:204;;;;:::o;6725:260::-;6783:6;6832:2;6820:9;6811:7;6807:23;6803:32;6800:2;;;6848:1;6845;6838:12;6800:2;6891:1;6916:52;6960:7;6951:6;6940:9;6936:22;6916:52;:::i;:::-;6906:62;;6862:116;6790:195;;;;:::o;6991:282::-;7060:6;7109:2;7097:9;7088:7;7084:23;7080:32;7077:2;;;7125:1;7122;7115:12;7077:2;7168:1;7193:63;7248:7;7239:6;7228:9;7224:22;7193:63;:::i;:::-;7183:73;;7139:127;7067:206;;;;:::o;7279:375::-;7348:6;7397:2;7385:9;7376:7;7372:23;7368:32;7365:2;;;7413:1;7410;7403:12;7365:2;7484:1;7473:9;7469:17;7456:31;7514:18;7506:6;7503:30;7500:2;;;7546:1;7543;7536:12;7500:2;7574:63;7629:7;7620:6;7609:9;7605:22;7574:63;:::i;:::-;7564:73;;7427:220;7355:299;;;;:::o;7660:262::-;7719:6;7768:2;7756:9;7747:7;7743:23;7739:32;7736:2;;;7784:1;7781;7774:12;7736:2;7827:1;7852:53;7897:7;7888:6;7877:9;7873:22;7852:53;:::i;:::-;7842:63;;7798:117;7726:196;;;;:::o;7928:179::-;7997:10;8018:46;8060:3;8052:6;8018:46;:::i;:::-;8096:4;8091:3;8087:14;8073:28;;8008:99;;;;:::o;8113:118::-;8200:24;8218:5;8200:24;:::i;:::-;8195:3;8188:37;8178:53;;:::o;8267:732::-;8386:3;8415:54;8463:5;8415:54;:::i;:::-;8485:86;8564:6;8559:3;8485:86;:::i;:::-;8478:93;;8595:56;8645:5;8595:56;:::i;:::-;8674:7;8705:1;8690:284;8715:6;8712:1;8709:13;8690:284;;;8791:6;8785:13;8818:63;8877:3;8862:13;8818:63;:::i;:::-;8811:70;;8904:60;8957:6;8904:60;:::i;:::-;8894:70;;8750:224;8737:1;8734;8730:9;8725:14;;8690:284;;;8694:14;8990:3;8983:10;;8391:608;;;;;;;:::o;9005:109::-;9086:21;9101:5;9086:21;:::i;:::-;9081:3;9074:34;9064:50;;:::o;9120:360::-;9206:3;9234:38;9266:5;9234:38;:::i;:::-;9288:70;9351:6;9346:3;9288:70;:::i;:::-;9281:77;;9367:52;9412:6;9407:3;9400:4;9393:5;9389:16;9367:52;:::i;:::-;9444:29;9466:6;9444:29;:::i;:::-;9439:3;9435:39;9428:46;;9210:270;;;;;:::o;9486:364::-;9574:3;9602:39;9635:5;9602:39;:::i;:::-;9657:71;9721:6;9716:3;9657:71;:::i;:::-;9650:78;;9737:52;9782:6;9777:3;9770:4;9763:5;9759:16;9737:52;:::i;:::-;9814:29;9836:6;9814:29;:::i;:::-;9809:3;9805:39;9798:46;;9578:272;;;;;:::o;9856:377::-;9962:3;9990:39;10023:5;9990:39;:::i;:::-;10045:89;10127:6;10122:3;10045:89;:::i;:::-;10038:96;;10143:52;10188:6;10183:3;10176:4;10169:5;10165:16;10143:52;:::i;:::-;10220:6;10215:3;10211:16;10204:23;;9966:267;;;;;:::o;10239:366::-;10381:3;10402:67;10466:2;10461:3;10402:67;:::i;:::-;10395:74;;10478:93;10567:3;10478:93;:::i;:::-;10596:2;10591:3;10587:12;10580:19;;10385:220;;;:::o;10611:366::-;10753:3;10774:67;10838:2;10833:3;10774:67;:::i;:::-;10767:74;;10850:93;10939:3;10850:93;:::i;:::-;10968:2;10963:3;10959:12;10952:19;;10757:220;;;:::o;10983:366::-;11125:3;11146:67;11210:2;11205:3;11146:67;:::i;:::-;11139:74;;11222:93;11311:3;11222:93;:::i;:::-;11340:2;11335:3;11331:12;11324:19;;11129:220;;;:::o;11355:366::-;11497:3;11518:67;11582:2;11577:3;11518:67;:::i;:::-;11511:74;;11594:93;11683:3;11594:93;:::i;:::-;11712:2;11707:3;11703:12;11696:19;;11501:220;;;:::o;11727:366::-;11869:3;11890:67;11954:2;11949:3;11890:67;:::i;:::-;11883:74;;11966:93;12055:3;11966:93;:::i;:::-;12084:2;12079:3;12075:12;12068:19;;11873:220;;;:::o;12099:366::-;12241:3;12262:67;12326:2;12321:3;12262:67;:::i;:::-;12255:74;;12338:93;12427:3;12338:93;:::i;:::-;12456:2;12451:3;12447:12;12440:19;;12245:220;;;:::o;12471:366::-;12613:3;12634:67;12698:2;12693:3;12634:67;:::i;:::-;12627:74;;12710:93;12799:3;12710:93;:::i;:::-;12828:2;12823:3;12819:12;12812:19;;12617:220;;;:::o;12843:366::-;12985:3;13006:67;13070:2;13065:3;13006:67;:::i;:::-;12999:74;;13082:93;13171:3;13082:93;:::i;:::-;13200:2;13195:3;13191:12;13184:19;;12989:220;;;:::o;13215:366::-;13357:3;13378:67;13442:2;13437:3;13378:67;:::i;:::-;13371:74;;13454:93;13543:3;13454:93;:::i;:::-;13572:2;13567:3;13563:12;13556:19;;13361:220;;;:::o;13587:366::-;13729:3;13750:67;13814:2;13809:3;13750:67;:::i;:::-;13743:74;;13826:93;13915:3;13826:93;:::i;:::-;13944:2;13939:3;13935:12;13928:19;;13733:220;;;:::o;13959:366::-;14101:3;14122:67;14186:2;14181:3;14122:67;:::i;:::-;14115:74;;14198:93;14287:3;14198:93;:::i;:::-;14316:2;14311:3;14307:12;14300:19;;14105:220;;;:::o;14331:366::-;14473:3;14494:67;14558:2;14553:3;14494:67;:::i;:::-;14487:74;;14570:93;14659:3;14570:93;:::i;:::-;14688:2;14683:3;14679:12;14672:19;;14477:220;;;:::o;14703:366::-;14845:3;14866:67;14930:2;14925:3;14866:67;:::i;:::-;14859:74;;14942:93;15031:3;14942:93;:::i;:::-;15060:2;15055:3;15051:12;15044:19;;14849:220;;;:::o;15075:366::-;15217:3;15238:67;15302:2;15297:3;15238:67;:::i;:::-;15231:74;;15314:93;15403:3;15314:93;:::i;:::-;15432:2;15427:3;15423:12;15416:19;;15221:220;;;:::o;15447:366::-;15589:3;15610:67;15674:2;15669:3;15610:67;:::i;:::-;15603:74;;15686:93;15775:3;15686:93;:::i;:::-;15804:2;15799:3;15795:12;15788:19;;15593:220;;;:::o;15819:366::-;15961:3;15982:67;16046:2;16041:3;15982:67;:::i;:::-;15975:74;;16058:93;16147:3;16058:93;:::i;:::-;16176:2;16171:3;16167:12;16160:19;;15965:220;;;:::o;16191:366::-;16333:3;16354:67;16418:2;16413:3;16354:67;:::i;:::-;16347:74;;16430:93;16519:3;16430:93;:::i;:::-;16548:2;16543:3;16539:12;16532:19;;16337:220;;;:::o;16563:366::-;16705:3;16726:67;16790:2;16785:3;16726:67;:::i;:::-;16719:74;;16802:93;16891:3;16802:93;:::i;:::-;16920:2;16915:3;16911:12;16904:19;;16709:220;;;:::o;16935:366::-;17077:3;17098:67;17162:2;17157:3;17098:67;:::i;:::-;17091:74;;17174:93;17263:3;17174:93;:::i;:::-;17292:2;17287:3;17283:12;17276:19;;17081:220;;;:::o;17307:366::-;17449:3;17470:67;17534:2;17529:3;17470:67;:::i;:::-;17463:74;;17546:93;17635:3;17546:93;:::i;:::-;17664:2;17659:3;17655:12;17648:19;;17453:220;;;:::o;17679:366::-;17821:3;17842:67;17906:2;17901:3;17842:67;:::i;:::-;17835:74;;17918:93;18007:3;17918:93;:::i;:::-;18036:2;18031:3;18027:12;18020:19;;17825:220;;;:::o;18051:366::-;18193:3;18214:67;18278:2;18273:3;18214:67;:::i;:::-;18207:74;;18290:93;18379:3;18290:93;:::i;:::-;18408:2;18403:3;18399:12;18392:19;;18197:220;;;:::o;18423:366::-;18565:3;18586:67;18650:2;18645:3;18586:67;:::i;:::-;18579:74;;18662:93;18751:3;18662:93;:::i;:::-;18780:2;18775:3;18771:12;18764:19;;18569:220;;;:::o;18795:366::-;18937:3;18958:67;19022:2;19017:3;18958:67;:::i;:::-;18951:74;;19034:93;19123:3;19034:93;:::i;:::-;19152:2;19147:3;19143:12;19136:19;;18941:220;;;:::o;19167:366::-;19309:3;19330:67;19394:2;19389:3;19330:67;:::i;:::-;19323:74;;19406:93;19495:3;19406:93;:::i;:::-;19524:2;19519:3;19515:12;19508:19;;19313:220;;;:::o;19539:366::-;19681:3;19702:67;19766:2;19761:3;19702:67;:::i;:::-;19695:74;;19778:93;19867:3;19778:93;:::i;:::-;19896:2;19891:3;19887:12;19880:19;;19685:220;;;:::o;19911:108::-;19988:24;20006:5;19988:24;:::i;:::-;19983:3;19976:37;19966:53;;:::o;20025:118::-;20112:24;20130:5;20112:24;:::i;:::-;20107:3;20100:37;20090:53;;:::o;20149:435::-;20329:3;20351:95;20442:3;20433:6;20351:95;:::i;:::-;20344:102;;20463:95;20554:3;20545:6;20463:95;:::i;:::-;20456:102;;20575:3;20568:10;;20333:251;;;;;:::o;20590:222::-;20683:4;20721:2;20710:9;20706:18;20698:26;;20734:71;20802:1;20791:9;20787:17;20778:6;20734:71;:::i;:::-;20688:124;;;;:::o;20818:640::-;21013:4;21051:3;21040:9;21036:19;21028:27;;21065:71;21133:1;21122:9;21118:17;21109:6;21065:71;:::i;:::-;21146:72;21214:2;21203:9;21199:18;21190:6;21146:72;:::i;:::-;21228;21296:2;21285:9;21281:18;21272:6;21228:72;:::i;:::-;21347:9;21341:4;21337:20;21332:2;21321:9;21317:18;21310:48;21375:76;21446:4;21437:6;21375:76;:::i;:::-;21367:84;;21018:440;;;;;;;:::o;21464:332::-;21585:4;21623:2;21612:9;21608:18;21600:26;;21636:71;21704:1;21693:9;21689:17;21680:6;21636:71;:::i;:::-;21717:72;21785:2;21774:9;21770:18;21761:6;21717:72;:::i;:::-;21590:206;;;;;:::o;21802:373::-;21945:4;21983:2;21972:9;21968:18;21960:26;;22032:9;22026:4;22022:20;22018:1;22007:9;22003:17;21996:47;22060:108;22163:4;22154:6;22060:108;:::i;:::-;22052:116;;21950:225;;;;:::o;22181:210::-;22268:4;22306:2;22295:9;22291:18;22283:26;;22319:65;22381:1;22370:9;22366:17;22357:6;22319:65;:::i;:::-;22273:118;;;;:::o;22397:313::-;22510:4;22548:2;22537:9;22533:18;22525:26;;22597:9;22591:4;22587:20;22583:1;22572:9;22568:17;22561:47;22625:78;22698:4;22689:6;22625:78;:::i;:::-;22617:86;;22515:195;;;;:::o;22716:419::-;22882:4;22920:2;22909:9;22905:18;22897:26;;22969:9;22963:4;22959:20;22955:1;22944:9;22940:17;22933:47;22997:131;23123:4;22997:131;:::i;:::-;22989:139;;22887:248;;;:::o;23141:419::-;23307:4;23345:2;23334:9;23330:18;23322:26;;23394:9;23388:4;23384:20;23380:1;23369:9;23365:17;23358:47;23422:131;23548:4;23422:131;:::i;:::-;23414:139;;23312:248;;;:::o;23566:419::-;23732:4;23770:2;23759:9;23755:18;23747:26;;23819:9;23813:4;23809:20;23805:1;23794:9;23790:17;23783:47;23847:131;23973:4;23847:131;:::i;:::-;23839:139;;23737:248;;;:::o;23991:419::-;24157:4;24195:2;24184:9;24180:18;24172:26;;24244:9;24238:4;24234:20;24230:1;24219:9;24215:17;24208:47;24272:131;24398:4;24272:131;:::i;:::-;24264:139;;24162:248;;;:::o;24416:419::-;24582:4;24620:2;24609:9;24605:18;24597:26;;24669:9;24663:4;24659:20;24655:1;24644:9;24640:17;24633:47;24697:131;24823:4;24697:131;:::i;:::-;24689:139;;24587:248;;;:::o;24841:419::-;25007:4;25045:2;25034:9;25030:18;25022:26;;25094:9;25088:4;25084:20;25080:1;25069:9;25065:17;25058:47;25122:131;25248:4;25122:131;:::i;:::-;25114:139;;25012:248;;;:::o;25266:419::-;25432:4;25470:2;25459:9;25455:18;25447:26;;25519:9;25513:4;25509:20;25505:1;25494:9;25490:17;25483:47;25547:131;25673:4;25547:131;:::i;:::-;25539:139;;25437:248;;;:::o;25691:419::-;25857:4;25895:2;25884:9;25880:18;25872:26;;25944:9;25938:4;25934:20;25930:1;25919:9;25915:17;25908:47;25972:131;26098:4;25972:131;:::i;:::-;25964:139;;25862:248;;;:::o;26116:419::-;26282:4;26320:2;26309:9;26305:18;26297:26;;26369:9;26363:4;26359:20;26355:1;26344:9;26340:17;26333:47;26397:131;26523:4;26397:131;:::i;:::-;26389:139;;26287:248;;;:::o;26541:419::-;26707:4;26745:2;26734:9;26730:18;26722:26;;26794:9;26788:4;26784:20;26780:1;26769:9;26765:17;26758:47;26822:131;26948:4;26822:131;:::i;:::-;26814:139;;26712:248;;;:::o;26966:419::-;27132:4;27170:2;27159:9;27155:18;27147:26;;27219:9;27213:4;27209:20;27205:1;27194:9;27190:17;27183:47;27247:131;27373:4;27247:131;:::i;:::-;27239:139;;27137:248;;;:::o;27391:419::-;27557:4;27595:2;27584:9;27580:18;27572:26;;27644:9;27638:4;27634:20;27630:1;27619:9;27615:17;27608:47;27672:131;27798:4;27672:131;:::i;:::-;27664:139;;27562:248;;;:::o;27816:419::-;27982:4;28020:2;28009:9;28005:18;27997:26;;28069:9;28063:4;28059:20;28055:1;28044:9;28040:17;28033:47;28097:131;28223:4;28097:131;:::i;:::-;28089:139;;27987:248;;;:::o;28241:419::-;28407:4;28445:2;28434:9;28430:18;28422:26;;28494:9;28488:4;28484:20;28480:1;28469:9;28465:17;28458:47;28522:131;28648:4;28522:131;:::i;:::-;28514:139;;28412:248;;;:::o;28666:419::-;28832:4;28870:2;28859:9;28855:18;28847:26;;28919:9;28913:4;28909:20;28905:1;28894:9;28890:17;28883:47;28947:131;29073:4;28947:131;:::i;:::-;28939:139;;28837:248;;;:::o;29091:419::-;29257:4;29295:2;29284:9;29280:18;29272:26;;29344:9;29338:4;29334:20;29330:1;29319:9;29315:17;29308:47;29372:131;29498:4;29372:131;:::i;:::-;29364:139;;29262:248;;;:::o;29516:419::-;29682:4;29720:2;29709:9;29705:18;29697:26;;29769:9;29763:4;29759:20;29755:1;29744:9;29740:17;29733:47;29797:131;29923:4;29797:131;:::i;:::-;29789:139;;29687:248;;;:::o;29941:419::-;30107:4;30145:2;30134:9;30130:18;30122:26;;30194:9;30188:4;30184:20;30180:1;30169:9;30165:17;30158:47;30222:131;30348:4;30222:131;:::i;:::-;30214:139;;30112:248;;;:::o;30366:419::-;30532:4;30570:2;30559:9;30555:18;30547:26;;30619:9;30613:4;30609:20;30605:1;30594:9;30590:17;30583:47;30647:131;30773:4;30647:131;:::i;:::-;30639:139;;30537:248;;;:::o;30791:419::-;30957:4;30995:2;30984:9;30980:18;30972:26;;31044:9;31038:4;31034:20;31030:1;31019:9;31015:17;31008:47;31072:131;31198:4;31072:131;:::i;:::-;31064:139;;30962:248;;;:::o;31216:419::-;31382:4;31420:2;31409:9;31405:18;31397:26;;31469:9;31463:4;31459:20;31455:1;31444:9;31440:17;31433:47;31497:131;31623:4;31497:131;:::i;:::-;31489:139;;31387:248;;;:::o;31641:419::-;31807:4;31845:2;31834:9;31830:18;31822:26;;31894:9;31888:4;31884:20;31880:1;31869:9;31865:17;31858:47;31922:131;32048:4;31922:131;:::i;:::-;31914:139;;31812:248;;;:::o;32066:419::-;32232:4;32270:2;32259:9;32255:18;32247:26;;32319:9;32313:4;32309:20;32305:1;32294:9;32290:17;32283:47;32347:131;32473:4;32347:131;:::i;:::-;32339:139;;32237:248;;;:::o;32491:419::-;32657:4;32695:2;32684:9;32680:18;32672:26;;32744:9;32738:4;32734:20;32730:1;32719:9;32715:17;32708:47;32772:131;32898:4;32772:131;:::i;:::-;32764:139;;32662:248;;;:::o;32916:419::-;33082:4;33120:2;33109:9;33105:18;33097:26;;33169:9;33163:4;33159:20;33155:1;33144:9;33140:17;33133:47;33197:131;33323:4;33197:131;:::i;:::-;33189:139;;33087:248;;;:::o;33341:419::-;33507:4;33545:2;33534:9;33530:18;33522:26;;33594:9;33588:4;33584:20;33580:1;33569:9;33565:17;33558:47;33622:131;33748:4;33622:131;:::i;:::-;33614:139;;33512:248;;;:::o;33766:222::-;33859:4;33897:2;33886:9;33882:18;33874:26;;33910:71;33978:1;33967:9;33963:17;33954:6;33910:71;:::i;:::-;33864:124;;;;:::o;33994:129::-;34028:6;34055:20;;:::i;:::-;34045:30;;34084:33;34112:4;34104:6;34084:33;:::i;:::-;34035:88;;;:::o;34129:75::-;34162:6;34195:2;34189:9;34179:19;;34169:35;:::o;34210:311::-;34287:4;34377:18;34369:6;34366:30;34363:2;;;34399:18;;:::i;:::-;34363:2;34449:4;34441:6;34437:17;34429:25;;34509:4;34503;34499:15;34491:23;;34292:229;;;:::o;34527:307::-;34588:4;34678:18;34670:6;34667:30;34664:2;;;34700:18;;:::i;:::-;34664:2;34738:29;34760:6;34738:29;:::i;:::-;34730:37;;34822:4;34816;34812:15;34804:23;;34593:241;;;:::o;34840:308::-;34902:4;34992:18;34984:6;34981:30;34978:2;;;35014:18;;:::i;:::-;34978:2;35052:29;35074:6;35052:29;:::i;:::-;35044:37;;35136:4;35130;35126:15;35118:23;;34907:241;;;:::o;35154:132::-;35221:4;35244:3;35236:11;;35274:4;35269:3;35265:14;35257:22;;35226:60;;;:::o;35292:114::-;35359:6;35393:5;35387:12;35377:22;;35366:40;;;:::o;35412:98::-;35463:6;35497:5;35491:12;35481:22;;35470:40;;;:::o;35516:99::-;35568:6;35602:5;35596:12;35586:22;;35575:40;;;:::o;35621:113::-;35691:4;35723;35718:3;35714:14;35706:22;;35696:38;;;:::o;35740:184::-;35839:11;35873:6;35868:3;35861:19;35913:4;35908:3;35904:14;35889:29;;35851:73;;;;:::o;35930:168::-;36013:11;36047:6;36042:3;36035:19;36087:4;36082:3;36078:14;36063:29;;36025:73;;;;:::o;36104:169::-;36188:11;36222:6;36217:3;36210:19;36262:4;36257:3;36253:14;36238:29;;36200:73;;;;:::o;36279:148::-;36381:11;36418:3;36403:18;;36393:34;;;;:::o;36433:305::-;36473:3;36492:20;36510:1;36492:20;:::i;:::-;36487:25;;36526:20;36544:1;36526:20;:::i;:::-;36521:25;;36680:1;36612:66;36608:74;36605:1;36602:81;36599:2;;;36686:18;;:::i;:::-;36599:2;36730:1;36727;36723:9;36716:16;;36477:261;;;;:::o;36744:185::-;36784:1;36801:20;36819:1;36801:20;:::i;:::-;36796:25;;36835:20;36853:1;36835:20;:::i;:::-;36830:25;;36874:1;36864:2;;36879:18;;:::i;:::-;36864:2;36921:1;36918;36914:9;36909:14;;36786:143;;;;:::o;36935:348::-;36975:7;36998:20;37016:1;36998:20;:::i;:::-;36993:25;;37032:20;37050:1;37032:20;:::i;:::-;37027:25;;37220:1;37152:66;37148:74;37145:1;37142:81;37137:1;37130:9;37123:17;37119:105;37116:2;;;37227:18;;:::i;:::-;37116:2;37275:1;37272;37268:9;37257:20;;36983:300;;;;:::o;37289:191::-;37329:4;37349:20;37367:1;37349:20;:::i;:::-;37344:25;;37383:20;37401:1;37383:20;:::i;:::-;37378:25;;37422:1;37419;37416:8;37413:2;;;37427:18;;:::i;:::-;37413:2;37472:1;37469;37465:9;37457:17;;37334:146;;;;:::o;37486:96::-;37523:7;37552:24;37570:5;37552:24;:::i;:::-;37541:35;;37531:51;;;:::o;37588:90::-;37622:7;37665:5;37658:13;37651:21;37640:32;;37630:48;;;:::o;37684:149::-;37720:7;37760:66;37753:5;37749:78;37738:89;;37728:105;;;:::o;37839:126::-;37876:7;37916:42;37909:5;37905:54;37894:65;;37884:81;;;:::o;37971:77::-;38008:7;38037:5;38026:16;;38016:32;;;:::o;38054:154::-;38138:6;38133:3;38128;38115:30;38200:1;38191:6;38186:3;38182:16;38175:27;38105:103;;;:::o;38214:307::-;38282:1;38292:113;38306:6;38303:1;38300:13;38292:113;;;38391:1;38386:3;38382:11;38376:18;38372:1;38367:3;38363:11;38356:39;38328:2;38325:1;38321:10;38316:15;;38292:113;;;38423:6;38420:1;38417:13;38414:2;;;38503:1;38494:6;38489:3;38485:16;38478:27;38414:2;38263:258;;;;:::o;38527:320::-;38571:6;38608:1;38602:4;38598:12;38588:22;;38655:1;38649:4;38645:12;38676:18;38666:2;;38732:4;38724:6;38720:17;38710:27;;38666:2;38794;38786:6;38783:14;38763:18;38760:38;38757:2;;;38813:18;;:::i;:::-;38757:2;38578:269;;;;:::o;38853:281::-;38936:27;38958:4;38936:27;:::i;:::-;38928:6;38924:40;39066:6;39054:10;39051:22;39030:18;39018:10;39015:34;39012:62;39009:2;;;39077:18;;:::i;:::-;39009:2;39117:10;39113:2;39106:22;38896:238;;;:::o;39140:233::-;39179:3;39202:24;39220:5;39202:24;:::i;:::-;39193:33;;39248:66;39241:5;39238:77;39235:2;;;39318:18;;:::i;:::-;39235:2;39365:1;39358:5;39354:13;39347:20;;39183:190;;;:::o;39379:176::-;39411:1;39428:20;39446:1;39428:20;:::i;:::-;39423:25;;39462:20;39480:1;39462:20;:::i;:::-;39457:25;;39501:1;39491:2;;39506:18;;:::i;:::-;39491:2;39547:1;39544;39540:9;39535:14;;39413:142;;;;:::o;39561:180::-;39609:77;39606:1;39599:88;39706:4;39703:1;39696:15;39730:4;39727:1;39720:15;39747:180;39795:77;39792:1;39785:88;39892:4;39889:1;39882:15;39916:4;39913:1;39906:15;39933:180;39981:77;39978:1;39971:88;40078:4;40075:1;40068:15;40102:4;40099:1;40092:15;40119:180;40167:77;40164:1;40157:88;40264:4;40261:1;40254:15;40288:4;40285:1;40278:15;40305:102;40346:6;40397:2;40393:7;40388:2;40381:5;40377:14;40373:28;40363:38;;40353:54;;;:::o;40413:222::-;40553:34;40549:1;40541:6;40537:14;40530:58;40622:5;40617:2;40609:6;40605:15;40598:30;40519:116;:::o;40641:230::-;40781:34;40777:1;40769:6;40765:14;40758:58;40850:13;40845:2;40837:6;40833:15;40826:38;40747:124;:::o;40877:177::-;41017:29;41013:1;41005:6;41001:14;40994:53;40983:71;:::o;41060:237::-;41200:34;41196:1;41188:6;41184:14;41177:58;41269:20;41264:2;41256:6;41252:15;41245:45;41166:131;:::o;41303:225::-;41443:34;41439:1;41431:6;41427:14;41420:58;41512:8;41507:2;41499:6;41495:15;41488:33;41409:119;:::o;41534:178::-;41674:30;41670:1;41662:6;41658:14;41651:54;41640:72;:::o;41718:223::-;41858:34;41854:1;41846:6;41842:14;41835:58;41927:6;41922:2;41914:6;41910:15;41903:31;41824:117;:::o;41947:175::-;42087:27;42083:1;42075:6;42071:14;42064:51;42053:69;:::o;42128:180::-;42268:32;42264:1;42256:6;42252:14;42245:56;42234:74;:::o;42314:231::-;42454:34;42450:1;42442:6;42438:14;42431:58;42523:14;42518:2;42510:6;42506:15;42499:39;42420:125;:::o;42551:173::-;42691:25;42687:1;42679:6;42675:14;42668:49;42657:67;:::o;42730:243::-;42870:34;42866:1;42858:6;42854:14;42847:58;42939:26;42934:2;42926:6;42922:15;42915:51;42836:137;:::o;42979:229::-;43119:34;43115:1;43107:6;43103:14;43096:58;43188:12;43183:2;43175:6;43171:15;43164:37;43085:123;:::o;43214:228::-;43354:34;43350:1;43342:6;43338:14;43331:58;43423:11;43418:2;43410:6;43406:15;43399:36;43320:122;:::o;43448:182::-;43588:34;43584:1;43576:6;43572:14;43565:58;43554:76;:::o;43636:231::-;43776:34;43772:1;43764:6;43760:14;43753:58;43845:14;43840:2;43832:6;43828:15;43821:39;43742:125;:::o;43873:182::-;44013:34;44009:1;44001:6;43997:14;43990:58;43979:76;:::o;44061:228::-;44201:34;44197:1;44189:6;44185:14;44178:58;44270:11;44265:2;44257:6;44253:15;44246:36;44167:122;:::o;44295:234::-;44435:34;44431:1;44423:6;44419:14;44412:58;44504:17;44499:2;44491:6;44487:15;44480:42;44401:128;:::o;44535:220::-;44675:34;44671:1;44663:6;44659:14;44652:58;44744:3;44739:2;44731:6;44727:15;44720:28;44641:114;:::o;44761:236::-;44901:34;44897:1;44889:6;44885:14;44878:58;44970:19;44965:2;44957:6;44953:15;44946:44;44867:130;:::o;45003:171::-;45143:23;45139:1;45131:6;45127:14;45120:47;45109:65;:::o;45180:231::-;45320:34;45316:1;45308:6;45304:14;45297:58;45389:14;45384:2;45376:6;45372:15;45365:39;45286:125;:::o;45417:177::-;45557:29;45553:1;45545:6;45541:14;45534:53;45523:71;:::o;45600:235::-;45740:34;45736:1;45728:6;45724:14;45717:58;45809:18;45804:2;45796:6;45792:15;45785:43;45706:129;:::o;45841:175::-;45981:27;45977:1;45969:6;45965:14;45958:51;45947:69;:::o;46022:122::-;46095:24;46113:5;46095:24;:::i;:::-;46088:5;46085:35;46075:2;;46134:1;46131;46124:12;46075:2;46065:79;:::o;46150:116::-;46220:21;46235:5;46220:21;:::i;:::-;46213:5;46210:32;46200:2;;46256:1;46253;46246:12;46200:2;46190:76;:::o;46272:120::-;46344:23;46361:5;46344:23;:::i;:::-;46337:5;46334:34;46324:2;;46382:1;46379;46372:12;46324:2;46314:78;:::o;46398:122::-;46471:24;46489:5;46471:24;:::i;:::-;46464:5;46461:35;46451:2;;46510:1;46507;46500:12;46451:2;46441:79;:::o

Swarm Source

ipfs://2014a42603946c1a34e49c9ad0013281302bb154e259bf9eabaf2b0d4187a4f6
Loading