ETH Price: $3,333.82 (+2.75%)

Token

CryptorunnerNFT (2112CR)
 

Overview

Max Total Supply

2,803 2112CR

Holders

1,131

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
shadow---grey.eth
Balance
1 2112CR
0x44ef0055d052145c3c1e36ec1a9ef6dc81a5d56f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Genesis Cryptorunners are Hackers that fight against the Big 5 Corporations of the 2112.run universe.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptorunnerNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 16: CryptorunnerNFT.sol
// SPDX-License-Identifier: MIT

//··········································
//··········································
//········_________·___·___····_________····
//······/  ______  \\  \\  \·/  ______  \···
//·····/__/·····/  //  //  //__/·····/  /···
//····_________/  //  //  /_________/  /····
//···/  _________//  //  //  _________/·····
//··/  /________ /  //  //  /________·······
//·/__/\_______//__//__//__/\_______/·∅·RUN·
//··········································
//··········································

pragma solidity ^0.8.7;

import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./PaymentSplitter.sol";

interface RP {
    function balanceOf(address account, uint256 id) external returns (uint256);
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external returns (uint256[] memory);
    function burnFromRedeem(address account, uint256[] calldata ids, uint256[] calldata amounts) external;
}

contract CryptorunnerNFT is ERC721Enumerable, Ownable, PaymentSplitter {
    string  public              baseURI;
    string  public              provenance;
    
    address public              proxyRegistryAddress;
    address public              rootPassAddress;

    bool    public              saleStatus;
    uint256 public constant     MAX_SUPPLY          = 10560;
    uint256 public              MAX_GIVEAWAY        = 100;

    uint256 public constant     MAX_PER_TX          = 20;
    uint256 public              priceInWei          = 0.1 ether;

    mapping(address => bool) public projectProxy;

    constructor(
        string memory _baseURI, 
        address _proxyRegistryAddress, 
        address _rootPassAddress,
        address[] memory _payees,
        uint256[] memory _paymentShares
    )
        ERC721("CryptorunnerNFT", "2112CR")
        PaymentSplitter(_payees, _paymentShares)
    {
        baseURI = _baseURI;
        proxyRegistryAddress = _proxyRegistryAddress;
        rootPassAddress = _rootPassAddress;
    }

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

    function setPrice(uint256 _priceInWei) public onlyOwner {
        priceInWei = _priceInWei;
    }

    function setProvenance(string memory _provenance) public onlyOwner {
        provenance = _provenance;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return string(abi.encodePacked(baseURI, Strings.toString(_tokenId), ".json"));
    }

    function setProxyRegistryAddress(address _proxyRegistryAddress) external onlyOwner {
        proxyRegistryAddress = _proxyRegistryAddress;
    }

    function toggleSaleStatus() external onlyOwner {
        saleStatus = !saleStatus;
    }

    function mint(uint256 count) public payable {
        require(saleStatus, "Sale is not open");
        require(count * priceInWei == msg.value, "Invalid funds provided.");
        require(count < MAX_PER_TX, "Exceeds max per transaction.");
        uint256 totalSupply = _owners.length;
        require(totalSupply + count < MAX_SUPPLY, "Excedes max supply.");
        // block proxy contract minting
        require(msg.sender == tx.origin, 'msg.sender does not match tx.origin');
         
        for(uint i; i < count; i++) { 
            _mint(_msgSender(), totalSupply + i);
        }
    }

    function promoMint(uint _qty, address _to) public onlyOwner {
        require(MAX_GIVEAWAY - _qty >= 0, "Exceeds max giveaway.");
        uint256 totalSupply = _owners.length;
        require(totalSupply + _qty < MAX_SUPPLY, "Excedes max supply.");
        for (uint i = 0; i < _qty; i++) {
            _mint(_to, totalSupply + i);
        }
        MAX_GIVEAWAY -= _qty;
    }

    function redeemRootPass(address[] calldata _addr) public {
        for (uint i = 0; i < _addr.length; i++) {
            uint256[] memory ids = new uint256[](1);
            uint256[] memory amounts = new uint256[](1);
            ids[0] = 1;
            amounts[0] = RP(rootPassAddress).balanceOf(_addr[i], 1);
            if (amounts[0] > 0) {
                uint256 totalSupply = _owners.length;
                require(totalSupply + amounts[0] < MAX_SUPPLY, "Excedes max supply.");
                for (uint j = 0; j < amounts[0]; j++) {
                    _mint(_addr[i], totalSupply + j);
                }
                RP(rootPassAddress).burnFromRedeem(_addr[i], ids, amounts);
            }
        }
    }

    function burn(uint256 tokenId) public { 
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Not approved to burn.");
        _burn(tokenId);
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) return new uint256[](0);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function batchTransferFrom(address _from, address _to, uint256[] memory _tokenIds) public {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            transferFrom(_from, _to, _tokenIds[i]);
        }
    }

    function batchSafeTransferFrom(address _from, address _to, uint256[] memory _tokenIds, bytes memory data_) public {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            safeTransferFrom(_from, _to, _tokenIds[i], data_);
        }
    }

    function isOwnerOf(address account, uint256[] calldata _tokenIds) external view returns (bool){
        for(uint256 i; i < _tokenIds.length; ++i ){
            if(_owners[_tokenIds[i]] != account)
                return false;
        }

        return true;
    }

    function isApprovedForAll(address _owner, address operator) public view override(ERC721) returns (bool) {
        OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(_owner)) == operator || projectProxy[operator]) return true;
        return super.isApprovedForAll(_owner, operator);
    }

    function _mint(address to, uint256 tokenId) internal virtual override {
        _owners.push(to);
        emit Transfer(address(0), to, tokenId);
    }
}

contract OwnableDelegateProxy { }
contract OpenSeaProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 16: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (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 16: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 16: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

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

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
    
    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    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 (uint) 
    {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count;
        for( uint i; i < _owners.length; ++i ){
          if( owner == _owners[i] )
            ++count;
        }
        return count;
    }

    /**
     * @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 {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

        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);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 6 of 16: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

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 but rips out the core of the gas-wasting processing that comes from OpenZeppelin.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    /**
     * @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-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }

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

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

        uint count;
        for(uint i; i < _owners.length; i++){
            if(owner == _owners[i]){
                if(count == index) return i;
                else count++;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}

File 7 of 16: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (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 8 of 16: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 16: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

File 13 of 16: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (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 16: PaymentSplitter.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;

import "./SafeERC20.sol";
import "./Address.sol";
import "./Context.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

File 15 of 16: SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"address","name":"_rootPassAddress","type":"address"},{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_paymentShares","type":"uint256[]"}],"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":[],"name":"MAX_GIVEAWAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"batchSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"projectProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"promoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addr","type":"address[]"}],"name":"redeemRootPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootPassAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","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":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceInWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"toggleSaleStatus","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":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052606460115567016345785d8a00006012553480156200002257600080fd5b5060405162003d3738038062003d37833981016040819052620000459162000646565b604080518082018252600f81526e10dc9e5c1d1bdc9d5b9b995c939195608a1b6020808301918252835180850190945260068452651918989921a960d11b908401528151859385939290916200009e9160009162000499565b508051620000b490600190602084019062000499565b505050620000d1620000cb6200025560201b60201c565b62000259565b8051825114620001435760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001965760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200013a565b60005b82518110156200020257620001ed838281518110620001bc57620001bc6200085d565b6020026020010151838381518110620001d957620001d96200085d565b6020026020010151620002ab60201b60201c565b80620001f98162000829565b91505062000199565b505085516200021a9150600d90602088019062000499565b5050600f80546001600160a01b039485166001600160a01b031991821617909155601080549390941692169190911790915550620008899050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620003185760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016200013a565b600081116200036a5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016200013a565b6001600160a01b03821660009081526008602052604090205415620003e65760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b60648201526084016200013a565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b038416908117909155600090815260086020526040902081905560065462000450908290620007d1565b600655604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b828054620004a790620007ec565b90600052602060002090601f016020900481019282620004cb576000855562000516565b82601f10620004e657805160ff191683800117855562000516565b8280016001018555821562000516579182015b8281111562000516578251825591602001919060010190620004f9565b506200052492915062000528565b5090565b5b8082111562000524576000815560010162000529565b80516001600160a01b03811681146200055757600080fd5b919050565b600082601f8301126200056e57600080fd5b81516020620005876200058183620007ab565b62000778565b80838252828201915082860187848660051b8901011115620005a857600080fd5b60005b85811015620005d257620005bf826200053f565b84529284019290840190600101620005ab565b5090979650505050505050565b600082601f830112620005f157600080fd5b81516020620006046200058183620007ab565b80838252828201915082860187848660051b89010111156200062557600080fd5b60005b85811015620005d25781518452928401929084019060010162000628565b600080600080600060a086880312156200065f57600080fd5b85516001600160401b03808211156200067757600080fd5b818801915088601f8301126200068c57600080fd5b815181811115620006a157620006a162000873565b6020620006b7601f8301601f1916820162000778565b8281528b82848701011115620006cc57600080fd5b60005b83811015620006ec578581018301518282018401528201620006cf565b83811115620006fe5760008385840101525b5098506200070e8a82016200053f565b9750505062000720604089016200053f565b945060608801519150808211156200073757600080fd5b6200074589838a016200055c565b935060808801519150808211156200075c57600080fd5b506200076b88828901620005df565b9150509295509295909350565b604051601f8201601f191681016001600160401b0381118282101715620007a357620007a362000873565b604052919050565b60006001600160401b03821115620007c757620007c762000873565b5060051b60200190565b60008219821115620007e757620007e762000847565b500190565b600181811c908216806200080157607f821691505b602082108114156200082357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000840576200084062000847565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61349e80620008996000396000f3fe6080604052600436106102e85760003560e01c80636352211e11610190578063c79b25cf116100dc578063e33b7de311610095578063f3993d111161006f578063f3993d1114610951578063f43a22dc14610971578063f9020e3314610986578063ffe630b5146109a757600080fd5b8063e33b7de3146108fc578063e985e9c514610911578063f2fde38b1461093157600080fd5b8063c79b25cf14610810578063c87b56dd14610830578063cd7c032614610850578063ce7c2ac214610870578063d26ea6c0146108a6578063d79779b2146108c657600080fd5b806391b7f5ed116101495780639b62c02e116101235780639b62c02e1461079d578063a0712d68146107bd578063a22cb465146107d0578063b88d4fde146107f057600080fd5b806391b7f5ed1461073257806395d89b41146107525780639852595c1461076757600080fd5b80636352211e1461068a5780636c0360eb146106aa57806370a08231146106bf578063715018a6146106df5780638b83209b146106f45780638da5cb5b1461071457600080fd5b80633a98ef391161024f57806348b75044116102085780634f6ccce7116101e25780634f6ccce7146105fa57806355f804b31461061a5780635a4fee301461063a5780635bab26e21461065a57600080fd5b806348b75044146105a45780634c5b7a29146105c45780634d44660c146105da57600080fd5b80633a98ef39146104c65780633c8da588146104db578063406072a9146104f157806342842e0e1461053757806342966c6814610557578063438b63001461057757600080fd5b806318160ddd116102a157806318160ddd1461041157806318a4687e14610430578063191655871461045057806323b872dd146104705780632f745c591461049057806332cb6b0c146104b057600080fd5b806301ffc9a714610336578063049c5c491461036b57806306fdde0314610382578063081812fc146103a4578063095ea7b3146103dc5780630f7309e8146103fc57600080fd5b36610331577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561034257600080fd5b50610356610351366004612de3565b6109c7565b60405190151581526020015b60405180910390f35b34801561037757600080fd5b506103806109f2565b005b34801561038e57600080fd5b50610397610a46565b60405161036291906130ba565b3480156103b057600080fd5b506103c46103bf366004612e83565b610ad8565b6040516001600160a01b039091168152602001610362565b3480156103e857600080fd5b506103806103f7366004612d58565b610b60565b34801561040857600080fd5b50610397610c76565b34801561041d57600080fd5b506002545b604051908152602001610362565b34801561043c57600080fd5b5061038061044b366004612d84565b610d04565b34801561045c57600080fd5b5061038061046b366004612af3565b610fc9565b34801561047c57600080fd5b5061038061048b366004612c34565b6110f7565b34801561049c57600080fd5b506104226104ab366004612d58565b611129565b3480156104bc57600080fd5b5061042261294081565b3480156104d257600080fd5b50600654610422565b3480156104e757600080fd5b5061042260125481565b3480156104fd57600080fd5b5061042261050c366004612b10565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801561054357600080fd5b50610380610552366004612c34565b6111dc565b34801561056357600080fd5b50610380610572366004612e83565b6111f7565b34801561058357600080fd5b50610597610592366004612af3565b611250565b60405161036291906130a7565b3480156105b057600080fd5b506103806105bf366004612b10565b611309565b3480156105d057600080fd5b5061042260115481565b3480156105e657600080fd5b506103566105f5366004612cd5565b6114f1565b34801561060657600080fd5b50610422610615366004612e83565b611573565b34801561062657600080fd5b50610380610635366004612e3a565b6115e0565b34801561064657600080fd5b50610380610655366004612bab565b611621565b34801561066657600080fd5b50610356610675366004612af3565b60136020526000908152604090205460ff1681565b34801561069657600080fd5b506103c46106a5366004612e83565b61166b565b3480156106b657600080fd5b506103976116f7565b3480156106cb57600080fd5b506104226106da366004612af3565b611704565b3480156106eb57600080fd5b506103806117d2565b34801561070057600080fd5b506103c461070f366004612e83565b611808565b34801561072057600080fd5b506005546001600160a01b03166103c4565b34801561073e57600080fd5b5061038061074d366004612e83565b611838565b34801561075e57600080fd5b50610397611867565b34801561077357600080fd5b50610422610782366004612af3565b6001600160a01b031660009081526009602052604090205490565b3480156107a957600080fd5b506010546103c4906001600160a01b031681565b6103806107cb366004612e83565b611876565b3480156107dc57600080fd5b506103806107eb366004612d2a565b611a1c565b3480156107fc57600080fd5b5061038061080b366004612c75565b611ae1565b34801561081c57600080fd5b5061038061082b366004612eb5565b611b19565b34801561083c57600080fd5b5061039761084b366004612e83565b611c0e565b34801561085c57600080fd5b50600f546103c4906001600160a01b031681565b34801561087c57600080fd5b5061042261088b366004612af3565b6001600160a01b031660009081526008602052604090205490565b3480156108b257600080fd5b506103806108c1366004612af3565b611c8f565b3480156108d257600080fd5b506104226108e1366004612af3565b6001600160a01b03166000908152600b602052604090205490565b34801561090857600080fd5b50600754610422565b34801561091d57600080fd5b5061035661092c366004612b10565b611cdb565b34801561093d57600080fd5b5061038061094c366004612af3565b611dce565b34801561095d57600080fd5b5061038061096c366004612b49565b611e66565b34801561097d57600080fd5b50610422601481565b34801561099257600080fd5b5060105461035690600160a01b900460ff1681565b3480156109b357600080fd5b506103806109c2366004612e3a565b611ea8565b60006001600160e01b0319821663780e9d6360e01b14806109ec57506109ec82611ee5565b92915050565b6005546001600160a01b03163314610a255760405162461bcd60e51b8152600401610a1c90613228565b60405180910390fd5b6010805460ff60a01b198116600160a01b9182900460ff1615909102179055565b606060008054610a559061336d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a819061336d565b8015610ace5780601f10610aa357610100808354040283529160200191610ace565b820191906000526020600020905b815481529060010190602001808311610ab157829003601f168201915b5050505050905090565b6000610ae382611f35565b610b445760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a1c565b506000908152600360205260409020546001600160a01b031690565b6000610b6b8261166b565b9050806001600160a01b0316836001600160a01b03161415610bd95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a1c565b336001600160a01b0382161480610bf55750610bf58133611cdb565b610c675760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a1c565b610c718383611f7f565b505050565b600e8054610c839061336d565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf9061336d565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b505050505081565b60005b81811015610c7157604080516001808252818301909252600091602080830190803683375050604080516001808252818301909252929350600092915060208083019080368337019050509050600182600081518110610d6957610d69613403565b60209081029190910101526010546001600160a01b031662fdd58e868686818110610d9657610d96613403565b9050602002016020810190610dab9190612af3565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401602060405180830381600087803b158015610df357600080fd5b505af1158015610e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2b9190612e9c565b81600081518110610e3e57610e3e613403565b602002602001018181525050600081600081518110610e5f57610e5f613403565b60200260200101511115610fb4576002548151612940908390600090610e8757610e87613403565b602002602001015182610e9a91906132df565b10610eb75760405162461bcd60e51b8152600401610a1c906130cd565b60005b82600081518110610ecd57610ecd613403565b6020026020010151811015610f2757610f15878787818110610ef157610ef1613403565b9050602002016020810190610f069190612af3565b610f1083856132df565b611fed565b80610f1f816133a8565b915050610eba565b506010546001600160a01b0316630551f3c7878787818110610f4b57610f4b613403565b9050602002016020810190610f609190612af3565b85856040518463ffffffff1660e01b8152600401610f8093929190613071565b600060405180830381600087803b158015610f9a57600080fd5b505af1158015610fae573d6000803e3d6000fd5b50505050505b50508080610fc1906133a8565b915050610d07565b6001600160a01b038116600090815260086020526040902054610ffe5760405162461bcd60e51b8152600401610a1c90613197565b600061100960075490565b61101390476132df565b90506000611040838361103b866001600160a01b031660009081526009602052604090205490565b612069565b90508061105f5760405162461bcd60e51b8152600401610a1c906131dd565b6001600160a01b038316600090815260096020526040812080548392906110879084906132df565b9250508190555080600760008282546110a091906132df565b909155506110b0905083826120a7565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b611102335b826121c0565b61111e5760405162461bcd60e51b8152600401610a1c9061325d565b610c71838383612282565b600061113483611704565b82106111525760405162461bcd60e51b8152600401610a1c906130fa565b6000805b6002548110156111c3576002818154811061117357611173613403565b6000918252602090912001546001600160a01b03868116911614156111b157838214156111a35791506109ec9050565b816111ad816133a8565b9250505b806111bb816133a8565b915050611156565b5060405162461bcd60e51b8152600401610a1c906130fa565b610c7183838360405180602001604052806000815250611ae1565b611200336110fc565b6112445760405162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b2103a3790313ab9371760591b6044820152606401610a1c565b61124d816123d8565b50565b6060600061125d83611704565b90508061127e5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff81111561129957611299613419565b6040519080825280602002602001820160405280156112c2578160200160208202803683370190505b50905060005b82811015611276576112da8582611129565b8282815181106112ec576112ec613403565b602090810291909101015280611301816133a8565b9150506112c8565b6001600160a01b03811660009081526008602052604090205461133e5760405162461bcd60e51b8152600401610a1c90613197565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561139657600080fd5b505afa1580156113aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ce9190612e9c565b6113d891906132df565b90506000611411838361103b87876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b9050806114305760405162461bcd60e51b8152600401610a1c906131dd565b6001600160a01b038085166000908152600c60209081526040808320938716835292905290812080548392906114679084906132df565b90915550506001600160a01b0384166000908152600b6020526040812080548392906114949084906132df565b909155506114a5905084848361245a565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6000805b8281101561156657846001600160a01b0316600285858481811061151b5761151b613403565b905060200201358154811061153257611532613403565b6000918252602090912001546001600160a01b03161461155657600091505061156c565b61155f816133a8565b90506114f5565b50600190505b9392505050565b60025460009082106115dc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a1c565b5090565b6005546001600160a01b0316331461160a5760405162461bcd60e51b8152600401610a1c90613228565b805161161d90600d906020840190612919565b5050565b60005b825181101561166457611652858585848151811061164457611644613403565b602002602001015185611ae1565b8061165c816133a8565b915050611624565b5050505050565b6000806002838154811061168157611681613403565b6000918252602090912001546001600160a01b03169050806109ec5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a1c565b600d8054610c839061336d565b60006001600160a01b03821661176f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a1c565b6000805b6002548110156117cb576002818154811061179057611790613403565b6000918252602090912001546001600160a01b03858116911614156117bb576117b8826133a8565b91505b6117c4816133a8565b9050611773565b5092915050565b6005546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610a1c90613228565b61180660006124ac565b565b6000600a828154811061181d5761181d613403565b6000918252602090912001546001600160a01b031692915050565b6005546001600160a01b031633146118625760405162461bcd60e51b8152600401610a1c90613228565b601255565b606060018054610a559061336d565b601054600160a01b900460ff166118c25760405162461bcd60e51b815260206004820152601060248201526f29b0b6329034b9903737ba1037b832b760811b6044820152606401610a1c565b34601254826118d1919061330b565b1461191e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642066756e64732070726f76696465642e0000000000000000006044820152606401610a1c565b6014811061196e5760405162461bcd60e51b815260206004820152601c60248201527f45786365656473206d617820706572207472616e73616374696f6e2e000000006044820152606401610a1c565b60025461294061197e83836132df565b1061199b5760405162461bcd60e51b8152600401610a1c906130cd565b3332146119f65760405162461bcd60e51b815260206004820152602360248201527f6d73672e73656e64657220646f6573206e6f74206d617463682074782e6f726960448201526233b4b760e91b6064820152608401610a1c565b60005b82811015610c7157611a0a33610f06565b80611a14816133a8565b9150506119f9565b6001600160a01b038216331415611a755760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a1c565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611aeb33836121c0565b611b075760405162461bcd60e51b8152600401610a1c9061325d565b611b13848484846124fe565b50505050565b6005546001600160a01b03163314611b435760405162461bcd60e51b8152600401610a1c90613228565b600082601154611b53919061332a565b1015611b995760405162461bcd60e51b815260206004820152601560248201527422bc31b2b2b2399036b0bc1033b4bb32b0bbb0bc9760591b6044820152606401610a1c565b600254612940611ba984836132df565b10611bc65760405162461bcd60e51b8152600401610a1c906130cd565b60005b83811015611bf157611bdf83610f1083856132df565b80611be9816133a8565b915050611bc9565b508260116000828254611c04919061332a565b9091555050505050565b6060611c1982611f35565b611c5d5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b6044820152606401610a1c565b600d611c6883612531565b604051602001611c79929190612f79565b6040516020818303038152906040529050919050565b6005546001600160a01b03163314611cb95760405162461bcd60e51b8152600401610a1c90613228565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600f5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611d2857600080fd5b505afa158015611d3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d609190612e1d565b6001600160a01b03161480611d8d57506001600160a01b03831660009081526013602052604090205460ff165b15611d9c5760019150506109ec565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b03163314611df85760405162461bcd60e51b8152600401610a1c90613228565b6001600160a01b038116611e5d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a1c565b61124d816124ac565b60005b8151811015611b1357611e968484848481518110611e8957611e89613403565b60200260200101516110f7565b80611ea0816133a8565b915050611e69565b6005546001600160a01b03163314611ed25760405162461bcd60e51b8152600401610a1c90613228565b805161161d90600e906020840190612919565b60006001600160e01b031982166380ac58cd60e01b1480611f1657506001600160e01b03198216635b5e139f60e01b145b806109ec57506301ffc9a760e01b6001600160e01b03198316146109ec565b600254600090821080156109ec575060006001600160a01b031660028381548110611f6257611f62613403565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611fb48261166b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6006546001600160a01b03841660009081526008602052604081205490918391612093908661330b565b61209d91906132f7565b611dc6919061332a565b804710156120f75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a1c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612144576040519150601f19603f3d011682016040523d82523d6000602084013e612149565b606091505b5050905080610c715760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a1c565b60006121cb82611f35565b61222c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a1c565b60006122378361166b565b9050806001600160a01b0316846001600160a01b031614806122725750836001600160a01b031661226784610ad8565b6001600160a01b0316145b80611dc65750611dc68185611cdb565b826001600160a01b03166122958261166b565b6001600160a01b0316146122fd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a1c565b6001600160a01b03821661235f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a1c565b61236a600082611f7f565b816002828154811061237e5761237e613403565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006123e38261166b565b90506123f0600083611f7f565b60006002838154811061240557612405613403565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c7190849061262f565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612509848484612282565b61251584848484612701565b611b135760405162461bcd60e51b8152600401610a1c90613145565b6060816125555750506040805180820190915260018152600360fc1b602082015290565b8160005b811561257f5780612569816133a8565b91506125789050600a836132f7565b9150612559565b60008167ffffffffffffffff81111561259a5761259a613419565b6040519080825280601f01601f1916602001820160405280156125c4576020820181803683370190505b5090505b8415611dc6576125d960018361332a565b91506125e6600a866133c3565b6125f19060306132df565b60f81b81838151811061260657612606613403565b60200101906001600160f81b031916908160001a905350612628600a866132f7565b94506125c8565b6000612684826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661280e9092919063ffffffff16565b805190915015610c7157808060200190518101906126a29190612dc6565b610c715760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a1c565b60006001600160a01b0384163b1561280357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612745903390899088908890600401613034565b602060405180830381600087803b15801561275f57600080fd5b505af192505050801561278f575060408051601f3d908101601f1916820190925261278c91810190612e00565b60015b6127e9573d8080156127bd576040519150601f19603f3d011682016040523d82523d6000602084013e6127c2565b606091505b5080516127e15760405162461bcd60e51b8152600401610a1c90613145565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dc6565b506001949350505050565b6060611dc6848460008585843b6128675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a1c565b600080866001600160a01b031685876040516128839190612f5d565b60006040518083038185875af1925050503d80600081146128c0576040519150601f19603f3d011682016040523d82523d6000602084013e6128c5565b606091505b50915091506128d58282866128e0565b979650505050505050565b606083156128ef57508161156c565b8251156128ff5782518084602001fd5b8160405162461bcd60e51b8152600401610a1c91906130ba565b8280546129259061336d565b90600052602060002090601f016020900481019282612947576000855561298d565b82601f1061296057805160ff191683800117855561298d565b8280016001018555821561298d579182015b8281111561298d578251825591602001919060010190612972565b506115dc9291505b808211156115dc5760008155600101612995565b600067ffffffffffffffff8311156129c3576129c3613419565b6129d6601f8401601f19166020016132ae565b90508281528383830111156129ea57600080fd5b828260208301376000602084830101529392505050565b60008083601f840112612a1357600080fd5b50813567ffffffffffffffff811115612a2b57600080fd5b6020830191508360208260051b8501011115612a4657600080fd5b9250929050565b600082601f830112612a5e57600080fd5b8135602067ffffffffffffffff821115612a7a57612a7a613419565b8160051b612a898282016132ae565b838152828101908684018388018501891015612aa457600080fd5b600093505b85841015612ac7578035835260019390930192918401918401612aa9565b50979650505050505050565b600082601f830112612ae457600080fd5b61156c838335602085016129a9565b600060208284031215612b0557600080fd5b813561156c8161342f565b60008060408385031215612b2357600080fd5b8235612b2e8161342f565b91506020830135612b3e8161342f565b809150509250929050565b600080600060608486031215612b5e57600080fd5b8335612b698161342f565b92506020840135612b798161342f565b9150604084013567ffffffffffffffff811115612b9557600080fd5b612ba186828701612a4d565b9150509250925092565b60008060008060808587031215612bc157600080fd5b8435612bcc8161342f565b93506020850135612bdc8161342f565b9250604085013567ffffffffffffffff80821115612bf957600080fd5b612c0588838901612a4d565b93506060870135915080821115612c1b57600080fd5b50612c2887828801612ad3565b91505092959194509250565b600080600060608486031215612c4957600080fd5b8335612c548161342f565b92506020840135612c648161342f565b929592945050506040919091013590565b60008060008060808587031215612c8b57600080fd5b8435612c968161342f565b93506020850135612ca68161342f565b925060408501359150606085013567ffffffffffffffff811115612cc957600080fd5b612c2887828801612ad3565b600080600060408486031215612cea57600080fd5b8335612cf58161342f565b9250602084013567ffffffffffffffff811115612d1157600080fd5b612d1d86828701612a01565b9497909650939450505050565b60008060408385031215612d3d57600080fd5b8235612d488161342f565b91506020830135612b3e81613444565b60008060408385031215612d6b57600080fd5b8235612d768161342f565b946020939093013593505050565b60008060208385031215612d9757600080fd5b823567ffffffffffffffff811115612dae57600080fd5b612dba85828601612a01565b90969095509350505050565b600060208284031215612dd857600080fd5b815161156c81613444565b600060208284031215612df557600080fd5b813561156c81613452565b600060208284031215612e1257600080fd5b815161156c81613452565b600060208284031215612e2f57600080fd5b815161156c8161342f565b600060208284031215612e4c57600080fd5b813567ffffffffffffffff811115612e6357600080fd5b8201601f81018413612e7457600080fd5b611dc6848235602084016129a9565b600060208284031215612e9557600080fd5b5035919050565b600060208284031215612eae57600080fd5b5051919050565b60008060408385031215612ec857600080fd5b823591506020830135612b3e8161342f565b600081518084526020808501945080840160005b83811015612f0a57815187529582019590820190600101612eee565b509495945050505050565b60008151808452612f2d816020860160208601613341565b601f01601f19169290920160200192915050565b60008151612f53818560208601613341565b9290920192915050565b60008251612f6f818460208701613341565b9190910192915050565b600080845481600182811c915080831680612f9557607f831692505b6020808410821415612fb557634e487b7160e01b86526022600452602486fd5b818015612fc95760018114612fda57613007565b60ff19861689528489019650613007565b60008b81526020902060005b86811015612fff5781548b820152908501908301612fe6565b505084890196505b50505050505061302b61301a8286612f41565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061306790830184612f15565b9695505050505050565b6001600160a01b038416815260606020820181905260009061309590830185612eda565b82810360408401526130678185612eda565b60208152600061156c6020830184612eda565b60208152600061156c6020830184612f15565b60208082526013908201527222bc31b2b232b99036b0bc1039bab838363c9760691b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156132d7576132d7613419565b604052919050565b600082198211156132f2576132f26133d7565b500190565b600082613306576133066133ed565b500490565b6000816000190483118215151615613325576133256133d7565b500290565b60008282101561333c5761333c6133d7565b500390565b60005b8381101561335c578181015183820152602001613344565b83811115611b135750506000910152565b600181811c9082168061338157607f821691505b602082108114156133a257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156133bc576133bc6133d7565b5060010190565b6000826133d2576133d26133ed565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461124d57600080fd5b801515811461124d57600080fd5b6001600160e01b03198116811461124d57600080fdfea2646970667358221220668a7294a685ffa1a79af4e5be598a4a38267a8c3605c6b937ee6cec471ea66364736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000006694a1dc364ff79298539a8a9ad624fe8a4a170800000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f6d696e742e323131322e72756e2f746f6b656e733732312f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000b67cff4856e87a4c72eb709c39e905496aa1d58e000000000000000000000000881ff3dadfb3fcf5caf7126bb563eea69a06d190000000000000000000000000d06d724318477c4e35acff3a8eff08b47b1264fc0000000000000000000000005f0486ef247e87294351a6d4084d3905c4782c5900000000000000000000000049ab91da7377baa4781b93962567f3761938bb3a00000000000000000000000099b02494e79669a1b868fc376f03fe83ff99072b0000000000000000000000006702098b322dd40e737fe865c863c0b1b3773b8b00000000000000000000000086c7aaac741e4febd00ac21166840aef16bdaace0000000000000000000000003a3c4fc711e046f97a111b6f98a3f99558a2c5b5000000000000000000000000ac163e163ba61451faf11029816686819b3cd1e5000000000000000000000000982e09ebd5bf6f4f9cce5d0c84514fb96d91c5f9000000000000000000000000a442ddf27063320789b59a8fdca5b849cd2cdeac000000000000000000000000a9c1afd0e18737fa1bb902ea067bff1c2e0d4a25000000000000000000000000583b3f844e296b8cbce95d5dc49c84f5d07c92e6000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001d

Deployed Bytecode

0x6080604052600436106102e85760003560e01c80636352211e11610190578063c79b25cf116100dc578063e33b7de311610095578063f3993d111161006f578063f3993d1114610951578063f43a22dc14610971578063f9020e3314610986578063ffe630b5146109a757600080fd5b8063e33b7de3146108fc578063e985e9c514610911578063f2fde38b1461093157600080fd5b8063c79b25cf14610810578063c87b56dd14610830578063cd7c032614610850578063ce7c2ac214610870578063d26ea6c0146108a6578063d79779b2146108c657600080fd5b806391b7f5ed116101495780639b62c02e116101235780639b62c02e1461079d578063a0712d68146107bd578063a22cb465146107d0578063b88d4fde146107f057600080fd5b806391b7f5ed1461073257806395d89b41146107525780639852595c1461076757600080fd5b80636352211e1461068a5780636c0360eb146106aa57806370a08231146106bf578063715018a6146106df5780638b83209b146106f45780638da5cb5b1461071457600080fd5b80633a98ef391161024f57806348b75044116102085780634f6ccce7116101e25780634f6ccce7146105fa57806355f804b31461061a5780635a4fee301461063a5780635bab26e21461065a57600080fd5b806348b75044146105a45780634c5b7a29146105c45780634d44660c146105da57600080fd5b80633a98ef39146104c65780633c8da588146104db578063406072a9146104f157806342842e0e1461053757806342966c6814610557578063438b63001461057757600080fd5b806318160ddd116102a157806318160ddd1461041157806318a4687e14610430578063191655871461045057806323b872dd146104705780632f745c591461049057806332cb6b0c146104b057600080fd5b806301ffc9a714610336578063049c5c491461036b57806306fdde0314610382578063081812fc146103a4578063095ea7b3146103dc5780630f7309e8146103fc57600080fd5b36610331577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561034257600080fd5b50610356610351366004612de3565b6109c7565b60405190151581526020015b60405180910390f35b34801561037757600080fd5b506103806109f2565b005b34801561038e57600080fd5b50610397610a46565b60405161036291906130ba565b3480156103b057600080fd5b506103c46103bf366004612e83565b610ad8565b6040516001600160a01b039091168152602001610362565b3480156103e857600080fd5b506103806103f7366004612d58565b610b60565b34801561040857600080fd5b50610397610c76565b34801561041d57600080fd5b506002545b604051908152602001610362565b34801561043c57600080fd5b5061038061044b366004612d84565b610d04565b34801561045c57600080fd5b5061038061046b366004612af3565b610fc9565b34801561047c57600080fd5b5061038061048b366004612c34565b6110f7565b34801561049c57600080fd5b506104226104ab366004612d58565b611129565b3480156104bc57600080fd5b5061042261294081565b3480156104d257600080fd5b50600654610422565b3480156104e757600080fd5b5061042260125481565b3480156104fd57600080fd5b5061042261050c366004612b10565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801561054357600080fd5b50610380610552366004612c34565b6111dc565b34801561056357600080fd5b50610380610572366004612e83565b6111f7565b34801561058357600080fd5b50610597610592366004612af3565b611250565b60405161036291906130a7565b3480156105b057600080fd5b506103806105bf366004612b10565b611309565b3480156105d057600080fd5b5061042260115481565b3480156105e657600080fd5b506103566105f5366004612cd5565b6114f1565b34801561060657600080fd5b50610422610615366004612e83565b611573565b34801561062657600080fd5b50610380610635366004612e3a565b6115e0565b34801561064657600080fd5b50610380610655366004612bab565b611621565b34801561066657600080fd5b50610356610675366004612af3565b60136020526000908152604090205460ff1681565b34801561069657600080fd5b506103c46106a5366004612e83565b61166b565b3480156106b657600080fd5b506103976116f7565b3480156106cb57600080fd5b506104226106da366004612af3565b611704565b3480156106eb57600080fd5b506103806117d2565b34801561070057600080fd5b506103c461070f366004612e83565b611808565b34801561072057600080fd5b506005546001600160a01b03166103c4565b34801561073e57600080fd5b5061038061074d366004612e83565b611838565b34801561075e57600080fd5b50610397611867565b34801561077357600080fd5b50610422610782366004612af3565b6001600160a01b031660009081526009602052604090205490565b3480156107a957600080fd5b506010546103c4906001600160a01b031681565b6103806107cb366004612e83565b611876565b3480156107dc57600080fd5b506103806107eb366004612d2a565b611a1c565b3480156107fc57600080fd5b5061038061080b366004612c75565b611ae1565b34801561081c57600080fd5b5061038061082b366004612eb5565b611b19565b34801561083c57600080fd5b5061039761084b366004612e83565b611c0e565b34801561085c57600080fd5b50600f546103c4906001600160a01b031681565b34801561087c57600080fd5b5061042261088b366004612af3565b6001600160a01b031660009081526008602052604090205490565b3480156108b257600080fd5b506103806108c1366004612af3565b611c8f565b3480156108d257600080fd5b506104226108e1366004612af3565b6001600160a01b03166000908152600b602052604090205490565b34801561090857600080fd5b50600754610422565b34801561091d57600080fd5b5061035661092c366004612b10565b611cdb565b34801561093d57600080fd5b5061038061094c366004612af3565b611dce565b34801561095d57600080fd5b5061038061096c366004612b49565b611e66565b34801561097d57600080fd5b50610422601481565b34801561099257600080fd5b5060105461035690600160a01b900460ff1681565b3480156109b357600080fd5b506103806109c2366004612e3a565b611ea8565b60006001600160e01b0319821663780e9d6360e01b14806109ec57506109ec82611ee5565b92915050565b6005546001600160a01b03163314610a255760405162461bcd60e51b8152600401610a1c90613228565b60405180910390fd5b6010805460ff60a01b198116600160a01b9182900460ff1615909102179055565b606060008054610a559061336d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a819061336d565b8015610ace5780601f10610aa357610100808354040283529160200191610ace565b820191906000526020600020905b815481529060010190602001808311610ab157829003601f168201915b5050505050905090565b6000610ae382611f35565b610b445760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a1c565b506000908152600360205260409020546001600160a01b031690565b6000610b6b8261166b565b9050806001600160a01b0316836001600160a01b03161415610bd95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a1c565b336001600160a01b0382161480610bf55750610bf58133611cdb565b610c675760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a1c565b610c718383611f7f565b505050565b600e8054610c839061336d565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf9061336d565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b505050505081565b60005b81811015610c7157604080516001808252818301909252600091602080830190803683375050604080516001808252818301909252929350600092915060208083019080368337019050509050600182600081518110610d6957610d69613403565b60209081029190910101526010546001600160a01b031662fdd58e868686818110610d9657610d96613403565b9050602002016020810190610dab9190612af3565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401602060405180830381600087803b158015610df357600080fd5b505af1158015610e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2b9190612e9c565b81600081518110610e3e57610e3e613403565b602002602001018181525050600081600081518110610e5f57610e5f613403565b60200260200101511115610fb4576002548151612940908390600090610e8757610e87613403565b602002602001015182610e9a91906132df565b10610eb75760405162461bcd60e51b8152600401610a1c906130cd565b60005b82600081518110610ecd57610ecd613403565b6020026020010151811015610f2757610f15878787818110610ef157610ef1613403565b9050602002016020810190610f069190612af3565b610f1083856132df565b611fed565b80610f1f816133a8565b915050610eba565b506010546001600160a01b0316630551f3c7878787818110610f4b57610f4b613403565b9050602002016020810190610f609190612af3565b85856040518463ffffffff1660e01b8152600401610f8093929190613071565b600060405180830381600087803b158015610f9a57600080fd5b505af1158015610fae573d6000803e3d6000fd5b50505050505b50508080610fc1906133a8565b915050610d07565b6001600160a01b038116600090815260086020526040902054610ffe5760405162461bcd60e51b8152600401610a1c90613197565b600061100960075490565b61101390476132df565b90506000611040838361103b866001600160a01b031660009081526009602052604090205490565b612069565b90508061105f5760405162461bcd60e51b8152600401610a1c906131dd565b6001600160a01b038316600090815260096020526040812080548392906110879084906132df565b9250508190555080600760008282546110a091906132df565b909155506110b0905083826120a7565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b611102335b826121c0565b61111e5760405162461bcd60e51b8152600401610a1c9061325d565b610c71838383612282565b600061113483611704565b82106111525760405162461bcd60e51b8152600401610a1c906130fa565b6000805b6002548110156111c3576002818154811061117357611173613403565b6000918252602090912001546001600160a01b03868116911614156111b157838214156111a35791506109ec9050565b816111ad816133a8565b9250505b806111bb816133a8565b915050611156565b5060405162461bcd60e51b8152600401610a1c906130fa565b610c7183838360405180602001604052806000815250611ae1565b611200336110fc565b6112445760405162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b2103a3790313ab9371760591b6044820152606401610a1c565b61124d816123d8565b50565b6060600061125d83611704565b90508061127e5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff81111561129957611299613419565b6040519080825280602002602001820160405280156112c2578160200160208202803683370190505b50905060005b82811015611276576112da8582611129565b8282815181106112ec576112ec613403565b602090810291909101015280611301816133a8565b9150506112c8565b6001600160a01b03811660009081526008602052604090205461133e5760405162461bcd60e51b8152600401610a1c90613197565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561139657600080fd5b505afa1580156113aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ce9190612e9c565b6113d891906132df565b90506000611411838361103b87876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b9050806114305760405162461bcd60e51b8152600401610a1c906131dd565b6001600160a01b038085166000908152600c60209081526040808320938716835292905290812080548392906114679084906132df565b90915550506001600160a01b0384166000908152600b6020526040812080548392906114949084906132df565b909155506114a5905084848361245a565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6000805b8281101561156657846001600160a01b0316600285858481811061151b5761151b613403565b905060200201358154811061153257611532613403565b6000918252602090912001546001600160a01b03161461155657600091505061156c565b61155f816133a8565b90506114f5565b50600190505b9392505050565b60025460009082106115dc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a1c565b5090565b6005546001600160a01b0316331461160a5760405162461bcd60e51b8152600401610a1c90613228565b805161161d90600d906020840190612919565b5050565b60005b825181101561166457611652858585848151811061164457611644613403565b602002602001015185611ae1565b8061165c816133a8565b915050611624565b5050505050565b6000806002838154811061168157611681613403565b6000918252602090912001546001600160a01b03169050806109ec5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a1c565b600d8054610c839061336d565b60006001600160a01b03821661176f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a1c565b6000805b6002548110156117cb576002818154811061179057611790613403565b6000918252602090912001546001600160a01b03858116911614156117bb576117b8826133a8565b91505b6117c4816133a8565b9050611773565b5092915050565b6005546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610a1c90613228565b61180660006124ac565b565b6000600a828154811061181d5761181d613403565b6000918252602090912001546001600160a01b031692915050565b6005546001600160a01b031633146118625760405162461bcd60e51b8152600401610a1c90613228565b601255565b606060018054610a559061336d565b601054600160a01b900460ff166118c25760405162461bcd60e51b815260206004820152601060248201526f29b0b6329034b9903737ba1037b832b760811b6044820152606401610a1c565b34601254826118d1919061330b565b1461191e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642066756e64732070726f76696465642e0000000000000000006044820152606401610a1c565b6014811061196e5760405162461bcd60e51b815260206004820152601c60248201527f45786365656473206d617820706572207472616e73616374696f6e2e000000006044820152606401610a1c565b60025461294061197e83836132df565b1061199b5760405162461bcd60e51b8152600401610a1c906130cd565b3332146119f65760405162461bcd60e51b815260206004820152602360248201527f6d73672e73656e64657220646f6573206e6f74206d617463682074782e6f726960448201526233b4b760e91b6064820152608401610a1c565b60005b82811015610c7157611a0a33610f06565b80611a14816133a8565b9150506119f9565b6001600160a01b038216331415611a755760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a1c565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611aeb33836121c0565b611b075760405162461bcd60e51b8152600401610a1c9061325d565b611b13848484846124fe565b50505050565b6005546001600160a01b03163314611b435760405162461bcd60e51b8152600401610a1c90613228565b600082601154611b53919061332a565b1015611b995760405162461bcd60e51b815260206004820152601560248201527422bc31b2b2b2399036b0bc1033b4bb32b0bbb0bc9760591b6044820152606401610a1c565b600254612940611ba984836132df565b10611bc65760405162461bcd60e51b8152600401610a1c906130cd565b60005b83811015611bf157611bdf83610f1083856132df565b80611be9816133a8565b915050611bc9565b508260116000828254611c04919061332a565b9091555050505050565b6060611c1982611f35565b611c5d5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b6044820152606401610a1c565b600d611c6883612531565b604051602001611c79929190612f79565b6040516020818303038152906040529050919050565b6005546001600160a01b03163314611cb95760405162461bcd60e51b8152600401610a1c90613228565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600f5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611d2857600080fd5b505afa158015611d3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d609190612e1d565b6001600160a01b03161480611d8d57506001600160a01b03831660009081526013602052604090205460ff165b15611d9c5760019150506109ec565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b03163314611df85760405162461bcd60e51b8152600401610a1c90613228565b6001600160a01b038116611e5d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a1c565b61124d816124ac565b60005b8151811015611b1357611e968484848481518110611e8957611e89613403565b60200260200101516110f7565b80611ea0816133a8565b915050611e69565b6005546001600160a01b03163314611ed25760405162461bcd60e51b8152600401610a1c90613228565b805161161d90600e906020840190612919565b60006001600160e01b031982166380ac58cd60e01b1480611f1657506001600160e01b03198216635b5e139f60e01b145b806109ec57506301ffc9a760e01b6001600160e01b03198316146109ec565b600254600090821080156109ec575060006001600160a01b031660028381548110611f6257611f62613403565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611fb48261166b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6006546001600160a01b03841660009081526008602052604081205490918391612093908661330b565b61209d91906132f7565b611dc6919061332a565b804710156120f75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a1c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612144576040519150601f19603f3d011682016040523d82523d6000602084013e612149565b606091505b5050905080610c715760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a1c565b60006121cb82611f35565b61222c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a1c565b60006122378361166b565b9050806001600160a01b0316846001600160a01b031614806122725750836001600160a01b031661226784610ad8565b6001600160a01b0316145b80611dc65750611dc68185611cdb565b826001600160a01b03166122958261166b565b6001600160a01b0316146122fd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a1c565b6001600160a01b03821661235f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a1c565b61236a600082611f7f565b816002828154811061237e5761237e613403565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006123e38261166b565b90506123f0600083611f7f565b60006002838154811061240557612405613403565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c7190849061262f565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612509848484612282565b61251584848484612701565b611b135760405162461bcd60e51b8152600401610a1c90613145565b6060816125555750506040805180820190915260018152600360fc1b602082015290565b8160005b811561257f5780612569816133a8565b91506125789050600a836132f7565b9150612559565b60008167ffffffffffffffff81111561259a5761259a613419565b6040519080825280601f01601f1916602001820160405280156125c4576020820181803683370190505b5090505b8415611dc6576125d960018361332a565b91506125e6600a866133c3565b6125f19060306132df565b60f81b81838151811061260657612606613403565b60200101906001600160f81b031916908160001a905350612628600a866132f7565b94506125c8565b6000612684826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661280e9092919063ffffffff16565b805190915015610c7157808060200190518101906126a29190612dc6565b610c715760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a1c565b60006001600160a01b0384163b1561280357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612745903390899088908890600401613034565b602060405180830381600087803b15801561275f57600080fd5b505af192505050801561278f575060408051601f3d908101601f1916820190925261278c91810190612e00565b60015b6127e9573d8080156127bd576040519150601f19603f3d011682016040523d82523d6000602084013e6127c2565b606091505b5080516127e15760405162461bcd60e51b8152600401610a1c90613145565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dc6565b506001949350505050565b6060611dc6848460008585843b6128675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a1c565b600080866001600160a01b031685876040516128839190612f5d565b60006040518083038185875af1925050503d80600081146128c0576040519150601f19603f3d011682016040523d82523d6000602084013e6128c5565b606091505b50915091506128d58282866128e0565b979650505050505050565b606083156128ef57508161156c565b8251156128ff5782518084602001fd5b8160405162461bcd60e51b8152600401610a1c91906130ba565b8280546129259061336d565b90600052602060002090601f016020900481019282612947576000855561298d565b82601f1061296057805160ff191683800117855561298d565b8280016001018555821561298d579182015b8281111561298d578251825591602001919060010190612972565b506115dc9291505b808211156115dc5760008155600101612995565b600067ffffffffffffffff8311156129c3576129c3613419565b6129d6601f8401601f19166020016132ae565b90508281528383830111156129ea57600080fd5b828260208301376000602084830101529392505050565b60008083601f840112612a1357600080fd5b50813567ffffffffffffffff811115612a2b57600080fd5b6020830191508360208260051b8501011115612a4657600080fd5b9250929050565b600082601f830112612a5e57600080fd5b8135602067ffffffffffffffff821115612a7a57612a7a613419565b8160051b612a898282016132ae565b838152828101908684018388018501891015612aa457600080fd5b600093505b85841015612ac7578035835260019390930192918401918401612aa9565b50979650505050505050565b600082601f830112612ae457600080fd5b61156c838335602085016129a9565b600060208284031215612b0557600080fd5b813561156c8161342f565b60008060408385031215612b2357600080fd5b8235612b2e8161342f565b91506020830135612b3e8161342f565b809150509250929050565b600080600060608486031215612b5e57600080fd5b8335612b698161342f565b92506020840135612b798161342f565b9150604084013567ffffffffffffffff811115612b9557600080fd5b612ba186828701612a4d565b9150509250925092565b60008060008060808587031215612bc157600080fd5b8435612bcc8161342f565b93506020850135612bdc8161342f565b9250604085013567ffffffffffffffff80821115612bf957600080fd5b612c0588838901612a4d565b93506060870135915080821115612c1b57600080fd5b50612c2887828801612ad3565b91505092959194509250565b600080600060608486031215612c4957600080fd5b8335612c548161342f565b92506020840135612c648161342f565b929592945050506040919091013590565b60008060008060808587031215612c8b57600080fd5b8435612c968161342f565b93506020850135612ca68161342f565b925060408501359150606085013567ffffffffffffffff811115612cc957600080fd5b612c2887828801612ad3565b600080600060408486031215612cea57600080fd5b8335612cf58161342f565b9250602084013567ffffffffffffffff811115612d1157600080fd5b612d1d86828701612a01565b9497909650939450505050565b60008060408385031215612d3d57600080fd5b8235612d488161342f565b91506020830135612b3e81613444565b60008060408385031215612d6b57600080fd5b8235612d768161342f565b946020939093013593505050565b60008060208385031215612d9757600080fd5b823567ffffffffffffffff811115612dae57600080fd5b612dba85828601612a01565b90969095509350505050565b600060208284031215612dd857600080fd5b815161156c81613444565b600060208284031215612df557600080fd5b813561156c81613452565b600060208284031215612e1257600080fd5b815161156c81613452565b600060208284031215612e2f57600080fd5b815161156c8161342f565b600060208284031215612e4c57600080fd5b813567ffffffffffffffff811115612e6357600080fd5b8201601f81018413612e7457600080fd5b611dc6848235602084016129a9565b600060208284031215612e9557600080fd5b5035919050565b600060208284031215612eae57600080fd5b5051919050565b60008060408385031215612ec857600080fd5b823591506020830135612b3e8161342f565b600081518084526020808501945080840160005b83811015612f0a57815187529582019590820190600101612eee565b509495945050505050565b60008151808452612f2d816020860160208601613341565b601f01601f19169290920160200192915050565b60008151612f53818560208601613341565b9290920192915050565b60008251612f6f818460208701613341565b9190910192915050565b600080845481600182811c915080831680612f9557607f831692505b6020808410821415612fb557634e487b7160e01b86526022600452602486fd5b818015612fc95760018114612fda57613007565b60ff19861689528489019650613007565b60008b81526020902060005b86811015612fff5781548b820152908501908301612fe6565b505084890196505b50505050505061302b61301a8286612f41565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061306790830184612f15565b9695505050505050565b6001600160a01b038416815260606020820181905260009061309590830185612eda565b82810360408401526130678185612eda565b60208152600061156c6020830184612eda565b60208152600061156c6020830184612f15565b60208082526013908201527222bc31b2b232b99036b0bc1039bab838363c9760691b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156132d7576132d7613419565b604052919050565b600082198211156132f2576132f26133d7565b500190565b600082613306576133066133ed565b500490565b6000816000190483118215151615613325576133256133d7565b500290565b60008282101561333c5761333c6133d7565b500390565b60005b8381101561335c578181015183820152602001613344565b83811115611b135750506000910152565b600181811c9082168061338157607f821691505b602082108114156133a257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156133bc576133bc6133d7565b5060010190565b6000826133d2576133d26133ed565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461124d57600080fd5b801515811461124d57600080fd5b6001600160e01b03198116811461124d57600080fdfea2646970667358221220668a7294a685ffa1a79af4e5be598a4a38267a8c3605c6b937ee6cec471ea66364736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000006694a1dc364ff79298539a8a9ad624fe8a4a170800000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f6d696e742e323131322e72756e2f746f6b656e733732312f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000b67cff4856e87a4c72eb709c39e905496aa1d58e000000000000000000000000881ff3dadfb3fcf5caf7126bb563eea69a06d190000000000000000000000000d06d724318477c4e35acff3a8eff08b47b1264fc0000000000000000000000005f0486ef247e87294351a6d4084d3905c4782c5900000000000000000000000049ab91da7377baa4781b93962567f3761938bb3a00000000000000000000000099b02494e79669a1b868fc376f03fe83ff99072b0000000000000000000000006702098b322dd40e737fe865c863c0b1b3773b8b00000000000000000000000086c7aaac741e4febd00ac21166840aef16bdaace0000000000000000000000003a3c4fc711e046f97a111b6f98a3f99558a2c5b5000000000000000000000000ac163e163ba61451faf11029816686819b3cd1e5000000000000000000000000982e09ebd5bf6f4f9cce5d0c84514fb96d91c5f9000000000000000000000000a442ddf27063320789b59a8fdca5b849cd2cdeac000000000000000000000000a9c1afd0e18737fa1bb902ea067bff1c2e0d4a25000000000000000000000000583b3f844e296b8cbce95d5dc49c84f5d07c92e6000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001d

-----Decoded View---------------
Arg [0] : _baseURI (string): https://mint.2112.run/tokens721/
Arg [1] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [2] : _rootPassAddress (address): 0x6694a1Dc364ff79298539A8A9Ad624fe8A4a1708
Arg [3] : _payees (address[]): 0xb67cfF4856e87A4c72eB709c39e905496aA1D58E,0x881FF3dadfb3fCf5cAf7126BB563eEa69A06d190,0xD06D724318477C4e35ACFf3A8eff08b47b1264fc,0x5F0486ef247e87294351A6D4084d3905c4782c59,0x49ab91dA7377bAa4781b93962567f3761938bb3A,0x99B02494e79669a1b868Fc376F03fe83FF99072b,0x6702098b322dD40e737FE865C863c0B1b3773b8B,0x86C7aaac741E4FeBd00Ac21166840aef16bDaacE,0x3a3C4fc711E046f97a111b6f98A3F99558a2C5B5,0xAc163E163ba61451fAF11029816686819B3cd1e5,0x982E09EBd5Bf6F4f9cCe5d0c84514fb96d91c5F9,0xA442dDf27063320789B59A8fdcA5b849Cd2CDeAC,0xa9c1aFd0e18737fa1bB902ea067bFF1c2E0D4A25,0x583b3F844E296b8cbce95D5Dc49C84F5d07c92e6
Arg [4] : _paymentShares (uint256[]): 10,10,10,10,5,5,3,3,3,3,3,3,3,29

-----Encoded View---------------
37 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [2] : 0000000000000000000000006694a1dc364ff79298539a8a9ad624fe8a4a1708
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [6] : 68747470733a2f2f6d696e742e323131322e72756e2f746f6b656e733732312f
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [8] : 000000000000000000000000b67cff4856e87a4c72eb709c39e905496aa1d58e
Arg [9] : 000000000000000000000000881ff3dadfb3fcf5caf7126bb563eea69a06d190
Arg [10] : 000000000000000000000000d06d724318477c4e35acff3a8eff08b47b1264fc
Arg [11] : 0000000000000000000000005f0486ef247e87294351a6d4084d3905c4782c59
Arg [12] : 00000000000000000000000049ab91da7377baa4781b93962567f3761938bb3a
Arg [13] : 00000000000000000000000099b02494e79669a1b868fc376f03fe83ff99072b
Arg [14] : 0000000000000000000000006702098b322dd40e737fe865c863c0b1b3773b8b
Arg [15] : 00000000000000000000000086c7aaac741e4febd00ac21166840aef16bdaace
Arg [16] : 0000000000000000000000003a3c4fc711e046f97a111b6f98a3f99558a2c5b5
Arg [17] : 000000000000000000000000ac163e163ba61451faf11029816686819b3cd1e5
Arg [18] : 000000000000000000000000982e09ebd5bf6f4f9cce5d0c84514fb96d91c5f9
Arg [19] : 000000000000000000000000a442ddf27063320789b59a8fdca5b849cd2cdeac
Arg [20] : 000000000000000000000000a9c1afd0e18737fa1bb902ea067bff1c2e0d4a25
Arg [21] : 000000000000000000000000583b3f844e296b8cbce95d5dc49c84f5d07c92e6
Arg [22] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [23] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [24] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [25] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [26] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [36] : 000000000000000000000000000000000000000000000000000000000000001d


Deployed Bytecode Sourcemap

1212:5389:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3216:40:13;719:10:1;3216:40:13;;;-1:-1:-1;;;;;13075:32:16;;;13057:51;;3246:9:13;13139:2:16;13124:18;;13117:34;13030:18;3216:40:13;;;;;;;1212:5389:2;;;;;529:222:5;;;;;;;;;;-1:-1:-1;529:222:5;;;;;:::i;:::-;;:::i;:::-;;;15230:14:16;;15223:22;15205:41;;15193:2;15178:18;529:222:5;;;;;;;;2970:88:2;;;;;;;;;;;;;:::i;:::-;;2159:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2942:295::-;;;;;;;;;;-1:-1:-1;2942:295:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12831:32:16;;;12813:51;;12801:2;12786:18;2942:295:4;12667:203:16;2480:401:4;;;;;;;;;;-1:-1:-1;2480:401:4;;;;;:::i;:::-;;:::i;1330:38:2:-;;;;;;;;;;;;;:::i;822:108:5:-;;;;;;;;;;-1:-1:-1;909:7:5;:14;822:108;;;27347:25:16;;;27335:2;27320:18;822:108:5;27201:177:16;4049:720:2;;;;;;;;;;-1:-1:-1;4049:720:2;;;;;:::i;:::-;;:::i;4944:553:13:-;;;;;;;;;;-1:-1:-1;4944:553:13;;;;;:::i;:::-;;:::i;3956:364:4:-;;;;;;;;;;-1:-1:-1;3956:364:4;;;;;:::i;:::-;;:::i;1283:478:5:-;;;;;;;;;;-1:-1:-1;1283:478:5;;;;;:::i;:::-;;:::i;1527:55:2:-;;;;;;;;;;;;1577:5;1527:55;;3341:89:13;;;;;;;;;;-1:-1:-1;3411:12:13;;3341:89;;1706:59:2;;;;;;;;;;;;;;;;4433:133:13;;;;;;;;;;-1:-1:-1;4433:133:13;;;;;:::i;:::-;-1:-1:-1;;;;;4529:21:13;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;4386:179:4;;;;;;;;;;-1:-1:-1;4386:179:4;;;;;:::i;:::-;;:::i;4775:155:2:-;;;;;;;;;;-1:-1:-1;4775:155:2;;;;;:::i;:::-;;:::i;4936:391::-;;;;;;;;;;-1:-1:-1;4936:391:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5758:628:13:-;;;;;;;;;;-1:-1:-1;5758:628:13;;;;;:::i;:::-;;:::i;1588:53:2:-;;;;;;;;;;;;;;;;5812:264;;;;;;;;;;-1:-1:-1;5812:264:2;;;;;:::i;:::-;;:::i;1002:202:5:-;;;;;;;;;;-1:-1:-1;1002:202:5;;;;;:::i;:::-;;:::i;2259:96:2:-;;;;;;;;;;-1:-1:-1;2259:96:2;;;;;:::i;:::-;;:::i;5555:251::-;;;;;;;;;;-1:-1:-1;5555:251:2;;;;;:::i;:::-;;:::i;1772:44::-;;;;;;;;;;-1:-1:-1;1772:44:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;1784:313:4;;;;;;;;;;-1:-1:-1;1784:313:4;;;;;:::i;:::-;;:::i;1289:35:2:-;;;;;;;;;;;;;:::i;1350:377:4:-;;;;;;;;;;-1:-1:-1;1350:377:4;;;;;:::i;:::-;;:::i;1661:101:12:-;;;;;;;;;;;;;:::i;4652:98:13:-;;;;;;;;;;-1:-1:-1;4652:98:13;;;;;:::i;:::-;;:::i;1029:85:12:-;;;;;;;;;;-1:-1:-1;1101:6:12;;-1:-1:-1;;;;;1101:6:12;1029:85;;2361:97:2;;;;;;;;;;-1:-1:-1;2361:97:2;;;;;:::i;:::-;;:::i;2321:102:4:-;;;;;;;;;;;;;:::i;4163:107:13:-;;;;;;;;;;-1:-1:-1;4163:107:13;;;;;:::i;:::-;-1:-1:-1;;;;;4245:18:13;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;1433:43:2;;;;;;;;;;-1:-1:-1;1433:43:2;;;;-1:-1:-1;;;;;1433:43:2;;;3064:596;;;;;;:::i;:::-;;:::i;3304:318:4:-;;;;;;;;;;-1:-1:-1;3304:318:4;;;;;:::i;:::-;;:::i;4631:354::-;;;;;;;;;;-1:-1:-1;4631:354:4;;;;;:::i;:::-;;:::i;3666:377:2:-;;;;;;;;;;-1:-1:-1;3666:377:2;;;;;:::i;:::-;;:::i;2578:236::-;;;;;;;;;;-1:-1:-1;2578:236:2;;;;;:::i;:::-;;:::i;1379:48::-;;;;;;;;;;-1:-1:-1;1379:48:2;;;;-1:-1:-1;;;;;1379:48:2;;;3966:103:13;;;;;;;;;;-1:-1:-1;3966:103:13;;;;;:::i;:::-;-1:-1:-1;;;;;4046:16:13;4020:7;4046:16;;;:7;:16;;;;;;;3966:103;2820:144:2;;;;;;;;;;-1:-1:-1;2820:144:2;;;;;:::i;:::-;;:::i;3763:117:13:-;;;;;;;;;;-1:-1:-1;3763:117:13;;;;;:::i;:::-;-1:-1:-1;;;;;3847:26:13;3821:7;3847:26;;;:19;:26;;;;;;;3763:117;3519:93;;;;;;;;;;-1:-1:-1;3591:14:13;;3519:93;;6082:360:2;;;;;;;;;;-1:-1:-1;6082:360:2;;;;;:::i;:::-;;:::i;1911:198:12:-;;;;;;;;;;-1:-1:-1;1911:198:12;;;;;:::i;:::-;;:::i;5333:216:2:-;;;;;;;;;;-1:-1:-1;5333:216:2;;;;;:::i;:::-;;:::i;1648:52::-;;;;;;;;;;;;1698:2;1648:52;;1483:38;;;;;;;;;;-1:-1:-1;1483:38:2;;;;-1:-1:-1;;;1483:38:2;;;;;;2464:108;;;;;;;;;;-1:-1:-1;2464:108:2;;;;;:::i;:::-;;:::i;529:222:5:-;631:4;-1:-1:-1;;;;;;654:50:5;;-1:-1:-1;;;654:50:5;;:90;;;708:36;732:11;708:23;:36::i;:::-;647:97;529:222;-1:-1:-1;;529:222:5:o;2970:88:2:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;;;;;;;;;3041:10:2::1;::::0;;-1:-1:-1;;;;3027:24:2;::::1;-1:-1:-1::0;;;3041:10:2;;;::::1;;;3040:11;3027:24:::0;;::::1;;::::0;;2970:88::o;2159:98:4:-;2213:13;2245:5;2238:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2159:98;:::o;2942:295::-;3058:7;3102:16;3110:7;3102;:16::i;:::-;3081:107;;;;-1:-1:-1;;;3081:107:4;;22815:2:16;3081:107:4;;;22797:21:16;22854:2;22834:18;;;22827:30;22893:34;22873:18;;;22866:62;-1:-1:-1;;;22944:18:16;;;22937:42;22996:19;;3081:107:4;22613:408:16;3081:107:4;-1:-1:-1;3206:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;3206:24:4;;2942:295::o;2480:401::-;2560:13;2576:23;2591:7;2576:14;:23::i;:::-;2560:39;;2623:5;-1:-1:-1;;;;;2617:11:4;:2;-1:-1:-1;;;;;2617:11:4;;;2609:57;;;;-1:-1:-1;;;2609:57:4;;24349:2:16;2609:57:4;;;24331:21:16;24388:2;24368:18;;;24361:30;24427:34;24407:18;;;24400:62;-1:-1:-1;;;24478:18:16;;;24471:31;24519:19;;2609:57:4;24147:397:16;2609:57:4;719:10:1;-1:-1:-1;;;;;2698:21:4;;;;:62;;-1:-1:-1;2723:37:4;2740:5;719:10:1;6082:360:2;:::i;2723:37:4:-;2677:165;;;;-1:-1:-1;;;2677:165:4;;20867:2:16;2677:165:4;;;20849:21:16;20906:2;20886:18;;;20879:30;20945:34;20925:18;;;20918:62;21016:26;20996:18;;;20989:54;21060:19;;2677:165:4;20665:420:16;2677:165:4;2853:21;2862:2;2866:7;2853:8;:21::i;:::-;2550:331;2480:401;;:::o;1330:38:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4049:720::-;4121:6;4116:647;4133:16;;;4116:647;;;4193:16;;;4207:1;4193:16;;;;;;;;;4170:20;;4193:16;;;;;;;;;-1:-1:-1;;4250:16:2;;;4264:1;4250:16;;;;;;;;;4170:39;;-1:-1:-1;4223:24:2;;4250:16;-1:-1:-1;4250:16:2;;;;;;;;;;;-1:-1:-1;4250:16:2;4223:43;;4289:1;4280:3;4284:1;4280:6;;;;;;;;:::i;:::-;;;;;;;;;;:10;4320:15;;-1:-1:-1;;;;;4320:15:2;4317:29;4347:5;;4353:1;4347:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4317:42;;-1:-1:-1;;;;;;4317:42:2;;;;;;;-1:-1:-1;;;;;13075:32:16;;;4317:42:2;;;13057:51:16;4357:1:2;13124:18:16;;;13117:34;13030:18;;4317:42:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4304:7;4312:1;4304:10;;;;;;;;:::i;:::-;;;;;;:55;;;;;4390:1;4377:7;4385:1;4377:10;;;;;;;;:::i;:::-;;;;;;;:14;4373:380;;;4433:7;:14;4487:10;;1577:5;;4487:7;;4411:19;;4487:10;;;;:::i;:::-;;;;;;;4473:11;:24;;;;:::i;:::-;:37;4465:69;;;;-1:-1:-1;;;4465:69:2;;;;;;;:::i;:::-;4557:6;4552:111;4573:7;4581:1;4573:10;;;;;;;;:::i;:::-;;;;;;;4569:1;:14;4552:111;;;4612:32;4618:5;;4624:1;4618:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4628:15;4642:1;4628:11;:15;:::i;:::-;4612:5;:32::i;:::-;4585:3;;;;:::i;:::-;;;;4552:111;;;-1:-1:-1;4683:15:2;;-1:-1:-1;;;;;4683:15:2;4680:34;4715:5;;4721:1;4715:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4725:3;4730:7;4680:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4393:360;4373:380;4156:607;;4151:3;;;;;:::i;:::-;;;;4116:647;;4944:553:13;-1:-1:-1;;;;;5019:16:13;;5038:1;5019:16;;;:7;:16;;;;;;5011:71;;;;-1:-1:-1;;;5011:71:13;;;;;;;:::i;:::-;5093:21;5141:15;3591:14;;;3519:93;5141:15;5117:39;;:21;:39;:::i;:::-;5093:63;;5166:15;5184:58;5200:7;5209:13;5224:17;5233:7;-1:-1:-1;;;;;4245:18:13;4219:7;4245:18;;;:9;:18;;;;;;;4163:107;5224:17;5184:15;:58::i;:::-;5166:76;-1:-1:-1;5261:12:13;5253:68;;;;-1:-1:-1;;;5253:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;5332:18:13;;;;;;:9;:18;;;;;:29;;5354:7;;5332:18;:29;;5354:7;;5332:29;:::i;:::-;;;;;;;;5389:7;5371:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;5407:35:13;;-1:-1:-1;5425:7:13;5434;5407:17;:35::i;:::-;5457:33;;;-1:-1:-1;;;;;13075:32:16;;13057:51;;13139:2;13124:18;;13117:34;;;5457:33:13;;13030:18:16;5457:33:13;;;;;;;5001:496;;4944:553;:::o;3956:364:4:-;4158:41;719:10:1;4177:12:4;4191:7;4158:18;:41::i;:::-;4137:137;;;;-1:-1:-1;;;4137:137:4;;;;;;;:::i;:::-;4285:28;4295:4;4301:2;4305:7;4285:9;:28::i;1283:478:5:-;1380:15;1423:16;1433:5;1423:9;:16::i;:::-;1415:5;:24;1407:80;;;;-1:-1:-1;;;1407:80:5;;;;;;;:::i;:::-;1498:10;1522:6;1518:173;1534:7;:14;1530:18;;1518:173;;;1580:7;1588:1;1580:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1571:19:5;;;1580:10;;1571:19;1568:113;;;1621:5;1612;:14;1609:57;;;1635:1;-1:-1:-1;1628:8:5;;-1:-1:-1;1628:8:5;1609:57;1659:7;;;;:::i;:::-;;;;1609:57;1550:3;;;;:::i;:::-;;;;1518:173;;;;1701:53;;-1:-1:-1;;;1701:53:5;;;;;;;:::i;4386:179:4:-;4519:39;4536:4;4542:2;4546:7;4519:39;;;;;;;;;;;;:16;:39::i;4775:155:2:-;4832:41;719:10:1;4851:12:2;640:96:1;4832:41:2;4824:75;;;;-1:-1:-1;;;4824:75:2;;23999:2:16;4824:75:2;;;23981:21:16;24038:2;24018:18;;;24011:30;-1:-1:-1;;;24057:18:16;;;24050:51;24118:18;;4824:75:2;23797:345:16;4824:75:2;4909:14;4915:7;4909:5;:14::i;:::-;4775:155;:::o;4936:391::-;4996:16;5024:18;5045:17;5055:6;5045:9;:17::i;:::-;5024:38;-1:-1:-1;5076:15:2;5072:44;;5100:16;;;5114:1;5100:16;;;;;;;;;;;-1:-1:-1;5093:23:2;4936:391;-1:-1:-1;;;4936:391:2:o;5072:44::-;5127:25;5169:10;5155:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5155:25:2;;5127:53;;5195:9;5190:106;5210:10;5206:1;:14;5190:106;;;5255:30;5275:6;5283:1;5255:19;:30::i;:::-;5241:8;5250:1;5241:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;5222:3;;;;:::i;:::-;;;;5190:106;;5758:628:13;-1:-1:-1;;;;;5839:16:13;;5858:1;5839:16;;;:7;:16;;;;;;5831:71;;;;-1:-1:-1;;;5831:71:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;3847:26:13;;5913:21;3847:26;;;:19;:26;;;;;;5937:30;;-1:-1:-1;;;5937:30:13;;5961:4;5937:30;;;12813:51:16;-1:-1:-1;;;;;5937:15:13;;;;;12786:18:16;;5937:30:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;5913:77;;6000:15;6018:65;6034:7;6043:13;6058:24;6067:5;6074:7;-1:-1:-1;;;;;4529:21:13;;;4503:7;4529:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4433:133;6018:65;6000:83;-1:-1:-1;6102:12:13;6094:68;;;;-1:-1:-1;;;6094:68:13;;;;;;;:::i;:::-;-1:-1:-1;;;;;6173:21:13;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;6207:7;;6173:21;:41;;6207:7;;6173:41;:::i;:::-;;;;-1:-1:-1;;;;;;;6224:26:13;;;;;;:19;:26;;;;;:37;;6254:7;;6224:26;:37;;6254:7;;6224:37;:::i;:::-;;;;-1:-1:-1;6272:47:13;;-1:-1:-1;6295:5:13;6302:7;6311;6272:22;:47::i;:::-;6334:45;;;-1:-1:-1;;;;;13075:32:16;;;13057:51;;13139:2;13124:18;;13117:34;;;6334:45:13;;;;;13030:18:16;6334:45:13;;;;;;;5821:565;;5758:628;;:::o;5812:264:2:-;5901:4;5920:9;5916:132;5931:20;;;5916:132;;;6000:7;-1:-1:-1;;;;;5975:32:2;:7;5983:9;;5993:1;5983:12;;;;;;;:::i;:::-;;;;;;;5975:21;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;5975:21:2;:32;5972:65;;6032:5;6025:12;;;;;5972:65;5953:3;;;:::i;:::-;;;5916:132;;;;6065:4;6058:11;;5812:264;;;;;;:::o;1002:202:5:-;1112:7;:14;1077:7;;1104:22;;1096:79;;;;-1:-1:-1;;;1096:79:5;;26579:2:16;1096:79:5;;;26561:21:16;26618:2;26598:18;;;26591:30;26657:34;26637:18;;;26630:62;-1:-1:-1;;;26708:18:16;;;26701:42;26760:19;;1096:79:5;26377:408:16;1096:79:5;-1:-1:-1;1192:5:5;1002:202::o;2259:96:2:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;2330:18:2;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2259:96:::0;:::o;5555:251::-;5684:9;5679:121;5703:9;:16;5699:1;:20;5679:121;;;5740:49;5757:5;5764:3;5769:9;5779:1;5769:12;;;;;;;;:::i;:::-;;;;;;;5783:5;5740:16;:49::i;:::-;5721:3;;;;:::i;:::-;;;;5679:121;;;;5555:251;;;;:::o;1784:313:4:-;1896:7;1919:13;1935:7;1943;1935:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1935:16:4;;-1:-1:-1;1982:19:4;1961:107;;;;-1:-1:-1;;;1961:107:4;;21703:2:16;1961:107:4;;;21685:21:16;21742:2;21722:18;;;21715:30;21781:34;21761:18;;;21754:62;-1:-1:-1;;;21832:18:16;;;21825:39;21881:19;;1961:107:4;21501:405:16;1289:35:2;;;;;;;:::i;1350:377:4:-;1467:4;-1:-1:-1;;;;;1496:19:4;;1488:74;;;;-1:-1:-1;;;1488:74:4;;21292:2:16;1488:74:4;;;21274:21:16;21331:2;21311:18;;;21304:30;21370:34;21350:18;;;21343:62;-1:-1:-1;;;21421:18:16;;;21414:40;21471:19;;1488:74:4;21090:406:16;1488:74:4;1573:10;1598:6;1593:106;1610:7;:14;1606:18;;1593:106;;;1656:7;1664:1;1656:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;1647:19:4;;;1656:10;;1647:19;1643:45;;;1681:7;;;:::i;:::-;;;1643:45;1626:3;;;:::i;:::-;;;1593:106;;;-1:-1:-1;1715:5:4;1350:377;-1:-1:-1;;1350:377:4:o;1661:101:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;4652:98:13:-;4703:7;4729;4737:5;4729:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;4729:14:13;;4652:98;-1:-1:-1;;4652:98:13:o;2361:97:2:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;2427:10:2::1;:24:::0;2361:97::o;2321:102:4:-;2377:13;2409:7;2402:14;;;;;:::i;3064:596:2:-;3126:10;;-1:-1:-1;;;3126:10:2;;;;3118:39;;;;-1:-1:-1;;;3118:39:2;;24751:2:16;3118:39:2;;;24733:21:16;24790:2;24770:18;;;24763:30;-1:-1:-1;;;24809:18:16;;;24802:46;24865:18;;3118:39:2;24549:340:16;3118:39:2;3197:9;3183:10;;3175:5;:18;;;;:::i;:::-;:31;3167:67;;;;-1:-1:-1;;;3167:67:2;;22113:2:16;3167:67:2;;;22095:21:16;22152:2;22132:18;;;22125:30;22191:25;22171:18;;;22164:53;22234:18;;3167:67:2;21911:347:16;3167:67:2;1698:2;3252:5;:18;3244:59;;;;-1:-1:-1;;;3244:59:2;;25864:2:16;3244:59:2;;;25846:21:16;25903:2;25883:18;;;25876:30;25942;25922:18;;;25915:58;25990:18;;3244:59:2;25662:352:16;3244:59:2;3335:7;:14;1577:5;3367:19;3381:5;3335:14;3367:19;:::i;:::-;:32;3359:64;;;;-1:-1:-1;;;3359:64:2;;;;;;;:::i;:::-;3481:10;3495:9;3481:23;3473:71;;;;-1:-1:-1;;;3473:71:2;;16042:2:16;3473:71:2;;;16024:21:16;16081:2;16061:18;;;16054:30;16120:34;16100:18;;;16093:62;-1:-1:-1;;;16171:18:16;;;16164:33;16214:19;;3473:71:2;15840:399:16;3473:71:2;3568:6;3564:90;3580:5;3576:1;:9;3564:90;;;3607:36;719:10:1;3613:12:2;640:96:1;3607:36:2;3587:3;;;;:::i;:::-;;;;3564:90;;3304:318:4;-1:-1:-1;;;;;3434:24:4;;719:10:1;3434:24:4;;3426:62;;;;-1:-1:-1;;;3426:62:4;;18496:2:16;3426:62:4;;;18478:21:16;18535:2;18515:18;;;18508:30;18574:27;18554:18;;;18547:55;18619:18;;3426:62:4;18294:349:16;3426:62:4;719:10:1;3499:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;3499:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;3499:53:4;;;;;;;;;;3567:48;;15205:41:16;;;3499:42:4;;719:10:1;3567:48:4;;15178:18:16;3567:48:4;;;;;;;3304:318;;:::o;4631:354::-;4813:41;719:10:1;4846:7:4;4813:18;:41::i;:::-;4792:137;;;;-1:-1:-1;;;4792:137:4;;;;;;;:::i;:::-;4939:39;4953:4;4959:2;4963:7;4972:5;4939:13;:39::i;:::-;4631:354;;;;:::o;3666:377:2:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;3767:1:2::1;3759:4;3744:12;;:19;;;;:::i;:::-;:24;;3736:58;;;::::0;-1:-1:-1;;;3736:58:2;;25514:2:16;3736:58:2::1;::::0;::::1;25496:21:16::0;25553:2;25533:18;;;25526:30;-1:-1:-1;;;25572:18:16;;;25565:51;25633:18;;3736:58:2::1;25312:345:16::0;3736:58:2::1;3826:7;:14:::0;1577:5:::1;3858:18;3872:4:::0;3826:14;3858:18:::1;:::i;:::-;:31;3850:63;;;;-1:-1:-1::0;;;3850:63:2::1;;;;;;;:::i;:::-;3928:6;3923:84;3944:4;3940:1;:8;3923:84;;;3969:27;3975:3:::0;3980:15:::1;3994:1:::0;3980:11;:15:::1;:::i;3969:27::-;3950:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3923:84;;;;4032:4;4016:12;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;3666:377:2:o;2578:236::-;2644:13;2677:17;2685:8;2677:7;:17::i;:::-;2669:51;;;;-1:-1:-1;;;2669:51:2;;22465:2:16;2669:51:2;;;22447:21:16;22504:2;22484:18;;;22477:30;-1:-1:-1;;;22523:18:16;;;22516:51;22584:18;;2669:51:2;22263:345:16;2669:51:2;2761:7;2770:26;2787:8;2770:16;:26::i;:::-;2744:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2730:77;;2578:236;;;:::o;2820:144::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;2913:20:2::1;:44:::0;;-1:-1:-1;;;;;;2913:44:2::1;-1:-1:-1::0;;;;;2913:44:2;;;::::1;::::0;;;::::1;::::0;;2820:144::o;6082:360::-;6254:20;;6297:29;;-1:-1:-1;;;6297:29:2;;-1:-1:-1;;;;;12831:32:16;;;6297:29:2;;;12813:51:16;6180:4:2;;6254:20;;;6289:50;;;;6254:20;;6297:21;;12786:18:16;;6297:29:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6289:50:2;;:76;;;-1:-1:-1;;;;;;6343:22:2;;;;;;:12;:22;;;;;;;;6289:76;6285:93;;;6374:4;6367:11;;;;;6285:93;-1:-1:-1;;;;;3852:25:4;;;3825:4;3852:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;6395:40:2;6388:47;6082:360;-1:-1:-1;;;;6082:360:2:o;1911:198:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:12;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:12;;17277:2:16;1991:73:12::1;::::0;::::1;17259:21:16::0;17316:2;17296:18;;;17289:30;17355:34;17335:18;;;17328:62;-1:-1:-1;;;17406:18:16;;;17399:36;17452:19;;1991:73:12::1;17075:402:16::0;1991:73:12::1;2074:28;2093:8;2074:18;:28::i;5333:216:2:-:0;5438:9;5433:110;5457:9;:16;5453:1;:20;5433:110;;;5494:38;5507:5;5514:3;5519:9;5529:1;5519:12;;;;;;;;:::i;:::-;;;;;;;5494;:38::i;:::-;5475:3;;;;:::i;:::-;;;;5433:110;;2464:108;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;2541:24:2;;::::1;::::0;:10:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;947:344:4:-:0;1089:4;-1:-1:-1;;;;;;1128:40:4;;-1:-1:-1;;;1128:40:4;;:104;;-1:-1:-1;;;;;;;1184:48:4;;-1:-1:-1;;;1184:48:4;1128:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:3;;;1248:36:4;829:155:3;6491:153:4;6589:7;:14;6556:4;;6579:24;;:58;;;;;6635:1;-1:-1:-1;;;;;6607:30:4;:7;6615;6607:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;6607:16:4;:30;;6572:65;6491:153;-1:-1:-1;;6491:153:4:o;10379:171::-;10453:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;10453:29:4;-1:-1:-1;;;;;10453:29:4;;;;;;;;:24;;10506:23;10453:24;10506:14;:23::i;:::-;-1:-1:-1;;;;;10497:46:4;;;;;;;;;;;10379:171;;:::o;6448:151:2:-;6528:7;:16;;;;;;;-1:-1:-1;6528:16:2;;;;;;;-1:-1:-1;;;;;;6528:16:2;-1:-1:-1;;;;;6528:16:2;;;;;;;;6559:33;;6584:7;;-1:-1:-1;6559:33:2;;-1:-1:-1;;6559:33:2;6448:151;;:::o;6558:242:13:-;6763:12;;-1:-1:-1;;;;;6743:16:13;;6700:7;6743:16;;;:7;:16;;;;;;6700:7;;6778:15;;6727:32;;:13;:32;:::i;:::-;6726:49;;;;:::i;:::-;:67;;;;:::i;2065:312:0:-;2179:6;2154:21;:31;;2146:73;;;;-1:-1:-1;;;2146:73:0;;19277:2:16;2146:73:0;;;19259:21:16;19316:2;19296:18;;;19289:30;19355:31;19335:18;;;19328:59;19404:18;;2146:73:0;19075:353:16;2146:73:0;2231:12;2249:9;-1:-1:-1;;;;;2249:14:0;2271:6;2249:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2230:52;;;2300:7;2292:78;;;;-1:-1:-1;;;2292:78:0;;18850:2:16;2292:78:0;;;18832:21:16;18889:2;18869:18;;;18862:30;18928:34;18908:18;;;18901:62;18999:28;18979:18;;;18972:56;19045:19;;2292:78:0;18648:422:16;6802:438:4;6927:4;6968:16;6976:7;6968;:16::i;:::-;6947:107;;;;-1:-1:-1;;;6947:107:4;;20042:2:16;6947:107:4;;;20024:21:16;20081:2;20061:18;;;20054:30;20120:34;20100:18;;;20093:62;-1:-1:-1;;;20171:18:16;;;20164:42;20223:19;;6947:107:4;19840:408:16;6947:107:4;7064:13;7080:23;7095:7;7080:14;:23::i;:::-;7064:39;;7132:5;-1:-1:-1;;;;;7121:16:4;:7;-1:-1:-1;;;;;7121:16:4;;:63;;;;7177:7;-1:-1:-1;;;;;7153:31:4;:20;7165:7;7153:11;:20::i;:::-;-1:-1:-1;;;;;7153:31:4;;7121:63;:111;;;;7200:32;7217:5;7224:7;7200:16;:32::i;9733:535::-;9900:4;-1:-1:-1;;;;;9873:31:4;:23;9888:7;9873:14;:23::i;:::-;-1:-1:-1;;;;;9873:31:4;;9852:119;;;;-1:-1:-1;;;9852:119:4;;23589:2:16;9852:119:4;;;23571:21:16;23628:2;23608:18;;;23601:30;23667:34;23647:18;;;23640:62;-1:-1:-1;;;23718:18:16;;;23711:39;23767:19;;9852:119:4;23387:405:16;9852:119:4;-1:-1:-1;;;;;9989:16:4;;9981:65;;;;-1:-1:-1;;;9981:65:4;;18091:2:16;9981:65:4;;;18073:21:16;18130:2;18110:18;;;18103:30;18169:34;18149:18;;;18142:62;-1:-1:-1;;;18220:18:16;;;18213:34;18264:19;;9981:65:4;17889:400:16;9981:65:4;10158:29;10175:1;10179:7;10158:8;:29::i;:::-;10216:2;10197:7;10205;10197:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;10197:21:4;-1:-1:-1;;;;;10197:21:4;;;;;;10234:27;;10253:7;;10234:27;;;;;;;;;;10197:16;10234:27;9733:535;;;:::o;9087:322::-;9146:13;9162:23;9177:7;9162:14;:23::i;:::-;9146:39;;9282:29;9299:1;9303:7;9282:8;:29::i;:::-;9348:1;9321:7;9329;9321:16;;;;;;;;:::i;:::-;;;;;;;;;:29;;-1:-1:-1;;;;;;9321:29:4;-1:-1:-1;;;;;9321:29:4;;;;;;9366:36;;9394:7;;9366:36;;;;;9321:16;;9366:36;9136:273;9087:322;:::o;687:205:14:-;826:58;;;-1:-1:-1;;;;;13075:32:16;;826:58:14;;;13057:51:16;13124:18;;;;13117:34;;;826:58:14;;;;;;;;;;13030:18:16;;;;826:58:14;;;;;;;;-1:-1:-1;;;;;826:58:14;-1:-1:-1;;;826:58:14;;;799:86;;819:5;;799:19;:86::i;2263:187:12:-;2355:6;;;-1:-1:-1;;;;;2371:17:12;;;-1:-1:-1;;;;;;2371:17:12;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;5847:341:4:-;5998:28;6008:4;6014:2;6018:7;5998:9;:28::i;:::-;6057:48;6080:4;6086:2;6090:7;6099:5;6057:22;:48::i;:::-;6036:145;;;;-1:-1:-1;;;6036:145:4;;;;;;;:::i;328:703:15:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:15;;;;;;;;;;;;-1:-1:-1;;;627:10:15;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:15;;-1:-1:-1;773:2:15;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:15;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:15;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:15;;;;;;;;-1:-1:-1;972:11:15;981:2;972:11;;:::i;:::-;;;844:150;;3193:706:14;3612:23;3638:69;3666:4;3638:69;;;;;;;;;;;;;;;;;3646:5;-1:-1:-1;;;;;3638:27:14;;;:69;;;;;:::i;:::-;3721:17;;3612:95;;-1:-1:-1;3721:21:14;3717:176;;3816:10;3805:30;;;;;;;;;;;;:::i;:::-;3797:85;;;;-1:-1:-1;;;3797:85:14;;26992:2:16;3797:85:14;;;26974:21:16;27031:2;27011:18;;;27004:30;27070:34;27050:18;;;27043:62;-1:-1:-1;;;27121:18:16;;;27114:40;27171:19;;3797:85:14;26790:406:16;11103:950:4;11253:4;-1:-1:-1;;;;;11273:13:4;;1087:20:0;1133:8;11269:778:4;;11324:170;;-1:-1:-1;;;11324:170:4;;-1:-1:-1;;;;;11324:36:4;;;;;:170;;719:10:1;;11416:4:4;;11442:7;;11471:5;;11324:170;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11324:170:4;;;;;;;;-1:-1:-1;;11324:170:4;;;;;;;;;;;;:::i;:::-;;;11304:691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11673:13:4;;11669:312;;11715:106;;-1:-1:-1;;;11715:106:4;;;;;;;:::i;11669:312::-;11933:6;11927:13;11918:6;11914:2;11910:15;11903:38;11304:691;-1:-1:-1;;;;;;11556:51:4;-1:-1:-1;;;11556:51:4;;-1:-1:-1;11549:58:4;;11269:778;-1:-1:-1;12032:4:4;11103:950;;;;;;:::o;3514:223:0:-;3647:12;3678:52;3700:6;3708:4;3714:1;3717:12;3647;1087:20;;4881:60;;;;-1:-1:-1;;;4881:60:0;;26221:2:16;4881:60:0;;;26203:21:16;26260:2;26240:18;;;26233:30;26299:31;26279:18;;;26272:59;26348:18;;4881:60:0;26019:353:16;4881:60:0;4953:12;4967:23;4994:6;-1:-1:-1;;;;;4994:11:0;5013:5;5020:4;4994:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4952:73;;;;5042:51;5059:7;5068:10;5080:12;5042:16;:51::i;:::-;5035:58;4601:499;-1:-1:-1;;;;;;;4601:499:0:o;7214:692::-;7360:12;7388:7;7384:516;;;-1:-1:-1;7418:10:0;7411:17;;7384:516;7529:17;;:21;7525:365;;7723:10;7717:17;7783:15;7770:10;7766:2;7762:19;7755:44;7525:365;7862:12;7855:20;;-1:-1:-1;;;7855:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:16;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:16;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:367::-;488:8;498:6;552:3;545:4;537:6;533:17;529:27;519:55;;570:1;567;560:12;519:55;-1:-1:-1;593:20:16;;636:18;625:30;;622:50;;;668:1;665;658:12;622:50;705:4;697:6;693:17;681:29;;765:3;758:4;748:6;745:1;741:14;733:6;729:27;725:38;722:47;719:67;;;782:1;779;772:12;719:67;425:367;;;;;:::o;797:723::-;851:5;904:3;897:4;889:6;885:17;881:27;871:55;;922:1;919;912:12;871:55;958:6;945:20;984:4;1007:18;1003:2;1000:26;997:52;;;1029:18;;:::i;:::-;1075:2;1072:1;1068:10;1098:28;1122:2;1118;1114:11;1098:28;:::i;:::-;1160:15;;;1191:12;;;;1223:15;;;1257;;;1253:24;;1250:33;-1:-1:-1;1247:53:16;;;1296:1;1293;1286:12;1247:53;1318:1;1309:10;;1328:163;1342:2;1339:1;1336:9;1328:163;;;1399:17;;1387:30;;1360:1;1353:9;;;;;1437:12;;;;1469;;1328:163;;;-1:-1:-1;1509:5:16;797:723;-1:-1:-1;;;;;;;797:723:16:o;1525:220::-;1567:5;1620:3;1613:4;1605:6;1601:17;1597:27;1587:55;;1638:1;1635;1628:12;1587:55;1660:79;1735:3;1726:6;1713:20;1706:4;1698:6;1694:17;1660:79;:::i;1750:247::-;1809:6;1862:2;1850:9;1841:7;1837:23;1833:32;1830:52;;;1878:1;1875;1868:12;1830:52;1917:9;1904:23;1936:31;1961:5;1936:31;:::i;2262:388::-;2330:6;2338;2391:2;2379:9;2370:7;2366:23;2362:32;2359:52;;;2407:1;2404;2397:12;2359:52;2446:9;2433:23;2465:31;2490:5;2465:31;:::i;:::-;2515:5;-1:-1:-1;2572:2:16;2557:18;;2544:32;2585:33;2544:32;2585:33;:::i;:::-;2637:7;2627:17;;;2262:388;;;;;:::o;2655:624::-;2757:6;2765;2773;2826:2;2814:9;2805:7;2801:23;2797:32;2794:52;;;2842:1;2839;2832:12;2794:52;2881:9;2868:23;2900:31;2925:5;2900:31;:::i;:::-;2950:5;-1:-1:-1;3007:2:16;2992:18;;2979:32;3020:33;2979:32;3020:33;:::i;:::-;3072:7;-1:-1:-1;3130:2:16;3115:18;;3102:32;3157:18;3146:30;;3143:50;;;3189:1;3186;3179:12;3143:50;3212:61;3265:7;3256:6;3245:9;3241:22;3212:61;:::i;:::-;3202:71;;;2655:624;;;;;:::o;3284:844::-;3404:6;3412;3420;3428;3481:3;3469:9;3460:7;3456:23;3452:33;3449:53;;;3498:1;3495;3488:12;3449:53;3537:9;3524:23;3556:31;3581:5;3556:31;:::i;:::-;3606:5;-1:-1:-1;3663:2:16;3648:18;;3635:32;3676:33;3635:32;3676:33;:::i;:::-;3728:7;-1:-1:-1;3786:2:16;3771:18;;3758:32;3809:18;3839:14;;;3836:34;;;3866:1;3863;3856:12;3836:34;3889:61;3942:7;3933:6;3922:9;3918:22;3889:61;:::i;:::-;3879:71;;4003:2;3992:9;3988:18;3975:32;3959:48;;4032:2;4022:8;4019:16;4016:36;;;4048:1;4045;4038:12;4016:36;;4071:51;4114:7;4103:8;4092:9;4088:24;4071:51;:::i;:::-;4061:61;;;3284:844;;;;;;;:::o;4133:456::-;4210:6;4218;4226;4279:2;4267:9;4258:7;4254:23;4250:32;4247:52;;;4295:1;4292;4285:12;4247:52;4334:9;4321:23;4353:31;4378:5;4353:31;:::i;:::-;4403:5;-1:-1:-1;4460:2:16;4445:18;;4432:32;4473:33;4432:32;4473:33;:::i;:::-;4133:456;;4525:7;;-1:-1:-1;;;4579:2:16;4564:18;;;;4551:32;;4133:456::o;4594:665::-;4689:6;4697;4705;4713;4766:3;4754:9;4745:7;4741:23;4737:33;4734:53;;;4783:1;4780;4773:12;4734:53;4822:9;4809:23;4841:31;4866:5;4841:31;:::i;:::-;4891:5;-1:-1:-1;4948:2:16;4933:18;;4920:32;4961:33;4920:32;4961:33;:::i;:::-;5013:7;-1:-1:-1;5067:2:16;5052:18;;5039:32;;-1:-1:-1;5122:2:16;5107:18;;5094:32;5149:18;5138:30;;5135:50;;;5181:1;5178;5171:12;5135:50;5204:49;5245:7;5236:6;5225:9;5221:22;5204:49;:::i;5264:572::-;5359:6;5367;5375;5428:2;5416:9;5407:7;5403:23;5399:32;5396:52;;;5444:1;5441;5434:12;5396:52;5483:9;5470:23;5502:31;5527:5;5502:31;:::i;:::-;5552:5;-1:-1:-1;5608:2:16;5593:18;;5580:32;5635:18;5624:30;;5621:50;;;5667:1;5664;5657:12;5621:50;5706:70;5768:7;5759:6;5748:9;5744:22;5706:70;:::i;:::-;5264:572;;5795:8;;-1:-1:-1;5680:96:16;;-1:-1:-1;;;;5264:572:16:o;5841:382::-;5906:6;5914;5967:2;5955:9;5946:7;5942:23;5938:32;5935:52;;;5983:1;5980;5973:12;5935:52;6022:9;6009:23;6041:31;6066:5;6041:31;:::i;:::-;6091:5;-1:-1:-1;6148:2:16;6133:18;;6120:32;6161:30;6120:32;6161:30;:::i;6228:315::-;6296:6;6304;6357:2;6345:9;6336:7;6332:23;6328:32;6325:52;;;6373:1;6370;6363:12;6325:52;6412:9;6399:23;6431:31;6456:5;6431:31;:::i;:::-;6481:5;6533:2;6518:18;;;;6505:32;;-1:-1:-1;;;6228:315:16:o;6548:437::-;6634:6;6642;6695:2;6683:9;6674:7;6670:23;6666:32;6663:52;;;6711:1;6708;6701:12;6663:52;6751:9;6738:23;6784:18;6776:6;6773:30;6770:50;;;6816:1;6813;6806:12;6770:50;6855:70;6917:7;6908:6;6897:9;6893:22;6855:70;:::i;:::-;6944:8;;6829:96;;-1:-1:-1;6548:437:16;-1:-1:-1;;;;6548:437:16:o;6990:245::-;7057:6;7110:2;7098:9;7089:7;7085:23;7081:32;7078:52;;;7126:1;7123;7116:12;7078:52;7158:9;7152:16;7177:28;7199:5;7177:28;:::i;7240:245::-;7298:6;7351:2;7339:9;7330:7;7326:23;7322:32;7319:52;;;7367:1;7364;7357:12;7319:52;7406:9;7393:23;7425:30;7449:5;7425:30;:::i;7490:249::-;7559:6;7612:2;7600:9;7591:7;7587:23;7583:32;7580:52;;;7628:1;7625;7618:12;7580:52;7660:9;7654:16;7679:30;7703:5;7679:30;:::i;8419:280::-;8518:6;8571:2;8559:9;8550:7;8546:23;8542:32;8539:52;;;8587:1;8584;8577:12;8539:52;8619:9;8613:16;8638:31;8663:5;8638:31;:::i;8704:450::-;8773:6;8826:2;8814:9;8805:7;8801:23;8797:32;8794:52;;;8842:1;8839;8832:12;8794:52;8882:9;8869:23;8915:18;8907:6;8904:30;8901:50;;;8947:1;8944;8937:12;8901:50;8970:22;;9023:4;9015:13;;9011:27;-1:-1:-1;9001:55:16;;9052:1;9049;9042:12;9001:55;9075:73;9140:7;9135:2;9122:16;9117:2;9113;9109:11;9075:73;:::i;9159:180::-;9218:6;9271:2;9259:9;9250:7;9246:23;9242:32;9239:52;;;9287:1;9284;9277:12;9239:52;-1:-1:-1;9310:23:16;;9159:180;-1:-1:-1;9159:180:16:o;9344:184::-;9414:6;9467:2;9455:9;9446:7;9442:23;9438:32;9435:52;;;9483:1;9480;9473:12;9435:52;-1:-1:-1;9506:16:16;;9344:184;-1:-1:-1;9344:184:16:o;9533:315::-;9601:6;9609;9662:2;9650:9;9641:7;9637:23;9633:32;9630:52;;;9678:1;9675;9668:12;9630:52;9714:9;9701:23;9691:33;;9774:2;9763:9;9759:18;9746:32;9787:31;9812:5;9787:31;:::i;9853:435::-;9906:3;9944:5;9938:12;9971:6;9966:3;9959:19;9997:4;10026:2;10021:3;10017:12;10010:19;;10063:2;10056:5;10052:14;10084:1;10094:169;10108:6;10105:1;10102:13;10094:169;;;10169:13;;10157:26;;10203:12;;;;10238:15;;;;10130:1;10123:9;10094:169;;;-1:-1:-1;10279:3:16;;9853:435;-1:-1:-1;;;;;9853:435:16:o;10293:268::-;10345:3;10383:5;10377:12;10410:6;10405:3;10398:19;10426:63;10482:6;10475:4;10470:3;10466:14;10459:4;10452:5;10448:16;10426:63;:::i;:::-;10543:2;10522:15;-1:-1:-1;;10518:29:16;10509:39;;;;10550:4;10505:50;;10293:268;-1:-1:-1;;10293:268:16:o;10566:184::-;10607:3;10645:5;10639:12;10660:52;10705:6;10700:3;10693:4;10686:5;10682:16;10660:52;:::i;:::-;10728:16;;;;;10566:184;-1:-1:-1;;10566:184:16:o;10873:274::-;11002:3;11040:6;11034:13;11056:53;11102:6;11097:3;11090:4;11082:6;11078:17;11056:53;:::i;:::-;11125:16;;;;;10873:274;-1:-1:-1;;10873:274:16:o;11152:1300::-;11429:3;11458:1;11491:6;11485:13;11521:3;11543:1;11571:9;11567:2;11563:18;11553:28;;11631:2;11620:9;11616:18;11653;11643:61;;11697:4;11689:6;11685:17;11675:27;;11643:61;11723:2;11771;11763:6;11760:14;11740:18;11737:38;11734:165;;;-1:-1:-1;;;11798:33:16;;11854:4;11851:1;11844:15;11884:4;11805:3;11872:17;11734:165;11915:18;11942:104;;;;12060:1;12055:320;;;;11908:467;;11942:104;-1:-1:-1;;11975:24:16;;11963:37;;12020:16;;;;-1:-1:-1;11942:104:16;;12055:320;27736:1;27729:14;;;27773:4;27760:18;;12150:1;12164:165;12178:6;12175:1;12172:13;12164:165;;;12256:14;;12243:11;;;12236:35;12299:16;;;;12193:10;;12164:165;;;12168:3;;12358:6;12353:3;12349:16;12342:23;;11908:467;;;;;;;12391:55;12416:29;12441:3;12433:6;12416:29;:::i;:::-;-1:-1:-1;;;10815:20:16;;10860:1;10851:11;;10755:113;12391:55;12384:62;11152:1300;-1:-1:-1;;;;;11152:1300:16:o;13162:499::-;-1:-1:-1;;;;;13431:15:16;;;13413:34;;13483:15;;13478:2;13463:18;;13456:43;13530:2;13515:18;;13508:34;;;13578:3;13573:2;13558:18;;13551:31;;;13356:4;;13599:56;;13635:19;;13627:6;13599:56;:::i;:::-;13591:64;13162:499;-1:-1:-1;;;;;;13162:499:16:o;13666:562::-;-1:-1:-1;;;;;13951:32:16;;13933:51;;14020:2;14015;14000:18;;13993:30;;;-1:-1:-1;;14046:56:16;;14083:18;;14075:6;14046:56;:::i;:::-;14150:9;14142:6;14138:22;14133:2;14122:9;14118:18;14111:50;14178:44;14215:6;14207;14178:44;:::i;14799:261::-;14978:2;14967:9;14960:21;14941:4;14998:56;15050:2;15039:9;15035:18;15027:6;14998:56;:::i;15257:230::-;15406:2;15395:9;15388:21;15369:4;15426:55;15477:2;15466:9;15462:18;15454:6;15426:55;:::i;15492:343::-;15694:2;15676:21;;;15733:2;15713:18;;;15706:30;-1:-1:-1;;;15767:2:16;15752:18;;15745:49;15826:2;15811:18;;15492:343::o;16244:407::-;16446:2;16428:21;;;16485:2;16465:18;;;16458:30;16524:34;16519:2;16504:18;;16497:62;-1:-1:-1;;;16590:2:16;16575:18;;16568:41;16641:3;16626:19;;16244:407::o;16656:414::-;16858:2;16840:21;;;16897:2;16877:18;;;16870:30;16936:34;16931:2;16916:18;;16909:62;-1:-1:-1;;;17002:2:16;16987:18;;16980:48;17060:3;17045:19;;16656:414::o;17482:402::-;17684:2;17666:21;;;17723:2;17703:18;;;17696:30;17762:34;17757:2;17742:18;;17735:62;-1:-1:-1;;;17828:2:16;17813:18;;17806:36;17874:3;17859:19;;17482:402::o;20253:407::-;20455:2;20437:21;;;20494:2;20474:18;;;20467:30;20533:34;20528:2;20513:18;;20506:62;-1:-1:-1;;;20599:2:16;20584:18;;20577:41;20650:3;20635:19;;20253:407::o;23026:356::-;23228:2;23210:21;;;23247:18;;;23240:30;23306:34;23301:2;23286:18;;23279:62;23373:2;23358:18;;23026:356::o;24894:413::-;25096:2;25078:21;;;25135:2;25115:18;;;25108:30;25174:34;25169:2;25154:18;;25147:62;-1:-1:-1;;;25240:2:16;25225:18;;25218:47;25297:3;25282:19;;24894:413::o;27383:275::-;27454:2;27448:9;27519:2;27500:13;;-1:-1:-1;;27496:27:16;27484:40;;27554:18;27539:34;;27575:22;;;27536:62;27533:88;;;27601:18;;:::i;:::-;27637:2;27630:22;27383:275;;-1:-1:-1;27383:275:16:o;27789:128::-;27829:3;27860:1;27856:6;27853:1;27850:13;27847:39;;;27866:18;;:::i;:::-;-1:-1:-1;27902:9:16;;27789:128::o;27922:120::-;27962:1;27988;27978:35;;27993:18;;:::i;:::-;-1:-1:-1;28027:9:16;;27922:120::o;28047:168::-;28087:7;28153:1;28149;28145:6;28141:14;28138:1;28135:21;28130:1;28123:9;28116:17;28112:45;28109:71;;;28160:18;;:::i;:::-;-1:-1:-1;28200:9:16;;28047:168::o;28220:125::-;28260:4;28288:1;28285;28282:8;28279:34;;;28293:18;;:::i;:::-;-1:-1:-1;28330:9:16;;28220:125::o;28350:258::-;28422:1;28432:113;28446:6;28443:1;28440:13;28432:113;;;28522:11;;;28516:18;28503:11;;;28496:39;28468:2;28461:10;28432:113;;;28563:6;28560:1;28557:13;28554:48;;;-1:-1:-1;;28598:1:16;28580:16;;28573:27;28350:258::o;28613:380::-;28692:1;28688:12;;;;28735;;;28756:61;;28810:4;28802:6;28798:17;28788:27;;28756:61;28863:2;28855:6;28852:14;28832:18;28829:38;28826:161;;;28909:10;28904:3;28900:20;28897:1;28890:31;28944:4;28941:1;28934:15;28972:4;28969:1;28962:15;28826:161;;28613:380;;;:::o;28998:135::-;29037:3;-1:-1:-1;;29058:17:16;;29055:43;;;29078:18;;:::i;:::-;-1:-1:-1;29125:1:16;29114:13;;28998:135::o;29138:112::-;29170:1;29196;29186:35;;29201:18;;:::i;:::-;-1:-1:-1;29235:9:16;;29138:112::o;29255:127::-;29316:10;29311:3;29307:20;29304:1;29297:31;29347:4;29344:1;29337:15;29371:4;29368:1;29361:15;29387:127;29448:10;29443:3;29439:20;29436:1;29429:31;29479:4;29476:1;29469:15;29503:4;29500:1;29493:15;29519:127;29580:10;29575:3;29571:20;29568:1;29561:31;29611:4;29608:1;29601:15;29635:4;29632:1;29625:15;29651:127;29712:10;29707:3;29703:20;29700:1;29693:31;29743:4;29740:1;29733:15;29767:4;29764:1;29757:15;29783:131;-1:-1:-1;;;;;29858:31:16;;29848:42;;29838:70;;29904:1;29901;29894:12;29919:118;30005:5;29998:13;29991:21;29984:5;29981:32;29971:60;;30027:1;30024;30017:12;30042:131;-1:-1:-1;;;;;;30116:32:16;;30106:43;;30096:71;;30163:1;30160;30153:12

Swarm Source

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