ETH Price: $2,629.22 (+5.88%)
Gas: 5 Gwei

Token

Bullfy (Bullfy)
 

Overview

Max Total Supply

45 Bullfy

Holders

45

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
fakeworld.eth
Balance
1 Bullfy
0x23BD1AAbDa75aa6a02Cc378C1a9BfdbB767A978A
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Bullfy

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 2 of 14: Bullfy.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.11;

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

/* 
/**


 .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------. 
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| |   ______     | || | _____  _____ | || |   _____      | || |   _____      | || |  _________   | || |  ____  ____  | |
| |  |_   _ \    | || ||_   _||_   _|| || |  |_   _|     | || |  |_   _|     | || | |_   ___  |  | || | |_  _||_  _| | |
| |    | |_) |   | || |  | |    | |  | || |    | |       | || |    | |       | || |   | |_  \_|  | || |   \ \  / /   | |
| |    |  __'.   | || |  | '    ' |  | || |    | |   _   | || |    | |   _   | || |   |  _|      | || |    \ \/ /    | |
| |   _| |__) |  | || |   \ `--' /   | || |   _| |__/ |  | || |   _| |__/ |  | || |  _| |_       | || |    _|  |_    | |
| |  |_______/   | || |    `.__.'    | || |  |________|  | || |  |________|  | || | |_____|      | || |   |______|   | |
| |              | || |              | || |              | || |              | || |              | || |              | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
 '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------'                                      


@title ERC-721 token for Bullfy
@author drew10.eth

*/

contract Bullfy is Ownable, ERC721Enumerable {
   using Strings for uint;
    using Counters for Counters.Counter;

    string private _tokenURI;
    string private _contractURI;
    Counters.Counter private _tokenIdCounter;
    
    uint public maxSupply = 350;
    uint public tokenPrice = 0.088 ether;
    bool public saleStarted = false;
    bool public transfersEnabled = false;

    mapping(uint => uint) public expiryTime;

    constructor(
        string memory tokenURI_,
        string memory contractURI_
    ) ERC721("Bullfy", "Bullfy") {
        _tokenURI = tokenURI_;
        _contractURI = contractURI_;
    }

    /**
    * @notice Function modifier that is used to determine if the caller is
    * the owner. If not, run additional checks before proceeding.
    */
    modifier nonOwner(address to) {
        if (msg.sender != owner()) {
            require(transfersEnabled, "Token transfers are currently disabled.");
            require(balanceOf(to) == 0, "User already holds a token.");
        }
        _;
    }

    /**
    * @notice Function that is used to mint a token.
    */
    function mint() public payable {

        uint tokenIndex = _tokenIdCounter.current() + 1;

        require(tx.origin == msg.sender, "Caller must not be a contract.");
        require(saleStarted, "Sale has not started.");
        require(balanceOf(msg.sender) == 0, "User already holds a token.");
        require(msg.value == tokenPrice, "Incorrect Ether amount sent.");
        require(tokenIndex <= maxSupply, "Minted token would exceed total supply.");

        _tokenIdCounter.increment();

        _safeMint(msg.sender, tokenIndex);
        expiryTime[tokenIndex] = block.timestamp + 30 days;
    }


    /**
    * @notice Function that is used to extend/renew a tokens expiry date.
    *
    * @param _tokenId The token ID to extend/renew.
    */
    function renewToken(uint _tokenId) public payable {
        require(tx.origin == msg.sender, "Caller must not be a contract.");
        require(msg.value == tokenPrice, "Incorrect Ether amount.");
        require(_exists(_tokenId), "Token does not exist.");

        uint _currentexpiryTime = expiryTime[_tokenId];

        if (block.timestamp > _currentexpiryTime) {
            expiryTime[_tokenId] = block.timestamp + 30 days;
        } else {
            expiryTime[_tokenId] += 30 days;
        }
    }

    /**


    /**
    * @notice Function that is used to extend/renew a tokens expiry date.
    *
    * @param _tokenId The token ID to extend/renew.
    */
    function renewTokenForUser(uint _tokenId) public onlyOwner {
        require(_exists(_tokenId), "Token does not exist.");

        uint _currentexpiryTime = expiryTime[_tokenId];

        if (block.timestamp > _currentexpiryTime) {
            expiryTime[_tokenId] = block.timestamp + 60 days;
        } else {
            expiryTime[_tokenId] += 60 days;
        }
    }

    /**

    /**
    * @notice Function that is used to mint a token free of charge, only
    * callable by the owner.
    *
    * @param _receiver The receiving address of the newly minted token.
    */
    function ownerMint(address _receiver) public onlyOwner {

        uint tokenIndex = _tokenIdCounter.current() + 1;

        require(_receiver != address(0), "Receiver cannot be zero address.");
        require(tokenIndex <= maxSupply, "Minted token would exceed total supply.");

        if (msg.sender != _receiver) {
            require(balanceOf(_receiver) == 0, "User already holds a token.");
        }

        _tokenIdCounter.increment();

        _safeMint(_receiver, tokenIndex);
        expiryTime[tokenIndex] = block.timestamp + 30 days;
    }

    /**
    * @notice Function that is used to extend/renew a tokens expiry date.
    *
    * @param _tokenId The token ID to extend/renew.
    */

    /**
    * @notice Function that is used to extend/renew a tokens expiry date for
    * 30 days free of charge, only callable by the owner.
    *
    * @param _tokenId The token ID to extend/renew.
    */

    /**
    * @notice Function that is used to extend/renew multiple tokens expiry date for
    * 365 days free of charge, only callable by the owner.
    *
    * @param _tokenIds The token IDs to extend/renew.
    */

    /**
    * @notice Function that is used to update the 'tokenPrice' variable,
    * only callable by the owner.
    *
    * @param _updatedTokenPrice The new token price in units of wei. E.g.
    * 500000000000000000 is 0.50 Ether.
    */
    function updateTokenPrice(uint _updatedTokenPrice) external onlyOwner {
        require(tokenPrice != _updatedTokenPrice, "Price has not changed.");
        tokenPrice = _updatedTokenPrice;
    }

    /**
    * @notice Function that is used to authenticate a user.
    *
    * @param _tokenId The desired token owned by a user.
    *
    * @return Returns a bool value determining if authentication was
    * was successful. 'true' is successful, 'false' if otherwise.
    */
    function authenticateUser(uint _tokenId, address owner) public view returns (bool) {
        require(_exists(_tokenId), "Token does not exist.");
        require(expiryTime[_tokenId] > block.timestamp, "Token has expired. Please renew!");

        return owner == ownerOf(_tokenId) ? true : false;
    }

    /**
    * @notice Function that is used to increase the `maxSupply` value. Used
    * to emulate restocks once the maximum supply of tokens has been minted.
    *
    * @param _newTokens The amount of tokens to add to `maxSupply` value.
    */
    function addTokens(uint _newTokens) external onlyOwner {
        maxSupply += _newTokens;
    }

    /**
    * @notice Function that is used to decrease the `maxSupply` value. Used
    * to reduce the maximum supply in the event too many tokens have been added.
    *
    * @param _numTokens The amount of tokens to add to `maxSupply` value.
    */
    function removeTokens(uint _numTokens) external onlyOwner {
        require(maxSupply - _numTokens >= totalSupply(), "Supply cannot fall below minted tokens.");
        maxSupply -= _numTokens;
    }

    /**
    * @notice Function that is used to get the token URI for a specific token.
    *
    * @param _tokenId The token ID to fetch the token URI for.
    *
    * @return Returns a string value representing the token URI for the
    * specified token.
    */
    function tokenURI(uint _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return string(abi.encodePacked(_tokenURI, _tokenId.toString()));
    }

    /**
    * @notice Function that is used to update the token URI for the contract,
    * only callable by the owner.
    * 
    * @param tokenURI_ A string value to replace the current '_tokenURI' value.
    */
    function setTokenURI(string calldata tokenURI_) external onlyOwner {
        _tokenURI = tokenURI_;
    }

    /**
    * @notice Function that is used to get the contract URI.
    *
    * @return Returns a string value representing the contract URI.
    */
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    /**
    * @notice Function that is used to update the contract URI, only callable
    * by the owner.
    * 
    * @param contractURI_ A string value to replace the current 'contractURI_'.
    */
    function setContractURI(string calldata contractURI_) external onlyOwner {
        _contractURI = contractURI_;
    }

    /**
    * @notice Function that is used to withdraw the balance of the contract,
    * only callable by the owner.
    */
    function withdrawBalance() public onlyOwner {
		payable(msg.sender).transfer(address(this).balance);
	}

    /**
    * @notice Function that is used to flip the sale state of the contract,
    * only callable by the owner.
    */
    function toggleSale() public onlyOwner {
        saleStarted = !saleStarted;
    }

    /**
    * @notice Function that is used to flip the transfer state of the contract,
    * only callable by the owner.
    */
    function toggleTransfers() public onlyOwner {
        transfersEnabled = !transfersEnabled;
    }

    /**
    * @notice Function that is used to get the total tokens minted.
    *
    * @return Returns a uint which indicates the total supply.
    */
    /**
    * @notice Function that is used to safely transfer a token from one owner to another,
    * this function has been overriden so that transfers can be disabled.
    */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override nonOwner(to) {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Transfer caller is not owner nor approved.");
        require(expiryTime[tokenId] > block.timestamp, "Token has expired.");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
    * @notice Function that is used to transfer a token from one owner to another,
    * this function has been overriden so that transfers can be disabled.
    */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override nonOwner(to) {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Transfer caller is not owner nor approved.");
        require(expiryTime[tokenId] > block.timestamp, "Token has expired.");
        _transfer(from, to, tokenId);
    }

}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

pragma solidity ^0.8.0;

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

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is IERC721Enumerable, ERC721  {
    // 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 8 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

    /**
     * @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 11 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"},{"internalType":"string","name":"contractURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"_newTokens","type":"uint256"}],"name":"addTokens","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"authenticateUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"expiryTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"address","name":"_receiver","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"removeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"renewToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"renewTokenForUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_updatedTokenPrice","type":"uint256"}],"name":"updateTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261015e600e55670138a388a43c0000600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055503480156200005957600080fd5b506040516200547e3803806200547e83398181016040528101906200007f919062000492565b6040518060400160405280600681526020017f42756c6c667900000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f42756c6c667900000000000000000000000000000000000000000000000000008152506200010b620000ff6200017960201b60201c565b6200018160201b60201c565b81600190805190602001906200012392919062000245565b5080600290805190602001906200013c92919062000245565b50505081600b90805190602001906200015792919062000245565b5080600c90805190602001906200017092919062000245565b5050506200057c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002539062000546565b90600052602060002090601f016020900481019282620002775760008555620002c3565b82601f106200029257805160ff1916838001178555620002c3565b82800160010185558215620002c3579182015b82811115620002c2578251825591602001919060010190620002a5565b5b509050620002d29190620002d6565b5090565b5b80821115620002f1576000816000905550600101620002d7565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200035e8262000313565b810181811067ffffffffffffffff8211171562000380576200037f62000324565b5b80604052505050565b600062000395620002f5565b9050620003a3828262000353565b919050565b600067ffffffffffffffff821115620003c657620003c562000324565b5b620003d18262000313565b9050602081019050919050565b60005b83811015620003fe578082015181840152602081019050620003e1565b838111156200040e576000848401525b50505050565b60006200042b6200042584620003a8565b62000389565b9050828152602081018484840111156200044a57620004496200030e565b5b62000457848285620003de565b509392505050565b600082601f83011262000477576200047662000309565b5b81516200048984826020860162000414565b91505092915050565b60008060408385031215620004ac57620004ab620002ff565b5b600083015167ffffffffffffffff811115620004cd57620004cc62000304565b5b620004db858286016200045f565b925050602083015167ffffffffffffffff811115620004ff57620004fe62000304565b5b6200050d858286016200045f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200055f57607f821691505b6020821081141562000576576200057562000517565b5b50919050565b614ef2806200058c6000396000f3fe6080604052600436106102255760003560e01c806371e2394711610123578063b8cb65ee116100ab578063d5abeb011161006f578063d5abeb01146107c1578063e0df5b6f146107ec578063e8a3d48514610815578063e985e9c514610840578063f2fde38b1461087d57610225565b8063b8cb65ee146106ca578063be010c40146106f3578063bef97c8714610730578063c6ed89901461075b578063c87b56dd1461078457610225565b8063938e3d7b116100f2578063938e3d7b146105fb57806395d89b4114610624578063a22cb4651461064f578063add5229214610678578063b88d4fde146106a157610225565b806371e23947146105725780637d8966e41461058e5780637ff9b596146105a55780638da5cb5b146105d057610225565b80632f745c59116101b15780635fd8c710116101755780635fd8c710146104a15780636352211e146104b8578063676c0d77146104f557806370a082311461051e578063715018a61461055b57610225565b80632f745c59146103bc5780633e5ac28f146103f957806342842e0e146104105780634f6ccce7146104395780635c474f9e1461047657610225565b8063095ea7b3116101f8578063095ea7b31461030c5780631249c58b1461033557806318160ddd1461033f5780631e3bcc8e1461036a57806323b872dd1461039357610225565b806301ffc9a71461022a57806305a2294a1461026757806306fdde03146102a4578063081812fc146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613547565b6108a6565b60405161025e919061358f565b60405180910390f35b34801561027357600080fd5b5061028e6004803603810190610289919061363e565b610920565b60405161029b919061358f565b60405180910390f35b3480156102b057600080fd5b506102b9610a0c565b6040516102c69190613717565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613739565b610a9e565b6040516103039190613775565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190613790565b610b23565b005b61033d610c3b565b005b34801561034b57600080fd5b50610354610e23565b60405161036191906137df565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c91906137fa565b610e30565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613827565b611038565b005b3480156103c857600080fd5b506103e360048036038101906103de9190613790565b6111c4565b6040516103f091906137df565b60405180910390f35b34801561040557600080fd5b5061040e611269565b005b34801561041c57600080fd5b5061043760048036038101906104329190613827565b611311565b005b34801561044557600080fd5b50610460600480360381019061045b9190613739565b611331565b60405161046d91906137df565b60405180910390f35b34801561048257600080fd5b5061048b6113a2565b604051610498919061358f565b60405180910390f35b3480156104ad57600080fd5b506104b66113b5565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613739565b61147a565b6040516104ec9190613775565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190613739565b61152c565b005b34801561052a57600080fd5b50610545600480360381019061054091906137fa565b6115f7565b60405161055291906137df565b60405180910390f35b34801561056757600080fd5b506105706116af565b005b61058c60048036038101906105879190613739565b611737565b005b34801561059a57600080fd5b506105a36118ae565b005b3480156105b157600080fd5b506105ba611956565b6040516105c791906137df565b60405180910390f35b3480156105dc57600080fd5b506105e561195c565b6040516105f29190613775565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906138df565b611985565b005b34801561063057600080fd5b50610639611a17565b6040516106469190613717565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613958565b611aa9565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613739565b611abf565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613ac8565b611c00565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613739565b611d8e565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613739565b611e7d565b60405161072791906137df565b60405180910390f35b34801561073c57600080fd5b50610745611e95565b604051610752919061358f565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190613739565b611ea8565b005b34801561079057600080fd5b506107ab60048036038101906107a69190613739565b611f40565b6040516107b89190613717565b60405180910390f35b3480156107cd57600080fd5b506107d6611fbc565b6040516107e391906137df565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e91906138df565b611fc2565b005b34801561082157600080fd5b5061082a612054565b6040516108379190613717565b60405180910390f35b34801561084c57600080fd5b5061086760048036038101906108629190613b4b565b6120e6565b604051610874919061358f565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f91906137fa565b61217a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610919575061091882612272565b5b9050919050565b600061092b83612354565b61096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190613bd7565b60405180910390fd5b426011600085815260200190815260200160002054116109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690613c43565b60405180910390fd5b6109c88361147a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a01576000610a04565b60015b905092915050565b606060018054610a1b90613c92565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613c92565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050905090565b6000610aa982612354565b610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90613d36565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2e8261147a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690613dc8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbe6123c0565b73ffffffffffffffffffffffffffffffffffffffff161480610bed5750610bec81610be76123c0565b6120e6565b5b610c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2390613e5a565b60405180910390fd5b610c3683836123c8565b505050565b60006001610c49600d612481565b610c539190613ea9565b90503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90613f4b565b60405180910390fd5b601060009054906101000a900460ff16610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990613fb7565b60405180910390fd5b6000610d1d336115f7565b14610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490614023565b60405180910390fd5b600f543414610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d989061408f565b60405180910390fd5b600e54811115610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90614121565b60405180910390fd5b610df0600d61248f565b610dfa33826124a5565b62278d0042610e099190613ea9565b601160008381526020019081526020016000208190555050565b6000600980549050905090565b610e386123c0565b73ffffffffffffffffffffffffffffffffffffffff16610e5661195c565b73ffffffffffffffffffffffffffffffffffffffff1614610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea39061418d565b60405180910390fd5b60006001610eba600d612481565b610ec49190613ea9565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d906141f9565b60405180910390fd5b600e54811115610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290614121565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ffa576000610fb9836115f7565b14610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff090614023565b60405180910390fd5b5b611004600d61248f565b61100e82826124a5565b62278d004261101d9190613ea9565b60116000838152602001908152602001600020819055505050565b8161104161195c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461110e57601060019054906101000a900460ff166110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b99061428b565b60405180910390fd5b60006110cd826115f7565b1461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110490614023565b60405180910390fd5b5b61111f6111196123c0565b836124c3565b61115e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111559061431d565b60405180910390fd5b426011600084815260200190815260200160002054116111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614389565b60405180910390fd5b6111be8484846125a1565b50505050565b60006111cf836115f7565b8210611210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112079061441b565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6112716123c0565b73ffffffffffffffffffffffffffffffffffffffff1661128f61195c565b73ffffffffffffffffffffffffffffffffffffffff16146112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc9061418d565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b61132c83838360405180602001604052806000815250611c00565b505050565b600061133b610e23565b821061137c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611373906144ad565b60405180910390fd5b600982815481106113905761138f6144cd565b5b90600052602060002001549050919050565b601060009054906101000a900460ff1681565b6113bd6123c0565b73ffffffffffffffffffffffffffffffffffffffff166113db61195c565b73ffffffffffffffffffffffffffffffffffffffff1614611431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114289061418d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611477573d6000803e3d6000fd5b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a9061456e565b60405180910390fd5b80915050919050565b6115346123c0565b73ffffffffffffffffffffffffffffffffffffffff1661155261195c565b73ffffffffffffffffffffffffffffffffffffffff16146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f9061418d565b60405180910390fd5b80600f5414156115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e4906145da565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f9061466c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116b76123c0565b73ffffffffffffffffffffffffffffffffffffffff166116d561195c565b73ffffffffffffffffffffffffffffffffffffffff161461172b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117229061418d565b60405180910390fd5b61173560006127fd565b565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613f4b565b60405180910390fd5b600f5434146117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e0906146d8565b60405180910390fd5b6117f281612354565b611831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182890613bd7565b60405180910390fd5b6000601160008381526020019081526020016000205490508042111561187c5762278d00426118609190613ea9565b60116000848152602001908152602001600020819055506118aa565b62278d006011600084815260200190815260200160002060008282546118a29190613ea9565b925050819055505b5050565b6118b66123c0565b73ffffffffffffffffffffffffffffffffffffffff166118d461195c565b73ffffffffffffffffffffffffffffffffffffffff161461192a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119219061418d565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600f5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61198d6123c0565b73ffffffffffffffffffffffffffffffffffffffff166119ab61195c565b73ffffffffffffffffffffffffffffffffffffffff1614611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f89061418d565b60405180910390fd5b8181600c9190611a12929190613438565b505050565b606060028054611a2690613c92565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5290613c92565b8015611a9f5780601f10611a7457610100808354040283529160200191611a9f565b820191906000526020600020905b815481529060010190602001808311611a8257829003601f168201915b5050505050905090565b611abb611ab46123c0565b83836128c1565b5050565b611ac76123c0565b73ffffffffffffffffffffffffffffffffffffffff16611ae561195c565b73ffffffffffffffffffffffffffffffffffffffff1614611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b329061418d565b60405180910390fd5b611b4481612354565b611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a90613bd7565b60405180910390fd5b60006011600083815260200190815260200160002054905080421115611bce57624f1a0042611bb29190613ea9565b6011600084815260200190815260200160002081905550611bfc565b624f1a00601160008481526020019081526020016000206000828254611bf49190613ea9565b925050819055505b5050565b82611c0961195c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd657601060019054906101000a900460ff16611c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c819061428b565b60405180910390fd5b6000611c95826115f7565b14611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90614023565b60405180910390fd5b5b611ce7611ce16123c0565b846124c3565b611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d9061431d565b60405180910390fd5b42601160008581526020019081526020016000205411611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7290614389565b60405180910390fd5b611d8785858585612a2e565b5050505050565b611d966123c0565b73ffffffffffffffffffffffffffffffffffffffff16611db461195c565b73ffffffffffffffffffffffffffffffffffffffff1614611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e019061418d565b60405180910390fd5b611e12610e23565b81600e54611e2091906146f8565b1015611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e589061479e565b60405180910390fd5b80600e6000828254611e7391906146f8565b9250508190555050565b60116020528060005260406000206000915090505481565b601060019054906101000a900460ff1681565b611eb06123c0565b73ffffffffffffffffffffffffffffffffffffffff16611ece61195c565b73ffffffffffffffffffffffffffffffffffffffff1614611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b9061418d565b60405180910390fd5b80600e6000828254611f369190613ea9565b9250508190555050565b6060611f4b82612354565b611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8190613bd7565b60405180910390fd5b600b611f9583612a8a565b604051602001611fa692919061488e565b6040516020818303038152906040529050919050565b600e5481565b611fca6123c0565b73ffffffffffffffffffffffffffffffffffffffff16611fe861195c565b73ffffffffffffffffffffffffffffffffffffffff161461203e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120359061418d565b60405180910390fd5b8181600b919061204f929190613438565b505050565b6060600c805461206390613c92565b80601f016020809104026020016040519081016040528092919081815260200182805461208f90613c92565b80156120dc5780601f106120b1576101008083540402835291602001916120dc565b820191906000526020600020905b8154815290600101906020018083116120bf57829003601f168201915b5050505050905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121826123c0565b73ffffffffffffffffffffffffffffffffffffffff166121a061195c565b73ffffffffffffffffffffffffffffffffffffffff16146121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed9061418d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d90614924565b60405180910390fd5b61226f816127fd565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061233d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061234d575061234c82612beb565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661243b8361147a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6124bf828260405180602001604052806000815250612c55565b5050565b60006124ce82612354565b61250d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612504906149b6565b60405180910390fd5b60006125188361147a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061258757508373ffffffffffffffffffffffffffffffffffffffff1661256f84610a9e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612598575061259781856120e6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125c18261147a565b73ffffffffffffffffffffffffffffffffffffffff1614612617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e90614a48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e90614ada565b60405180910390fd5b612692838383612cb0565b61269d6000826123c8565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ed91906146f8565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127449190613ea9565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292790614b46565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a21919061358f565b60405180910390a3505050565b612a398484846125a1565b612a4584848484612dc4565b612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b90614bd8565b60405180910390fd5b50505050565b60606000821415612ad2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be6565b600082905060005b60008214612b04578080612aed90614bf8565b915050600a82612afd9190614c70565b9150612ada565b60008167ffffffffffffffff811115612b2057612b1f61399d565b5b6040519080825280601f01601f191660200182016040528015612b525781602001600182028036833780820191505090505b5090505b60008514612bdf57600182612b6b91906146f8565b9150600a85612b7a9190614ca1565b6030612b869190613ea9565b60f81b818381518110612b9c57612b9b6144cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd89190614c70565b9450612b56565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c5f8383612f4c565b612c6c6000848484612dc4565b612cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca290614bd8565b60405180910390fd5b505050565b612cbb83838361311a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cfe57612cf98161311f565b612d3d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d3c57612d3b8382613168565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d8057612d7b816132d5565b612dbf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612dbe57612dbd82826133a6565b5b5b505050565b6000612de58473ffffffffffffffffffffffffffffffffffffffff16613425565b15612f3f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e0e6123c0565b8786866040518563ffffffff1660e01b8152600401612e309493929190614d27565b6020604051808303816000875af1925050508015612e6c57506040513d601f19601f82011682018060405250810190612e699190614d88565b60015b612eef573d8060008114612e9c576040519150601f19603f3d011682016040523d82523d6000602084013e612ea1565b606091505b50600081511415612ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ede90614bd8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f44565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb390614e01565b60405180910390fd5b612fc581612354565b15613005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffc90614e6d565b60405180910390fd5b61301160008383612cb0565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130619190613ea9565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613175846115f7565b61317f91906146f8565b9050600060086000848152602001908152602001600020549050818114613264576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506132e991906146f8565b90506000600a6000848152602001908152602001600020549050600060098381548110613319576133186144cd565b5b90600052602060002001549050806009838154811061333b5761333a6144cd565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061338a57613389614e8d565b5b6001900381819060005260206000200160009055905550505050565b60006133b1836115f7565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461344490613c92565b90600052602060002090601f01602090048101928261346657600085556134ad565b82601f1061347f57803560ff19168380011785556134ad565b828001600101855582156134ad579182015b828111156134ac578235825591602001919060010190613491565b5b5090506134ba91906134be565b5090565b5b808211156134d75760008160009055506001016134bf565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613524816134ef565b811461352f57600080fd5b50565b6000813590506135418161351b565b92915050565b60006020828403121561355d5761355c6134e5565b5b600061356b84828501613532565b91505092915050565b60008115159050919050565b61358981613574565b82525050565b60006020820190506135a46000830184613580565b92915050565b6000819050919050565b6135bd816135aa565b81146135c857600080fd5b50565b6000813590506135da816135b4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061360b826135e0565b9050919050565b61361b81613600565b811461362657600080fd5b50565b60008135905061363881613612565b92915050565b60008060408385031215613655576136546134e5565b5b6000613663858286016135cb565b925050602061367485828601613629565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136b857808201518184015260208101905061369d565b838111156136c7576000848401525b50505050565b6000601f19601f8301169050919050565b60006136e98261367e565b6136f38185613689565b935061370381856020860161369a565b61370c816136cd565b840191505092915050565b6000602082019050818103600083015261373181846136de565b905092915050565b60006020828403121561374f5761374e6134e5565b5b600061375d848285016135cb565b91505092915050565b61376f81613600565b82525050565b600060208201905061378a6000830184613766565b92915050565b600080604083850312156137a7576137a66134e5565b5b60006137b585828601613629565b92505060206137c6858286016135cb565b9150509250929050565b6137d9816135aa565b82525050565b60006020820190506137f460008301846137d0565b92915050565b6000602082840312156138105761380f6134e5565b5b600061381e84828501613629565b91505092915050565b6000806000606084860312156138405761383f6134e5565b5b600061384e86828701613629565b935050602061385f86828701613629565b9250506040613870868287016135cb565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261389f5761389e61387a565b5b8235905067ffffffffffffffff8111156138bc576138bb61387f565b5b6020830191508360018202830111156138d8576138d7613884565b5b9250929050565b600080602083850312156138f6576138f56134e5565b5b600083013567ffffffffffffffff811115613914576139136134ea565b5b61392085828601613889565b92509250509250929050565b61393581613574565b811461394057600080fd5b50565b6000813590506139528161392c565b92915050565b6000806040838503121561396f5761396e6134e5565b5b600061397d85828601613629565b925050602061398e85828601613943565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139d5826136cd565b810181811067ffffffffffffffff821117156139f4576139f361399d565b5b80604052505050565b6000613a076134db565b9050613a1382826139cc565b919050565b600067ffffffffffffffff821115613a3357613a3261399d565b5b613a3c826136cd565b9050602081019050919050565b82818337600083830152505050565b6000613a6b613a6684613a18565b6139fd565b905082815260208101848484011115613a8757613a86613998565b5b613a92848285613a49565b509392505050565b600082601f830112613aaf57613aae61387a565b5b8135613abf848260208601613a58565b91505092915050565b60008060008060808587031215613ae257613ae16134e5565b5b6000613af087828801613629565b9450506020613b0187828801613629565b9350506040613b12878288016135cb565b925050606085013567ffffffffffffffff811115613b3357613b326134ea565b5b613b3f87828801613a9a565b91505092959194509250565b60008060408385031215613b6257613b616134e5565b5b6000613b7085828601613629565b9250506020613b8185828601613629565b9150509250929050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000613bc1601583613689565b9150613bcc82613b8b565b602082019050919050565b60006020820190508181036000830152613bf081613bb4565b9050919050565b7f546f6b656e2068617320657870697265642e20506c656173652072656e657721600082015250565b6000613c2d602083613689565b9150613c3882613bf7565b602082019050919050565b60006020820190508181036000830152613c5c81613c20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613caa57607f821691505b60208210811415613cbe57613cbd613c63565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613d20602c83613689565b9150613d2b82613cc4565b604082019050919050565b60006020820190508181036000830152613d4f81613d13565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613db2602183613689565b9150613dbd82613d56565b604082019050919050565b60006020820190508181036000830152613de181613da5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613e44603883613689565b9150613e4f82613de8565b604082019050919050565b60006020820190508181036000830152613e7381613e37565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613eb4826135aa565b9150613ebf836135aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ef457613ef3613e7a565b5b828201905092915050565b7f43616c6c6572206d757374206e6f74206265206120636f6e74726163742e0000600082015250565b6000613f35601e83613689565b9150613f4082613eff565b602082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f53616c6520686173206e6f7420737461727465642e0000000000000000000000600082015250565b6000613fa1601583613689565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b7f5573657220616c726561647920686f6c6473206120746f6b656e2e0000000000600082015250565b600061400d601b83613689565b915061401882613fd7565b602082019050919050565b6000602082019050818103600083015261403c81614000565b9050919050565b7f496e636f727265637420457468657220616d6f756e742073656e742e00000000600082015250565b6000614079601c83613689565b915061408482614043565b602082019050919050565b600060208201905081810360008301526140a88161406c565b9050919050565b7f4d696e74656420746f6b656e20776f756c642065786365656420746f74616c2060008201527f737570706c792e00000000000000000000000000000000000000000000000000602082015250565b600061410b602783613689565b9150614116826140af565b604082019050919050565b6000602082019050818103600083015261413a816140fe565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614177602083613689565b915061418282614141565b602082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b7f52656365697665722063616e6e6f74206265207a65726f20616464726573732e600082015250565b60006141e3602083613689565b91506141ee826141ad565b602082019050919050565b60006020820190508181036000830152614212816141d6565b9050919050565b7f546f6b656e207472616e7366657273206172652063757272656e746c7920646960008201527f7361626c65642e00000000000000000000000000000000000000000000000000602082015250565b6000614275602783613689565b915061428082614219565b604082019050919050565b600060208201905081810360008301526142a481614268565b9050919050565b7f5472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665642e00000000000000000000000000000000000000000000602082015250565b6000614307602a83613689565b9150614312826142ab565b604082019050919050565b60006020820190508181036000830152614336816142fa565b9050919050565b7f546f6b656e2068617320657870697265642e0000000000000000000000000000600082015250565b6000614373601283613689565b915061437e8261433d565b602082019050919050565b600060208201905081810360008301526143a281614366565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614405602b83613689565b9150614410826143a9565b604082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614497602c83613689565b91506144a28261443b565b604082019050919050565b600060208201905081810360008301526144c68161448a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614558602983613689565b9150614563826144fc565b604082019050919050565b600060208201905081810360008301526145878161454b565b9050919050565b7f507269636520686173206e6f74206368616e6765642e00000000000000000000600082015250565b60006145c4601683613689565b91506145cf8261458e565b602082019050919050565b600060208201905081810360008301526145f3816145b7565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614656602a83613689565b9150614661826145fa565b604082019050919050565b6000602082019050818103600083015261468581614649565b9050919050565b7f496e636f727265637420457468657220616d6f756e742e000000000000000000600082015250565b60006146c2601783613689565b91506146cd8261468c565b602082019050919050565b600060208201905081810360008301526146f1816146b5565b9050919050565b6000614703826135aa565b915061470e836135aa565b92508282101561472157614720613e7a565b5b828203905092915050565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b6000614788602783613689565b91506147938261472c565b604082019050919050565b600060208201905081810360008301526147b78161477b565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546147eb81613c92565b6147f581866147be565b94506001821660008114614810576001811461482157614854565b60ff19831686528186019350614854565b61482a856147c9565b60005b8381101561484c5781548189015260018201915060208101905061482d565b838801955050505b50505092915050565b60006148688261367e565b61487281856147be565b935061488281856020860161369a565b80840191505092915050565b600061489a82856147de565b91506148a6828461485d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061490e602683613689565b9150614919826148b2565b604082019050919050565b6000602082019050818103600083015261493d81614901565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006149a0602c83613689565b91506149ab82614944565b604082019050919050565b600060208201905081810360008301526149cf81614993565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614a32602983613689565b9150614a3d826149d6565b604082019050919050565b60006020820190508181036000830152614a6181614a25565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ac4602483613689565b9150614acf82614a68565b604082019050919050565b60006020820190508181036000830152614af381614ab7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b30601983613689565b9150614b3b82614afa565b602082019050919050565b60006020820190508181036000830152614b5f81614b23565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614bc2603283613689565b9150614bcd82614b66565b604082019050919050565b60006020820190508181036000830152614bf181614bb5565b9050919050565b6000614c03826135aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c3657614c35613e7a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c7b826135aa565b9150614c86836135aa565b925082614c9657614c95614c41565b5b828204905092915050565b6000614cac826135aa565b9150614cb7836135aa565b925082614cc757614cc6614c41565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614cf982614cd2565b614d038185614cdd565b9350614d1381856020860161369a565b614d1c816136cd565b840191505092915050565b6000608082019050614d3c6000830187613766565b614d496020830186613766565b614d5660408301856137d0565b8181036060830152614d688184614cee565b905095945050505050565b600081519050614d828161351b565b92915050565b600060208284031215614d9e57614d9d6134e5565b5b6000614dac84828501614d73565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614deb602083613689565b9150614df682614db5565b602082019050919050565b60006020820190508181036000830152614e1a81614dde565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614e57601c83613689565b9150614e6282614e21565b602082019050919050565b60006020820190508181036000830152614e8681614e4a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122032bcae995d63d8445eb9964060ec25592b991fd0317ad1f8a731185b746bfafb64736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c806371e2394711610123578063b8cb65ee116100ab578063d5abeb011161006f578063d5abeb01146107c1578063e0df5b6f146107ec578063e8a3d48514610815578063e985e9c514610840578063f2fde38b1461087d57610225565b8063b8cb65ee146106ca578063be010c40146106f3578063bef97c8714610730578063c6ed89901461075b578063c87b56dd1461078457610225565b8063938e3d7b116100f2578063938e3d7b146105fb57806395d89b4114610624578063a22cb4651461064f578063add5229214610678578063b88d4fde146106a157610225565b806371e23947146105725780637d8966e41461058e5780637ff9b596146105a55780638da5cb5b146105d057610225565b80632f745c59116101b15780635fd8c710116101755780635fd8c710146104a15780636352211e146104b8578063676c0d77146104f557806370a082311461051e578063715018a61461055b57610225565b80632f745c59146103bc5780633e5ac28f146103f957806342842e0e146104105780634f6ccce7146104395780635c474f9e1461047657610225565b8063095ea7b3116101f8578063095ea7b31461030c5780631249c58b1461033557806318160ddd1461033f5780631e3bcc8e1461036a57806323b872dd1461039357610225565b806301ffc9a71461022a57806305a2294a1461026757806306fdde03146102a4578063081812fc146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613547565b6108a6565b60405161025e919061358f565b60405180910390f35b34801561027357600080fd5b5061028e6004803603810190610289919061363e565b610920565b60405161029b919061358f565b60405180910390f35b3480156102b057600080fd5b506102b9610a0c565b6040516102c69190613717565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613739565b610a9e565b6040516103039190613775565b60405180910390f35b34801561031857600080fd5b50610333600480360381019061032e9190613790565b610b23565b005b61033d610c3b565b005b34801561034b57600080fd5b50610354610e23565b60405161036191906137df565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c91906137fa565b610e30565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613827565b611038565b005b3480156103c857600080fd5b506103e360048036038101906103de9190613790565b6111c4565b6040516103f091906137df565b60405180910390f35b34801561040557600080fd5b5061040e611269565b005b34801561041c57600080fd5b5061043760048036038101906104329190613827565b611311565b005b34801561044557600080fd5b50610460600480360381019061045b9190613739565b611331565b60405161046d91906137df565b60405180910390f35b34801561048257600080fd5b5061048b6113a2565b604051610498919061358f565b60405180910390f35b3480156104ad57600080fd5b506104b66113b5565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613739565b61147a565b6040516104ec9190613775565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190613739565b61152c565b005b34801561052a57600080fd5b50610545600480360381019061054091906137fa565b6115f7565b60405161055291906137df565b60405180910390f35b34801561056757600080fd5b506105706116af565b005b61058c60048036038101906105879190613739565b611737565b005b34801561059a57600080fd5b506105a36118ae565b005b3480156105b157600080fd5b506105ba611956565b6040516105c791906137df565b60405180910390f35b3480156105dc57600080fd5b506105e561195c565b6040516105f29190613775565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906138df565b611985565b005b34801561063057600080fd5b50610639611a17565b6040516106469190613717565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613958565b611aa9565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613739565b611abf565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613ac8565b611c00565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190613739565b611d8e565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613739565b611e7d565b60405161072791906137df565b60405180910390f35b34801561073c57600080fd5b50610745611e95565b604051610752919061358f565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190613739565b611ea8565b005b34801561079057600080fd5b506107ab60048036038101906107a69190613739565b611f40565b6040516107b89190613717565b60405180910390f35b3480156107cd57600080fd5b506107d6611fbc565b6040516107e391906137df565b60405180910390f35b3480156107f857600080fd5b50610813600480360381019061080e91906138df565b611fc2565b005b34801561082157600080fd5b5061082a612054565b6040516108379190613717565b60405180910390f35b34801561084c57600080fd5b5061086760048036038101906108629190613b4b565b6120e6565b604051610874919061358f565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f91906137fa565b61217a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610919575061091882612272565b5b9050919050565b600061092b83612354565b61096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190613bd7565b60405180910390fd5b426011600085815260200190815260200160002054116109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690613c43565b60405180910390fd5b6109c88361147a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610a01576000610a04565b60015b905092915050565b606060018054610a1b90613c92565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4790613c92565b8015610a945780601f10610a6957610100808354040283529160200191610a94565b820191906000526020600020905b815481529060010190602001808311610a7757829003601f168201915b5050505050905090565b6000610aa982612354565b610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90613d36565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2e8261147a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690613dc8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbe6123c0565b73ffffffffffffffffffffffffffffffffffffffff161480610bed5750610bec81610be76123c0565b6120e6565b5b610c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2390613e5a565b60405180910390fd5b610c3683836123c8565b505050565b60006001610c49600d612481565b610c539190613ea9565b90503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90613f4b565b60405180910390fd5b601060009054906101000a900460ff16610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0990613fb7565b60405180910390fd5b6000610d1d336115f7565b14610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490614023565b60405180910390fd5b600f543414610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d989061408f565b60405180910390fd5b600e54811115610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90614121565b60405180910390fd5b610df0600d61248f565b610dfa33826124a5565b62278d0042610e099190613ea9565b601160008381526020019081526020016000208190555050565b6000600980549050905090565b610e386123c0565b73ffffffffffffffffffffffffffffffffffffffff16610e5661195c565b73ffffffffffffffffffffffffffffffffffffffff1614610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea39061418d565b60405180910390fd5b60006001610eba600d612481565b610ec49190613ea9565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d906141f9565b60405180910390fd5b600e54811115610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290614121565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ffa576000610fb9836115f7565b14610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff090614023565b60405180910390fd5b5b611004600d61248f565b61100e82826124a5565b62278d004261101d9190613ea9565b60116000838152602001908152602001600020819055505050565b8161104161195c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461110e57601060019054906101000a900460ff166110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b99061428b565b60405180910390fd5b60006110cd826115f7565b1461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110490614023565b60405180910390fd5b5b61111f6111196123c0565b836124c3565b61115e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111559061431d565b60405180910390fd5b426011600084815260200190815260200160002054116111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614389565b60405180910390fd5b6111be8484846125a1565b50505050565b60006111cf836115f7565b8210611210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112079061441b565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6112716123c0565b73ffffffffffffffffffffffffffffffffffffffff1661128f61195c565b73ffffffffffffffffffffffffffffffffffffffff16146112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc9061418d565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b61132c83838360405180602001604052806000815250611c00565b505050565b600061133b610e23565b821061137c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611373906144ad565b60405180910390fd5b600982815481106113905761138f6144cd565b5b90600052602060002001549050919050565b601060009054906101000a900460ff1681565b6113bd6123c0565b73ffffffffffffffffffffffffffffffffffffffff166113db61195c565b73ffffffffffffffffffffffffffffffffffffffff1614611431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114289061418d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611477573d6000803e3d6000fd5b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a9061456e565b60405180910390fd5b80915050919050565b6115346123c0565b73ffffffffffffffffffffffffffffffffffffffff1661155261195c565b73ffffffffffffffffffffffffffffffffffffffff16146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f9061418d565b60405180910390fd5b80600f5414156115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e4906145da565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f9061466c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116b76123c0565b73ffffffffffffffffffffffffffffffffffffffff166116d561195c565b73ffffffffffffffffffffffffffffffffffffffff161461172b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117229061418d565b60405180910390fd5b61173560006127fd565b565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613f4b565b60405180910390fd5b600f5434146117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e0906146d8565b60405180910390fd5b6117f281612354565b611831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182890613bd7565b60405180910390fd5b6000601160008381526020019081526020016000205490508042111561187c5762278d00426118609190613ea9565b60116000848152602001908152602001600020819055506118aa565b62278d006011600084815260200190815260200160002060008282546118a29190613ea9565b925050819055505b5050565b6118b66123c0565b73ffffffffffffffffffffffffffffffffffffffff166118d461195c565b73ffffffffffffffffffffffffffffffffffffffff161461192a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119219061418d565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600f5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61198d6123c0565b73ffffffffffffffffffffffffffffffffffffffff166119ab61195c565b73ffffffffffffffffffffffffffffffffffffffff1614611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f89061418d565b60405180910390fd5b8181600c9190611a12929190613438565b505050565b606060028054611a2690613c92565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5290613c92565b8015611a9f5780601f10611a7457610100808354040283529160200191611a9f565b820191906000526020600020905b815481529060010190602001808311611a8257829003601f168201915b5050505050905090565b611abb611ab46123c0565b83836128c1565b5050565b611ac76123c0565b73ffffffffffffffffffffffffffffffffffffffff16611ae561195c565b73ffffffffffffffffffffffffffffffffffffffff1614611b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b329061418d565b60405180910390fd5b611b4481612354565b611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a90613bd7565b60405180910390fd5b60006011600083815260200190815260200160002054905080421115611bce57624f1a0042611bb29190613ea9565b6011600084815260200190815260200160002081905550611bfc565b624f1a00601160008481526020019081526020016000206000828254611bf49190613ea9565b925050819055505b5050565b82611c0961195c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd657601060019054906101000a900460ff16611c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c819061428b565b60405180910390fd5b6000611c95826115f7565b14611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90614023565b60405180910390fd5b5b611ce7611ce16123c0565b846124c3565b611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d9061431d565b60405180910390fd5b42601160008581526020019081526020016000205411611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7290614389565b60405180910390fd5b611d8785858585612a2e565b5050505050565b611d966123c0565b73ffffffffffffffffffffffffffffffffffffffff16611db461195c565b73ffffffffffffffffffffffffffffffffffffffff1614611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e019061418d565b60405180910390fd5b611e12610e23565b81600e54611e2091906146f8565b1015611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e589061479e565b60405180910390fd5b80600e6000828254611e7391906146f8565b9250508190555050565b60116020528060005260406000206000915090505481565b601060019054906101000a900460ff1681565b611eb06123c0565b73ffffffffffffffffffffffffffffffffffffffff16611ece61195c565b73ffffffffffffffffffffffffffffffffffffffff1614611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b9061418d565b60405180910390fd5b80600e6000828254611f369190613ea9565b9250508190555050565b6060611f4b82612354565b611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8190613bd7565b60405180910390fd5b600b611f9583612a8a565b604051602001611fa692919061488e565b6040516020818303038152906040529050919050565b600e5481565b611fca6123c0565b73ffffffffffffffffffffffffffffffffffffffff16611fe861195c565b73ffffffffffffffffffffffffffffffffffffffff161461203e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120359061418d565b60405180910390fd5b8181600b919061204f929190613438565b505050565b6060600c805461206390613c92565b80601f016020809104026020016040519081016040528092919081815260200182805461208f90613c92565b80156120dc5780601f106120b1576101008083540402835291602001916120dc565b820191906000526020600020905b8154815290600101906020018083116120bf57829003601f168201915b5050505050905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121826123c0565b73ffffffffffffffffffffffffffffffffffffffff166121a061195c565b73ffffffffffffffffffffffffffffffffffffffff16146121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed9061418d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d90614924565b60405180910390fd5b61226f816127fd565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061233d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061234d575061234c82612beb565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661243b8361147a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6124bf828260405180602001604052806000815250612c55565b5050565b60006124ce82612354565b61250d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612504906149b6565b60405180910390fd5b60006125188361147a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061258757508373ffffffffffffffffffffffffffffffffffffffff1661256f84610a9e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612598575061259781856120e6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125c18261147a565b73ffffffffffffffffffffffffffffffffffffffff1614612617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e90614a48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e90614ada565b60405180910390fd5b612692838383612cb0565b61269d6000826123c8565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ed91906146f8565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127449190613ea9565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292790614b46565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a21919061358f565b60405180910390a3505050565b612a398484846125a1565b612a4584848484612dc4565b612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b90614bd8565b60405180910390fd5b50505050565b60606000821415612ad2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be6565b600082905060005b60008214612b04578080612aed90614bf8565b915050600a82612afd9190614c70565b9150612ada565b60008167ffffffffffffffff811115612b2057612b1f61399d565b5b6040519080825280601f01601f191660200182016040528015612b525781602001600182028036833780820191505090505b5090505b60008514612bdf57600182612b6b91906146f8565b9150600a85612b7a9190614ca1565b6030612b869190613ea9565b60f81b818381518110612b9c57612b9b6144cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bd89190614c70565b9450612b56565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c5f8383612f4c565b612c6c6000848484612dc4565b612cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca290614bd8565b60405180910390fd5b505050565b612cbb83838361311a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cfe57612cf98161311f565b612d3d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612d3c57612d3b8382613168565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d8057612d7b816132d5565b612dbf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612dbe57612dbd82826133a6565b5b5b505050565b6000612de58473ffffffffffffffffffffffffffffffffffffffff16613425565b15612f3f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e0e6123c0565b8786866040518563ffffffff1660e01b8152600401612e309493929190614d27565b6020604051808303816000875af1925050508015612e6c57506040513d601f19601f82011682018060405250810190612e699190614d88565b60015b612eef573d8060008114612e9c576040519150601f19603f3d011682016040523d82523d6000602084013e612ea1565b606091505b50600081511415612ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ede90614bd8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f44565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb390614e01565b60405180910390fd5b612fc581612354565b15613005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffc90614e6d565b60405180910390fd5b61301160008383612cb0565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130619190613ea9565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613175846115f7565b61317f91906146f8565b9050600060086000848152602001908152602001600020549050818114613264576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506132e991906146f8565b90506000600a6000848152602001908152602001600020549050600060098381548110613319576133186144cd565b5b90600052602060002001549050806009838154811061333b5761333a6144cd565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061338a57613389614e8d565b5b6001900381819060005260206000200160009055905550505050565b60006133b1836115f7565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461344490613c92565b90600052602060002090601f01602090048101928261346657600085556134ad565b82601f1061347f57803560ff19168380011785556134ad565b828001600101855582156134ad579182015b828111156134ac578235825591602001919060010190613491565b5b5090506134ba91906134be565b5090565b5b808211156134d75760008160009055506001016134bf565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613524816134ef565b811461352f57600080fd5b50565b6000813590506135418161351b565b92915050565b60006020828403121561355d5761355c6134e5565b5b600061356b84828501613532565b91505092915050565b60008115159050919050565b61358981613574565b82525050565b60006020820190506135a46000830184613580565b92915050565b6000819050919050565b6135bd816135aa565b81146135c857600080fd5b50565b6000813590506135da816135b4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061360b826135e0565b9050919050565b61361b81613600565b811461362657600080fd5b50565b60008135905061363881613612565b92915050565b60008060408385031215613655576136546134e5565b5b6000613663858286016135cb565b925050602061367485828601613629565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136b857808201518184015260208101905061369d565b838111156136c7576000848401525b50505050565b6000601f19601f8301169050919050565b60006136e98261367e565b6136f38185613689565b935061370381856020860161369a565b61370c816136cd565b840191505092915050565b6000602082019050818103600083015261373181846136de565b905092915050565b60006020828403121561374f5761374e6134e5565b5b600061375d848285016135cb565b91505092915050565b61376f81613600565b82525050565b600060208201905061378a6000830184613766565b92915050565b600080604083850312156137a7576137a66134e5565b5b60006137b585828601613629565b92505060206137c6858286016135cb565b9150509250929050565b6137d9816135aa565b82525050565b60006020820190506137f460008301846137d0565b92915050565b6000602082840312156138105761380f6134e5565b5b600061381e84828501613629565b91505092915050565b6000806000606084860312156138405761383f6134e5565b5b600061384e86828701613629565b935050602061385f86828701613629565b9250506040613870868287016135cb565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261389f5761389e61387a565b5b8235905067ffffffffffffffff8111156138bc576138bb61387f565b5b6020830191508360018202830111156138d8576138d7613884565b5b9250929050565b600080602083850312156138f6576138f56134e5565b5b600083013567ffffffffffffffff811115613914576139136134ea565b5b61392085828601613889565b92509250509250929050565b61393581613574565b811461394057600080fd5b50565b6000813590506139528161392c565b92915050565b6000806040838503121561396f5761396e6134e5565b5b600061397d85828601613629565b925050602061398e85828601613943565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139d5826136cd565b810181811067ffffffffffffffff821117156139f4576139f361399d565b5b80604052505050565b6000613a076134db565b9050613a1382826139cc565b919050565b600067ffffffffffffffff821115613a3357613a3261399d565b5b613a3c826136cd565b9050602081019050919050565b82818337600083830152505050565b6000613a6b613a6684613a18565b6139fd565b905082815260208101848484011115613a8757613a86613998565b5b613a92848285613a49565b509392505050565b600082601f830112613aaf57613aae61387a565b5b8135613abf848260208601613a58565b91505092915050565b60008060008060808587031215613ae257613ae16134e5565b5b6000613af087828801613629565b9450506020613b0187828801613629565b9350506040613b12878288016135cb565b925050606085013567ffffffffffffffff811115613b3357613b326134ea565b5b613b3f87828801613a9a565b91505092959194509250565b60008060408385031215613b6257613b616134e5565b5b6000613b7085828601613629565b9250506020613b8185828601613629565b9150509250929050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b6000613bc1601583613689565b9150613bcc82613b8b565b602082019050919050565b60006020820190508181036000830152613bf081613bb4565b9050919050565b7f546f6b656e2068617320657870697265642e20506c656173652072656e657721600082015250565b6000613c2d602083613689565b9150613c3882613bf7565b602082019050919050565b60006020820190508181036000830152613c5c81613c20565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613caa57607f821691505b60208210811415613cbe57613cbd613c63565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613d20602c83613689565b9150613d2b82613cc4565b604082019050919050565b60006020820190508181036000830152613d4f81613d13565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613db2602183613689565b9150613dbd82613d56565b604082019050919050565b60006020820190508181036000830152613de181613da5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613e44603883613689565b9150613e4f82613de8565b604082019050919050565b60006020820190508181036000830152613e7381613e37565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613eb4826135aa565b9150613ebf836135aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ef457613ef3613e7a565b5b828201905092915050565b7f43616c6c6572206d757374206e6f74206265206120636f6e74726163742e0000600082015250565b6000613f35601e83613689565b9150613f4082613eff565b602082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f53616c6520686173206e6f7420737461727465642e0000000000000000000000600082015250565b6000613fa1601583613689565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b7f5573657220616c726561647920686f6c6473206120746f6b656e2e0000000000600082015250565b600061400d601b83613689565b915061401882613fd7565b602082019050919050565b6000602082019050818103600083015261403c81614000565b9050919050565b7f496e636f727265637420457468657220616d6f756e742073656e742e00000000600082015250565b6000614079601c83613689565b915061408482614043565b602082019050919050565b600060208201905081810360008301526140a88161406c565b9050919050565b7f4d696e74656420746f6b656e20776f756c642065786365656420746f74616c2060008201527f737570706c792e00000000000000000000000000000000000000000000000000602082015250565b600061410b602783613689565b9150614116826140af565b604082019050919050565b6000602082019050818103600083015261413a816140fe565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614177602083613689565b915061418282614141565b602082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b7f52656365697665722063616e6e6f74206265207a65726f20616464726573732e600082015250565b60006141e3602083613689565b91506141ee826141ad565b602082019050919050565b60006020820190508181036000830152614212816141d6565b9050919050565b7f546f6b656e207472616e7366657273206172652063757272656e746c7920646960008201527f7361626c65642e00000000000000000000000000000000000000000000000000602082015250565b6000614275602783613689565b915061428082614219565b604082019050919050565b600060208201905081810360008301526142a481614268565b9050919050565b7f5472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665642e00000000000000000000000000000000000000000000602082015250565b6000614307602a83613689565b9150614312826142ab565b604082019050919050565b60006020820190508181036000830152614336816142fa565b9050919050565b7f546f6b656e2068617320657870697265642e0000000000000000000000000000600082015250565b6000614373601283613689565b915061437e8261433d565b602082019050919050565b600060208201905081810360008301526143a281614366565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614405602b83613689565b9150614410826143a9565b604082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614497602c83613689565b91506144a28261443b565b604082019050919050565b600060208201905081810360008301526144c68161448a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614558602983613689565b9150614563826144fc565b604082019050919050565b600060208201905081810360008301526145878161454b565b9050919050565b7f507269636520686173206e6f74206368616e6765642e00000000000000000000600082015250565b60006145c4601683613689565b91506145cf8261458e565b602082019050919050565b600060208201905081810360008301526145f3816145b7565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614656602a83613689565b9150614661826145fa565b604082019050919050565b6000602082019050818103600083015261468581614649565b9050919050565b7f496e636f727265637420457468657220616d6f756e742e000000000000000000600082015250565b60006146c2601783613689565b91506146cd8261468c565b602082019050919050565b600060208201905081810360008301526146f1816146b5565b9050919050565b6000614703826135aa565b915061470e836135aa565b92508282101561472157614720613e7a565b5b828203905092915050565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b6000614788602783613689565b91506147938261472c565b604082019050919050565b600060208201905081810360008301526147b78161477b565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546147eb81613c92565b6147f581866147be565b94506001821660008114614810576001811461482157614854565b60ff19831686528186019350614854565b61482a856147c9565b60005b8381101561484c5781548189015260018201915060208101905061482d565b838801955050505b50505092915050565b60006148688261367e565b61487281856147be565b935061488281856020860161369a565b80840191505092915050565b600061489a82856147de565b91506148a6828461485d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061490e602683613689565b9150614919826148b2565b604082019050919050565b6000602082019050818103600083015261493d81614901565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006149a0602c83613689565b91506149ab82614944565b604082019050919050565b600060208201905081810360008301526149cf81614993565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614a32602983613689565b9150614a3d826149d6565b604082019050919050565b60006020820190508181036000830152614a6181614a25565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614ac4602483613689565b9150614acf82614a68565b604082019050919050565b60006020820190508181036000830152614af381614ab7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614b30601983613689565b9150614b3b82614afa565b602082019050919050565b60006020820190508181036000830152614b5f81614b23565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614bc2603283613689565b9150614bcd82614b66565b604082019050919050565b60006020820190508181036000830152614bf181614bb5565b9050919050565b6000614c03826135aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c3657614c35613e7a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c7b826135aa565b9150614c86836135aa565b925082614c9657614c95614c41565b5b828204905092915050565b6000614cac826135aa565b9150614cb7836135aa565b925082614cc757614cc6614c41565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614cf982614cd2565b614d038185614cdd565b9350614d1381856020860161369a565b614d1c816136cd565b840191505092915050565b6000608082019050614d3c6000830187613766565b614d496020830186613766565b614d5660408301856137d0565b8181036060830152614d688184614cee565b905095945050505050565b600081519050614d828161351b565b92915050565b600060208284031215614d9e57614d9d6134e5565b5b6000614dac84828501614d73565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614deb602083613689565b9150614df682614db5565b602082019050919050565b60006020820190508181036000830152614e1a81614dde565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614e57601c83613689565b9150614e6282614e21565b602082019050919050565b60006020820190508181036000830152614e8681614e4a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122032bcae995d63d8445eb9964060ec25592b991fd0317ad1f8a731185b746bfafb64736f6c634300080b0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : tokenURI_ (string):
Arg [1] : contractURI_ (string):

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

1662:9724:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1019:224:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6798:308:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2486:100:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4045:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3568:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2809:619:1;;;:::i;:::-;;1659:113:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4883:569:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11012:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1327:256:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9968:99:1;;;;;;;;;;;;;:::i;:::-;;5205:185:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1849:233:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1981:31:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9501:105;;;;;;;;;;;;;:::i;:::-;;2180:239:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6305:198:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1910:208:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1714:103:12;;;;;;;;;;;;;:::i;:::-;;3590:519:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9743:84;;;;;;;;;;;;;:::i;:::-;;1938:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1063:87:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9244:119:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2655:104:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4338:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4282:381:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10415:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7731:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2064:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2019:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7368:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8213:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1904:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8663:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8933:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4564:164:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1972:201:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1019:224:6;1121:4;1160:35;1145:50;;;:11;:50;;;;:90;;;;1199:36;1223:11;1199:23;:36::i;:::-;1145:90;1138:97;;1019:224;;;:::o;6798:308:1:-;6875:4;6900:17;6908:8;6900:7;:17::i;:::-;6892:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;6985:15;6962:10;:20;6973:8;6962:20;;;;;;;;;;;;:38;6954:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;7066:17;7074:8;7066:7;:17::i;:::-;7057:26;;:5;:26;;;:41;;7093:5;7057:41;;;7086:4;7057:41;7050:48;;6798:308;;;;:::o;2486:100:5:-;2540:13;2573:5;2566:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2486:100;:::o;4045:221::-;4121:7;4149:16;4157:7;4149;:16::i;:::-;4141:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4234:15;:24;4250:7;4234:24;;;;;;;;;;;;;;;;;;;;;4227:31;;4045:221;;;:::o;3568:411::-;3649:13;3665:23;3680:7;3665:14;:23::i;:::-;3649:39;;3713:5;3707:11;;:2;:11;;;;3699:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3807:5;3791:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3816:37;3833:5;3840:12;:10;:12::i;:::-;3816:16;:37::i;:::-;3791:62;3769:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3950:21;3959:2;3963:7;3950:8;:21::i;:::-;3638:341;3568:411;;:::o;2809:619:1:-;2853:15;2899:1;2871:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;2853:47;;2934:10;2921:23;;:9;:23;;;2913:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2998:11;;;;;;;;;;;2990:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;3079:1;3054:21;3064:10;3054:9;:21::i;:::-;:26;3046:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3144:10;;3131:9;:23;3123:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;3220:9;;3206:10;:23;;3198:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3286:27;:15;:25;:27::i;:::-;3326:33;3336:10;3348;3326:9;:33::i;:::-;3413:7;3395:15;:25;;;;:::i;:::-;3370:10;:22;3381:10;3370:22;;;;;;;;;;;:50;;;;2840:588;2809:619::o;1659:113:6:-;1720:7;1747:10;:17;;;;1740:24;;1659:113;:::o;4883:569:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4951:15:1::1;4997:1;4969:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;4951:47;;5040:1;5019:23;;:9;:23;;;;5011:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5112:9;;5098:10;:23;;5090:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;5196:9;5182:23;;:10;:23;;;5178:121;;5254:1;5230:20;5240:9;5230;:20::i;:::-;:25;5222:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:121;5311:27;:15;:25;:27::i;:::-;5351:32;5361:9;5372:10;5351:9;:32::i;:::-;5437:7;5419:15;:25;;;;:::i;:::-;5394:10;:22;5405:10;5394:22;;;;;;;;;;;:50;;;;4938:514;4883:569:::0;:::o;11012:369::-;11144:2;2534:7;:5;:7::i;:::-;2520:21;;:10;:21;;;2516:195;;2566:16;;;;;;;;;;;2558:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2666:1;2649:13;2659:2;2649:9;:13::i;:::-;:18;2641:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2516:195;11167:41:::1;11186:12;:10;:12::i;:::-;11200:7;11167:18;:41::i;:::-;11159:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;11296:15;11274:10;:19;11285:7;11274:19;;;;;;;;;;;;:37;11266:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11345:28;11355:4;11361:2;11365:7;11345:9;:28::i;:::-;11012:369:::0;;;;:::o;1327:256:6:-;1424:7;1460:23;1477:5;1460:16;:23::i;:::-;1452:5;:31;1444:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1549:12;:19;1562:5;1549:19;;;;;;;;;;;;;;;:26;1569:5;1549:26;;;;;;;;;;;;1542:33;;1327:256;;;;:::o;9968:99:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10043:16:1::1;;;;;;;;;;;10042:17;10023:16;;:36;;;;;;;;;;;;;;;;;;9968:99::o:0;5205:185:5:-;5343:39;5360:4;5366:2;5370:7;5343:39;;;;;;;;;;;;:16;:39::i;:::-;5205:185;;;:::o;1849:233:6:-;1924:7;1960:30;:28;:30::i;:::-;1952:5;:38;1944:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2057:10;2068:5;2057:17;;;;;;;;:::i;:::-;;;;;;;;;;2050:24;;1849:233;;;:::o;1981:31:1:-;;;;;;;;;;;;;:::o;9501:105::-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9558:10:1::1;9550:28;;:51;9579:21;9550:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;9501:105::o:0;2180:239:5:-;2252:7;2272:13;2288:7;:16;2296:7;2288:16;;;;;;;;;;;;;;;;;;;;;2272:32;;2340:1;2323:19;;:5;:19;;;;2315:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2406:5;2399:12;;;2180:239;;;:::o;6305:198:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6408:18:1::1;6394:10;;:32;;6386:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6477:18;6464:10;:31;;;;6305:198:::0;:::o;1910:208:5:-;1982:7;2027:1;2010:19;;:5;:19;;;;2002:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2094:9;:16;2104:5;2094:16;;;;;;;;;;;;;;;;2087:23;;1910:208;;;:::o;1714:103:12:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;3590:519:1:-;3672:10;3659:23;;:9;:23;;;3651:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3749:10;;3736:9;:23;3728:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;3806:17;3814:8;3806:7;:17::i;:::-;3798:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;3862:23;3888:10;:20;3899:8;3888:20;;;;;;;;;;;;3862:46;;3943:18;3925:15;:36;3921:181;;;4019:7;4001:15;:25;;;;:::i;:::-;3978:10;:20;3989:8;3978:20;;;;;;;;;;;:48;;;;3921:181;;;4083:7;4059:10;:20;4070:8;4059:20;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;3921:181;3640:469;3590:519;:::o;9743:84::-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9808:11:1::1;;;;;;;;;;;9807:12;9793:11;;:26;;;;;;;;;;;;;;;;;;9743:84::o:0;1938:36::-;;;;:::o;1063:87:12:-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;9244:119:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9343:12:1::1;;9328;:27;;;;;;;:::i;:::-;;9244:119:::0;;:::o;2655:104:5:-;2711:13;2744:7;2737:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2655:104;:::o;4338:155::-;4433:52;4452:12;:10;:12::i;:::-;4466:8;4476;4433:18;:52::i;:::-;4338:155;;:::o;4282:381:1:-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4360:17:1::1;4368:8;4360:7;:17::i;:::-;4352:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;4416:23;4442:10;:20;4453:8;4442:20;;;;;;;;;;;;4416:46;;4497:18;4479:15;:36;4475:181;;;4573:7;4555:15;:25;;;;:::i;:::-;4532:10;:20;4543:8;4532:20;;;;;;;;;;;:48;;;;4475:181;;;4637:7;4613:10;:20;4624:8;4613:20;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;4475:181;4341:322;4282:381:::0;:::o;10415:413::-;10580:2;2534:7;:5;:7::i;:::-;2520:21;;:10;:21;;;2516:195;;2566:16;;;;;;;;;;;2558:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2666:1;2649:13;2659:2;2649:9;:13::i;:::-;:18;2641:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2516:195;10603:41:::1;10622:12;:10;:12::i;:::-;10636:7;10603:18;:41::i;:::-;10595:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;10732:15;10710:10;:19;10721:7;10710:19;;;;;;;;;;;;:37;10702:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10781:39;10795:4;10801:2;10805:7;10814:5;10781:13;:39::i;:::-;10415:413:::0;;;;;:::o;7731:202::-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7834:13:1::1;:11;:13::i;:::-;7820:10;7808:9;;:22;;;;:::i;:::-;:39;;7800:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;7915:10;7902:9;;:23;;;;;;;:::i;:::-;;;;;;;;7731:202:::0;:::o;2064:39::-;;;;;;;;;;;;;;;;;:::o;2019:36::-;;;;;;;;;;;;;:::o;7368:97::-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7447:10:1::1;7434:9;;:23;;;;;;;:::i;:::-;;;;;;;;7368:97:::0;:::o;8213:222::-;8276:13;8310:17;8318:8;8310:7;:17::i;:::-;8302:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;8395:9;8406:19;:8;:17;:19::i;:::-;8378:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8364:63;;8213:222;;;:::o;1904:27::-;;;;:::o;8663:107::-;1294:12:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8753:9:1::1;;8741;:21;;;;;;;:::i;:::-;;8663:107:::0;;:::o;8933:97::-;8977:13;9010:12;9003:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8933:97;:::o;4564:164:5:-;4661:4;4685:18;:25;4704:5;4685:25;;;;;;;;;;;;;;;:35;4711:8;4685:35;;;;;;;;;;;;;;;;;;;;;;;;;4678:42;;4564:164;;;;:::o;1972:201:12:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;;;2053:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;1541:305:5:-;1643:4;1695:25;1680:40;;;:11;:40;;;;:105;;;;1752:33;1737:48;;;:11;:48;;;;1680:105;:158;;;;1802:36;1826:11;1802:23;:36::i;:::-;1680:158;1660:178;;1541:305;;;:::o;7299:127::-;7364:4;7416:1;7388:30;;:7;:16;7396:7;7388:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7381:37;;7299:127;;;:::o;656:98:2:-;709:7;736:10;729:17;;656:98;:::o;11281:174:5:-;11383:2;11356:15;:24;11372:7;11356:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11439:7;11435:2;11401:46;;11410:23;11425:7;11410:14;:23::i;:::-;11401:46;;;;;;;;;;;;11281:174;;:::o;848:114:3:-;913:7;940;:14;;;933:21;;848:114;;;:::o;970:127::-;1077:1;1059:7;:14;;;:19;;;;;;;;;;;970:127;:::o;8283:110:5:-;8359:26;8369:2;8373:7;8359:26;;;;;;;;;;;;:9;:26::i;:::-;8283:110;;:::o;7593:348::-;7686:4;7711:16;7719:7;7711;:16::i;:::-;7703:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7787:13;7803:23;7818:7;7803:14;:23::i;:::-;7787:39;;7856:5;7845:16;;:7;:16;;;:51;;;;7889:7;7865:31;;:20;7877:7;7865:11;:20::i;:::-;:31;;;7845:51;:87;;;;7900:32;7917:5;7924:7;7900:16;:32::i;:::-;7845:87;7837:96;;;7593:348;;;;:::o;10585:578::-;10744:4;10717:31;;:23;10732:7;10717:14;:23::i;:::-;:31;;;10709:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10827:1;10813:16;;:2;:16;;;;10805:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10883:39;10904:4;10910:2;10914:7;10883:20;:39::i;:::-;10987:29;11004:1;11008:7;10987:8;:29::i;:::-;11048:1;11029:9;:15;11039:4;11029:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11077:1;11060:9;:13;11070:2;11060:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11108:2;11089:7;:16;11097:7;11089:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11147:7;11143:2;11128:27;;11137:4;11128:27;;;;;;;;;;;;10585:578;;;:::o;2333:191:12:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;11597:315:5:-;11752:8;11743:17;;:5;:17;;;;11735:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11839:8;11801:18;:25;11820:5;11801:25;;;;;;;;;;;;;;;:35;11827:8;11801:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11885:8;11863:41;;11878:5;11863:41;;;11895:8;11863:41;;;;;;:::i;:::-;;;;;;;;11597:315;;;:::o;6671:::-;6828:28;6838:4;6844:2;6848:7;6828:9;:28::i;:::-;6875:48;6898:4;6904:2;6908:7;6917:5;6875:22;:48::i;:::-;6867:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6671:315;;;;:::o;342:723:13:-;398:13;628:1;619:5;:10;615:53;;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;854:157:4:-;939:4;978:25;963:40;;;:11;:40;;;;956:47;;854:157;;;:::o;8620:321:5:-;8750:18;8756:2;8760:7;8750:5;:18::i;:::-;8801:54;8832:1;8836:2;8840:7;8849:5;8801:22;:54::i;:::-;8779:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8620:321;;;:::o;2695:589:6:-;2839:45;2866:4;2872:2;2876:7;2839:26;:45::i;:::-;2917:1;2901:18;;:4;:18;;;2897:187;;;2936:40;2968:7;2936:31;:40::i;:::-;2897:187;;;3006:2;2998:10;;:4;:10;;;2994:90;;3025:47;3058:4;3064:7;3025:32;:47::i;:::-;2994:90;2897:187;3112:1;3098:16;;:2;:16;;;3094:183;;;3131:45;3168:7;3131:36;:45::i;:::-;3094:183;;;3204:4;3198:10;;:2;:10;;;3194:83;;3225:40;3253:2;3257:7;3225:27;:40::i;:::-;3194:83;3094:183;2695:589;;;:::o;12477:799:5:-;12632:4;12653:15;:2;:13;;;:15::i;:::-;12649:620;;;12705:2;12689:36;;;12726:12;:10;:12::i;:::-;12740:4;12746:7;12755:5;12689:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12685:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12948:1;12931:6;:13;:18;12927:272;;;12974:60;;;;;;;;;;:::i;:::-;;;;;;;;12927:272;13149:6;13143:13;13134:6;13130:2;13126:15;13119:38;12685:529;12822:41;;;12812:51;;;:6;:51;;;;12805:58;;;;;12649:620;13253:4;13246:11;;12477:799;;;;;;;:::o;9277:382::-;9371:1;9357:16;;:2;:16;;;;9349:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9430:16;9438:7;9430;:16::i;:::-;9429:17;9421:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9492:45;9521:1;9525:2;9529:7;9492:20;:45::i;:::-;9567:1;9550:9;:13;9560:2;9550:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9598:2;9579:7;:16;9587:7;9579:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9643:7;9639:2;9618:33;;9635:1;9618:33;;;;;;;;;;;;9277:382;;:::o;13848:126::-;;;;:::o;4007:164:6:-;4111:10;:17;;;;4084:15;:24;4100:7;4084:24;;;;;;;;;;;:44;;;;4139:10;4155:7;4139:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4007:164;:::o;4798:988::-;5064:22;5114:1;5089:22;5106:4;5089:16;:22::i;:::-;:26;;;;:::i;:::-;5064:51;;5126:18;5147:17;:26;5165:7;5147:26;;;;;;;;;;;;5126:47;;5294:14;5280:10;:28;5276:328;;5325:19;5347:12;:18;5360:4;5347:18;;;;;;;;;;;;;;;:34;5366:14;5347:34;;;;;;;;;;;;5325:56;;5431:11;5398:12;:18;5411:4;5398:18;;;;;;;;;;;;;;;:30;5417:10;5398:30;;;;;;;;;;;:44;;;;5548:10;5515:17;:30;5533:11;5515:30;;;;;;;;;;;:43;;;;5310:294;5276:328;5700:17;:26;5718:7;5700:26;;;;;;;;;;;5693:33;;;5744:12;:18;5757:4;5744:18;;;;;;;;;;;;;;;:34;5763:14;5744:34;;;;;;;;;;;5737:41;;;4879:907;;4798:988;;:::o;6081:1079::-;6334:22;6379:1;6359:10;:17;;;;:21;;;;:::i;:::-;6334:46;;6391:18;6412:15;:24;6428:7;6412:24;;;;;;;;;;;;6391:45;;6763:19;6785:10;6796:14;6785:26;;;;;;;;:::i;:::-;;;;;;;;;;6763:48;;6849:11;6824:10;6835;6824:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6960:10;6929:15;:28;6945:11;6929:28;;;;;;;;;;;:41;;;;7101:15;:24;7117:7;7101:24;;;;;;;;;;;7094:31;;;7136:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6152:1008;;;6081:1079;:::o;3585:221::-;3670:14;3687:20;3704:2;3687:16;:20::i;:::-;3670:37;;3745:7;3718:12;:16;3731:2;3718:16;;;;;;;;;;;;;;;:24;3735:6;3718:24;;;;;;;;;;;:34;;;;3792:6;3763:17;:26;3781:7;3763:26;;;;;;;;;;;:35;;;;3659:147;3585:221;;:::o;797:387:0:-;857:4;1065:12;1132:7;1120:20;1112:28;;1175:1;1168:4;:8;1161:15;;;797:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:126::-;1911:7;1951:42;1944:5;1940:54;1929:65;;1874:126;;;:::o;2006:96::-;2043:7;2072:24;2090:5;2072:24;:::i;:::-;2061:35;;2006:96;;;:::o;2108:122::-;2181:24;2199:5;2181:24;:::i;:::-;2174:5;2171:35;2161:63;;2220:1;2217;2210:12;2161:63;2108:122;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2236:139;;;;:::o;2381:474::-;2449:6;2457;2506:2;2494:9;2485:7;2481:23;2477:32;2474:119;;;2512:79;;:::i;:::-;2474:119;2632:1;2657:53;2702:7;2693:6;2682:9;2678:22;2657:53;:::i;:::-;2647:63;;2603:117;2759:2;2785:53;2830:7;2821:6;2810:9;2806:22;2785:53;:::i;:::-;2775:63;;2730:118;2381:474;;;;;:::o;2861:99::-;2913:6;2947:5;2941:12;2931:22;;2861:99;;;:::o;2966:169::-;3050:11;3084:6;3079:3;3072:19;3124:4;3119:3;3115:14;3100:29;;2966:169;;;;:::o;3141:307::-;3209:1;3219:113;3233:6;3230:1;3227:13;3219:113;;;3318:1;3313:3;3309:11;3303:18;3299:1;3294:3;3290:11;3283:39;3255:2;3252:1;3248:10;3243:15;;3219:113;;;3350:6;3347:1;3344:13;3341:101;;;3430:1;3421:6;3416:3;3412:16;3405:27;3341:101;3190:258;3141:307;;;:::o;3454:102::-;3495:6;3546:2;3542:7;3537:2;3530:5;3526:14;3522:28;3512:38;;3454:102;;;:::o;3562:364::-;3650:3;3678:39;3711:5;3678:39;:::i;:::-;3733:71;3797:6;3792:3;3733:71;:::i;:::-;3726:78;;3813:52;3858:6;3853:3;3846:4;3839:5;3835:16;3813:52;:::i;:::-;3890:29;3912:6;3890:29;:::i;:::-;3885:3;3881:39;3874:46;;3654:272;3562:364;;;;:::o;3932:313::-;4045:4;4083:2;4072:9;4068:18;4060:26;;4132:9;4126:4;4122:20;4118:1;4107:9;4103:17;4096:47;4160:78;4233:4;4224:6;4160:78;:::i;:::-;4152:86;;3932:313;;;;:::o;4251:329::-;4310:6;4359:2;4347:9;4338:7;4334:23;4330:32;4327:119;;;4365:79;;:::i;:::-;4327:119;4485:1;4510:53;4555:7;4546:6;4535:9;4531:22;4510:53;:::i;:::-;4500:63;;4456:117;4251:329;;;;:::o;4586:118::-;4673:24;4691:5;4673:24;:::i;:::-;4668:3;4661:37;4586:118;;:::o;4710:222::-;4803:4;4841:2;4830:9;4826:18;4818:26;;4854:71;4922:1;4911:9;4907:17;4898:6;4854:71;:::i;:::-;4710:222;;;;:::o;4938:474::-;5006:6;5014;5063:2;5051:9;5042:7;5038:23;5034:32;5031:119;;;5069:79;;:::i;:::-;5031:119;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;4938:474;;;;;:::o;5418:118::-;5505:24;5523:5;5505:24;:::i;:::-;5500:3;5493:37;5418:118;;:::o;5542:222::-;5635:4;5673:2;5662:9;5658:18;5650:26;;5686:71;5754:1;5743:9;5739:17;5730:6;5686:71;:::i;:::-;5542:222;;;;:::o;5770:329::-;5829:6;5878:2;5866:9;5857:7;5853:23;5849:32;5846:119;;;5884:79;;:::i;:::-;5846:119;6004:1;6029:53;6074:7;6065:6;6054:9;6050:22;6029:53;:::i;:::-;6019:63;;5975:117;5770:329;;;;:::o;6105:619::-;6182:6;6190;6198;6247:2;6235:9;6226:7;6222:23;6218:32;6215:119;;;6253:79;;:::i;:::-;6215:119;6373:1;6398:53;6443:7;6434:6;6423:9;6419:22;6398:53;:::i;:::-;6388:63;;6344:117;6500:2;6526:53;6571:7;6562:6;6551:9;6547:22;6526:53;:::i;:::-;6516:63;;6471:118;6628:2;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6599:118;6105:619;;;;;:::o;6730:117::-;6839:1;6836;6829:12;6853:117;6962:1;6959;6952:12;6976:117;7085:1;7082;7075:12;7113:553;7171:8;7181:6;7231:3;7224:4;7216:6;7212:17;7208:27;7198:122;;7239:79;;:::i;:::-;7198:122;7352:6;7339:20;7329:30;;7382:18;7374:6;7371:30;7368:117;;;7404:79;;:::i;:::-;7368:117;7518:4;7510:6;7506:17;7494:29;;7572:3;7564:4;7556:6;7552:17;7542:8;7538:32;7535:41;7532:128;;;7579:79;;:::i;:::-;7532:128;7113:553;;;;;:::o;7672:529::-;7743:6;7751;7800:2;7788:9;7779:7;7775:23;7771:32;7768:119;;;7806:79;;:::i;:::-;7768:119;7954:1;7943:9;7939:17;7926:31;7984:18;7976:6;7973:30;7970:117;;;8006:79;;:::i;:::-;7970:117;8119:65;8176:7;8167:6;8156:9;8152:22;8119:65;:::i;:::-;8101:83;;;;7897:297;7672:529;;;;;:::o;8207:116::-;8277:21;8292:5;8277:21;:::i;:::-;8270:5;8267:32;8257:60;;8313:1;8310;8303:12;8257:60;8207:116;:::o;8329:133::-;8372:5;8410:6;8397:20;8388:29;;8426:30;8450:5;8426:30;:::i;:::-;8329:133;;;;:::o;8468:468::-;8533:6;8541;8590:2;8578:9;8569:7;8565:23;8561:32;8558:119;;;8596:79;;:::i;:::-;8558:119;8716:1;8741:53;8786:7;8777:6;8766:9;8762:22;8741:53;:::i;:::-;8731:63;;8687:117;8843:2;8869:50;8911:7;8902:6;8891:9;8887:22;8869:50;:::i;:::-;8859:60;;8814:115;8468:468;;;;;:::o;8942:117::-;9051:1;9048;9041:12;9065:180;9113:77;9110:1;9103:88;9210:4;9207:1;9200:15;9234:4;9231:1;9224:15;9251:281;9334:27;9356:4;9334:27;:::i;:::-;9326:6;9322:40;9464:6;9452:10;9449:22;9428:18;9416:10;9413:34;9410:62;9407:88;;;9475:18;;:::i;:::-;9407:88;9515:10;9511:2;9504:22;9294:238;9251:281;;:::o;9538:129::-;9572:6;9599:20;;:::i;:::-;9589:30;;9628:33;9656:4;9648:6;9628:33;:::i;:::-;9538:129;;;:::o;9673:307::-;9734:4;9824:18;9816:6;9813:30;9810:56;;;9846:18;;:::i;:::-;9810:56;9884:29;9906:6;9884:29;:::i;:::-;9876:37;;9968:4;9962;9958:15;9950:23;;9673:307;;;:::o;9986:154::-;10070:6;10065:3;10060;10047:30;10132:1;10123:6;10118:3;10114:16;10107:27;9986:154;;;:::o;10146:410::-;10223:5;10248:65;10264:48;10305:6;10264:48;:::i;:::-;10248:65;:::i;:::-;10239:74;;10336:6;10329:5;10322:21;10374:4;10367:5;10363:16;10412:3;10403:6;10398:3;10394:16;10391:25;10388:112;;;10419:79;;:::i;:::-;10388:112;10509:41;10543:6;10538:3;10533;10509:41;:::i;:::-;10229:327;10146:410;;;;;:::o;10575:338::-;10630:5;10679:3;10672:4;10664:6;10660:17;10656:27;10646:122;;10687:79;;:::i;:::-;10646:122;10804:6;10791:20;10829:78;10903:3;10895:6;10888:4;10880:6;10876:17;10829:78;:::i;:::-;10820:87;;10636:277;10575:338;;;;:::o;10919:943::-;11014:6;11022;11030;11038;11087:3;11075:9;11066:7;11062:23;11058:33;11055:120;;;11094:79;;:::i;:::-;11055:120;11214:1;11239:53;11284:7;11275:6;11264:9;11260:22;11239:53;:::i;:::-;11229:63;;11185:117;11341:2;11367:53;11412:7;11403:6;11392:9;11388:22;11367:53;:::i;:::-;11357:63;;11312:118;11469:2;11495:53;11540:7;11531:6;11520:9;11516:22;11495:53;:::i;:::-;11485:63;;11440:118;11625:2;11614:9;11610:18;11597:32;11656:18;11648:6;11645:30;11642:117;;;11678:79;;:::i;:::-;11642:117;11783:62;11837:7;11828:6;11817:9;11813:22;11783:62;:::i;:::-;11773:72;;11568:287;10919:943;;;;;;;:::o;11868:474::-;11936:6;11944;11993:2;11981:9;11972:7;11968:23;11964:32;11961:119;;;11999:79;;:::i;:::-;11961:119;12119:1;12144:53;12189:7;12180:6;12169:9;12165:22;12144:53;:::i;:::-;12134:63;;12090:117;12246:2;12272:53;12317:7;12308:6;12297:9;12293:22;12272:53;:::i;:::-;12262:63;;12217:118;11868:474;;;;;:::o;12348:171::-;12488:23;12484:1;12476:6;12472:14;12465:47;12348:171;:::o;12525:366::-;12667:3;12688:67;12752:2;12747:3;12688:67;:::i;:::-;12681:74;;12764:93;12853:3;12764:93;:::i;:::-;12882:2;12877:3;12873:12;12866:19;;12525:366;;;:::o;12897:419::-;13063:4;13101:2;13090:9;13086:18;13078:26;;13150:9;13144:4;13140:20;13136:1;13125:9;13121:17;13114:47;13178:131;13304:4;13178:131;:::i;:::-;13170:139;;12897:419;;;:::o;13322:182::-;13462:34;13458:1;13450:6;13446:14;13439:58;13322:182;:::o;13510:366::-;13652:3;13673:67;13737:2;13732:3;13673:67;:::i;:::-;13666:74;;13749:93;13838:3;13749:93;:::i;:::-;13867:2;13862:3;13858:12;13851:19;;13510:366;;;:::o;13882:419::-;14048:4;14086:2;14075:9;14071:18;14063:26;;14135:9;14129:4;14125:20;14121:1;14110:9;14106:17;14099:47;14163:131;14289:4;14163:131;:::i;:::-;14155:139;;13882:419;;;:::o;14307:180::-;14355:77;14352:1;14345:88;14452:4;14449:1;14442:15;14476:4;14473:1;14466:15;14493:320;14537:6;14574:1;14568:4;14564:12;14554:22;;14621:1;14615:4;14611:12;14642:18;14632:81;;14698:4;14690:6;14686:17;14676:27;;14632:81;14760:2;14752:6;14749:14;14729:18;14726:38;14723:84;;;14779:18;;:::i;:::-;14723:84;14544:269;14493:320;;;:::o;14819:231::-;14959:34;14955:1;14947:6;14943:14;14936:58;15028:14;15023:2;15015:6;15011:15;15004:39;14819:231;:::o;15056:366::-;15198:3;15219:67;15283:2;15278:3;15219:67;:::i;:::-;15212:74;;15295:93;15384:3;15295:93;:::i;:::-;15413:2;15408:3;15404:12;15397:19;;15056:366;;;:::o;15428:419::-;15594:4;15632:2;15621:9;15617:18;15609:26;;15681:9;15675:4;15671:20;15667:1;15656:9;15652:17;15645:47;15709:131;15835:4;15709:131;:::i;:::-;15701:139;;15428:419;;;:::o;15853:220::-;15993:34;15989:1;15981:6;15977:14;15970:58;16062:3;16057:2;16049:6;16045:15;16038:28;15853:220;:::o;16079:366::-;16221:3;16242:67;16306:2;16301:3;16242:67;:::i;:::-;16235:74;;16318:93;16407:3;16318:93;:::i;:::-;16436:2;16431:3;16427:12;16420:19;;16079:366;;;:::o;16451:419::-;16617:4;16655:2;16644:9;16640:18;16632:26;;16704:9;16698:4;16694:20;16690:1;16679:9;16675:17;16668:47;16732:131;16858:4;16732:131;:::i;:::-;16724:139;;16451:419;;;:::o;16876:243::-;17016:34;17012:1;17004:6;17000:14;16993:58;17085:26;17080:2;17072:6;17068:15;17061:51;16876:243;:::o;17125:366::-;17267:3;17288:67;17352:2;17347:3;17288:67;:::i;:::-;17281:74;;17364:93;17453:3;17364:93;:::i;:::-;17482:2;17477:3;17473:12;17466:19;;17125:366;;;:::o;17497:419::-;17663:4;17701:2;17690:9;17686:18;17678:26;;17750:9;17744:4;17740:20;17736:1;17725:9;17721:17;17714:47;17778:131;17904:4;17778:131;:::i;:::-;17770:139;;17497:419;;;:::o;17922:180::-;17970:77;17967:1;17960:88;18067:4;18064:1;18057:15;18091:4;18088:1;18081:15;18108:305;18148:3;18167:20;18185:1;18167:20;:::i;:::-;18162:25;;18201:20;18219:1;18201:20;:::i;:::-;18196:25;;18355:1;18287:66;18283:74;18280:1;18277:81;18274:107;;;18361:18;;:::i;:::-;18274:107;18405:1;18402;18398:9;18391:16;;18108:305;;;;:::o;18419:180::-;18559:32;18555:1;18547:6;18543:14;18536:56;18419:180;:::o;18605:366::-;18747:3;18768:67;18832:2;18827:3;18768:67;:::i;:::-;18761:74;;18844:93;18933:3;18844:93;:::i;:::-;18962:2;18957:3;18953:12;18946:19;;18605:366;;;:::o;18977:419::-;19143:4;19181:2;19170:9;19166:18;19158:26;;19230:9;19224:4;19220:20;19216:1;19205:9;19201:17;19194:47;19258:131;19384:4;19258:131;:::i;:::-;19250:139;;18977:419;;;:::o;19402:171::-;19542:23;19538:1;19530:6;19526:14;19519:47;19402:171;:::o;19579:366::-;19721:3;19742:67;19806:2;19801:3;19742:67;:::i;:::-;19735:74;;19818:93;19907:3;19818:93;:::i;:::-;19936:2;19931:3;19927:12;19920:19;;19579:366;;;:::o;19951:419::-;20117:4;20155:2;20144:9;20140:18;20132:26;;20204:9;20198:4;20194:20;20190:1;20179:9;20175:17;20168:47;20232:131;20358:4;20232:131;:::i;:::-;20224:139;;19951:419;;;:::o;20376:177::-;20516:29;20512:1;20504:6;20500:14;20493:53;20376:177;:::o;20559:366::-;20701:3;20722:67;20786:2;20781:3;20722:67;:::i;:::-;20715:74;;20798:93;20887:3;20798:93;:::i;:::-;20916:2;20911:3;20907:12;20900:19;;20559:366;;;:::o;20931:419::-;21097:4;21135:2;21124:9;21120:18;21112:26;;21184:9;21178:4;21174:20;21170:1;21159:9;21155:17;21148:47;21212:131;21338:4;21212:131;:::i;:::-;21204:139;;20931:419;;;:::o;21356:178::-;21496:30;21492:1;21484:6;21480:14;21473:54;21356:178;:::o;21540:366::-;21682:3;21703:67;21767:2;21762:3;21703:67;:::i;:::-;21696:74;;21779:93;21868:3;21779:93;:::i;:::-;21897:2;21892:3;21888:12;21881:19;;21540:366;;;:::o;21912:419::-;22078:4;22116:2;22105:9;22101:18;22093:26;;22165:9;22159:4;22155:20;22151:1;22140:9;22136:17;22129:47;22193:131;22319:4;22193:131;:::i;:::-;22185:139;;21912:419;;;:::o;22337:226::-;22477:34;22473:1;22465:6;22461:14;22454:58;22546:9;22541:2;22533:6;22529:15;22522:34;22337:226;:::o;22569:366::-;22711:3;22732:67;22796:2;22791:3;22732:67;:::i;:::-;22725:74;;22808:93;22897:3;22808:93;:::i;:::-;22926:2;22921:3;22917:12;22910:19;;22569:366;;;:::o;22941:419::-;23107:4;23145:2;23134:9;23130:18;23122:26;;23194:9;23188:4;23184:20;23180:1;23169:9;23165:17;23158:47;23222:131;23348:4;23222:131;:::i;:::-;23214:139;;22941:419;;;:::o;23366:182::-;23506:34;23502:1;23494:6;23490:14;23483:58;23366:182;:::o;23554:366::-;23696:3;23717:67;23781:2;23776:3;23717:67;:::i;:::-;23710:74;;23793:93;23882:3;23793:93;:::i;:::-;23911:2;23906:3;23902:12;23895:19;;23554:366;;;:::o;23926:419::-;24092:4;24130:2;24119:9;24115:18;24107:26;;24179:9;24173:4;24169:20;24165:1;24154:9;24150:17;24143:47;24207:131;24333:4;24207:131;:::i;:::-;24199:139;;23926:419;;;:::o;24351:182::-;24491:34;24487:1;24479:6;24475:14;24468:58;24351:182;:::o;24539:366::-;24681:3;24702:67;24766:2;24761:3;24702:67;:::i;:::-;24695:74;;24778:93;24867:3;24778:93;:::i;:::-;24896:2;24891:3;24887:12;24880:19;;24539:366;;;:::o;24911:419::-;25077:4;25115:2;25104:9;25100:18;25092:26;;25164:9;25158:4;25154:20;25150:1;25139:9;25135:17;25128:47;25192:131;25318:4;25192:131;:::i;:::-;25184:139;;24911:419;;;:::o;25336:226::-;25476:34;25472:1;25464:6;25460:14;25453:58;25545:9;25540:2;25532:6;25528:15;25521:34;25336:226;:::o;25568:366::-;25710:3;25731:67;25795:2;25790:3;25731:67;:::i;:::-;25724:74;;25807:93;25896:3;25807:93;:::i;:::-;25925:2;25920:3;25916:12;25909:19;;25568:366;;;:::o;25940:419::-;26106:4;26144:2;26133:9;26129:18;26121:26;;26193:9;26187:4;26183:20;26179:1;26168:9;26164:17;26157:47;26221:131;26347:4;26221:131;:::i;:::-;26213:139;;25940:419;;;:::o;26365:229::-;26505:34;26501:1;26493:6;26489:14;26482:58;26574:12;26569:2;26561:6;26557:15;26550:37;26365:229;:::o;26600:366::-;26742:3;26763:67;26827:2;26822:3;26763:67;:::i;:::-;26756:74;;26839:93;26928:3;26839:93;:::i;:::-;26957:2;26952:3;26948:12;26941:19;;26600:366;;;:::o;26972:419::-;27138:4;27176:2;27165:9;27161:18;27153:26;;27225:9;27219:4;27215:20;27211:1;27200:9;27196:17;27189:47;27253:131;27379:4;27253:131;:::i;:::-;27245:139;;26972:419;;;:::o;27397:168::-;27537:20;27533:1;27525:6;27521:14;27514:44;27397:168;:::o;27571:366::-;27713:3;27734:67;27798:2;27793:3;27734:67;:::i;:::-;27727:74;;27810:93;27899:3;27810:93;:::i;:::-;27928:2;27923:3;27919:12;27912:19;;27571:366;;;:::o;27943:419::-;28109:4;28147:2;28136:9;28132:18;28124:26;;28196:9;28190:4;28186:20;28182:1;28171:9;28167:17;28160:47;28224:131;28350:4;28224:131;:::i;:::-;28216:139;;27943:419;;;:::o;28368:230::-;28508:34;28504:1;28496:6;28492:14;28485:58;28577:13;28572:2;28564:6;28560:15;28553:38;28368:230;:::o;28604:366::-;28746:3;28767:67;28831:2;28826:3;28767:67;:::i;:::-;28760:74;;28843:93;28932:3;28843:93;:::i;:::-;28961:2;28956:3;28952:12;28945:19;;28604:366;;;:::o;28976:419::-;29142:4;29180:2;29169:9;29165:18;29157:26;;29229:9;29223:4;29219:20;29215:1;29204:9;29200:17;29193:47;29257:131;29383:4;29257:131;:::i;:::-;29249:139;;28976:419;;;:::o;29401:231::-;29541:34;29537:1;29529:6;29525:14;29518:58;29610:14;29605:2;29597:6;29593:15;29586:39;29401:231;:::o;29638:366::-;29780:3;29801:67;29865:2;29860:3;29801:67;:::i;:::-;29794:74;;29877:93;29966:3;29877:93;:::i;:::-;29995:2;29990:3;29986:12;29979:19;;29638:366;;;:::o;30010:419::-;30176:4;30214:2;30203:9;30199:18;30191:26;;30263:9;30257:4;30253:20;30249:1;30238:9;30234:17;30227:47;30291:131;30417:4;30291:131;:::i;:::-;30283:139;;30010:419;;;:::o;30435:180::-;30483:77;30480:1;30473:88;30580:4;30577:1;30570:15;30604:4;30601:1;30594:15;30621:228;30761:34;30757:1;30749:6;30745:14;30738:58;30830:11;30825:2;30817:6;30813:15;30806:36;30621:228;:::o;30855:366::-;30997:3;31018:67;31082:2;31077:3;31018:67;:::i;:::-;31011:74;;31094:93;31183:3;31094:93;:::i;:::-;31212:2;31207:3;31203:12;31196:19;;30855:366;;;:::o;31227:419::-;31393:4;31431:2;31420:9;31416:18;31408:26;;31480:9;31474:4;31470:20;31466:1;31455:9;31451:17;31444:47;31508:131;31634:4;31508:131;:::i;:::-;31500:139;;31227:419;;;:::o;31652:172::-;31792:24;31788:1;31780:6;31776:14;31769:48;31652:172;:::o;31830:366::-;31972:3;31993:67;32057:2;32052:3;31993:67;:::i;:::-;31986:74;;32069:93;32158:3;32069:93;:::i;:::-;32187:2;32182:3;32178:12;32171:19;;31830:366;;;:::o;32202:419::-;32368:4;32406:2;32395:9;32391:18;32383:26;;32455:9;32449:4;32445:20;32441:1;32430:9;32426:17;32419:47;32483:131;32609:4;32483:131;:::i;:::-;32475:139;;32202:419;;;:::o;32627:229::-;32767:34;32763:1;32755:6;32751:14;32744:58;32836:12;32831:2;32823:6;32819:15;32812:37;32627:229;:::o;32862:366::-;33004:3;33025:67;33089:2;33084:3;33025:67;:::i;:::-;33018:74;;33101:93;33190:3;33101:93;:::i;:::-;33219:2;33214:3;33210:12;33203:19;;32862:366;;;:::o;33234:419::-;33400:4;33438:2;33427:9;33423:18;33415:26;;33487:9;33481:4;33477:20;33473:1;33462:9;33458:17;33451:47;33515:131;33641:4;33515:131;:::i;:::-;33507:139;;33234:419;;;:::o;33659:173::-;33799:25;33795:1;33787:6;33783:14;33776:49;33659:173;:::o;33838:366::-;33980:3;34001:67;34065:2;34060:3;34001:67;:::i;:::-;33994:74;;34077:93;34166:3;34077:93;:::i;:::-;34195:2;34190:3;34186:12;34179:19;;33838:366;;;:::o;34210:419::-;34376:4;34414:2;34403:9;34399:18;34391:26;;34463:9;34457:4;34453:20;34449:1;34438:9;34434:17;34427:47;34491:131;34617:4;34491:131;:::i;:::-;34483:139;;34210:419;;;:::o;34635:191::-;34675:4;34695:20;34713:1;34695:20;:::i;:::-;34690:25;;34729:20;34747:1;34729:20;:::i;:::-;34724:25;;34768:1;34765;34762:8;34759:34;;;34773:18;;:::i;:::-;34759:34;34818:1;34815;34811:9;34803:17;;34635:191;;;;:::o;34832:226::-;34972:34;34968:1;34960:6;34956:14;34949:58;35041:9;35036:2;35028:6;35024:15;35017:34;34832:226;:::o;35064:366::-;35206:3;35227:67;35291:2;35286:3;35227:67;:::i;:::-;35220:74;;35303:93;35392:3;35303:93;:::i;:::-;35421:2;35416:3;35412:12;35405:19;;35064:366;;;:::o;35436:419::-;35602:4;35640:2;35629:9;35625:18;35617:26;;35689:9;35683:4;35679:20;35675:1;35664:9;35660:17;35653:47;35717:131;35843:4;35717:131;:::i;:::-;35709:139;;35436:419;;;:::o;35861:148::-;35963:11;36000:3;35985:18;;35861:148;;;;:::o;36015:141::-;36064:4;36087:3;36079:11;;36110:3;36107:1;36100:14;36144:4;36141:1;36131:18;36123:26;;36015:141;;;:::o;36186:845::-;36289:3;36326:5;36320:12;36355:36;36381:9;36355:36;:::i;:::-;36407:89;36489:6;36484:3;36407:89;:::i;:::-;36400:96;;36527:1;36516:9;36512:17;36543:1;36538:137;;;;36689:1;36684:341;;;;36505:520;;36538:137;36622:4;36618:9;36607;36603:25;36598:3;36591:38;36658:6;36653:3;36649:16;36642:23;;36538:137;;36684:341;36751:38;36783:5;36751:38;:::i;:::-;36811:1;36825:154;36839:6;36836:1;36833:13;36825:154;;;36913:7;36907:14;36903:1;36898:3;36894:11;36887:35;36963:1;36954:7;36950:15;36939:26;;36861:4;36858:1;36854:12;36849:17;;36825:154;;;37008:6;37003:3;36999:16;36992:23;;36691:334;;36505:520;;36293:738;;36186:845;;;;:::o;37037:377::-;37143:3;37171:39;37204:5;37171:39;:::i;:::-;37226:89;37308:6;37303:3;37226:89;:::i;:::-;37219:96;;37324:52;37369:6;37364:3;37357:4;37350:5;37346:16;37324:52;:::i;:::-;37401:6;37396:3;37392:16;37385:23;;37147:267;37037:377;;;;:::o;37420:429::-;37597:3;37619:92;37707:3;37698:6;37619:92;:::i;:::-;37612:99;;37728:95;37819:3;37810:6;37728:95;:::i;:::-;37721:102;;37840:3;37833:10;;37420:429;;;;;:::o;37855:225::-;37995:34;37991:1;37983:6;37979:14;37972:58;38064:8;38059:2;38051:6;38047:15;38040:33;37855:225;:::o;38086:366::-;38228:3;38249:67;38313:2;38308:3;38249:67;:::i;:::-;38242:74;;38325:93;38414:3;38325:93;:::i;:::-;38443:2;38438:3;38434:12;38427:19;;38086:366;;;:::o;38458:419::-;38624:4;38662:2;38651:9;38647:18;38639:26;;38711:9;38705:4;38701:20;38697:1;38686:9;38682:17;38675:47;38739:131;38865:4;38739:131;:::i;:::-;38731:139;;38458:419;;;:::o;38883:231::-;39023:34;39019:1;39011:6;39007:14;39000:58;39092:14;39087:2;39079:6;39075:15;39068:39;38883:231;:::o;39120:366::-;39262:3;39283:67;39347:2;39342:3;39283:67;:::i;:::-;39276:74;;39359:93;39448:3;39359:93;:::i;:::-;39477:2;39472:3;39468:12;39461:19;;39120:366;;;:::o;39492:419::-;39658:4;39696:2;39685:9;39681:18;39673:26;;39745:9;39739:4;39735:20;39731:1;39720:9;39716:17;39709:47;39773:131;39899:4;39773:131;:::i;:::-;39765:139;;39492:419;;;:::o;39917:228::-;40057:34;40053:1;40045:6;40041:14;40034:58;40126:11;40121:2;40113:6;40109:15;40102:36;39917:228;:::o;40151:366::-;40293:3;40314:67;40378:2;40373:3;40314:67;:::i;:::-;40307:74;;40390:93;40479:3;40390:93;:::i;:::-;40508:2;40503:3;40499:12;40492:19;;40151:366;;;:::o;40523:419::-;40689:4;40727:2;40716:9;40712:18;40704:26;;40776:9;40770:4;40766:20;40762:1;40751:9;40747:17;40740:47;40804:131;40930:4;40804:131;:::i;:::-;40796:139;;40523:419;;;:::o;40948:223::-;41088:34;41084:1;41076:6;41072:14;41065:58;41157:6;41152:2;41144:6;41140:15;41133:31;40948:223;:::o;41177:366::-;41319:3;41340:67;41404:2;41399:3;41340:67;:::i;:::-;41333:74;;41416:93;41505:3;41416:93;:::i;:::-;41534:2;41529:3;41525:12;41518:19;;41177:366;;;:::o;41549:419::-;41715:4;41753:2;41742:9;41738:18;41730:26;;41802:9;41796:4;41792:20;41788:1;41777:9;41773:17;41766:47;41830:131;41956:4;41830:131;:::i;:::-;41822:139;;41549:419;;;:::o;41974:175::-;42114:27;42110:1;42102:6;42098:14;42091:51;41974:175;:::o;42155:366::-;42297:3;42318:67;42382:2;42377:3;42318:67;:::i;:::-;42311:74;;42394:93;42483:3;42394:93;:::i;:::-;42512:2;42507:3;42503:12;42496:19;;42155:366;;;:::o;42527:419::-;42693:4;42731:2;42720:9;42716:18;42708:26;;42780:9;42774:4;42770:20;42766:1;42755:9;42751:17;42744:47;42808:131;42934:4;42808:131;:::i;:::-;42800:139;;42527:419;;;:::o;42952:237::-;43092:34;43088:1;43080:6;43076:14;43069:58;43161:20;43156:2;43148:6;43144:15;43137:45;42952:237;:::o;43195:366::-;43337:3;43358:67;43422:2;43417:3;43358:67;:::i;:::-;43351:74;;43434:93;43523:3;43434:93;:::i;:::-;43552:2;43547:3;43543:12;43536:19;;43195:366;;;:::o;43567:419::-;43733:4;43771:2;43760:9;43756:18;43748:26;;43820:9;43814:4;43810:20;43806:1;43795:9;43791:17;43784:47;43848:131;43974:4;43848:131;:::i;:::-;43840:139;;43567:419;;;:::o;43992:233::-;44031:3;44054:24;44072:5;44054:24;:::i;:::-;44045:33;;44100:66;44093:5;44090:77;44087:103;;;44170:18;;:::i;:::-;44087:103;44217:1;44210:5;44206:13;44199:20;;43992:233;;;:::o;44231:180::-;44279:77;44276:1;44269:88;44376:4;44373:1;44366:15;44400:4;44397:1;44390:15;44417:185;44457:1;44474:20;44492:1;44474:20;:::i;:::-;44469:25;;44508:20;44526:1;44508:20;:::i;:::-;44503:25;;44547:1;44537:35;;44552:18;;:::i;:::-;44537:35;44594:1;44591;44587:9;44582:14;;44417:185;;;;:::o;44608:176::-;44640:1;44657:20;44675:1;44657:20;:::i;:::-;44652:25;;44691:20;44709:1;44691:20;:::i;:::-;44686:25;;44730:1;44720:35;;44735:18;;:::i;:::-;44720:35;44776:1;44773;44769:9;44764:14;;44608:176;;;;:::o;44790:98::-;44841:6;44875:5;44869:12;44859:22;;44790:98;;;:::o;44894:168::-;44977:11;45011:6;45006:3;44999:19;45051:4;45046:3;45042:14;45027:29;;44894:168;;;;:::o;45068:360::-;45154:3;45182:38;45214:5;45182:38;:::i;:::-;45236:70;45299:6;45294:3;45236:70;:::i;:::-;45229:77;;45315:52;45360:6;45355:3;45348:4;45341:5;45337:16;45315:52;:::i;:::-;45392:29;45414:6;45392:29;:::i;:::-;45387:3;45383:39;45376:46;;45158:270;45068:360;;;;:::o;45434:640::-;45629:4;45667:3;45656:9;45652:19;45644:27;;45681:71;45749:1;45738:9;45734:17;45725:6;45681:71;:::i;:::-;45762:72;45830:2;45819:9;45815:18;45806:6;45762:72;:::i;:::-;45844;45912:2;45901:9;45897:18;45888:6;45844:72;:::i;:::-;45963:9;45957:4;45953:20;45948:2;45937:9;45933:18;45926:48;45991:76;46062:4;46053:6;45991:76;:::i;:::-;45983:84;;45434:640;;;;;;;:::o;46080:141::-;46136:5;46167:6;46161:13;46152:22;;46183:32;46209:5;46183:32;:::i;:::-;46080:141;;;;:::o;46227:349::-;46296:6;46345:2;46333:9;46324:7;46320:23;46316:32;46313:119;;;46351:79;;:::i;:::-;46313:119;46471:1;46496:63;46551:7;46542:6;46531:9;46527:22;46496:63;:::i;:::-;46486:73;;46442:127;46227:349;;;;:::o;46582:182::-;46722:34;46718:1;46710:6;46706:14;46699:58;46582:182;:::o;46770:366::-;46912:3;46933:67;46997:2;46992:3;46933:67;:::i;:::-;46926:74;;47009:93;47098:3;47009:93;:::i;:::-;47127:2;47122:3;47118:12;47111:19;;46770:366;;;:::o;47142:419::-;47308:4;47346:2;47335:9;47331:18;47323:26;;47395:9;47389:4;47385:20;47381:1;47370:9;47366:17;47359:47;47423:131;47549:4;47423:131;:::i;:::-;47415:139;;47142:419;;;:::o;47567:178::-;47707:30;47703:1;47695:6;47691:14;47684:54;47567:178;:::o;47751:366::-;47893:3;47914:67;47978:2;47973:3;47914:67;:::i;:::-;47907:74;;47990:93;48079:3;47990:93;:::i;:::-;48108:2;48103:3;48099:12;48092:19;;47751:366;;;:::o;48123:419::-;48289:4;48327:2;48316:9;48312:18;48304:26;;48376:9;48370:4;48366:20;48362:1;48351:9;48347:17;48340:47;48404:131;48530:4;48404:131;:::i;:::-;48396:139;;48123:419;;;:::o;48548:180::-;48596:77;48593:1;48586:88;48693:4;48690:1;48683:15;48717:4;48714:1;48707:15

Swarm Source

ipfs://32bcae995d63d8445eb9964060ec25592b991fd0317ad1f8a731185b746bfafb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.