ETH Price: $3,445.86 (-0.91%)
Gas: 3 Gwei

Token

Bridges (BRDG)
 

Overview

Max Total Supply

900 BRDG

Holders

305

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
eeeris.eth
Balance
1 BRDG
0xda98d4fadfc023432124b8f96a871f983023cdaa
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MixedStems_V1

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-10
*/

// SPDX-License-Identifier: MIT

/*
    ██████╗ ███████╗
    ██╔══██╗██╔════╝
    ██████╔╝█████╗  
    ██╔══██╗██╔══╝  
    ██████╔╝██║     
    ╚═════╝ ╚═╝                                                                                                                                                                          
*/

pragma solidity ^0.8.0;


/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
                )
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }

    function decode(bytes memory data) internal pure returns (bytes memory) {
        uint8[128] memory toInt;

        for (uint8 i = 0; i < bytes(TABLE).length; i++) {
            toInt[uint8(bytes(TABLE)[i])] = i;
        }

        uint256 delta;
        uint256 len = data.length;
        if (data[len - 2] == "=" && data[len - 1] == "=") {
            delta = 2;
        } else if (data[len - 1] == "=") {
            delta = 1;
        } else {
            delta = 0;
        }
        uint256 decodedLen = (len * 3) / 4 - delta;
        bytes memory buffer = new bytes(decodedLen);
        uint256 index;
        uint8 mask = 0xFF;

        for (uint256 i = 0; i < len; i += 4) {
            uint8 c0 = toInt[uint8(data[i])];
            uint8 c1 = toInt[uint8(data[i + 1])];
            buffer[index++] = (bytes1)(((c0 << 2) | (c1 >> 4)) & mask);
            if (index >= buffer.length) {
                return buffer;
            }
            uint8 c2 = toInt[uint8(data[i + 2])];
            buffer[index++] = (bytes1)(((c1 << 4) | (c2 >> 2)) & mask);
            if (index >= buffer.length) {
                return buffer;
            }
            uint8 c3 = toInt[uint8(data[i + 3])];
            buffer[index++] = (bytes1)(((c2 << 6) | c3) & mask);
        }
        return buffer;
    }
}


/**
 * @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);
}


///
/// @dev Interface for the NFT Royalty Standard
///
interface IERC2981 is IERC165 {
    /// ERC165 bytes to add to interface array - set in parent contract
    /// implementing this standard
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}



/**
 * @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;
}


/**
 * @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);
}



/**
 * @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);
}

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

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

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

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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);
            }
        }
    }
}


/**
 * @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;
    }
}


/**
 * @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;
    }
}


/**
 * @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);
    }
}


error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (
            to.isContract() &&
            !_checkContractOnERC721Received(from, to, tokenId, _data)
        ) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (
                        !_checkContractOnERC721Received(
                            address(0),
                            to,
                            updatedIndex++,
                            _data
                        )
                    ) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try
            IERC721Receiver(to).onERC721Received(
                _msgSender(),
                from,
                tokenId,
                _data
            )
        returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


/**
 * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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);
}




/**
 * @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");
        }
    }
}

/**
 * Slightly adjusted version of PaymentSplitter by OpenZeppelin
 *
 * @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_) internal {
        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_);
    }

    /**
     * @dev Update a payee on the contract.
     * @param index The array index of the payee to update.
     * @param shares_ The number of shares owned by the payee.
     */
    function _updatePayee(uint256 index, uint256 shares_) internal {
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        uint256 temp = _shares[payee(index)];
        _shares[payee(index)] = shares_;
        _totalShares = _totalShares - temp + shares_;
    }

    /**
     * @dev Remove a payee from the contract.
     * @param index The array index of the payee to update.
     */
    function _removePayee(uint256 index) internal {
        uint256 temp = _shares[payee(index)];
        _shares[payee(index)] = 0;
        _payees[index] = _payees[_payees.length - 1];
        _payees.pop();
        _totalShares = _totalShares - temp;
    }
}


/**
 * @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);
    }
}

contract Royalties_V1 is PaymentSplitter, Ownable {
    constructor(
        address[] memory payees_,
        uint256[] memory shares_,
        address owner_
    ) PaymentSplitter(payees_, shares_) {
        transferOwnership(owner_);
    }

    function addPayee(address payee, uint256 shares) public onlyOwner {
        _addPayee(payee, shares);
    }

    function updatePayee(uint256 payeeIndex, uint256 shares) public onlyOwner {
        _updatePayee(payeeIndex, shares);
    }

    function removePayee(uint256 payeeIndex) public onlyOwner {
        _removePayee(payeeIndex);
    }
}




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

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}




library Bytecode {
  error InvalidCodeAtRange(uint256 _size, uint256 _start, uint256 _end);

  /**
    @notice Generate a creation code that results on a contract with `_code` as bytecode
    @param _code The returning value of the resulting `creationCode`
    @return creationCode (constructor) for new contract
  */
  function creationCodeFor(bytes memory _code) internal pure returns (bytes memory) {
    /*
      0x00    0x63         0x63XXXXXX  PUSH4 _code.length  size
      0x01    0x80         0x80        DUP1                size size
      0x02    0x60         0x600e      PUSH1 14            14 size size
      0x03    0x60         0x6000      PUSH1 00            0 14 size size
      0x04    0x39         0x39        CODECOPY            size
      0x05    0x60         0x6000      PUSH1 00            0 size
      0x06    0xf3         0xf3        RETURN
      <CODE>
    */

    return abi.encodePacked(
      hex"63",
      uint32(_code.length),
      hex"80_60_0E_60_00_39_60_00_F3",
      _code
    );
  }

  /**
    @notice Returns the size of the code on a given address
    @param _addr Address that may or may not contain code
    @return size of the code on the given `_addr`
  */
  function codeSize(address _addr) internal view returns (uint256 size) {
    assembly { size := extcodesize(_addr) }
  }

  /**
    @notice Returns the code of a given address
    @dev It will fail if `_end < _start`
    @param _addr Address that may or may not contain code
    @param _start number of bytes of code to skip on read
    @param _end index before which to end extraction
    @return oCode read from `_addr` deployed bytecode

    Forked from: https://gist.github.com/KardanovIR/fe98661df9338c842b4a30306d507fbd
  */
  function codeAt(address _addr, uint256 _start, uint256 _end) internal view returns (bytes memory oCode) {
    uint256 csize = codeSize(_addr);
    if (csize == 0) return bytes("");

    if (_start > csize) return bytes("");
    if (_end < _start) revert InvalidCodeAtRange(csize, _start, _end); 

    unchecked {
      uint256 reqSize = _end - _start;
      uint256 maxSize = csize - _start;

      uint256 size = maxSize < reqSize ? maxSize : reqSize;

      assembly {
        // allocate output byte array - this could also be done without assembly
        // by using o_code = new bytes(size)
        oCode := mload(0x40)
        // new "memory end" including padding
        mstore(0x40, add(oCode, and(add(add(size, 0x20), 0x1f), not(0x1f))))
        // store length in memory
        mstore(oCode, size)
        // actually retrieve the code, this needs assembly
        extcodecopy(_addr, add(oCode, 0x20), _start, size)
      }
    }
  }
}


/**
  @title A key-value storage with auto-generated keys for storing chunks of data with a lower write & read cost.
  @author Agustin Aguilar <[email protected]>

  Readme: https://github.com/0xsequence/sstore2#readme
*/
library SSTORE2 {
  error WriteError();

  /**
    @notice Stores `_data` and returns `pointer` as key for later retrieval
    @dev The pointer is a contract address with `_data` as code
    @param _data to be written
    @return pointer Pointer to the written `_data`
  */
  function write(bytes memory _data) internal returns (address pointer) {
    // Append 00 to _data so contract can't be called
    // Build init code
    bytes memory code = Bytecode.creationCodeFor(
      abi.encodePacked(
        hex'00',
        _data
      )
    );

    // Deploy contract using create
    assembly { pointer := create(0, add(code, 32), mload(code)) }

    // Address MUST be non-zero
    if (pointer == address(0)) revert WriteError();
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @return data read from `_pointer` contract
  */
  function read(address _pointer) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, 1, type(uint256).max);
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @param _start number of bytes to skip
    @return data read from `_pointer` contract
  */
  function read(address _pointer, uint256 _start) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, _start + 1, type(uint256).max);
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @param _start number of bytes to skip
    @param _end index before which to end extraction
    @return data read from `_pointer` contract
  */
  function read(address _pointer, uint256 _start, uint256 _end) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, _start + 1, _end + 1);
  }
}

error MintingLimitReached();
error SeedAlreadyUsed();
error InvalidProof();
error InsufficientBalance(uint256 balance);
error NotAllowlisted();
error SameLengthRequired();

contract MixedStems_V1 is ERC721A, IERC2981, Ownable {
    using Strings for uint256;
    using Address for address payable;

    type SongID is uint256;
    type TrackID is uint256;

    enum Phase {
        INIT,
        ALLOWLIST,
        PUBLIC,
        RESERVE
    }

    Royalties_V1 public immutable royaltyContract;
    uint256 public royaltyPercent;

    string public baseURI;

    uint256 public numVariableTracks;
    uint256 public mintPrice;
    uint256 public maxSupply;

    // metadata values
    string public composer;
    string private _singular;
    string public description;

    // song ID -> track ID -> array of pointers to SSTORE2 MIDI data
    mapping(SongID => mapping(TrackID => address[])) private _tracks;
    // song ID -> array of pointers to SSTORE2 MIDI data
    mapping(SongID => address[]) private _staticTracks;
    // song ID -> time division
    mapping(SongID => bytes2) private _timeDivisions;
    // tokenID -> variant ID
    mapping(uint256 => uint256) private _variants;
    // song ID -> song name
    mapping(SongID => string) private _songNames;

    Phase public mintingPhase;

    bytes32 private _allSeedsMerkleRoot;
    // tokenID -> seed
    mapping(uint256 => bytes32) private _seeds;
    // seed -> used
    mapping(bytes32 => bool) private _seedUsed;
    // seed -> tokenID
    mapping(bytes32 => uint256) private _seedTokenID;

    bytes32 private _allowlistMerkleRoot;

    // MODIFIERS -----------------------------------------------------

    modifier onlyPhase(Phase _phase) {
        require(mintingPhase == _phase, "Wrong phase");
        _;
    }

    modifier mustPrice(uint256 _price) {
        require(msg.value == _price, "Wrong price");
        _;
    }

    // CONSTRUCTOR ---------------------------------------------------

    constructor(
        string memory baseURI_,
        string memory name_,
        string memory singular_,
        string memory description_,
        string memory symbol_,
        string memory composer_,
        uint256 numVariableTracks_,
        address[] memory royaltyReceivers_,
        uint256[] memory royaltyShares_,
        uint256 royaltyPercent_
    ) ERC721A(name_, symbol_) {
        baseURI = baseURI_;
        _singular = singular_;
        description = description_;
        numVariableTracks = numVariableTracks_;
        composer = composer_;
        Royalties_V1 p = new Royalties_V1(
            royaltyReceivers_,
            royaltyShares_,
            msg.sender
        );
        royaltyContract = p;
        royaltyPercent = royaltyPercent_;
    }

    // ADMIN FUNCTIONS ---------------------------------------------------

    function withdraw(address payable to, uint256 amount) public onlyOwner {
        if (address(this).balance < amount) {
            revert InsufficientBalance(address(this).balance);
        }

        if (amount == 0) {
            amount = address(this).balance;
        }
        if (to == address(0)) {
            to = payable(owner());
        }
        to.sendValue(amount);
    }

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

    function setComposer(string memory composer_) public onlyOwner {
        composer = composer_;
    }

    function setDescription(string memory description_) public onlyOwner {
        description = description_;
    }
    
    function startAllowlistMint(uint256 supply) public onlyOwner {
        mintingPhase = Phase.ALLOWLIST;
        maxSupply = supply;
    }

    function startPublicMint(uint256 supply) public onlyOwner {
        mintingPhase = Phase.PUBLIC;
        maxSupply = supply;
    }

    function startReserveMint(uint256 supply) public onlyOwner {
        mintingPhase = Phase.RESERVE;
        maxSupply = supply;
    }

    function disableMint() public onlyOwner {
        mintingPhase = Phase.INIT;
    }

    function setMintPrice(uint256 value) public onlyOwner {
        mintPrice = value;
    }

    function setAllSeedsMerkleRoot(bytes32 value) public onlyOwner {
        _allSeedsMerkleRoot = value;
    }

    function setAllowlistMerkleRoot(bytes32 value) public onlyOwner {
        _allowlistMerkleRoot = value;
    }

    function setRoyaltyPercentage(uint256 percent) public onlyOwner {
        royaltyPercent = percent;
    }

    function setSongNames(SongID[] memory songs, string[] memory songNames)
        public
        onlyOwner
    {
        require(songs.length == songNames.length);
        for (uint256 i = 0; i < songNames.length; i++) {
            _songNames[songs[i]] = songNames[i];
        }
    }

    function addVariableTrack(
        SongID song,
        TrackID trackNum,
        bytes calldata track
    ) external onlyOwner {
        require(TrackID.unwrap(trackNum) < numVariableTracks);
        address pointer = SSTORE2.write(track);
        _tracks[song][trackNum].push(pointer);
    }

    function removeVariableTrack(
        SongID song,
        TrackID trackNum,
        uint256 index
    ) external onlyOwner {
         _tracks[song][trackNum][index] = _tracks[song][trackNum][_tracks[song][trackNum].length - 1];
         _tracks[song][trackNum].pop();
    }

    function resetVariableTracks(
        SongID song,
        TrackID trackNum
    )
        external
        onlyOwner
    {
        delete _tracks[song][trackNum];
    }

    function addStaticTrack(SongID song, bytes calldata track)
        external
        onlyOwner
    {
        address pointer = SSTORE2.write(track);
        _staticTracks[song].push(pointer);
    }

    function removeStaticTrack(SongID song, uint256 index)
        external
        onlyOwner
    {
        _staticTracks[song][index] = _staticTracks[song][_staticTracks[song].length - 1];
        _staticTracks[song].pop();
    }

    function resetStaticTracks(SongID song) external onlyOwner {
        delete _staticTracks[song];
    }

    function setTimeDivision(SongID song, bytes2 timeDivision)
        public
        onlyOwner
    {
        _timeDivisions[song] = timeDivision;
    }

    // ERC-721 FUNCTIONS ---------------------------------------------------

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) {
            revert URIQueryForNonexistentToken();
        }
        bytes32 seed = _seeds[tokenId];

        SongID song = SongID.wrap(uint8(seed[0]));

        string memory mid = midi(tokenId);

        bytes memory json = abi.encodePacked(
            '{"name":"',
            _singular,
            " #",
            tokenId.toString(),
            '", "description": "',
            description,
            '", "image": "',
            baseURI,
            "/image/",
            uint256(seed).toHexString(),
            '", "animation_url": "',
            baseURI,
            "/animation/",
            uint256(seed).toHexString()
        );
        json = abi.encodePacked(
            json,
            '", "midi": "data:audio/midi;base64,',
            mid,
            '", "external_url": "https://beatfoundry.xyz", "composer": "',
            composer,
            '", "attributes": [{"trait_type": "Song", "value": '
        );
        if (bytes(_songNames[song]).length > 0) {
            json = abi.encodePacked(json, '"', _songNames[song], '"}');
        } else {
            json = abi.encodePacked(json, '"',SongID.unwrap(song).toString(), '"}');
        }

        json = abi.encodePacked(
            json,
            ', {"trait_type": "Cover", "value": "',
            _variants[tokenId].toString(),
            '"}'
        );
        
        for (uint256 i = 0; i < numVariableTracks; i++) {
            json = abi.encodePacked(
                json,
                ', {"trait_type": "Stem ',
                (i + 1).toString(),
                '", "value": "',
                uint256(uint8(seed[i + 1])).toString(),
                '"}'
            );
        }
        json = abi.encodePacked(json, "]}");
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    Base64.encode(json)
                )
            );
    }

    function midi(uint256 tokenId) public view returns (string memory) {
        if (!_exists(tokenId)) {
            revert URIQueryForNonexistentToken();
        }
        bytes32 seed = _seeds[tokenId];

        SongID song = SongID.wrap(uint8(seed[0]));

        bytes memory mid = newMidi(6, song);

        uint256 lenStatic = _staticTracks[song].length;

        for (uint256 i = 0; i < numVariableTracks; i++) {
            bytes memory track = SSTORE2.read(
                _tracks[song][TrackID.wrap(i)][uint8(seed[i + 1])]
            );
            mid = bytes.concat(mid, newTrack(track));
        }

        for (uint256 i = 0; i < lenStatic; i++) {
            bytes memory track = SSTORE2.read(_staticTracks[song][i]);
            mid = bytes.concat(mid, newTrack(track));
        }

        return Base64.encode(mid);
    }

    function getSeedTokenID(bytes32 seed) public view returns (uint256) {
        return _seedTokenID[seed];
    }

    function getVariant(uint256 tokenId) public view returns (uint256) {
        if (!_exists(tokenId)) {
            revert URIQueryForNonexistentToken();
        }
        return _variants[tokenId];
    }

    // MINTING FUNCTIONS ---------------------------------------------------

    function mint(
        address to,
        bytes32 seed,
        uint256 variant,
        bytes calldata pass,
        bytes32[] calldata seedProof
    ) external payable onlyPhase(Phase.PUBLIC) mustPrice(mintPrice) {
      
        if (_currentIndex >= maxSupply) {
            revert MintingLimitReached();
        }

        if (_seedUsed[seed]) {
            revert SeedAlreadyUsed();
        } 

        if (!isValidSeedPassCombo(seed, variant, pass, seedProof)) {
            revert InvalidProof();
        }
        _seeds[_currentIndex] = seed;
        _variants[_currentIndex] = variant;
        _seedTokenID[seed] = _currentIndex;
        _seedUsed[seed] = true; 

        _mint(to, 1, bytes(""), true);
    }

    function mintReserve(address to, bytes32[] calldata seeds, uint256[] calldata variants)
        external
        virtual
        onlyOwner
        onlyPhase(Phase.RESERVE)
    {
        if (_currentIndex >= maxSupply) {
            revert MintingLimitReached();
        }
        if (seeds.length != variants.length) {
            revert SameLengthRequired();
        }
        for (uint256 i = 0; i < seeds.length; i++) {
            bytes32 seed = seeds[i];
            if (_seedUsed[seed]) {
                revert SeedAlreadyUsed();
            }
            _seeds[_currentIndex + i] = seed;
             _seedTokenID[seed] = _currentIndex + i;
            _seedUsed[seed] = true;
        }
        _mint(to, seeds.length, bytes(""), true);
    }

    function mintAllowlist(
        address to,
        bytes32[] calldata seeds,
        uint256[] calldata variants,
        bytes32[][] calldata allowlistProofs
    )
        external
        payable
        onlyPhase(Phase.ALLOWLIST)
        mustPrice(mintPrice * seeds.length)
    {
        if (_currentIndex >= maxSupply) {
            revert MintingLimitReached();
        }
        if (seeds.length != allowlistProofs.length || seeds.length != variants.length) {
            revert SameLengthRequired();
        }
        for (uint256 i = 0; i < seeds.length; i++) {
            bytes32 seed = seeds[i];
            if (!isAllowlistedFor(to, seed, variants[i], allowlistProofs[i])) {
                revert NotAllowlisted();
            }
            if (_seedUsed[seed]) {
                revert SeedAlreadyUsed();
            }
            _seeds[_currentIndex + i] = seed;
            _seedTokenID[seed] = _currentIndex + i;
            _variants[_currentIndex + i] = variants[i];
            _seedUsed[seed] = true;
        }

        _mint(to, seeds.length, bytes(""), true);
    }

    // MIDI FUNCTIONS ---------------------------------------------------

    function newMidi(uint8 numTracks, SongID song)
        private
        view
        returns (bytes memory)
    {
        bytes2 timeDivision = _timeDivisions[song];
        if (uint16(timeDivision) == 0) {
            timeDivision = bytes2(uint16(256));
        }
        bytes memory data = new bytes(14);
        data[0] = bytes1(0x4D);
        data[1] = bytes1(0x54);
        data[2] = bytes1(0x68);
        data[3] = bytes1(0x64);
        data[4] = bytes1(0x00);
        data[5] = bytes1(0x00);
        data[6] = bytes1(0x00);
        data[7] = bytes1(0x06);
        data[8] = bytes1(0x00);
        if (numTracks == 1) {
            data[9] = bytes1(0x00);
        } else {
            data[9] = bytes1(0x01);
        }
        data[10] = bytes1(0x00);
        data[11] = bytes1(numTracks);
        data[12] = timeDivision[0];
        data[13] = timeDivision[1];
        return data;
    }

    function newTrack(bytes memory data) private pure returns (bytes memory) {
        bytes memory it = new bytes(8);
        it[0] = bytes1(0x4D);
        it[1] = bytes1(0x54);
        it[2] = bytes1(0x72);
        it[3] = bytes1(0x6b);
        bytes memory asBytes = abi.encodePacked(data.length);
        it[4] = asBytes[asBytes.length - 4];
        it[5] = asBytes[asBytes.length - 3];
        it[6] = asBytes[asBytes.length - 2];
        it[7] = asBytes[asBytes.length - 1];
        return bytes.concat(it, data);
    }

    // ROYALTIES ---------------------------------------------------------------
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (address(royaltyContract), (_salePrice / 100) * royaltyPercent);
    }

    // HELPERS ------------------------------------------------------------------

    function isAllowlistedFor(
        address _allowlistee,
        bytes32 _seed,
        uint256 _variant,
        bytes32[] calldata _proof
    ) private view returns (bool) {
        return
            MerkleProof.verify(
                _proof,
                _allowlistMerkleRoot,
                keccak256(abi.encodePacked(_allowlistee, _seed, _variant))
            );
    }

    function isValidSeedPassCombo(
        bytes32 _seed,
        uint256 _variant,
        bytes calldata _pass,
        bytes32[] calldata _proof
    ) private view returns (bool) {
        return
            MerkleProof.verify(
                _proof,
                _allSeedsMerkleRoot,
                keccak256(abi.encodePacked(keccak256(_pass), _seed, _variant))
            );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"singular_","type":"string"},{"internalType":"string","name":"description_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"composer_","type":"string"},{"internalType":"uint256","name":"numVariableTracks_","type":"uint256"},{"internalType":"address[]","name":"royaltyReceivers_","type":"address[]"},{"internalType":"uint256[]","name":"royaltyShares_","type":"uint256[]"},{"internalType":"uint256","name":"royaltyPercent_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"InvalidCodeAtRange","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintingLimitReached","type":"error"},{"inputs":[],"name":"NotAllowlisted","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"SameLengthRequired","type":"error"},{"inputs":[],"name":"SeedAlreadyUsed","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WriteError","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"MixedStems_V1.SongID","name":"song","type":"uint256"},{"internalType":"bytes","name":"track","type":"bytes"}],"name":"addStaticTrack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"MixedStems_V1.SongID","name":"song","type":"uint256"},{"internalType":"MixedStems_V1.TrackID","name":"trackNum","type":"uint256"},{"internalType":"bytes","name":"track","type":"bytes"}],"name":"addVariableTrack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"composer","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMint","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":"bytes32","name":"seed","type":"bytes32"}],"name":"getSeedTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getVariant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"midi","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32","name":"seed","type":"bytes32"},{"internalType":"uint256","name":"variant","type":"uint256"},{"internalType":"bytes","name":"pass","type":"bytes"},{"internalType":"bytes32[]","name":"seedProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32[]","name":"seeds","type":"bytes32[]"},{"internalType":"uint256[]","name":"variants","type":"uint256[]"},{"internalType":"bytes32[][]","name":"allowlistProofs","type":"bytes32[][]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32[]","name":"seeds","type":"bytes32[]"},{"internalType":"uint256[]","name":"variants","type":"uint256[]"}],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingPhase","outputs":[{"internalType":"enum MixedStems_V1.Phase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numVariableTracks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"MixedStems_V1.SongID","name":"song","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeStaticTrack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"MixedStems_V1.SongID","name":"song","type":"uint256"},{"internalType":"MixedStems_V1.TrackID","name":"trackNum","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeVariableTrack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"MixedStems_V1.SongID","name":"song","type":"uint256"}],"name":"resetStaticTracks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"MixedStems_V1.SongID","name":"song","type":"uint256"},{"internalType":"MixedStems_V1.TrackID","name":"trackNum","type":"uint256"}],"name":"resetVariableTracks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyContract","outputs":[{"internalType":"contract Royalties_V1","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"setAllSeedsMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"setAllowlistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"composer_","type":"string"}],"name":"setComposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description_","type":"string"}],"name":"setDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"MixedStems_V1.SongID[]","name":"songs","type":"uint256[]"},{"internalType":"string[]","name":"songNames","type":"string[]"}],"name":"setSongNames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"MixedStems_V1.SongID","name":"song","type":"uint256"},{"internalType":"bytes2","name":"timeDivision","type":"bytes2"}],"name":"setTimeDivision","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"startAllowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"startPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"startReserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b506040516200669238038062006692833981016040819052620000349162000427565b8851899087906200004d90600290602085019062000183565b5080516200006390600390602084019062000183565b50506000805550620000753362000131565b89516200008a90600a9060208d019062000183565b508751620000a090600f9060208b019062000183565b508651620000b69060109060208a019062000183565b50600b8490558451620000d190600e90602088019062000183565b506000838333604051620000e59062000212565b620000f39392919062000594565b604051809103906000f08015801562000110573d6000803e3d6000fd5b506001600160a01b031660805250600955506200066f975050505050505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001919062000633565b90600052602060002090601f016020900481019282620001b5576000855562000200565b82601f10620001d057805160ff191683800117855562000200565b8280016001018555821562000200579182015b8281111562000200578251825591602001919060010190620001e3565b506200020e92915062000220565b5090565b611a3b8062004c5783390190565b5b808211156200020e576000815560010162000221565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000278576200027862000237565b604052919050565b600082601f8301126200029257600080fd5b81516001600160401b03811115620002ae57620002ae62000237565b6020620002c4601f8301601f191682016200024d565b8281528582848701011115620002d957600080fd5b60005b83811015620002f9578581018301518282018401528201620002dc565b838111156200030b5760008385840101525b5095945050505050565b60006001600160401b0382111562000331576200033162000237565b5060051b60200190565b600082601f8301126200034d57600080fd5b8151602062000366620003608362000315565b6200024d565b82815260059290921b840181019181810190868411156200038657600080fd5b8286015b84811015620003ba5780516001600160a01b0381168114620003ac5760008081fd5b83529183019183016200038a565b509695505050505050565b600082601f830112620003d757600080fd5b81516020620003ea620003608362000315565b82815260059290921b840181019181810190868411156200040a57600080fd5b8286015b84811015620003ba57805183529183019183016200040e565b6000806000806000806000806000806101408b8d0312156200044857600080fd5b8a516001600160401b03808211156200046057600080fd5b6200046e8e838f0162000280565b9b5060208d01519150808211156200048557600080fd5b620004938e838f0162000280565b9a5060408d0151915080821115620004aa57600080fd5b620004b88e838f0162000280565b995060608d0151915080821115620004cf57600080fd5b620004dd8e838f0162000280565b985060808d0151915080821115620004f457600080fd5b620005028e838f0162000280565b975060a08d01519150808211156200051957600080fd5b620005278e838f0162000280565b965060c08d0151955060e08d01519150808211156200054557600080fd5b620005538e838f016200033b565b94506101008d01519150808211156200056b57600080fd5b506200057a8d828e01620003c5565b9250506101208b015190509295989b9194979a5092959850565b606080825284519082018190526000906020906080840190828801845b82811015620005d85781516001600160a01b031684529284019290840190600101620005b1565b5050508381038285015285518082528683019183019060005b818110156200060f57835183529284019291840191600101620005f1565b50506001600160a01b038616604086015292506200062b915050565b949350505050565b600181811c908216806200064857607f821691505b6020821081036200066957634e487b7160e01b600052602260045260246000fd5b50919050565b6080516145c562000692600039600081816103e20152610fa601526145c56000f3fe60806040526004361061031a5760003560e01c80636cf3884d116101ab578063b88d4fde116100f7578063ef14817711610095578063f4a0a5281161006f578063f4a0a5281461095d578063f7403fef1461097d578063f95df4141461099d578063faff57d1146109bd57600080fd5b8063ef148177146108fd578063f2fde38b1461091d578063f3fef3a31461093d57600080fd5b8063ca3bd325116100d1578063ca3bd3251461085e578063d54802881461087e578063d5abeb011461089e578063e985e9c5146108b457600080fd5b8063b88d4fde146107fe578063bdcea4bc1461081e578063c87b56dd1461083e57600080fd5b80637e5ac09a1161016457806395d89b411161013e57806395d89b411461079e5780639f67756d146107b3578063a22cb465146107c9578063aeb1fe51146107e957600080fd5b80637e5ac09a146107395780638da5cb5b1461076057806390c3f38f1461077e57600080fd5b80636cf3884d1461068c57806370a08231146106a2578063715018a6146106c2578063719d9357146106d75780637284e4161461070457806374e1ee411461071957600080fd5b806336b46fc41161026a57806355f804b3116102235780636352211e116101fd5780636352211e1461062157806367a44c64146106415780636817c76c146106615780636c0360eb1461067757600080fd5b806355f804b3146105c15780635c91f25c146105e157806361ba27da1461060157600080fd5b806336b46fc41461050157806342842e0e146105215780634447c28b1461054157806344f4f0e8146105615780634565773514610581578063521993e3146105a157600080fd5b80631a62ae32116102d757806323e7907d116102b157806323e7907d1461047a5780632a55205a1461048d57806333ba01a1146104cc57806334452f38146104ec57600080fd5b80631a62ae32146104275780631d140e991461044757806323b872dd1461045a57600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780631663ee03146103d057806318160ddd14610404575b600080fd5b34801561032b57600080fd5b5061033f61033a3660046135bf565b6109dd565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610a2f565b60405161034b9190613634565b34801561038257600080fd5b50610396610391366004613647565b610ac1565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004613675565b610b05565b005b3480156103dc57600080fd5b506103967f000000000000000000000000000000000000000000000000000000000000000081565b34801561041057600080fd5b50600154600054035b60405190815260200161034b565b34801561043357600080fd5b506103ce610442366004613647565b610b92565b6103ce610455366004613726565b610bdf565b34801561046657600080fd5b506103ce6104753660046137bb565b610d3c565b6103ce6104883660046137fc565b610d47565b34801561049957600080fd5b506104ad6104a8366004613888565b610fa1565b604080516001600160a01b03909316835260208301919091520161034b565b3480156104d857600080fd5b506103ce6104e7366004613a19565b610feb565b3480156104f857600080fd5b506103ce61109b565b34801561050d57600080fd5b506103ce61051c366004613647565b6110d1565b34801561052d57600080fd5b506103ce61053c3660046137bb565b611115565b34801561054d57600080fd5b506103ce61055c366004613ad1565b611130565b34801561056d57600080fd5b506103ce61057c366004613647565b6112c6565b34801561058d57600080fd5b506103ce61059c366004613888565b611304565b3480156105ad57600080fd5b506103ce6105bc366004613b53565b611401565b3480156105cd57600080fd5b506103ce6105dc366004613b53565b611442565b3480156105ed57600080fd5b506103ce6105fc366004613647565b61147f565b34801561060d57600080fd5b506103ce61061c366004613647565b6114ae565b34801561062d57600080fd5b5061039661063c366004613647565b6114dd565b34801561064d57600080fd5b5061036961065c366004613647565b6114ef565b34801561066d57600080fd5b50610419600c5481565b34801561068357600080fd5b50610369611683565b34801561069857600080fd5b50610419600b5481565b3480156106ae57600080fd5b506104196106bd366004613b87565b611711565b3480156106ce57600080fd5b506103ce61175f565b3480156106e357600080fd5b506104196106f2366004613647565b6000908152601a602052604090205490565b34801561071057600080fd5b50610369611795565b34801561072557600080fd5b50610419610734366004613647565b6117a2565b34801561074557600080fd5b506016546107539060ff1681565b60405161034b9190613bba565b34801561076c57600080fd5b506008546001600160a01b0316610396565b34801561078a57600080fd5b506103ce610799366004613b53565b6117dd565b3480156107aa57600080fd5b5061036961181a565b3480156107bf57600080fd5b5061041960095481565b3480156107d557600080fd5b506103ce6107e4366004613be2565b611829565b3480156107f557600080fd5b506103696118be565b34801561080a57600080fd5b506103ce610819366004613c20565b6118cb565b34801561082a57600080fd5b506103ce610839366004613c9f565b61191c565b34801561084a57600080fd5b50610369610859366004613647565b611a33565b34801561086a57600080fd5b506103ce610879366004613ccb565b611c87565b34801561088a57600080fd5b506103ce610899366004613647565b611cd5565b3480156108aa57600080fd5b50610419600d5481565b3480156108c057600080fd5b5061033f6108cf366004613cfd565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561090957600080fd5b506103ce610918366004613888565b611d12565b34801561092957600080fd5b506103ce610938366004613b87565b611d5e565b34801561094957600080fd5b506103ce610958366004613675565b611df6565b34801561096957600080fd5b506103ce610978366004613647565b611e7e565b34801561098957600080fd5b506103ce610998366004613d2b565b611ead565b3480156109a957600080fd5b506103ce6109b8366004613647565b611f75565b3480156109c957600080fd5b506103ce6109d8366004613d7d565b611fa4565b60006001600160e01b031982166380ac58cd60e01b1480610a0e57506001600160e01b03198216635b5e139f60e01b145b80610a2957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a3e90613dc8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6a90613dc8565b8015610ab75780601f10610a8c57610100808354040283529160200191610ab7565b820191906000526020600020905b815481529060010190602001808311610a9a57829003601f168201915b5050505050905090565b6000610acc82612052565b610ae9576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b10826114dd565b9050806001600160a01b0316836001600160a01b031603610b445760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b645750610b6281336108cf565b155b15610b82576040516367d9dca160e11b815260040160405180910390fd5b610b8d83838361207d565b505050565b6008546001600160a01b03163314610bc55760405162461bcd60e51b8152600401610bbc90613dfc565b60405180910390fd5b6000818152601260205260408120610bdc916134f2565b50565b60028060165460ff166003811115610bf957610bf9613ba4565b14610c165760405162461bcd60e51b8152600401610bbc90613e31565b600c54803414610c565760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720707269636560a81b6044820152606401610bbc565b600d5460005410610c7a57604051636414c23f60e01b815260040160405180910390fd5b60008881526019602052604090205460ff1615610caa5760405163182c13a560e31b815260040160405180910390fd5b610cb88888888888886120d9565b610cd5576040516309bde33960e01b815260040160405180910390fd5b6000805481526018602090815260408083208b905582548352601482528083208a905582548b8452601a83528184205560198252808320805460ff191660019081179091558151928301909152918152610d31918b918161216b565b505050505050505050565b610b8d83838361233f565b60018060165460ff166003811115610d6157610d61613ba4565b14610d7e5760405162461bcd60e51b8152600401610bbc90613e31565b600c54610d8c908790613e6c565b803414610dc95760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720707269636560a81b6044820152606401610bbc565b600d5460005410610ded57604051636414c23f60e01b815260040160405180910390fd5b8683141580610dfc5750868514155b15610e1a57604051630fa3ef2360e11b815260040160405180910390fd5b60005b87811015610f81576000898983818110610e3957610e39613e8b565b905060200201359050610e898b828a8a86818110610e5957610e59613e8b565b90506020020135898987818110610e7257610e72613e8b565b9050602002810190610e849190613ea1565b61252a565b610ea6576040516306fb10a960e01b815260040160405180910390fd5b60008181526019602052604090205460ff1615610ed65760405163182c13a560e31b815260040160405180910390fd5b806018600084600054610ee99190613eea565b81526020019081526020016000208190555081600054610f099190613eea565b6000828152601a6020526040902055878783818110610f2a57610f2a613e8b565b905060200201356014600084600054610f439190613eea565b815260208082019290925260409081016000908120939093559282526019905220805460ff1916600117905580610f7981613f02565b915050610e1d565b50610d31898989905060405180602001604052806000815250600161216b565b6000807f0000000000000000000000000000000000000000000000000000000000000000600954606485610fd59190613f31565b610fdf9190613e6c565b915091505b9250929050565b6008546001600160a01b031633146110155760405162461bcd60e51b8152600401610bbc90613dfc565b805182511461102357600080fd5b60005b8151811015610b8d5781818151811061104157611041613e8b565b60200260200101516015600085848151811061105f5761105f613e8b565b602002602001015181526020019081526020016000209080519060200190611088929190613510565b508061109381613f02565b915050611026565b6008546001600160a01b031633146110c55760405162461bcd60e51b8152600401610bbc90613dfc565b6016805460ff19169055565b6008546001600160a01b031633146110fb5760405162461bcd60e51b8152600401610bbc90613dfc565b601680546003919060ff19166001835b0217905550600d55565b610b8d838383604051806020016040528060008152506118cb565b6008546001600160a01b0316331461115a5760405162461bcd60e51b8152600401610bbc90613dfc565b60038060165460ff16600381111561117457611174613ba4565b146111915760405162461bcd60e51b8152600401610bbc90613e31565b600d54600054106111b557604051636414c23f60e01b815260040160405180910390fd5b8382146111d557604051630fa3ef2360e11b815260040160405180910390fd5b60005b8481101561129e5760008686838181106111f4576111f4613e8b565b60209081029290920135600081815260199093526040909220549192505060ff16156112335760405163182c13a560e31b815260040160405180910390fd5b8060186000846000546112469190613eea565b815260200190815260200160002081905550816000546112669190613eea565b6000918252601a6020908152604080842092909255601990529020805460ff191660011790558061129681613f02565b9150506111d8565b506112be868686905060405180602001604052806000815250600161216b565b505050505050565b6008546001600160a01b031633146112f05760405162461bcd60e51b8152600401610bbc90613dfc565b601680546002919060ff191660018361110b565b6008546001600160a01b0316331461132e5760405162461bcd60e51b8152600401610bbc90613dfc565b6000828152601260205260409020805461134a90600190613f45565b8154811061135a5761135a613e8b565b60009182526020808320909101548483526012909152604090912080546001600160a01b03909216918390811061139357611393613e8b565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558381526012909152604090208054806113db576113db613f5c565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b6008546001600160a01b0316331461142b5760405162461bcd60e51b8152600401610bbc90613dfc565b805161143e90600e906020840190613510565b5050565b6008546001600160a01b0316331461146c5760405162461bcd60e51b8152600401610bbc90613dfc565b805161143e90600a906020840190613510565b6008546001600160a01b031633146114a95760405162461bcd60e51b8152600401610bbc90613dfc565b601755565b6008546001600160a01b031633146114d85760405162461bcd60e51b8152600401610bbc90613dfc565b600955565b60006114e88261259a565b5192915050565b60606114fa82612052565b61151757604051630a14c4b560e41b815260040160405180910390fd5b6000828152601860205260408120549081811a906115366006836126b4565b6000838152601260205260408120549192505b600b548110156115fc57600084815260116020908152604080832084845290915281206115ba908761157c856001613eea565b6020811061158c5761158c613e8b565b825491901a9081106115a0576115a0613e8b565b6000918252602090912001546001600160a01b03166129db565b9050836115c6826129eb565b6040516020016115d7929190613f72565b60405160208183030381529060405293505080806115f490613f02565b915050611549565b5060005b8181101561166f576000848152601260205260408120805461162d9190849081106115a0576115a0613e8b565b905083611639826129eb565b60405160200161164a929190613f72565b604051602081830303815290604052935050808061166790613f02565b915050611600565b5061167982612c6e565b9695505050505050565b600a805461169090613dc8565b80601f01602080910402602001604051908101604052809291908181526020018280546116bc90613dc8565b80156117095780601f106116de57610100808354040283529160200191611709565b820191906000526020600020905b8154815290600101906020018083116116ec57829003601f168201915b505050505081565b60006001600160a01b03821661173a576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146117895760405162461bcd60e51b8152600401610bbc90613dfc565b6117936000612dd7565b565b6010805461169090613dc8565b60006117ad82612052565b6117ca57604051630a14c4b560e41b815260040160405180910390fd5b5060009081526014602052604090205490565b6008546001600160a01b031633146118075760405162461bcd60e51b8152600401610bbc90613dfc565b805161143e906010906020840190613510565b606060038054610a3e90613dc8565b336001600160a01b038316036118525760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e805461169090613dc8565b6118d684848461233f565b6001600160a01b0383163b151580156118f857506118f684848484612e29565b155b15611916576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146119465760405162461bcd60e51b8152600401610bbc90613dfc565b60008381526011602090815260408083208584529091529020805461196d90600190613f45565b8154811061197d5761197d613e8b565b6000918252602080832090910154858352601182526040808420868552909252912080546001600160a01b0390921691839081106119bd576119bd613e8b565b600091825260208083209190910180546001600160a01b0319166001600160a01b03949094169390931790925584815260118252604080822085835290925220805480611a0c57611a0c613f5c565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b6060611a3e82612052565b611a5b57604051630a14c4b560e41b815260040160405180910390fd5b6000828152601860205260408120549081811a90611a78856114ef565b90506000600f611a8787612f15565b6010600a611a9488613015565b600a611a9f8a613015565b604051602001611ab5979695949392919061403a565b60405160208183030381529060405290508082600e604051602001611adc9392919061414c565b60408051601f198184030181529181526000858152601560205290812080549293509091611b0990613dc8565b90501115611b4c578060156000858152602001908152602001600020604051602001611b3692919061424e565b6040516020818303038152906040529050611b79565b80611b5684612f15565b604051602001611b6792919061428c565b60405160208183030381529060405290505b6000868152601460205260409020548190611b9390612f15565b604051602001611ba49291906142d7565b604051602081830303815290604052905060005b600b54811015611c315781611bd6611bd1836001613eea565b612f15565b611bfb87611be5856001613eea565b60208110611bf557611bf5613e8b565b1a612f15565b604051602001611c0d9392919061434c565b60405160208183030381529060405291508080611c2990613f02565b915050611bb8565b5080604051602001611c4391906143e2565b6040516020818303038152906040529050611c5d81612c6e565b604051602001611c6d9190614408565b604051602081830303815290604052945050505050919050565b6008546001600160a01b03163314611cb15760405162461bcd60e51b8152600401610bbc90613dfc565b600091825260136020526040909120805461ffff191660f09290921c919091179055565b6008546001600160a01b03163314611cff5760405162461bcd60e51b8152600401610bbc90613dfc565b601680546001919060ff1916828061110b565b6008546001600160a01b03163314611d3c5760405162461bcd60e51b8152600401610bbc90613dfc565b6000828152601160209081526040808320848452909152812061143e916134f2565b6008546001600160a01b03163314611d885760405162461bcd60e51b8152600401610bbc90613dfc565b6001600160a01b038116611ded5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bbc565b610bdc81612dd7565b6008546001600160a01b03163314611e205760405162461bcd60e51b8152600401610bbc90613dfc565b80471015611e4357604051639266535160e01b8152476004820152602401610bbc565b80600003611e4e5750475b6001600160a01b038216611e6b576008546001600160a01b031691505b61143e6001600160a01b0383168261306c565b6008546001600160a01b03163314611ea85760405162461bcd60e51b8152600401610bbc90613dfc565b600c55565b6008546001600160a01b03163314611ed75760405162461bcd60e51b8152600401610bbc90613dfc565b600b548310611ee557600080fd5b6000611f2683838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061318592505050565b600095865260116020908152604080882096885295815294862080546001810182559087529490952090930180546001600160a01b0319166001600160a01b0390951694909417909355505050565b6008546001600160a01b03163314611f9f5760405162461bcd60e51b8152600401610bbc90613dfc565b601b55565b6008546001600160a01b03163314611fce5760405162461bcd60e51b8152600401610bbc90613dfc565b600061200f83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061318592505050565b600094855260126020908152604086208054600181018255908752952090940180546001600160a01b0319166001600160a01b0390951694909417909355505050565b6000805482108015610a29575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006121608383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060175460405190925061212691508990899061444d565b60408051918290038220602083015281018b9052606081018a90526080015b604051602081830303815290604052805190602001206131ea565b979650505050505050565b6000546001600160a01b03851661219457604051622e076360e81b815260040160405180910390fd5b836000036121b55760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561226657506001600160a01b0387163b15155b156122ee575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46122b76000888480600101955088612e29565b6122d4576040516368d2bf6b60e11b815260040160405180910390fd5b80820361226c5782600054146122e957600080fd5b612333565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082036122ef575b506000555b5050505050565b600061234a8261259a565b9050836001600160a01b031681600001516001600160a01b0316146123815760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061239f575061239f85336108cf565b806123ba5750336123af84610ac1565b6001600160a01b0316145b9050806123da57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661240157604051633a954ecd60e21b815260040160405180910390fd5b61240d6000848761207d565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166124e15760005482146124e157805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612338565b600061167983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601b546040516bffffffffffffffffffffffff1960608d901b166020820152603481018b9052605481018a90529092506074019050612145565b60408051606081018252600080825260208201819052918101919091528160005481101561269b57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906126995780516001600160a01b031615612630579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612694579392505050565b612630565b505b604051636f96cda160e11b815260040160405180910390fd5b60008181526013602052604081205460609160f082901b9161ffff1690036126dd5750600160f81b5b60408051600e808252818301909252600091602082018180368337019050509050604d60f81b8160008151811061271657612716613e8b565b60200101906001600160f81b031916908160001a905350605460f81b8160018151811061274557612745613e8b565b60200101906001600160f81b031916908160001a905350606860f81b8160028151811061277457612774613e8b565b60200101906001600160f81b031916908160001a905350606460f81b816003815181106127a3576127a3613e8b565b60200101906001600160f81b031916908160001a905350600060f81b816004815181106127d2576127d2613e8b565b60200101906001600160f81b031916908160001a905350600060f81b8160058151811061280157612801613e8b565b60200101906001600160f81b031916908160001a905350600060f81b8160068151811061283057612830613e8b565b60200101906001600160f81b031916908160001a905350600660f81b8160078151811061285f5761285f613e8b565b60200101906001600160f81b031916908160001a905350600060f81b8160088151811061288e5761288e613e8b565b60200101906001600160f81b031916908160001a9053508460ff166001036128e457600060f81b816009815181106128c8576128c8613e8b565b60200101906001600160f81b031916908160001a905350612914565b600160f81b816009815181106128fc576128fc613e8b565b60200101906001600160f81b031916908160001a9053505b600060f81b81600a8151811061292c5761292c613e8b565b60200101906001600160f81b031916908160001a9053508460f81b81600b8151811061295a5761295a613e8b565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600c8151811061298b5761298b613e8b565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600d815181106129bc576129bc613e8b565b60200101906001600160f81b031916908160001a905350949350505050565b6060610a29826001600019613202565b60408051600880825281830190925260609160009190602082018180368337019050509050604d60f81b81600081518110612a2857612a28613e8b565b60200101906001600160f81b031916908160001a905350605460f81b81600181518110612a5757612a57613e8b565b60200101906001600160f81b031916908160001a905350607260f81b81600281518110612a8657612a86613e8b565b60200101906001600160f81b031916908160001a905350606b60f81b81600381518110612ab557612ab5613e8b565b60200101906001600160f81b031916908160001a90535060008351604051602001612ae291815260200190565b60405160208183030381529060405290508060048251612b029190613f45565b81518110612b1257612b12613e8b565b602001015160f81c60f81b82600481518110612b3057612b30613e8b565b60200101906001600160f81b031916908160001a9053508060038251612b569190613f45565b81518110612b6657612b66613e8b565b602001015160f81c60f81b82600581518110612b8457612b84613e8b565b60200101906001600160f81b031916908160001a9053508060028251612baa9190613f45565b81518110612bba57612bba613e8b565b602001015160f81c60f81b82600681518110612bd857612bd8613e8b565b60200101906001600160f81b031916908160001a9053508060018251612bfe9190613f45565b81518110612c0e57612c0e613e8b565b602001015160f81c60f81b82600781518110612c2c57612c2c613e8b565b60200101906001600160f81b031916908160001a9053508184604051602001612c56929190613f72565b60405160208183030381529060405292505050919050565b80516060906000819003612c92575050604080516020810190915260008152919050565b60006003612ca1836002613eea565b612cab9190613f31565b612cb6906004613e6c565b90506000612cc5826020613eea565b6001600160401b03811115612cdc57612cdc6138aa565b6040519080825280601f01601f191660200182016040528015612d06576020820181803683370190505b5090506000604051806060016040528060408152602001614550604091399050600181016020830160005b86811015612d92576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612d31565b506003860660018114612dac5760028114612dbd57612dc9565b613d3d60f01b600119830152612dc9565b603d60f81b6000198301525b505050918152949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612e5e90339089908890889060040161445d565b6020604051808303816000875af1925050508015612e99575060408051601f3d908101601f19168201909252612e9691810190614490565b60015b612ef7573d808015612ec7576040519150601f19603f3d011682016040523d82523d6000602084013e612ecc565b606091505b508051600003612eef576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081600003612f3c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f665780612f5081613f02565b9150612f5f9050600a83613f31565b9150612f40565b6000816001600160401b03811115612f8057612f806138aa565b6040519080825280601f01601f191660200182016040528015612faa576020820181803683370190505b5090505b8415612f0d57612fbf600183613f45565b9150612fcc600a866144ad565b612fd7906030613eea565b60f81b818381518110612fec57612fec613e8b565b60200101906001600160f81b031916908160001a90535061300e600a86613f31565b9450612fae565b60608160000361303f5750506040805180820190915260048152630307830360e41b602082015290565b8160005b8115613062578061305381613f02565b915050600882901c9150613043565b612f0d84826132b7565b804710156130bc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bbc565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613109576040519150601f19603f3d011682016040523d82523d6000602084013e61310e565b606091505b5050905080610b8d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bbc565b6000806131b08360405160200161319c91906144c1565b604051602081830303815290604052613452565b90508051602082016000f091506001600160a01b0382166131e45760405163046a55db60e11b815260040160405180910390fd5b50919050565b6000826131f7858461347e565b1490505b9392505050565b6060833b60008190036132255750506040805160208101909152600081526131fb565b808411156132435750506040805160208101909152600081526131fb565b838310156132755760405163162544fd60e11b8152600481018290526024810185905260448101849052606401610bbc565b838303848203600082821061328a578261328c565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b606060006132c6836002613e6c565b6132d1906002613eea565b6001600160401b038111156132e8576132e86138aa565b6040519080825280601f01601f191660200182016040528015613312576020820181803683370190505b509050600360fc1b8160008151811061332d5761332d613e8b565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061335c5761335c613e8b565b60200101906001600160f81b031916908160001a9053506000613380846002613e6c565b61338b906001613eea565b90505b6001811115613403576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106133bf576133bf613e8b565b1a60f81b8282815181106133d5576133d5613e8b565b60200101906001600160f81b031916908160001a90535060049490941c936133fc816144e7565b905061338e565b5083156131fb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610bbc565b60608151826040516020016134689291906144fe565b6040516020818303038152906040529050919050565b600081815b84518110156134ea5760008582815181106134a0576134a0613e8b565b602002602001015190508083116134c657600083815260208290526040902092506134d7565b600081815260208490526040902092505b50806134e281613f02565b915050613483565b509392505050565b5080546000825590600052602060002090810190610bdc9190613594565b82805461351c90613dc8565b90600052602060002090601f01602090048101928261353e5760008555613584565b82601f1061355757805160ff1916838001178555613584565b82800160010185558215613584579182015b82811115613584578251825591602001919060010190613569565b50613590929150613594565b5090565b5b808211156135905760008155600101613595565b6001600160e01b031981168114610bdc57600080fd5b6000602082840312156135d157600080fd5b81356131fb816135a9565b60005b838110156135f75781810151838201526020016135df565b838111156119165750506000910152565b600081518084526136208160208601602086016135dc565b601f01601f19169290920160200192915050565b6020815260006131fb6020830184613608565b60006020828403121561365957600080fd5b5035919050565b6001600160a01b0381168114610bdc57600080fd5b6000806040838503121561368857600080fd5b823561369381613660565b946020939093013593505050565b60008083601f8401126136b357600080fd5b5081356001600160401b038111156136ca57600080fd5b602083019150836020828501011115610fe457600080fd5b60008083601f8401126136f457600080fd5b5081356001600160401b0381111561370b57600080fd5b6020830191508360208260051b8501011115610fe457600080fd5b600080600080600080600060a0888a03121561374157600080fd5b873561374c81613660565b9650602088013595506040880135945060608801356001600160401b038082111561377657600080fd5b6137828b838c016136a1565b909650945060808a013591508082111561379b57600080fd5b506137a88a828b016136e2565b989b979a50959850939692959293505050565b6000806000606084860312156137d057600080fd5b83356137db81613660565b925060208401356137eb81613660565b929592945050506040919091013590565b60008060008060008060006080888a03121561381757600080fd5b873561382281613660565b965060208801356001600160401b038082111561383e57600080fd5b61384a8b838c016136e2565b909850965060408a013591508082111561386357600080fd5b61386f8b838c016136e2565b909650945060608a013591508082111561379b57600080fd5b6000806040838503121561389b57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156138e8576138e86138aa565b604052919050565b60006001600160401b03821115613909576139096138aa565b5060051b60200190565b60006001600160401b0383111561392c5761392c6138aa565b61393f601f8401601f19166020016138c0565b905082815283838301111561395357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261397b57600080fd5b6131fb83833560208501613913565b600082601f83011261399b57600080fd5b813560206139b06139ab836138f0565b6138c0565b82815260059290921b840181019181810190868411156139cf57600080fd5b8286015b84811015613a0e5780356001600160401b038111156139f25760008081fd5b613a008986838b010161396a565b8452509183019183016139d3565b509695505050505050565b60008060408385031215613a2c57600080fd5b82356001600160401b0380821115613a4357600080fd5b818501915085601f830112613a5757600080fd5b81356020613a676139ab836138f0565b82815260059290921b84018101918181019089841115613a8657600080fd5b948201945b83861015613aa457853582529482019490820190613a8b565b96505086013592505080821115613aba57600080fd5b50613ac78582860161398a565b9150509250929050565b600080600080600060608688031215613ae957600080fd5b8535613af481613660565b945060208601356001600160401b0380821115613b1057600080fd5b613b1c89838a016136e2565b90965094506040880135915080821115613b3557600080fd5b50613b42888289016136e2565b969995985093965092949392505050565b600060208284031215613b6557600080fd5b81356001600160401b03811115613b7b57600080fd5b612f0d8482850161396a565b600060208284031215613b9957600080fd5b81356131fb81613660565b634e487b7160e01b600052602160045260246000fd5b6020810160048310613bdc57634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215613bf557600080fd5b8235613c0081613660565b915060208301358015158114613c1557600080fd5b809150509250929050565b60008060008060808587031215613c3657600080fd5b8435613c4181613660565b93506020850135613c5181613660565b92506040850135915060608501356001600160401b03811115613c7357600080fd5b8501601f81018713613c8457600080fd5b613c9387823560208401613913565b91505092959194509250565b600080600060608486031215613cb457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613cde57600080fd5b8235915060208301356001600160f01b031981168114613c1557600080fd5b60008060408385031215613d1057600080fd5b8235613d1b81613660565b91506020830135613c1581613660565b60008060008060608587031215613d4157600080fd5b843593506020850135925060408501356001600160401b03811115613d6557600080fd5b613d71878288016136a1565b95989497509550505050565b600080600060408486031215613d9257600080fd5b8335925060208401356001600160401b03811115613daf57600080fd5b613dbb868287016136a1565b9497909650939450505050565b600181811c90821680613ddc57607f821691505b6020821081036131e457634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600b908201526a57726f6e6720706861736560a81b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613e8657613e86613e56565b500290565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112613eb857600080fd5b8301803591506001600160401b03821115613ed257600080fd5b6020019150600581901b3603821315610fe457600080fd5b60008219821115613efd57613efd613e56565b500190565b600060018201613f1457613f14613e56565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082613f4057613f40613f1b565b500490565b600082821015613f5757613f57613e56565b500390565b634e487b7160e01b600052603160045260246000fd5b60008351613f848184602088016135dc565b835190830190613f988183602088016135dc565b01949350505050565b8054600090600181811c9080831680613fbb57607f831692505b60208084108203613fdc57634e487b7160e01b600052602260045260246000fd5b818015613ff057600181146140015761402e565b60ff1986168952848901965061402e565b60008881526020902060005b868110156140265781548b82015290850190830161400d565b505084890196505b50505050505092915050565b683d913730b6b2911d1160b91b81526000614058600983018a613fa1565b61202360f01b81528851614073816002840160208d016135dc565b72111610113232b9b1b934b83a34b7b7111d101160691b600292909101918201526140a16015820189613fa1565b6c1116101134b6b0b3b2911d101160991b815290506140c3600d820188613fa1565b9050662f696d6167652f60c81b815285516140e5816007840160208a016135dc565b741116101130b734b6b0ba34b7b72fbab936111d101160591b60079290910191820152614115601c820186613fa1565b90506a2f616e696d6174696f6e2f60a81b8152835161413b81600b8401602088016135dc565b01600b019998505050505050505050565b6000845161415e8184602089016135dc565b80830190507f222c20226d696469223a2022646174613a617564696f2f6d6964693b626173658152620d8d0b60ea1b602082015284516141a58160238401602089016135dc565b7f222c202265787465726e616c5f75726c223a202268747470733a2f2f62656174602392909101918201527f666f756e6472792e78797a222c2022636f6d706f736572223a202200000000006043820152614203605e820185613fa1565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a8152710101129b7b733911610113b30b63ab2911d160751b60208201526032019695505050505050565b600083516142608184602088016135dc565b601160f91b9083019081526142786001820185613fa1565b61227d60f01b815260020195945050505050565b6000835161429e8184602088016135dc565b601160f91b90830190815283516142bc8160018401602088016135dc565b61227d60f01b60019290910191820152600301949350505050565b600083516142e98184602088016135dc565b80830190507f2c207b2274726169745f74797065223a2022436f766572222c202276616c7565815263111d101160e11b602082015283516143318160248401602088016135dc565b61227d60f01b60249290910191820152602601949350505050565b6000845161435e8184602089016135dc565b7f2c207b2274726169745f74797065223a20225374656d2000000000000000000090830190815284516143988160178401602089016135dc565b6c111610113b30b63ab2911d101160991b6017929091019182015283516143c68160248401602088016135dc565b61227d60f01b6024929091019182015260260195945050505050565b600082516143f48184602087016135dc565b615d7d60f01b920191825250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161444081601d8501602087016135dc565b91909101601d0192915050565b8183823760009101908152919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061167990830184613608565b6000602082840312156144a257600080fd5b81516131fb816135a9565b6000826144bc576144bc613f1b565b500690565b60008152600082516144da8160018501602087016135dc565b9190910160010192915050565b6000816144f6576144f6613e56565b506000190190565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b6005820152815160009061454181600e8501602087016135dc565b91909101600e01939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122041d600204f6338686d7d2304c225c04c1e7a5579dfe9f1b37a77d6f3e025337164736f6c634300080d003360806040523480156200001157600080fd5b5060405162001a3b38038062001a3b8339810160408190526200003491620005aa565b82828051825114620000a85760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620000fb5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200009f565b60005b82518110156200016757620001528382815181106200012157620001216200068c565b60200260200101518383815181106200013e576200013e6200068c565b60200260200101516200019860201b60201c565b806200015e81620006b8565b915050620000fe565b505050620001846200017e6200038460201b60201c565b62000388565b6200018f81620003da565b505050620006ef565b6001600160a01b038216620002055760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016200009f565b60008111620002575760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016200009f565b6001600160a01b03821660009081526002602052604090205415620002d35760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b60648201526084016200009f565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0384169081179091556000908152600260205260408120829055546200033b908290620006d4565b600055604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546001600160a01b03163314620004365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200009f565b6001600160a01b0381166200049d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200009f565b620004a88162000388565b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004ec57620004ec620004ab565b604052919050565b60006001600160401b03821115620005105762000510620004ab565b5060051b60200190565b80516001600160a01b03811681146200053257600080fd5b919050565b600082601f8301126200054957600080fd5b81516020620005626200055c83620004f4565b620004c1565b82815260059290921b840181019181810190868411156200058257600080fd5b8286015b848110156200059f578051835291830191830162000586565b509695505050505050565b600080600060608486031215620005c057600080fd5b83516001600160401b0380821115620005d857600080fd5b818601915086601f830112620005ed57600080fd5b81516020620006006200055c83620004f4565b82815260059290921b8401810191818101908a8411156200062057600080fd5b948201945b83861015620006495762000639866200051a565b8252948201949082019062000625565b918901519197509093505050808211156200066357600080fd5b50620006728682870162000537565b92505062000683604085016200051a565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620006cd57620006cd620006a2565b5060010190565b60008219821115620006ea57620006ea620006a2565b500190565b61133c80620006ff6000396000f3fe6080604052600436106100ec5760003560e01c80638b83209b1161008a578063ce7c2ac211610059578063ce7c2ac2146102e7578063d79779b21461031d578063e33b7de314610353578063f2fde38b1461036857600080fd5b80638b83209b1461023b5780638da5cb5b146102735780639852595c14610291578063b4047692146102c757600080fd5b80633a98ef39116100c65780633a98ef391461019c578063406072a9146101c057806348b7504414610206578063715018a61461022657600080fd5b806308bf2d601461013a57806318f9b0231461015c578063191655871461017c57600080fd5b36610135577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561014657600080fd5b5061015a610155366004611002565b610388565b005b34801561016857600080fd5b5061015a610177366004611039565b6103c9565b34801561018857600080fd5b5061015a610197366004611065565b6103fd565b3480156101a857600080fd5b506000545b6040519081526020015b60405180910390f35b3480156101cc57600080fd5b506101ad6101db366004611082565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561021257600080fd5b5061015a610221366004611082565b61052e565b34801561023257600080fd5b5061015a61070a565b34801561024757600080fd5b5061025b6102563660046110bb565b610740565b6040516001600160a01b0390911681526020016101b7565b34801561027f57600080fd5b506007546001600160a01b031661025b565b34801561029d57600080fd5b506101ad6102ac366004611065565b6001600160a01b031660009081526003602052604090205490565b3480156102d357600080fd5b5061015a6102e23660046110bb565b610770565b3480156102f357600080fd5b506101ad610302366004611065565b6001600160a01b031660009081526002602052604090205490565b34801561032957600080fd5b506101ad610338366004611065565b6001600160a01b031660009081526005602052604090205490565b34801561035f57600080fd5b506001546101ad565b34801561037457600080fd5b5061015a610383366004611065565b6107a6565b6007546001600160a01b031633146103bb5760405162461bcd60e51b81526004016103b2906110d4565b60405180910390fd5b6103c5828261083e565b5050565b6007546001600160a01b031633146103f35760405162461bcd60e51b81526004016103b2906110d4565b6103c58282610913565b6001600160a01b0381166000908152600260205260409020546104325760405162461bcd60e51b81526004016103b290611109565b600061043d60015490565b6104479047611165565b90506000610474838361046f866001600160a01b031660009081526003602052604090205490565b610af7565b9050806000036104965760405162461bcd60e51b81526004016103b29061117d565b6001600160a01b038316600090815260036020526040812080548392906104be908490611165565b9250508190555080600160008282546104d79190611165565b909155506104e790508382610b3c565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6001600160a01b0381166000908152600260205260409020546105635760405162461bcd60e51b81526004016103b290611109565b6001600160a01b0382166000908152600560205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156105c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e491906111c8565b6105ee9190611165565b90506000610627838361046f87876001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b9050806000036106495760405162461bcd60e51b81526004016103b29061117d565b6001600160a01b03808516600090815260066020908152604080832093871683529290529081208054839290610680908490611165565b90915550506001600160a01b038416600090815260056020526040812080548392906106ad908490611165565b909155506106be9050848483610c5a565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6007546001600160a01b031633146107345760405162461bcd60e51b81526004016103b2906110d4565b61073e6000610cac565b565b600060048281548110610755576107556111e1565b6000918252602090912001546001600160a01b031692915050565b6007546001600160a01b0316331461079a5760405162461bcd60e51b81526004016103b2906110d4565b6107a381610cfe565b50565b6007546001600160a01b031633146107d05760405162461bcd60e51b81526004016103b2906110d4565b6001600160a01b0381166108355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103b2565b6107a381610cac565b6000811161088e5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016103b2565b60006002600061089d85610740565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905081600260006108ce86610740565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550818160005461090191906111f7565b61090b9190611165565b600055505050565b6001600160a01b03821661097e5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016103b2565b600081116109ce5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016103b2565b6001600160a01b03821660009081526002602052604090205415610a485760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b60648201526084016103b2565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b038416908117909155600090815260026020526040812082905554610aae908290611165565b600055604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b600080546001600160a01b038516825260026020526040822054839190610b1e908661120e565b610b28919061122d565b610b3291906111f7565b90505b9392505050565b80471015610b8c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016103b2565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610bd9576040519150601f19603f3d011682016040523d82523d6000602084013e610bde565b606091505b5050905080610c555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016103b2565b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c55908490610e1c565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060026000610d0d84610740565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050600060026000610d3f85610740565b6001600160a01b0316815260208101919091526040016000205560048054610d69906001906111f7565b81548110610d7957610d796111e1565b600091825260209091200154600480546001600160a01b039092169184908110610da557610da56111e1565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506004805480610de457610de461124f565b600082815260208120820160001990810180546001600160a01b031916905590910190915554610e159082906111f7565b6000555050565b6000610e71826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610eee9092919063ffffffff16565b805190915015610c555780806020019051810190610e8f9190611265565b610c555760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b2565b6060610b328484600085856001600160a01b0385163b610f505760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b2565b600080866001600160a01b03168587604051610f6c91906112b7565b60006040518083038185875af1925050503d8060008114610fa9576040519150601f19603f3d011682016040523d82523d6000602084013e610fae565b606091505b5091509150610fbe828286610fc9565b979650505050505050565b60608315610fd8575081610b35565b825115610fe85782518084602001fd5b8160405162461bcd60e51b81526004016103b291906112d3565b6000806040838503121561101557600080fd5b50508035926020909101359150565b6001600160a01b03811681146107a357600080fd5b6000806040838503121561104c57600080fd5b823561105781611024565b946020939093013593505050565b60006020828403121561107757600080fd5b8135610b3581611024565b6000806040838503121561109557600080fd5b82356110a081611024565b915060208301356110b081611024565b809150509250929050565b6000602082840312156110cd57600080fd5b5035919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156111785761117861114f565b500190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6000602082840312156111da57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000828210156112095761120961114f565b500390565b60008160001904831182151516156112285761122861114f565b500290565b60008261124a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b60006020828403121561127757600080fd5b81518015158114610b3557600080fd5b60005b838110156112a257818101518382015260200161128a565b838111156112b1576000848401525b50505050565b600082516112c9818460208701611287565b9190910192915050565b60208152600082518060208401526112f2816040850160208701611287565b601f01601f1916919091016040019291505056fea264697066735822122084a45863f9feeef39fb7b3156246b29ff9c173193701a218c59e1caa5585b8b764736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000002868747470733a2f2f6170692e62656174666f756e6472792e78797a2f6170692f76312f6e66742f310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007427269646765730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064272696467650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b4f73686927732066697273742067656e6572617469766520636f6c6c656374696f6e2077697468204265617420466f756e6472792e204265617420466f756e647279277320666972737420636f6c6c656374696f6e2077697468206f6e2d636861696e206c79726963732e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004425244470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044f73686900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000099c27ea3331137d2d1030647d2cef9c3549d73f40000000000000000000000004d18f8f2ae19f1e166c97793cceeb70680a2b6d20000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000046

Deployed Bytecode

0x60806040526004361061031a5760003560e01c80636cf3884d116101ab578063b88d4fde116100f7578063ef14817711610095578063f4a0a5281161006f578063f4a0a5281461095d578063f7403fef1461097d578063f95df4141461099d578063faff57d1146109bd57600080fd5b8063ef148177146108fd578063f2fde38b1461091d578063f3fef3a31461093d57600080fd5b8063ca3bd325116100d1578063ca3bd3251461085e578063d54802881461087e578063d5abeb011461089e578063e985e9c5146108b457600080fd5b8063b88d4fde146107fe578063bdcea4bc1461081e578063c87b56dd1461083e57600080fd5b80637e5ac09a1161016457806395d89b411161013e57806395d89b411461079e5780639f67756d146107b3578063a22cb465146107c9578063aeb1fe51146107e957600080fd5b80637e5ac09a146107395780638da5cb5b1461076057806390c3f38f1461077e57600080fd5b80636cf3884d1461068c57806370a08231146106a2578063715018a6146106c2578063719d9357146106d75780637284e4161461070457806374e1ee411461071957600080fd5b806336b46fc41161026a57806355f804b3116102235780636352211e116101fd5780636352211e1461062157806367a44c64146106415780636817c76c146106615780636c0360eb1461067757600080fd5b806355f804b3146105c15780635c91f25c146105e157806361ba27da1461060157600080fd5b806336b46fc41461050157806342842e0e146105215780634447c28b1461054157806344f4f0e8146105615780634565773514610581578063521993e3146105a157600080fd5b80631a62ae32116102d757806323e7907d116102b157806323e7907d1461047a5780632a55205a1461048d57806333ba01a1146104cc57806334452f38146104ec57600080fd5b80631a62ae32146104275780631d140e991461044757806323b872dd1461045a57600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780631663ee03146103d057806318160ddd14610404575b600080fd5b34801561032b57600080fd5b5061033f61033a3660046135bf565b6109dd565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610a2f565b60405161034b9190613634565b34801561038257600080fd5b50610396610391366004613647565b610ac1565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004613675565b610b05565b005b3480156103dc57600080fd5b506103967f000000000000000000000000f3948cc136c7a35f6bcab002be7bf1b61e7759f181565b34801561041057600080fd5b50600154600054035b60405190815260200161034b565b34801561043357600080fd5b506103ce610442366004613647565b610b92565b6103ce610455366004613726565b610bdf565b34801561046657600080fd5b506103ce6104753660046137bb565b610d3c565b6103ce6104883660046137fc565b610d47565b34801561049957600080fd5b506104ad6104a8366004613888565b610fa1565b604080516001600160a01b03909316835260208301919091520161034b565b3480156104d857600080fd5b506103ce6104e7366004613a19565b610feb565b3480156104f857600080fd5b506103ce61109b565b34801561050d57600080fd5b506103ce61051c366004613647565b6110d1565b34801561052d57600080fd5b506103ce61053c3660046137bb565b611115565b34801561054d57600080fd5b506103ce61055c366004613ad1565b611130565b34801561056d57600080fd5b506103ce61057c366004613647565b6112c6565b34801561058d57600080fd5b506103ce61059c366004613888565b611304565b3480156105ad57600080fd5b506103ce6105bc366004613b53565b611401565b3480156105cd57600080fd5b506103ce6105dc366004613b53565b611442565b3480156105ed57600080fd5b506103ce6105fc366004613647565b61147f565b34801561060d57600080fd5b506103ce61061c366004613647565b6114ae565b34801561062d57600080fd5b5061039661063c366004613647565b6114dd565b34801561064d57600080fd5b5061036961065c366004613647565b6114ef565b34801561066d57600080fd5b50610419600c5481565b34801561068357600080fd5b50610369611683565b34801561069857600080fd5b50610419600b5481565b3480156106ae57600080fd5b506104196106bd366004613b87565b611711565b3480156106ce57600080fd5b506103ce61175f565b3480156106e357600080fd5b506104196106f2366004613647565b6000908152601a602052604090205490565b34801561071057600080fd5b50610369611795565b34801561072557600080fd5b50610419610734366004613647565b6117a2565b34801561074557600080fd5b506016546107539060ff1681565b60405161034b9190613bba565b34801561076c57600080fd5b506008546001600160a01b0316610396565b34801561078a57600080fd5b506103ce610799366004613b53565b6117dd565b3480156107aa57600080fd5b5061036961181a565b3480156107bf57600080fd5b5061041960095481565b3480156107d557600080fd5b506103ce6107e4366004613be2565b611829565b3480156107f557600080fd5b506103696118be565b34801561080a57600080fd5b506103ce610819366004613c20565b6118cb565b34801561082a57600080fd5b506103ce610839366004613c9f565b61191c565b34801561084a57600080fd5b50610369610859366004613647565b611a33565b34801561086a57600080fd5b506103ce610879366004613ccb565b611c87565b34801561088a57600080fd5b506103ce610899366004613647565b611cd5565b3480156108aa57600080fd5b50610419600d5481565b3480156108c057600080fd5b5061033f6108cf366004613cfd565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561090957600080fd5b506103ce610918366004613888565b611d12565b34801561092957600080fd5b506103ce610938366004613b87565b611d5e565b34801561094957600080fd5b506103ce610958366004613675565b611df6565b34801561096957600080fd5b506103ce610978366004613647565b611e7e565b34801561098957600080fd5b506103ce610998366004613d2b565b611ead565b3480156109a957600080fd5b506103ce6109b8366004613647565b611f75565b3480156109c957600080fd5b506103ce6109d8366004613d7d565b611fa4565b60006001600160e01b031982166380ac58cd60e01b1480610a0e57506001600160e01b03198216635b5e139f60e01b145b80610a2957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a3e90613dc8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6a90613dc8565b8015610ab75780601f10610a8c57610100808354040283529160200191610ab7565b820191906000526020600020905b815481529060010190602001808311610a9a57829003601f168201915b5050505050905090565b6000610acc82612052565b610ae9576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b10826114dd565b9050806001600160a01b0316836001600160a01b031603610b445760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b645750610b6281336108cf565b155b15610b82576040516367d9dca160e11b815260040160405180910390fd5b610b8d83838361207d565b505050565b6008546001600160a01b03163314610bc55760405162461bcd60e51b8152600401610bbc90613dfc565b60405180910390fd5b6000818152601260205260408120610bdc916134f2565b50565b60028060165460ff166003811115610bf957610bf9613ba4565b14610c165760405162461bcd60e51b8152600401610bbc90613e31565b600c54803414610c565760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720707269636560a81b6044820152606401610bbc565b600d5460005410610c7a57604051636414c23f60e01b815260040160405180910390fd5b60008881526019602052604090205460ff1615610caa5760405163182c13a560e31b815260040160405180910390fd5b610cb88888888888886120d9565b610cd5576040516309bde33960e01b815260040160405180910390fd5b6000805481526018602090815260408083208b905582548352601482528083208a905582548b8452601a83528184205560198252808320805460ff191660019081179091558151928301909152918152610d31918b918161216b565b505050505050505050565b610b8d83838361233f565b60018060165460ff166003811115610d6157610d61613ba4565b14610d7e5760405162461bcd60e51b8152600401610bbc90613e31565b600c54610d8c908790613e6c565b803414610dc95760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720707269636560a81b6044820152606401610bbc565b600d5460005410610ded57604051636414c23f60e01b815260040160405180910390fd5b8683141580610dfc5750868514155b15610e1a57604051630fa3ef2360e11b815260040160405180910390fd5b60005b87811015610f81576000898983818110610e3957610e39613e8b565b905060200201359050610e898b828a8a86818110610e5957610e59613e8b565b90506020020135898987818110610e7257610e72613e8b565b9050602002810190610e849190613ea1565b61252a565b610ea6576040516306fb10a960e01b815260040160405180910390fd5b60008181526019602052604090205460ff1615610ed65760405163182c13a560e31b815260040160405180910390fd5b806018600084600054610ee99190613eea565b81526020019081526020016000208190555081600054610f099190613eea565b6000828152601a6020526040902055878783818110610f2a57610f2a613e8b565b905060200201356014600084600054610f439190613eea565b815260208082019290925260409081016000908120939093559282526019905220805460ff1916600117905580610f7981613f02565b915050610e1d565b50610d31898989905060405180602001604052806000815250600161216b565b6000807f000000000000000000000000f3948cc136c7a35f6bcab002be7bf1b61e7759f1600954606485610fd59190613f31565b610fdf9190613e6c565b915091505b9250929050565b6008546001600160a01b031633146110155760405162461bcd60e51b8152600401610bbc90613dfc565b805182511461102357600080fd5b60005b8151811015610b8d5781818151811061104157611041613e8b565b60200260200101516015600085848151811061105f5761105f613e8b565b602002602001015181526020019081526020016000209080519060200190611088929190613510565b508061109381613f02565b915050611026565b6008546001600160a01b031633146110c55760405162461bcd60e51b8152600401610bbc90613dfc565b6016805460ff19169055565b6008546001600160a01b031633146110fb5760405162461bcd60e51b8152600401610bbc90613dfc565b601680546003919060ff19166001835b0217905550600d55565b610b8d838383604051806020016040528060008152506118cb565b6008546001600160a01b0316331461115a5760405162461bcd60e51b8152600401610bbc90613dfc565b60038060165460ff16600381111561117457611174613ba4565b146111915760405162461bcd60e51b8152600401610bbc90613e31565b600d54600054106111b557604051636414c23f60e01b815260040160405180910390fd5b8382146111d557604051630fa3ef2360e11b815260040160405180910390fd5b60005b8481101561129e5760008686838181106111f4576111f4613e8b565b60209081029290920135600081815260199093526040909220549192505060ff16156112335760405163182c13a560e31b815260040160405180910390fd5b8060186000846000546112469190613eea565b815260200190815260200160002081905550816000546112669190613eea565b6000918252601a6020908152604080842092909255601990529020805460ff191660011790558061129681613f02565b9150506111d8565b506112be868686905060405180602001604052806000815250600161216b565b505050505050565b6008546001600160a01b031633146112f05760405162461bcd60e51b8152600401610bbc90613dfc565b601680546002919060ff191660018361110b565b6008546001600160a01b0316331461132e5760405162461bcd60e51b8152600401610bbc90613dfc565b6000828152601260205260409020805461134a90600190613f45565b8154811061135a5761135a613e8b565b60009182526020808320909101548483526012909152604090912080546001600160a01b03909216918390811061139357611393613e8b565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558381526012909152604090208054806113db576113db613f5c565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b6008546001600160a01b0316331461142b5760405162461bcd60e51b8152600401610bbc90613dfc565b805161143e90600e906020840190613510565b5050565b6008546001600160a01b0316331461146c5760405162461bcd60e51b8152600401610bbc90613dfc565b805161143e90600a906020840190613510565b6008546001600160a01b031633146114a95760405162461bcd60e51b8152600401610bbc90613dfc565b601755565b6008546001600160a01b031633146114d85760405162461bcd60e51b8152600401610bbc90613dfc565b600955565b60006114e88261259a565b5192915050565b60606114fa82612052565b61151757604051630a14c4b560e41b815260040160405180910390fd5b6000828152601860205260408120549081811a906115366006836126b4565b6000838152601260205260408120549192505b600b548110156115fc57600084815260116020908152604080832084845290915281206115ba908761157c856001613eea565b6020811061158c5761158c613e8b565b825491901a9081106115a0576115a0613e8b565b6000918252602090912001546001600160a01b03166129db565b9050836115c6826129eb565b6040516020016115d7929190613f72565b60405160208183030381529060405293505080806115f490613f02565b915050611549565b5060005b8181101561166f576000848152601260205260408120805461162d9190849081106115a0576115a0613e8b565b905083611639826129eb565b60405160200161164a929190613f72565b604051602081830303815290604052935050808061166790613f02565b915050611600565b5061167982612c6e565b9695505050505050565b600a805461169090613dc8565b80601f01602080910402602001604051908101604052809291908181526020018280546116bc90613dc8565b80156117095780601f106116de57610100808354040283529160200191611709565b820191906000526020600020905b8154815290600101906020018083116116ec57829003601f168201915b505050505081565b60006001600160a01b03821661173a576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146117895760405162461bcd60e51b8152600401610bbc90613dfc565b6117936000612dd7565b565b6010805461169090613dc8565b60006117ad82612052565b6117ca57604051630a14c4b560e41b815260040160405180910390fd5b5060009081526014602052604090205490565b6008546001600160a01b031633146118075760405162461bcd60e51b8152600401610bbc90613dfc565b805161143e906010906020840190613510565b606060038054610a3e90613dc8565b336001600160a01b038316036118525760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e805461169090613dc8565b6118d684848461233f565b6001600160a01b0383163b151580156118f857506118f684848484612e29565b155b15611916576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146119465760405162461bcd60e51b8152600401610bbc90613dfc565b60008381526011602090815260408083208584529091529020805461196d90600190613f45565b8154811061197d5761197d613e8b565b6000918252602080832090910154858352601182526040808420868552909252912080546001600160a01b0390921691839081106119bd576119bd613e8b565b600091825260208083209190910180546001600160a01b0319166001600160a01b03949094169390931790925584815260118252604080822085835290925220805480611a0c57611a0c613f5c565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b6060611a3e82612052565b611a5b57604051630a14c4b560e41b815260040160405180910390fd5b6000828152601860205260408120549081811a90611a78856114ef565b90506000600f611a8787612f15565b6010600a611a9488613015565b600a611a9f8a613015565b604051602001611ab5979695949392919061403a565b60405160208183030381529060405290508082600e604051602001611adc9392919061414c565b60408051601f198184030181529181526000858152601560205290812080549293509091611b0990613dc8565b90501115611b4c578060156000858152602001908152602001600020604051602001611b3692919061424e565b6040516020818303038152906040529050611b79565b80611b5684612f15565b604051602001611b6792919061428c565b60405160208183030381529060405290505b6000868152601460205260409020548190611b9390612f15565b604051602001611ba49291906142d7565b604051602081830303815290604052905060005b600b54811015611c315781611bd6611bd1836001613eea565b612f15565b611bfb87611be5856001613eea565b60208110611bf557611bf5613e8b565b1a612f15565b604051602001611c0d9392919061434c565b60405160208183030381529060405291508080611c2990613f02565b915050611bb8565b5080604051602001611c4391906143e2565b6040516020818303038152906040529050611c5d81612c6e565b604051602001611c6d9190614408565b604051602081830303815290604052945050505050919050565b6008546001600160a01b03163314611cb15760405162461bcd60e51b8152600401610bbc90613dfc565b600091825260136020526040909120805461ffff191660f09290921c919091179055565b6008546001600160a01b03163314611cff5760405162461bcd60e51b8152600401610bbc90613dfc565b601680546001919060ff1916828061110b565b6008546001600160a01b03163314611d3c5760405162461bcd60e51b8152600401610bbc90613dfc565b6000828152601160209081526040808320848452909152812061143e916134f2565b6008546001600160a01b03163314611d885760405162461bcd60e51b8152600401610bbc90613dfc565b6001600160a01b038116611ded5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bbc565b610bdc81612dd7565b6008546001600160a01b03163314611e205760405162461bcd60e51b8152600401610bbc90613dfc565b80471015611e4357604051639266535160e01b8152476004820152602401610bbc565b80600003611e4e5750475b6001600160a01b038216611e6b576008546001600160a01b031691505b61143e6001600160a01b0383168261306c565b6008546001600160a01b03163314611ea85760405162461bcd60e51b8152600401610bbc90613dfc565b600c55565b6008546001600160a01b03163314611ed75760405162461bcd60e51b8152600401610bbc90613dfc565b600b548310611ee557600080fd5b6000611f2683838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061318592505050565b600095865260116020908152604080882096885295815294862080546001810182559087529490952090930180546001600160a01b0319166001600160a01b0390951694909417909355505050565b6008546001600160a01b03163314611f9f5760405162461bcd60e51b8152600401610bbc90613dfc565b601b55565b6008546001600160a01b03163314611fce5760405162461bcd60e51b8152600401610bbc90613dfc565b600061200f83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061318592505050565b600094855260126020908152604086208054600181018255908752952090940180546001600160a01b0319166001600160a01b0390951694909417909355505050565b6000805482108015610a29575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006121608383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060175460405190925061212691508990899061444d565b60408051918290038220602083015281018b9052606081018a90526080015b604051602081830303815290604052805190602001206131ea565b979650505050505050565b6000546001600160a01b03851661219457604051622e076360e81b815260040160405180910390fd5b836000036121b55760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561226657506001600160a01b0387163b15155b156122ee575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46122b76000888480600101955088612e29565b6122d4576040516368d2bf6b60e11b815260040160405180910390fd5b80820361226c5782600054146122e957600080fd5b612333565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082036122ef575b506000555b5050505050565b600061234a8261259a565b9050836001600160a01b031681600001516001600160a01b0316146123815760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061239f575061239f85336108cf565b806123ba5750336123af84610ac1565b6001600160a01b0316145b9050806123da57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661240157604051633a954ecd60e21b815260040160405180910390fd5b61240d6000848761207d565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166124e15760005482146124e157805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612338565b600061167983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601b546040516bffffffffffffffffffffffff1960608d901b166020820152603481018b9052605481018a90529092506074019050612145565b60408051606081018252600080825260208201819052918101919091528160005481101561269b57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906126995780516001600160a01b031615612630579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612694579392505050565b612630565b505b604051636f96cda160e11b815260040160405180910390fd5b60008181526013602052604081205460609160f082901b9161ffff1690036126dd5750600160f81b5b60408051600e808252818301909252600091602082018180368337019050509050604d60f81b8160008151811061271657612716613e8b565b60200101906001600160f81b031916908160001a905350605460f81b8160018151811061274557612745613e8b565b60200101906001600160f81b031916908160001a905350606860f81b8160028151811061277457612774613e8b565b60200101906001600160f81b031916908160001a905350606460f81b816003815181106127a3576127a3613e8b565b60200101906001600160f81b031916908160001a905350600060f81b816004815181106127d2576127d2613e8b565b60200101906001600160f81b031916908160001a905350600060f81b8160058151811061280157612801613e8b565b60200101906001600160f81b031916908160001a905350600060f81b8160068151811061283057612830613e8b565b60200101906001600160f81b031916908160001a905350600660f81b8160078151811061285f5761285f613e8b565b60200101906001600160f81b031916908160001a905350600060f81b8160088151811061288e5761288e613e8b565b60200101906001600160f81b031916908160001a9053508460ff166001036128e457600060f81b816009815181106128c8576128c8613e8b565b60200101906001600160f81b031916908160001a905350612914565b600160f81b816009815181106128fc576128fc613e8b565b60200101906001600160f81b031916908160001a9053505b600060f81b81600a8151811061292c5761292c613e8b565b60200101906001600160f81b031916908160001a9053508460f81b81600b8151811061295a5761295a613e8b565b60200101906001600160f81b031916908160001a9053508160001a60f81b81600c8151811061298b5761298b613e8b565b60200101906001600160f81b031916908160001a9053508160011a60f81b81600d815181106129bc576129bc613e8b565b60200101906001600160f81b031916908160001a905350949350505050565b6060610a29826001600019613202565b60408051600880825281830190925260609160009190602082018180368337019050509050604d60f81b81600081518110612a2857612a28613e8b565b60200101906001600160f81b031916908160001a905350605460f81b81600181518110612a5757612a57613e8b565b60200101906001600160f81b031916908160001a905350607260f81b81600281518110612a8657612a86613e8b565b60200101906001600160f81b031916908160001a905350606b60f81b81600381518110612ab557612ab5613e8b565b60200101906001600160f81b031916908160001a90535060008351604051602001612ae291815260200190565b60405160208183030381529060405290508060048251612b029190613f45565b81518110612b1257612b12613e8b565b602001015160f81c60f81b82600481518110612b3057612b30613e8b565b60200101906001600160f81b031916908160001a9053508060038251612b569190613f45565b81518110612b6657612b66613e8b565b602001015160f81c60f81b82600581518110612b8457612b84613e8b565b60200101906001600160f81b031916908160001a9053508060028251612baa9190613f45565b81518110612bba57612bba613e8b565b602001015160f81c60f81b82600681518110612bd857612bd8613e8b565b60200101906001600160f81b031916908160001a9053508060018251612bfe9190613f45565b81518110612c0e57612c0e613e8b565b602001015160f81c60f81b82600781518110612c2c57612c2c613e8b565b60200101906001600160f81b031916908160001a9053508184604051602001612c56929190613f72565b60405160208183030381529060405292505050919050565b80516060906000819003612c92575050604080516020810190915260008152919050565b60006003612ca1836002613eea565b612cab9190613f31565b612cb6906004613e6c565b90506000612cc5826020613eea565b6001600160401b03811115612cdc57612cdc6138aa565b6040519080825280601f01601f191660200182016040528015612d06576020820181803683370190505b5090506000604051806060016040528060408152602001614550604091399050600181016020830160005b86811015612d92576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612d31565b506003860660018114612dac5760028114612dbd57612dc9565b613d3d60f01b600119830152612dc9565b603d60f81b6000198301525b505050918152949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612e5e90339089908890889060040161445d565b6020604051808303816000875af1925050508015612e99575060408051601f3d908101601f19168201909252612e9691810190614490565b60015b612ef7573d808015612ec7576040519150601f19603f3d011682016040523d82523d6000602084013e612ecc565b606091505b508051600003612eef576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081600003612f3c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f665780612f5081613f02565b9150612f5f9050600a83613f31565b9150612f40565b6000816001600160401b03811115612f8057612f806138aa565b6040519080825280601f01601f191660200182016040528015612faa576020820181803683370190505b5090505b8415612f0d57612fbf600183613f45565b9150612fcc600a866144ad565b612fd7906030613eea565b60f81b818381518110612fec57612fec613e8b565b60200101906001600160f81b031916908160001a90535061300e600a86613f31565b9450612fae565b60608160000361303f5750506040805180820190915260048152630307830360e41b602082015290565b8160005b8115613062578061305381613f02565b915050600882901c9150613043565b612f0d84826132b7565b804710156130bc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bbc565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613109576040519150601f19603f3d011682016040523d82523d6000602084013e61310e565b606091505b5050905080610b8d5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bbc565b6000806131b08360405160200161319c91906144c1565b604051602081830303815290604052613452565b90508051602082016000f091506001600160a01b0382166131e45760405163046a55db60e11b815260040160405180910390fd5b50919050565b6000826131f7858461347e565b1490505b9392505050565b6060833b60008190036132255750506040805160208101909152600081526131fb565b808411156132435750506040805160208101909152600081526131fb565b838310156132755760405163162544fd60e11b8152600481018290526024810185905260448101849052606401610bbc565b838303848203600082821061328a578261328c565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b606060006132c6836002613e6c565b6132d1906002613eea565b6001600160401b038111156132e8576132e86138aa565b6040519080825280601f01601f191660200182016040528015613312576020820181803683370190505b509050600360fc1b8160008151811061332d5761332d613e8b565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061335c5761335c613e8b565b60200101906001600160f81b031916908160001a9053506000613380846002613e6c565b61338b906001613eea565b90505b6001811115613403576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106133bf576133bf613e8b565b1a60f81b8282815181106133d5576133d5613e8b565b60200101906001600160f81b031916908160001a90535060049490941c936133fc816144e7565b905061338e565b5083156131fb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610bbc565b60608151826040516020016134689291906144fe565b6040516020818303038152906040529050919050565b600081815b84518110156134ea5760008582815181106134a0576134a0613e8b565b602002602001015190508083116134c657600083815260208290526040902092506134d7565b600081815260208490526040902092505b50806134e281613f02565b915050613483565b509392505050565b5080546000825590600052602060002090810190610bdc9190613594565b82805461351c90613dc8565b90600052602060002090601f01602090048101928261353e5760008555613584565b82601f1061355757805160ff1916838001178555613584565b82800160010185558215613584579182015b82811115613584578251825591602001919060010190613569565b50613590929150613594565b5090565b5b808211156135905760008155600101613595565b6001600160e01b031981168114610bdc57600080fd5b6000602082840312156135d157600080fd5b81356131fb816135a9565b60005b838110156135f75781810151838201526020016135df565b838111156119165750506000910152565b600081518084526136208160208601602086016135dc565b601f01601f19169290920160200192915050565b6020815260006131fb6020830184613608565b60006020828403121561365957600080fd5b5035919050565b6001600160a01b0381168114610bdc57600080fd5b6000806040838503121561368857600080fd5b823561369381613660565b946020939093013593505050565b60008083601f8401126136b357600080fd5b5081356001600160401b038111156136ca57600080fd5b602083019150836020828501011115610fe457600080fd5b60008083601f8401126136f457600080fd5b5081356001600160401b0381111561370b57600080fd5b6020830191508360208260051b8501011115610fe457600080fd5b600080600080600080600060a0888a03121561374157600080fd5b873561374c81613660565b9650602088013595506040880135945060608801356001600160401b038082111561377657600080fd5b6137828b838c016136a1565b909650945060808a013591508082111561379b57600080fd5b506137a88a828b016136e2565b989b979a50959850939692959293505050565b6000806000606084860312156137d057600080fd5b83356137db81613660565b925060208401356137eb81613660565b929592945050506040919091013590565b60008060008060008060006080888a03121561381757600080fd5b873561382281613660565b965060208801356001600160401b038082111561383e57600080fd5b61384a8b838c016136e2565b909850965060408a013591508082111561386357600080fd5b61386f8b838c016136e2565b909650945060608a013591508082111561379b57600080fd5b6000806040838503121561389b57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156138e8576138e86138aa565b604052919050565b60006001600160401b03821115613909576139096138aa565b5060051b60200190565b60006001600160401b0383111561392c5761392c6138aa565b61393f601f8401601f19166020016138c0565b905082815283838301111561395357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261397b57600080fd5b6131fb83833560208501613913565b600082601f83011261399b57600080fd5b813560206139b06139ab836138f0565b6138c0565b82815260059290921b840181019181810190868411156139cf57600080fd5b8286015b84811015613a0e5780356001600160401b038111156139f25760008081fd5b613a008986838b010161396a565b8452509183019183016139d3565b509695505050505050565b60008060408385031215613a2c57600080fd5b82356001600160401b0380821115613a4357600080fd5b818501915085601f830112613a5757600080fd5b81356020613a676139ab836138f0565b82815260059290921b84018101918181019089841115613a8657600080fd5b948201945b83861015613aa457853582529482019490820190613a8b565b96505086013592505080821115613aba57600080fd5b50613ac78582860161398a565b9150509250929050565b600080600080600060608688031215613ae957600080fd5b8535613af481613660565b945060208601356001600160401b0380821115613b1057600080fd5b613b1c89838a016136e2565b90965094506040880135915080821115613b3557600080fd5b50613b42888289016136e2565b969995985093965092949392505050565b600060208284031215613b6557600080fd5b81356001600160401b03811115613b7b57600080fd5b612f0d8482850161396a565b600060208284031215613b9957600080fd5b81356131fb81613660565b634e487b7160e01b600052602160045260246000fd5b6020810160048310613bdc57634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215613bf557600080fd5b8235613c0081613660565b915060208301358015158114613c1557600080fd5b809150509250929050565b60008060008060808587031215613c3657600080fd5b8435613c4181613660565b93506020850135613c5181613660565b92506040850135915060608501356001600160401b03811115613c7357600080fd5b8501601f81018713613c8457600080fd5b613c9387823560208401613913565b91505092959194509250565b600080600060608486031215613cb457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215613cde57600080fd5b8235915060208301356001600160f01b031981168114613c1557600080fd5b60008060408385031215613d1057600080fd5b8235613d1b81613660565b91506020830135613c1581613660565b60008060008060608587031215613d4157600080fd5b843593506020850135925060408501356001600160401b03811115613d6557600080fd5b613d71878288016136a1565b95989497509550505050565b600080600060408486031215613d9257600080fd5b8335925060208401356001600160401b03811115613daf57600080fd5b613dbb868287016136a1565b9497909650939450505050565b600181811c90821680613ddc57607f821691505b6020821081036131e457634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600b908201526a57726f6e6720706861736560a81b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613e8657613e86613e56565b500290565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112613eb857600080fd5b8301803591506001600160401b03821115613ed257600080fd5b6020019150600581901b3603821315610fe457600080fd5b60008219821115613efd57613efd613e56565b500190565b600060018201613f1457613f14613e56565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082613f4057613f40613f1b565b500490565b600082821015613f5757613f57613e56565b500390565b634e487b7160e01b600052603160045260246000fd5b60008351613f848184602088016135dc565b835190830190613f988183602088016135dc565b01949350505050565b8054600090600181811c9080831680613fbb57607f831692505b60208084108203613fdc57634e487b7160e01b600052602260045260246000fd5b818015613ff057600181146140015761402e565b60ff1986168952848901965061402e565b60008881526020902060005b868110156140265781548b82015290850190830161400d565b505084890196505b50505050505092915050565b683d913730b6b2911d1160b91b81526000614058600983018a613fa1565b61202360f01b81528851614073816002840160208d016135dc565b72111610113232b9b1b934b83a34b7b7111d101160691b600292909101918201526140a16015820189613fa1565b6c1116101134b6b0b3b2911d101160991b815290506140c3600d820188613fa1565b9050662f696d6167652f60c81b815285516140e5816007840160208a016135dc565b741116101130b734b6b0ba34b7b72fbab936111d101160591b60079290910191820152614115601c820186613fa1565b90506a2f616e696d6174696f6e2f60a81b8152835161413b81600b8401602088016135dc565b01600b019998505050505050505050565b6000845161415e8184602089016135dc565b80830190507f222c20226d696469223a2022646174613a617564696f2f6d6964693b626173658152620d8d0b60ea1b602082015284516141a58160238401602089016135dc565b7f222c202265787465726e616c5f75726c223a202268747470733a2f2f62656174602392909101918201527f666f756e6472792e78797a222c2022636f6d706f736572223a202200000000006043820152614203605e820185613fa1565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a8152710101129b7b733911610113b30b63ab2911d160751b60208201526032019695505050505050565b600083516142608184602088016135dc565b601160f91b9083019081526142786001820185613fa1565b61227d60f01b815260020195945050505050565b6000835161429e8184602088016135dc565b601160f91b90830190815283516142bc8160018401602088016135dc565b61227d60f01b60019290910191820152600301949350505050565b600083516142e98184602088016135dc565b80830190507f2c207b2274726169745f74797065223a2022436f766572222c202276616c7565815263111d101160e11b602082015283516143318160248401602088016135dc565b61227d60f01b60249290910191820152602601949350505050565b6000845161435e8184602089016135dc565b7f2c207b2274726169745f74797065223a20225374656d2000000000000000000090830190815284516143988160178401602089016135dc565b6c111610113b30b63ab2911d101160991b6017929091019182015283516143c68160248401602088016135dc565b61227d60f01b6024929091019182015260260195945050505050565b600082516143f48184602087016135dc565b615d7d60f01b920191825250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161444081601d8501602087016135dc565b91909101601d0192915050565b8183823760009101908152919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061167990830184613608565b6000602082840312156144a257600080fd5b81516131fb816135a9565b6000826144bc576144bc613f1b565b500690565b60008152600082516144da8160018501602087016135dc565b9190910160010192915050565b6000816144f6576144f6613e56565b506000190190565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b6005820152815160009061454181600e8501602087016135dc565b91909101600e01939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122041d600204f6338686d7d2304c225c04c1e7a5579dfe9f1b37a77d6f3e025337164736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000002868747470733a2f2f6170692e62656174666f756e6472792e78797a2f6170692f76312f6e66742f310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007427269646765730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064272696467650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b4f73686927732066697273742067656e6572617469766520636f6c6c656374696f6e2077697468204265617420466f756e6472792e204265617420466f756e647279277320666972737420636f6c6c656374696f6e2077697468206f6e2d636861696e206c79726963732e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004425244470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044f73686900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000099c27ea3331137d2d1030647d2cef9c3549d73f40000000000000000000000004d18f8f2ae19f1e166c97793cceeb70680a2b6d20000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000046

-----Decoded View---------------
Arg [0] : baseURI_ (string): https://api.beatfoundry.xyz/api/v1/nft/1
Arg [1] : name_ (string): Bridges
Arg [2] : singular_ (string): Bridge
Arg [3] : description_ (string): Oshi's first generative collection with Beat Foundry. Beat Foundry's first collection with on-chain lyrics.
Arg [4] : symbol_ (string): BRDG
Arg [5] : composer_ (string): Oshi
Arg [6] : numVariableTracks_ (uint256): 4
Arg [7] : royaltyReceivers_ (address[]): 0x99C27ea3331137d2D1030647d2cef9c3549D73F4,0x4d18f8f2aE19f1E166c97793cceeb70680A2b6D2
Arg [8] : royaltyShares_ (uint256[]): 30,70
Arg [9] : royaltyPercent_ (uint256): 5

-----Encoded View---------------
32 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [4] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000340
Arg [8] : 00000000000000000000000000000000000000000000000000000000000003a0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [11] : 68747470733a2f2f6170692e62656174666f756e6472792e78797a2f6170692f
Arg [12] : 76312f6e66742f31000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [14] : 4272696467657300000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [16] : 4272696467650000000000000000000000000000000000000000000000000000
Arg [17] : 000000000000000000000000000000000000000000000000000000000000006b
Arg [18] : 4f73686927732066697273742067656e6572617469766520636f6c6c65637469
Arg [19] : 6f6e2077697468204265617420466f756e6472792e204265617420466f756e64
Arg [20] : 7279277320666972737420636f6c6c656374696f6e2077697468206f6e2d6368
Arg [21] : 61696e206c79726963732e000000000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [23] : 4252444700000000000000000000000000000000000000000000000000000000
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [25] : 4f73686900000000000000000000000000000000000000000000000000000000
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [27] : 00000000000000000000000099c27ea3331137d2d1030647d2cef9c3549d73f4
Arg [28] : 0000000000000000000000004d18f8f2ae19f1e166c97793cceeb70680a2b6d2
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [30] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000046


Deployed Bytecode Sourcemap

73171:15259:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28987:355;;;;;;;;;;-1:-1:-1;28987:355:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;28987:355:0;;;;;;;;32182:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33782:245::-;;;;;;;;;;-1:-1:-1;33782:245:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;33782:245:0;1528:203:1;33345:371:0;;;;;;;;;;-1:-1:-1;33345:371:0;;;;;:::i;:::-;;:::i;:::-;;73462:45;;;;;;;;;;;;;;;28236:303;;;;;;;;;;-1:-1:-1;28490:12:0;;28280:7;28474:13;:28;28236:303;;;2575:25:1;;;2563:2;2548:18;28236:303:0;2429:177:1;79177:104:0;;;;;;;;;;-1:-1:-1;79177:104:0;;;;;:::i;:::-;;:::i;82980:744::-;;;;;;:::i;:::-;;:::i;34770:170::-;;;;;;;;;;-1:-1:-1;34770:170:0;;;;;:::i;:::-;;:::i;84513:1122::-;;;;;;:::i;:::-;;:::i;87273:262::-;;;;;;;;;;-1:-1:-1;87273:262:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6732:32:1;;;6714:51;;6796:2;6781:18;;6774:34;;;;6687:18;87273:262:0;6540:274:1;77646:291:0;;;;;;;;;;-1:-1:-1;77646:291:0;;;;;:::i;:::-;;:::i;77105:84::-;;;;;;;;;;;;;:::i;76962:135::-;;;;;;;;;;-1:-1:-1;76962:135:0;;;;;:::i;:::-;;:::i;35011:185::-;;;;;;;;;;-1:-1:-1;35011:185:0;;;;;:::i;:::-;;:::i;83732:773::-;;;;;;;;;;-1:-1:-1;83732:773:0;;;;;:::i;:::-;;:::i;76821:133::-;;;;;;;;;;-1:-1:-1;76821:133:0;;;;;:::i;:::-;;:::i;78937:232::-;;;;;;;;;;-1:-1:-1;78937:232:0;;;;;:::i;:::-;;:::i;76438:102::-;;;;;;;;;;-1:-1:-1;76438:102:0;;;;;:::i;:::-;;:::i;76332:98::-;;;;;;;;;;-1:-1:-1;76332:98:0;;;;;:::i;:::-;;:::i;77295:109::-;;;;;;;;;;-1:-1:-1;77295:109:0;;;;;:::i;:::-;;:::i;77531:107::-;;;;;;;;;;-1:-1:-1;77531:107:0;;;;;:::i;:::-;;:::i;31990:125::-;;;;;;;;;;-1:-1:-1;31990:125:0;;;;;:::i;:::-;;:::i;81696:861::-;;;;;;;;;;-1:-1:-1;81696:861:0;;;;;:::i;:::-;;:::i;73621:24::-;;;;;;;;;;;;;;;;73552:21;;;;;;;;;;;;;:::i;73582:32::-;;;;;;;;;;;;;;;;29406:206;;;;;;;;;;-1:-1:-1;29406:206:0;;;;;:::i;:::-;;:::i;64204:103::-;;;;;;;;;;;;;:::i;82565:112::-;;;;;;;;;;-1:-1:-1;82565:112:0;;;;;:::i;:::-;82624:7;82651:18;;;:12;:18;;;;;;;82565:112;73769:25;;;;;;;;;;;;;:::i;82685:207::-;;;;;;;;;;-1:-1:-1;82685:207:0;;;;;:::i;:::-;;:::i;74311:25::-;;;;;;;;;;-1:-1:-1;74311:25:0;;;;;;;;;;;;;;;:::i;63553:87::-;;;;;;;;;;-1:-1:-1;63626:6:0;;-1:-1:-1;;;;;63626:6:0;63553:87;;76548:114;;;;;;;;;;-1:-1:-1;76548:114:0;;;;;:::i;:::-;;:::i;32351:104::-;;;;;;;;;;;;;:::i;73514:29::-;;;;;;;;;;;;;;;;34099:319;;;;;;;;;;-1:-1:-1;34099:319:0;;;;;:::i;:::-;;:::i;73709:22::-;;;;;;;;;;;;;:::i;35267:406::-;;;;;;;;;;-1:-1:-1;35267:406:0;;;;;:::i;:::-;;:::i;78254:281::-;;;;;;;;;;-1:-1:-1;78254:281:0;;;;;:::i;:::-;;:::i;79530:2158::-;;;;;;;;;;-1:-1:-1;79530:2158:0;;;;;:::i;:::-;;:::i;79289:153::-;;;;;;;;;;-1:-1:-1;79289:153:0;;;;;:::i;:::-;;:::i;76674:139::-;;;;;;;;;;-1:-1:-1;76674:139:0;;;;;:::i;:::-;;:::i;73652:24::-;;;;;;;;;;;;;;;;34489:214;;;;;;;;;;-1:-1:-1;34489:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;34660:25:0;;;34631:4;34660:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34489:214;78543:176;;;;;;;;;;-1:-1:-1;78543:176:0;;;;;:::i;:::-;;:::i;64462:201::-;;;;;;;;;;-1:-1:-1;64462:201:0;;;;;:::i;:::-;;:::i;75926:398::-;;;;;;;;;;-1:-1:-1;75926:398:0;;;;;:::i;:::-;;:::i;77197:90::-;;;;;;;;;;-1:-1:-1;77197:90:0;;;;;:::i;:::-;;:::i;77945:301::-;;;;;;;;;;-1:-1:-1;77945:301:0;;;;;:::i;:::-;;:::i;77412:111::-;;;;;;;;;;-1:-1:-1;77412:111:0;;;;;:::i;:::-;;:::i;78727:202::-;;;;;;;;;;-1:-1:-1;78727:202:0;;;;;:::i;:::-;;:::i;28987:355::-;29134:4;-1:-1:-1;;;;;;29176:40:0;;-1:-1:-1;;;29176:40:0;;:105;;-1:-1:-1;;;;;;;29233:48:0;;-1:-1:-1;;;29233:48:0;29176:105;:158;;;-1:-1:-1;;;;;;;;;;22734:40:0;;;29298:36;29156:178;28987:355;-1:-1:-1;;28987:355:0:o;32182:100::-;32236:13;32269:5;32262:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32182:100;:::o;33782:245::-;33886:7;33916:16;33924:7;33916;:16::i;:::-;33911:64;;33941:34;;-1:-1:-1;;;33941:34:0;;;;;;;;;;;33911:64;-1:-1:-1;33995:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33995:24:0;;33782:245::o;33345:371::-;33418:13;33434:24;33450:7;33434:15;:24::i;:::-;33418:40;;33479:5;-1:-1:-1;;;;;33473:11:0;:2;-1:-1:-1;;;;;33473:11:0;;33469:48;;33493:24;;-1:-1:-1;;;33493:24:0;;;;;;;;;;;33469:48;21791:10;-1:-1:-1;;;;;33534:21:0;;;;;;:63;;-1:-1:-1;33560:37:0;33577:5;21791:10;34489:214;:::i;33560:37::-;33559:38;33534:63;33530:138;;;33621:35;;-1:-1:-1;;;33621:35:0;;;;;;;;;;;33530:138;33680:28;33689:2;33693:7;33702:5;33680:8;:28::i;:::-;33407:309;33345:371;;:::o;79177:104::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;;;;;;;;;79254:19:::1;::::0;;;:13:::1;:19;::::0;;;;79247:26:::1;::::0;::::1;:::i;:::-;79177:104:::0;:::o;82980:744::-;83167:12;;74782;;;;:22;;;;;;;;:::i;:::-;;74774:46;;;;-1:-1:-1;;;74774:46:0;;;;;;;:::i;:::-;83191:9:::1;;74915:6;74902:9;:19;74894:43;;;::::0;-1:-1:-1;;;74894:43:0;;18033:2:1;74894:43:0::1;::::0;::::1;18015:21:1::0;18072:2;18052:18;;;18045:30;-1:-1:-1;;;18091:18:1;;;18084:41;18142:18;;74894:43:0::1;17831:335:1::0;74894:43:0::1;83242:9:::2;;83225:13;;:26;83221:87;;83275:21;;-1:-1:-1::0;;;83275:21:0::2;;;;;;;;;;;83221:87;83324:15;::::0;;;:9:::2;:15;::::0;;;;;::::2;;83320:72;;;83363:17;;-1:-1:-1::0;;;83363:17:0::2;;;;;;;;;;;83320:72;83410:52;83431:4;83437:7;83446:4;;83452:9;;83410:20;:52::i;:::-;83405:107;;83486:14;;-1:-1:-1::0;;;83486:14:0::2;;;;;;;;;;;83405:107;83522:21;83529:13:::0;;83522:21;;:6:::2;:21;::::0;;;;;;;:28;;;83571:13;;83561:24;;:9:::2;:24:::0;;;;;:34;;;83627:13;;83606:18;;;:12:::2;:18:::0;;;;;:34;83651:9:::2;:15:::0;;;;;:22;;-1:-1:-1;;83651:22:0::2;83669:4;83651:22:::0;;::::2;::::0;;;83700:9;;;;::::2;::::0;;;;;;83687:29:::2;::::0;83693:2;;83669:4;83687:5:::2;:29::i;:::-;74831:1:::1;82980:744:::0;;;;;;;;:::o;34770:170::-;34904:28;34914:4;34920:2;34924:7;34904:9;:28::i;84513:1122::-;84738:15;;74782:12;;;;:22;;;;;;;;:::i;:::-;;74774:46;;;;-1:-1:-1;;;74774:46:0;;;;;;;:::i;:::-;84774:9:::1;::::0;:24:::1;::::0;84786:5;;84774:24:::1;:::i;:::-;74915:6;74902:9;:19;74894:43;;;::::0;-1:-1:-1;;;74894:43:0;;18033:2:1;74894:43:0::1;::::0;::::1;18015:21:1::0;18072:2;18052:18;;;18045:30;-1:-1:-1;;;18091:18:1;;;18084:41;18142:18;;74894:43:0::1;17831:335:1::0;74894:43:0::1;84837:9:::2;;84820:13;;:26;84816:87;;84870:21;;-1:-1:-1::0;;;84870:21:0::2;;;;;;;;;;;84816:87;84917:38:::0;;::::2;;::::0;:73:::2;;-1:-1:-1::0;84959:31:0;;::::2;;84917:73;84913:133;;;85014:20;;-1:-1:-1::0;;;85014:20:0::2;;;;;;;;;;;84913:133;85061:9;85056:519;85076:16:::0;;::::2;85056:519;;;85114:12;85129:5;;85135:1;85129:8;;;;;;;:::i;:::-;;;;;;;85114:23;;85157:59;85174:2;85178:4;85184:8;;85193:1;85184:11;;;;;;;:::i;:::-;;;;;;;85197:15;;85213:1;85197:18;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;85157:16;:59::i;:::-;85152:124;;85244:16;;-1:-1:-1::0;;;85244:16:0::2;;;;;;;;;;;85152:124;85294:15;::::0;;;:9:::2;:15;::::0;;;;;::::2;;85290:80;;;85337:17;;-1:-1:-1::0;;;85337:17:0::2;;;;;;;;;;;85290:80;85412:4;85384:6;:25;85407:1;85391:13;;:17;;;;:::i;:::-;85384:25;;;;;;;;;;;:32;;;;85468:1;85452:13;;:17;;;;:::i;:::-;85431:18;::::0;;;:12:::2;:18;::::0;;;;:38;85515:8;;85524:1;85515:11;;::::2;;;;;:::i;:::-;;;;;;;85484:9;:28;85510:1;85494:13;;:17;;;;:::i;:::-;85484:28:::0;;::::2;::::0;;::::2;::::0;;;;;;;;-1:-1:-1;85484:28:0;;;:42;;;;85541:15;;;:9:::2;:15:::0;;;:22;;-1:-1:-1;;85541:22:0::2;85559:4;85541:22;::::0;;85094:3;::::2;::::0;::::2;:::i;:::-;;;;85056:519;;;;85587:40;85593:2;85597:5;;:12;;85611:9;;;;;;;;;;;::::0;85622:4:::2;85587:5;:40::i;87273:262::-:0;87400:16;87418:21;87473:15;87512:14;;87505:3;87492:10;:16;;;;:::i;:::-;87491:35;;;;:::i;:::-;87457:70;;;;87273:262;;;;;;:::o;77646:291::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;77793:9:::1;:16;77777:5;:12;:32;77769:41;;;::::0;::::1;;77826:9;77821:109;77845:9;:16;77841:1;:20;77821:109;;;77906:9;77916:1;77906:12;;;;;;;;:::i;:::-;;;;;;;77883:10;:20;77894:5;77900:1;77894:8;;;;;;;;:::i;:::-;;;;;;;77883:20;;;;;;;;;;;:35;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;77863:3:0;::::1;::::0;::::1;:::i;:::-;;;;77821:109;;77105:84:::0;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;77156:12:::1;:25:::0;;-1:-1:-1;;77156:25:0::1;::::0;;77105:84::o;76962:135::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;77032:12:::1;:28:::0;;77047:13:::1;::::0;77032:12;-1:-1:-1;;77032:28:0::1;::::0;77047:13;77032:28:::1;;;::::0;;-1:-1:-1;77071:9:0::1;:18:::0;76962:135::o;35011:185::-;35149:39;35166:4;35172:2;35176:7;35149:39;;;;;;;;;;;;:16;:39::i;83732:773::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;83893:13:::1;::::0;74782:12:::1;::::0;::::1;;:22;::::0;::::1;;;;;;:::i;:::-;;74774:46;;;;-1:-1:-1::0;;;74774:46:0::1;;;;;;;:::i;:::-;83945:9:::2;;83928:13;;:26;83924:87;;83978:21;;-1:-1:-1::0;;;83978:21:0::2;;;;;;;;;;;83924:87;84025:31:::0;;::::2;84021:91;;84080:20;;-1:-1:-1::0;;;84080:20:0::2;;;;;;;;;;;84021:91;84127:9;84122:325;84142:16:::0;;::::2;84122:325;;;84180:12;84195:5;;84201:1;84195:8;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;::::2;;84222:15;::::0;;;:9:::2;:15:::0;;;;;;;;84195:8;;-1:-1:-1;;84222:15:0::2;;84218:80;;;84265:17;;-1:-1:-1::0;;;84265:17:0::2;;;;;;;;;;;84218:80;84340:4;84312:6;:25;84335:1;84319:13;;:17;;;;:::i;:::-;84312:25;;;;;;;;;;;:32;;;;84397:1;84381:13;;:17;;;;:::i;:::-;84360:18;::::0;;;:12:::2;:18;::::0;;;;;;;:38;;;;84413:9:::2;:15:::0;;;;:22;;-1:-1:-1;;84413:22:0::2;84431:4;84413:22;::::0;;84160:3;::::2;::::0;::::2;:::i;:::-;;;;84122:325;;;;84457:40;84463:2;84467:5;;:12;;84481:9;;;;;;;;;;;::::0;84492:4:::2;84457:5;:40::i;:::-;63844:1:::1;83732:773:::0;;;;;:::o;76821:133::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;76890:12:::1;:27:::0;;76905:12:::1;::::0;76890;-1:-1:-1;;76890:27:0::1;::::0;76905:12;76890:27:::1;::::0;78937:232;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;79074:19:::1;::::0;;;:13:::1;:19;::::0;;;;79094:26;;:30:::1;::::0;79123:1:::1;::::0;79094:30:::1;:::i;:::-;79074:51;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;79045:19;;;:13:::1;:19:::0;;;;;;;:26;;-1:-1:-1;;;;;79074:51:0;;::::1;::::0;79065:5;;79045:26;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:80:::0;;-1:-1:-1;;;;;;79045:80:0::1;-1:-1:-1::0;;;;;79045:80:0;;;::::1;::::0;;;::::1;::::0;;;79136:19;;;:13:::1;:19:::0;;;;;;:25;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;79136:25:0;;;;;-1:-1:-1;;;;;;79136:25:0::1;::::0;;;;;-1:-1:-1;;78937:232:0:o;76438:102::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;76512:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;76438:102:::0;:::o;76332:98::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;76404:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;77295:109::-:0;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;77369:19:::1;:27:::0;77295:109::o;77531:107::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;77606:14:::1;:24:::0;77531:107::o;31990:125::-;32054:7;32081:21;32094:7;32081:12;:21::i;:::-;:26;;31990:125;-1:-1:-1;;31990:125:0:o;81696:861::-;81748:13;81779:16;81787:7;81779;:16::i;:::-;81774:86;;81819:29;;-1:-1:-1;;;81819:29:0;;;;;;;;;;;81774:86;81870:12;81885:15;;;:6;:15;;;;;;;81945:7;;;;81986:16;81994:1;81945:7;81986;:16::i;:::-;82015:17;82035:19;;;:13;:19;;;;;:26;81967:35;;-1:-1:-1;82074:247:0;82098:17;;82094:1;:21;82074:247;;;82137:18;82189:13;;;:7;:13;;;;;;;;:30;;;;;;;;82158:96;;82226:4;82231:5;82216:1;82235;82231:5;:::i;:::-;82226:11;;;;;;;:::i;:::-;82189:50;;82226:11;;;;82189:50;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;82189:50:0;82158:12;:96::i;:::-;82137:117;;82288:3;82293:15;82302:5;82293:8;:15::i;:::-;82275:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82269:40;;82122:199;82117:3;;;;;:::i;:::-;;;;82074:247;;;;82338:9;82333:179;82357:9;82353:1;:13;82333:179;;;82388:18;82422:19;;;:13;:19;;;;;:22;;82409:36;;82422:19;82442:1;;82422:22;;;;;;:::i;82409:36::-;82388:57;;82479:3;82484:15;82493:5;82484:8;:15::i;:::-;82466:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82460:40;;82373:139;82368:3;;;;;:::i;:::-;;;;82333:179;;;;82531:18;82545:3;82531:13;:18::i;:::-;82524:25;81696:861;-1:-1:-1;;;;;;81696:861:0:o;73552:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29406:206::-;29470:7;-1:-1:-1;;;;;29494:19:0;;29490:60;;29522:28;;-1:-1:-1;;;29522:28:0;;;;;;;;;;;29490:60;-1:-1:-1;;;;;;29576:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;29576:27:0;;29406:206::o;64204:103::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;64269:30:::1;64296:1;64269:18;:30::i;:::-;64204:103::o:0;73769:25::-;;;;;;;:::i;82685:207::-;82743:7;82768:16;82776:7;82768;:16::i;:::-;82763:86;;82808:29;;-1:-1:-1;;;82808:29:0;;;;;;;;;;;82763:86;-1:-1:-1;82866:18:0;;;;:9;:18;;;;;;;82685:207::o;76548:114::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;76628:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;32351:104::-:0;32407:13;32440:7;32433:14;;;;;:::i;34099:319::-;21791:10;-1:-1:-1;;;;;34230:24:0;;;34226:54;;34263:17;;-1:-1:-1;;;34263:17:0;;;;;;;;;;;34226:54;21791:10;34293:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34293:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34293:53:0;;;;;;;;;;34362:48;;540:41:1;;;34293:42:0;;21791:10;34362:48;;513:18:1;34362:48:0;;;;;;;34099:319;;:::o;73709:22::-;;;;;;;:::i;35267:406::-;35434:28;35444:4;35450:2;35454:7;35434:9;:28::i;:::-;-1:-1:-1;;;;;35491:13:0;;14194:19;:23;;35491:89;;;;;35524:56;35555:4;35561:2;35565:7;35574:5;35524:30;:56::i;:::-;35523:57;35491:89;35473:193;;;35614:40;;-1:-1:-1;;;35614:40:0;;;;;;;;;;;35473:193;35267:406;;;;:::o;78254:281::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;78427:13:::1;::::0;;;:7:::1;:13;::::0;;;;;;;:23;;;;;;;;78451:30;;:34:::1;::::0;78484:1:::1;::::0;78451:34:::1;:::i;:::-;78427:59;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;78394:13;;;:7:::1;:13:::0;;;;;;:23;;;;;;;;:30;;-1:-1:-1;;;;;78427:59:0;;::::1;::::0;78418:5;;78394:30;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:92:::0;;-1:-1:-1;;;;;;78394:92:0::1;-1:-1:-1::0;;;;;78394:92:0;;;::::1;::::0;;;::::1;::::0;;;78498:13;;;:7:::1;:13:::0;;;;;;:23;;;;;;;:29;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;78498:29:0;;;;;-1:-1:-1;;;;;;78498:29:0::1;::::0;;;;;-1:-1:-1;;;78254:281:0:o;79530:2158::-;79631:13;79667:16;79675:7;79667;:16::i;:::-;79662:86;;79707:29;;-1:-1:-1;;;79707:29:0;;;;;;;;;;;79662:86;79758:12;79773:15;;;:6;:15;;;;;;;79833:7;;;;79875:13;79773:15;79875:4;:13::i;:::-;79855:33;;79901:17;79978:9;80021:18;:7;:16;:18::i;:::-;80090:11;80146:7;80192:27;80200:4;80192:25;:27::i;:::-;80272:7;80322:27;80330:4;80322:25;:27::i;:::-;79921:439;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79901:459;;80409:4;80480:3;80574:8;80378:282;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;80378:282:0;;;;;;;;;80708:1;80681:16;;;:10;80378:282;80681:16;;;;80675:30;;80378:282;;-1:-1:-1;80708:1:0;;80675:30;;;:::i;:::-;;;:34;80671:229;;;80750:4;80761:10;:16;80772:4;80761:16;;;;;;;;;;;80733:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80726:58;;80671:229;;;80841:4;80851:30;80865:4;80851:28;:30::i;:::-;80824:64;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80817:71;;80671:229;81022:18;;;;:9;:18;;;;;;80950:4;;81022:29;;:27;:29::i;:::-;80919:162;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80912:169;;81107:9;81102:331;81126:17;;81122:1;:21;81102:331;;;81207:4;81274:18;81275:5;:1;81279;81275:5;:::i;:::-;81274:16;:18::i;:::-;81345:38;81359:4;81364:5;:1;81368;81364:5;:::i;:::-;81359:11;;;;;;;:::i;:::-;;81345:36;:38::i;:::-;81172:249;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81165:256;;81145:3;;;;;:::i;:::-;;;;81102:331;;;;81467:4;81450:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;81443:35;;81627:19;81641:4;81627:13;:19::i;:::-;81534:131;;;;;;;;:::i;:::-;;;;;;;;;;;;;81489:191;;;;;;79530:2158;;;:::o;79289:153::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;79399:20:::1;::::0;;;:14:::1;:20;::::0;;;;;:35;;-1:-1:-1;;79399:35:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;79289:153::o;76674:139::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;76746:12:::1;:30:::0;;76761:15:::1;::::0;76746:12;-1:-1:-1;;76746:30:0::1;76761:15:::0;;76746:30:::1;::::0;78543:176;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;78688:13:::1;::::0;;;:7:::1;:13;::::0;;;;;;;:23;;;;;;;;78681:30:::1;::::0;::::1;:::i;64462:201::-:0;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64551:22:0;::::1;64543:73;;;::::0;-1:-1:-1;;;64543:73:0;;29829:2:1;64543:73:0::1;::::0;::::1;29811:21:1::0;29868:2;29848:18;;;29841:30;29907:34;29887:18;;;29880:62;-1:-1:-1;;;29958:18:1;;;29951:36;30004:19;;64543:73:0::1;29627:402:1::0;64543:73:0::1;64627:28;64646:8;64627:18;:28::i;75926:398::-:0;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;76036:6:::1;76012:21;:30;76008:112;;;76066:42;::::0;-1:-1:-1;;;76066:42:0;;76086:21:::1;76066:42;::::0;::::1;2575:25:1::0;2548:18;;76066:42:0::1;2429:177:1::0;76008:112:0::1;76136:6;76146:1;76136:11:::0;76132:74:::1;;-1:-1:-1::0;76173:21:0::1;76132:74;-1:-1:-1::0;;;;;76220:16:0;::::1;76216:70;;63626:6:::0;;-1:-1:-1;;;;;63626:6:0;76253:21:::1;;76216:70;76296:20;-1:-1:-1::0;;;;;76296:12:0;::::1;76309:6:::0;76296:12:::1;:20::i;77197:90::-:0;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;77262:9:::1;:17:::0;77197:90::o;77945:301::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;78123:17:::1;;78111:8;78096:44;78088:53;;;::::0;::::1;;78152:15;78170:20;78184:5;;78170:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;78170:13:0::1;::::0;-1:-1:-1;;;78170:20:0:i:1;:::-;78201:13;::::0;;;:7:::1;:13;::::0;;;;;;;:23;;;;;;;;;:37;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;78201:37:0::1;-1:-1:-1::0;;;;;78201:37:0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;77945:301:0:o;77412:111::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;77487:20:::1;:28:::0;77412:111::o;78727:202::-;63626:6;;-1:-1:-1;;;;;63626:6:0;21791:10;63773:23;63765:68;;;;-1:-1:-1;;;63765:68:0;;;;;;;:::i;:::-;78839:15:::1;78857:20;78871:5;;78857:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;78857:13:0::1;::::0;-1:-1:-1;;;78857:20:0:i:1;:::-;78888:19;::::0;;;:13:::1;:19;::::0;;;;;;:33;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;78888:33:0::1;-1:-1:-1::0;;;;;78888:33:0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;78727:202:0:o;35928:213::-;35985:4;36075:13;;36065:7;:23;36022:111;;;;-1:-1:-1;;36106:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;36106:27:0;;;;36105:28;;35928:213::o;44315:196::-;44430:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;44430:29:0;-1:-1:-1;;;;;44430:29:0;;;;;;;;;44475:28;;44430:24;;44475:28;;;;;;;44315:196;;;:::o;88028:399::-;88205:4;88242:177;88279:6;;88242:177;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;88304:19:0;;88369:16;;88304:19;;-1:-1:-1;88369:16:0;;-1:-1:-1;88379:5:0;;;;88369:16;:::i;:::-;;;;;;;;;;88352:51;;;30495:19:1;30530:12;;30523:28;;;30567:12;;;30560:28;;;30604:12;;88352:51:0;;;;;;;;;;;;;88342:62;;;;;;88242:18;:177::i;:::-;88222:197;88028:399;-1:-1:-1;;;;;;;88028:399:0:o;37038:1966::-;37177:20;37200:13;-1:-1:-1;;;;;37228:16:0;;37224:48;;37253:19;;-1:-1:-1;;;37253:19:0;;;;;;;;;;;37224:48;37287:8;37299:1;37287:13;37283:44;;37309:18;;-1:-1:-1;;;37309:18:0;;;;;;;;;;;37283:44;-1:-1:-1;;;;;37678:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;37737:49:0;;-1:-1:-1;;;;;37678:44:0;;;;;;;37737:49;;;;-1:-1:-1;;37678:44:0;;;;;;37737:49;;;;;;;;;;;;;;;;37803:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;37853:66:0;;;;-1:-1:-1;;;37903:15:0;37853:66;;;;;;;;;;37803:25;38000:23;;;38044:4;:23;;;;-1:-1:-1;;;;;;38052:13:0;;14194:19;:23;;38052:15;38040:832;;;38088:505;38119:38;;38144:12;;-1:-1:-1;;;;;38119:38:0;;;38136:1;;38119:38;;38136:1;;38119:38;38211:212;38280:1;38313:2;38346:14;;;;;;38391:5;38211:30;:212::i;:::-;38180:365;;38481:40;;-1:-1:-1;;;38481:40:0;;;;;;;;;;;38180:365;38588:3;38572:12;:19;38088:505;;38674:12;38657:13;;:29;38653:43;;38688:8;;;38653:43;38040:832;;;38737:120;38768:40;;38793:14;;;;;-1:-1:-1;;;;;38768:40:0;;;38785:1;;38768:40;;38785:1;;38768:40;38852:3;38836:12;:19;38737:120;;38040:832;-1:-1:-1;38886:13:0;:28;38936:60;37166:1838;37038:1966;;;;:::o;39258:2130::-;39373:35;39411:21;39424:7;39411:12;:21::i;:::-;39373:59;;39471:4;-1:-1:-1;;;;;39449:26:0;:13;:18;;;-1:-1:-1;;;;;39449:26:0;;39445:67;;39484:28;;-1:-1:-1;;;39484:28:0;;;;;;;;;;;39445:67;39525:22;21791:10;-1:-1:-1;;;;;39551:20:0;;;;:73;;-1:-1:-1;39588:36:0;39605:4;21791:10;34489:214;:::i;39588:36::-;39551:126;;;-1:-1:-1;21791:10:0;39641:20;39653:7;39641:11;:20::i;:::-;-1:-1:-1;;;;;39641:36:0;;39551:126;39525:153;;39696:17;39691:66;;39722:35;;-1:-1:-1;;;39722:35:0;;;;;;;;;;;39691:66;-1:-1:-1;;;;;39772:16:0;;39768:52;;39797:23;;-1:-1:-1;;;39797:23:0;;;;;;;;;;;39768:52;39941:35;39958:1;39962:7;39971:4;39941:8;:35::i;:::-;-1:-1:-1;;;;;40272:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40272:31:0;;;-1:-1:-1;;;;;40272:31:0;;;-1:-1:-1;;40272:31:0;;;;;;;40318:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40318:29:0;;;;;;;;;;;40398:20;;;:11;:20;;;;;;40433:18;;-1:-1:-1;;;;;;40466:49:0;;;;-1:-1:-1;;;40499:15:0;40466:49;;;;;;;;;;40789:11;;40849:24;;;;;40892:13;;40398:20;;40849:24;;40892:13;40888:384;;41102:13;;41087:11;:28;41083:174;;41140:20;;41209:28;;;;-1:-1:-1;;;;;41183:54:0;-1:-1:-1;;;41183:54:0;-1:-1:-1;;;;;;41183:54:0;;;-1:-1:-1;;;;;41140:20:0;;41183:54;;;;41083:174;40247:1036;;;41319:7;41315:2;-1:-1:-1;;;;;41300:27:0;41309:4;-1:-1:-1;;;;;41300:27:0;;;;;;;;;;;41338:42;35267:406;87628:392;87801:4;87838:174;87875:6;;87838:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87900:20:0;;87949:47;;-1:-1:-1;;30832:2:1;30828:15;;;30824:53;87949:47:0;;;30812:66:1;30894:12;;;30887:28;;;30931:12;;;30924:28;;;87900:20:0;;-1:-1:-1;30968:12:1;;;-1:-1:-1;87949:47:0;30627:359:1;30787:1141:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;30930:7:0;31013:13;;31006:4;:20;30975:886;;;31047:31;31081:17;;;:11;:17;;;;;;;;;31047:51;;;;;;;;;-1:-1:-1;;;;;31047:51:0;;;;-1:-1:-1;;;31047:51:0;;-1:-1:-1;;;;;31047:51:0;;;;;;;;-1:-1:-1;;;31047:51:0;;;;;;;;;;;;;;31117:729;;31167:14;;-1:-1:-1;;;;;31167:28:0;;31163:101;;31231:9;30787:1141;-1:-1:-1;;;30787:1141:0:o;31163:101::-;-1:-1:-1;;;31606:6:0;31651:17;;;;:11;:17;;;;;;;;;31639:29;;;;;;;;;-1:-1:-1;;;;;31639:29:0;;;;;-1:-1:-1;;;31639:29:0;;-1:-1:-1;;;;;31639:29:0;;;;;;;;-1:-1:-1;;;31639:29:0;;;;;;;;;;;;;31699:28;31695:109;;31767:9;30787:1141;-1:-1:-1;;;30787:1141:0:o;31695:109::-;31566:261;;;31028:833;30975:886;31889:31;;-1:-1:-1;;;31889:31:0;;;;;;;;;;;85720:922;85846:19;85868:20;;;:14;:20;;;;;;85816:12;;85868:20;;;;;85903;;:25;;85899:92;;-1:-1:-1;;;;85899:92:0;86021:13;;;86031:2;86021:13;;;;;;;;;86001:17;;86021:13;;;;;;;;;;-1:-1:-1;86021:13:0;86001:33;;86062:4;86055:12;;86045:4;86050:1;86045:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86045:22:0;;;;;;;;;86095:4;86088:12;;86078:4;86083:1;86078:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86078:22:0;;;;;;;;;86128:4;86121:12;;86111:4;86116:1;86111:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86111:22:0;;;;;;;;;86161:4;86154:12;;86144:4;86149:1;86144:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86144:22:0;;;;;;;;;86194:4;86187:12;;86177:4;86182:1;86177:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86177:22:0;;;;;;;;;86227:4;86220:12;;86210:4;86215:1;86210:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86210:22:0;;;;;;;;;86260:4;86253:12;;86243:4;86248:1;86243:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86243:22:0;;;;;;;;;86293:4;86286:12;;86276:4;86281:1;86276:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86276:22:0;;;;;;;;;86326:4;86319:12;;86309:4;86314:1;86309:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86309:22:0;;;;;;;;;86346:9;:14;;86359:1;86346:14;86342:124;;86394:4;86387:12;;86377:4;86382:1;86377:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86377:22:0;;;;;;;;;86342:124;;;86449:4;86442:12;;86432:4;86437:1;86432:7;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;86432:22:0;;;;;;;;;86342:124;86494:4;86487:12;;86476:4;86481:2;86476:8;;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;86476:23:0;;;;;;;;;86528:9;86521:17;;86510:4;86515:2;86510:8;;;;;;;;:::i;:::-;;;;:28;-1:-1:-1;;;;;86510:28:0;;;;;;;;-1:-1:-1;86560:12:0;86573:1;86560:15;;;86549:4;86554:2;86549:8;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;86549:26:0;;;;;;;;-1:-1:-1;86597:12:0;86610:1;86597:15;;;86586:4;86591:2;86586:8;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;86586:26:0;;;;;;;;-1:-1:-1;86630:4:0;85720:922;-1:-1:-1;;;;85720:922:0:o;71857:136::-;71912:12;71940:47;71956:8;71966:1;-1:-1:-1;;71940:15:0;:47::i;86650:533::-;86752:12;;;86762:1;86752:12;;;;;;;;;86709;;86734:15;;86752:12;;;;;;;;;;;-1:-1:-1;86752:12:0;86734:30;;86790:4;86783:12;;86775:2;86778:1;86775:5;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;86775:20:0;;;;;;;;;86821:4;86814:12;;86806:2;86809:1;86806:5;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;86806:20:0;;;;;;;;;86852:4;86845:12;;86837:2;86840:1;86837:5;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;86837:20:0;;;;;;;;;86883:4;86876:12;;86868:2;86871:1;86868:5;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;86868:20:0;;;;;;;;;86899;86939:4;:11;86922:29;;;;;;31120:19:1;;31164:2;31155:12;;30991:182;86922:29:0;;;;;;;;;;;;;86899:52;;86970:7;86995:1;86978:7;:14;:18;;;;:::i;:::-;86970:27;;;;;;;;:::i;:::-;;;;;;;;;86962:2;86965:1;86962:5;;;;;;;;:::i;:::-;;;;:35;-1:-1:-1;;;;;86962:35:0;;;;;;;;;87016:7;87041:1;87024:7;:14;:18;;;;:::i;:::-;87016:27;;;;;;;;:::i;:::-;;;;;;;;;87008:2;87011:1;87008:5;;;;;;;;:::i;:::-;;;;:35;-1:-1:-1;;;;;87008:35:0;;;;;;;;;87062:7;87087:1;87070:7;:14;:18;;;;:::i;:::-;87062:27;;;;;;;;:::i;:::-;;;;;;;;;87054:2;87057:1;87054:5;;;;;;;;:::i;:::-;;;;:35;-1:-1:-1;;;;;87054:35:0;;;;;;;;;87108:7;87133:1;87116:7;:14;:18;;;;:::i;:::-;87108:27;;;;;;;;:::i;:::-;;;;;;;;;87100:2;87103:1;87100:5;;;;;;;;:::i;:::-;;;;:35;-1:-1:-1;;;;;87100:35:0;;;;;;;;;87166:2;87170:4;87153:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87146:29;;;;86650:533;;;:::o;868:1790::-;966:11;;926:13;;952:11;992:8;;;988:23;;-1:-1:-1;;1002:9:0;;;;;;;;;-1:-1:-1;1002:9:0;;;868:1790;-1:-1:-1;868:1790:0:o;988:23::-;1063:18;1101:1;1090:7;:3;1096:1;1090:7;:::i;:::-;1089:13;;;;:::i;:::-;1084:19;;:1;:19;:::i;:::-;1063:40;-1:-1:-1;1161:19:0;1193:15;1063:40;1206:2;1193:15;:::i;:::-;-1:-1:-1;;;;;1183:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1183:26:0;;1161:48;;1222:18;1243:5;;;;;;;;;;;;;;;;;1222:26;;1312:1;1305:5;1301:13;1357:2;1349:6;1345:15;1408:1;1376:960;1431:3;1428:1;1425:10;1376:960;;;1486:1;1529:12;;;;;1523:19;1624:4;1612:2;1608:14;;;;;1590:40;;1584:47;1776:2;1772:14;;;1768:25;;1754:40;;1748:47;1966:1;1962:13;;;1958:24;;1944:39;;1938:46;2147:16;;;;2133:31;;2127:38;1660:1;1656:11;;;1797:4;1744:58;;;1692:129;1846:11;;1934:57;;;1882:128;;;;2035:11;;2123:49;;2071:120;2220:3;2216:13;2249:22;;2319:1;2304:17;;;;1479:9;1376:960;;;1380:44;2368:1;2363:3;2359:11;2389:1;2384:84;;;;2487:1;2482:82;;;;2352:212;;2384:84;-1:-1:-1;;;;;2417:17:0;;2410:43;2384:84;;2482:82;-1:-1:-1;;;;;2515:17:0;;2508:41;2352:212;-1:-1:-1;;;2580:26:0;;;2587:6;868:1790;-1:-1:-1;;;;868:1790:0:o;64823:191::-;64916:6;;;-1:-1:-1;;;;;64933:17:0;;;-1:-1:-1;;;;;;64933:17:0;;;;;;;64966:40;;64916:6;;;64933:17;64916:6;;64966:40;;64897:16;;64966:40;64886:128;64823:191;:::o;45003:772::-;45200:155;;-1:-1:-1;;;45200:155:0;;45166:4;;-1:-1:-1;;;;;45200:36:0;;;;;:155;;21791:10;;45286:4;;45309:7;;45335:5;;45200:155;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45200:155:0;;;;;;;;-1:-1:-1;;45200:155:0;;;;;;;;;;;;:::i;:::-;;;45183:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45526:6;:13;45543:1;45526:18;45522:235;;45572:40;;-1:-1:-1;;;45572:40:0;;;;;;;;;;;45522:235;45715:6;45709:13;45700:6;45696:2;45692:15;45685:38;45183:585;-1:-1:-1;;;;;;45411:55:0;-1:-1:-1;;;45411:55:0;;-1:-1:-1;45183:585:0;45003:772;;;;;;:::o;23017:723::-;23073:13;23294:5;23303:1;23294:10;23290:53;;-1:-1:-1;;23321:10:0;;;;;;;;;;;;-1:-1:-1;;;23321:10:0;;;;;23017:723::o;23290:53::-;23368:5;23353:12;23409:78;23416:9;;23409:78;;23442:8;;;;:::i;:::-;;-1:-1:-1;23465:10:0;;-1:-1:-1;23473:2:0;23465:10;;:::i;:::-;;;23409:78;;;23497:19;23529:6;-1:-1:-1;;;;;23519:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23519:17:0;;23497:39;;23547:154;23554:10;;23547:154;;23581:11;23591:1;23581:11;;:::i;:::-;;-1:-1:-1;23650:10:0;23658:2;23650:5;:10;:::i;:::-;23637:24;;:2;:24;:::i;:::-;23624:39;;23607:6;23614;23607:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;23607:56:0;;;;;;;;-1:-1:-1;23678:11:0;23687:2;23678:11;;:::i;:::-;;;23547:154;;23850:340;23909:13;23939:5;23948:1;23939:10;23935:56;;-1:-1:-1;;23966:13:0;;;;;;;;;;;;-1:-1:-1;;;23966:13:0;;;;;23850:340::o;23935:56::-;24016:5;24001:12;24061:78;24068:9;;24061:78;;24094:8;;;;:::i;:::-;;;;24126:1;24117:10;;;;;24061:78;;;24156:26;24168:5;24175:6;24156:11;:26::i;15160:317::-;15275:6;15250:21;:31;;15242:73;;;;-1:-1:-1;;;15242:73:0;;32245:2:1;15242:73:0;;;32227:21:1;32284:2;32264:18;;;32257:30;32323:31;32303:18;;;32296:59;32372:18;;15242:73:0;32043:353:1;15242:73:0;15329:12;15347:9;-1:-1:-1;;;;;15347:14:0;15369:6;15347:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15328:52;;;15399:7;15391:78;;;;-1:-1:-1;;;15391:78:0;;32813:2:1;15391:78:0;;;32795:21:1;32852:2;32832:18;;;32825:30;32891:34;32871:18;;;32864:62;32962:28;32942:18;;;32935:56;33008:19;;15391:78:0;32611:422:1;71120:475:0;71173:15;71276:17;71296:99;71374:5;71329:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;71296:24;:99::i;:::-;71276:119;;71494:4;71488:11;71483:2;71477:4;71473:13;71470:1;71463:37;71452:48;-1:-1:-1;;;;;;71547:21:0;;71543:46;;71577:12;;-1:-1:-1;;;71577:12:0;;;;;;;;;;;71543:46;71190:405;71120:475;;;:::o;66377:190::-;66502:4;66555;66526:25;66539:5;66546:4;66526:12;:25::i;:::-;:33;66519:40;;66377:190;;;;;;:::o;69631:971::-;69715:18;69181;;69742:13;69784:10;;;69780:32;;-1:-1:-1;;69803:9:0;;;;;;;;;-1:-1:-1;69803:9:0;;69796:16;;69780:32;69834:5;69825:6;:14;69821:36;;;-1:-1:-1;;69848:9:0;;;;;;;;;-1:-1:-1;69848:9:0;;69841:16;;69821:36;69875:6;69868:4;:13;69864:65;;;69890:39;;-1:-1:-1;;;69890:39:0;;;;;33659:25:1;;;33700:18;;;33693:34;;;33743:18;;;33736:34;;;33632:18;;69890:39:0;33457:319:1;69864:65:0;69976:13;;;70016:14;;;69958:15;70056:17;;;:37;;70086:7;70056:37;;;70076:7;70056:37;70267:4;70261:11;;70357:26;;;-1:-1:-1;;70353:42:0;70342:54;;70329:68;;;70442:19;;;70261:11;-1:-1:-1;70041:52:0;-1:-1:-1;70041:52:0;70568:6;70371:4;70550:16;;70543:5;70531:50;70113:477;;;69735:867;69631:971;;;;;:::o;24318:451::-;24393:13;24419:19;24451:10;24455:6;24451:1;:10;:::i;:::-;:14;;24464:1;24451:14;:::i;:::-;-1:-1:-1;;;;;24441:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24441:25:0;;24419:47;;-1:-1:-1;;;24477:6:0;24484:1;24477:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;24477:15:0;;;;;;;;;-1:-1:-1;;;24503:6:0;24510:1;24503:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;24503:15:0;;;;;;;;-1:-1:-1;24534:9:0;24546:10;24550:6;24546:1;:10;:::i;:::-;:14;;24559:1;24546:14;:::i;:::-;24534:26;;24529:135;24566:1;24562;:5;24529:135;;;-1:-1:-1;;;24614:5:0;24622:3;24614:11;24601:25;;;;;;;:::i;:::-;;;;24589:6;24596:1;24589:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;24589:37:0;;;;;;;;-1:-1:-1;24651:1:0;24641:11;;;;;24569:3;;;:::i;:::-;;;24529:135;;;-1:-1:-1;24682:10:0;;24674:55;;;;-1:-1:-1;;;24674:55:0;;34124:2:1;24674:55:0;;;34106:21:1;;;34143:18;;;34136:30;34202:34;34182:18;;;34175:62;34254:18;;24674:55:0;33922:356:1;68177:718:0;68245:12;68815:5;:12;68877:5;68767:122;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68760:129;;68177:718;;;:::o;66929:675::-;67012:7;67055:4;67012:7;67070:497;67094:5;:12;67090:1;:16;67070:497;;;67128:20;67151:5;67157:1;67151:8;;;;;;;;:::i;:::-;;;;;;;67128:31;;67194:12;67178;:28;67174:382;;67680:13;67730:15;;;67766:4;67759:15;;;67813:4;67797:21;;67306:57;;67174:382;;;67680:13;67730:15;;;67766:4;67759:15;;;67813:4;67797:21;;67483:57;;67174:382;-1:-1:-1;67108:3:0;;;;:::i;:::-;;;;67070:497;;;-1:-1:-1;67584:12:0;66929:675;-1:-1:-1;;;66929:675:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2823:347::-;2874:8;2884:6;2938:3;2931:4;2923:6;2919:17;2915:27;2905:55;;2956:1;2953;2946:12;2905:55;-1:-1:-1;2979:20:1;;-1:-1:-1;;;;;3011:30:1;;3008:50;;;3054:1;3051;3044:12;3008:50;3091:4;3083:6;3079:17;3067:29;;3143:3;3136:4;3127:6;3119;3115:19;3111:30;3108:39;3105:59;;;3160:1;3157;3150:12;3175:367;3238:8;3248:6;3302:3;3295:4;3287:6;3283:17;3279:27;3269:55;;3320:1;3317;3310:12;3269:55;-1:-1:-1;3343:20:1;;-1:-1:-1;;;;;3375:30:1;;3372:50;;;3418:1;3415;3408:12;3372:50;3455:4;3447:6;3443:17;3431:29;;3515:3;3508:4;3498:6;3495:1;3491:14;3483:6;3479:27;3475:38;3472:47;3469:67;;;3532:1;3529;3522:12;3547:1018;3680:6;3688;3696;3704;3712;3720;3728;3781:3;3769:9;3760:7;3756:23;3752:33;3749:53;;;3798:1;3795;3788:12;3749:53;3837:9;3824:23;3856:31;3881:5;3856:31;:::i;:::-;3906:5;-1:-1:-1;3958:2:1;3943:18;;3930:32;;-1:-1:-1;4009:2:1;3994:18;;3981:32;;-1:-1:-1;4064:2:1;4049:18;;4036:32;-1:-1:-1;;;;;4117:14:1;;;4114:34;;;4144:1;4141;4134:12;4114:34;4183:58;4233:7;4224:6;4213:9;4209:22;4183:58;:::i;:::-;4260:8;;-1:-1:-1;4157:84:1;-1:-1:-1;4348:3:1;4333:19;;4320:33;;-1:-1:-1;4365:16:1;;;4362:36;;;4394:1;4391;4384:12;4362:36;;4433:72;4497:7;4486:8;4475:9;4471:24;4433:72;:::i;:::-;3547:1018;;;;-1:-1:-1;3547:1018:1;;-1:-1:-1;3547:1018:1;;;;4407:98;;-1:-1:-1;;;3547:1018:1:o;4570:456::-;4647:6;4655;4663;4716:2;4704:9;4695:7;4691:23;4687:32;4684:52;;;4732:1;4729;4722:12;4684:52;4771:9;4758:23;4790:31;4815:5;4790:31;:::i;:::-;4840:5;-1:-1:-1;4897:2:1;4882:18;;4869:32;4910:33;4869:32;4910:33;:::i;:::-;4570:456;;4962:7;;-1:-1:-1;;;5016:2:1;5001:18;;;;4988:32;;4570:456::o;5031:1251::-;5225:6;5233;5241;5249;5257;5265;5273;5326:3;5314:9;5305:7;5301:23;5297:33;5294:53;;;5343:1;5340;5333:12;5294:53;5382:9;5369:23;5401:31;5426:5;5401:31;:::i;:::-;5451:5;-1:-1:-1;5507:2:1;5492:18;;5479:32;-1:-1:-1;;;;;5560:14:1;;;5557:34;;;5587:1;5584;5577:12;5557:34;5626:70;5688:7;5679:6;5668:9;5664:22;5626:70;:::i;:::-;5715:8;;-1:-1:-1;5600:96:1;-1:-1:-1;5803:2:1;5788:18;;5775:32;;-1:-1:-1;5819:16:1;;;5816:36;;;5848:1;5845;5838:12;5816:36;5887:72;5951:7;5940:8;5929:9;5925:24;5887:72;:::i;:::-;5978:8;;-1:-1:-1;5861:98:1;-1:-1:-1;6066:2:1;6051:18;;6038:32;;-1:-1:-1;6082:16:1;;;6079:36;;;6111:1;6108;6101:12;6287:248;6355:6;6363;6416:2;6404:9;6395:7;6391:23;6387:32;6384:52;;;6432:1;6429;6422:12;6384:52;-1:-1:-1;;6455:23:1;;;6525:2;6510:18;;;6497:32;;-1:-1:-1;6287:248:1:o;6819:127::-;6880:10;6875:3;6871:20;6868:1;6861:31;6911:4;6908:1;6901:15;6935:4;6932:1;6925:15;6951:275;7022:2;7016:9;7087:2;7068:13;;-1:-1:-1;;7064:27:1;7052:40;;-1:-1:-1;;;;;7107:34:1;;7143:22;;;7104:62;7101:88;;;7169:18;;:::i;:::-;7205:2;7198:22;6951:275;;-1:-1:-1;6951:275:1:o;7231:203::-;7311:4;-1:-1:-1;;;;;7336:6:1;7333:30;7330:56;;;7366:18;;:::i;:::-;-1:-1:-1;7411:1:1;7407:14;7423:4;7403:25;;7231:203::o;7439:407::-;7504:5;-1:-1:-1;;;;;7530:6:1;7527:30;7524:56;;;7560:18;;:::i;:::-;7598:57;7643:2;7622:15;;-1:-1:-1;;7618:29:1;7649:4;7614:40;7598:57;:::i;:::-;7589:66;;7678:6;7671:5;7664:21;7718:3;7709:6;7704:3;7700:16;7697:25;7694:45;;;7735:1;7732;7725:12;7694:45;7784:6;7779:3;7772:4;7765:5;7761:16;7748:43;7838:1;7831:4;7822:6;7815:5;7811:18;7807:29;7800:40;7439:407;;;;;:::o;7851:222::-;7894:5;7947:3;7940:4;7932:6;7928:17;7924:27;7914:55;;7965:1;7962;7955:12;7914:55;7987:80;8063:3;8054:6;8041:20;8034:4;8026:6;8022:17;7987:80;:::i;8078:908::-;8131:5;8184:3;8177:4;8169:6;8165:17;8161:27;8151:55;;8202:1;8199;8192:12;8151:55;8238:6;8225:20;8264:4;8288:80;8304:63;8364:2;8304:63;:::i;:::-;8288:80;:::i;:::-;8402:15;;;8488:1;8484:10;;;;8472:23;;8468:32;;;8433:12;;;;8512:15;;;8509:35;;;8540:1;8537;8530:12;8509:35;8576:2;8568:6;8564:15;8588:369;8604:6;8599:3;8596:15;8588:369;;;8690:3;8677:17;-1:-1:-1;;;;;8713:11:1;8710:35;8707:125;;;8786:1;8815:2;8811;8804:14;8707:125;8857:57;8910:3;8905:2;8891:11;8883:6;8879:24;8875:33;8857:57;:::i;:::-;8845:70;;-1:-1:-1;8935:12:1;;;;8621;;8588:369;;;-1:-1:-1;8975:5:1;8078:908;-1:-1:-1;;;;;;8078:908:1:o;8991:1196::-;9146:6;9154;9207:2;9195:9;9186:7;9182:23;9178:32;9175:52;;;9223:1;9220;9213:12;9175:52;9263:9;9250:23;-1:-1:-1;;;;;9333:2:1;9325:6;9322:14;9319:34;;;9349:1;9346;9339:12;9319:34;9387:6;9376:9;9372:22;9362:32;;9432:7;9425:4;9421:2;9417:13;9413:27;9403:55;;9454:1;9451;9444:12;9403:55;9490:2;9477:16;9512:4;9536:80;9552:63;9612:2;9552:63;:::i;9536:80::-;9650:15;;;9732:1;9728:10;;;;9720:19;;9716:28;;;9681:12;;;;9756:19;;;9753:39;;;9788:1;9785;9778:12;9753:39;9812:11;;;;9832:142;9848:6;9843:3;9840:15;9832:142;;;9914:17;;9902:30;;9865:12;;;;9952;;;;9832:142;;;9993:5;-1:-1:-1;;10036:18:1;;10023:32;;-1:-1:-1;;10067:16:1;;;10064:36;;;10096:1;10093;10086:12;10064:36;;10119:62;10173:7;10162:8;10151:9;10147:24;10119:62;:::i;:::-;10109:72;;;8991:1196;;;;;:::o;10192:908::-;10323:6;10331;10339;10347;10355;10408:2;10396:9;10387:7;10383:23;10379:32;10376:52;;;10424:1;10421;10414:12;10376:52;10463:9;10450:23;10482:31;10507:5;10482:31;:::i;:::-;10532:5;-1:-1:-1;10588:2:1;10573:18;;10560:32;-1:-1:-1;;;;;10641:14:1;;;10638:34;;;10668:1;10665;10658:12;10638:34;10707:70;10769:7;10760:6;10749:9;10745:22;10707:70;:::i;:::-;10796:8;;-1:-1:-1;10681:96:1;-1:-1:-1;10884:2:1;10869:18;;10856:32;;-1:-1:-1;10900:16:1;;;10897:36;;;10929:1;10926;10919:12;10897:36;;10968:72;11032:7;11021:8;11010:9;11006:24;10968:72;:::i;:::-;10192:908;;;;-1:-1:-1;10192:908:1;;-1:-1:-1;11059:8:1;;10942:98;10192:908;-1:-1:-1;;;10192:908:1:o;11385:322::-;11454:6;11507:2;11495:9;11486:7;11482:23;11478:32;11475:52;;;11523:1;11520;11513:12;11475:52;11563:9;11550:23;-1:-1:-1;;;;;11588:6:1;11585:30;11582:50;;;11628:1;11625;11618:12;11582:50;11651;11693:7;11684:6;11673:9;11669:22;11651:50;:::i;11897:247::-;11956:6;12009:2;11997:9;11988:7;11984:23;11980:32;11977:52;;;12025:1;12022;12015:12;11977:52;12064:9;12051:23;12083:31;12108:5;12083:31;:::i;12149:127::-;12210:10;12205:3;12201:20;12198:1;12191:31;12241:4;12238:1;12231:15;12265:4;12262:1;12255:15;12281:338;12423:2;12408:18;;12456:1;12445:13;;12435:144;;12501:10;12496:3;12492:20;12489:1;12482:31;12536:4;12533:1;12526:15;12564:4;12561:1;12554:15;12435:144;12588:25;;;12281:338;:::o;12624:416::-;12689:6;12697;12750:2;12738:9;12729:7;12725:23;12721:32;12718:52;;;12766:1;12763;12756:12;12718:52;12805:9;12792:23;12824:31;12849:5;12824:31;:::i;:::-;12874:5;-1:-1:-1;12931:2:1;12916:18;;12903:32;12973:15;;12966:23;12954:36;;12944:64;;13004:1;13001;12994:12;12944:64;13027:7;13017:17;;;12624:416;;;;;:::o;13045:795::-;13140:6;13148;13156;13164;13217:3;13205:9;13196:7;13192:23;13188:33;13185:53;;;13234:1;13231;13224:12;13185:53;13273:9;13260:23;13292:31;13317:5;13292:31;:::i;:::-;13342:5;-1:-1:-1;13399:2:1;13384:18;;13371:32;13412:33;13371:32;13412:33;:::i;:::-;13464:7;-1:-1:-1;13518:2:1;13503:18;;13490:32;;-1:-1:-1;13573:2:1;13558:18;;13545:32;-1:-1:-1;;;;;13589:30:1;;13586:50;;;13632:1;13629;13622:12;13586:50;13655:22;;13708:4;13700:13;;13696:27;-1:-1:-1;13686:55:1;;13737:1;13734;13727:12;13686:55;13760:74;13826:7;13821:2;13808:16;13803:2;13799;13795:11;13760:74;:::i;:::-;13750:84;;;13045:795;;;;;;;:::o;13845:371::-;13977:6;13985;13993;14046:2;14034:9;14025:7;14021:23;14017:32;14014:52;;;14062:1;14059;14052:12;14014:52;-1:-1:-1;;14085:23:1;;;14155:2;14140:18;;14127:32;;-1:-1:-1;14206:2:1;14191:18;;;14178:32;;13845:371;-1:-1:-1;13845:371:1:o;14221:376::-;14315:6;14323;14376:2;14364:9;14355:7;14351:23;14347:32;14344:52;;;14392:1;14389;14382:12;14344:52;14415:23;;;-1:-1:-1;14488:2:1;14473:18;;14460:32;-1:-1:-1;;;;;;14521:27:1;;14511:38;;14501:66;;14563:1;14560;14553:12;14602:388;14670:6;14678;14731:2;14719:9;14710:7;14706:23;14702:32;14699:52;;;14747:1;14744;14737:12;14699:52;14786:9;14773:23;14805:31;14830:5;14805:31;:::i;:::-;14855:5;-1:-1:-1;14912:2:1;14897:18;;14884:32;14925:33;14884:32;14925:33;:::i;15631:600::-;15774:6;15782;15790;15798;15851:2;15839:9;15830:7;15826:23;15822:32;15819:52;;;15867:1;15864;15857:12;15819:52;15903:9;15890:23;15880:33;;15960:2;15949:9;15945:18;15932:32;15922:42;;16015:2;16004:9;16000:18;15987:32;-1:-1:-1;;;;;16034:6:1;16031:30;16028:50;;;16074:1;16071;16064:12;16028:50;16113:58;16163:7;16154:6;16143:9;16139:22;16113:58;:::i;:::-;15631:600;;;;-1:-1:-1;16190:8:1;-1:-1:-1;;;;15631:600:1:o;16236:504::-;16342:6;16350;16358;16411:2;16399:9;16390:7;16386:23;16382:32;16379:52;;;16427:1;16424;16417:12;16379:52;16463:9;16450:23;16440:33;;16524:2;16513:9;16509:18;16496:32;-1:-1:-1;;;;;16543:6:1;16540:30;16537:50;;;16583:1;16580;16573:12;16537:50;16622:58;16672:7;16663:6;16652:9;16648:22;16622:58;:::i;:::-;16236:504;;16699:8;;-1:-1:-1;16596:84:1;;-1:-1:-1;;;;16236:504:1:o;16745:380::-;16824:1;16820:12;;;;16867;;;16888:61;;16942:4;16934:6;16930:17;16920:27;;16888:61;16995:2;16987:6;16984:14;16964:18;16961:38;16958:161;;17041:10;17036:3;17032:20;17029:1;17022:31;17076:4;17073:1;17066:15;17104:4;17101:1;17094:15;17130:356;17332:2;17314:21;;;17351:18;;;17344:30;17410:34;17405:2;17390:18;;17383:62;17477:2;17462:18;;17130:356::o;17491:335::-;17693:2;17675:21;;;17732:2;17712:18;;;17705:30;-1:-1:-1;;;17766:2:1;17751:18;;17744:41;17817:2;17802:18;;17491:335::o;18171:127::-;18232:10;18227:3;18223:20;18220:1;18213:31;18263:4;18260:1;18253:15;18287:4;18284:1;18277:15;18303:168;18343:7;18409:1;18405;18401:6;18397:14;18394:1;18391:21;18386:1;18379:9;18372:17;18368:45;18365:71;;;18416:18;;:::i;:::-;-1:-1:-1;18456:9:1;;18303:168::o;18476:127::-;18537:10;18532:3;18528:20;18525:1;18518:31;18568:4;18565:1;18558:15;18592:4;18589:1;18582:15;18608:545;18701:4;18707:6;18767:11;18754:25;18861:2;18857:7;18846:8;18830:14;18826:29;18822:43;18802:18;18798:68;18788:96;;18880:1;18877;18870:12;18788:96;18907:33;;18959:20;;;-1:-1:-1;;;;;;18991:30:1;;18988:50;;;19034:1;19031;19024:12;18988:50;19067:4;19055:17;;-1:-1:-1;19118:1:1;19114:14;;;19098;19094:35;19084:46;;19081:66;;;19143:1;19140;19133:12;19158:128;19198:3;19229:1;19225:6;19222:1;19219:13;19216:39;;;19235:18;;:::i;:::-;-1:-1:-1;19271:9:1;;19158:128::o;19291:135::-;19330:3;19351:17;;;19348:43;;19371:18;;:::i;:::-;-1:-1:-1;19418:1:1;19407:13;;19291:135::o;19431:127::-;19492:10;19487:3;19483:20;19480:1;19473:31;19523:4;19520:1;19513:15;19547:4;19544:1;19537:15;19563:120;19603:1;19629;19619:35;;19634:18;;:::i;:::-;-1:-1:-1;19668:9:1;;19563:120::o;19688:125::-;19728:4;19756:1;19753;19750:8;19747:34;;;19761:18;;:::i;:::-;-1:-1:-1;19798:9:1;;19688:125::o;19818:127::-;19879:10;19874:3;19870:20;19867:1;19860:31;19910:4;19907:1;19900:15;19934:4;19931:1;19924:15;19950:466;20125:3;20163:6;20157:13;20179:53;20225:6;20220:3;20213:4;20205:6;20201:17;20179:53;:::i;:::-;20295:13;;20254:16;;;;20317:57;20295:13;20254:16;20351:4;20339:17;;20317:57;:::i;:::-;20390:20;;19950:466;-1:-1:-1;;;;19950:466:1:o;20547:973::-;20632:12;;20597:3;;20687:1;20707:18;;;;20760;;;;20787:61;;20841:4;20833:6;20829:17;20819:27;;20787:61;20867:2;20915;20907:6;20904:14;20884:18;20881:38;20878:161;;20961:10;20956:3;20952:20;20949:1;20942:31;20996:4;20993:1;20986:15;21024:4;21021:1;21014:15;20878:161;21055:18;21082:104;;;;21200:1;21195:319;;;;21048:466;;21082:104;-1:-1:-1;;21115:24:1;;21103:37;;21160:16;;;;-1:-1:-1;21082:104:1;;21195:319;20494:1;20487:14;;;20531:4;20518:18;;21289:1;21303:165;21317:6;21314:1;21311:13;21303:165;;;21395:14;;21382:11;;;21375:35;21438:16;;;;21332:10;;21303:165;;;21307:3;;21497:6;21492:3;21488:16;21481:23;;21048:466;;;;;;;20547:973;;;;:::o;21525:2186::-;-1:-1:-1;;;22657:43:1;;22639:3;22719:46;22762:1;22753:11;;22745:6;22719:46;:::i;:::-;-1:-1:-1;;;22781:2:1;22774:16;22819:6;22813:13;22835:60;22888:6;22884:1;22880:2;22876:10;22869:4;22861:6;22857:17;22835:60;:::i;:::-;-1:-1:-1;;;22953:1:1;22914:15;;;;22945:10;;;22938:70;23027:46;23069:2;23061:11;;23053:6;23027:46;:::i;:::-;-1:-1:-1;;;23082:50:1;;23017:56;-1:-1:-1;23151:46:1;23193:2;23185:11;;23177:6;23151:46;:::i;:::-;23141:56;;-1:-1:-1;;;23213:2:1;23206:21;23258:6;23252:13;23274:62;23327:8;23323:1;23319:2;23315:10;23308:4;23300:6;23296:17;23274:62;:::i;:::-;-1:-1:-1;;;23396:1:1;23355:17;;;;23388:10;;;23381:73;23473:46;23515:2;23507:11;;23499:6;23473:46;:::i;:::-;23463:56;;-1:-1:-1;;;23535:2:1;23528:25;23584:6;23578:13;23600:63;23654:8;23649:2;23645;23641:11;23634:4;23626:6;23622:17;23600:63;:::i;:::-;23683:17;23702:2;23679:26;;21525:2186;-1:-1:-1;;;;;;;;;21525:2186:1:o;23716:1409::-;24241:3;24279:6;24273:13;24295:53;24341:6;24336:3;24329:4;24321:6;24317:17;24295:53;:::i;:::-;24379:6;24374:3;24370:16;24357:29;;24409:66;24402:5;24395:81;-1:-1:-1;;;24503:4:1;24496:5;24492:16;24485:31;24547:6;24541:13;24563:66;24620:8;24615:2;24608:5;24604:14;24597:4;24589:6;24585:17;24563:66;:::i;:::-;24697;24692:2;24648:20;;;;24684:11;;;24677:87;24793:66;24788:2;24780:11;;24773:87;24879:46;24921:2;24913:11;;24905:6;24879:46;:::i;:::-;24945:66;24934:78;;-1:-1:-1;;;25036:4:1;25028:13;;25021:71;25116:2;25108:11;;23716:1409;-1:-1:-1;;;;;;23716:1409:1:o;25130:691::-;25506:3;25544:6;25538:13;25560:53;25606:6;25601:3;25594:4;25586:6;25582:17;25560:53;:::i;:::-;-1:-1:-1;;;25635:16:1;;;25660:27;;;25706:48;25751:1;25740:13;;25732:6;25706:48;:::i;:::-;-1:-1:-1;;;25763:26:1;;25813:1;25805:10;;25130:691;-1:-1:-1;;;;;25130:691:1:o;25826:786::-;26205:3;26243:6;26237:13;26259:53;26305:6;26300:3;26293:4;26285:6;26281:17;26259:53;:::i;:::-;-1:-1:-1;;;26334:16:1;;;26359:27;;;26411:13;;26433:65;26411:13;26485:1;26474:13;;26467:4;26455:17;;26433:65;:::i;:::-;-1:-1:-1;;;26561:1:1;26517:20;;;;26553:10;;;26546:34;26604:1;26596:10;;25826:786;-1:-1:-1;;;;25826:786:1:o;26617:898::-;26996:3;27034:6;27028:13;27050:53;27096:6;27091:3;27084:4;27076:6;27072:17;27050:53;:::i;:::-;27134:6;27129:3;27125:16;27112:29;;27164:66;27157:5;27150:81;27274:10;27269:3;27265:20;27258:4;27251:5;27247:16;27240:46;27317:6;27311:13;27333:66;27390:8;27385:2;27378:5;27374:14;27367:4;27359:6;27355:17;27333:66;:::i;:::-;-1:-1:-1;;;27462:2:1;27418:20;;;;27454:11;;;27447:35;27506:2;27498:11;;26617:898;-1:-1:-1;;;;26617:898:1:o;27520:1206::-;28048:3;28086:6;28080:13;28102:53;28148:6;28143:3;28136:4;28128:6;28124:17;28102:53;:::i;:::-;28216:66;28177:16;;;28202:81;;;28308:13;;28330:66;28308:13;28382:2;28371:14;;28364:4;28352:17;;28330:66;:::i;:::-;-1:-1:-1;;;28459:2:1;28415:20;;;;28451:11;;;28444:59;28528:13;;28550:63;28528:13;28599:2;28591:11;;28584:4;28572:17;;28550:63;:::i;:::-;-1:-1:-1;;;28673:2:1;28632:17;;;;28665:11;;;28658:35;28717:2;28709:11;;27520:1206;-1:-1:-1;;;;;27520:1206:1:o;28731:438::-;28961:3;28999:6;28993:13;29015:53;29061:6;29056:3;29049:4;29041:6;29037:17;29015:53;:::i;:::-;-1:-1:-1;;;29090:16:1;;29115:19;;;-1:-1:-1;29161:1:1;29150:13;;28731:438;-1:-1:-1;28731:438:1:o;29174:448::-;29436:31;29431:3;29424:44;29406:3;29497:6;29491:13;29513:62;29568:6;29563:2;29558:3;29554:12;29547:4;29539:6;29535:17;29513:62;:::i;:::-;29595:16;;;;29613:2;29591:25;;29174:448;-1:-1:-1;;29174:448:1:o;30034:271::-;30217:6;30209;30204:3;30191:33;30173:3;30243:16;;30268:13;;;30243:16;30034:271;-1:-1:-1;30034:271:1:o;31178:489::-;-1:-1:-1;;;;;31447:15:1;;;31429:34;;31499:15;;31494:2;31479:18;;31472:43;31546:2;31531:18;;31524:34;;;31594:3;31589:2;31574:18;;31567:31;;;31372:4;;31615:46;;31641:19;;31633:6;31615:46;:::i;31672:249::-;31741:6;31794:2;31782:9;31773:7;31769:23;31765:32;31762:52;;;31810:1;31807;31800:12;31762:52;31842:9;31836:16;31861:30;31885:5;31861:30;:::i;31926:112::-;31958:1;31984;31974:35;;31989:18;;:::i;:::-;-1:-1:-1;32023:9:1;;31926:112::o;33038:414::-;33298:1;33293:3;33286:14;33268:3;33329:6;33323:13;33345:61;33399:6;33395:1;33390:3;33386:11;33379:4;33371:6;33367:17;33345:61;:::i;:::-;33426:16;;;;33444:1;33422:24;;33038:414;-1:-1:-1;;33038:414:1:o;33781:136::-;33820:3;33848:5;33838:39;;33857:18;;:::i;:::-;-1:-1:-1;;;33893:18:1;;33781:136::o;34283:678::-;-1:-1:-1;;;34658:16:1;;34729:3;34707:16;;;-1:-1:-1;;;;;;34703:43:1;34699:1;34690:11;;34683:64;-1:-1:-1;;;34772:1:1;34763:11;;34756:51;34830:13;;-1:-1:-1;;34852:62:1;34830:13;34902:2;34893:12;;34886:4;34874:17;;34852:62;:::i;:::-;34934:16;;;;34952:2;34930:25;;34283:678;-1:-1:-1;;;34283:678:1:o

Swarm Source

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