ETH Price: $3,414.06 (+3.44%)

Token

Filaments (FLMTS)
 

Overview

Max Total Supply

500 FLMTS

Holders

319

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
vashx.eth
Balance
1 FLMTS
0x6acd98b7f9d818699aceb70f5e87fe148ccbb988
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:
Filaments

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 90 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-26
*/

// File: contracts/AnonymiceLibrary.sol


pragma solidity ^0.8.0;

library AnonymiceLibrary {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

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

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }

    function parseInt(string memory _a)
        internal
        pure
        returns (uint8 _parsedInt)
    {
        bytes memory bresult = bytes(_a);
        uint8 mint = 0;
        for (uint8 i = 0; i < bresult.length; i++) {
            if (
                (uint8(uint8(bresult[i])) >= 48) &&
                (uint8(uint8(bresult[i])) <= 57)
            ) {
                mint *= 10;
                mint += uint8(bresult[i]) - 48;
            }
        }
        return mint;
    }

    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}
// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/Filaments.sol

// contracts/Filaments.sol

pragma solidity ^0.8.0;




contract Filaments is ERC721Enumerable, Ownable {
    /*
  _   _   _   _   _   _   _   _   _  
 / \ / \ / \ / \ / \ / \ / \ / \ / \ 
( F | I | L | A | M | E | N | T | S )
 \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ 

credit 2 my mouse dev and 0xinuarashi for making amazing on chain project
that was used as the basis for this contract
*/
    using AnonymiceLibrary for uint8;

    struct Trait {
        string traitName;
        string traitType;
    }


    //Mappings
    mapping(uint256 => Trait[]) public traitTypes;
    mapping(string => bool) hashToMinted;
    mapping(uint256 => string) internal tokenIdToHash;

    //uint256s
    uint256 MAX_SUPPLY = 500;
    uint256 SEED_NONCE = 0;
    
    //minting flag
    bool public MINTING_LIVE = false;
    uint256 public finalBlock;

    //uint arrays
    uint16[][10] TIERS;
    
    //whitelist
    mapping (address => bool) public whitelist;
    uint256 public numWhitelisted;

    //p5js url
    string p5jsUrl;
    string p5jsIntegrity;
    string imageUrl;
    string animationUrl;

    constructor() ERC721("Filaments", "FLMTS") {
        //Declare all the rarity tiers

        //Palette
        TIERS[0] = [100, 100, 100, 100, 100, 600, 600, 600, 600, 600, 600, 1000, 1000, 1000, 1300, 1600];
        //Border
        TIERS[1] = [2000, 8000];
        //Number of lines
        TIERS[2] = [1000, 1000, 1000, 7000];
        //Thickness of lines
        TIERS[3] = [100, 400, 500, 9000];
        //Pixel size
        TIERS[4] = [100, 9900];
        //Noise scale
        TIERS[5] = [100, 400, 500, 9000];
        //Noise strength
        TIERS[6] = [100, 400, 500, 9000];
        //Left or right
        TIERS[7] = [5000, 5000];
        //Speed
        TIERS[8] = [1000, 9000];
        //Number of pre-iterations
        TIERS[9] = [500, 500, 1000, 1000, 7000];
        
        numWhitelisted = 0;
        
        finalBlock = block.number + 192000;
    }

    /*
  __  __ _     _   _             ___             _   _             
 |  \/  (_)_ _| |_(_)_ _  __ _  | __|  _ _ _  __| |_(_)___ _ _  ___
 | |\/| | | ' \  _| | ' \/ _` | | _| || | ' \/ _|  _| / _ \ ' \(_-<
 |_|  |_|_|_||_\__|_|_||_\__, | |_| \_,_|_||_\__|\__|_\___/_||_/__/
                         |___/                                     
   */

    /**
     * @dev Converts a digit from 0 - 10000 into its corresponding rarity based on the given rarity tier.
     * @param _randinput The input from 0 - 10000 to use for rarity gen.
     * @param _rarityTier The tier to use.
     */
    function rarityGen(uint256 _randinput, uint8 _rarityTier)
        internal
        view
        returns (uint8)
    {
        uint16 currentLowerBound = 0;
        for (uint8 i = 0; i < TIERS[_rarityTier].length; i++) {
            uint16 thisPercentage = TIERS[_rarityTier][i];
            if (
                _randinput >= currentLowerBound &&
                _randinput < currentLowerBound + thisPercentage
            ) return i;
            currentLowerBound = currentLowerBound + thisPercentage;
        }

        revert();
    }

    /**
     * @dev Generates a 11 digit hash from a tokenId, address, and random number.
     * @param _t The token id to be used within the hash.
     * @param _a The address to be used within the hash.
     * @param _c The custom nonce to be used within the hash.
     */
    function hash(
        uint256 _t,
        address _a,
        uint256 _c
    ) internal returns (string memory) {
        require(_c < 11);

        // This will generate a 11 character string.
        // The first 2 digits are the palette.
        string memory currentHash = "";

        for (uint8 i = 0; i < 10; i++) {
            SEED_NONCE++;
            uint16 _randinput = uint16(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            block.timestamp,
                            block.difficulty,
                            _t,
                            _a,
                            _c,
                            SEED_NONCE
                        )
                    )
                ) % 10000
            );
            
            if (i == 0) {
                uint8 rar = rarityGen(_randinput, i);
                if (rar > 9) {
                    currentHash = string(
                        abi.encodePacked(currentHash, rar.toString())
                    );
                } else {
                    currentHash = string(
                        abi.encodePacked(currentHash, "0", rar.toString())
                    );
                }
            } else {
                currentHash = string(
                    abi.encodePacked(currentHash, rarityGen(_randinput, i).toString())
                );
            }
        }

        if (hashToMinted[currentHash]) return hash(_t, _a, _c + 1);

        return currentHash;
    }

    /**
     * @dev Mint internal, this is to avoid code duplication.
     */
    function mintInternal() internal {
        require(MINTING_LIVE == true || msg.sender == owner(), "Minting is not live.");
        require(isWhitelisted(msg.sender), "Must be whitelisted and can only mint 1");
        uint256 _totalSupply = totalSupply();
        require(_totalSupply < MAX_SUPPLY);
        require(block.number < finalBlock);
        require(!AnonymiceLibrary.isContract(msg.sender));
        
        whitelist[msg.sender] = false;

        uint256 thisTokenId = _totalSupply;

        tokenIdToHash[thisTokenId] = hash(thisTokenId, msg.sender, 0);

        hashToMinted[tokenIdToHash[thisTokenId]] = true;

        _mint(msg.sender, thisTokenId);
    }

    /**
     * @dev Mints new tokens.
     */
    function mintFilament() public {
        return mintInternal();
    }

    /*
 ____     ___   ____  ___        _____  __ __  ____     __ ______  ____  ___   ____   _____
|    \   /  _] /    ||   \      |     ||  |  ||    \   /  ]      ||    |/   \ |    \ / ___/
|  D  ) /  [_ |  o  ||    \     |   __||  |  ||  _  | /  /|      | |  ||     ||  _  (   \_ 
|    / |    _]|     ||  D  |    |  |_  |  |  ||  |  |/  / |_|  |_| |  ||  O  ||  |  |\__  |
|    \ |   [_ |  _  ||     |    |   _] |  :  ||  |  /   \_  |  |   |  ||     ||  |  |/  \ |
|  .  \|     ||  |  ||     |    |  |   |     ||  |  \     | |  |   |  ||     ||  |  |\    |
|__|\_||_____||__|__||_____|    |__|    \__,_||__|__|\____| |__|  |____|\___/ |__|__| \___|
                                                                                           
*/
    
    /**
     * @dev Helper function to see if whitelisted
     */
    function isWhitelisted(address _wallet) public view returns (bool) {
        if (_wallet == owner()) {
            return true; // Owner
        }
        
        return whitelist[_wallet];
    }

    /**
     * @dev Hash to HTML function
     */
    function hashToHTML(string memory _hash, uint256 _tokenId)
        public
        view
        returns (string memory)
    {
        string memory htmlString = string(
            abi.encodePacked(
                'data:text/html,%3Chtml%3E%3Chead%3E%3Cscript%20src%3D%22',
                p5jsUrl,
                '%22%20integrity%3D%22',
                p5jsIntegrity,
                '%22%20crossorigin%3D%22anonymous%22%3E%3C%2Fscript%3E%3C%2Fhead%3E%3Cbody%3E%3Cscript%3Evar%20tokenId%3D',
                AnonymiceLibrary.toString(_tokenId),
                '%3Bvar%20hash%3D%22',
                _hash
            )
        );

        htmlString = string(
            abi.encodePacked(
                htmlString,
                '%22%3Bfunction%20sdfsd%28t%29%7Breturn%20function%28%29%7Bvar%20e%3Dt%2B%3D1831565813%3Breturn%20e%3DMath.imul%28e%5Ee%3E%3E%3E15%2C1%7Ce%29%2C%28%28%28e%5E%3De%2BMath.imul%28e%5Ee%3E%3E%3E7%2C61%7Ce%29%29%5Ee%3E%3E%3E14%29%3E%3E%3E0%29%2F4294967296%7D%7Dfunction%20wraw%28t%29%7Bvar%20e%2Cr%3D%5B%5D%3Bfor%28e%3D0%3Be%3Ct.length%3Be%2B%2B%29r%5Be%5D%3Dt%5Be%5D.w1%2B%28r%5Be-1%5D%7C%7C0%29%3Bvar%20i%3Drand%28%29%2Ar%5Br.length-1%5D%3Bfor%28e%3D0%3Be%3Cr.length%26%26%21%28r%5Be%5D%3Ei%29%3Be%2B%2B%29%3Breturn%20t%5Be%5D%7Dfunction%20wrnd%28t%29%7Breturn%20wraw%28t%29.a1%7Dfunction%20gRI%28t%29%7Breturn%20Math.floor%28rand%28%29%2At%29%7Dfunction%20traitRaw%28t%2Ce%29%7Breturn%20e%3E%3Dt.length%3Ft%5Bt.length-1%5D%3At%5Be%5D%7Dfunction%20trait%28t%2Ce%29%7Breturn%20traitRaw%28t%2Ce%29.a1%7Dvar%20colors%2Cbgc%2Cc%2CdidStart%2Cimg%2Cwd%2Chei%2Cseed%2Crand%2Ctz0%2Ctz1%2Ctz2%2Ctz3%2Ctz4%2Ctz5%2Ctz6%2Ctz7%2Ctz8%2Ctz9%2Ctz10%2Cborder%2Cnum%2ClnThk%2CpxSz%2CnsScl%2CnsStr%2ClOr%2CnnUniS%2CisSUni%2Cspeed%2Czz%2Cptks%2CrunCount%2Ccanvas%2ColdWd%2ColdHei%3Bfunction%20hashToTraits%28t%29%7Bt%26%26%28tz0%3Dt.charAt%280%29%2Ctz1%3Dt.charAt%281%29%2Ctz2%3Dt.charAt%282%29%2Ctz3%3Dt.charAt%283%29%2Ctz4%3Dt.charAt%284%29%2Ctz5%3Dt.charAt%285%29%2Ctz6%3Dt.charAt%286%29%2Ctz7%3Dt.charAt%287%29%2Ctz8%3Dt.charAt%288%29%2Ctz9%3Dt.charAt%289%29%2Ctz10%3Dt.charAt%2810%29%2Ctz1%3DNumber%28tz0.toString%28%29%2Btz1.toString%28%29%29%29%7Dfunction%20setup%28%29%7Bseed%3DtokenId%2Ctz0%3D0%2Ctz1%3D7%2Ctz2%3D7%2Ctz3%3D7%2Ctz4%3D7%2Ctz5%3D7%2Ctz6%3D7%2Ctz7%3D7%2Ctz8%3D7%2Ctz9%3D7%2Ctz10%3D7%2Ctz1%3DNumber%28tz0.toString%28%29%2Btz1.toString%28%29%29%2ChashToTraits%28hash%29%2Crand%3Dsdfsd%28seed%29%2Cborder%3D0%3D%3Dtz2%3F20%3A0%3Bnum%3Dtrait%28%5B%7Ba1%3A1e3%2Cw1%3A10%7D%2C%7Ba1%3A500%2Cw1%3A10%7D%2C%7Ba1%3A250%2Cw1%3A10%7D%2C%7Ba1%3A100%2Cw1%3A70%7D%5D%2Ctz3%29%3BlnThk%3Dtrait%28%5B%7Ba1%3A40%2Cw1%3A1%7D%2C%7Ba1%3A30%2Cw1%3A4%7D%2C%7Ba1%3A10%2Cw1%3A5%7D%2C%7Ba1%3A20%2Cw1%3A90%7D%5D%2Ctz4%29%2CpxSz%3D0%3D%3Dtz5%3F20%3A10%3BnsScl%3Dtrait%28%5B%7Ba1%3A1e4%2Cw1%3A1%7D%2C%7Ba1%3A250%2Cw1%3A4%7D%2C%7Ba1%3A50%2Cw1%3A5%7D%2C%7Ba1%3A500%2Cw1%3A90%7D%5D%2Ctz6%29%3BnsStr%3Dtrait%28%5B%7Ba1%3A10%2Cw1%3A1%7D%2C%7Ba1%3A5%2Cw1%3A4%7D%2C%7Ba1%3A2%2Cw1%3A5%7D%2C%7Ba1%3A1%2Cw1%3A90%7D%5D%2Ctz7%29%2ClOr%3D0%3D%3Dtz8%3F-1%3A1%2CnnUniS%3Dfunction%28%29%7Breturn%20lOr%2A%283%2BgRI%283%29%29%7D%2Cspeed%3D%28isSUni%3D1%3D%3Dtz9%29%3F10%2AlOr%3AnnUniS%28%29%3Bzz%3Dtrait%28%5B%7Ba1%3A0%2Cw1%3A5%7D%2C%7Ba1%3A250%2Cw1%3A5%7D%2C%7Ba1%3A300%2Cw1%3A10%7D%2C%7Ba1%3A400%2Cw1%3A10%7D%2C%7Ba1%3A500%2Cw1%3A70%7D%5D%2Ctz10%29%2Cptks%3D%5Bnum%5D%2CrunCount%3D0%2Cwd%3DMath.min%28800%2CwindowWidth%29%2Chei%3DMath.min%28960%2CwindowHeight%29%2Cwd%3DMath.ceil%28wd%2FpxSz%29%2ApxSz%2Chei%3DMath.ceil%28hei%2FpxSz%29%2ApxSz%2CdidStart%3D%211%2CnoiseSeed%28seed%29%3Bvar%20t%3DtraitRaw%28%5B%7Ba1%3A%5B%28c%3Dcolor%29%28%22%23ffa4d5%22%29%2Cc%28%22%2383ffc1%22%29%2Cc%28%22%23ffe780%22%29%2Cc%28%22%2399e2ff%22%29%5D%2CbgColor%3Ac%28%22%23ffffff%22%29%2Cw1%3A1%7D%2C%7Ba1%3A%5Bc%28%22%23ffffff%22%29%2Cc%28%22%23000000%22%29%5D%2Cw1%3A1%7D%2C%7Ba1%3A%5Bc%28%22%23305e90%22%29%2Cc%28%22%23db4e54%22%29%2Cc%28%22%234f3c2d%22%29%2Cc%28%22%23ffbb12%22%29%2Cc%28%22%23389894%22%29%2Cc%28%22%23e0d8c5%22%29%2Cc%28%22%23c7e3d4%22%29%5D%2Cw1%3A1%2CbgColor%3Ac%28%22%23ffffff%22%29%7D%2C%7Ba1%3A%5Bc%28%22%230827f5%22%29%2Cc%28%22%233751f7%22%29%2Cc%28%22%238493fa%22%29%5D%2Cw1%3A1%7D%2C%7Ba1%3A%5Bc%28%22%2300c1ff%22%29%2Cc%28%22%230023ff%22%29%2Cc%28%22%237215ff%22%29%2Cc%28%22%23ff03fc%22%29%2Cc%28%22%23ff000a%22%29%2Cc%28%22%23ff8700%22%29%2Cc%28%22%23fff700%22%29%2Cc%28%22%235fff00%22%29%2Cc%28%22%2300ff2e%22%29%5D%2Cw1%3A1%2CbgColor%3Ac%28%22%23ffffff%22%29%7D%2C%7Ba1%3A%5Bc%28%22%2300e000%22%29%2Cc%28%22%23005900%22%29%2Cc%28%22%23000000%22%29%5D%2Cw1%3A5%7D%2C%7Ba1%3A%5Bc%28%22%239d0208%22%29%2Cc%28%22%23d00000%22%29%2Cc%28%22%23e85d04%22%29%2Cc%28%22%23faa307%22%29%5D%2Cw1%3A5%7D%2C%7Ba1%3A%5Bc%28%22%23fff69f%22%29%2Cc%28%22%23fdd870%22%29%2Cc%28%22%23d0902f%22%29%2Cc%28%22%23a15501%22%29%2Cc%28%22%23351409%22%29%5D%2Cw1%3A5%7D%2C%7Ba1%3A%5Bc%28%22%23a0ffe3%22%29%2Cc%28%22%2365dc98%22%29%2Cc%28%22%238d8980%22%29%2Cc%28%22%23575267%22%29%2Cc%28%22%23222035%22%29%5D%2Cw1%3A5%7D%2C%7Ba1%3A%5Bc%28%22%230099ff%22%29%2Cc%28%22%235655dd%22%29%2Cc%28%22%238822ff%22%29%2Cc%28%22%23aa99ff%22%29%5D%2Cw1%3A5%7D%2C%7Ba1%3A%5Bc%28%22%237700a6%22%29%2Cc%28%22%23fe00fe%22%29%2Cc%28%22%23defe47%22%29%2Cc%28%22%2300b3fe%22%29%2Cc%28%22%230016ee%22%29%5D%2Cw1%3A5%7D%2C%7Ba1%3A%5Bc%28%22%23c4ffff%22%29%2Cc%28%22%2308deea%22%29%2Cc%28%22%231261d1%22%29%5D%2Cw1%3A10%7D%2C%7Ba1%3A%5Bc%28%22%23ff124f%22%29%2Cc%28%22%23ff00a0%22%29%2Cc%28%22%23fe75fe%22%29%2Cc%28%22%237a04eb%22%29%2Cc%28%22%23120458%22%29%5D%2Cw1%3A10%7D%2C%7Ba1%3A%5Bc%28%22%23111111%22%29%2Cc%28%22%23222222%22%29%2Cc%28%22%23333333%22%29%2Cc%28%22%23444444%22%29%2Cc%28%22%23666666%22%29%5D%2Cw1%3A10%7D%2C%7Ba1%3A%5Bc%28%22%23f887ff%22%29%2Cc%28%22%23de004e%22%29%2Cc%28%22%23860029%22%29%2Cc%28%22%23321450%22%29%2Cc%28%22%2329132e%22%29%5D%2Cw1%3A15%7D%2C%7Ba1%3A%5Bc%28%22%238386f5%22%29%2Cc%28%22%233d43b4%22%29%2Cc%28%22%23041348%22%29%2Cc%28%22%23083e12%22%29%2Cc%28%22%231afe49%22%29%5D%2Cw1%3A20%7D%5D%2Ctz1%29%3Bcolors%3Dt.a1%2Cbgc%3Dc%28%22%23000000%22%29%2Ct.bgColor%26%26%28bgc%3Dt.bgColor%29%2C%28canvas%3DcreateCanvas%28wd%2Chei%29%29.doubleClicked%28toggleFullscreen%29%2CnoStroke%28%29%3Bfor%28let%20t%3D0%3Bt%3Cnum%3Bt%2B%2B%29%7Bvar%20e%3DcreateVector%28border%2BgRI%281.2%2A%28width-2%2Aborder%29%29%2Cborder%2BgRI%28height-2%2Aborder%29%2C2%29%2Cr%3DcreateVector%28cos%280%29%2Csin%280%29%29%3Bspeed%3DisSUni%3Fspeed%3AnnUniS%28%29%2Cptks%5Bt%5D%3Dnew%20Ptk%28e%2Cr%2Cspeed%29%7DframeRate%2810%29%7Dfunction%20remake%28t%2Ce%29%7Bt%3DMath.ceil%28t%2FpxSz%29%2ApxSz%2Ce%3DMath.ceil%28e%2FpxSz%29%2ApxSz%2Cwd%3Dt%2Chei%3De%2Cwidth%3Dt%2Cheight%3De%2C%28img%3DcreateImage%28Math.floor%28wd%2FpxSz%29%2CMath.floor%28hei%2FpxSz%29%29%29.loadPixels%28%29%2CresizeCanvas%28t%2Ce%29%3Bfor%28let%20t%3D0%3Bt%3Czz%3Bt%2B%2B%29%7Bfor%28let%20t%3D0%3Bt%3Cptks.length%3Bt%2B%2B%29ptks%5Bt%5D.run%28%29%3BrunCount%2B%2B%7D%7Dfunction%20toggleFullscreen%28%29%7Blet%20t%3Ddocument.querySelector%28%22canvas%22%29%3Bdocument.fullscreenElement%3Fdocument.exitFullscreen%28%29%3A%28oldWd%3Dwd%2ColdHei%3Dhei%2Cremake%28800%2C960%29%2Ct.requestFullscreen%28%29.catch%28t%3D%3E%7Balert%28%60Error%3A%20%24%7Bt.message%7D%20%28%24%7Bt.name%7D%29%60%29%7D%29%29%7Dfunction%20keyPressed%28%29%7Breturn%2070%3D%3D%3DkeyCode%3F%28remake%281500%2C500%29%2C%211%29%3A88%3D%3D%3DkeyCode%3F%28remake%28prompt%28%22Enter%20width%20in%20pixels%22%2C%22500%22%29%2Cprompt%28%22Height%3F%22%2C%22500%22%29%29%2C%211%29%3A79%3D%3D%3DkeyCode%3F%28toggleFullscreen%28%29%2C%211%29%3Avoid%200%7Dfunction%20draw%28%29%7Bif%28%21didStart%29%7Bfor%28let%20t%3D0%3Bt%3Czz%3Bt%2B%2B%29%7Bfor%28let%20t%3D0%3Bt%3Cptks.length%3Bt%2B%2B%29ptks%5Bt%5D.run%28%29%3BrunCount%2B%2B%7DdidStart%3D%210%7Dfor%28let%20t%3D0%3Bt%3Cptks.length%3Bt%2B%2B%29ptks%5Bt%5D.run%28%29%3BrunCount%2B%2B%2C%28img%3DcreateImage%28wd%2FpxSz%2Chei%2FpxSz%29%29.loadPixels%28%29%3Bfor%28var%20t%3D0%3Bt%3Cimg.height%3Bt%2B%2B%29for%28var%20e%3D0%3Be%3Cimg.width%3Be%2B%2B%29%7Blet%20r%3Dget%28e%2ApxSz%2Ct%2ApxSz%29%2Ci%3D4%2A%28e%2Bt%2Aimg.width%29%3Bimg.pixels%5Bi%5D%3Dred%28r%29%2Cimg.pixels%5Bi%2B1%5D%3Dgreen%28r%29%2Cimg.pixels%5Bi%2B2%5D%3Dblue%28r%29%2Cimg.pixels%5Bi%2B3%5D%3Dalpha%28r%29%7Dfill%28bgc%29%2Crect%280%2C0%2Cwidth%2Cheight%29%2Cimg.updatePixels%28%29%2CnoSmooth%28%29%2Cimage%28img%2C0%2C0%2Cwidth%2Cheight%29%2Cfill%28bgc%29%2Crect%280%2C0%2Cborder%2Cheight%29%2Crect%280%2C0%2Cwidth%2Cborder%29%2Crect%28width-border%2C0%2Cborder%2Cheight%29%2Crect%280%2Cheight-border%2Cwidth%2Cborder%29%7Dclass%20Ptk%7Bconstructor%28t%2Ce%2Cr%29%7Bthis.loc%3Dt%2Cthis.dir%3De%2Cthis.speed%3Dr%2Cthis.c%3Dcolors%5BgRI%28colors.length%29%5D%2Cthis.lineSize%3DlnThk%7Drun%28%29%7Bthis.move%28%29%2Cthis.checkEdges%28%29%2Cthis.update%28%29%7Dmove%28%29%7Blet%20t%3Dnoise%28this.loc.x%2FnsScl%2Cthis.loc.y%2FnsScl%2CrunCount%2FnsScl%29%2ATWO_PI%2AnsStr%3Bthis.dir.x%3Dcos%28t%29%2Cthis.dir.y%3Dsin%28t%29%3Bvar%20e%3Dthis.dir.copy%28%29%3Be.mult%281%2Athis.speed%29%2Cthis.loc.add%28e%29%7DcheckEdges%28%29%7B%28this.loc.x%3Cborder%7C%7Cthis.loc.x%3Ewidth-border%7C%7Cthis.loc.y%3Cborder%7C%7Cthis.loc.y%3Eheight-border%29%26%26%28this.loc.x%3Dborder%2BgRI%28width-2%2Aborder%29%2Cthis.loc.y%3Dborder%2BgRI%28height-2%2Aborder%29%29%7Dupdate%28%29%7Bfill%28this.c%29%2Cellipse%28this.loc.x%2Cthis.loc.y%2Cthis.lineSize%2Cthis.lineSize%29%7D%7D%3C%2Fscript%3E%3C%2Fbody%3E%3C%2Fhtml%3E'
            )
        );

        return htmlString;
    }

    /**
     * @dev Hash to metadata function
     */
    function hashToMetadata(string memory _hash)
        public
        view
        returns (string memory)
    {
        string memory metadataString;
        
        uint8 paletteTraitIndex = AnonymiceLibrary.parseInt(
            AnonymiceLibrary.substring(_hash, 0, 2)
        );

        metadataString = string(
            abi.encodePacked(
                metadataString,
                '{"trait_type":"',
                traitTypes[0][paletteTraitIndex].traitType,
                '","value":"',
                traitTypes[0][paletteTraitIndex].traitName,
                '"},'
            )
        );

        for (uint8 i = 2; i < 11; i++) {
            uint8 thisTraitIndex = AnonymiceLibrary.parseInt(
                AnonymiceLibrary.substring(_hash, i, i + 1)
            );

            metadataString = string(
                abi.encodePacked(
                    metadataString,
                    '{"trait_type":"',
                    traitTypes[i][thisTraitIndex].traitType,
                    '","value":"',
                    traitTypes[i][thisTraitIndex].traitName,
                    '"}'
                )
            );

            if (i != 10)
                metadataString = string(abi.encodePacked(metadataString, ","));
        }

        return string(abi.encodePacked("[", metadataString, "]"));
    }

    /**
     * @dev Returns the SVG and metadata for a token Id
     * @param _tokenId The tokenId to return the SVG and metadata for.
     */
    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId));

        string memory tokenHash = _tokenIdToHash(_tokenId);
        
        string memory description = '", "description": "Filaments is a collection of 500 unique pieces of generative pixel art. Metadata and art is mirrored permanently on-chain. Double click to full screen. Press F then right-click and save as a banner.",';
        
        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    AnonymiceLibrary.encode(
                        bytes(
                            string(
                                abi.encodePacked(
                                    '{"name": "Filaments #',
                                    AnonymiceLibrary.toString(_tokenId),
                                    description,
                                    '"animation_url": "',
                                    animationUrl,
                                    AnonymiceLibrary.toString(_tokenId),
                                    '","image":"',
                                    imageUrl,
                                    AnonymiceLibrary.toString(_tokenId),
                                    '","attributes":',
                                    hashToMetadata(tokenHash),
                                    "}"
                                )
                            )
                        )
                    )
                )
            );
    }

    /**
     * @dev Returns a hash for a given tokenId
     * @param _tokenId The tokenId to return the hash for.
     */
    function _tokenIdToHash(uint256 _tokenId)
        public
        view
        returns (string memory)
    {
        string memory tokenHash = tokenIdToHash[_tokenId];

        return tokenHash;
    }

    /*

  ___   __    __  ____     ___  ____       _____  __ __  ____     __ ______  ____  ___   ____   _____
 /   \ |  |__|  ||    \   /  _]|    \     |     ||  |  ||    \   /  ]      ||    |/   \ |    \ / ___/
|     ||  |  |  ||  _  | /  [_ |  D  )    |   __||  |  ||  _  | /  /|      | |  ||     ||  _  (   \_ 
|  O  ||  |  |  ||  |  ||    _]|    /     |  |_  |  |  ||  |  |/  / |_|  |_| |  ||  O  ||  |  |\__  |
|     ||  `  '  ||  |  ||   [_ |    \     |   _] |  :  ||  |  /   \_  |  |   |  ||     ||  |  |/  \ |
|     | \      / |  |  ||     ||  .  \    |  |   |     ||  |  \     | |  |   |  ||     ||  |  |\    |
 \___/   \_/\_/  |__|__||_____||__|\_|    |__|    \__,_||__|__|\____| |__|  |____|\___/ |__|__| \___|
                                                                                                     


    */
    
    /**
     * @dev Clears the traits.
     */
    function clearTraits() public onlyOwner {
        for (uint256 i = 0; i < 11; i++) {
            delete traitTypes[i];
        }
    }
    
    /**
     * @dev Batch adds addresses to whitelist
     */
    function batchWhitelist(address[] memory _users) public onlyOwner {
        uint size = _users.length;
        
        for (uint256 i=0; i< size; i++){
          address user = _users[i];
          whitelist[user] = true;
        }
        
        numWhitelisted += _users.length;
    }

    /**
     * @dev Add a trait type
     * @param _traitTypeIndex The trait type index
     * @param traits Array of traits to add
     */

    function addTraitType(uint256 _traitTypeIndex, Trait[] memory traits)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < traits.length; i++) {
            traitTypes[_traitTypeIndex].push(
                Trait(
                    traits[i].traitName,
                    traits[i].traitType
                )
            );
        }

        return;
    }
    
    /**
     * @dev Mint for burn
     */
    function ownerMintForBurn() public onlyOwner {
        uint256 _totalSupply = totalSupply();
        require(_totalSupply < MAX_SUPPLY);
        require(!AnonymiceLibrary.isContract(msg.sender));

        uint256 thisTokenId = _totalSupply;

        tokenIdToHash[thisTokenId] = hash(thisTokenId, msg.sender, 0);

        hashToMinted[tokenIdToHash[thisTokenId]] = true;

        _mint(0x000000000000000000000000000000000000dEaD, thisTokenId);
    }
    
    function flipMintingSwitch() public onlyOwner {
        MINTING_LIVE = !MINTING_LIVE;
    }

    /**
     * @dev Sets the p5js url
     * @param _p5jsUrl The address of the p5js file hosted on CDN
     */

    function setJsAddress(string memory _p5jsUrl) public onlyOwner {
        p5jsUrl = _p5jsUrl;
    }

    /**
     * @dev Sets the p5js resource integrity
     * @param _p5jsIntegrity The hash of the p5js file (to protect w subresource integrity)
     */

    function setJsIntegrity(string memory _p5jsIntegrity) public onlyOwner {
        p5jsIntegrity = _p5jsIntegrity;
    }
    
    /**
     * @dev Sets the base image url
     * @param _imageUrl The base url for image field
     */

    function setImageUrl(string memory _imageUrl) public onlyOwner {
        imageUrl = _imageUrl;
    }
    
    /**
     * @dev Sets the base animation url
     * @param _animationUrl The base url for animations
     */

    function setAnimationUrl(string memory _animationUrl) public onlyOwner {
        animationUrl = _animationUrl;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINTING_LIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"_tokenIdToHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"}],"internalType":"struct Filaments.Trait[]","name":"traits","type":"tuple[]"}],"name":"addTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"batchWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintingSwitch","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":"string","name":"_hash","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hashToHTML","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"hashToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFilament","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numWhitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerMintForBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_animationUrl","type":"string"}],"name":"setAnimationUrl","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":"_imageUrl","type":"string"}],"name":"setImageUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_p5jsUrl","type":"string"}],"name":"setJsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_p5jsIntegrity","type":"string"}],"name":"setJsIntegrity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526101f4600e556000600f556010805460ff191690553480156200002657600080fd5b50604080518082018252600981526846696c616d656e747360b81b602080830191825283518085019094526005845264464c4d545360d81b90840152815191929162000075916000916200036f565b5080516200008b9060019060208401906200036f565b505050620000a8620000a26200031960201b60201c565b6200031d565b604080516102008101825260648082526020820181905291810182905260608101829052608081019190915261025860a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201526103e8610160820181905261018082018190526101a08201526105146101c08201526106406101e08201526200013d906012906010620003fe565b50604080518082019091526107d08152611f40602082015262000165906013906002620003fe565b50604080516080810182526103e88082526020820181905291810191909152611b5860608201526200019c906014906004620003fe565b50604080516080810182526064815261019060208201526101f4918101919091526123286060820152620001d5906015906004620003fe565b5060408051808201909152606481526126ac6020820152620001fc906016906002620003fe565b50604080516080810182526064815261019060208201526101f491810191909152612328606082015262000235906017906004620003fe565b50604080516080810182526064815261019060208201526101f49181019190915261232860608201526200026e906018906004620003fe565b5060408051808201909152611388808252602082015262000294906019906002620003fe565b50604080518082019091526103e881526123286020820152620002bc90601a906002620003fe565b506040805160a0810182526101f480825260208201526103e89181018290526060810191909152611b586080820152620002fb90601b906005620003fe565b506000601d5562000310436202ee00620004bb565b6011556200051f565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200037d90620004e2565b90600052602060002090601f016020900481019282620003a15760008555620003ec565b82601f10620003bc57805160ff1916838001178555620003ec565b82800160010185558215620003ec579182015b82811115620003ec578251825591602001919060010190620003cf565b50620003fa929150620004a4565b5090565b82805482825590600052602060002090600f01601090048101928215620003ec5791602002820160005b838211156200046a57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000428565b80156200049a5782816101000a81549061ffff02191690556002016020816001010492830192600103026200046a565b5050620003fa9291505b5b80821115620003fa5760008155600101620004a5565b60008219821115620004dd57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620004f757607f821691505b602082108114156200051957634e487b7160e01b600052602260045260246000fd5b50919050565b615f6f806200052f6000396000f3fe608060405234801561001057600080fd5b50600436106101f15760003560e01c80634f6ccce71161011057806395d89b41116100a857806395d89b41146104065780639b19251a1461040e578063a22cb46514610431578063b88d4fde14610444578063c876b24014610457578063c87b56dd1461045f578063d9d2628314610472578063e985e9c514610485578063f2fde38b14610498578063f3c81d2a146104ab57600080fd5b80634f6ccce71461038c57806354dacb961461039f5780636352211e146103a857806366e33870146103bb57806370a08231146103ce578063715018a6146103e157806372f90ac1146103e95780637fbb691a146103f65780638da5cb5b146103fe57600080fd5b806323b872dd1161018e57806323b872dd146102ca57806326b51c8c146102dd57806328e56c5e146102e65780632abff1f2146102f95780632f745c591461030c5780632fb098d21461031f578063349d27481461034057806339ee0661146103535780633af32abf1461036657806342842e0e1461037957600080fd5b80625ea307146101f657806301ffc9a71461021f57806306fdde0314610242578063081812fc1461024a578063095ea7b314610275578063098afd4b1461028a5780630a3d4cc41461029257806313fb44bf146102a557806318160ddd146102b8575b600080fd5b610209610204366004612a33565b6104b3565b6040516102169190615a60565b60405180910390f35b61023261022d366004612981565b610557565b6040519015158152602001610216565b610209610582565b61025d610258366004612a33565b610614565b6040516001600160a01b039091168152602001610216565b6102886102833660046128b4565b6106a1565b005b6102886107b2565b6102096102a03660046129ef565b610819565b6102886102b33660046129bb565b610878565b6008545b604051908152602001610216565b6102886102d83660046127c1565b6108be565b6102bc60115481565b6102886102f43660046129bb565b6108ef565b6102886103073660046129bb565b610931565b6102bc61031a3660046128b4565b610972565b61033261032d366004612b63565b610a08565b604051610216929190615a73565b61028861034e366004612a4c565b610b59565b6102886103613660046128de565b610c53565b610232610374366004612773565b610d01565b6102886103873660046127c1565b610d4b565b6102bc61039a366004612a33565b610d66565b6102bc601d5481565b61025d6103b6366004612a33565b610df9565b6102096103c93660046129bb565b610e70565b6102bc6103dc366004612773565b611071565b6102886110f8565b6010546102329060ff1681565b610288611133565b61025d61113b565b61020961114a565b61023261041c366004612773565b601c6020526000908152604090205460ff1681565b61028861043f366004612878565b611159565b6102886104523660046127fd565b61121a565b610288611252565b61020961046d366004612a33565b611329565b6102886104803660046129bb565b6113ce565b61023261049336600461278e565b611410565b6102886104a6366004612773565b61143e565b6102886114db565b6000818152600d60205260408120805460609291906104d190615d10565b80601f01602080910402602001604051908101604052809291908181526020018280546104fd90615d10565b801561054a5780601f1061051f5761010080835404028352916020019161054a565b820191906000526020600020905b81548152906001019060200180831161052d57829003601f168201915b5093979650505050505050565b60006001600160e01b0319821663780e9d6360e01b148061057c575061057c8261151e565b92915050565b60606000805461059190615d10565b80601f01602080910402602001604051908101604052809291908181526020018280546105bd90615d10565b801561060a5780601f106105df5761010080835404028352916020019161060a565b820191906000526020600020905b8154815290600101906020018083116105ed57829003601f168201915b5050505050905090565b600061061f8261156e565b6106855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106ac82610df9565b9050806001600160a01b0316836001600160a01b0316141561071a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161067c565b336001600160a01b038216148061073657506107368133611410565b6107a35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606482015260840161067c565b6107ad838361158b565b505050565b336107bb61113b565b6001600160a01b0316146107e15760405162461bcd60e51b815260040161067c90615af3565b60005b600b811015610816576000818152600b60205260408120610804916125c1565b8061080e81615d4b565b9150506107e4565b50565b60606000601e601f61082a856115f9565b8660405160200161083e9493929190615754565b6040516020818303038152906040529050806040516020016108609190612cf7565b60408051808303601f19018152919052949350505050565b3361088161113b565b6001600160a01b0316146108a75760405162461bcd60e51b815260040161067c90615af3565b80516108ba90601f9060208401906125e2565b5050565b6108c833826116fe565b6108e45760405162461bcd60e51b815260040161067c90615b28565b6107ad8383836117c0565b336108f861113b565b6001600160a01b03161461091e5760405162461bcd60e51b815260040161067c90615af3565b80516108ba9060219060208401906125e2565b3361093a61113b565b6001600160a01b0316146109605760405162461bcd60e51b815260040161067c90615af3565b80516108ba90602090818401906125e2565b600061097d83611071565b82106109df5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161067c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b6020528160005260406000208181548110610a2457600080fd5b906000526020600020906002020160009150915050806000018054610a4890615d10565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7490615d10565b8015610ac15780601f10610a9657610100808354040283529160200191610ac1565b820191906000526020600020905b815481529060010190602001808311610aa457829003601f168201915b505050505090806001018054610ad690615d10565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0290615d10565b8015610b4f5780601f10610b2457610100808354040283529160200191610b4f565b820191906000526020600020905b815481529060010190602001808311610b3257829003601f168201915b5050505050905082565b33610b6261113b565b6001600160a01b031614610b885760405162461bcd60e51b815260040161067c90615af3565b60005b81518110156107ad57600b60008481526020019081526020016000206040518060400160405280848481518110610bc457610bc4615ddc565b6020026020010151600001518152602001848481518110610be757610be7615ddc565b602090810291909101810151810151909152825460018101845560009384529281902082518051939460020290910192610c2492849201906125e2565b506020828101518051610c3d92600185019201906125e2565b5050508080610c4b90615d4b565b915050610b8b565b33610c5c61113b565b6001600160a01b031614610c825760405162461bcd60e51b815260040161067c90615af3565b805160005b81811015610ce4576000838281518110610ca357610ca3615ddc565b6020908102919091018101516001600160a01b03166000908152601c90915260409020805460ff191660011790555080610cdc81615d4b565b915050610c87565b508151601d6000828254610cf89190615c11565b90915550505050565b6000610d0b61113b565b6001600160a01b0316826001600160a01b03161415610d2c57506001919050565b506001600160a01b03166000908152601c602052604090205460ff1690565b6107ad8383836040518060200160405280600081525061121a565b6000610d7160085490565b8210610dd45760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161067c565b60088281548110610de757610de7615ddc565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061057c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161067c565b6060806000610e8a610e85856000600261196b565b611a39565b60008052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f768054919250839160ff8416908110610ece57610ece615ddc565b9060005260206000209060020201600101600b60008081526020019081526020016000208360ff1681548110610f0657610f06615ddc565b9060005260206000209060020201600001604051602001610f299392919061566d565b60408051601f19818403018152919052915060025b600b8160ff161015611047576000610f6a610e858760ff8516610f62866001615c29565b60ff1661196b565b905083600b60008460ff1681526020019081526020016000208260ff1681548110610f9757610f97615ddc565b9060005260206000209060020201600101600b60008560ff1681526020019081526020016000208360ff1681548110610fd257610fd2615ddc565b9060005260206000209060020201600001604051602001610ff5939291906156db565b60405160208183030381529060405293508160ff16600a1461103457836040516020016110229190612cd2565b60405160208183030381529060405293505b508061103f81615d66565b915050610f3e565b508160405160200161105991906158a6565b60405160208183030381529060405292505050919050565b60006001600160a01b0382166110dc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161067c565b506001600160a01b031660009081526003602052604090205490565b3361110161113b565b6001600160a01b0316146111275760405162461bcd60e51b815260040161067c90615af3565b6111316000611af7565b565b611131611b49565b600a546001600160a01b031690565b60606001805461059190615d10565b6001600160a01b0382163314156111ae5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604482015260640161067c565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61122433836116fe565b6112405760405162461bcd60e51b815260040161067c90615b28565b61124c84848484611ceb565b50505050565b3361125b61113b565b6001600160a01b0316146112815760405162461bcd60e51b815260040161067c90615af3565b600061128c60085490565b9050600e54811061129c57600080fd5b333b156112a857600080fd5b806112b581336000611d1e565b6000828152600d6020908152604090912082516112d893919291909101906125e2565b506001600c600d60008481526020019081526020016000206040516112fd9190615748565b908152604051908190036020019020805491151560ff199092169190911790556108ba61dead82611ef7565b60606113348261156e565b61133d57600080fd5b6000611348836104b3565b9050600060405180610100016040528060db8152602001615e1f60db913990506113be611374856115f9565b826021611380886115f9565b602061138b8a6115f9565b61139489610e70565b6040516020016113aa979695949392919061591f565b604051602081830303815290604052612036565b60405160200161105991906158da565b336113d761113b565b6001600160a01b0316146113fd5760405162461bcd60e51b815260040161067c90615af3565b80516108ba90601e9060208401906125e2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3361144761113b565b6001600160a01b03161461146d5760405162461bcd60e51b815260040161067c90615af3565b6001600160a01b0381166114d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067c565b61081681611af7565b336114e461113b565b6001600160a01b03161461150a5760405162461bcd60e51b815260040161067c90615af3565b6010805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b148061154f57506001600160e01b03198216635b5e139f60e01b145b8061057c57506301ffc9a760e01b6001600160e01b031983161461057c565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115c082610df9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60608161161d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611647578061163181615d4b565b91506116409050600a83615c4e565b9150611621565b6000816001600160401b0381111561166157611661615df2565b6040519080825280601f01601f19166020018201604052801561168b576020820181803683370190505b5090505b84156116f6576116a0600183615caa565b91506116ad600a86615d86565b6116b8906030615c11565b60f81b8183815181106116cd576116cd615ddc565b60200101906001600160f81b031916908160001a9053506116ef600a86615c4e565b945061168f565b949350505050565b60006117098261156e565b61176a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161067c565b600061177583610df9565b9050806001600160a01b0316846001600160a01b031614806117b05750836001600160a01b03166117a584610614565b6001600160a01b0316145b806116f657506116f68185611410565b826001600160a01b03166117d382610df9565b6001600160a01b03161461183b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161067c565b6001600160a01b03821661189d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161067c565b6118a883838361219d565b6118b360008261158b565b6001600160a01b03831660009081526003602052604081208054600192906118dc908490615caa565b90915550506001600160a01b038216600090815260036020526040812080546001929061190a908490615c11565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606083600061197a8585615caa565b6001600160401b0381111561199157611991615df2565b6040519080825280601f01601f1916602001820160405280156119bb576020820181803683370190505b509050845b84811015611a2d578281815181106119da576119da615ddc565b01602001516001600160f81b031916826119f48884615caa565b81518110611a0457611a04615ddc565b60200101906001600160f81b031916908160001a90535080611a2581615d4b565b9150506119c0565b509150505b9392505050565b60008181805b82518160ff161015611aef576030838260ff1681518110611a6257611a62615ddc565b016020015160f81c10801590611a9557506039838260ff1681518110611a8a57611a8a615ddc565b016020015160f81c11155b15611add57611aa5600a83615c81565b91506030838260ff1681518110611abe57611abe615ddc565b0160200151611ad0919060f81c615cc1565b611ada9083615c29565b91505b80611ae781615d66565b915050611a3f565b509392505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60105460ff16151560011480611b775750611b6261113b565b6001600160a01b0316336001600160a01b0316145b611bba5760405162461bcd60e51b815260206004820152601460248201527326b4b73a34b7339034b9903737ba103634bb329760611b604482015260640161067c565b611bc333610d01565b611c1f5760405162461bcd60e51b815260206004820152602760248201527f4d7573742062652077686974656c697374656420616e642063616e206f6e6c79604482015266206d696e74203160c81b606482015260840161067c565b6000611c2a60085490565b9050600e548110611c3a57600080fd5b6011544310611c4857600080fd5b333b15611c5457600080fd5b336000818152601c60205260408120805460ff191690558291611c7991839190611d1e565b6000828152600d602090815260409091208251611c9c93919291909101906125e2565b506001600c600d6000848152602001908152602001600020604051611cc19190615748565b908152604051908190036020019020805491151560ff199092169190911790556108ba3382611ef7565b611cf68484846117c0565b611d0284848484612255565b61124c5760405162461bcd60e51b815260040161067c90615aa1565b6060600b8210611d2d57600080fd5b604080516020810190915260008082525b600a8160ff161015611eb157600f8054906000611d5a83615d4b565b9091555050600f54604080514260208201524491810191909152606080820189905287901b6bffffffffffffffffffffffff191660808201526094810186905260b48101919091526000906127109060d4016040516020818303038152906040528051906020012060001c611dcf9190615d86565b905060ff8216611e61576000611de98261ffff1684612362565b905060098160ff161115611e2b5783611e048260ff166115f9565b604051602001611e15929190612c67565b6040516020818303038152906040529350611e5b565b83611e388260ff166115f9565b604051602001611e49929190612c96565b60405160208183030381529060405293505b50611e9e565b82611e7b611e738361ffff1685612362565b60ff166115f9565b604051602001611e8c929190612c67565b60405160208183030381529060405292505b5080611ea981615d66565b915050611d3e565b50600c81604051611ec29190612c4b565b9081526040519081900360200190205460ff16156116f657611eef8585611eea866001615c11565b611d1e565b915050611a32565b6001600160a01b038216611f4d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161067c565b611f568161156e565b15611fa35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161067c565b611faf6000838361219d565b6001600160a01b0382166000908152600360205260408120805460019290611fd8908490615c11565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081516000141561205657505060408051602081019091526000815290565b6000604051806060016040528060408152602001615efa60409139905060006003845160026120859190615c11565b61208f9190615c4e565b61209a906004615c62565b905060006120a9826020615c11565b6001600160401b038111156120c0576120c0615df2565b6040519080825280601f01601f1916602001820160405280156120ea576020820181803683370190505b509050818152600183018586518101602084015b818310156121585760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b938201939093526004016120fe565b60038951066001811461217257600281146121835761218f565b613d3d60f01b60011983015261218f565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b0383166121f8576121f381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61221b565b816001600160a01b0316836001600160a01b03161461221b5761221b8382612431565b6001600160a01b038216612232576107ad816124ce565b826001600160a01b0316826001600160a01b0316146107ad576107ad828261257d565b60006001600160a01b0384163b1561235757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612299903390899088908890600401615a23565b602060405180830381600087803b1580156122b357600080fd5b505af19250505080156122e3575060408051601f3d908101601f191682019092526122e09181019061299e565b60015b61233d573d808015612311576040519150601f19603f3d011682016040523d82523d6000602084013e612316565b606091505b5080516123355760405162461bcd60e51b815260040161067c90615aa1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116f6565b506001949350505050565b600080805b60128460ff16600a811061237d5761237d615ddc565b015460ff8216101561242b57600060128560ff16600a81106123a1576123a1615ddc565b018260ff16815481106123b6576123b6615ddc565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff1686101580156123fc57506123f58184615bf4565b61ffff1686105b1561240b5750915061057c9050565b6124158184615bf4565b925050808061242390615d66565b915050612367565b50600080fd5b6000600161243e84611071565b6124489190615caa565b60008381526007602052604090205490915080821461249b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906124e090600190615caa565b6000838152600960205260408120546008805493945090928490811061250857612508615ddc565b90600052602060002001549050806008838154811061252957612529615ddc565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061256157612561615dc6565b6001900381819060005260206000200160009055905550505050565b600061258883611071565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b50805460008255600202906000526020600020908101906108169190612666565b8280546125ee90615d10565b90600052602060002090601f0160209004810192826126105760008555612656565b82601f1061262957805160ff1916838001178555612656565b82800160010185558215612656579182015b8281111561265657825182559160200191906001019061263b565b50612662929150612691565b5090565b8082111561266257600061267a82826126a6565b6126886001830160006126a6565b50600201612666565b5b808211156126625760008155600101612692565b5080546126b290615d10565b6000825580601f106126c2575050565b601f0160209004906000526020600020908101906108169190612691565b60006001600160401b038311156126f9576126f9615df2565b61270c601f8401601f1916602001615ba1565b905082815283838301111561272057600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461274e57600080fd5b919050565b600082601f83011261276457600080fd5b611a32838335602085016126e0565b60006020828403121561278557600080fd5b611a3282612737565b600080604083850312156127a157600080fd5b6127aa83612737565b91506127b860208401612737565b90509250929050565b6000806000606084860312156127d657600080fd5b6127df84612737565b92506127ed60208501612737565b9150604084013590509250925092565b6000806000806080858703121561281357600080fd5b61281c85612737565b935061282a60208601612737565b92506040850135915060608501356001600160401b0381111561284c57600080fd5b8501601f8101871361285d57600080fd5b61286c878235602084016126e0565b91505092959194509250565b6000806040838503121561288b57600080fd5b61289483612737565b9150602083013580151581146128a957600080fd5b809150509250929050565b600080604083850312156128c757600080fd5b6128d083612737565b946020939093013593505050565b600060208083850312156128f157600080fd5b82356001600160401b0381111561290757600080fd5b8301601f8101851361291857600080fd5b803561292b61292682615bd1565b615ba1565b80828252848201915084840188868560051b870101111561294b57600080fd5b600094505b838510156129755761296181612737565b835260019490940193918501918501612950565b50979650505050505050565b60006020828403121561299357600080fd5b8135611a3281615e08565b6000602082840312156129b057600080fd5b8151611a3281615e08565b6000602082840312156129cd57600080fd5b81356001600160401b038111156129e357600080fd5b6116f684828501612753565b60008060408385031215612a0257600080fd5b82356001600160401b03811115612a1857600080fd5b612a2485828601612753565b95602094909401359450505050565b600060208284031215612a4557600080fd5b5035919050565b60008060408385031215612a5f57600080fd5b823591506020808401356001600160401b0380821115612a7e57600080fd5b818601915086601f830112612a9257600080fd5b8135612aa061292682615bd1565b8082825285820191508585018a878560051b8801011115612ac057600080fd5b60005b84811015612b5257813586811115612ada57600080fd5b87016040818e03601f19011215612af057600080fd5b612af8615b79565b8982013588811115612b0957600080fd5b612b178f8c83860101612753565b825250604082013588811115612b2c57600080fd5b612b3a8f8c83860101612753565b828c0152508552509287019290870190600101612ac3565b50979a909950975050505050505050565b60008060408385031215612b7657600080fd5b50508035926020909101359150565b60008151808452612b9d816020860160208601615ce4565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612bcb57607f831692505b6020808410821415612bed57634e487b7160e01b600052602260045260246000fd5b818015612c015760018114612c1257612c3f565b60ff19861689528489019650612c3f565b60008881526020902060005b86811015612c375781548b820152908501908301612c1e565b505084890196505b50505050505092915050565b60008251612c5d818460208701615ce4565b9190910192915050565b60008351612c79818460208801615ce4565b835190830190612c8d818360208801615ce4565b01949350505050565b60008351612ca8818460208801615ce4565b600360fc1b9083019081528351612cc6816001840160208801615ce4565b01600101949350505050565b60008251612ce4818460208701615ce4565b600b60fa1b920191825250600101919050565b60008251612d09818460208701615ce4565b7f25323225334266756e6374696f6e2532307364667364253238742532392537429201918252507f72657475726e25323066756e6374696f6e25323825323925374276617225323060208201527f65253344742532422533443138333135363538313325334272657475726e253260408201527f30652533444d6174682e696d756c25323865253545652533452533452533453160608201527f352532433125374365253239253243253238253238253238652535452533446560808201527f2532424d6174682e696d756c253238652535456525334525334525334537253260a08201527f433631253743652532392532392535456525334525334525334531342532392560c08201527f334525334525334530253239253246343239343936373239362537442537446660e08201527f756e6374696f6e253230777261772532387425323925374276617225323065256101008201527f324372253344253542253544253342666f7225323865253344302533426525336101208201527f43742e6c656e67746825334265253242253242253239722535426525354425336101408201527f4474253542652535442e773125324225323872253542652d31253544253743256101608201527f3743302532392533427661722532306925334472616e642532382532392532416101808201527f72253542722e6c656e6774682d31253544253342666f722532386525334430256101a08201527f334265253343722e6c656e6774682532362532362532312532387225354265256101c08201527f3544253345692532392533426525324225324225323925334272657475726e256101e08201527f3230742535426525354425374466756e6374696f6e25323077726e64253238746102008201527f25323925374272657475726e25323077726177253238742532392e61312537446102208201527f66756e6374696f6e2532306752492532387425323925374272657475726e25326102408201527f304d6174682e666c6f6f7225323872616e6425323825323925324174253239256102608201527f374466756e6374696f6e253230747261697452617725323874253243652532396102808201527f25374272657475726e25323065253345253344742e6c656e67746825334674256102a08201527f3542742e6c656e6774682d31253544253341742535426525354425374466756e6102c08201527f6374696f6e2532307472616974253238742532436525323925374272657475726102e08201527f6e253230747261697452617725323874253243652532392e61312537447661726103008201527f253230636f6c6f727325324362676325324363253243646964537461727425326103208201527f43696d6725324377642532436865692532437365656425324372616e642532436103408201527f747a30253243747a31253243747a32253243747a33253243747a34253243747a6103608201527f35253243747a36253243747a37253243747a38253243747a39253243747a31306103808201527f253243626f726465722532436e756d2532436c6e54686b2532437078537a25326103a08201527f436e7353636c2532436e735374722532436c4f722532436e6e556e69532532436103c08201527f697353556e6925324373706565642532437a7a25324370746b7325324372756e6103e08201527f436f756e7425324363616e7661732532436f6c6457642532436f6c64486569256104008201527f334266756e6374696f6e25323068617368546f547261697473253238742532396104208201527f25374274253236253236253238747a30253344742e63686172417425323830256104408201527f3239253243747a31253344742e63686172417425323831253239253243747a326104608201527f253344742e63686172417425323832253239253243747a33253344742e6368616104808201527f72417425323833253239253243747a34253344742e63686172417425323834256104a08201527f3239253243747a35253344742e63686172417425323835253239253243747a366104c08201527f253344742e63686172417425323836253239253243747a37253344742e6368616104e08201527f72417425323837253239253243747a38253344742e63686172417425323838256105008201527f3239253243747a39253344742e63686172417425323839253239253243747a316105208201527f30253344742e6368617241742532383130253239253243747a312533444e756d6105408201527f626572253238747a302e746f537472696e67253238253239253242747a312e746105608201527f6f537472696e6725323825323925323925323925374466756e6374696f6e25326105808201527f30736574757025323825323925374273656564253344746f6b656e49642532436105a08201527f747a3025334430253243747a3125334437253243747a3225334437253243747a6105c08201527f3325334437253243747a3425334437253243747a3525334437253243747a36256105e08201527f334437253243747a3725334437253243747a3825334437253243747a392533446106008201527f37253243747a313025334437253243747a312533444e756d626572253238747a6106208201527f302e746f537472696e67253238253239253242747a312e746f537472696e67256106408201527f323825323925323925324368617368546f5472616974732532386861736825326106608201527f3925324372616e64253344736466736425323873656564253239253243626f726106808201527f64657225334430253344253344747a322533463230253341302533426e756d256106a08201527f33447472616974253238253542253742613125334131653325324377312533416106c08201527f31302537442532432537426131253341353030253243773125334131302537446106e08201527f25324325374261312533413235302532437731253341313025374425324325376107008201527f42613125334131303025324377312533413730253744253544253243747a33256107208201527f32392533426c6e54686b253344747261697425323825354225374261312533416107408201527f34302532437731253341312537442532432537426131253341333025324377316107608201527f25334134253744253243253742613125334131302532437731253341352537446107808201527f25324325374261312533413230253243773125334139302537442535442532436107a08201527f747a342532392532437078537a25334430253344253344747a352533463230256107c08201527f334131302533426e7353636c25334474726169742532382535422537426131256107e08201527f33413165342532437731253341312537442532432537426131253341323530256108008201527f32437731253341342537442532432537426131253341353025324377312533416108208201527f35253744253243253742613125334135303025324377312533413930253744256108408201527f3544253243747a362532392533426e73537472253344747261697425323825356108608201527f42253742613125334131302532437731253341312537442532432537426131256108808201527f33413525324377312533413425374425324325374261312533413225324377316108a08201527f25334135253744253243253742613125334131253243773125334139302537446108c08201527f253544253243747a372532392532436c4f7225334430253344253344747a38256108e08201527f33462d31253341312532436e6e556e695325334466756e6374696f6e253238256109008201527f323925374272657475726e2532306c4f722532412532383325324267524925326109208201527f38332532392532392537442532437370656564253344253238697353556e69256109408201527f334431253344253344747a3925323925334631302532416c4f722533416e6e556109608201527f6e69532532382532392533427a7a2533447472616974253238253542253742616109808201527f31253341302532437731253341352537442532432537426131253341323530256109a08201527f32437731253341352537442532432537426131253341333030253243773125336109c08201527f41313025374425324325374261312533413430302532437731253341313025376109e08201527f4425324325374261312533413530302532437731253341373025374425354425610a008201527f3243747a313025323925324370746b732533442535426e756d25354425324372610a208201527f756e436f756e742533443025324377642533444d6174682e6d696e2532383830610a408201527f3025324377696e646f7757696474682532392532436865692533444d6174682e610a608201527f6d696e25323839363025324377696e646f774865696768742532392532437764610a808201527f2533444d6174682e6365696c25323877642532467078537a2532392532417078610aa08201527f537a2532436865692533444d6174682e6365696c253238686569253246707853610ac08201527f7a2532392532417078537a253243646964537461727425334425323131253243610ae08201527f6e6f697365536565642532387365656425323925334276617225323074253344610b008201527f7472616974526177253238253542253742613125334125354225323863253344610b208201527f636f6c6f72253239253238253232253233666661346435253232253239253243610b408201527f6325323825323225323338336666633125323225323925324363253238253232610b608201527f2532336666653738302532322532392532436325323825323225323339396532610b808201527f66662532322532392535442532436267436f6c6f722533416325323825323225610ba08201527f3233666666666666253232253239253243773125334131253744253243253742610bc08201527f6131253341253542632532382532322532336666666666662532322532392532610be08201527f4363253238253232253233303030303030253232253239253544253243773125610c008201527f3341312537442532432537426131253341253542632532382532322532333330610c208201527f3565393025323225323925324363253238253232253233646234653534253232610c408201527f2532392532436325323825323225323334663363326425323225323925324363610c608201527f2532382532322532336666626231322532322532392532436325323825323225610c808201527f3233333839383934253232253239253243632532382532322532336530643863610ca08201527f3525323225323925324363253238253232253233633765336434253232253239610cc08201527f2535442532437731253341312532436267436f6c6f7225334163253238253232610ce08201527f2532336666666666662532322532392537442532432537426131253341253542610d008201527f6325323825323225323330383237663525323225323925324363253238253232610d208201527f2532333337353166372532322532392532436325323825323225323338343933610d408201527f6661253232253239253544253243773125334131253744253243253742613125610d608201527f3341253542632532382532322532333030633166662532322532392532436325610d808201527f3238253232253233303032336666253232253239253243632532382532322532610da08201527f3337323135666625323225323925324363253238253232253233666630336663610dc08201527f2532322532392532436325323825323225323366663030306125323225323925610de08201527f3243632532382532322532336666383730302532322532392532436325323825610e008201527f3232253233666666373030253232253239253243632532382532322532333566610e208201527f6666303025323225323925324363253238253232253233303066663265253232610e408201527f2532392535442532437731253341312532436267436f6c6f7225334163253238610e608201527f2532322532336666666666662532322532392537442532432537426131253341610e808201527f2535426325323825323225323330306530303025323225323925324363253238610ea08201527f2532322532333030353930302532322532392532436325323825323225323330610ec08201527f3030303030253232253239253544253243773125334135253744253243253742610ee08201527f6131253341253542632532382532322532333964303230382532322532392532610f008201527f4363253238253232253233643030303030253232253239253243632532382532610f208201527f3225323365383564303425323225323925324363253238253232253233666161610f408201527f3330372532322532392535442532437731253341352537442532432537426131610f608201527f2533412535426325323825323225323366666636396625323225323925324363610f808201527f2532382532322532336664643837302532322532392532436325323825323225610fa08201527f3233643039303266253232253239253243632532382532322532336131353530610fc08201527f3125323225323925324363253238253232253233333531343039253232253239610fe08201527f25354425324377312533413525374425324325374261312533412535426325326110008201527f38253232253233613066666533253232253239253243632532382532322532336110208201527f36356463393825323225323925324363253238253232253233386438393830256110408201527f32322532392532436325323825323225323335373532363725323225323925326110608201527f43632532382532322532333232323033352532322532392535442532437731256110808201527f33413525374425324325374261312533412535426325323825323225323330306110a08201527f39396666253232253239253243632532382532322532333536353564642532326110c08201527f25323925324363253238253232253233383832326666253232253239253243636110e08201527f25323825323225323361613939666625323225323925354425324377312533416111008201527f35253744253243253742613125334125354263253238253232253233373730306111208201527f61362532322532392532436325323825323225323366653030666525323225326111408201527f39253243632532382532322532336465666534372532322532392532436325326111608201527f38253232253233303062336665253232253239253243632532382532322532336111808201527f30303136656525323225323925354425324377312533413525374425324325376111a08201527f42613125334125354263253238253232253233633466666666253232253239256111c08201527f32436325323825323225323330386465656125323225323925324363253238256111e08201527f32322532333132363164312532322532392535442532437731253341313025376112008201527f44253243253742613125334125354263253238253232253233666631323466256112208201527f32322532392532436325323825323225323366663030613025323225323925326112408201527f43632532382532322532336665373566652532322532392532436325323825326112608201527f32253233376130346562253232253239253243632532382532322532333132306112808201527f34353825323225323925354425324377312533413130253744253243253742616112a08201527f31253341253542632532382532322532333131313131312532322532392532436112c08201527f63253238253232253233323232323232253232253239253243632532382532326112e08201527f25323333333333333325323225323925324363253238253232253233343434346113008201527f34342532322532392532436325323825323225323336363636363625323225326113208201527f39253544253243773125334131302537442532432537426131253341253542636113408201527f25323825323225323366383837666625323225323925324363253238253232256113608201527f32336465303034652532322532392532436325323825323225323338363030326113808201527f39253232253239253243632532382532322532333332313435302532322532396113a08201527f25324363253238253232253233323931333265253232253239253544253243776113c08201527f31253341313525374425324325374261312533412535426325323825323225326113e08201527f33383338366635253232253239253243632532382532322532333364343362346114008201527f25323225323925324363253238253232253233303431333438253232253239256114208201527f32436325323825323225323330383365313225323225323925324363253238256114408201527f32322532333161666534392532322532392535442532437731253341323025376114608201527f44253544253243747a31253239253342636f6c6f7273253344742e61312532436114808201527f62676325334463253238253232253233303030303030253232253239253243746114a08201527f2e6267436f6c6f72253236253236253238626763253344742e6267436f6c6f726114c08201527f25323925324325323863616e76617325334463726561746543616e76617325326114e08201527f3877642532436865692532392532392e646f75626c65436c69636b65642532386115008201527f746f67676c6546756c6c73637265656e2532392532436e6f5374726f6b6525326115208201527f38253239253342666f722532386c65742532307425334430253342742533436e6115408201527f756d2533427425324225324225323925374276617225323065253344637265616115608201527f7465566563746f72253238626f72646572253242675249253238312e322532416115808201527f25323877696474682d32253241626f72646572253239253239253243626f72646115a08201527f65722532426752492532386865696768742d32253241626f72646572253239256115c08201527f32433225323925324372253344637265617465566563746f72253238636f73256115e08201527f32383025323925324373696e25323830253239253239253342737065656425336116008201527f44697353556e6925334673706565642533416e6e556e695325323825323925326116208201527f4370746b73253542742535442533446e657725323050746b25323865253243726116408201527f25324373706565642532392537446672616d65526174652532383130253239256116608201527f374466756e6374696f6e25323072656d616b65253238742532436525323925376116808201527f42742533444d6174682e6365696c253238742532467078537a253239253241706116a08201527f78537a253243652533444d6174682e6365696c253238652532467078537a25326116c08201527f392532417078537a2532437764253344742532436865692533446525324377696116e08201527f6474682533447425324368656967687425334465253243253238696d672533446117008201527f637265617465496d6167652532384d6174682e666c6f6f7225323877642532466117208201527f7078537a2532392532434d6174682e666c6f6f722532386865692532467078536117408201527f7a2532392532392532392e6c6f6164506978656c7325323825323925324372656117608201527f73697a6543616e7661732532387425324365253239253342666f722532386c656117808201527f742532307425334430253342742533437a7a25334274253242253242253239256117a08201527f3742666f722532386c657425323074253344302533427425334370746b732e6c6117c08201527f656e6774682533427425324225324225323970746b73253542742535442e72756117e08201527f6e25323825323925334272756e436f756e7425324225324225374425374466756118008201527f6e6374696f6e253230746f67676c6546756c6c73637265656e253238253239256118208201527f37426c657425323074253344646f63756d656e742e717565727953656c6563746118408201527f6f7225323825323263616e766173253232253239253342646f63756d656e742e6118608201527f66756c6c73637265656e456c656d656e74253346646f63756d656e742e6578696118808201527f7446756c6c73637265656e2532382532392533412532386f6c645764253344776118a08201527f642532436f6c6448656925334468656925324372656d616b65253238383030256118c08201527f3243393630253239253243742e7265717565737446756c6c73637265656e25326118e08201527f382532392e636174636825323874253344253345253742616c657274253238256119008201527f36304572726f72253341253230253234253742742e6d657373616765253744256119208201527f3230253238253234253742742e6e616d652537442532392536302532392537446119408201527f25323925323925374466756e6374696f6e2532306b65795072657373656425326119608201527f3825323925374272657475726e25323037302533442533442533446b6579436f6119808201527f646525334625323872656d616b652532383135303025324335303025323925326119a08201527f432532313125323925334138382533442533442533446b6579436f64652533466119c08201527f25323872656d616b6525323870726f6d7074253238253232456e7465722532306119e08201527f7769647468253230696e253230706978656c7325323225324325323235303025611a008201527f323225323925324370726f6d7074253238253232486569676874253346253232611a208201527f2532432532323530302532322532392532392532432532313125323925334137611a408201527f392533442533442533446b6579436f6465253346253238746f67676c6546756c611a608201527f6c73637265656e25323825323925324325323131253239253341766f69642532611a808201527f303025374466756e6374696f6e25323064726177253238253239253742696625611aa08201527f32382532316469645374617274253239253742666f722532386c657425323074611ac08201527f25334430253342742533437a7a25334274253242253242253239253742666f72611ae08201527f2532386c657425323074253344302533427425334370746b732e6c656e677468611b008201527f2533427425324225324225323970746b73253542742535442e72756e25323825611b208201527f323925334272756e436f756e7425324225324225374464696453746172742533611b408201527f4425323130253744666f722532386c6574253230742533443025334274253343611b608201527f70746b732e6c656e6774682533427425324225324225323970746b7325354274611b808201527f2535442e72756e25323825323925334272756e436f756e742532422532422532611ba08201527f43253238696d67253344637265617465496d6167652532387764253246707853611bc08201527f7a2532436865692532467078537a2532392532392e6c6f6164506978656c7325611be08201527f3238253239253342666f72253238766172253230742533443025334274253343611c008201527f696d672e68656967687425334274253242253242253239666f72253238766172611c208201527f253230652533443025334265253343696d672e77696474682533426525324225611c408201527f32422532392537426c657425323072253344676574253238652532417078537a611c608201527f253243742532417078537a253239253243692533443425324125323865253242611c808201527f74253241696d672e7769647468253239253342696d672e706978656c73253542611ca08201527f6925354425334472656425323872253239253243696d672e706978656c732535611cc08201527f426925324231253544253344677265656e25323872253239253243696d672e70611ce08201527f6978656c732535426925324232253544253344626c7565253238722532392532611d008201527f43696d672e706978656c732535426925324233253544253344616c7068612532611d208201527f387225323925374466696c6c2532386267632532392532437265637425323830611d408201527f253243302532437769647468253243686569676874253239253243696d672e75611d608201527f7064617465506978656c732532382532392532436e6f536d6f6f746825323825611d808201527f3239253243696d616765253238696d6725324330253243302532437769647468611da08201527f25324368656967687425323925324366696c6c25323862676325323925324372611dc08201527f6563742532383025324330253243626f72646572253243686569676874253239611de08201527f2532437265637425323830253243302532437769647468253243626f72646572611e008201527f2532392532437265637425323877696474682d626f7264657225324330253243611e208201527f626f726465722532436865696768742532392532437265637425323830253243611e408201527f6865696768742d626f726465722532437769647468253243626f726465722532611e608201527f39253744636c61737325323050746b253742636f6e7374727563746f72253238611e808201527f742532436525324372253239253742746869732e6c6f63253344742532437468611ea08201527f69732e64697225334465253243746869732e7370656564253344722532437468611ec08201527f69732e63253344636f6c6f7273253542675249253238636f6c6f72732e6c656e611ee08201527f677468253239253544253243746869732e6c696e6553697a652533446c6e5468611f008201527f6b25374472756e253238253239253742746869732e6d6f766525323825323925611f208201527f3243746869732e636865636b4564676573253238253239253243746869732e75611f408201527f70646174652532382532392537446d6f76652532382532392537426c65742532611f608201527f30742533446e6f697365253238746869732e6c6f632e782532466e7353636c25611f808201527f3243746869732e6c6f632e792532466e7353636c25324372756e436f756e7425611fa08201527f32466e7353636c25323925324154574f5f50492532416e735374722533427468611fc08201527f69732e6469722e78253344636f7325323874253239253243746869732e646972611fe08201527f2e7925334473696e2532387425323925334276617225323065253344746869736120008201527f2e6469722e636f7079253238253239253342652e6d756c7425323831253241746120208201527f6869732e7370656564253239253243746869732e6c6f632e61646425323865256120408201527f3239253744636865636b4564676573253238253239253742253238746869732e6120608201527f6c6f632e78253343626f72646572253743253743746869732e6c6f632e7825336120808201527f4577696474682d626f72646572253743253743746869732e6c6f632e792533436120a08201527f626f72646572253743253743746869732e6c6f632e792533456865696768742d6120c08201527f626f72646572253239253236253236253238746869732e6c6f632e78253344626120e08201527f6f7264657225324267524925323877696474682d32253241626f7264657225326121008201527f39253243746869732e6c6f632e79253344626f726465722532426752492532386121208201527f6865696768742d32253241626f726465722532392532392537447570646174656121408201527f25323825323925374266696c6c253238746869732e63253239253243656c6c696121608201527f707365253238746869732e6c6f632e78253243746869732e6c6f632e792532436121808201527f746869732e6c696e6553697a65253243746869732e6c696e6553697a652532396121a08201527f253744253744253343253246736372697074253345253343253246626f6479256121c08201526e334525334325324668746d6c25334560881b6121e08201526121ef01919050565b6000845161567f818460208901615ce4565b6e3d913a3930b4ba2fba3cb832911d1160891b9083019081526156a5600f820186612bb1565b6a1116113b30b63ab2911d1160a91b815290506156c5600b820185612bb1565b62089f4b60ea1b81526003019695505050505050565b600084516156ed818460208901615ce4565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152615713600f820186612bb1565b6a1116113b30b63ab2911d1160a91b81529050615733600b820185612bb1565b61227d60f01b81526002019695505050505050565b6000611a328284612bb1565b7f646174613a746578742f68746d6c2c25334368746d6c253345253343686561648152771299a29299a1b9b1b934b83a12991839b9319299a212991960411b602082015260006157a76038830187612bb1565b7412991912991834b73a32b3b934ba3c9299a212991960591b81526157cf6015820187612bb1565b90507f25323225323063726f73736f726967696e253344253232616e6f6e796d6f757381527f253232253345253343253246736372697074253345253343253246686561642560208201527f3345253343626f6479253345253343736372697074253345766172253230746f6040820152671ad95b9259094cd160c21b60608201528451615864816068840160208901615ce4565b721299a13b30b91299183430b9b41299a212991960691b60689290910191820152835161589881607b840160208801615ce4565b01607b019695505050505050565b605b60f81b8152600082516158c2816001850160208701615ce4565b605d60f81b6001939091019283015250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161591281601d850160208701615ce4565b91909101601d0192915050565b747b226e616d65223a202246696c616d656e7473202360581b81528751600090615950816015850160208d01615ce4565b885190830190615967816015840160208d01615ce4565b711130b734b6b0ba34b7b72fbab936111d101160711b601592909101918201526159946027820189612bb1565b905086516159a6818360208b01615ce4565b6a11161134b6b0b3b2911d1160a91b91019081526159c7600b820187612bb1565b905084516159d9818360208901615ce4565b6e11161130ba3a3934b13aba32b9911d60891b91019081528351615a0481600f840160208801615ce4565b607d60f81b600f92909101918201526010019998505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a5690830184612b85565b9695505050505050565b602081526000611a326020830184612b85565b604081526000615a866040830185612b85565b8281036020840152615a988185612b85565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604080519081016001600160401b0381118282101715615b9b57615b9b615df2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615bc957615bc9615df2565b604052919050565b60006001600160401b03821115615bea57615bea615df2565b5060051b60200190565b600061ffff808316818516808303821115612c8d57612c8d615d9a565b60008219821115615c2457615c24615d9a565b500190565b600060ff821660ff84168060ff03821115615c4657615c46615d9a565b019392505050565b600082615c5d57615c5d615db0565b500490565b6000816000190483118215151615615c7c57615c7c615d9a565b500290565b600060ff821660ff84168160ff0481118215151615615ca257615ca2615d9a565b029392505050565b600082821015615cbc57615cbc615d9a565b500390565b600060ff821660ff841680821015615cdb57615cdb615d9a565b90039392505050565b60005b83811015615cff578181015183820152602001615ce7565b8381111561124c5750506000910152565b600181811c90821680615d2457607f821691505b60208210811415615d4557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615d5f57615d5f615d9a565b5060010190565b600060ff821660ff811415615d7d57615d7d615d9a565b60010192915050565b600082615d9557615d95615db0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461081657600080fdfe222c20226465736372697074696f6e223a202246696c616d656e7473206973206120636f6c6c656374696f6e206f662035303020756e6971756520706965636573206f662067656e6572617469766520706978656c206172742e204d6574616461746120616e6420617274206973206d6972726f726564207065726d616e656e746c79206f6e2d636861696e2e20446f75626c6520636c69636b20746f2066756c6c2073637265656e2e2050726573732046207468656e2072696768742d636c69636b20616e64207361766520617320612062616e6e65722e222c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202cfd55917b30d6263d3aba6ed166bd47a0c7e4df134f2773305bd986ba893bf664736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f15760003560e01c80634f6ccce71161011057806395d89b41116100a857806395d89b41146104065780639b19251a1461040e578063a22cb46514610431578063b88d4fde14610444578063c876b24014610457578063c87b56dd1461045f578063d9d2628314610472578063e985e9c514610485578063f2fde38b14610498578063f3c81d2a146104ab57600080fd5b80634f6ccce71461038c57806354dacb961461039f5780636352211e146103a857806366e33870146103bb57806370a08231146103ce578063715018a6146103e157806372f90ac1146103e95780637fbb691a146103f65780638da5cb5b146103fe57600080fd5b806323b872dd1161018e57806323b872dd146102ca57806326b51c8c146102dd57806328e56c5e146102e65780632abff1f2146102f95780632f745c591461030c5780632fb098d21461031f578063349d27481461034057806339ee0661146103535780633af32abf1461036657806342842e0e1461037957600080fd5b80625ea307146101f657806301ffc9a71461021f57806306fdde0314610242578063081812fc1461024a578063095ea7b314610275578063098afd4b1461028a5780630a3d4cc41461029257806313fb44bf146102a557806318160ddd146102b8575b600080fd5b610209610204366004612a33565b6104b3565b6040516102169190615a60565b60405180910390f35b61023261022d366004612981565b610557565b6040519015158152602001610216565b610209610582565b61025d610258366004612a33565b610614565b6040516001600160a01b039091168152602001610216565b6102886102833660046128b4565b6106a1565b005b6102886107b2565b6102096102a03660046129ef565b610819565b6102886102b33660046129bb565b610878565b6008545b604051908152602001610216565b6102886102d83660046127c1565b6108be565b6102bc60115481565b6102886102f43660046129bb565b6108ef565b6102886103073660046129bb565b610931565b6102bc61031a3660046128b4565b610972565b61033261032d366004612b63565b610a08565b604051610216929190615a73565b61028861034e366004612a4c565b610b59565b6102886103613660046128de565b610c53565b610232610374366004612773565b610d01565b6102886103873660046127c1565b610d4b565b6102bc61039a366004612a33565b610d66565b6102bc601d5481565b61025d6103b6366004612a33565b610df9565b6102096103c93660046129bb565b610e70565b6102bc6103dc366004612773565b611071565b6102886110f8565b6010546102329060ff1681565b610288611133565b61025d61113b565b61020961114a565b61023261041c366004612773565b601c6020526000908152604090205460ff1681565b61028861043f366004612878565b611159565b6102886104523660046127fd565b61121a565b610288611252565b61020961046d366004612a33565b611329565b6102886104803660046129bb565b6113ce565b61023261049336600461278e565b611410565b6102886104a6366004612773565b61143e565b6102886114db565b6000818152600d60205260408120805460609291906104d190615d10565b80601f01602080910402602001604051908101604052809291908181526020018280546104fd90615d10565b801561054a5780601f1061051f5761010080835404028352916020019161054a565b820191906000526020600020905b81548152906001019060200180831161052d57829003601f168201915b5093979650505050505050565b60006001600160e01b0319821663780e9d6360e01b148061057c575061057c8261151e565b92915050565b60606000805461059190615d10565b80601f01602080910402602001604051908101604052809291908181526020018280546105bd90615d10565b801561060a5780601f106105df5761010080835404028352916020019161060a565b820191906000526020600020905b8154815290600101906020018083116105ed57829003601f168201915b5050505050905090565b600061061f8261156e565b6106855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106ac82610df9565b9050806001600160a01b0316836001600160a01b0316141561071a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161067c565b336001600160a01b038216148061073657506107368133611410565b6107a35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606482015260840161067c565b6107ad838361158b565b505050565b336107bb61113b565b6001600160a01b0316146107e15760405162461bcd60e51b815260040161067c90615af3565b60005b600b811015610816576000818152600b60205260408120610804916125c1565b8061080e81615d4b565b9150506107e4565b50565b60606000601e601f61082a856115f9565b8660405160200161083e9493929190615754565b6040516020818303038152906040529050806040516020016108609190612cf7565b60408051808303601f19018152919052949350505050565b3361088161113b565b6001600160a01b0316146108a75760405162461bcd60e51b815260040161067c90615af3565b80516108ba90601f9060208401906125e2565b5050565b6108c833826116fe565b6108e45760405162461bcd60e51b815260040161067c90615b28565b6107ad8383836117c0565b336108f861113b565b6001600160a01b03161461091e5760405162461bcd60e51b815260040161067c90615af3565b80516108ba9060219060208401906125e2565b3361093a61113b565b6001600160a01b0316146109605760405162461bcd60e51b815260040161067c90615af3565b80516108ba90602090818401906125e2565b600061097d83611071565b82106109df5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161067c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b6020528160005260406000208181548110610a2457600080fd5b906000526020600020906002020160009150915050806000018054610a4890615d10565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7490615d10565b8015610ac15780601f10610a9657610100808354040283529160200191610ac1565b820191906000526020600020905b815481529060010190602001808311610aa457829003601f168201915b505050505090806001018054610ad690615d10565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0290615d10565b8015610b4f5780601f10610b2457610100808354040283529160200191610b4f565b820191906000526020600020905b815481529060010190602001808311610b3257829003601f168201915b5050505050905082565b33610b6261113b565b6001600160a01b031614610b885760405162461bcd60e51b815260040161067c90615af3565b60005b81518110156107ad57600b60008481526020019081526020016000206040518060400160405280848481518110610bc457610bc4615ddc565b6020026020010151600001518152602001848481518110610be757610be7615ddc565b602090810291909101810151810151909152825460018101845560009384529281902082518051939460020290910192610c2492849201906125e2565b506020828101518051610c3d92600185019201906125e2565b5050508080610c4b90615d4b565b915050610b8b565b33610c5c61113b565b6001600160a01b031614610c825760405162461bcd60e51b815260040161067c90615af3565b805160005b81811015610ce4576000838281518110610ca357610ca3615ddc565b6020908102919091018101516001600160a01b03166000908152601c90915260409020805460ff191660011790555080610cdc81615d4b565b915050610c87565b508151601d6000828254610cf89190615c11565b90915550505050565b6000610d0b61113b565b6001600160a01b0316826001600160a01b03161415610d2c57506001919050565b506001600160a01b03166000908152601c602052604090205460ff1690565b6107ad8383836040518060200160405280600081525061121a565b6000610d7160085490565b8210610dd45760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161067c565b60088281548110610de757610de7615ddc565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061057c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161067c565b6060806000610e8a610e85856000600261196b565b611a39565b60008052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f768054919250839160ff8416908110610ece57610ece615ddc565b9060005260206000209060020201600101600b60008081526020019081526020016000208360ff1681548110610f0657610f06615ddc565b9060005260206000209060020201600001604051602001610f299392919061566d565b60408051601f19818403018152919052915060025b600b8160ff161015611047576000610f6a610e858760ff8516610f62866001615c29565b60ff1661196b565b905083600b60008460ff1681526020019081526020016000208260ff1681548110610f9757610f97615ddc565b9060005260206000209060020201600101600b60008560ff1681526020019081526020016000208360ff1681548110610fd257610fd2615ddc565b9060005260206000209060020201600001604051602001610ff5939291906156db565b60405160208183030381529060405293508160ff16600a1461103457836040516020016110229190612cd2565b60405160208183030381529060405293505b508061103f81615d66565b915050610f3e565b508160405160200161105991906158a6565b60405160208183030381529060405292505050919050565b60006001600160a01b0382166110dc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161067c565b506001600160a01b031660009081526003602052604090205490565b3361110161113b565b6001600160a01b0316146111275760405162461bcd60e51b815260040161067c90615af3565b6111316000611af7565b565b611131611b49565b600a546001600160a01b031690565b60606001805461059190615d10565b6001600160a01b0382163314156111ae5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604482015260640161067c565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61122433836116fe565b6112405760405162461bcd60e51b815260040161067c90615b28565b61124c84848484611ceb565b50505050565b3361125b61113b565b6001600160a01b0316146112815760405162461bcd60e51b815260040161067c90615af3565b600061128c60085490565b9050600e54811061129c57600080fd5b333b156112a857600080fd5b806112b581336000611d1e565b6000828152600d6020908152604090912082516112d893919291909101906125e2565b506001600c600d60008481526020019081526020016000206040516112fd9190615748565b908152604051908190036020019020805491151560ff199092169190911790556108ba61dead82611ef7565b60606113348261156e565b61133d57600080fd5b6000611348836104b3565b9050600060405180610100016040528060db8152602001615e1f60db913990506113be611374856115f9565b826021611380886115f9565b602061138b8a6115f9565b61139489610e70565b6040516020016113aa979695949392919061591f565b604051602081830303815290604052612036565b60405160200161105991906158da565b336113d761113b565b6001600160a01b0316146113fd5760405162461bcd60e51b815260040161067c90615af3565b80516108ba90601e9060208401906125e2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3361144761113b565b6001600160a01b03161461146d5760405162461bcd60e51b815260040161067c90615af3565b6001600160a01b0381166114d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067c565b61081681611af7565b336114e461113b565b6001600160a01b03161461150a5760405162461bcd60e51b815260040161067c90615af3565b6010805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b148061154f57506001600160e01b03198216635b5e139f60e01b145b8061057c57506301ffc9a760e01b6001600160e01b031983161461057c565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115c082610df9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60608161161d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611647578061163181615d4b565b91506116409050600a83615c4e565b9150611621565b6000816001600160401b0381111561166157611661615df2565b6040519080825280601f01601f19166020018201604052801561168b576020820181803683370190505b5090505b84156116f6576116a0600183615caa565b91506116ad600a86615d86565b6116b8906030615c11565b60f81b8183815181106116cd576116cd615ddc565b60200101906001600160f81b031916908160001a9053506116ef600a86615c4e565b945061168f565b949350505050565b60006117098261156e565b61176a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161067c565b600061177583610df9565b9050806001600160a01b0316846001600160a01b031614806117b05750836001600160a01b03166117a584610614565b6001600160a01b0316145b806116f657506116f68185611410565b826001600160a01b03166117d382610df9565b6001600160a01b03161461183b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161067c565b6001600160a01b03821661189d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161067c565b6118a883838361219d565b6118b360008261158b565b6001600160a01b03831660009081526003602052604081208054600192906118dc908490615caa565b90915550506001600160a01b038216600090815260036020526040812080546001929061190a908490615c11565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606083600061197a8585615caa565b6001600160401b0381111561199157611991615df2565b6040519080825280601f01601f1916602001820160405280156119bb576020820181803683370190505b509050845b84811015611a2d578281815181106119da576119da615ddc565b01602001516001600160f81b031916826119f48884615caa565b81518110611a0457611a04615ddc565b60200101906001600160f81b031916908160001a90535080611a2581615d4b565b9150506119c0565b509150505b9392505050565b60008181805b82518160ff161015611aef576030838260ff1681518110611a6257611a62615ddc565b016020015160f81c10801590611a9557506039838260ff1681518110611a8a57611a8a615ddc565b016020015160f81c11155b15611add57611aa5600a83615c81565b91506030838260ff1681518110611abe57611abe615ddc565b0160200151611ad0919060f81c615cc1565b611ada9083615c29565b91505b80611ae781615d66565b915050611a3f565b509392505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60105460ff16151560011480611b775750611b6261113b565b6001600160a01b0316336001600160a01b0316145b611bba5760405162461bcd60e51b815260206004820152601460248201527326b4b73a34b7339034b9903737ba103634bb329760611b604482015260640161067c565b611bc333610d01565b611c1f5760405162461bcd60e51b815260206004820152602760248201527f4d7573742062652077686974656c697374656420616e642063616e206f6e6c79604482015266206d696e74203160c81b606482015260840161067c565b6000611c2a60085490565b9050600e548110611c3a57600080fd5b6011544310611c4857600080fd5b333b15611c5457600080fd5b336000818152601c60205260408120805460ff191690558291611c7991839190611d1e565b6000828152600d602090815260409091208251611c9c93919291909101906125e2565b506001600c600d6000848152602001908152602001600020604051611cc19190615748565b908152604051908190036020019020805491151560ff199092169190911790556108ba3382611ef7565b611cf68484846117c0565b611d0284848484612255565b61124c5760405162461bcd60e51b815260040161067c90615aa1565b6060600b8210611d2d57600080fd5b604080516020810190915260008082525b600a8160ff161015611eb157600f8054906000611d5a83615d4b565b9091555050600f54604080514260208201524491810191909152606080820189905287901b6bffffffffffffffffffffffff191660808201526094810186905260b48101919091526000906127109060d4016040516020818303038152906040528051906020012060001c611dcf9190615d86565b905060ff8216611e61576000611de98261ffff1684612362565b905060098160ff161115611e2b5783611e048260ff166115f9565b604051602001611e15929190612c67565b6040516020818303038152906040529350611e5b565b83611e388260ff166115f9565b604051602001611e49929190612c96565b60405160208183030381529060405293505b50611e9e565b82611e7b611e738361ffff1685612362565b60ff166115f9565b604051602001611e8c929190612c67565b60405160208183030381529060405292505b5080611ea981615d66565b915050611d3e565b50600c81604051611ec29190612c4b565b9081526040519081900360200190205460ff16156116f657611eef8585611eea866001615c11565b611d1e565b915050611a32565b6001600160a01b038216611f4d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161067c565b611f568161156e565b15611fa35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161067c565b611faf6000838361219d565b6001600160a01b0382166000908152600360205260408120805460019290611fd8908490615c11565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081516000141561205657505060408051602081019091526000815290565b6000604051806060016040528060408152602001615efa60409139905060006003845160026120859190615c11565b61208f9190615c4e565b61209a906004615c62565b905060006120a9826020615c11565b6001600160401b038111156120c0576120c0615df2565b6040519080825280601f01601f1916602001820160405280156120ea576020820181803683370190505b509050818152600183018586518101602084015b818310156121585760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b938201939093526004016120fe565b60038951066001811461217257600281146121835761218f565b613d3d60f01b60011983015261218f565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b0383166121f8576121f381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61221b565b816001600160a01b0316836001600160a01b03161461221b5761221b8382612431565b6001600160a01b038216612232576107ad816124ce565b826001600160a01b0316826001600160a01b0316146107ad576107ad828261257d565b60006001600160a01b0384163b1561235757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612299903390899088908890600401615a23565b602060405180830381600087803b1580156122b357600080fd5b505af19250505080156122e3575060408051601f3d908101601f191682019092526122e09181019061299e565b60015b61233d573d808015612311576040519150601f19603f3d011682016040523d82523d6000602084013e612316565b606091505b5080516123355760405162461bcd60e51b815260040161067c90615aa1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116f6565b506001949350505050565b600080805b60128460ff16600a811061237d5761237d615ddc565b015460ff8216101561242b57600060128560ff16600a81106123a1576123a1615ddc565b018260ff16815481106123b6576123b6615ddc565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff1686101580156123fc57506123f58184615bf4565b61ffff1686105b1561240b5750915061057c9050565b6124158184615bf4565b925050808061242390615d66565b915050612367565b50600080fd5b6000600161243e84611071565b6124489190615caa565b60008381526007602052604090205490915080821461249b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906124e090600190615caa565b6000838152600960205260408120546008805493945090928490811061250857612508615ddc565b90600052602060002001549050806008838154811061252957612529615ddc565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061256157612561615dc6565b6001900381819060005260206000200160009055905550505050565b600061258883611071565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b50805460008255600202906000526020600020908101906108169190612666565b8280546125ee90615d10565b90600052602060002090601f0160209004810192826126105760008555612656565b82601f1061262957805160ff1916838001178555612656565b82800160010185558215612656579182015b8281111561265657825182559160200191906001019061263b565b50612662929150612691565b5090565b8082111561266257600061267a82826126a6565b6126886001830160006126a6565b50600201612666565b5b808211156126625760008155600101612692565b5080546126b290615d10565b6000825580601f106126c2575050565b601f0160209004906000526020600020908101906108169190612691565b60006001600160401b038311156126f9576126f9615df2565b61270c601f8401601f1916602001615ba1565b905082815283838301111561272057600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461274e57600080fd5b919050565b600082601f83011261276457600080fd5b611a32838335602085016126e0565b60006020828403121561278557600080fd5b611a3282612737565b600080604083850312156127a157600080fd5b6127aa83612737565b91506127b860208401612737565b90509250929050565b6000806000606084860312156127d657600080fd5b6127df84612737565b92506127ed60208501612737565b9150604084013590509250925092565b6000806000806080858703121561281357600080fd5b61281c85612737565b935061282a60208601612737565b92506040850135915060608501356001600160401b0381111561284c57600080fd5b8501601f8101871361285d57600080fd5b61286c878235602084016126e0565b91505092959194509250565b6000806040838503121561288b57600080fd5b61289483612737565b9150602083013580151581146128a957600080fd5b809150509250929050565b600080604083850312156128c757600080fd5b6128d083612737565b946020939093013593505050565b600060208083850312156128f157600080fd5b82356001600160401b0381111561290757600080fd5b8301601f8101851361291857600080fd5b803561292b61292682615bd1565b615ba1565b80828252848201915084840188868560051b870101111561294b57600080fd5b600094505b838510156129755761296181612737565b835260019490940193918501918501612950565b50979650505050505050565b60006020828403121561299357600080fd5b8135611a3281615e08565b6000602082840312156129b057600080fd5b8151611a3281615e08565b6000602082840312156129cd57600080fd5b81356001600160401b038111156129e357600080fd5b6116f684828501612753565b60008060408385031215612a0257600080fd5b82356001600160401b03811115612a1857600080fd5b612a2485828601612753565b95602094909401359450505050565b600060208284031215612a4557600080fd5b5035919050565b60008060408385031215612a5f57600080fd5b823591506020808401356001600160401b0380821115612a7e57600080fd5b818601915086601f830112612a9257600080fd5b8135612aa061292682615bd1565b8082825285820191508585018a878560051b8801011115612ac057600080fd5b60005b84811015612b5257813586811115612ada57600080fd5b87016040818e03601f19011215612af057600080fd5b612af8615b79565b8982013588811115612b0957600080fd5b612b178f8c83860101612753565b825250604082013588811115612b2c57600080fd5b612b3a8f8c83860101612753565b828c0152508552509287019290870190600101612ac3565b50979a909950975050505050505050565b60008060408385031215612b7657600080fd5b50508035926020909101359150565b60008151808452612b9d816020860160208601615ce4565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612bcb57607f831692505b6020808410821415612bed57634e487b7160e01b600052602260045260246000fd5b818015612c015760018114612c1257612c3f565b60ff19861689528489019650612c3f565b60008881526020902060005b86811015612c375781548b820152908501908301612c1e565b505084890196505b50505050505092915050565b60008251612c5d818460208701615ce4565b9190910192915050565b60008351612c79818460208801615ce4565b835190830190612c8d818360208801615ce4565b01949350505050565b60008351612ca8818460208801615ce4565b600360fc1b9083019081528351612cc6816001840160208801615ce4565b01600101949350505050565b60008251612ce4818460208701615ce4565b600b60fa1b920191825250600101919050565b60008251612d09818460208701615ce4565b7f25323225334266756e6374696f6e2532307364667364253238742532392537429201918252507f72657475726e25323066756e6374696f6e25323825323925374276617225323060208201527f65253344742532422533443138333135363538313325334272657475726e253260408201527f30652533444d6174682e696d756c25323865253545652533452533452533453160608201527f352532433125374365253239253243253238253238253238652535452533446560808201527f2532424d6174682e696d756c253238652535456525334525334525334537253260a08201527f433631253743652532392532392535456525334525334525334531342532392560c08201527f334525334525334530253239253246343239343936373239362537442537446660e08201527f756e6374696f6e253230777261772532387425323925374276617225323065256101008201527f324372253344253542253544253342666f7225323865253344302533426525336101208201527f43742e6c656e67746825334265253242253242253239722535426525354425336101408201527f4474253542652535442e773125324225323872253542652d31253544253743256101608201527f3743302532392533427661722532306925334472616e642532382532392532416101808201527f72253542722e6c656e6774682d31253544253342666f722532386525334430256101a08201527f334265253343722e6c656e6774682532362532362532312532387225354265256101c08201527f3544253345692532392533426525324225324225323925334272657475726e256101e08201527f3230742535426525354425374466756e6374696f6e25323077726e64253238746102008201527f25323925374272657475726e25323077726177253238742532392e61312537446102208201527f66756e6374696f6e2532306752492532387425323925374272657475726e25326102408201527f304d6174682e666c6f6f7225323872616e6425323825323925324174253239256102608201527f374466756e6374696f6e253230747261697452617725323874253243652532396102808201527f25374272657475726e25323065253345253344742e6c656e67746825334674256102a08201527f3542742e6c656e6774682d31253544253341742535426525354425374466756e6102c08201527f6374696f6e2532307472616974253238742532436525323925374272657475726102e08201527f6e253230747261697452617725323874253243652532392e61312537447661726103008201527f253230636f6c6f727325324362676325324363253243646964537461727425326103208201527f43696d6725324377642532436865692532437365656425324372616e642532436103408201527f747a30253243747a31253243747a32253243747a33253243747a34253243747a6103608201527f35253243747a36253243747a37253243747a38253243747a39253243747a31306103808201527f253243626f726465722532436e756d2532436c6e54686b2532437078537a25326103a08201527f436e7353636c2532436e735374722532436c4f722532436e6e556e69532532436103c08201527f697353556e6925324373706565642532437a7a25324370746b7325324372756e6103e08201527f436f756e7425324363616e7661732532436f6c6457642532436f6c64486569256104008201527f334266756e6374696f6e25323068617368546f547261697473253238742532396104208201527f25374274253236253236253238747a30253344742e63686172417425323830256104408201527f3239253243747a31253344742e63686172417425323831253239253243747a326104608201527f253344742e63686172417425323832253239253243747a33253344742e6368616104808201527f72417425323833253239253243747a34253344742e63686172417425323834256104a08201527f3239253243747a35253344742e63686172417425323835253239253243747a366104c08201527f253344742e63686172417425323836253239253243747a37253344742e6368616104e08201527f72417425323837253239253243747a38253344742e63686172417425323838256105008201527f3239253243747a39253344742e63686172417425323839253239253243747a316105208201527f30253344742e6368617241742532383130253239253243747a312533444e756d6105408201527f626572253238747a302e746f537472696e67253238253239253242747a312e746105608201527f6f537472696e6725323825323925323925323925374466756e6374696f6e25326105808201527f30736574757025323825323925374273656564253344746f6b656e49642532436105a08201527f747a3025334430253243747a3125334437253243747a3225334437253243747a6105c08201527f3325334437253243747a3425334437253243747a3525334437253243747a36256105e08201527f334437253243747a3725334437253243747a3825334437253243747a392533446106008201527f37253243747a313025334437253243747a312533444e756d626572253238747a6106208201527f302e746f537472696e67253238253239253242747a312e746f537472696e67256106408201527f323825323925323925324368617368546f5472616974732532386861736825326106608201527f3925324372616e64253344736466736425323873656564253239253243626f726106808201527f64657225334430253344253344747a322533463230253341302533426e756d256106a08201527f33447472616974253238253542253742613125334131653325324377312533416106c08201527f31302537442532432537426131253341353030253243773125334131302537446106e08201527f25324325374261312533413235302532437731253341313025374425324325376107008201527f42613125334131303025324377312533413730253744253544253243747a33256107208201527f32392533426c6e54686b253344747261697425323825354225374261312533416107408201527f34302532437731253341312537442532432537426131253341333025324377316107608201527f25334134253744253243253742613125334131302532437731253341352537446107808201527f25324325374261312533413230253243773125334139302537442535442532436107a08201527f747a342532392532437078537a25334430253344253344747a352533463230256107c08201527f334131302533426e7353636c25334474726169742532382535422537426131256107e08201527f33413165342532437731253341312537442532432537426131253341323530256108008201527f32437731253341342537442532432537426131253341353025324377312533416108208201527f35253744253243253742613125334135303025324377312533413930253744256108408201527f3544253243747a362532392533426e73537472253344747261697425323825356108608201527f42253742613125334131302532437731253341312537442532432537426131256108808201527f33413525324377312533413425374425324325374261312533413225324377316108a08201527f25334135253744253243253742613125334131253243773125334139302537446108c08201527f253544253243747a372532392532436c4f7225334430253344253344747a38256108e08201527f33462d31253341312532436e6e556e695325334466756e6374696f6e253238256109008201527f323925374272657475726e2532306c4f722532412532383325324267524925326109208201527f38332532392532392537442532437370656564253344253238697353556e69256109408201527f334431253344253344747a3925323925334631302532416c4f722533416e6e556109608201527f6e69532532382532392533427a7a2533447472616974253238253542253742616109808201527f31253341302532437731253341352537442532432537426131253341323530256109a08201527f32437731253341352537442532432537426131253341333030253243773125336109c08201527f41313025374425324325374261312533413430302532437731253341313025376109e08201527f4425324325374261312533413530302532437731253341373025374425354425610a008201527f3243747a313025323925324370746b732533442535426e756d25354425324372610a208201527f756e436f756e742533443025324377642533444d6174682e6d696e2532383830610a408201527f3025324377696e646f7757696474682532392532436865692533444d6174682e610a608201527f6d696e25323839363025324377696e646f774865696768742532392532437764610a808201527f2533444d6174682e6365696c25323877642532467078537a2532392532417078610aa08201527f537a2532436865692533444d6174682e6365696c253238686569253246707853610ac08201527f7a2532392532417078537a253243646964537461727425334425323131253243610ae08201527f6e6f697365536565642532387365656425323925334276617225323074253344610b008201527f7472616974526177253238253542253742613125334125354225323863253344610b208201527f636f6c6f72253239253238253232253233666661346435253232253239253243610b408201527f6325323825323225323338336666633125323225323925324363253238253232610b608201527f2532336666653738302532322532392532436325323825323225323339396532610b808201527f66662532322532392535442532436267436f6c6f722533416325323825323225610ba08201527f3233666666666666253232253239253243773125334131253744253243253742610bc08201527f6131253341253542632532382532322532336666666666662532322532392532610be08201527f4363253238253232253233303030303030253232253239253544253243773125610c008201527f3341312537442532432537426131253341253542632532382532322532333330610c208201527f3565393025323225323925324363253238253232253233646234653534253232610c408201527f2532392532436325323825323225323334663363326425323225323925324363610c608201527f2532382532322532336666626231322532322532392532436325323825323225610c808201527f3233333839383934253232253239253243632532382532322532336530643863610ca08201527f3525323225323925324363253238253232253233633765336434253232253239610cc08201527f2535442532437731253341312532436267436f6c6f7225334163253238253232610ce08201527f2532336666666666662532322532392537442532432537426131253341253542610d008201527f6325323825323225323330383237663525323225323925324363253238253232610d208201527f2532333337353166372532322532392532436325323825323225323338343933610d408201527f6661253232253239253544253243773125334131253744253243253742613125610d608201527f3341253542632532382532322532333030633166662532322532392532436325610d808201527f3238253232253233303032336666253232253239253243632532382532322532610da08201527f3337323135666625323225323925324363253238253232253233666630336663610dc08201527f2532322532392532436325323825323225323366663030306125323225323925610de08201527f3243632532382532322532336666383730302532322532392532436325323825610e008201527f3232253233666666373030253232253239253243632532382532322532333566610e208201527f6666303025323225323925324363253238253232253233303066663265253232610e408201527f2532392535442532437731253341312532436267436f6c6f7225334163253238610e608201527f2532322532336666666666662532322532392537442532432537426131253341610e808201527f2535426325323825323225323330306530303025323225323925324363253238610ea08201527f2532322532333030353930302532322532392532436325323825323225323330610ec08201527f3030303030253232253239253544253243773125334135253744253243253742610ee08201527f6131253341253542632532382532322532333964303230382532322532392532610f008201527f4363253238253232253233643030303030253232253239253243632532382532610f208201527f3225323365383564303425323225323925324363253238253232253233666161610f408201527f3330372532322532392535442532437731253341352537442532432537426131610f608201527f2533412535426325323825323225323366666636396625323225323925324363610f808201527f2532382532322532336664643837302532322532392532436325323825323225610fa08201527f3233643039303266253232253239253243632532382532322532336131353530610fc08201527f3125323225323925324363253238253232253233333531343039253232253239610fe08201527f25354425324377312533413525374425324325374261312533412535426325326110008201527f38253232253233613066666533253232253239253243632532382532322532336110208201527f36356463393825323225323925324363253238253232253233386438393830256110408201527f32322532392532436325323825323225323335373532363725323225323925326110608201527f43632532382532322532333232323033352532322532392535442532437731256110808201527f33413525374425324325374261312533412535426325323825323225323330306110a08201527f39396666253232253239253243632532382532322532333536353564642532326110c08201527f25323925324363253238253232253233383832326666253232253239253243636110e08201527f25323825323225323361613939666625323225323925354425324377312533416111008201527f35253744253243253742613125334125354263253238253232253233373730306111208201527f61362532322532392532436325323825323225323366653030666525323225326111408201527f39253243632532382532322532336465666534372532322532392532436325326111608201527f38253232253233303062336665253232253239253243632532382532322532336111808201527f30303136656525323225323925354425324377312533413525374425324325376111a08201527f42613125334125354263253238253232253233633466666666253232253239256111c08201527f32436325323825323225323330386465656125323225323925324363253238256111e08201527f32322532333132363164312532322532392535442532437731253341313025376112008201527f44253243253742613125334125354263253238253232253233666631323466256112208201527f32322532392532436325323825323225323366663030613025323225323925326112408201527f43632532382532322532336665373566652532322532392532436325323825326112608201527f32253233376130346562253232253239253243632532382532322532333132306112808201527f34353825323225323925354425324377312533413130253744253243253742616112a08201527f31253341253542632532382532322532333131313131312532322532392532436112c08201527f63253238253232253233323232323232253232253239253243632532382532326112e08201527f25323333333333333325323225323925324363253238253232253233343434346113008201527f34342532322532392532436325323825323225323336363636363625323225326113208201527f39253544253243773125334131302537442532432537426131253341253542636113408201527f25323825323225323366383837666625323225323925324363253238253232256113608201527f32336465303034652532322532392532436325323825323225323338363030326113808201527f39253232253239253243632532382532322532333332313435302532322532396113a08201527f25324363253238253232253233323931333265253232253239253544253243776113c08201527f31253341313525374425324325374261312533412535426325323825323225326113e08201527f33383338366635253232253239253243632532382532322532333364343362346114008201527f25323225323925324363253238253232253233303431333438253232253239256114208201527f32436325323825323225323330383365313225323225323925324363253238256114408201527f32322532333161666534392532322532392535442532437731253341323025376114608201527f44253544253243747a31253239253342636f6c6f7273253344742e61312532436114808201527f62676325334463253238253232253233303030303030253232253239253243746114a08201527f2e6267436f6c6f72253236253236253238626763253344742e6267436f6c6f726114c08201527f25323925324325323863616e76617325334463726561746543616e76617325326114e08201527f3877642532436865692532392532392e646f75626c65436c69636b65642532386115008201527f746f67676c6546756c6c73637265656e2532392532436e6f5374726f6b6525326115208201527f38253239253342666f722532386c65742532307425334430253342742533436e6115408201527f756d2533427425324225324225323925374276617225323065253344637265616115608201527f7465566563746f72253238626f72646572253242675249253238312e322532416115808201527f25323877696474682d32253241626f72646572253239253239253243626f72646115a08201527f65722532426752492532386865696768742d32253241626f72646572253239256115c08201527f32433225323925324372253344637265617465566563746f72253238636f73256115e08201527f32383025323925324373696e25323830253239253239253342737065656425336116008201527f44697353556e6925334673706565642533416e6e556e695325323825323925326116208201527f4370746b73253542742535442533446e657725323050746b25323865253243726116408201527f25324373706565642532392537446672616d65526174652532383130253239256116608201527f374466756e6374696f6e25323072656d616b65253238742532436525323925376116808201527f42742533444d6174682e6365696c253238742532467078537a253239253241706116a08201527f78537a253243652533444d6174682e6365696c253238652532467078537a25326116c08201527f392532417078537a2532437764253344742532436865692533446525324377696116e08201527f6474682533447425324368656967687425334465253243253238696d672533446117008201527f637265617465496d6167652532384d6174682e666c6f6f7225323877642532466117208201527f7078537a2532392532434d6174682e666c6f6f722532386865692532467078536117408201527f7a2532392532392532392e6c6f6164506978656c7325323825323925324372656117608201527f73697a6543616e7661732532387425324365253239253342666f722532386c656117808201527f742532307425334430253342742533437a7a25334274253242253242253239256117a08201527f3742666f722532386c657425323074253344302533427425334370746b732e6c6117c08201527f656e6774682533427425324225324225323970746b73253542742535442e72756117e08201527f6e25323825323925334272756e436f756e7425324225324225374425374466756118008201527f6e6374696f6e253230746f67676c6546756c6c73637265656e253238253239256118208201527f37426c657425323074253344646f63756d656e742e717565727953656c6563746118408201527f6f7225323825323263616e766173253232253239253342646f63756d656e742e6118608201527f66756c6c73637265656e456c656d656e74253346646f63756d656e742e6578696118808201527f7446756c6c73637265656e2532382532392533412532386f6c645764253344776118a08201527f642532436f6c6448656925334468656925324372656d616b65253238383030256118c08201527f3243393630253239253243742e7265717565737446756c6c73637265656e25326118e08201527f382532392e636174636825323874253344253345253742616c657274253238256119008201527f36304572726f72253341253230253234253742742e6d657373616765253744256119208201527f3230253238253234253742742e6e616d652537442532392536302532392537446119408201527f25323925323925374466756e6374696f6e2532306b65795072657373656425326119608201527f3825323925374272657475726e25323037302533442533442533446b6579436f6119808201527f646525334625323872656d616b652532383135303025324335303025323925326119a08201527f432532313125323925334138382533442533442533446b6579436f64652533466119c08201527f25323872656d616b6525323870726f6d7074253238253232456e7465722532306119e08201527f7769647468253230696e253230706978656c7325323225324325323235303025611a008201527f323225323925324370726f6d7074253238253232486569676874253346253232611a208201527f2532432532323530302532322532392532392532432532313125323925334137611a408201527f392533442533442533446b6579436f6465253346253238746f67676c6546756c611a608201527f6c73637265656e25323825323925324325323131253239253341766f69642532611a808201527f303025374466756e6374696f6e25323064726177253238253239253742696625611aa08201527f32382532316469645374617274253239253742666f722532386c657425323074611ac08201527f25334430253342742533437a7a25334274253242253242253239253742666f72611ae08201527f2532386c657425323074253344302533427425334370746b732e6c656e677468611b008201527f2533427425324225324225323970746b73253542742535442e72756e25323825611b208201527f323925334272756e436f756e7425324225324225374464696453746172742533611b408201527f4425323130253744666f722532386c6574253230742533443025334274253343611b608201527f70746b732e6c656e6774682533427425324225324225323970746b7325354274611b808201527f2535442e72756e25323825323925334272756e436f756e742532422532422532611ba08201527f43253238696d67253344637265617465496d6167652532387764253246707853611bc08201527f7a2532436865692532467078537a2532392532392e6c6f6164506978656c7325611be08201527f3238253239253342666f72253238766172253230742533443025334274253343611c008201527f696d672e68656967687425334274253242253242253239666f72253238766172611c208201527f253230652533443025334265253343696d672e77696474682533426525324225611c408201527f32422532392537426c657425323072253344676574253238652532417078537a611c608201527f253243742532417078537a253239253243692533443425324125323865253242611c808201527f74253241696d672e7769647468253239253342696d672e706978656c73253542611ca08201527f6925354425334472656425323872253239253243696d672e706978656c732535611cc08201527f426925324231253544253344677265656e25323872253239253243696d672e70611ce08201527f6978656c732535426925324232253544253344626c7565253238722532392532611d008201527f43696d672e706978656c732535426925324233253544253344616c7068612532611d208201527f387225323925374466696c6c2532386267632532392532437265637425323830611d408201527f253243302532437769647468253243686569676874253239253243696d672e75611d608201527f7064617465506978656c732532382532392532436e6f536d6f6f746825323825611d808201527f3239253243696d616765253238696d6725324330253243302532437769647468611da08201527f25324368656967687425323925324366696c6c25323862676325323925324372611dc08201527f6563742532383025324330253243626f72646572253243686569676874253239611de08201527f2532437265637425323830253243302532437769647468253243626f72646572611e008201527f2532392532437265637425323877696474682d626f7264657225324330253243611e208201527f626f726465722532436865696768742532392532437265637425323830253243611e408201527f6865696768742d626f726465722532437769647468253243626f726465722532611e608201527f39253744636c61737325323050746b253742636f6e7374727563746f72253238611e808201527f742532436525324372253239253742746869732e6c6f63253344742532437468611ea08201527f69732e64697225334465253243746869732e7370656564253344722532437468611ec08201527f69732e63253344636f6c6f7273253542675249253238636f6c6f72732e6c656e611ee08201527f677468253239253544253243746869732e6c696e6553697a652533446c6e5468611f008201527f6b25374472756e253238253239253742746869732e6d6f766525323825323925611f208201527f3243746869732e636865636b4564676573253238253239253243746869732e75611f408201527f70646174652532382532392537446d6f76652532382532392537426c65742532611f608201527f30742533446e6f697365253238746869732e6c6f632e782532466e7353636c25611f808201527f3243746869732e6c6f632e792532466e7353636c25324372756e436f756e7425611fa08201527f32466e7353636c25323925324154574f5f50492532416e735374722533427468611fc08201527f69732e6469722e78253344636f7325323874253239253243746869732e646972611fe08201527f2e7925334473696e2532387425323925334276617225323065253344746869736120008201527f2e6469722e636f7079253238253239253342652e6d756c7425323831253241746120208201527f6869732e7370656564253239253243746869732e6c6f632e61646425323865256120408201527f3239253744636865636b4564676573253238253239253742253238746869732e6120608201527f6c6f632e78253343626f72646572253743253743746869732e6c6f632e7825336120808201527f4577696474682d626f72646572253743253743746869732e6c6f632e792533436120a08201527f626f72646572253743253743746869732e6c6f632e792533456865696768742d6120c08201527f626f72646572253239253236253236253238746869732e6c6f632e78253344626120e08201527f6f7264657225324267524925323877696474682d32253241626f7264657225326121008201527f39253243746869732e6c6f632e79253344626f726465722532426752492532386121208201527f6865696768742d32253241626f726465722532392532392537447570646174656121408201527f25323825323925374266696c6c253238746869732e63253239253243656c6c696121608201527f707365253238746869732e6c6f632e78253243746869732e6c6f632e792532436121808201527f746869732e6c696e6553697a65253243746869732e6c696e6553697a652532396121a08201527f253744253744253343253246736372697074253345253343253246626f6479256121c08201526e334525334325324668746d6c25334560881b6121e08201526121ef01919050565b6000845161567f818460208901615ce4565b6e3d913a3930b4ba2fba3cb832911d1160891b9083019081526156a5600f820186612bb1565b6a1116113b30b63ab2911d1160a91b815290506156c5600b820185612bb1565b62089f4b60ea1b81526003019695505050505050565b600084516156ed818460208901615ce4565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152615713600f820186612bb1565b6a1116113b30b63ab2911d1160a91b81529050615733600b820185612bb1565b61227d60f01b81526002019695505050505050565b6000611a328284612bb1565b7f646174613a746578742f68746d6c2c25334368746d6c253345253343686561648152771299a29299a1b9b1b934b83a12991839b9319299a212991960411b602082015260006157a76038830187612bb1565b7412991912991834b73a32b3b934ba3c9299a212991960591b81526157cf6015820187612bb1565b90507f25323225323063726f73736f726967696e253344253232616e6f6e796d6f757381527f253232253345253343253246736372697074253345253343253246686561642560208201527f3345253343626f6479253345253343736372697074253345766172253230746f6040820152671ad95b9259094cd160c21b60608201528451615864816068840160208901615ce4565b721299a13b30b91299183430b9b41299a212991960691b60689290910191820152835161589881607b840160208801615ce4565b01607b019695505050505050565b605b60f81b8152600082516158c2816001850160208701615ce4565b605d60f81b6001939091019283015250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161591281601d850160208701615ce4565b91909101601d0192915050565b747b226e616d65223a202246696c616d656e7473202360581b81528751600090615950816015850160208d01615ce4565b885190830190615967816015840160208d01615ce4565b711130b734b6b0ba34b7b72fbab936111d101160711b601592909101918201526159946027820189612bb1565b905086516159a6818360208b01615ce4565b6a11161134b6b0b3b2911d1160a91b91019081526159c7600b820187612bb1565b905084516159d9818360208901615ce4565b6e11161130ba3a3934b13aba32b9911d60891b91019081528351615a0481600f840160208801615ce4565b607d60f81b600f92909101918201526010019998505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615a5690830184612b85565b9695505050505050565b602081526000611a326020830184612b85565b604081526000615a866040830185612b85565b8281036020840152615a988185612b85565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604080519081016001600160401b0381118282101715615b9b57615b9b615df2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615bc957615bc9615df2565b604052919050565b60006001600160401b03821115615bea57615bea615df2565b5060051b60200190565b600061ffff808316818516808303821115612c8d57612c8d615d9a565b60008219821115615c2457615c24615d9a565b500190565b600060ff821660ff84168060ff03821115615c4657615c46615d9a565b019392505050565b600082615c5d57615c5d615db0565b500490565b6000816000190483118215151615615c7c57615c7c615d9a565b500290565b600060ff821660ff84168160ff0481118215151615615ca257615ca2615d9a565b029392505050565b600082821015615cbc57615cbc615d9a565b500390565b600060ff821660ff841680821015615cdb57615cdb615d9a565b90039392505050565b60005b83811015615cff578181015183820152602001615ce7565b8381111561124c5750506000910152565b600181811c90821680615d2457607f821691505b60208210811415615d4557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615d5f57615d5f615d9a565b5060010190565b600060ff821660ff811415615d7d57615d7d615d9a565b60010192915050565b600082615d9557615d95615db0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461081657600080fdfe222c20226465736372697074696f6e223a202246696c616d656e7473206973206120636f6c6c656374696f6e206f662035303020756e6971756520706965636573206f662067656e6572617469766520706978656c206172742e204d6574616461746120616e6420617274206973206d6972726f726564207065726d616e656e746c79206f6e2d636861696e2e20446f75626c6520636c69636b20746f2066756c6c2073637265656e2e2050726573732046207468656e2072696768742d636c69636b20616e64207361766520617320612062616e6e65722e222c4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202cfd55917b30d6263d3aba6ed166bd47a0c7e4df134f2773305bd986ba893bf664736f6c63430008070033

Deployed Bytecode Sourcemap

47667:23725:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67604:207;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41420:224;;;;;;:::i;:::-;;:::i;:::-;;;37641:14:1;;37634:22;37616:41;;37604:2;37589:18;41420:224:0;37476:187:1;29312:100:0;;;:::i;30871:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;36939:32:1;;;36921:51;;36909:2;36894:18;30871:221:0;36775:203:1;30394:411:0;;;;;;:::i;:::-;;:::i;:::-;;68721:138;;;:::i;54697:9512::-;;;;;;:::i;:::-;;:::i;70796:120::-;;;;;;:::i;:::-;;:::i;42060:113::-;42148:10;:17;42060:113;;;45972:25:1;;;45960:2;45945:18;42060:113:0;45826:177:1;31761:339:0;;;;;;:::i;:::-;;:::i;48449:25::-;;;;;;71271:118;;;;;;:::i;:::-;;:::i;71039:102::-;;;;;;:::i;:::-;;:::i;41728:256::-;;;;;;:::i;:::-;;:::i;48155:45::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;69388:392::-;;;;;;:::i;:::-;;:::i;68936:297::-;;;;;;:::i;:::-;;:::i;54434:202::-;;;;;;:::i;:::-;;:::i;32171:185::-;;;;;;:::i;:::-;;:::i;42250:233::-;;;;;;:::i;:::-;;:::i;48599:29::-;;;;;;29006:239;;;;;;:::i;:::-;;:::i;64274:1384::-;;;;;;:::i;:::-;;:::i;28736:208::-;;;;;;:::i;:::-;;:::i;9011:94::-;;;:::i;48410:32::-;;;;;;;;;53524:71;;;:::i;8360:87::-;;;:::i;29481:104::-;;;:::i;48550:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31164:295;;;;;;:::i;:::-;;:::i;32427:328::-;;;;;;:::i;:::-;;:::i;69837:461::-;;;:::i;65813:1657::-;;;;;;:::i;:::-;;:::i;70529:100::-;;;;;;:::i;:::-;;:::i;31530:164::-;;;;;;:::i;:::-;;:::i;9260:192::-;;;;;;:::i;:::-;;:::i;70310:93::-;;;:::i;67604:207::-;67725:23;67751;;;:13;:23;;;;;67725:49;;67694:13;;67725:23;67751;67725:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67725:49:0;;67604:207;-1:-1:-1;;;;;;;67604:207:0:o;41420:224::-;41522:4;-1:-1:-1;;;;;;41546:50:0;;-1:-1:-1;;;41546:50:0;;:90;;;41600:36;41624:11;41600:23;:36::i;:::-;41539:97;41420:224;-1:-1:-1;;41420:224:0:o;29312:100::-;29366:13;29399:5;29392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29312:100;:::o;30871:221::-;30947:7;30975:16;30983:7;30975;:16::i;:::-;30967:73;;;;-1:-1:-1;;;30967:73:0;;43262:2:1;30967:73:0;;;43244:21:1;43301:2;43281:18;;;43274:30;43340:34;43320:18;;;43313:62;-1:-1:-1;;;43391:18:1;;;43384:42;43443:19;;30967:73:0;;;;;;;;;-1:-1:-1;31060:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31060:24:0;;30871:221::o;30394:411::-;30475:13;30491:23;30506:7;30491:14;:23::i;:::-;30475:39;;30539:5;-1:-1:-1;;;;;30533:11:0;:2;-1:-1:-1;;;;;30533:11:0;;;30525:57;;;;-1:-1:-1;;;30525:57:0;;44446:2:1;30525:57:0;;;44428:21:1;44485:2;44465:18;;;44458:30;44524:34;44504:18;;;44497:62;-1:-1:-1;;;44575:18:1;;;44568:31;44616:19;;30525:57:0;44244:397:1;30525:57:0;7228:10;-1:-1:-1;;;;;30617:21:0;;;;:62;;-1:-1:-1;30642:37:0;30659:5;7228:10;31530:164;:::i;30642:37::-;30595:168;;;;-1:-1:-1;;;30595:168:0;;41655:2:1;30595:168:0;;;41637:21:1;41694:2;41674:18;;;41667:30;41733:34;41713:18;;;41706:62;-1:-1:-1;;;41784:18:1;;;41777:54;41848:19;;30595:168:0;41453:420:1;30595:168:0;30776:21;30785:2;30789:7;30776:8;:21::i;:::-;30464:341;30394:411;;:::o;68721:138::-;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;68777:9:::1;68772:80;68796:2;68792:1;:6;68772:80;;;68827:13;::::0;;;:10:::1;:13;::::0;;;;68820:20:::1;::::0;::::1;:::i;:::-;68800:3:::0;::::1;::::0;::::1;:::i;:::-;;;;68772:80;;;;68721:138::o:0;54697:9512::-;54804:13;54835:24;54995:7;55063:13;55220:35;55246:8;55220:25;:35::i;:::-;55314:5;54883:451;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54835:510;;55427:10;55392:8768;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;55392:8768:0;;;;;;;54697:9512;-1:-1:-1;;;;54697:9512:0:o;70796:120::-;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;70878:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;:::-;;70796:120:::0;:::o;31761:339::-;31956:41;7228:10;31989:7;31956:18;:41::i;:::-;31948:103;;;;-1:-1:-1;;;31948:103:0;;;;;;;:::i;:::-;32064:28;32074:4;32080:2;32084:7;32064:9;:28::i;71271:118::-;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;71353:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;71039:102::-:0;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;71113:20;;::::1;::::0;:8:::1;::::0;:20;;::::1;::::0;::::1;:::i;41728:256::-:0;41825:7;41861:23;41878:5;41861:16;:23::i;:::-;41853:5;:31;41845:87;;;;-1:-1:-1;;;41845:87:0;;38480:2:1;41845:87:0;;;38462:21:1;38519:2;38499:18;;;38492:30;38558:34;38538:18;;;38531:62;-1:-1:-1;;;38609:18:1;;;38602:41;38660:19;;41845:87:0;38278:407:1;41845:87:0;-1:-1:-1;;;;;;41950:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41728:256::o;48155:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69388:392::-;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;69514:9:::1;69509:245;69533:6;:13;69529:1;:17;69509:245;;;69568:10;:27;69579:15;69568:27;;;;;;;;;;;69619:108;;;;;;;;69647:6;69654:1;69647:9;;;;;;;;:::i;:::-;;;;;;;:19;;;69619:108;;;;69689:6;69696:1;69689:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;:19;::::1;::::0;69619:108;;;69568:174;;::::1;::::0;::::1;::::0;;-1:-1:-1;69568:174:0;;;;;;;;;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;69568:174:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;69548:3;;;;;:::i;:::-;;;;69509:245;;68936:297:::0;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;69025:13;;69013:9:::1;69059:115;69080:4;69077:1;:7;69059:115;;;69103:12;69118:6;69125:1;69118:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;69140:15:0::1;;::::0;;;:9:::1;:15:::0;;;;;;:22;;-1:-1:-1;;69140:22:0::1;69158:4;69140:22;::::0;;-1:-1:-1;69086:3:0;::::1;::::0;::::1;:::i;:::-;;;;69059:115;;;;69212:6;:13;69194:14;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;68936:297:0:o;54434:202::-;54495:4;54527:7;:5;:7::i;:::-;-1:-1:-1;;;;;54516:18:0;:7;-1:-1:-1;;;;;54516:18:0;;54512:71;;;-1:-1:-1;54558:4:0;;54434:202;-1:-1:-1;54434:202:0:o;54512:71::-;-1:-1:-1;;;;;;54610:18:0;;;;;:9;:18;;;;;;;;;54434:202::o;32171:185::-;32309:39;32326:4;32332:2;32336:7;32309:39;;;;;;;;;;;;:16;:39::i;42250:233::-;42325:7;42361:30;42148:10;:17;;42060:113;42361:30;42353:5;:38;42345:95;;;;-1:-1:-1;;;42345:95:0;;45615:2:1;42345:95:0;;;45597:21:1;45654:2;45634:18;;;45627:30;45693:34;45673:18;;;45666:62;-1:-1:-1;;;45744:18:1;;;45737:42;45796:19;;42345:95:0;45413:408:1;42345:95:0;42458:10;42469:5;42458:17;;;;;;;;:::i;:::-;;;;;;;;;42451:24;;42250:233;;;:::o;29006:239::-;29078:7;29114:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29114:16:0;29149:19;29141:73;;;;-1:-1:-1;;;29141:73:0;;42491:2:1;29141:73:0;;;42473:21:1;42530:2;42510:18;;;42503:30;42569:34;42549:18;;;42542:62;-1:-1:-1;;;42620:18:1;;;42613:39;42669:19;;29141:73:0;42289:405:1;64274:1384:0;64367:13;64398:28;64447:23;64473:90;64513:39;64540:5;64547:1;64550;64513:26;:39::i;:::-;64473:25;:90::i;:::-;64718:13;;;:10;:13;;;:32;;64447:116;;-1:-1:-1;64649:14:0;;64718:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;64811:10;:13;64822:1;64811:13;;;;;;;;;;;64825:17;64811:32;;;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;64614:278;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64614:278:0;;;;;;;;;;-1:-1:-1;64931:1:0;64916:665;64938:2;64934:1;:6;;;64916:665;;;64962:20;64985:102;65029:43;65056:5;65029:43;;;65066:5;65063:1;65070;65066:5;:::i;:::-;65029:43;;:26;:43::i;64985:102::-;64962:125;;65185:14;65262:10;:13;65273:1;65262:13;;;;;;;;;;;;;65276:14;65262:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;65360:10;:13;65371:1;65360:13;;;;;;;;;;;;;65374:14;65360:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;65146:299;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65104:356;;65481:1;:7;;65486:2;65481:7;65477:92;;65548:14;65531:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;65507:62;;65477:92;-1:-1:-1;64942:3:0;;;;:::i;:::-;;;;64916:665;;;;65629:14;65607:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;65593:57;;;;64274:1384;;;:::o;28736:208::-;28808:7;-1:-1:-1;;;;;28836:19:0;;28828:74;;;;-1:-1:-1;;;28828:74:0;;42080:2:1;28828:74:0;;;42062:21:1;42119:2;42099:18;;;42092:30;42158:34;42138:18;;;42131:62;-1:-1:-1;;;42209:18:1;;;42202:40;42259:19;;28828:74:0;41878:406:1;28828:74:0;-1:-1:-1;;;;;;28920:16:0;;;;;:9;:16;;;;;;;28736:208::o;9011:94::-;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;9076:21:::1;9094:1;9076:9;:21::i;:::-;9011:94::o:0;53524:71::-;53573:14;:12;:14::i;8360:87::-;8433:6;;-1:-1:-1;;;;;8433:6:0;;8360:87::o;29481:104::-;29537:13;29570:7;29563:14;;;;;:::i;31164:295::-;-1:-1:-1;;;;;31267:24:0;;7228:10;31267:24;;31259:62;;;;-1:-1:-1;;;31259:62:0;;40888:2:1;31259:62:0;;;40870:21:1;40927:2;40907:18;;;40900:30;-1:-1:-1;;;40946:18:1;;;40939:55;41011:18;;31259:62:0;40686:349:1;31259:62:0;7228:10;31334:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31334:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31334:53:0;;;;;;;;;;31403:48;;37616:41:1;;;31334:42:0;;7228:10;31403:48;;37589:18:1;31403:48:0;;;;;;;31164:295;;:::o;32427:328::-;32602:41;7228:10;32635:7;32602:18;:41::i;:::-;32594:103;;;;-1:-1:-1;;;32594:103:0;;;;;;;:::i;:::-;32708:39;32722:4;32728:2;32732:7;32741:5;32708:13;:39::i;:::-;32427:328;;;;:::o;69837:461::-;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;69893:20:::1;69916:13;42148:10:::0;:17;;42060:113;69916:13:::1;69893:36;;69963:10;;69948:12;:25;69940:34;;;::::0;::::1;;70022:10;4384:20:::0;4432:8;69985:49:::1;;;::::0;::::1;;70069:12:::0;70123:32:::1;70069:12:::0;70141:10:::1;70047:19;70123:4;:32::i;:::-;70094:26;::::0;;;:13:::1;:26;::::0;;;;;;;:61;;::::1;::::0;:26;;:61;;;::::1;::::0;::::1;:::i;:::-;;70211:4;70168:12;70181:13;:26;70195:11;70181:26;;;;;;;;;;;70168:40;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:47;;;::::1;;-1:-1:-1::0;;70168:47:0;;::::1;::::0;;;::::1;::::0;;70228:62:::1;70234:42;70278:11:::0;70228:5:::1;:62::i;65813:1657::-:0;65915:13;65954:17;65962:8;65954:7;:17::i;:::-;65946:26;;;;;;65985:23;66011:24;66026:8;66011:14;:24::i;:::-;65985:50;;66056:25;:249;;;;;;;;;;;;;;;;;;;66464:964;66708:35;66734:8;66708:25;:35::i;:::-;66782:11;66891:12;66942:35;66968:8;66942:25;:35::i;:::-;67068:8;67115:35;67141:8;67115:25;:35::i;:::-;67245:25;67260:9;67245:14;:25::i;:::-;66591:756;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66464:23;:964::i;:::-;66371:1076;;;;;;;;:::i;70529:100::-;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;70603:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;31530:164::-:0;-1:-1:-1;;;;;31651:25:0;;;31627:4;31651:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31530:164::o;9260:192::-;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9349:22:0;::::1;9341:73;;;::::0;-1:-1:-1;;;9341:73:0;;39311:2:1;9341:73:0::1;::::0;::::1;39293:21:1::0;39350:2;39330:18;;;39323:30;39389:34;39369:18;;;39362:62;-1:-1:-1;;;39440:18:1;;;39433:36;39486:19;;9341:73:0::1;39109:402:1::0;9341:73:0::1;9425:19;9435:8;9425:9;:19::i;70310:93::-:0;7228:10;8580:7;:5;:7::i;:::-;-1:-1:-1;;;;;8580:23:0;;8572:68;;;;-1:-1:-1;;;8572:68:0;;;;;;;:::i;:::-;70383:12:::1;::::0;;-1:-1:-1;;70367:28:0;::::1;70383:12;::::0;;::::1;70382:13;70367:28;::::0;;70310:93::o;28367:305::-;28469:4;-1:-1:-1;;;;;;28506:40:0;;-1:-1:-1;;;28506:40:0;;:105;;-1:-1:-1;;;;;;;28563:48:0;;-1:-1:-1;;;28563:48:0;28506:105;:158;;;-1:-1:-1;;;;;;;;;;20455:40:0;;;28628:36;20346:157;34265:127;34330:4;34354:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34354:16:0;:30;;;34265:127::o;38247:174::-;38322:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38322:29:0;-1:-1:-1;;;;;38322:29:0;;;;;;;;:24;;38376:23;38322:24;38376:14;:23::i;:::-;-1:-1:-1;;;;;38367:46:0;;;;;;;;;;;38247:174;;:::o;2583:532::-;2639:13;2669:10;2665:53;;-1:-1:-1;;2696:10:0;;;;;;;;;;;;-1:-1:-1;;;2696:10:0;;;;;2583:532::o;2665:53::-;2743:5;2728:12;2784:78;2791:9;;2784:78;;2817:8;;;;:::i;:::-;;-1:-1:-1;2840:10:0;;-1:-1:-1;2848:2:0;2840:10;;:::i;:::-;;;2784:78;;;2872:19;2904:6;-1:-1:-1;;;;;2894:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2894:17:0;;2872:39;;2922:154;2929:10;;2922:154;;2956:11;2966:1;2956:11;;:::i;:::-;;-1:-1:-1;3025:10:0;3033:2;3025:5;:10;:::i;:::-;3012:24;;:2;:24;:::i;:::-;2999:39;;2982:6;2989;2982:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2982:56:0;;;;;;;;-1:-1:-1;3053:11:0;3062:2;3053:11;;:::i;:::-;;;2922:154;;;3100:6;2583:532;-1:-1:-1;;;;2583:532:0:o;34559:348::-;34652:4;34677:16;34685:7;34677;:16::i;:::-;34669:73;;;;-1:-1:-1;;;34669:73:0;;41242:2:1;34669:73:0;;;41224:21:1;41281:2;41261:18;;;41254:30;41320:34;41300:18;;;41293:62;-1:-1:-1;;;41371:18:1;;;41364:42;41423:19;;34669:73:0;41040:408:1;34669:73:0;34753:13;34769:23;34784:7;34769:14;:23::i;:::-;34753:39;;34822:5;-1:-1:-1;;;;;34811:16:0;:7;-1:-1:-1;;;;;34811:16:0;;:51;;;;34855:7;-1:-1:-1;;;;;34831:31:0;:20;34843:7;34831:11;:20::i;:::-;-1:-1:-1;;;;;34831:31:0;;34811:51;:87;;;;34866:32;34883:5;34890:7;34866:16;:32::i;37551:578::-;37710:4;-1:-1:-1;;;;;37683:31:0;:23;37698:7;37683:14;:23::i;:::-;-1:-1:-1;;;;;37683:31:0;;37675:85;;;;-1:-1:-1;;;37675:85:0;;44036:2:1;37675:85:0;;;44018:21:1;44075:2;44055:18;;;44048:30;44114:34;44094:18;;;44087:62;-1:-1:-1;;;44165:18:1;;;44158:39;44214:19;;37675:85:0;43834:405:1;37675:85:0;-1:-1:-1;;;;;37779:16:0;;37771:65;;;;-1:-1:-1;;;37771:65:0;;40483:2:1;37771:65:0;;;40465:21:1;40522:2;40502:18;;;40495:30;40561:34;40541:18;;;40534:62;-1:-1:-1;;;40612:18:1;;;40605:34;40656:19;;37771:65:0;40281:400:1;37771:65:0;37849:39;37870:4;37876:2;37880:7;37849:20;:39::i;:::-;37953:29;37970:1;37974:7;37953:8;:29::i;:::-;-1:-1:-1;;;;;37995:15:0;;;;;;:9;:15;;;;;:20;;38014:1;;37995:15;:20;;38014:1;;37995:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38026:13:0;;;;;;:9;:13;;;;;:18;;38043:1;;38026:13;:18;;38043:1;;38026:18;:::i;:::-;;;;-1:-1:-1;;38055:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38055:21:0;-1:-1:-1;;;;;38055:21:0;;;;;;;;;38094:27;;38055:16;;38094:27;;;;;;;37551:578;;;:::o;3634:419::-;3767:13;3823:3;3793:21;3870;3881:10;3870:8;:21;:::i;:::-;-1:-1:-1;;;;;3860:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3860:32:0;-1:-1:-1;3838:54:0;-1:-1:-1;3920:10:0;3903:111;3936:8;3932:1;:12;3903:111;;;3991:8;4000:1;3991:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;3991:11:0;3966:6;3973:14;3977:10;3973:1;:14;:::i;:::-;3966:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;3966:36:0;;;;;;;;-1:-1:-1;3946:3:0;;;;:::i;:::-;;;;3903:111;;;-1:-1:-1;4038:6:0;-1:-1:-1;;3634:419:0;;;;;;:::o;3123:503::-;3209:16;3272:2;3209:16;;3311:286;3333:7;:14;3329:1;:18;;;3311:286;;;3420:2;3404:7;3412:1;3404:10;;;;;;;;;;:::i;:::-;;;;;;;3392:30;;;;3391:85;;;3473:2;3457:7;3465:1;3457:10;;;;;;;;;;:::i;:::-;;;;;;;3445:30;;3391:85;3369:217;;;3511:10;3519:2;3511:10;;:::i;:::-;;;3568:2;3554:7;3562:1;3554:10;;;;;;;;;;:::i;:::-;;;;;3548:22;;;3554:10;;3548:22;:::i;:::-;3540:30;;;;:::i;:::-;;;3369:217;3349:3;;;;:::i;:::-;;;;3311:286;;;-1:-1:-1;3614:4:0;3123:503;-1:-1:-1;;;3123:503:0:o;9460:173::-;9535:6;;;-1:-1:-1;;;;;9552:17:0;;;-1:-1:-1;;;;;;9552:17:0;;;;;;;9585:40;;9535:6;;;9552:17;9535:6;;9585:40;;9516:16;;9585:40;9505:128;9460:173;:::o;52778:689::-;52830:12;;;;:20;;:12;:20;;:45;;;52868:7;:5;:7::i;:::-;-1:-1:-1;;;;;52854:21:0;:10;-1:-1:-1;;;;;52854:21:0;;52830:45;52822:78;;;;-1:-1:-1;;;52822:78:0;;45266:2:1;52822:78:0;;;45248:21:1;45305:2;45285:18;;;45278:30;-1:-1:-1;;;45324:18:1;;;45317:50;45384:18;;52822:78:0;45064:344:1;52822:78:0;52919:25;52933:10;52919:13;:25::i;:::-;52911:77;;;;-1:-1:-1;;;52911:77:0;;40075:2:1;52911:77:0;;;40057:21:1;40114:2;40094:18;;;40087:30;40153:34;40133:18;;;40126:62;-1:-1:-1;;;40204:18:1;;;40197:37;40251:19;;52911:77:0;39873:403:1;52911:77:0;52999:20;53022:13;42148:10;:17;;42060:113;53022:13;52999:36;;53069:10;;53054:12;:25;53046:34;;;;;;53114:10;;53099:12;:25;53091:34;;;;;;53173:10;4384:20;4432:8;53136:49;;;;;;53216:10;53230:5;53206:21;;;:9;:21;;;;;:29;;-1:-1:-1;;53206:29:0;;;53270:12;;53324:32;;53270:12;;53216:10;53324:4;:32::i;:::-;53295:26;;;;:13;:26;;;;;;;;:61;;;;:26;;:61;;;;;;:::i;:::-;;53412:4;53369:12;53382:13;:26;53396:11;53382:26;;;;;;;;;;;53369:40;;;;;;:::i;:::-;;;;;;;;;;;;;;:47;;;;;-1:-1:-1;;53369:47:0;;;;;;;;;53429:30;53435:10;53447:11;53429:5;:30::i;33637:315::-;33794:28;33804:4;33810:2;33814:7;33794:9;:28::i;:::-;33841:48;33864:4;33870:2;33874:7;33883:5;33841:22;:48::i;:::-;33833:111;;;;-1:-1:-1;;;33833:111:0;;;;;;;:::i;51103:1586::-;51205:13;51244:2;51239;:7;51231:16;;;;;;51362:30;;;;;;;;;:25;:30;;;51405:1175;51427:2;51423:1;:6;;;51405:1175;;;51451:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;51828:10:0;;51589:276;;;51636:15;51589:276;;;36482:19:1;51682:16:0;36517:12:1;;;36510:28;;;;36554:12;;;;36547:28;;;36609:15;;;-1:-1:-1;;36605:53:1;36591:12;;;36584:75;36675:13;;;36668:29;;;36713:13;;;36706:29;;;;-1:-1:-1;;51910:5:0;;36751:13:1;;51589:276:0;;;;;;;;;;;;51553:335;;;;;;51523:384;;:392;;;;:::i;:::-;51478:452;-1:-1:-1;51963:6:0;;;51959:610;;51990:9;52002:24;52012:10;52002:24;;52024:1;52002:9;:24::i;:::-;51990:36;;52055:1;52049:3;:7;;;52045:340;;;52145:11;52158:14;:3;:12;;;:14::i;:::-;52128:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52081:115;;52045:340;;;52309:11;52327:14;:3;:12;;;:14::i;:::-;52292:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52245:120;;52045:340;51971:429;51959:610;;;52485:11;52498:35;:24;52508:10;52498:24;;52520:1;52498:9;:24::i;:::-;:33;;;:35::i;:::-;52468:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52425:128;;51959:610;-1:-1:-1;51431:3:0;;;;:::i;:::-;;;;51405:1175;;;;52596:12;52609:11;52596:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;52592:58;;;52630:20;52635:2;52639;52643:6;:2;52648:1;52643:6;:::i;:::-;52630:4;:20::i;:::-;52623:27;;;;;36243:382;-1:-1:-1;;;;;36323:16:0;;36315:61;;;;-1:-1:-1;;;36315:61:0;;42901:2:1;36315:61:0;;;42883:21:1;;;42920:18;;;42913:30;42979:34;42959:18;;;42952:62;43031:18;;36315:61:0;42699:356:1;36315:61:0;36396:16;36404:7;36396;:16::i;:::-;36395:17;36387:58;;;;-1:-1:-1;;;36387:58:0;;39718:2:1;36387:58:0;;;39700:21:1;39757:2;39737:18;;;39730:30;39796;39776:18;;;39769:58;39844:18;;36387:58:0;39516:352:1;36387:58:0;36458:45;36487:1;36491:2;36495:7;36458:20;:45::i;:::-;-1:-1:-1;;;;;36516:13:0;;;;;;:9;:13;;;;;:18;;36533:1;;36516:13;:18;;36533:1;;36516:18;:::i;:::-;;;;-1:-1:-1;;36545:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36545:21:0;-1:-1:-1;;;;;36545:21:0;;;;;;;;36584:33;;36545:16;;;36584:33;;36545:16;;36584:33;36243:382;;:::o;221:2256::-;279:13;309:4;:11;324:1;309:16;305:31;;;-1:-1:-1;;327:9:0;;;;;;;;;-1:-1:-1;327:9:0;;;221:2256::o;305:31::-;388:19;410:5;;;;;;;;;;;;;;;;;388:27;;467:18;513:1;494:4;:11;508:1;494:15;;;;:::i;:::-;493:21;;;;:::i;:::-;488:27;;:1;:27;:::i;:::-;467:48;-1:-1:-1;598:20:0;632:15;467:48;645:2;632:15;:::i;:::-;-1:-1:-1;;;;;621:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;621:27:0;;598:50;;745:10;737:6;730:26;840:1;833:5;829:13;899:4;950;944:11;935:7;931:25;1046:2;1038:6;1034:15;1119:1045;1154:6;1145:7;1142:19;1119:1045;;;1224:1;1211:15;;;1292:14;;1475:4;1463:2;1459:14;;;1455:25;;1441:40;;1435:47;1430:3;1426:57;;;1365:137;;1666:2;1662:14;;;1658:25;;1644:40;;1638:47;1629:57;;1548:1;1533:17;;1568:137;1869:1;1865:13;;;1861:24;;1847:39;;1841:46;1832:56;;1736:17;;;1771:136;2063:16;;2049:31;;2043:38;2034:48;;1938:17;;;1973:128;;;;2132:17;;1119:1045;;;2237:1;2230:4;2224:11;2220:19;2258:1;2253:84;;;;2356:1;2351:82;;;;2213:220;;2253:84;-1:-1:-1;;;;;2286:17:0;;2279:43;2253:84;;2351:82;-1:-1:-1;;;;;2384:17:0;;2377:41;2213:220;-1:-1:-1;2463:6:0;;221:2256;-1:-1:-1;;;;;;;;221:2256:0:o;43096:589::-;-1:-1:-1;;;;;43302:18:0;;43298:187;;43337:40;43369:7;44512:10;:17;;44485:24;;;;:15;:24;;;;;:44;;;44540:24;;;;;;;;;;;;44408:164;43337:40;43298:187;;;43407:2;-1:-1:-1;;;;;43399:10:0;:4;-1:-1:-1;;;;;43399:10:0;;43395:90;;43426:47;43459:4;43465:7;43426:32;:47::i;:::-;-1:-1:-1;;;;;43499:16:0;;43495:183;;43532:45;43569:7;43532:36;:45::i;43495:183::-;43605:4;-1:-1:-1;;;;;43599:10:0;:2;-1:-1:-1;;;;;43599:10:0;;43595:83;;43626:40;43654:2;43658:7;43626:27;:40::i;38986:799::-;39141:4;-1:-1:-1;;;;;39162:13:0;;4384:20;4432:8;39158:620;;39198:72;;-1:-1:-1;;;39198:72:0;;-1:-1:-1;;;;;39198:36:0;;;;;:72;;7228:10;;39249:4;;39255:7;;39264:5;;39198:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39198:72:0;;;;;;;;-1:-1:-1;;39198:72:0;;;;;;;;;;;;:::i;:::-;;;39194:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39440:13:0;;39436:272;;39483:60;;-1:-1:-1;;;39483:60:0;;;;;;;:::i;39436:272::-;39658:6;39652:13;39643:6;39639:2;39635:15;39628:38;39194:529;-1:-1:-1;;;;;;39321:51:0;-1:-1:-1;;;39321:51:0;;-1:-1:-1;39314:58:0;;39158:620;-1:-1:-1;39762:4:0;38986:799;;;;;;:::o;50261:553::-;50369:5;;;50431:355;50453:5;50459:11;50453:18;;;;;;;;;:::i;:::-;;:25;50449:29;;;;50431:355;;;50500:21;50524:5;50530:11;50524:18;;;;;;;;;:::i;:::-;;50543:1;50524:21;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;50500:45;;50596:17;50582:31;;:10;:31;;:99;;;;-1:-1:-1;50647:34:0;50667:14;50647:17;:34;:::i;:::-;50634:47;;:10;:47;50582:99;50560:145;;;-1:-1:-1;50704:1:0;-1:-1:-1;50697:8:0;;-1:-1:-1;50697:8:0;50560:145;50740:34;50760:14;50740:17;:34;:::i;:::-;50720:54;;50485:301;50480:3;;;;;:::i;:::-;;;;50431:355;;;;50798:8;;;45199:988;45465:22;45515:1;45490:22;45507:4;45490:16;:22::i;:::-;:26;;;;:::i;:::-;45527:18;45548:26;;;:17;:26;;;;;;45465:51;;-1:-1:-1;45681:28:0;;;45677:328;;-1:-1:-1;;;;;45748:18:0;;45726:19;45748:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45799:30;;;;;;:44;;;45916:30;;:17;:30;;;;;:43;;;45677:328;-1:-1:-1;46101:26:0;;;;:17;:26;;;;;;;;46094:33;;;-1:-1:-1;;;;;46145:18:0;;;;;:12;:18;;;;;:34;;;;;;;46138:41;45199:988::o;46482:1079::-;46760:10;:17;46735:22;;46760:21;;46780:1;;46760:21;:::i;:::-;46792:18;46813:24;;;:15;:24;;;;;;47186:10;:26;;46735:46;;-1:-1:-1;46813:24:0;;46735:46;;47186:26;;;;;;:::i;:::-;;;;;;;;;47164:48;;47250:11;47225:10;47236;47225:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;47330:28;;;:15;:28;;;;;;;:41;;;47502:24;;;;;47495:31;47537:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46553:1008;;;46482:1079;:::o;43986:221::-;44071:14;44088:20;44105:2;44088:16;:20::i;:::-;-1:-1:-1;;;;;44119:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44164:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43986:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:406:1:-;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:221::-;646:5;699:3;692:4;684:6;680:17;676:27;666:55;;717:1;714;707:12;666:55;739:79;814:3;805:6;792:20;785:4;777:6;773:17;739:79;:::i;829:186::-;888:6;941:2;929:9;920:7;916:23;912:32;909:52;;;957:1;954;947:12;909:52;980:29;999:9;980:29;:::i;1020:260::-;1088:6;1096;1149:2;1137:9;1128:7;1124:23;1120:32;1117:52;;;1165:1;1162;1155:12;1117:52;1188:29;1207:9;1188:29;:::i;:::-;1178:39;;1236:38;1270:2;1259:9;1255:18;1236:38;:::i;:::-;1226:48;;1020:260;;;;;:::o;1285:328::-;1362:6;1370;1378;1431:2;1419:9;1410:7;1406:23;1402:32;1399:52;;;1447:1;1444;1437:12;1399:52;1470:29;1489:9;1470:29;:::i;:::-;1460:39;;1518:38;1552:2;1541:9;1537:18;1518:38;:::i;:::-;1508:48;;1603:2;1592:9;1588:18;1575:32;1565:42;;1285:328;;;;;:::o;1618:666::-;1713:6;1721;1729;1737;1790:3;1778:9;1769:7;1765:23;1761:33;1758:53;;;1807:1;1804;1797:12;1758:53;1830:29;1849:9;1830:29;:::i;:::-;1820:39;;1878:38;1912:2;1901:9;1897:18;1878:38;:::i;:::-;1868:48;;1963:2;1952:9;1948:18;1935:32;1925:42;;2018:2;2007:9;2003:18;1990:32;-1:-1:-1;;;;;2037:6:1;2034:30;2031:50;;;2077:1;2074;2067:12;2031:50;2100:22;;2153:4;2145:13;;2141:27;-1:-1:-1;2131:55:1;;2182:1;2179;2172:12;2131:55;2205:73;2270:7;2265:2;2252:16;2247:2;2243;2239:11;2205:73;:::i;:::-;2195:83;;;1618:666;;;;;;;:::o;2289:347::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;;2533:2;2522:9;2518:18;2505:32;2580:5;2573:13;2566:21;2559:5;2556:32;2546:60;;2602:1;2599;2592:12;2546:60;2625:5;2615:15;;;2289:347;;;;;:::o;2641:254::-;2709:6;2717;2770:2;2758:9;2749:7;2745:23;2741:32;2738:52;;;2786:1;2783;2776:12;2738:52;2809:29;2828:9;2809:29;:::i;:::-;2799:39;2885:2;2870:18;;;;2857:32;;-1:-1:-1;;;2641:254:1:o;2900:908::-;2984:6;3015:2;3058;3046:9;3037:7;3033:23;3029:32;3026:52;;;3074:1;3071;3064:12;3026:52;3114:9;3101:23;-1:-1:-1;;;;;3139:6:1;3136:30;3133:50;;;3179:1;3176;3169:12;3133:50;3202:22;;3255:4;3247:13;;3243:27;-1:-1:-1;3233:55:1;;3284:1;3281;3274:12;3233:55;3320:2;3307:16;3343:60;3359:43;3399:2;3359:43;:::i;:::-;3343:60;:::i;:::-;3425:3;3449:2;3444:3;3437:15;3477:2;3472:3;3468:12;3461:19;;3508:2;3504;3500:11;3556:7;3551:2;3545;3542:1;3538:10;3534:2;3530:19;3526:28;3523:41;3520:61;;;3577:1;3574;3567:12;3520:61;3599:1;3590:10;;3609:169;3623:2;3620:1;3617:9;3609:169;;;3680:23;3699:3;3680:23;:::i;:::-;3668:36;;3641:1;3634:9;;;;;3724:12;;;;3756;;3609:169;;;-1:-1:-1;3797:5:1;2900:908;-1:-1:-1;;;;;;;2900:908:1:o;3813:245::-;3871:6;3924:2;3912:9;3903:7;3899:23;3895:32;3892:52;;;3940:1;3937;3930:12;3892:52;3979:9;3966:23;3998:30;4022:5;3998:30;:::i;4063:249::-;4132:6;4185:2;4173:9;4164:7;4160:23;4156:32;4153:52;;;4201:1;4198;4191:12;4153:52;4233:9;4227:16;4252:30;4276:5;4252:30;:::i;4317:322::-;4386:6;4439:2;4427:9;4418:7;4414:23;4410:32;4407:52;;;4455:1;4452;4445:12;4407:52;4495:9;4482:23;-1:-1:-1;;;;;4520:6:1;4517:30;4514:50;;;4560:1;4557;4550:12;4514:50;4583;4625:7;4616:6;4605:9;4601:22;4583:50;:::i;4644:390::-;4722:6;4730;4783:2;4771:9;4762:7;4758:23;4754:32;4751:52;;;4799:1;4796;4789:12;4751:52;4839:9;4826:23;-1:-1:-1;;;;;4864:6:1;4861:30;4858:50;;;4904:1;4901;4894:12;4858:50;4927;4969:7;4960:6;4949:9;4945:22;4927:50;:::i;:::-;4917:60;5024:2;5009:18;;;;4996:32;;-1:-1:-1;;;;4644:390:1:o;5039:180::-;5098:6;5151:2;5139:9;5130:7;5126:23;5122:32;5119:52;;;5167:1;5164;5157:12;5119:52;-1:-1:-1;5190:23:1;;5039:180;-1:-1:-1;5039:180:1:o;5224:1645::-;5340:6;5348;5401:2;5389:9;5380:7;5376:23;5372:32;5369:52;;;5417:1;5414;5407:12;5369:52;5453:9;5440:23;5430:33;;5482:2;5535;5524:9;5520:18;5507:32;-1:-1:-1;;;;;5599:2:1;5591:6;5588:14;5585:34;;;5615:1;5612;5605:12;5585:34;5653:6;5642:9;5638:22;5628:32;;5698:7;5691:4;5687:2;5683:13;5679:27;5669:55;;5720:1;5717;5710:12;5669:55;5756:2;5743:16;5779:60;5795:43;5835:2;5795:43;:::i;5779:60::-;5861:3;5885:2;5880:3;5873:15;5913:2;5908:3;5904:12;5897:19;;5944:2;5940;5936:11;5992:7;5987:2;5981;5978:1;5974:10;5970:2;5966:19;5962:28;5959:41;5956:61;;;6013:1;6010;6003:12;5956:61;6035:1;6045:794;6059:2;6056:1;6053:9;6045:794;;;6136:3;6123:17;6172:2;6159:11;6156:19;6153:39;;;6188:1;6185;6178:12;6153:39;6215:20;;6287:2;6259:16;;;-1:-1:-1;;6255:30:1;6251:39;6248:59;;;6303:1;6300;6293:12;6248:59;6333:22;;:::i;:::-;6405:2;6401;6397:11;6384:25;6438:2;6428:8;6425:16;6422:36;;;6454:1;6451;6444:12;6422:36;6485:54;6531:7;6526:2;6515:8;6511:2;6507:17;6503:26;6485:54;:::i;:::-;6478:5;6471:69;;6590:2;6586;6582:11;6569:25;6623:2;6613:8;6610:16;6607:36;;;6639:1;6636;6629:12;6607:36;6679:54;6725:7;6720:2;6709:8;6705:2;6701:17;6697:26;6679:54;:::i;:::-;6663:14;;;6656:78;-1:-1:-1;6747:18:1;;-1:-1:-1;6785:12:1;;;;6817;;;;6077:1;6070:9;6045:794;;;-1:-1:-1;5224:1645:1;;6858:5;;-1:-1:-1;5224:1645:1;-1:-1:-1;;;;;;;;5224:1645:1:o;6874:248::-;6942:6;6950;7003:2;6991:9;6982:7;6978:23;6974:32;6971:52;;;7019:1;7016;7009:12;6971:52;-1:-1:-1;;7042:23:1;;;7112:2;7097:18;;;7084:32;;-1:-1:-1;6874:248:1:o;7127:257::-;7168:3;7206:5;7200:12;7233:6;7228:3;7221:19;7249:63;7305:6;7298:4;7293:3;7289:14;7282:4;7275:5;7271:16;7249:63;:::i;:::-;7366:2;7345:15;-1:-1:-1;;7341:29:1;7332:39;;;;7373:4;7328:50;;7127:257;-1:-1:-1;;7127:257:1:o;7389:973::-;7474:12;;7439:3;;7529:1;7549:18;;;;7602;;;;7629:61;;7683:4;7675:6;7671:17;7661:27;;7629:61;7709:2;7757;7749:6;7746:14;7726:18;7723:38;7720:161;;;7803:10;7798:3;7794:20;7791:1;7784:31;7838:4;7835:1;7828:15;7866:4;7863:1;7856:15;7720:161;7897:18;7924:104;;;;8042:1;8037:319;;;;7890:466;;7924:104;-1:-1:-1;;7957:24:1;;7945:37;;8002:16;;;;-1:-1:-1;7924:104:1;;8037:319;46805:1;46798:14;;;46842:4;46829:18;;8131:1;8145:165;8159:6;8156:1;8153:13;8145:165;;;8237:14;;8224:11;;;8217:35;8280:16;;;;8174:10;;8145:165;;;8149:3;;8339:6;8334:3;8330:16;8323:23;;7890:466;;;;;;;7389:973;;;;:::o;8367:276::-;8498:3;8536:6;8530:13;8552:53;8598:6;8593:3;8586:4;8578:6;8574:17;8552:53;:::i;:::-;8621:16;;;;;8367:276;-1:-1:-1;;8367:276:1:o;8648:470::-;8827:3;8865:6;8859:13;8881:53;8927:6;8922:3;8915:4;8907:6;8903:17;8881:53;:::i;:::-;8997:13;;8956:16;;;;9019:57;8997:13;8956:16;9053:4;9041:17;;9019:57;:::i;:::-;9092:20;;8648:470;-1:-1:-1;;;;8648:470:1:o;9123:614::-;9403:3;9441:6;9435:13;9457:53;9503:6;9498:3;9491:4;9483:6;9479:17;9457:53;:::i;:::-;-1:-1:-1;;;9532:16:1;;;9557:18;;;9600:13;;9622:65;9600:13;9674:1;9663:13;;9656:4;9644:17;;9622:65;:::i;:::-;9707:20;9729:1;9703:28;;9123:614;-1:-1:-1;;;;9123:614:1:o;9742:439::-;9974:3;10012:6;10006:13;10028:53;10074:6;10069:3;10062:4;10054:6;10050:17;10028:53;:::i;:::-;-1:-1:-1;;;10103:16:1;;10128:18;;;-1:-1:-1;10173:1:1;10162:13;;9742:439;-1:-1:-1;9742:439:1:o;10186:19123::-;10418:3;10456:6;10450:13;10472:53;10518:6;10513:3;10506:4;10498:6;10494:17;10472:53;:::i;:::-;10586:34;10547:16;;10572:49;;;-1:-1:-1;10655:34:1;10648:4;10637:16;;10630:60;10722:34;10717:2;10706:14;;10699:58;10789:34;10784:2;10773:14;;10766:58;10857:34;10851:3;10840:15;;10833:59;10925:34;10919:3;10908:15;;10901:59;10993:34;10987:3;10976:15;;10969:59;11061:34;11055:3;11044:15;;11037:59;11129:34;11123:3;11112:15;;11105:59;11197:34;11191:3;11180:15;;11173:59;11265:34;11259:3;11248:15;;11241:59;11333:34;11327:3;11316:15;;11309:59;11401:34;11395:3;11384:15;;11377:59;11469:34;11463:3;11452:15;;11445:59;11537:34;11531:3;11520:15;;11513:59;11605:34;11599:3;11588:15;;11581:59;11673:34;11667:3;11656:15;;11649:59;11741:34;11735:3;11724:15;;11717:59;11809:34;11803:3;11792:15;;11785:59;11877:34;11871:3;11860:15;;11853:59;11945:34;11939:3;11928:15;;11921:59;12013:34;12007:3;11996:15;;11989:59;12081:34;12075:3;12064:15;;12057:59;12149:34;12143:3;12132:15;;12125:59;12217:34;12211:3;12200:15;;12193:59;12285:34;12279:3;12268:15;;12261:59;12353:34;12347:3;12336:15;;12329:59;12421:34;12415:3;12404:15;;12397:59;12489:34;12483:3;12472:15;;12465:59;12557:34;12551:3;12540:15;;12533:59;12625:34;12619:3;12608:15;;12601:59;12693:34;12687:3;12676:15;;12669:59;12762:34;12755:4;12744:16;;12737:60;12831:34;12824:4;12813:16;;12806:60;12900:34;12893:4;12882:16;;12875:60;12969:34;12962:4;12951:16;;12944:60;13038:34;13031:4;13020:16;;13013:60;13107:34;13100:4;13089:16;;13082:60;13176:34;13169:4;13158:16;;13151:60;13245:34;13238:4;13227:16;;13220:60;13314:34;13307:4;13296:16;;13289:60;13383:34;13376:4;13365:16;;13358:60;13452:34;13445:4;13434:16;;13427:60;13521:34;13514:4;13503:16;;13496:60;13590:34;13583:4;13572:16;;13565:60;13659:34;13652:4;13641:16;;13634:60;13728:34;13721:4;13710:16;;13703:60;13797:34;13790:4;13779:16;;13772:60;13866:34;13859:4;13848:16;;13841:60;13935:34;13928:4;13917:16;;13910:60;14004:34;13997:4;13986:16;;13979:60;14073:34;14066:4;14055:16;;14048:60;14142:34;14135:4;14124:16;;14117:60;14211:34;14204:4;14193:16;;14186:60;14280:34;14273:4;14262:16;;14255:60;14349:34;14342:4;14331:16;;14324:60;14418:34;14411:4;14400:16;;14393:60;14487:34;14480:4;14469:16;;14462:60;14556:34;14549:4;14538:16;;14531:60;14625:34;14618:4;14607:16;;14600:60;14694:34;14687:4;14676:16;;14669:60;14763:34;14756:4;14745:16;;14738:60;14832:34;14825:4;14814:16;;14807:60;14901:34;14894:4;14883:16;;14876:60;14970:34;14963:4;14952:16;;14945:60;15039:34;15032:4;15021:16;;15014:60;15108:34;15101:4;15090:16;;15083:60;15177:34;15170:4;15159:16;;15152:60;15246:34;15239:4;15228:16;;15221:60;15315:34;15308:4;15297:16;;15290:60;15384:34;15377:4;15366:16;;15359:60;15453:34;15446:4;15435:16;;15428:60;15522:34;15515:4;15504:16;;15497:60;15591:34;15584:4;15573:16;;15566:60;15660:34;15653:4;15642:16;;15635:60;15729:34;15722:4;15711:16;;15704:60;15798:34;15791:4;15780:16;;15773:60;15867:34;15860:4;15849:16;;15842:60;15936:34;15929:4;15918:16;;15911:60;16005:34;15998:4;15987:16;;15980:60;16074:34;16067:4;16056:16;;16049:60;16143:34;16136:4;16125:16;;16118:60;16212:34;16205:4;16194:16;;16187:60;16281:34;16274:4;16263:16;;16256:60;16350:34;16343:4;16332:16;;16325:60;16419:34;16412:4;16401:16;;16394:60;16488:34;16481:4;16470:16;;16463:60;16557:34;16550:4;16539:16;;16532:60;16626:34;16619:4;16608:16;;16601:60;16695:34;16688:4;16677:16;;16670:60;16764:34;16757:4;16746:16;;16739:60;16833:34;16826:4;16815:16;;16808:60;16902:34;16895:4;16884:16;;16877:60;16971:34;16964:4;16953:16;;16946:60;17040:34;17033:4;17022:16;;17015:60;17109:34;17102:4;17091:16;;17084:60;17178:34;17171:4;17160:16;;17153:60;17247:34;17240:4;17229:16;;17222:60;17316:34;17309:4;17298:16;;17291:60;17385:34;17378:4;17367:16;;17360:60;17454:34;17447:4;17436:16;;17429:60;17523:34;17516:4;17505:16;;17498:60;17592:34;17585:4;17574:16;;17567:60;17661:34;17654:4;17643:16;;17636:60;17730:34;17723:4;17712:16;;17705:60;17799:34;17792:4;17781:16;;17774:60;17868:34;17861:4;17850:16;;17843:60;17937:34;17930:4;17919:16;;17912:60;18006:34;17999:4;17988:16;;17981:60;18075:34;18068:4;18057:16;;18050:60;18144:34;18137:4;18126:16;;18119:60;18213:34;18206:4;18195:16;;18188:60;18282:34;18275:4;18264:16;;18257:60;18351:34;18344:4;18333:16;;18326:60;18420:34;18413:4;18402:16;;18395:60;18489:34;18482:4;18471:16;;18464:60;18558:34;18551:4;18540:16;;18533:60;18627:34;18620:4;18609:16;;18602:60;18696:34;18689:4;18678:16;;18671:60;18765:34;18758:4;18747:16;;18740:60;18834:34;18827:4;18816:16;;18809:60;18903:34;18896:4;18885:16;;18878:60;18972:34;18965:4;18954:16;;18947:60;19041:34;19034:4;19023:16;;19016:60;19110:34;19103:4;19092:16;;19085:60;19179:34;19172:4;19161:16;;19154:60;19248:34;19241:4;19230:16;;19223:60;19317:34;19310:4;19299:16;;19292:60;19386:34;19379:4;19368:16;;19361:60;19455:34;19448:4;19437:16;;19430:60;19524:34;19517:4;19506:16;;19499:60;19593:34;19586:4;19575:16;;19568:60;19662:34;19655:4;19644:16;;19637:60;19731:34;19724:4;19713:16;;19706:60;19800:34;19793:4;19782:16;;19775:60;19869:34;19862:4;19851:16;;19844:60;19938:34;19931:4;19920:16;;19913:60;20007:34;20000:4;19989:16;;19982:60;20076:34;20069:4;20058:16;;20051:60;20145:34;20138:4;20127:16;;20120:60;20214:34;20207:4;20196:16;;20189:60;20283:34;20276:4;20265:16;;20258:60;20352:34;20345:4;20334:16;;20327:60;20421:34;20414:4;20403:16;;20396:60;20490:34;20483:4;20472:16;;20465:60;20559:34;20552:4;20541:16;;20534:60;20628:34;20621:4;20610:16;;20603:60;20697:34;20690:4;20679:16;;20672:60;20766:34;20759:4;20748:16;;20741:60;20835:34;20828:4;20817:16;;20810:60;20904:34;20897:4;20886:16;;20879:60;20973:34;20966:4;20955:16;;20948:60;21042:34;21035:4;21024:16;;21017:60;21111:34;21104:4;21093:16;;21086:60;21180:34;21173:4;21162:16;;21155:60;21249:34;21242:4;21231:16;;21224:60;21318:34;21311:4;21300:16;;21293:60;21387:34;21380:4;21369:16;;21362:60;21456:34;21449:4;21438:16;;21431:60;21525:34;21518:4;21507:16;;21500:60;21594:34;21587:4;21576:16;;21569:60;21663:34;21656:4;21645:16;;21638:60;21732:34;21725:4;21714:16;;21707:60;21801:34;21794:4;21783:16;;21776:60;21870:34;21863:4;21852:16;;21845:60;21939:34;21932:4;21921:16;;21914:60;22008:34;22001:4;21990:16;;21983:60;22077:34;22070:4;22059:16;;22052:60;22146:34;22139:4;22128:16;;22121:60;22215:34;22208:4;22197:16;;22190:60;22284:34;22277:4;22266:16;;22259:60;22353:34;22346:4;22335:16;;22328:60;22422:34;22415:4;22404:16;;22397:60;22491:34;22484:4;22473:16;;22466:60;22560:34;22553:4;22542:16;;22535:60;22629:34;22622:4;22611:16;;22604:60;22698:34;22691:4;22680:16;;22673:60;22767:34;22760:4;22749:16;;22742:60;22836:34;22829:4;22818:16;;22811:60;22905:34;22898:4;22887:16;;22880:60;22974:34;22967:4;22956:16;;22949:60;23043:34;23036:4;23025:16;;23018:60;23112:34;23105:4;23094:16;;23087:60;23181:34;23174:4;23163:16;;23156:60;23250:34;23243:4;23232:16;;23225:60;23319:34;23312:4;23301:16;;23294:60;23388:34;23381:4;23370:16;;23363:60;23457:34;23450:4;23439:16;;23432:60;23526:34;23519:4;23508:16;;23501:60;23595:34;23588:4;23577:16;;23570:60;23664:34;23657:4;23646:16;;23639:60;23733:34;23726:4;23715:16;;23708:60;23802:34;23795:4;23784:16;;23777:60;23871:34;23864:4;23853:16;;23846:60;23940:34;23933:4;23922:16;;23915:60;24009:34;24002:4;23991:16;;23984:60;24078:34;24071:4;24060:16;;24053:60;24147:34;24140:4;24129:16;;24122:60;24216:34;24209:4;24198:16;;24191:60;24285:34;24278:4;24267:16;;24260:60;24354:34;24347:4;24336:16;;24329:60;24423:34;24416:4;24405:16;;24398:60;24492:34;24485:4;24474:16;;24467:60;24561:34;24554:4;24543:16;;24536:60;24630:34;24623:4;24612:16;;24605:60;24699:34;24692:4;24681:16;;24674:60;24768:34;24761:4;24750:16;;24743:60;24837:34;24830:4;24819:16;;24812:60;24906:34;24899:4;24888:16;;24881:60;24975:34;24968:4;24957:16;;24950:60;25044:34;25037:4;25026:16;;25019:60;25113:34;25106:4;25095:16;;25088:60;25182:34;25175:4;25164:16;;25157:60;25251:34;25244:4;25233:16;;25226:60;25320:34;25313:4;25302:16;;25295:60;25389:34;25382:4;25371:16;;25364:60;25458:34;25451:4;25440:16;;25433:60;25527:34;25520:4;25509:16;;25502:60;25596:34;25589:4;25578:16;;25571:60;25665:34;25658:4;25647:16;;25640:60;25734:34;25727:4;25716:16;;25709:60;25803:34;25796:4;25785:16;;25778:60;25872:34;25865:4;25854:16;;25847:60;25941:34;25934:4;25923:16;;25916:60;26010:34;26003:4;25992:16;;25985:60;26079:34;26072:4;26061:16;;26054:60;26148:34;26141:4;26130:16;;26123:60;26217:34;26210:4;26199:16;;26192:60;26286:34;26279:4;26268:16;;26261:60;26355:34;26348:4;26337:16;;26330:60;26424:34;26417:4;26406:16;;26399:60;26493:34;26486:4;26475:16;;26468:60;26562:34;26555:4;26544:16;;26537:60;26631:34;26624:4;26613:16;;26606:60;26700:34;26693:4;26682:16;;26675:60;26769:34;26762:4;26751:16;;26744:60;26838:34;26831:4;26820:16;;26813:60;26907:34;26900:4;26889:16;;26882:60;26976:34;26969:4;26958:16;;26951:60;27045:34;27038:4;27027:16;;27020:60;27114:34;27107:4;27096:16;;27089:60;27183:34;27176:4;27165:16;;27158:60;27252:34;27245:4;27234:16;;27227:60;27321:34;27314:4;27303:16;;27296:60;27390:34;27383:4;27372:16;;27365:60;27459:34;27452:4;27441:16;;27434:60;27528:34;27521:4;27510:16;;27503:60;27597:34;27590:4;27579:16;;27572:60;27666:34;27659:4;27648:16;;27641:60;27735:34;27728:4;27717:16;;27710:60;27804:34;27797:4;27786:16;;27779:60;27873:34;27866:4;27855:16;;27848:60;27942:34;27935:4;27924:16;;27917:60;28011:34;28004:4;27993:16;;27986:60;28080:34;28073:4;28062:16;;28055:60;28149:34;28142:4;28131:16;;28124:60;28218:34;28211:4;28200:16;;28193:60;28287:34;28280:4;28269:16;;28262:60;28356:34;28349:4;28338:16;;28331:60;28425:34;28418:4;28407:16;;28400:60;28494:34;28487:4;28476:16;;28469:60;28563:34;28556:4;28545:16;;28538:60;28632:34;28625:4;28614:16;;28607:60;28701:34;28694:4;28683:16;;28676:60;28770:34;28763:4;28752:16;;28745:60;28839:34;28832:4;28821:16;;28814:60;28908:34;28901:4;28890:16;;28883:60;28977:34;28970:4;28959:16;;28952:60;29046:34;29039:4;29028:16;;29021:60;29115:34;29108:4;29097:16;;29090:60;29184:34;29177:4;29166:16;;29159:60;-1:-1:-1;;;29246:4:1;29235:16;;29228:43;29298:4;29287:16;;10186:19123;-1:-1:-1;10186:19123:1:o;29314:992::-;29838:3;29876:6;29870:13;29892:53;29938:6;29933:3;29926:4;29918:6;29914:17;29892:53;:::i;:::-;-1:-1:-1;;;29967:16:1;;;29992:57;;;30068:49;30113:2;30102:14;;30094:6;30068:49;:::i;:::-;-1:-1:-1;;;30126:46:1;;30058:59;-1:-1:-1;30191:46:1;30233:2;30225:11;;30217:6;30191:46;:::i;:::-;-1:-1:-1;;;30246:28:1;;30298:1;30290:10;;29314:992;-1:-1:-1;;;;;;29314:992:1:o;30311:990::-;30835:3;30873:6;30867:13;30889:53;30935:6;30930:3;30923:4;30915:6;30911:17;30889:53;:::i;:::-;-1:-1:-1;;;30964:16:1;;;30989:57;;;31065:49;31110:2;31099:14;;31091:6;31065:49;:::i;:::-;-1:-1:-1;;;31123:46:1;;31055:59;-1:-1:-1;31188:46:1;31230:2;31222:11;;31214:6;31188:46;:::i;:::-;-1:-1:-1;;;31243:26:1;;31293:1;31285:10;;30311:990;-1:-1:-1;;;;;;30311:990:1:o;31306:197::-;31434:3;31459:38;31493:3;31485:6;31459:38;:::i;31508:1542::-;32211:34;32206:3;32199:47;-1:-1:-1;;;32271:2:1;32266:3;32262:12;32255:48;32181:3;32322:47;32365:2;32360:3;32356:12;32348:6;32322:47;:::i;:::-;-1:-1:-1;;;32385:2:1;32378:35;32432:46;32474:2;32470;32466:11;32458:6;32432:46;:::i;:::-;32422:56;;32498:34;32494:2;32487:46;32562:34;32557:2;32553;32549:11;32542:55;32626:34;32621:2;32617;32613:11;32606:55;-1:-1:-1;;;32685:2:1;32681;32677:11;32670:31;32730:6;32724:13;32746:60;32799:6;32793:3;32789:2;32785:12;32780:2;32772:6;32768:15;32746:60;:::i;:::-;-1:-1:-1;;;32864:3:1;32825:15;;;;32856:12;;;32849:43;32917:13;;32939:62;32917:13;32986:3;32978:12;;32973:2;32961:15;;32939:62;:::i;:::-;33021:17;33040:3;33017:27;;31508:1542;-1:-1:-1;;;;;;31508:1542:1:o;33055:572::-;-1:-1:-1;;;33413:3:1;33406:16;33388:3;33451:6;33445:13;33467:61;33521:6;33517:1;33512:3;33508:11;33501:4;33493:6;33489:17;33467:61;:::i;:::-;-1:-1:-1;;;33587:1:1;33547:16;;;;33579:10;;;33572:23;-1:-1:-1;33619:1:1;33611:10;;33055:572;-1:-1:-1;33055:572:1:o;33632:448::-;33894:31;33889:3;33882:44;33864:3;33955:6;33949:13;33971:62;34026:6;34021:2;34016:3;34012:12;34005:4;33997:6;33993:17;33971:62;:::i;:::-;34053:16;;;;34071:2;34049:25;;33632:448;-1:-1:-1;;33632:448:1:o;34085:2123::-;-1:-1:-1;;;35021:66:1;;35110:13;;35003:3;;35132:62;35110:13;35182:2;35173:12;;35166:4;35154:17;;35132:62;:::i;:::-;35254:13;;35213:16;;;;35276:63;35254:13;35325:2;35317:11;;35310:4;35298:17;;35276:63;:::i;:::-;-1:-1:-1;;;35399:2:1;35358:17;;;;35391:11;;;35384:69;35472:46;35514:2;35506:11;;35498:6;35472:46;:::i;:::-;35462:56;;35549:6;35543:13;35565:54;35610:8;35606:2;35599:4;35591:6;35587:17;35565:54;:::i;:::-;-1:-1:-1;;;35641:17:1;;35667:49;;;35735;35780:2;35769:14;;35761:6;35735:49;:::i;:::-;35725:59;;35815:6;35809:13;35831:54;35876:8;35872:2;35865:4;35857:6;35853:17;35831:54;:::i;:::-;-1:-1:-1;;;35907:17:1;;35933:57;;;36015:13;;36037:66;36015:13;36089:2;36078:14;;36071:4;36059:17;;36037:66;:::i;:::-;-1:-1:-1;;;36166:2:1;36122:20;;;;36158:11;;;36151:24;36199:2;36191:11;;34085:2123;-1:-1:-1;;;;;;;;;34085:2123:1:o;36983:488::-;-1:-1:-1;;;;;37252:15:1;;;37234:34;;37304:15;;37299:2;37284:18;;37277:43;37351:2;37336:18;;37329:34;;;37399:3;37394:2;37379:18;;37372:31;;;37177:4;;37420:45;;37445:19;;37437:6;37420:45;:::i;:::-;37412:53;36983:488;-1:-1:-1;;;;;;36983:488:1:o;37668:219::-;37817:2;37806:9;37799:21;37780:4;37837:44;37877:2;37866:9;37862:18;37854:6;37837:44;:::i;37892:381::-;38089:2;38078:9;38071:21;38052:4;38115:44;38155:2;38144:9;38140:18;38132:6;38115:44;:::i;:::-;38207:9;38199:6;38195:22;38190:2;38179:9;38175:18;38168:50;38235:32;38260:6;38252;38235:32;:::i;:::-;38227:40;37892:381;-1:-1:-1;;;;;37892:381:1:o;38690:414::-;38892:2;38874:21;;;38931:2;38911:18;;;38904:30;38970:34;38965:2;38950:18;;38943:62;-1:-1:-1;;;39036:2:1;39021:18;;39014:48;39094:3;39079:19;;38690:414::o;43473:356::-;43675:2;43657:21;;;43694:18;;;43687:30;43753:34;43748:2;43733:18;;43726:62;43820:2;43805:18;;43473:356::o;44646:413::-;44848:2;44830:21;;;44887:2;44867:18;;;44860:30;44926:34;44921:2;44906:18;;44899:62;-1:-1:-1;;;44992:2:1;44977:18;;44970:47;45049:3;45034:19;;44646:413::o;46008:251::-;46080:2;46074:9;;;46110:15;;-1:-1:-1;;;;;46140:34:1;;46176:22;;;46137:62;46134:88;;;46202:18;;:::i;:::-;46238:2;46231:22;46008:251;:::o;46264:275::-;46335:2;46329:9;46400:2;46381:13;;-1:-1:-1;;46377:27:1;46365:40;;-1:-1:-1;;;;;46420:34:1;;46456:22;;;46417:62;46414:88;;;46482:18;;:::i;:::-;46518:2;46511:22;46264:275;;-1:-1:-1;46264:275:1:o;46544:183::-;46604:4;-1:-1:-1;;;;;46629:6:1;46626:30;46623:56;;;46659:18;;:::i;:::-;-1:-1:-1;46704:1:1;46700:14;46716:4;46696:25;;46544:183::o;46858:224::-;46897:3;46925:6;46958:2;46955:1;46951:10;46988:2;46985:1;46981:10;47019:3;47015:2;47011:12;47006:3;47003:21;47000:47;;;47027:18;;:::i;47087:128::-;47127:3;47158:1;47154:6;47151:1;47148:13;47145:39;;;47164:18;;:::i;:::-;-1:-1:-1;47200:9:1;;47087:128::o;47220:204::-;47258:3;47294:4;47291:1;47287:12;47326:4;47323:1;47319:12;47361:3;47355:4;47351:14;47346:3;47343:23;47340:49;;;47369:18;;:::i;:::-;47405:13;;47220:204;-1:-1:-1;;;47220:204:1:o;47429:120::-;47469:1;47495;47485:35;;47500:18;;:::i;:::-;-1:-1:-1;47534:9:1;;47429:120::o;47554:168::-;47594:7;47660:1;47656;47652:6;47648:14;47645:1;47642:21;47637:1;47630:9;47623:17;47619:45;47616:71;;;47667:18;;:::i;:::-;-1:-1:-1;47707:9:1;;47554:168::o;47727:238::-;47765:7;47805:4;47802:1;47798:12;47837:4;47834:1;47830:12;47897:3;47891:4;47887:14;47882:3;47879:23;47872:3;47865:11;47858:19;47854:49;47851:75;;;47906:18;;:::i;:::-;47946:13;;47727:238;-1:-1:-1;;;47727:238:1:o;47970:125::-;48010:4;48038:1;48035;48032:8;48029:34;;;48043:18;;:::i;:::-;-1:-1:-1;48080:9:1;;47970:125::o;48100:195::-;48138:4;48175;48172:1;48168:12;48207:4;48204:1;48200:12;48232:3;48227;48224:12;48221:38;;;48239:18;;:::i;:::-;48276:13;;;48100:195;-1:-1:-1;;;48100:195:1:o;48300:258::-;48372:1;48382:113;48396:6;48393:1;48390:13;48382:113;;;48472:11;;;48466:18;48453:11;;;48446:39;48418:2;48411:10;48382:113;;;48513:6;48510:1;48507:13;48504:48;;;-1:-1:-1;;48548:1:1;48530:16;;48523:27;48300:258::o;48563:380::-;48642:1;48638:12;;;;48685;;;48706:61;;48760:4;48752:6;48748:17;48738:27;;48706:61;48813:2;48805:6;48802:14;48782:18;48779:38;48776:161;;;48859:10;48854:3;48850:20;48847:1;48840:31;48894:4;48891:1;48884:15;48922:4;48919:1;48912:15;48776:161;;48563:380;;;:::o;48948:135::-;48987:3;-1:-1:-1;;49008:17:1;;49005:43;;;49028:18;;:::i;:::-;-1:-1:-1;49075:1:1;49064:13;;48948:135::o;49088:175::-;49125:3;49169:4;49162:5;49158:16;49198:4;49189:7;49186:17;49183:43;;;49206:18;;:::i;:::-;49255:1;49242:15;;49088:175;-1:-1:-1;;49088:175:1:o;49268:112::-;49300:1;49326;49316:35;;49331:18;;:::i;:::-;-1:-1:-1;49365:9:1;;49268:112::o;49385:127::-;49446:10;49441:3;49437:20;49434:1;49427:31;49477:4;49474:1;49467:15;49501:4;49498:1;49491:15;49517:127;49578:10;49573:3;49569:20;49566:1;49559:31;49609:4;49606:1;49599:15;49633:4;49630:1;49623:15;49649:127;49710:10;49705:3;49701:20;49698:1;49691:31;49741:4;49738:1;49731:15;49765:4;49762:1;49755:15;49781:127;49842:10;49837:3;49833:20;49830:1;49823:31;49873:4;49870:1;49863:15;49897:4;49894:1;49887:15;49913:127;49974:10;49969:3;49965:20;49962:1;49955:31;50005:4;50002:1;49995:15;50029:4;50026:1;50019:15;50045:131;-1:-1:-1;;;;;;50119:32:1;;50109:43;;50099:71;;50166:1;50163;50156:12

Swarm Source

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