ETH Price: $3,414.46 (+1.70%)

Token

TikTok Top Moments (TIKTOK)
 

Overview

Max Total Supply

0 TIKTOK

Holders

13

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
juicetra.eth
Balance
1 TIKTOK
0x45f6E731798684B1Cf9D980777c9d636E1064ffc
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:
TopMoments

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @imtbl/imx-contracts/contracts/IMintable.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface IMintable {
    function mintFor(
        address to,
        uint256 id,
        bytes calldata blueprint
    ) external;
}

// 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/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/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/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/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/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/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/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/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: contracts/interfaces/IERC2981Royalties.sol

pragma solidity ^0.8.0;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

// File: contracts/ERC2981Royalties.sol

pragma solidity ^0.8.0;



abstract contract ERC2981Royalties is ERC165, IERC2981Royalties {
    struct Royalty {
        address recipient;
        uint256 value;
    }

    mapping(uint256 => Royalty) internal _royalties;

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @dev Sets token royalties
    /// @param id the token id fir which we register the royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setTokenRoyalty(
        uint256 id,
        address recipient,
        uint256 value
    ) internal {
        require(value <= 10000, "ERC2981Royalties: Too high");

        _royalties[id] = Royalty(recipient, value);
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256 tokenId, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        Royalty memory royalty = _royalties[tokenId];
        return (royalty.recipient, (value * royalty.value) / 10000);
    }
}

// File: contracts/utils/Bytes.sol

pragma solidity ^0.8.4;

library Bytes {
    /**
     * @dev Converts a `uint256` to a `string`.
     * via OraclizeAPI - MIT licence
     * https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
     */
    function fromUint(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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + (temp % 10)));
            temp /= 10;
        }
        return string(buffer);
    }

    bytes constant alphabet = "0123456789abcdef";

    /**
     * Index Of
     *
     * Locates and returns the position of a character within a string starting
     * from a defined offset
     *
     * @param _base When being used for a data type this is the extended object
     *              otherwise this is the string acting as the haystack to be
     *              searched
     * @param _value The needle to search for, at present this is currently
     *               limited to one character
     * @param _offset The starting point to start searching from which can start
     *                from 0, but must not exceed the length of the string
     * @return int The position of the needle starting from 0 and returning -1
     *             in the case of no matches found
     */
    function indexOf(
        bytes memory _base,
        string memory _value,
        uint256 _offset
    ) internal pure returns (int256) {
        bytes memory _valueBytes = bytes(_value);

        assert(_valueBytes.length == 1);

        for (uint256 i = _offset; i < _base.length; i++) {
            if (_base[i] == _valueBytes[0]) {
                return int256(i);
            }
        }

        return -1;
    }

    function toUint(bytes memory b) internal pure returns (uint256) {
        uint256 result = 0;
        for (uint256 i = 0; i < b.length; i++) {
            uint256 val = uint256(uint8(b[i]));
            if (val >= 48 && val <= 57) {
                result = result * 10 + (val - 48);
            }
        }
        return result;
    }

    function _toAddress (bytes memory b) internal pure returns (address) {
        uint256 result = 0;
        for (uint256 i = 0; i < b.length; i++) {
            uint256 c = uint256(uint8(b[i]));
            if (c >= 48 && c <= 57) {
                result = result * 16 + (c - 48);
            }
            if(c >= 65 && c<= 90) {
                result = result * 16 + (c - 55);
            }
            if(c >= 97 && c<= 122) {
                result = result * 16 + (c - 87);
            }
        }
        return address(uint160(result));
    }
}

// File: contracts/utils/Minting.sol

pragma solidity ^0.8.4;


library Minting {
    function split(bytes calldata blob)
        internal
        pure
        returns (
            uint256,
            address,
            uint256
        )
    {
        int256 index = Bytes.indexOf(blob, ":", 0);
        require(index >= 0, "Separator must exist");
        // Trim the { and } from the parameters
        uint256 tokenID = Bytes.toUint(blob[1:uint256(index) - 1]);
        uint256 blueprintLength = blob.length - uint256(index) - 3;
        if (blueprintLength == 0) {
            return (tokenID, address(0), 0);
        }
        bytes calldata blueprint = blob[uint256(index) + 2:blob.length - 1];

        // Split blueprint into royalty recipient and royalty percentage
        int256 blueprintIndex = Bytes.indexOf(blueprint, ",", 0);
        require(blueprintIndex >= 0, "Blueprint separator must exist");
        address royaltyRecipient = Bytes._toAddress(
            blueprint[0:uint256(blueprintIndex)]
        );
        uint256 royaltyPercentage = Bytes.toUint(
            blueprint[uint256(blueprintIndex) + 1:blueprint.length]
        );
        return (tokenID, royaltyRecipient, royaltyPercentage);
    }
}

// File: contracts/TopMoments.sol

pragma solidity ^0.8.0;






contract TopMoments is ERC721, ERC2981Royalties, Ownable, IMintable {
    // Base URI to be concatenated with token ID when calling tokenURI()
    string private _baseURIstring;
    // Address of Immutable X
    address public imx;
    // Whether each token is currently controlled by the contract administrator
    mapping(uint256 => bool) public adminControlled;
    // Whether each token can be locked by the contract administrator
    mapping(uint256 => bool) public adminLockable;

    constructor(
        address _owner,
        string memory _name,
        string memory _symbol,
        address _imx,
        string memory baseURI
    ) ERC721(_name, _symbol) {
        _baseURIstring = baseURI;
        imx = _imx;
        require(_owner != address(0), "Owner must not be empty");
        transferOwnership(_owner);
    }

    modifier onlyIMX() {
        require(msg.sender == imx, "Function can only be called by IMX");
        _;
    }

    function mintFor(
        address user,
        uint256 quantity,
        bytes calldata mintingBlob
    ) external override onlyIMX {
        require(quantity == 1, "Mintable: invalid quantity");
        (
            uint256 tokenId,
            address royaltyRecipient,
            uint256 royaltyPercentage
        ) = Minting.split(mintingBlob);
        _mint(tokenId, user, royaltyRecipient, royaltyPercentage);
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC2981Royalties)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function _mint(
        uint256 tokenId,
        address recipient,
        address royaltyRecipient,
        uint256 royaltyPercentage
    ) internal {
        _safeMint(recipient, tokenId);
        if (royaltyPercentage > 0) {
            _setTokenRoyalty(tokenId, royaltyRecipient, royaltyPercentage);
        }
    }

    // Minting on L1
    function mintNFT(
        uint256 tokenId,
        address recipient,
        address royaltyRecipient,
        uint256 royaltyPercentage,
        bool lockable
    ) external onlyOwner {
        _mint(tokenId, recipient, royaltyRecipient, royaltyPercentage);
        adminLockable[tokenId] = lockable;
    }

    // set token royalty details
    function setTokenRoyalty(
        uint256 id,
        address recipient,
        uint256 value
    ) external onlyOwner {
        _setTokenRoyalty(id, recipient, value);
    }

    // Set the base URI
    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseURIstring = baseURI;
    }

    // Override _baseURI function to return _baseURIstring
    function _baseURI() internal view override returns (string memory) {
        return _baseURIstring;
    }

    function setAdminControl(uint256 tokenId, bool controlled) external onlyOwner {
        require(adminLockable[tokenId], "NFT cannot be locked");
        adminControlled[tokenId] = controlled;
    }

    function removeAdminLock(uint256 tokenId) external onlyOwner {
        adminControlled[tokenId] = false;
        adminLockable[tokenId] = false;
    }

    // override so the contract owner can transfer adminControlled tokens
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        override
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address tokenOwner = ERC721.ownerOf(tokenId);
        return (spender == tokenOwner ||
            getApproved(tokenId) == spender ||
            ERC721.isApprovedForAll(tokenOwner, spender) ||
            (adminControlled[tokenId] && spender == owner()));
    }

    // override so that only the contract owner can transfer admin controlled tokens
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override {
        if ((adminControlled[tokenId] && msg.sender == owner()) || (!adminControlled[tokenId])) {
            super._transfer(from, to, tokenId);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_imx","type":"address"},{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminControlled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminLockable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"mintingBlob","type":"bytes"}],"name":"mintFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyPercentage","type":"uint256"},{"internalType":"bool","name":"lockable","type":"bool"}],"name":"mintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"removeAdminLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"controlled","type":"bool"}],"name":"setAdminControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]

60806040523480156200001157600080fd5b5060405162004beb38038062004beb8339818101604052810190620000379190620004bd565b838381600090805190602001906200005192919062000384565b5080600190805190602001906200006a92919062000384565b5050506200008d620000816200017660201b60201c565b6200017e60201b60201c565b8060089080519060200190620000a592919062000384565b5081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200015a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001519062000621565b60405180910390fd5b6200016b856200024460201b60201c565b5050505050620008d5565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002546200017660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200027a6200035a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002d3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002ca9062000643565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000346576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033d90620005ff565b60405180910390fd5b62000357816200017e60201b60201c565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000392906200073f565b90600052602060002090601f016020900481019282620003b6576000855562000402565b82601f10620003d157805160ff191683800117855562000402565b8280016001018555821562000402579182015b8281111562000401578251825591602001919060010190620003e4565b5b50905062000411919062000415565b5090565b5b808211156200043057600081600090555060010162000416565b5090565b60006200044b62000445846200068e565b62000665565b9050828152602081018484840111156200046457600080fd5b6200047184828562000709565b509392505050565b6000815190506200048a81620008bb565b92915050565b600082601f830112620004a257600080fd5b8151620004b484826020860162000434565b91505092915050565b600080600080600060a08688031215620004d657600080fd5b6000620004e68882890162000479565b955050602086015167ffffffffffffffff8111156200050457600080fd5b620005128882890162000490565b945050604086015167ffffffffffffffff8111156200053057600080fd5b6200053e8882890162000490565b9350506060620005518882890162000479565b925050608086015167ffffffffffffffff8111156200056f57600080fd5b6200057d8882890162000490565b9150509295509295909350565b600062000599602683620006c4565b9150620005a6826200081a565b604082019050919050565b6000620005c0601783620006c4565b9150620005cd8262000869565b602082019050919050565b6000620005e7602083620006c4565b9150620005f48262000892565b602082019050919050565b600060208201905081810360008301526200061a816200058a565b9050919050565b600060208201905081810360008301526200063c81620005b1565b9050919050565b600060208201905081810360008301526200065e81620005d8565b9050919050565b60006200067162000684565b90506200067f828262000775565b919050565b6000604051905090565b600067ffffffffffffffff821115620006ac57620006ab620007da565b5b620006b78262000809565b9050602081019050919050565b600082825260208201905092915050565b6000620006e282620006e9565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620007295780820151818401526020810190506200070c565b8381111562000739576000848401525b50505050565b600060028204905060018216806200075857607f821691505b602082108114156200076f576200076e620007ab565b5b50919050565b620007808262000809565b810181811067ffffffffffffffff82111715620007a257620007a1620007da565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e6572206d757374206e6f7420626520656d707479000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620008c681620006d5565b8114620008d257600080fd5b50565b61430680620008e56000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063a22cb46511610097578063c6c6483911610071578063c6c648391461047e578063c87b56dd1461049a578063e985e9c5146104ca578063f2fde38b146104fa5761018e565b8063a22cb4651461042a578063aac1c7d914610446578063b88d4fde146104625761018e565b806370a0823114610368578063715018a6146103985780638b76481d146103a25780638da5cb5b146103d257806395d89b41146103f05780639713c8071461040e5761018e565b806323b872dd1161014b57806342842e0e1161012557806342842e0e146102d05780634a9a38e1146102ec57806355f804b31461031c5780636352211e146103385761018e565b806323b872dd146102675780632a55205a146102835780634071af24146102b45761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b3146102115780630f08025f1461022d57806319ee6e3f1461024b575b600080fd5b6101ad60048036038101906101a89190612ef6565b610516565b6040516101ba9190613576565b60405180910390f35b6101cb610528565b6040516101d89190613591565b60405180910390f35b6101fb60048036038101906101f69190612f89565b6105ba565b60405161020891906134e6565b60405180910390f35b61022b60048036038101906102269190612e4e565b61063f565b005b610235610757565b60405161024291906134e6565b60405180910390f35b61026560048036038101906102609190612e8a565b61077d565b005b610281600480360381019061027c9190612d48565b61087a565b005b61029d600480360381019061029891906130b4565b6108da565b6040516102ab92919061354d565b60405180910390f35b6102ce60048036038101906102c99190612f89565b61098d565b005b6102ea60048036038101906102e59190612d48565b610a64565b005b61030660048036038101906103019190612f89565b610a84565b6040516103139190613576565b60405180910390f35b61033660048036038101906103319190612f48565b610aa4565b005b610352600480360381019061034d9190612f89565b610b3a565b60405161035f91906134e6565b60405180910390f35b610382600480360381019061037d9190612ce3565b610bec565b60405161038f9190613873565b60405180910390f35b6103a0610ca4565b005b6103bc60048036038101906103b79190612f89565b610d2c565b6040516103c99190613576565b60405180910390f35b6103da610d4c565b6040516103e791906134e6565b60405180910390f35b6103f8610d76565b6040516104059190613591565b60405180910390f35b61042860048036038101906104239190613029565b610e08565b005b610444600480360381019061043f9190612e12565b610e94565b005b610460600480360381019061045b9190613078565b611015565b005b61047c60048036038101906104779190612d97565b611120565b005b61049860048036038101906104939190612fb2565b611182565b005b6104b460048036038101906104af9190612f89565b61123c565b6040516104c19190613591565b60405180910390f35b6104e460048036038101906104df9190612d0c565b6112e3565b6040516104f19190613576565b60405180910390f35b610514600480360381019061050f9190612ce3565b611377565b005b60006105218261146f565b9050919050565b60606000805461053790613b56565b80601f016020809104026020016040519081016040528092919081815260200182805461056390613b56565b80156105b05780601f10610585576101008083540402835291602001916105b0565b820191906000526020600020905b81548152906001019060200180831161059357829003601f168201915b5050505050905090565b60006105c5826114e9565b610604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fb90613793565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064a82610b3a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b290613813565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106da611555565b73ffffffffffffffffffffffffffffffffffffffff161480610709575061070881610703611555565b6112e3565b5b610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073f90613713565b60405180910390fd5b610752838361155d565b505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906135d3565b60405180910390fd5b60018314610850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610847906136d3565b60405180910390fd5b600080600061085f8585611616565b9250925092506108718388848461197b565b50505050505050565b61088b610885611555565b826119a0565b6108ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c190613853565b60405180910390fd5b6108d5838383611ae4565b505050565b6000806000600660008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050905080600001516127108260200151866109779190613a12565b61098191906139e1565b92509250509250929050565b610995611555565b73ffffffffffffffffffffffffffffffffffffffff166109b3610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a00906137b3565b60405180910390fd5b6000600a600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600b600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610a7f83838360405180602001604052806000815250611120565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b610aac611555565b73ffffffffffffffffffffffffffffffffffffffff16610aca610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614610b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b17906137b3565b60405180910390fd5b8060089080519060200190610b36929190612abd565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90613753565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5490613733565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cac611555565b73ffffffffffffffffffffffffffffffffffffffff16610cca610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d17906137b3565b60405180910390fd5b610d2a6000611b82565b565b600a6020528060005260406000206000915054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610d8590613b56565b80601f0160208091040260200160405190810160405280929190818152602001828054610db190613b56565b8015610dfe5780601f10610dd357610100808354040283529160200191610dfe565b820191906000526020600020905b815481529060010190602001808311610de157829003601f168201915b5050505050905090565b610e10611555565b73ffffffffffffffffffffffffffffffffffffffff16610e2e610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b906137b3565b60405180910390fd5b610e8f838383611c48565b505050565b610e9c611555565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f01906136b3565b60405180910390fd5b8060056000610f17611555565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc4611555565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110099190613576565b60405180910390a35050565b61101d611555565b73ffffffffffffffffffffffffffffffffffffffff1661103b610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614611091576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611088906137b3565b60405180910390fd5b600b600083815260200190815260200160002060009054906101000a900460ff166110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e8906135b3565b60405180910390fd5b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61113161112b611555565b836119a0565b611170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116790613853565b60405180910390fd5b61117c84848484611d24565b50505050565b61118a611555565b73ffffffffffffffffffffffffffffffffffffffff166111a8610d4c565b73ffffffffffffffffffffffffffffffffffffffff16146111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f5906137b3565b60405180910390fd5b61120a8585858561197b565b80600b600087815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b6060611247826114e9565b611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d906137f3565b60405180910390fd5b6000611290611d80565b905060008151116112b057604051806020016040528060008152506112db565b806112ba84611e12565b6040516020016112cb9291906134c2565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61137f611555565b73ffffffffffffffffffffffffffffffffffffffff1661139d610d4c565b73ffffffffffffffffffffffffffffffffffffffff16146113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea906137b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613653565b60405180910390fd5b61146c81611b82565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114e257506114e182611fbf565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115d083610b3a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806000806116a186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600181526020017f3a0000000000000000000000000000000000000000000000000000000000000081525060006120a1565b905060008112156116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90613833565b60405180910390fd5b600061175387876001906001866116fe9190613a6c565b9261170b93929190613958565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061220b565b90506000600383898990506117689190613a6c565b6117729190613a6c565b9050600081141561178f5781600080955095509550505050611974565b36600089896002876117a1919061398b565b9060018d8d90506117b29190613a6c565b926117bf93929190613958565b91509150600061184a83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525060006120a1565b90506000811215611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790613633565b60405180910390fd5b60006118f0848460009085926118a893929190613958565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122c8565b905060006119608585600186611906919061398b565b90888890509261191893929190613958565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061220b565b90508682829a509a509a5050505050505050505b9250925092565b6119858385612401565b600081111561199a57611999848383611c48565b5b50505050565b60006119ab826114e9565b6119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e1906136f3565b60405180910390fd5b60006119f583610b3a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a6457508373ffffffffffffffffffffffffffffffffffffffff16611a4c846105ba565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a755750611a7481856112e3565b5b80611adb5750600a600084815260200190815260200160002060009054906101000a900460ff168015611ada5750611aab610d4c565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b5b91505092915050565b600a600082815260200190815260200160002060009054906101000a900460ff168015611b435750611b14610d4c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611b6c5750600a600082815260200190815260200160002060009054906101000a900460ff16155b15611b7d57611b7c83838361241f565b5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612710811115611c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c84906135f3565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155905050505050565b611d2f848484611ae4565b611d3b8484848461267b565b611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7190613613565b60405180910390fd5b50505050565b606060088054611d8f90613b56565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbb90613b56565b8015611e085780601f10611ddd57610100808354040283529160200191611e08565b820191906000526020600020905b815481529060010190602001808311611deb57829003601f168201915b5050505050905090565b60606000821415611e5a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fba565b600082905060005b60008214611e8c578080611e7590613bb9565b915050600a82611e8591906139e1565b9150611e62565b60008167ffffffffffffffff811115611ece577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f005781602001600182028036833780820191505090505b5090505b60008514611fb357600182611f199190613a6c565b9150600a85611f289190613c02565b6030611f34919061398b565b60f81b818381518110611f70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fac91906139e1565b9450611f04565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061208a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061209a575061209982612812565b5b9050919050565b60008083905060018151146120df577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008390505b85518110156121de5781600081518110612128577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191686828151811061218e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156121cb578092505050612204565b80806121d690613bb9565b9150506120e5565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9150505b9392505050565b6000806000905060005b83518110156122be576000848281518110612259577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1690506030811015801561227e575060398111155b156122aa576030816122909190613a6c565b600a8461229d9190613a12565b6122a7919061398b565b92505b5080806122b690613bb9565b915050612215565b5080915050919050565b6000806000905060005b83518110156123f7576000848281518110612316577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1690506030811015801561233b575060398111155b156123675760308161234d9190613a6c565b60108461235a9190613a12565b612364919061398b565b92505b604181101580156123795750605a8111155b156123a55760378161238b9190613a6c565b6010846123989190613a12565b6123a2919061398b565b92505b606181101580156123b75750607a8111155b156123e3576057816123c99190613a6c565b6010846123d69190613a12565b6123e0919061398b565b92505b5080806123ef90613bb9565b9150506122d2565b5080915050919050565b61241b82826040518060200160405280600081525061287c565b5050565b8273ffffffffffffffffffffffffffffffffffffffff1661243f82610b3a565b73ffffffffffffffffffffffffffffffffffffffff1614612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906137d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fc90613693565b60405180910390fd5b6125108383836128d7565b61251b60008261155d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256b9190613a6c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c2919061398b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061269c8473ffffffffffffffffffffffffffffffffffffffff166128dc565b15612805578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126c5611555565b8786866040518563ffffffff1660e01b81526004016126e79493929190613501565b602060405180830381600087803b15801561270157600080fd5b505af192505050801561273257506040513d601f19601f8201168201806040525081019061272f9190612f1f565b60015b6127b5573d8060008114612762576040519150601f19603f3d011682016040523d82523d6000602084013e612767565b606091505b506000815114156127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490613613565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061280a565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61288683836128ef565b612893600084848461267b565b6128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990613613565b60405180910390fd5b505050565b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690613773565b60405180910390fd5b612968816114e9565b156129a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299f90613673565b60405180910390fd5b6129b4600083836128d7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a04919061398b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612ac990613b56565b90600052602060002090601f016020900481019282612aeb5760008555612b32565b82601f10612b0457805160ff1916838001178555612b32565b82800160010185558215612b32579182015b82811115612b31578251825591602001919060010190612b16565b5b509050612b3f9190612b43565b5090565b5b80821115612b5c576000816000905550600101612b44565b5090565b6000612b73612b6e846138b3565b61388e565b905082815260208101848484011115612b8b57600080fd5b612b96848285613b14565b509392505050565b6000612bb1612bac846138e4565b61388e565b905082815260208101848484011115612bc957600080fd5b612bd4848285613b14565b509392505050565b600081359050612beb81614274565b92915050565b600081359050612c008161428b565b92915050565b600081359050612c15816142a2565b92915050565b600081519050612c2a816142a2565b92915050565b60008083601f840112612c4257600080fd5b8235905067ffffffffffffffff811115612c5b57600080fd5b602083019150836001820283011115612c7357600080fd5b9250929050565b600082601f830112612c8b57600080fd5b8135612c9b848260208601612b60565b91505092915050565b600082601f830112612cb557600080fd5b8135612cc5848260208601612b9e565b91505092915050565b600081359050612cdd816142b9565b92915050565b600060208284031215612cf557600080fd5b6000612d0384828501612bdc565b91505092915050565b60008060408385031215612d1f57600080fd5b6000612d2d85828601612bdc565b9250506020612d3e85828601612bdc565b9150509250929050565b600080600060608486031215612d5d57600080fd5b6000612d6b86828701612bdc565b9350506020612d7c86828701612bdc565b9250506040612d8d86828701612cce565b9150509250925092565b60008060008060808587031215612dad57600080fd5b6000612dbb87828801612bdc565b9450506020612dcc87828801612bdc565b9350506040612ddd87828801612cce565b925050606085013567ffffffffffffffff811115612dfa57600080fd5b612e0687828801612c7a565b91505092959194509250565b60008060408385031215612e2557600080fd5b6000612e3385828601612bdc565b9250506020612e4485828601612bf1565b9150509250929050565b60008060408385031215612e6157600080fd5b6000612e6f85828601612bdc565b9250506020612e8085828601612cce565b9150509250929050565b60008060008060608587031215612ea057600080fd5b6000612eae87828801612bdc565b9450506020612ebf87828801612cce565b935050604085013567ffffffffffffffff811115612edc57600080fd5b612ee887828801612c30565b925092505092959194509250565b600060208284031215612f0857600080fd5b6000612f1684828501612c06565b91505092915050565b600060208284031215612f3157600080fd5b6000612f3f84828501612c1b565b91505092915050565b600060208284031215612f5a57600080fd5b600082013567ffffffffffffffff811115612f7457600080fd5b612f8084828501612ca4565b91505092915050565b600060208284031215612f9b57600080fd5b6000612fa984828501612cce565b91505092915050565b600080600080600060a08688031215612fca57600080fd5b6000612fd888828901612cce565b9550506020612fe988828901612bdc565b9450506040612ffa88828901612bdc565b935050606061300b88828901612cce565b925050608061301c88828901612bf1565b9150509295509295909350565b60008060006060848603121561303e57600080fd5b600061304c86828701612cce565b935050602061305d86828701612bdc565b925050604061306e86828701612cce565b9150509250925092565b6000806040838503121561308b57600080fd5b600061309985828601612cce565b92505060206130aa85828601612bf1565b9150509250929050565b600080604083850312156130c757600080fd5b60006130d585828601612cce565b92505060206130e685828601612cce565b9150509250929050565b6130f981613aa0565b82525050565b61310881613ab2565b82525050565b600061311982613915565b613123818561392b565b9350613133818560208601613b23565b61313c81613cef565b840191505092915050565b600061315282613920565b61315c818561393c565b935061316c818560208601613b23565b61317581613cef565b840191505092915050565b600061318b82613920565b613195818561394d565b93506131a5818560208601613b23565b80840191505092915050565b60006131be60148361393c565b91506131c982613d00565b602082019050919050565b60006131e160228361393c565b91506131ec82613d29565b604082019050919050565b6000613204601a8361393c565b915061320f82613d78565b602082019050919050565b600061322760328361393c565b915061323282613da1565b604082019050919050565b600061324a601e8361393c565b915061325582613df0565b602082019050919050565b600061326d60268361393c565b915061327882613e19565b604082019050919050565b6000613290601c8361393c565b915061329b82613e68565b602082019050919050565b60006132b360248361393c565b91506132be82613e91565b604082019050919050565b60006132d660198361393c565b91506132e182613ee0565b602082019050919050565b60006132f9601a8361393c565b915061330482613f09565b602082019050919050565b600061331c602c8361393c565b915061332782613f32565b604082019050919050565b600061333f60388361393c565b915061334a82613f81565b604082019050919050565b6000613362602a8361393c565b915061336d82613fd0565b604082019050919050565b600061338560298361393c565b91506133908261401f565b604082019050919050565b60006133a860208361393c565b91506133b38261406e565b602082019050919050565b60006133cb602c8361393c565b91506133d682614097565b604082019050919050565b60006133ee60208361393c565b91506133f9826140e6565b602082019050919050565b600061341160298361393c565b915061341c8261410f565b604082019050919050565b6000613434602f8361393c565b915061343f8261415e565b604082019050919050565b600061345760218361393c565b9150613462826141ad565b604082019050919050565b600061347a60148361393c565b9150613485826141fc565b602082019050919050565b600061349d60318361393c565b91506134a882614225565b604082019050919050565b6134bc81613b0a565b82525050565b60006134ce8285613180565b91506134da8284613180565b91508190509392505050565b60006020820190506134fb60008301846130f0565b92915050565b600060808201905061351660008301876130f0565b61352360208301866130f0565b61353060408301856134b3565b8181036060830152613542818461310e565b905095945050505050565b600060408201905061356260008301856130f0565b61356f60208301846134b3565b9392505050565b600060208201905061358b60008301846130ff565b92915050565b600060208201905081810360008301526135ab8184613147565b905092915050565b600060208201905081810360008301526135cc816131b1565b9050919050565b600060208201905081810360008301526135ec816131d4565b9050919050565b6000602082019050818103600083015261360c816131f7565b9050919050565b6000602082019050818103600083015261362c8161321a565b9050919050565b6000602082019050818103600083015261364c8161323d565b9050919050565b6000602082019050818103600083015261366c81613260565b9050919050565b6000602082019050818103600083015261368c81613283565b9050919050565b600060208201905081810360008301526136ac816132a6565b9050919050565b600060208201905081810360008301526136cc816132c9565b9050919050565b600060208201905081810360008301526136ec816132ec565b9050919050565b6000602082019050818103600083015261370c8161330f565b9050919050565b6000602082019050818103600083015261372c81613332565b9050919050565b6000602082019050818103600083015261374c81613355565b9050919050565b6000602082019050818103600083015261376c81613378565b9050919050565b6000602082019050818103600083015261378c8161339b565b9050919050565b600060208201905081810360008301526137ac816133be565b9050919050565b600060208201905081810360008301526137cc816133e1565b9050919050565b600060208201905081810360008301526137ec81613404565b9050919050565b6000602082019050818103600083015261380c81613427565b9050919050565b6000602082019050818103600083015261382c8161344a565b9050919050565b6000602082019050818103600083015261384c8161346d565b9050919050565b6000602082019050818103600083015261386c81613490565b9050919050565b600060208201905061388860008301846134b3565b92915050565b60006138986138a9565b90506138a48282613b88565b919050565b6000604051905090565b600067ffffffffffffffff8211156138ce576138cd613cc0565b5b6138d782613cef565b9050602081019050919050565b600067ffffffffffffffff8211156138ff576138fe613cc0565b5b61390882613cef565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000808585111561396857600080fd5b8386111561397557600080fd5b6001850283019150848603905094509492505050565b600061399682613b0a565b91506139a183613b0a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139d6576139d5613c33565b5b828201905092915050565b60006139ec82613b0a565b91506139f783613b0a565b925082613a0757613a06613c62565b5b828204905092915050565b6000613a1d82613b0a565b9150613a2883613b0a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a6157613a60613c33565b5b828202905092915050565b6000613a7782613b0a565b9150613a8283613b0a565b925082821015613a9557613a94613c33565b5b828203905092915050565b6000613aab82613aea565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b41578082015181840152602081019050613b26565b83811115613b50576000848401525b50505050565b60006002820490506001821680613b6e57607f821691505b60208210811415613b8257613b81613c91565b5b50919050565b613b9182613cef565b810181811067ffffffffffffffff82111715613bb057613baf613cc0565b5b80604052505050565b6000613bc482613b0a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bf757613bf6613c33565b5b600182019050919050565b6000613c0d82613b0a565b9150613c1883613b0a565b925082613c2857613c27613c62565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e46542063616e6e6f74206265206c6f636b6564000000000000000000000000600082015250565b7f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279204960008201527f4d58000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f426c75657072696e7420736570617261746f72206d7573742065786973740000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d696e7461626c653a20696e76616c6964207175616e74697479000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f536570617261746f72206d757374206578697374000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61427d81613aa0565b811461428857600080fd5b50565b61429481613ab2565b811461429f57600080fd5b50565b6142ab81613abe565b81146142b657600080fd5b50565b6142c281613b0a565b81146142cd57600080fd5b5056fea264697066735822122092849919f9bd1cde07c5864b31781feb3a28ce5d0911edd409f24d639bdb77f464736f6c63430008040033000000000000000000000000e47afde415442f32a96cb3c7ed5164d7d2ea516900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005fdcca53617f4d2b9134b29090c87d01058e27e90000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001254696b546f6b20546f70204d6f6d656e74730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000654494b544f4b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008626173655552492f000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063a22cb46511610097578063c6c6483911610071578063c6c648391461047e578063c87b56dd1461049a578063e985e9c5146104ca578063f2fde38b146104fa5761018e565b8063a22cb4651461042a578063aac1c7d914610446578063b88d4fde146104625761018e565b806370a0823114610368578063715018a6146103985780638b76481d146103a25780638da5cb5b146103d257806395d89b41146103f05780639713c8071461040e5761018e565b806323b872dd1161014b57806342842e0e1161012557806342842e0e146102d05780634a9a38e1146102ec57806355f804b31461031c5780636352211e146103385761018e565b806323b872dd146102675780632a55205a146102835780634071af24146102b45761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b3146102115780630f08025f1461022d57806319ee6e3f1461024b575b600080fd5b6101ad60048036038101906101a89190612ef6565b610516565b6040516101ba9190613576565b60405180910390f35b6101cb610528565b6040516101d89190613591565b60405180910390f35b6101fb60048036038101906101f69190612f89565b6105ba565b60405161020891906134e6565b60405180910390f35b61022b60048036038101906102269190612e4e565b61063f565b005b610235610757565b60405161024291906134e6565b60405180910390f35b61026560048036038101906102609190612e8a565b61077d565b005b610281600480360381019061027c9190612d48565b61087a565b005b61029d600480360381019061029891906130b4565b6108da565b6040516102ab92919061354d565b60405180910390f35b6102ce60048036038101906102c99190612f89565b61098d565b005b6102ea60048036038101906102e59190612d48565b610a64565b005b61030660048036038101906103019190612f89565b610a84565b6040516103139190613576565b60405180910390f35b61033660048036038101906103319190612f48565b610aa4565b005b610352600480360381019061034d9190612f89565b610b3a565b60405161035f91906134e6565b60405180910390f35b610382600480360381019061037d9190612ce3565b610bec565b60405161038f9190613873565b60405180910390f35b6103a0610ca4565b005b6103bc60048036038101906103b79190612f89565b610d2c565b6040516103c99190613576565b60405180910390f35b6103da610d4c565b6040516103e791906134e6565b60405180910390f35b6103f8610d76565b6040516104059190613591565b60405180910390f35b61042860048036038101906104239190613029565b610e08565b005b610444600480360381019061043f9190612e12565b610e94565b005b610460600480360381019061045b9190613078565b611015565b005b61047c60048036038101906104779190612d97565b611120565b005b61049860048036038101906104939190612fb2565b611182565b005b6104b460048036038101906104af9190612f89565b61123c565b6040516104c19190613591565b60405180910390f35b6104e460048036038101906104df9190612d0c565b6112e3565b6040516104f19190613576565b60405180910390f35b610514600480360381019061050f9190612ce3565b611377565b005b60006105218261146f565b9050919050565b60606000805461053790613b56565b80601f016020809104026020016040519081016040528092919081815260200182805461056390613b56565b80156105b05780601f10610585576101008083540402835291602001916105b0565b820191906000526020600020905b81548152906001019060200180831161059357829003601f168201915b5050505050905090565b60006105c5826114e9565b610604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fb90613793565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064a82610b3a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b290613813565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106da611555565b73ffffffffffffffffffffffffffffffffffffffff161480610709575061070881610703611555565b6112e3565b5b610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073f90613713565b60405180910390fd5b610752838361155d565b505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906135d3565b60405180910390fd5b60018314610850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610847906136d3565b60405180910390fd5b600080600061085f8585611616565b9250925092506108718388848461197b565b50505050505050565b61088b610885611555565b826119a0565b6108ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c190613853565b60405180910390fd5b6108d5838383611ae4565b505050565b6000806000600660008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050905080600001516127108260200151866109779190613a12565b61098191906139e1565b92509250509250929050565b610995611555565b73ffffffffffffffffffffffffffffffffffffffff166109b3610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a00906137b3565b60405180910390fd5b6000600a600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600b600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610a7f83838360405180602001604052806000815250611120565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b610aac611555565b73ffffffffffffffffffffffffffffffffffffffff16610aca610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614610b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b17906137b3565b60405180910390fd5b8060089080519060200190610b36929190612abd565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90613753565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5490613733565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cac611555565b73ffffffffffffffffffffffffffffffffffffffff16610cca610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d17906137b3565b60405180910390fd5b610d2a6000611b82565b565b600a6020528060005260406000206000915054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610d8590613b56565b80601f0160208091040260200160405190810160405280929190818152602001828054610db190613b56565b8015610dfe5780601f10610dd357610100808354040283529160200191610dfe565b820191906000526020600020905b815481529060010190602001808311610de157829003601f168201915b5050505050905090565b610e10611555565b73ffffffffffffffffffffffffffffffffffffffff16610e2e610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b906137b3565b60405180910390fd5b610e8f838383611c48565b505050565b610e9c611555565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f01906136b3565b60405180910390fd5b8060056000610f17611555565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc4611555565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110099190613576565b60405180910390a35050565b61101d611555565b73ffffffffffffffffffffffffffffffffffffffff1661103b610d4c565b73ffffffffffffffffffffffffffffffffffffffff1614611091576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611088906137b3565b60405180910390fd5b600b600083815260200190815260200160002060009054906101000a900460ff166110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e8906135b3565b60405180910390fd5b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61113161112b611555565b836119a0565b611170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116790613853565b60405180910390fd5b61117c84848484611d24565b50505050565b61118a611555565b73ffffffffffffffffffffffffffffffffffffffff166111a8610d4c565b73ffffffffffffffffffffffffffffffffffffffff16146111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f5906137b3565b60405180910390fd5b61120a8585858561197b565b80600b600087815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b6060611247826114e9565b611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d906137f3565b60405180910390fd5b6000611290611d80565b905060008151116112b057604051806020016040528060008152506112db565b806112ba84611e12565b6040516020016112cb9291906134c2565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61137f611555565b73ffffffffffffffffffffffffffffffffffffffff1661139d610d4c565b73ffffffffffffffffffffffffffffffffffffffff16146113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea906137b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613653565b60405180910390fd5b61146c81611b82565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114e257506114e182611fbf565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115d083610b3a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806000806116a186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600181526020017f3a0000000000000000000000000000000000000000000000000000000000000081525060006120a1565b905060008112156116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90613833565b60405180910390fd5b600061175387876001906001866116fe9190613a6c565b9261170b93929190613958565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061220b565b90506000600383898990506117689190613a6c565b6117729190613a6c565b9050600081141561178f5781600080955095509550505050611974565b36600089896002876117a1919061398b565b9060018d8d90506117b29190613a6c565b926117bf93929190613958565b91509150600061184a83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506040518060400160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525060006120a1565b90506000811215611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790613633565b60405180910390fd5b60006118f0848460009085926118a893929190613958565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122c8565b905060006119608585600186611906919061398b565b90888890509261191893929190613958565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061220b565b90508682829a509a509a5050505050505050505b9250925092565b6119858385612401565b600081111561199a57611999848383611c48565b5b50505050565b60006119ab826114e9565b6119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e1906136f3565b60405180910390fd5b60006119f583610b3a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a6457508373ffffffffffffffffffffffffffffffffffffffff16611a4c846105ba565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a755750611a7481856112e3565b5b80611adb5750600a600084815260200190815260200160002060009054906101000a900460ff168015611ada5750611aab610d4c565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b5b91505092915050565b600a600082815260200190815260200160002060009054906101000a900460ff168015611b435750611b14610d4c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611b6c5750600a600082815260200190815260200160002060009054906101000a900460ff16155b15611b7d57611b7c83838361241f565b5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612710811115611c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c84906135f3565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152506006600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155905050505050565b611d2f848484611ae4565b611d3b8484848461267b565b611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7190613613565b60405180910390fd5b50505050565b606060088054611d8f90613b56565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbb90613b56565b8015611e085780601f10611ddd57610100808354040283529160200191611e08565b820191906000526020600020905b815481529060010190602001808311611deb57829003601f168201915b5050505050905090565b60606000821415611e5a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fba565b600082905060005b60008214611e8c578080611e7590613bb9565b915050600a82611e8591906139e1565b9150611e62565b60008167ffffffffffffffff811115611ece577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f005781602001600182028036833780820191505090505b5090505b60008514611fb357600182611f199190613a6c565b9150600a85611f289190613c02565b6030611f34919061398b565b60f81b818381518110611f70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fac91906139e1565b9450611f04565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061208a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061209a575061209982612812565b5b9050919050565b60008083905060018151146120df577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008390505b85518110156121de5781600081518110612128577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191686828151811061218e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156121cb578092505050612204565b80806121d690613bb9565b9150506120e5565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9150505b9392505050565b6000806000905060005b83518110156122be576000848281518110612259577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1690506030811015801561227e575060398111155b156122aa576030816122909190613a6c565b600a8461229d9190613a12565b6122a7919061398b565b92505b5080806122b690613bb9565b915050612215565b5080915050919050565b6000806000905060005b83518110156123f7576000848281518110612316577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1690506030811015801561233b575060398111155b156123675760308161234d9190613a6c565b60108461235a9190613a12565b612364919061398b565b92505b604181101580156123795750605a8111155b156123a55760378161238b9190613a6c565b6010846123989190613a12565b6123a2919061398b565b92505b606181101580156123b75750607a8111155b156123e3576057816123c99190613a6c565b6010846123d69190613a12565b6123e0919061398b565b92505b5080806123ef90613bb9565b9150506122d2565b5080915050919050565b61241b82826040518060200160405280600081525061287c565b5050565b8273ffffffffffffffffffffffffffffffffffffffff1661243f82610b3a565b73ffffffffffffffffffffffffffffffffffffffff1614612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c906137d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fc90613693565b60405180910390fd5b6125108383836128d7565b61251b60008261155d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256b9190613a6c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c2919061398b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061269c8473ffffffffffffffffffffffffffffffffffffffff166128dc565b15612805578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126c5611555565b8786866040518563ffffffff1660e01b81526004016126e79493929190613501565b602060405180830381600087803b15801561270157600080fd5b505af192505050801561273257506040513d601f19601f8201168201806040525081019061272f9190612f1f565b60015b6127b5573d8060008114612762576040519150601f19603f3d011682016040523d82523d6000602084013e612767565b606091505b506000815114156127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490613613565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061280a565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61288683836128ef565b612893600084848461267b565b6128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990613613565b60405180910390fd5b505050565b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690613773565b60405180910390fd5b612968816114e9565b156129a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299f90613673565b60405180910390fd5b6129b4600083836128d7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a04919061398b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612ac990613b56565b90600052602060002090601f016020900481019282612aeb5760008555612b32565b82601f10612b0457805160ff1916838001178555612b32565b82800160010185558215612b32579182015b82811115612b31578251825591602001919060010190612b16565b5b509050612b3f9190612b43565b5090565b5b80821115612b5c576000816000905550600101612b44565b5090565b6000612b73612b6e846138b3565b61388e565b905082815260208101848484011115612b8b57600080fd5b612b96848285613b14565b509392505050565b6000612bb1612bac846138e4565b61388e565b905082815260208101848484011115612bc957600080fd5b612bd4848285613b14565b509392505050565b600081359050612beb81614274565b92915050565b600081359050612c008161428b565b92915050565b600081359050612c15816142a2565b92915050565b600081519050612c2a816142a2565b92915050565b60008083601f840112612c4257600080fd5b8235905067ffffffffffffffff811115612c5b57600080fd5b602083019150836001820283011115612c7357600080fd5b9250929050565b600082601f830112612c8b57600080fd5b8135612c9b848260208601612b60565b91505092915050565b600082601f830112612cb557600080fd5b8135612cc5848260208601612b9e565b91505092915050565b600081359050612cdd816142b9565b92915050565b600060208284031215612cf557600080fd5b6000612d0384828501612bdc565b91505092915050565b60008060408385031215612d1f57600080fd5b6000612d2d85828601612bdc565b9250506020612d3e85828601612bdc565b9150509250929050565b600080600060608486031215612d5d57600080fd5b6000612d6b86828701612bdc565b9350506020612d7c86828701612bdc565b9250506040612d8d86828701612cce565b9150509250925092565b60008060008060808587031215612dad57600080fd5b6000612dbb87828801612bdc565b9450506020612dcc87828801612bdc565b9350506040612ddd87828801612cce565b925050606085013567ffffffffffffffff811115612dfa57600080fd5b612e0687828801612c7a565b91505092959194509250565b60008060408385031215612e2557600080fd5b6000612e3385828601612bdc565b9250506020612e4485828601612bf1565b9150509250929050565b60008060408385031215612e6157600080fd5b6000612e6f85828601612bdc565b9250506020612e8085828601612cce565b9150509250929050565b60008060008060608587031215612ea057600080fd5b6000612eae87828801612bdc565b9450506020612ebf87828801612cce565b935050604085013567ffffffffffffffff811115612edc57600080fd5b612ee887828801612c30565b925092505092959194509250565b600060208284031215612f0857600080fd5b6000612f1684828501612c06565b91505092915050565b600060208284031215612f3157600080fd5b6000612f3f84828501612c1b565b91505092915050565b600060208284031215612f5a57600080fd5b600082013567ffffffffffffffff811115612f7457600080fd5b612f8084828501612ca4565b91505092915050565b600060208284031215612f9b57600080fd5b6000612fa984828501612cce565b91505092915050565b600080600080600060a08688031215612fca57600080fd5b6000612fd888828901612cce565b9550506020612fe988828901612bdc565b9450506040612ffa88828901612bdc565b935050606061300b88828901612cce565b925050608061301c88828901612bf1565b9150509295509295909350565b60008060006060848603121561303e57600080fd5b600061304c86828701612cce565b935050602061305d86828701612bdc565b925050604061306e86828701612cce565b9150509250925092565b6000806040838503121561308b57600080fd5b600061309985828601612cce565b92505060206130aa85828601612bf1565b9150509250929050565b600080604083850312156130c757600080fd5b60006130d585828601612cce565b92505060206130e685828601612cce565b9150509250929050565b6130f981613aa0565b82525050565b61310881613ab2565b82525050565b600061311982613915565b613123818561392b565b9350613133818560208601613b23565b61313c81613cef565b840191505092915050565b600061315282613920565b61315c818561393c565b935061316c818560208601613b23565b61317581613cef565b840191505092915050565b600061318b82613920565b613195818561394d565b93506131a5818560208601613b23565b80840191505092915050565b60006131be60148361393c565b91506131c982613d00565b602082019050919050565b60006131e160228361393c565b91506131ec82613d29565b604082019050919050565b6000613204601a8361393c565b915061320f82613d78565b602082019050919050565b600061322760328361393c565b915061323282613da1565b604082019050919050565b600061324a601e8361393c565b915061325582613df0565b602082019050919050565b600061326d60268361393c565b915061327882613e19565b604082019050919050565b6000613290601c8361393c565b915061329b82613e68565b602082019050919050565b60006132b360248361393c565b91506132be82613e91565b604082019050919050565b60006132d660198361393c565b91506132e182613ee0565b602082019050919050565b60006132f9601a8361393c565b915061330482613f09565b602082019050919050565b600061331c602c8361393c565b915061332782613f32565b604082019050919050565b600061333f60388361393c565b915061334a82613f81565b604082019050919050565b6000613362602a8361393c565b915061336d82613fd0565b604082019050919050565b600061338560298361393c565b91506133908261401f565b604082019050919050565b60006133a860208361393c565b91506133b38261406e565b602082019050919050565b60006133cb602c8361393c565b91506133d682614097565b604082019050919050565b60006133ee60208361393c565b91506133f9826140e6565b602082019050919050565b600061341160298361393c565b915061341c8261410f565b604082019050919050565b6000613434602f8361393c565b915061343f8261415e565b604082019050919050565b600061345760218361393c565b9150613462826141ad565b604082019050919050565b600061347a60148361393c565b9150613485826141fc565b602082019050919050565b600061349d60318361393c565b91506134a882614225565b604082019050919050565b6134bc81613b0a565b82525050565b60006134ce8285613180565b91506134da8284613180565b91508190509392505050565b60006020820190506134fb60008301846130f0565b92915050565b600060808201905061351660008301876130f0565b61352360208301866130f0565b61353060408301856134b3565b8181036060830152613542818461310e565b905095945050505050565b600060408201905061356260008301856130f0565b61356f60208301846134b3565b9392505050565b600060208201905061358b60008301846130ff565b92915050565b600060208201905081810360008301526135ab8184613147565b905092915050565b600060208201905081810360008301526135cc816131b1565b9050919050565b600060208201905081810360008301526135ec816131d4565b9050919050565b6000602082019050818103600083015261360c816131f7565b9050919050565b6000602082019050818103600083015261362c8161321a565b9050919050565b6000602082019050818103600083015261364c8161323d565b9050919050565b6000602082019050818103600083015261366c81613260565b9050919050565b6000602082019050818103600083015261368c81613283565b9050919050565b600060208201905081810360008301526136ac816132a6565b9050919050565b600060208201905081810360008301526136cc816132c9565b9050919050565b600060208201905081810360008301526136ec816132ec565b9050919050565b6000602082019050818103600083015261370c8161330f565b9050919050565b6000602082019050818103600083015261372c81613332565b9050919050565b6000602082019050818103600083015261374c81613355565b9050919050565b6000602082019050818103600083015261376c81613378565b9050919050565b6000602082019050818103600083015261378c8161339b565b9050919050565b600060208201905081810360008301526137ac816133be565b9050919050565b600060208201905081810360008301526137cc816133e1565b9050919050565b600060208201905081810360008301526137ec81613404565b9050919050565b6000602082019050818103600083015261380c81613427565b9050919050565b6000602082019050818103600083015261382c8161344a565b9050919050565b6000602082019050818103600083015261384c8161346d565b9050919050565b6000602082019050818103600083015261386c81613490565b9050919050565b600060208201905061388860008301846134b3565b92915050565b60006138986138a9565b90506138a48282613b88565b919050565b6000604051905090565b600067ffffffffffffffff8211156138ce576138cd613cc0565b5b6138d782613cef565b9050602081019050919050565b600067ffffffffffffffff8211156138ff576138fe613cc0565b5b61390882613cef565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000808585111561396857600080fd5b8386111561397557600080fd5b6001850283019150848603905094509492505050565b600061399682613b0a565b91506139a183613b0a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139d6576139d5613c33565b5b828201905092915050565b60006139ec82613b0a565b91506139f783613b0a565b925082613a0757613a06613c62565b5b828204905092915050565b6000613a1d82613b0a565b9150613a2883613b0a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a6157613a60613c33565b5b828202905092915050565b6000613a7782613b0a565b9150613a8283613b0a565b925082821015613a9557613a94613c33565b5b828203905092915050565b6000613aab82613aea565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b41578082015181840152602081019050613b26565b83811115613b50576000848401525b50505050565b60006002820490506001821680613b6e57607f821691505b60208210811415613b8257613b81613c91565b5b50919050565b613b9182613cef565b810181811067ffffffffffffffff82111715613bb057613baf613cc0565b5b80604052505050565b6000613bc482613b0a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bf757613bf6613c33565b5b600182019050919050565b6000613c0d82613b0a565b9150613c1883613b0a565b925082613c2857613c27613c62565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4e46542063616e6e6f74206265206c6f636b6564000000000000000000000000600082015250565b7f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279204960008201527f4d58000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f426c75657072696e7420736570617261746f72206d7573742065786973740000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d696e7461626c653a20696e76616c6964207175616e74697479000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f536570617261746f72206d757374206578697374000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61427d81613aa0565b811461428857600080fd5b50565b61429481613ab2565b811461429f57600080fd5b50565b6142ab81613abe565b81146142b657600080fd5b50565b6142c281613b0a565b81146142cd57600080fd5b5056fea264697066735822122092849919f9bd1cde07c5864b31781feb3a28ce5d0911edd409f24d639bdb77f464736f6c63430008040033

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

000000000000000000000000e47afde415442f32a96cb3c7ed5164d7d2ea516900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000005fdcca53617f4d2b9134b29090c87d01058e27e90000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001254696b546f6b20546f70204d6f6d656e74730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000654494b544f4b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008626173655552492f000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _owner (address): 0xe47AFDe415442F32a96Cb3C7Ed5164d7D2Ea5169
Arg [1] : _name (string): TikTok Top Moments
Arg [2] : _symbol (string): TIKTOK
Arg [3] : _imx (address): 0x5FDCCA53617f4d2b9134B29090C87D01058e27e9
Arg [4] : baseURI (string): baseURI/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000e47afde415442f32a96cb3c7ed5164d7d2ea5169
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000005fdcca53617f4d2b9134b29090c87d01058e27e9
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [6] : 54696b546f6b20546f70204d6f6d656e74730000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 54494b544f4b0000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [10] : 626173655552492f000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

41908:4274:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43362:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24109:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25668:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25191:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42124:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42890:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26558:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37196:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;45028:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26968:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42355:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44532:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23803:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23533:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2745:94;;;:::i;:::-;;42230:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2094:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24278:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44318:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25961:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44820:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27224:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43959:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24453:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26327:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2994:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43362:229;43518:4;43547:36;43571:11;43547:23;:36::i;:::-;43540:43;;43362:229;;;:::o;24109:100::-;24163:13;24196:5;24189:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24109:100;:::o;25668:221::-;25744:7;25772:16;25780:7;25772;:16::i;:::-;25764:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25857:15;:24;25873:7;25857:24;;;;;;;;;;;;;;;;;;;;;25850:31;;25668:221;;;:::o;25191:411::-;25272:13;25288:23;25303:7;25288:14;:23::i;:::-;25272:39;;25336:5;25330:11;;:2;:11;;;;25322:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25430:5;25414:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25439:37;25456:5;25463:12;:10;:12::i;:::-;25439:16;:37::i;:::-;25414:62;25392:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25573:21;25582:2;25586:7;25573:8;:21::i;:::-;25191:411;;;:::o;42124:18::-;;;;;;;;;;;;;:::o;42890:436::-;42820:3;;;;;;;;;;;42806:17;;:10;:17;;;42798:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;43058:1:::1;43046:8;:13;43038:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;43116:15;43146:24:::0;43185:25:::1;43224:26;43238:11;;43224:13;:26::i;:::-;43101:149;;;;;;43261:57;43267:7;43276:4;43282:16;43300:17;43261:5;:57::i;:::-;42873:1;;;42890:436:::0;;;;:::o;26558:339::-;26753:41;26772:12;:10;:12::i;:::-;26786:7;26753:18;:41::i;:::-;26745:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26861:28;26871:4;26877:2;26881:7;26861:9;:28::i;:::-;26558:339;;;:::o;37196:300::-;37317:16;37335:21;37374:22;37399:10;:19;37410:7;37399:19;;;;;;;;;;;37374:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37437:7;:17;;;37482:5;37465:7;:13;;;37457:5;:21;;;;:::i;:::-;37456:31;;;;:::i;:::-;37429:59;;;;;37196:300;;;;;:::o;45028:153::-;2325:12;:10;:12::i;:::-;2314:23;;:7;:5;:7::i;:::-;:23;;;2306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45127:5:::1;45100:15;:24;45116:7;45100:24;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;45168:5;45143:13;:22;45157:7;45143:22;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;45028:153:::0;:::o;26968:185::-;27106:39;27123:4;27129:2;27133:7;27106:39;;;;;;;;;;;;:16;:39::i;:::-;26968:185;;;:::o;42355:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;44532:105::-;2325:12;:10;:12::i;:::-;2314:23;;:7;:5;:7::i;:::-;:23;;;2306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44622:7:::1;44605:14;:24;;;;;;;;;;;;:::i;:::-;;44532:105:::0;:::o;23803:239::-;23875:7;23895:13;23911:7;:16;23919:7;23911:16;;;;;;;;;;;;;;;;;;;;;23895:32;;23963:1;23946:19;;:5;:19;;;;23938:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24029:5;24022:12;;;23803:239;;;:::o;23533:208::-;23605:7;23650:1;23633:19;;:5;:19;;;;23625:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23717:9;:16;23727:5;23717:16;;;;;;;;;;;;;;;;23710:23;;23533:208;;;:::o;2745:94::-;2325:12;:10;:12::i;:::-;2314:23;;:7;:5;:7::i;:::-;:23;;;2306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2810:21:::1;2828:1;2810:9;:21::i;:::-;2745:94::o:0;42230:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;2094:87::-;2140:7;2167:6;;;;;;;;;;;2160:13;;2094:87;:::o;24278:104::-;24334:13;24367:7;24360:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24278:104;:::o;44318:181::-;2325:12;:10;:12::i;:::-;2314:23;;:7;:5;:7::i;:::-;:23;;;2306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44453:38:::1;44470:2;44474:9;44485:5;44453:16;:38::i;:::-;44318:181:::0;;;:::o;25961:295::-;26076:12;:10;:12::i;:::-;26064:24;;:8;:24;;;;26056:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26176:8;26131:18;:32;26150:12;:10;:12::i;:::-;26131:32;;;;;;;;;;;;;;;:42;26164:8;26131:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26229:8;26200:48;;26215:12;:10;:12::i;:::-;26200:48;;;26239:8;26200:48;;;;;;:::i;:::-;;;;;;;;25961:295;;:::o;44820:200::-;2325:12;:10;:12::i;:::-;2314:23;;:7;:5;:7::i;:::-;:23;;;2306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44917:13:::1;:22;44931:7;44917:22;;;;;;;;;;;;;;;;;;;;;44909:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45002:10;44975:15;:24;44991:7;44975:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;44820:200:::0;;:::o;27224:328::-;27399:41;27418:12;:10;:12::i;:::-;27432:7;27399:18;:41::i;:::-;27391:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27505:39;27519:4;27525:2;27529:7;27538:5;27505:13;:39::i;:::-;27224:328;;;;:::o;43959:317::-;2325:12;:10;:12::i;:::-;2314:23;;:7;:5;:7::i;:::-;:23;;;2306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44162:62:::1;44168:7;44177:9;44188:16;44206:17;44162:5;:62::i;:::-;44260:8;44235:13;:22;44249:7;44235:22;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;43959:317:::0;;;;;:::o;24453:334::-;24526:13;24560:16;24568:7;24560;:16::i;:::-;24552:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24641:21;24665:10;:8;:10::i;:::-;24641:34;;24717:1;24699:7;24693:21;:25;:86;;;;;;;;;;;;;;;;;24745:7;24754:18;:7;:16;:18::i;:::-;24728:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24693:86;24686:93;;;24453:334;;;:::o;26327:164::-;26424:4;26448:18;:25;26467:5;26448:25;;;;;;;;;;;;;;;:35;26474:8;26448:35;;;;;;;;;;;;;;;;;;;;;;;;;26441:42;;26327:164;;;;:::o;2994:192::-;2325:12;:10;:12::i;:::-;2314:23;;:7;:5;:7::i;:::-;:23;;;2306:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3103:1:::1;3083:22;;:8;:22;;;;3075:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3159:19;3169:8;3159:9;:19::i;:::-;2994:192:::0;:::o;36387:283::-;36517:4;36574:35;36559:50;;;:11;:50;;;;:103;;;;36626:36;36650:11;36626:23;:36::i;:::-;36559:103;36539:123;;36387:283;;;:::o;29062:127::-;29127:4;29179:1;29151:30;;:7;:16;29159:7;29151:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29144:37;;29062:127;;;:::o;884:98::-;937:7;964:10;957:17;;884:98;:::o;33044:174::-;33146:2;33119:15;:24;33135:7;33119:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33202:7;33198:2;33164:46;;33173:23;33188:7;33173:14;:23::i;:::-;33164:46;;;;;;;;;;;;33044:174;;:::o;40657:1170::-;40757:7;40779;40801;40836:12;40851:27;40865:4;;40851:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40876:1;40851:13;:27::i;:::-;40836:42;;40906:1;40897:5;:10;;40889:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;40992:15;41010:40;41023:4;;41028:1;41023:26;41047:1;41038:5;41030:18;;;;:::i;:::-;41023:26;;;;;;;:::i;:::-;41010:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:40::i;:::-;40992:58;;41061:23;41118:1;41109:5;41087:4;;:11;;:28;;;;:::i;:::-;:32;;;;:::i;:::-;41061:58;;41153:1;41134:15;:20;41130:84;;;41179:7;41196:1;41200;41171:31;;;;;;;;;;;41130:84;41224:24;;41251:4;;41273:1;41264:5;41256:18;;;;:::i;:::-;41251:40;41289:1;41275:4;;:11;;:15;;;;:::i;:::-;41251:40;;;;;;;:::i;:::-;41224:67;;;;41378:21;41402:32;41416:9;;41402:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41432:1;41402:13;:32::i;:::-;41378:56;;41471:1;41453:14;:19;;41445:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41518:24;41545:78;41576:9;;41586:1;41576:36;41596:14;41576:36;;;;;;;:::i;:::-;41545:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:78::i;:::-;41518:105;;41634:25;41662:93;41689:9;;41725:1;41707:14;41699:27;;;;:::i;:::-;41689:55;41727:9;;:16;;41689:55;;;;;;;:::i;:::-;41662:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:93::i;:::-;41634:121;;41774:7;41783:16;41801:17;41766:53;;;;;;;;;;;;;;40657:1170;;;;;;:::o;43599:330::-;43766:29;43776:9;43787:7;43766:9;:29::i;:::-;43830:1;43810:17;:21;43806:116;;;43848:62;43865:7;43874:16;43892:17;43848:16;:62::i;:::-;43806:116;43599:330;;;;:::o;45264:540::-;45394:4;45438:16;45446:7;45438;:16::i;:::-;45416:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45537:18;45558:23;45573:7;45558:14;:23::i;:::-;45537:44;;45611:10;45600:21;;:7;:21;;;:69;;;;45662:7;45638:31;;:20;45650:7;45638:11;:20::i;:::-;:31;;;45600:69;:130;;;;45686:44;45710:10;45722:7;45686:23;:44::i;:::-;45600:130;:195;;;;45748:15;:24;45764:7;45748:24;;;;;;;;;;;;;;;;;;;;;:46;;;;;45787:7;:5;:7::i;:::-;45776:18;;:7;:18;;;45748:46;45600:195;45592:204;;;45264:540;;;;:::o;45898:281::-;46028:15;:24;46044:7;46028:24;;;;;;;;;;;;;;;;;;;;;:49;;;;;46070:7;:5;:7::i;:::-;46056:21;;:10;:21;;;46028:49;46027:82;;;;46084:15;:24;46100:7;46084:24;;;;;;;;;;;;;;;;;;;;;46083:25;46027:82;46023:149;;;46126:34;46142:4;46148:2;46152:7;46126:15;:34::i;:::-;46023:149;45898:281;;;:::o;3194:173::-;3250:16;3269:6;;;;;;;;;;;3250:25;;3295:8;3286:6;;:17;;;;;;;;;;;;;;;;;;3350:8;3319:40;;3340:8;3319:40;;;;;;;;;;;;3194:173;;:::o;36907:242::-;37050:5;37041;:14;;37033:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;37116:25;;;;;;;;37124:9;37116:25;;;;;;37135:5;37116:25;;;37099:10;:14;37110:2;37099:14;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36907:242;;;:::o;28434:315::-;28591:28;28601:4;28607:2;28611:7;28591:9;:28::i;:::-;28638:48;28661:4;28667:2;28671:7;28680:5;28638:22;:48::i;:::-;28630:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28434:315;;;;:::o;44705:107::-;44757:13;44790:14;44783:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44705:107;:::o;19115:723::-;19171:13;19401:1;19392:5;:10;19388:53;;;19419:10;;;;;;;;;;;;;;;;;;;;;19388:53;19451:12;19466:5;19451:20;;19482:14;19507:78;19522:1;19514:4;:9;19507:78;;19540:8;;;;;:::i;:::-;;;;19571:2;19563:10;;;;;:::i;:::-;;;19507:78;;;19595:19;19627:6;19617:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19595:39;;19645:154;19661:1;19652:5;:10;19645:154;;19689:1;19679:11;;;;;:::i;:::-;;;19756:2;19748:5;:10;;;;:::i;:::-;19735:2;:24;;;;:::i;:::-;19722:39;;19705:6;19712;19705:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;19785:2;19776:11;;;;;:::i;:::-;;;19645:154;;;19823:6;19809:21;;;;;19115:723;;;;:::o;23164:305::-;23266:4;23318:25;23303:40;;;:11;:40;;;;:105;;;;23375:33;23360:48;;;:11;:48;;;;23303:105;:158;;;;23425:36;23449:11;23425:23;:36::i;:::-;23303:158;23283:178;;23164:305;;;:::o;39196:436::-;39329:6;39348:24;39381:6;39348:40;;39430:1;39408:11;:18;:23;39401:31;;;;;;;;;;;;39450:9;39462:7;39450:19;;39445:158;39475:5;:12;39471:1;:16;39445:158;;;39525:11;39537:1;39525:14;;;;;;;;;;;;;;;;;;;;;;;;39513:26;;;:5;39519:1;39513:8;;;;;;;;;;;;;;;;;;;;;;;;:26;;;;39509:83;;;39574:1;39560:16;;;;;;39509:83;39489:3;;;;;:::i;:::-;;;;39445:158;;;;39622:2;39615:9;;;39196:436;;;;;;:::o;39640:345::-;39695:7;39715:14;39732:1;39715:18;;39749:9;39744:210;39768:1;:8;39764:1;:12;39744:210;;;39798:11;39826:1;39828;39826:4;;;;;;;;;;;;;;;;;;;;;;;;39820:11;;39812:20;;39798:34;;39858:2;39851:3;:9;;:22;;;;;39871:2;39864:3;:9;;39851:22;39847:96;;;39924:2;39918:3;:8;;;;:::i;:::-;39912:2;39903:6;:11;;;;:::i;:::-;:24;;;;:::i;:::-;39894:33;;39847:96;39744:210;39778:3;;;;;:::i;:::-;;;;39744:210;;;;39971:6;39964:13;;;39640:345;;;:::o;39993:565::-;40053:7;40073:14;40090:1;40073:18;;40107:9;40102:407;40126:1;:8;40122:1;:12;40102:407;;;40156:9;40182:1;40184;40182:4;;;;;;;;;;;;;;;;;;;;;;;;40176:11;;40168:20;;40156:32;;40212:2;40207:1;:7;;:18;;;;;40223:2;40218:1;:7;;40207:18;40203:90;;;40274:2;40270:1;:6;;;;:::i;:::-;40264:2;40255:6;:11;;;;:::i;:::-;:22;;;;:::i;:::-;40246:31;;40203:90;40315:2;40310:1;:7;;:17;;;;;40325:2;40321:1;:6;;40310:17;40307:88;;;40376:2;40372:1;:6;;;;:::i;:::-;40366:2;40357:6;:11;;;;:::i;:::-;:22;;;;:::i;:::-;40348:31;;40307:88;40417:2;40412:1;:7;;:18;;;;;40427:3;40423:1;:7;;40412:18;40409:89;;;40479:2;40475:1;:6;;;;:::i;:::-;40469:2;40460:6;:11;;;;:::i;:::-;:22;;;;:::i;:::-;40451:31;;40409:89;40102:407;40136:3;;;;;:::i;:::-;;;;40102:407;;;;40542:6;40519:31;;;39993:565;;;:::o;30046:110::-;30122:26;30132:2;30136:7;30122:26;;;;;;;;;;;;:9;:26::i;:::-;30046:110;;:::o;32348:578::-;32507:4;32480:31;;:23;32495:7;32480:14;:23::i;:::-;:31;;;32472:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32590:1;32576:16;;:2;:16;;;;32568:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32646:39;32667:4;32673:2;32677:7;32646:20;:39::i;:::-;32750:29;32767:1;32771:7;32750:8;:29::i;:::-;32811:1;32792:9;:15;32802:4;32792:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32840:1;32823:9;:13;32833:2;32823:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32871:2;32852:7;:16;32860:7;32852:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32910:7;32906:2;32891:27;;32900:4;32891:27;;;;;;;;;;;;32348:578;;;:::o;33783:799::-;33938:4;33959:15;:2;:13;;;:15::i;:::-;33955:620;;;34011:2;33995:36;;;34032:12;:10;:12::i;:::-;34046:4;34052:7;34061:5;33995:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33991:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34254:1;34237:6;:13;:18;34233:272;;;34280:60;;;;;;;;;;:::i;:::-;;;;;;;;34233:272;34455:6;34449:13;34440:6;34436:2;34432:15;34425:38;33991:529;34128:41;;;34118:51;;;:6;:51;;;;34111:58;;;;;33955:620;34559:4;34552:11;;33783:799;;;;;;;:::o;21670:157::-;21755:4;21794:25;21779:40;;;:11;:40;;;;21772:47;;21670:157;;;:::o;30383:321::-;30513:18;30519:2;30523:7;30513:5;:18::i;:::-;30564:54;30595:1;30599:2;30603:7;30612:5;30564:22;:54::i;:::-;30542:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30383:321;;;:::o;35154:126::-;;;;:::o;11475:387::-;11535:4;11743:12;11810:7;11798:20;11790:28;;11853:1;11846:4;:8;11839:15;;;11475:387;;;:::o;31040:382::-;31134:1;31120:16;;:2;:16;;;;31112:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31193:16;31201:7;31193;:16::i;:::-;31192:17;31184:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31255:45;31284:1;31288:2;31292:7;31255:20;:45::i;:::-;31330:1;31313:9;:13;31323:2;31313:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31361:2;31342:7;:16;31350:7;31342:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31406:7;31402:2;31381:33;;31398:1;31381:33;;;;;;;;;;;;31040:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:351::-;1351:8;1361:6;1411:3;1404:4;1396:6;1392:17;1388:27;1378:2;;1429:1;1426;1419:12;1378:2;1465:6;1452:20;1442:30;;1495:18;1487:6;1484:30;1481:2;;;1527:1;1524;1517:12;1481:2;1564:4;1556:6;1552:17;1540:29;;1618:3;1610:4;1602:6;1598:17;1588:8;1584:32;1581:41;1578:2;;;1635:1;1632;1625:12;1578:2;1368:277;;;;;:::o;1664:271::-;1719:5;1768:3;1761:4;1753:6;1749:17;1745:27;1735:2;;1786:1;1783;1776:12;1735:2;1826:6;1813:20;1851:78;1925:3;1917:6;1910:4;1902:6;1898:17;1851:78;:::i;:::-;1842:87;;1725:210;;;;;:::o;1955:273::-;2011:5;2060:3;2053:4;2045:6;2041:17;2037:27;2027:2;;2078:1;2075;2068:12;2027:2;2118:6;2105:20;2143:79;2218:3;2210:6;2203:4;2195:6;2191:17;2143:79;:::i;:::-;2134:88;;2017:211;;;;;:::o;2234:139::-;2280:5;2318:6;2305:20;2296:29;;2334:33;2361:5;2334:33;:::i;:::-;2286:87;;;;:::o;2379:262::-;2438:6;2487:2;2475:9;2466:7;2462:23;2458:32;2455:2;;;2503:1;2500;2493:12;2455:2;2546:1;2571:53;2616:7;2607:6;2596:9;2592:22;2571:53;:::i;:::-;2561:63;;2517:117;2445:196;;;;:::o;2647:407::-;2715:6;2723;2772:2;2760:9;2751:7;2747:23;2743:32;2740:2;;;2788:1;2785;2778:12;2740:2;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;2730:324;;;;;:::o;3060:552::-;3137:6;3145;3153;3202:2;3190:9;3181:7;3177:23;3173:32;3170:2;;;3218:1;3215;3208:12;3170:2;3261:1;3286:53;3331:7;3322:6;3311:9;3307:22;3286:53;:::i;:::-;3276:63;;3232:117;3388:2;3414:53;3459:7;3450:6;3439:9;3435:22;3414:53;:::i;:::-;3404:63;;3359:118;3516:2;3542:53;3587:7;3578:6;3567:9;3563:22;3542:53;:::i;:::-;3532:63;;3487:118;3160:452;;;;;:::o;3618:809::-;3713:6;3721;3729;3737;3786:3;3774:9;3765:7;3761:23;3757:33;3754:2;;;3803:1;3800;3793:12;3754:2;3846:1;3871:53;3916:7;3907:6;3896:9;3892:22;3871:53;:::i;:::-;3861:63;;3817:117;3973:2;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3944:118;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;4257:2;4246:9;4242:18;4229:32;4288:18;4280:6;4277:30;4274:2;;;4320:1;4317;4310:12;4274:2;4348:62;4402:7;4393:6;4382:9;4378:22;4348:62;:::i;:::-;4338:72;;4200:220;3744:683;;;;;;;:::o;4433:401::-;4498:6;4506;4555:2;4543:9;4534:7;4530:23;4526:32;4523:2;;;4571:1;4568;4561:12;4523:2;4614:1;4639:53;4684:7;4675:6;4664:9;4660:22;4639:53;:::i;:::-;4629:63;;4585:117;4741:2;4767:50;4809:7;4800:6;4789:9;4785:22;4767:50;:::i;:::-;4757:60;;4712:115;4513:321;;;;;:::o;4840:407::-;4908:6;4916;4965:2;4953:9;4944:7;4940:23;4936:32;4933:2;;;4981:1;4978;4971:12;4933:2;5024:1;5049:53;5094:7;5085:6;5074:9;5070:22;5049:53;:::i;:::-;5039:63;;4995:117;5151:2;5177:53;5222:7;5213:6;5202:9;5198:22;5177:53;:::i;:::-;5167:63;;5122:118;4923:324;;;;;:::o;5253:683::-;5341:6;5349;5357;5365;5414:2;5402:9;5393:7;5389:23;5385:32;5382:2;;;5430:1;5427;5420:12;5382:2;5473:1;5498:53;5543:7;5534:6;5523:9;5519:22;5498:53;:::i;:::-;5488:63;;5444:117;5600:2;5626:53;5671:7;5662:6;5651:9;5647:22;5626:53;:::i;:::-;5616:63;;5571:118;5756:2;5745:9;5741:18;5728:32;5787:18;5779:6;5776:30;5773:2;;;5819:1;5816;5809:12;5773:2;5855:64;5911:7;5902:6;5891:9;5887:22;5855:64;:::i;:::-;5837:82;;;;5699:230;5372:564;;;;;;;:::o;5942:260::-;6000:6;6049:2;6037:9;6028:7;6024:23;6020:32;6017:2;;;6065:1;6062;6055:12;6017:2;6108:1;6133:52;6177:7;6168:6;6157:9;6153:22;6133:52;:::i;:::-;6123:62;;6079:116;6007:195;;;;:::o;6208:282::-;6277:6;6326:2;6314:9;6305:7;6301:23;6297:32;6294:2;;;6342:1;6339;6332:12;6294:2;6385:1;6410:63;6465:7;6456:6;6445:9;6441:22;6410:63;:::i;:::-;6400:73;;6356:127;6284:206;;;;:::o;6496:375::-;6565:6;6614:2;6602:9;6593:7;6589:23;6585:32;6582:2;;;6630:1;6627;6620:12;6582:2;6701:1;6690:9;6686:17;6673:31;6731:18;6723:6;6720:30;6717:2;;;6763:1;6760;6753:12;6717:2;6791:63;6846:7;6837:6;6826:9;6822:22;6791:63;:::i;:::-;6781:73;;6644:220;6572:299;;;;:::o;6877:262::-;6936:6;6985:2;6973:9;6964:7;6960:23;6956:32;6953:2;;;7001:1;6998;6991:12;6953:2;7044:1;7069:53;7114:7;7105:6;7094:9;7090:22;7069:53;:::i;:::-;7059:63;;7015:117;6943:196;;;;:::o;7145:838::-;7237:6;7245;7253;7261;7269;7318:3;7306:9;7297:7;7293:23;7289:33;7286:2;;;7335:1;7332;7325:12;7286:2;7378:1;7403:53;7448:7;7439:6;7428:9;7424:22;7403:53;:::i;:::-;7393:63;;7349:117;7505:2;7531:53;7576:7;7567:6;7556:9;7552:22;7531:53;:::i;:::-;7521:63;;7476:118;7633:2;7659:53;7704:7;7695:6;7684:9;7680:22;7659:53;:::i;:::-;7649:63;;7604:118;7761:2;7787:53;7832:7;7823:6;7812:9;7808:22;7787:53;:::i;:::-;7777:63;;7732:118;7889:3;7916:50;7958:7;7949:6;7938:9;7934:22;7916:50;:::i;:::-;7906:60;;7860:116;7276:707;;;;;;;;:::o;7989:552::-;8066:6;8074;8082;8131:2;8119:9;8110:7;8106:23;8102:32;8099:2;;;8147:1;8144;8137:12;8099:2;8190:1;8215:53;8260:7;8251:6;8240:9;8236:22;8215:53;:::i;:::-;8205:63;;8161:117;8317:2;8343:53;8388:7;8379:6;8368:9;8364:22;8343:53;:::i;:::-;8333:63;;8288:118;8445:2;8471:53;8516:7;8507:6;8496:9;8492:22;8471:53;:::i;:::-;8461:63;;8416:118;8089:452;;;;;:::o;8547:401::-;8612:6;8620;8669:2;8657:9;8648:7;8644:23;8640:32;8637:2;;;8685:1;8682;8675:12;8637:2;8728:1;8753:53;8798:7;8789:6;8778:9;8774:22;8753:53;:::i;:::-;8743:63;;8699:117;8855:2;8881:50;8923:7;8914:6;8903:9;8899:22;8881:50;:::i;:::-;8871:60;;8826:115;8627:321;;;;;:::o;8954:407::-;9022:6;9030;9079:2;9067:9;9058:7;9054:23;9050:32;9047:2;;;9095:1;9092;9085:12;9047:2;9138:1;9163:53;9208:7;9199:6;9188:9;9184:22;9163:53;:::i;:::-;9153:63;;9109:117;9265:2;9291:53;9336:7;9327:6;9316:9;9312:22;9291:53;:::i;:::-;9281:63;;9236:118;9037:324;;;;;:::o;9367:118::-;9454:24;9472:5;9454:24;:::i;:::-;9449:3;9442:37;9432:53;;:::o;9491:109::-;9572:21;9587:5;9572:21;:::i;:::-;9567:3;9560:34;9550:50;;:::o;9606:360::-;9692:3;9720:38;9752:5;9720:38;:::i;:::-;9774:70;9837:6;9832:3;9774:70;:::i;:::-;9767:77;;9853:52;9898:6;9893:3;9886:4;9879:5;9875:16;9853:52;:::i;:::-;9930:29;9952:6;9930:29;:::i;:::-;9925:3;9921:39;9914:46;;9696:270;;;;;:::o;9972:364::-;10060:3;10088:39;10121:5;10088:39;:::i;:::-;10143:71;10207:6;10202:3;10143:71;:::i;:::-;10136:78;;10223:52;10268:6;10263:3;10256:4;10249:5;10245:16;10223:52;:::i;:::-;10300:29;10322:6;10300:29;:::i;:::-;10295:3;10291:39;10284:46;;10064:272;;;;;:::o;10342:377::-;10448:3;10476:39;10509:5;10476:39;:::i;:::-;10531:89;10613:6;10608:3;10531:89;:::i;:::-;10524:96;;10629:52;10674:6;10669:3;10662:4;10655:5;10651:16;10629:52;:::i;:::-;10706:6;10701:3;10697:16;10690:23;;10452:267;;;;;:::o;10725:366::-;10867:3;10888:67;10952:2;10947:3;10888:67;:::i;:::-;10881:74;;10964:93;11053:3;10964:93;:::i;:::-;11082:2;11077:3;11073:12;11066:19;;10871:220;;;:::o;11097:366::-;11239:3;11260:67;11324:2;11319:3;11260:67;:::i;:::-;11253:74;;11336:93;11425:3;11336:93;:::i;:::-;11454:2;11449:3;11445:12;11438:19;;11243:220;;;:::o;11469:366::-;11611:3;11632:67;11696:2;11691:3;11632:67;:::i;:::-;11625:74;;11708:93;11797:3;11708:93;:::i;:::-;11826:2;11821:3;11817:12;11810:19;;11615:220;;;:::o;11841:366::-;11983:3;12004:67;12068:2;12063:3;12004:67;:::i;:::-;11997:74;;12080:93;12169:3;12080:93;:::i;:::-;12198:2;12193:3;12189:12;12182:19;;11987:220;;;:::o;12213:366::-;12355:3;12376:67;12440:2;12435:3;12376:67;:::i;:::-;12369:74;;12452:93;12541:3;12452:93;:::i;:::-;12570:2;12565:3;12561:12;12554:19;;12359:220;;;:::o;12585:366::-;12727:3;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12731:220;;;:::o;12957:366::-;13099:3;13120:67;13184:2;13179:3;13120:67;:::i;:::-;13113:74;;13196:93;13285:3;13196:93;:::i;:::-;13314:2;13309:3;13305:12;13298:19;;13103:220;;;:::o;13329:366::-;13471:3;13492:67;13556:2;13551:3;13492:67;:::i;:::-;13485:74;;13568:93;13657:3;13568:93;:::i;:::-;13686:2;13681:3;13677:12;13670:19;;13475:220;;;:::o;13701:366::-;13843:3;13864:67;13928:2;13923:3;13864:67;:::i;:::-;13857:74;;13940:93;14029:3;13940:93;:::i;:::-;14058:2;14053:3;14049:12;14042:19;;13847:220;;;:::o;14073:366::-;14215:3;14236:67;14300:2;14295:3;14236:67;:::i;:::-;14229:74;;14312:93;14401:3;14312:93;:::i;:::-;14430:2;14425:3;14421:12;14414:19;;14219:220;;;:::o;14445:366::-;14587:3;14608:67;14672:2;14667:3;14608:67;:::i;:::-;14601:74;;14684:93;14773:3;14684:93;:::i;:::-;14802:2;14797:3;14793:12;14786:19;;14591:220;;;:::o;14817:366::-;14959:3;14980:67;15044:2;15039:3;14980:67;:::i;:::-;14973:74;;15056:93;15145:3;15056:93;:::i;:::-;15174:2;15169:3;15165:12;15158:19;;14963:220;;;:::o;15189:366::-;15331:3;15352:67;15416:2;15411:3;15352:67;:::i;:::-;15345:74;;15428:93;15517:3;15428:93;:::i;:::-;15546:2;15541:3;15537:12;15530:19;;15335:220;;;:::o;15561:366::-;15703:3;15724:67;15788:2;15783:3;15724:67;:::i;:::-;15717:74;;15800:93;15889:3;15800:93;:::i;:::-;15918:2;15913:3;15909:12;15902:19;;15707:220;;;:::o;15933:366::-;16075:3;16096:67;16160:2;16155:3;16096:67;:::i;:::-;16089:74;;16172:93;16261:3;16172:93;:::i;:::-;16290:2;16285:3;16281:12;16274:19;;16079:220;;;:::o;16305:366::-;16447:3;16468:67;16532:2;16527:3;16468:67;:::i;:::-;16461:74;;16544:93;16633:3;16544:93;:::i;:::-;16662:2;16657:3;16653:12;16646:19;;16451:220;;;:::o;16677:366::-;16819:3;16840:67;16904:2;16899:3;16840:67;:::i;:::-;16833:74;;16916:93;17005:3;16916:93;:::i;:::-;17034:2;17029:3;17025:12;17018:19;;16823:220;;;:::o;17049:366::-;17191:3;17212:67;17276:2;17271:3;17212:67;:::i;:::-;17205:74;;17288:93;17377:3;17288:93;:::i;:::-;17406:2;17401:3;17397:12;17390:19;;17195:220;;;:::o;17421:366::-;17563:3;17584:67;17648:2;17643:3;17584:67;:::i;:::-;17577:74;;17660:93;17749:3;17660:93;:::i;:::-;17778:2;17773:3;17769:12;17762:19;;17567:220;;;:::o;17793:366::-;17935:3;17956:67;18020:2;18015:3;17956:67;:::i;:::-;17949:74;;18032:93;18121:3;18032:93;:::i;:::-;18150:2;18145:3;18141:12;18134:19;;17939:220;;;:::o;18165:366::-;18307:3;18328:67;18392:2;18387:3;18328:67;:::i;:::-;18321:74;;18404:93;18493:3;18404:93;:::i;:::-;18522:2;18517:3;18513:12;18506:19;;18311:220;;;:::o;18537:366::-;18679:3;18700:67;18764:2;18759:3;18700:67;:::i;:::-;18693:74;;18776:93;18865:3;18776:93;:::i;:::-;18894:2;18889:3;18885:12;18878:19;;18683:220;;;:::o;18909:118::-;18996:24;19014:5;18996:24;:::i;:::-;18991:3;18984:37;18974:53;;:::o;19033:435::-;19213:3;19235:95;19326:3;19317:6;19235:95;:::i;:::-;19228:102;;19347:95;19438:3;19429:6;19347:95;:::i;:::-;19340:102;;19459:3;19452:10;;19217:251;;;;;:::o;19474:222::-;19567:4;19605:2;19594:9;19590:18;19582:26;;19618:71;19686:1;19675:9;19671:17;19662:6;19618:71;:::i;:::-;19572:124;;;;:::o;19702:640::-;19897:4;19935:3;19924:9;19920:19;19912:27;;19949:71;20017:1;20006:9;20002:17;19993:6;19949:71;:::i;:::-;20030:72;20098:2;20087:9;20083:18;20074:6;20030:72;:::i;:::-;20112;20180:2;20169:9;20165:18;20156:6;20112:72;:::i;:::-;20231:9;20225:4;20221:20;20216:2;20205:9;20201:18;20194:48;20259:76;20330:4;20321:6;20259:76;:::i;:::-;20251:84;;19902:440;;;;;;;:::o;20348:332::-;20469:4;20507:2;20496:9;20492:18;20484:26;;20520:71;20588:1;20577:9;20573:17;20564:6;20520:71;:::i;:::-;20601:72;20669:2;20658:9;20654:18;20645:6;20601:72;:::i;:::-;20474:206;;;;;:::o;20686:210::-;20773:4;20811:2;20800:9;20796:18;20788:26;;20824:65;20886:1;20875:9;20871:17;20862:6;20824:65;:::i;:::-;20778:118;;;;:::o;20902:313::-;21015:4;21053:2;21042:9;21038:18;21030:26;;21102:9;21096:4;21092:20;21088:1;21077:9;21073:17;21066:47;21130:78;21203:4;21194:6;21130:78;:::i;:::-;21122:86;;21020:195;;;;:::o;21221:419::-;21387:4;21425:2;21414:9;21410:18;21402:26;;21474:9;21468:4;21464:20;21460:1;21449:9;21445:17;21438:47;21502:131;21628:4;21502:131;:::i;:::-;21494:139;;21392:248;;;:::o;21646:419::-;21812:4;21850:2;21839:9;21835:18;21827:26;;21899:9;21893:4;21889:20;21885:1;21874:9;21870:17;21863:47;21927:131;22053:4;21927:131;:::i;:::-;21919:139;;21817:248;;;:::o;22071:419::-;22237:4;22275:2;22264:9;22260:18;22252:26;;22324:9;22318:4;22314:20;22310:1;22299:9;22295:17;22288:47;22352:131;22478:4;22352:131;:::i;:::-;22344:139;;22242:248;;;:::o;22496:419::-;22662:4;22700:2;22689:9;22685:18;22677:26;;22749:9;22743:4;22739:20;22735:1;22724:9;22720:17;22713:47;22777:131;22903:4;22777:131;:::i;:::-;22769:139;;22667:248;;;:::o;22921:419::-;23087:4;23125:2;23114:9;23110:18;23102:26;;23174:9;23168:4;23164:20;23160:1;23149:9;23145:17;23138:47;23202:131;23328:4;23202:131;:::i;:::-;23194:139;;23092:248;;;:::o;23346:419::-;23512:4;23550:2;23539:9;23535:18;23527:26;;23599:9;23593:4;23589:20;23585:1;23574:9;23570:17;23563:47;23627:131;23753:4;23627:131;:::i;:::-;23619:139;;23517:248;;;:::o;23771:419::-;23937:4;23975:2;23964:9;23960:18;23952:26;;24024:9;24018:4;24014:20;24010:1;23999:9;23995:17;23988:47;24052:131;24178:4;24052:131;:::i;:::-;24044:139;;23942:248;;;:::o;24196:419::-;24362:4;24400:2;24389:9;24385:18;24377:26;;24449:9;24443:4;24439:20;24435:1;24424:9;24420:17;24413:47;24477:131;24603:4;24477:131;:::i;:::-;24469:139;;24367:248;;;:::o;24621:419::-;24787:4;24825:2;24814:9;24810:18;24802:26;;24874:9;24868:4;24864:20;24860:1;24849:9;24845:17;24838:47;24902:131;25028:4;24902:131;:::i;:::-;24894:139;;24792:248;;;:::o;25046:419::-;25212:4;25250:2;25239:9;25235:18;25227:26;;25299:9;25293:4;25289:20;25285:1;25274:9;25270:17;25263:47;25327:131;25453:4;25327:131;:::i;:::-;25319:139;;25217:248;;;:::o;25471:419::-;25637:4;25675:2;25664:9;25660:18;25652:26;;25724:9;25718:4;25714:20;25710:1;25699:9;25695:17;25688:47;25752:131;25878:4;25752:131;:::i;:::-;25744:139;;25642:248;;;:::o;25896:419::-;26062:4;26100:2;26089:9;26085:18;26077:26;;26149:9;26143:4;26139:20;26135:1;26124:9;26120:17;26113:47;26177:131;26303:4;26177:131;:::i;:::-;26169:139;;26067:248;;;:::o;26321:419::-;26487:4;26525:2;26514:9;26510:18;26502:26;;26574:9;26568:4;26564:20;26560:1;26549:9;26545:17;26538:47;26602:131;26728:4;26602:131;:::i;:::-;26594:139;;26492:248;;;:::o;26746:419::-;26912:4;26950:2;26939:9;26935:18;26927:26;;26999:9;26993:4;26989:20;26985:1;26974:9;26970:17;26963:47;27027:131;27153:4;27027:131;:::i;:::-;27019:139;;26917:248;;;:::o;27171:419::-;27337:4;27375:2;27364:9;27360:18;27352:26;;27424:9;27418:4;27414:20;27410:1;27399:9;27395:17;27388:47;27452:131;27578:4;27452:131;:::i;:::-;27444:139;;27342:248;;;:::o;27596:419::-;27762:4;27800:2;27789:9;27785:18;27777:26;;27849:9;27843:4;27839:20;27835:1;27824:9;27820:17;27813:47;27877:131;28003:4;27877:131;:::i;:::-;27869:139;;27767:248;;;:::o;28021:419::-;28187:4;28225:2;28214:9;28210:18;28202:26;;28274:9;28268:4;28264:20;28260:1;28249:9;28245:17;28238:47;28302:131;28428:4;28302:131;:::i;:::-;28294:139;;28192:248;;;:::o;28446:419::-;28612:4;28650:2;28639:9;28635:18;28627:26;;28699:9;28693:4;28689:20;28685:1;28674:9;28670:17;28663:47;28727:131;28853:4;28727:131;:::i;:::-;28719:139;;28617:248;;;:::o;28871:419::-;29037:4;29075:2;29064:9;29060:18;29052:26;;29124:9;29118:4;29114:20;29110:1;29099:9;29095:17;29088:47;29152:131;29278:4;29152:131;:::i;:::-;29144:139;;29042:248;;;:::o;29296:419::-;29462:4;29500:2;29489:9;29485:18;29477:26;;29549:9;29543:4;29539:20;29535:1;29524:9;29520:17;29513:47;29577:131;29703:4;29577:131;:::i;:::-;29569:139;;29467:248;;;:::o;29721:419::-;29887:4;29925:2;29914:9;29910:18;29902:26;;29974:9;29968:4;29964:20;29960:1;29949:9;29945:17;29938:47;30002:131;30128:4;30002:131;:::i;:::-;29994:139;;29892:248;;;:::o;30146:419::-;30312:4;30350:2;30339:9;30335:18;30327:26;;30399:9;30393:4;30389:20;30385:1;30374:9;30370:17;30363:47;30427:131;30553:4;30427:131;:::i;:::-;30419:139;;30317:248;;;:::o;30571:222::-;30664:4;30702:2;30691:9;30687:18;30679:26;;30715:71;30783:1;30772:9;30768:17;30759:6;30715:71;:::i;:::-;30669:124;;;;:::o;30799:129::-;30833:6;30860:20;;:::i;:::-;30850:30;;30889:33;30917:4;30909:6;30889:33;:::i;:::-;30840:88;;;:::o;30934:75::-;30967:6;31000:2;30994:9;30984:19;;30974:35;:::o;31015:307::-;31076:4;31166:18;31158:6;31155:30;31152:2;;;31188:18;;:::i;:::-;31152:2;31226:29;31248:6;31226:29;:::i;:::-;31218:37;;31310:4;31304;31300:15;31292:23;;31081:241;;;:::o;31328:308::-;31390:4;31480:18;31472:6;31469:30;31466:2;;;31502:18;;:::i;:::-;31466:2;31540:29;31562:6;31540:29;:::i;:::-;31532:37;;31624:4;31618;31614:15;31606:23;;31395:241;;;:::o;31642:98::-;31693:6;31727:5;31721:12;31711:22;;31700:40;;;:::o;31746:99::-;31798:6;31832:5;31826:12;31816:22;;31805:40;;;:::o;31851:168::-;31934:11;31968:6;31963:3;31956:19;32008:4;32003:3;31999:14;31984:29;;31946:73;;;;:::o;32025:169::-;32109:11;32143:6;32138:3;32131:19;32183:4;32178:3;32174:14;32159:29;;32121:73;;;;:::o;32200:148::-;32302:11;32339:3;32324:18;;32314:34;;;;:::o;32354:335::-;32459:9;32470;32508:8;32496:10;32493:24;32490:2;;;32530:1;32527;32520:12;32490:2;32559:6;32549:8;32546:20;32543:2;;;32579:1;32576;32569:12;32543:2;32633:1;32621:10;32617:18;32609:6;32605:31;32592:44;;32672:10;32662:8;32658:25;32645:38;;32480:209;;;;;;;:::o;32695:305::-;32735:3;32754:20;32772:1;32754:20;:::i;:::-;32749:25;;32788:20;32806:1;32788:20;:::i;:::-;32783:25;;32942:1;32874:66;32870:74;32867:1;32864:81;32861:2;;;32948:18;;:::i;:::-;32861:2;32992:1;32989;32985:9;32978:16;;32739:261;;;;:::o;33006:185::-;33046:1;33063:20;33081:1;33063:20;:::i;:::-;33058:25;;33097:20;33115:1;33097:20;:::i;:::-;33092:25;;33136:1;33126:2;;33141:18;;:::i;:::-;33126:2;33183:1;33180;33176:9;33171:14;;33048:143;;;;:::o;33197:348::-;33237:7;33260:20;33278:1;33260:20;:::i;:::-;33255:25;;33294:20;33312:1;33294:20;:::i;:::-;33289:25;;33482:1;33414:66;33410:74;33407:1;33404:81;33399:1;33392:9;33385:17;33381:105;33378:2;;;33489:18;;:::i;:::-;33378:2;33537:1;33534;33530:9;33519:20;;33245:300;;;;:::o;33551:191::-;33591:4;33611:20;33629:1;33611:20;:::i;:::-;33606:25;;33645:20;33663:1;33645:20;:::i;:::-;33640:25;;33684:1;33681;33678:8;33675:2;;;33689:18;;:::i;:::-;33675:2;33734:1;33731;33727:9;33719:17;;33596:146;;;;:::o;33748:96::-;33785:7;33814:24;33832:5;33814:24;:::i;:::-;33803:35;;33793:51;;;:::o;33850:90::-;33884:7;33927:5;33920:13;33913:21;33902:32;;33892:48;;;:::o;33946:149::-;33982:7;34022:66;34015:5;34011:78;34000:89;;33990:105;;;:::o;34101:126::-;34138:7;34178:42;34171:5;34167:54;34156:65;;34146:81;;;:::o;34233:77::-;34270:7;34299:5;34288:16;;34278:32;;;:::o;34316:154::-;34400:6;34395:3;34390;34377:30;34462:1;34453:6;34448:3;34444:16;34437:27;34367:103;;;:::o;34476:307::-;34544:1;34554:113;34568:6;34565:1;34562:13;34554:113;;;34653:1;34648:3;34644:11;34638:18;34634:1;34629:3;34625:11;34618:39;34590:2;34587:1;34583:10;34578:15;;34554:113;;;34685:6;34682:1;34679:13;34676:2;;;34765:1;34756:6;34751:3;34747:16;34740:27;34676:2;34525:258;;;;:::o;34789:320::-;34833:6;34870:1;34864:4;34860:12;34850:22;;34917:1;34911:4;34907:12;34938:18;34928:2;;34994:4;34986:6;34982:17;34972:27;;34928:2;35056;35048:6;35045:14;35025:18;35022:38;35019:2;;;35075:18;;:::i;:::-;35019:2;34840:269;;;;:::o;35115:281::-;35198:27;35220:4;35198:27;:::i;:::-;35190:6;35186:40;35328:6;35316:10;35313:22;35292:18;35280:10;35277:34;35274:62;35271:2;;;35339:18;;:::i;:::-;35271:2;35379:10;35375:2;35368:22;35158:238;;;:::o;35402:233::-;35441:3;35464:24;35482:5;35464:24;:::i;:::-;35455:33;;35510:66;35503:5;35500:77;35497:2;;;35580:18;;:::i;:::-;35497:2;35627:1;35620:5;35616:13;35609:20;;35445:190;;;:::o;35641:176::-;35673:1;35690:20;35708:1;35690:20;:::i;:::-;35685:25;;35724:20;35742:1;35724:20;:::i;:::-;35719:25;;35763:1;35753:2;;35768:18;;:::i;:::-;35753:2;35809:1;35806;35802:9;35797:14;;35675:142;;;;:::o;35823:180::-;35871:77;35868:1;35861:88;35968:4;35965:1;35958:15;35992:4;35989:1;35982:15;36009:180;36057:77;36054:1;36047:88;36154:4;36151:1;36144:15;36178:4;36175:1;36168:15;36195:180;36243:77;36240:1;36233:88;36340:4;36337:1;36330:15;36364:4;36361:1;36354:15;36381:180;36429:77;36426:1;36419:88;36526:4;36523:1;36516:15;36550:4;36547:1;36540:15;36567:102;36608:6;36659:2;36655:7;36650:2;36643:5;36639:14;36635:28;36625:38;;36615:54;;;:::o;36675:170::-;36815:22;36811:1;36803:6;36799:14;36792:46;36781:64;:::o;36851:221::-;36991:34;36987:1;36979:6;36975:14;36968:58;37060:4;37055:2;37047:6;37043:15;37036:29;36957:115;:::o;37078:176::-;37218:28;37214:1;37206:6;37202:14;37195:52;37184:70;:::o;37260:237::-;37400:34;37396:1;37388:6;37384:14;37377:58;37469:20;37464:2;37456:6;37452:15;37445:45;37366:131;:::o;37503:180::-;37643:32;37639:1;37631:6;37627:14;37620:56;37609:74;:::o;37689:225::-;37829:34;37825:1;37817:6;37813:14;37806:58;37898:8;37893:2;37885:6;37881:15;37874:33;37795:119;:::o;37920:178::-;38060:30;38056:1;38048:6;38044:14;38037:54;38026:72;:::o;38104:223::-;38244:34;38240:1;38232:6;38228:14;38221:58;38313:6;38308:2;38300:6;38296:15;38289:31;38210:117;:::o;38333:175::-;38473:27;38469:1;38461:6;38457:14;38450:51;38439:69;:::o;38514:176::-;38654:28;38650:1;38642:6;38638:14;38631:52;38620:70;:::o;38696:231::-;38836:34;38832:1;38824:6;38820:14;38813:58;38905:14;38900:2;38892:6;38888:15;38881:39;38802:125;:::o;38933:243::-;39073:34;39069:1;39061:6;39057:14;39050:58;39142:26;39137:2;39129:6;39125:15;39118:51;39039:137;:::o;39182:229::-;39322:34;39318:1;39310:6;39306:14;39299:58;39391:12;39386:2;39378:6;39374:15;39367:37;39288:123;:::o;39417:228::-;39557:34;39553:1;39545:6;39541:14;39534:58;39626:11;39621:2;39613:6;39609:15;39602:36;39523:122;:::o;39651:182::-;39791:34;39787:1;39779:6;39775:14;39768:58;39757:76;:::o;39839:231::-;39979:34;39975:1;39967:6;39963:14;39956:58;40048:14;40043:2;40035:6;40031:15;40024:39;39945:125;:::o;40076:182::-;40216:34;40212:1;40204:6;40200:14;40193:58;40182:76;:::o;40264:228::-;40404:34;40400:1;40392:6;40388:14;40381:58;40473:11;40468:2;40460:6;40456:15;40449:36;40370:122;:::o;40498:234::-;40638:34;40634:1;40626:6;40622:14;40615:58;40707:17;40702:2;40694:6;40690:15;40683:42;40604:128;:::o;40738:220::-;40878:34;40874:1;40866:6;40862:14;40855:58;40947:3;40942:2;40934:6;40930:15;40923:28;40844:114;:::o;40964:170::-;41104:22;41100:1;41092:6;41088:14;41081:46;41070:64;:::o;41140:236::-;41280:34;41276:1;41268:6;41264:14;41257:58;41349:19;41344:2;41336:6;41332:15;41325:44;41246:130;:::o;41382:122::-;41455:24;41473:5;41455:24;:::i;:::-;41448:5;41445:35;41435:2;;41494:1;41491;41484:12;41435:2;41425:79;:::o;41510:116::-;41580:21;41595:5;41580:21;:::i;:::-;41573:5;41570:32;41560:2;;41616:1;41613;41606:12;41560:2;41550:76;:::o;41632:120::-;41704:23;41721:5;41704:23;:::i;:::-;41697:5;41694:34;41684:2;;41742:1;41739;41732:12;41684:2;41674:78;:::o;41758:122::-;41831:24;41849:5;41831:24;:::i;:::-;41824:5;41821:35;41811:2;;41870:1;41867;41860:12;41811:2;41801:79;:::o

Swarm Source

ipfs://92849919f9bd1cde07c5864b31781feb3a28ce5d0911edd409f24d639bdb77f4
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.