ERC-721
Overview
Max Total Supply
901 BS
Holders
142
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
0 BSLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
BuriedSkellies
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-06-14 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.10; // Sources flattened with hardhat v2.9.4 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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 // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{ value: value }(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @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 // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string internal _name; // Token symbol string internal _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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _beforeApprove(to, tokenId); _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); _afterApprove(to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _beforeApprovalForAll(owner, operator, approved); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); _afterApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} function _beforeApprove(address to, uint256 tokenId) internal virtual {} function _afterApprove(address to, uint256 tokenId) internal virtual {} function _beforeApprovalForAll( address owner, address operator, bool approved ) internal virtual {} function _afterApprovalForAll( address owner, address operator, bool approved ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol) /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721Royalty is ERC2981, ERC721 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool internal _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Modifier to make a function override the current pause state */ modifier overridePause() { bool wasPaused = paused(); if (wasPaused) { _unpause(); } _; if (wasPaused) { _pause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File @openzeppelin/contracts/access/IOwnable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) interface IOwnable { function owner() external view returns (address); function pushOwnership(address newOwner) external; function pullOwnership() external; function renounceOwnership() external; function transferOwnership(address newOwner) external; } // File @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is IOwnable, Context { address private _owner; address private _newOwner; event OwnershipPushed(address indexed previousOwner, address indexed newOwner); event OwnershipPulled(address indexed previousOwner, address indexed newOwner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual override 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 Sets up a push of the ownership of the contract to the specified * address which must subsequently pull the ownership to accept it. */ function pushOwnership(address newOwner) public virtual override onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipPushed(_owner, newOwner); _newOwner = newOwner; } /** * @dev Accepts the push of ownership of the contract. Must be called by * the new owner. */ function pullOwnership() public virtual override { require(msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled(_owner, _newOwner); _owner = _newOwner; } /** * @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 override onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual override onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @layerzero/contracts/interfaces/ILayerZeroReceiver.sol interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) external; } // File @layerzero/contracts/interfaces/ILayerZeroUserApplicationConfig.sol interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig( uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config ) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File @layerzero/contracts/interfaces/ILayerZeroEndpoint.sol interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send( uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload( uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint256 _gasLimit, bytes calldata _payload ) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees( uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam ) external view returns (uint256 nativeFee, uint256 zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload( uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload ) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig( uint16 _version, uint16 _chainId, address _userApplication, uint256 _configType ) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File contracts/abstracts/LzApp.sol /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { ILayerZeroEndpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; event SetTrustedRemote(uint16 _srcChainId, bytes _srcAddress); // see: https://layerzero.gitbook.io/docs/technical-reference/mainnet/supported-chain-ids constructor(address _endpoint) { lzEndpoint = ILayerZeroEndpoint(_endpoint); } function lzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) public virtual override { // lzReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller"); bytes memory trustedRemote = trustedRemoteLookup[_srcChainId]; // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require( _srcAddress.length == trustedRemote.length && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract" ); _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging function _blockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function _lzSend( uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams ) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); lzEndpoint.send{ value: msg.value }( _dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams ); } //---------------------------UserApplication config---------------------------------------- function getConfig( uint16 _version, uint16 _chainId, address, uint256 _configType ) external view returns (bytes memory) { return lzEndpoint.getConfig(_version, _chainId, address(this), _configType); } // generic config for LayerZero user Application function setConfig( uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config ) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // allow owner to set it multiple times. function setTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external onlyOwner { trustedRemoteLookup[_srcChainId] = _srcAddress; emit SetTrustedRemote(_srcChainId, _srcAddress); } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } } // File contracts/abstracts/NonblockingLzApp.sol /* * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingLzApp is LzApp { mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload); // overriding the virtual function in LzReceiver function _blockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual override { // try-catch all errors/exceptions try this.nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload) { // do nothing } catch { // error / exception failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); } } function nonblockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) public virtual { // only internal transaction require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp"); _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function retryMessage( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) public payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message"); require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } } // File @openzeppelin/contracts/proxy/Clones.sol // OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol) /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } } // File @openzeppelin/contracts/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = _setInitializedVersion(1); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { bool isTopLevelCall = _setInitializedVersion(version); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(version); } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { _setInitializedVersion(type(uint8).max); } function _setInitializedVersion(uint8 version) private returns (bool) { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level // of initializers, because in other contexts the contract may have been reentered. if (_initializing) { require( version == 1 && !Address.isContract(address(this)), "Initializable: contract is already initialized" ); return false; } else { require(_initialized < version, "Initializable: contract is already initialized"); _initialized = version; return true; } } modifier whenNotInitialized() { require(_initialized == 0, "Initializable: contract has been initialized"); _; } modifier whenInitialized() { require(_initialized != 0, "Initializable: contract has not been initialized"); _; } } // File contracts/abstracts/Cloneable.sol // Brandon Lehmann <[email protected]> abstract contract Cloneable is Initializable { using Clones for address; event CloneDeployed(address indexed deployer, address indexed progenitor, address indexed clone, bytes32 salt); address internal immutable progenitor; modifier isCloned() { require(address(this) != progenitor, "Cloneable: Contract is not a clone"); _; } constructor() { progenitor = address(this); } /** * @dev Returns if this contract is a clone */ function isClone() public view returns (bool) { return address(this) != progenitor; } /****** INTERNAL METHODS ******/ /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function _clone() internal returns (address instance) { _beforeClone(msg.sender, progenitor, instance, 0x0); instance = progenitor.clone(); emit CloneDeployed(msg.sender, progenitor, instance, 0x0); _afterClone(msg.sender, progenitor, instance, 0x0); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function _cloneDeterministic(bytes32 salt) internal returns (address instance) { _beforeClone(msg.sender, progenitor, instance, salt); instance = progenitor.cloneDeterministic(salt); emit CloneDeployed(msg.sender, progenitor, instance, salt); _afterClone(msg.sender, progenitor, instance, salt); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function _predictDeterministicAddress(bytes32 salt) internal view returns (address instance) { instance = progenitor.predictDeterministicAddress(salt); } /** * @dev hook that is ran before cloning */ function _beforeClone( address deployer, address _progenitor, address clone_, bytes32 salt ) internal virtual {} /** * @dev hook that is ran after cloning */ function _afterClone( address deployer, address _progenitor, address clone_, bytes32 salt ) internal virtual {} } // File contracts/libraries/Random.sol // Brandon Lehmann <[email protected]> library Random { /** * @dev Generates simple on-chain entropy */ function getEntropy() internal view returns (bytes32) { return keccak256( abi.encodePacked( address(this), msg.sender, block.coinbase, block.number, block.timestamp, block.difficulty, msg.data ) ); } /** * @dev Generates a random value within the range of the value */ function randomize(uint256 value) internal view returns (uint256) { return _getEntropy(value, 0x0) % value; } /** * @dev Generates a random value within the range of the specified maximum value */ function randomize(uint256 value, uint256 maximumValue) internal view returns (uint256) { return _getEntropy(value, 0x0) % maximumValue; } /** * @dev Generates a random value within the range of the value using the supplied entropy */ function randomizeWithEntropy(uint256 value, bytes32 entropy) internal view returns (uint256) { return _getEntropy(value, entropy) % value; } /** * @dev Generates a random value within the range of the specified maximum value using the supplied entropy */ function randomizeWithEntropy( uint256 value, bytes32 entropy, uint256 maximumValue ) internal view returns (uint256) { return _getEntropy(value, entropy) % maximumValue; } /** * @dev Generates simple on-chain entropy that is salted with the supplied entropy */ function _getEntropy(uint256 value, bytes32 entropy) private view returns (uint256) { return uint256( keccak256( abi.encodePacked( address(this), msg.sender, block.coinbase, block.number, block.timestamp, block.difficulty, msg.data, value, entropy ) ) ); } } // File contracts/abstracts/URIMaskable.sol abstract contract URIMaskable is Context { using Strings for uint256; using Random for uint256; event ChangeURIService(address indexed _old, address indexed _new); event URIMasked(); event URIUnmasked(); uint256 private _RANDOM_SEED; bool private _URI_MASKED; address private _URI_SERVICE; modifier whenURINotMasked() { require(!_URI_MASKED, "URI masked"); _; } modifier whenURIMasked() { require(_URI_MASKED, "URI not masked"); _; } modifier onlyMaskService() { require(_msgSender() == _URI_SERVICE, "caller not masking service"); _; } /****** PUBLIC METHODS ******/ function URI_MASKED() public view returns (bool) { return _URI_MASKED; } /****** INTERNAL METHODS ******/ function _disableMasking() internal whenURIMasked { _URI_MASKED = false; emit URIUnmasked(); } function _enableMasking() internal whenURINotMasked { _RANDOM_SEED = type(uint256).max.randomize(); _URI_MASKED = true; emit URIMasked(); } function _generateURIMask(uint256 tokenId) internal view returns (string memory) { return uint256(keccak256(abi.encodePacked(_RANDOM_SEED, tokenId))).toHexString(32); } function _getRandomSeed() internal view onlyMaskService returns (uint256) { return _RANDOM_SEED; } function _setMaskingService(address service) internal { address old = _URI_SERVICE; _URI_SERVICE = service; emit ChangeURIService(old, service); } function _setRandomSeed(uint256 seed) internal onlyMaskService { _RANDOM_SEED = seed; } } // File contracts/abstracts/ClampedRandomizer.sol abstract contract ClampedRandomizer { using Random for uint256; uint256 private _scopeIndex = 0; //Clamping cache for random TokenID generation in the anti-sniping algo uint256 private _scopeCap; //Size of initial randomized number pool & max generated value (zero indexed) mapping(uint256 => uint256) private _swappedIDs; //TokenID cache for random TokenID generation in the anti-sniping algo constructor(uint256 scopeCap) { _scopeCap = scopeCap; } function _setClampedScope(uint256 scopeCap) internal { require(scopeCap >= _scopeCap, "ClampedRandomizer: scopeCap must be >= currentScopeCap"); _scopeCap = scopeCap; } function _generateClampedNonce() internal returns (uint256) { uint256 scope = _scopeCap - _scopeIndex; uint256 swap; uint256 result; // get random number bound by 2^256-2; uint256 i = type(uint256).max.randomize() % scope; //Setup the value to swap in for the selected number if (_swappedIDs[scope - 1] == 0) { swap = scope - 1; } else { swap = _swappedIDs[scope - 1]; } //Select a random number, swap it out with an unselected one then shorten the selection range by 1 if (_swappedIDs[i] == 0) { result = i; _swappedIDs[i] = swap; } else { result = _swappedIDs[i]; _swappedIDs[i] = swap; } _scopeIndex++; return result; } } // File contracts/interfaces/IERC721.Omnichain.sol /** * @dev Interface of the ONFT Core standard */ interface IERC721Omnichain is IERC165 { /** * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) * _dstChainId - L0 defined chain id to send tokens too * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain * _tokenId - token Id to transfer * _useZro - indicates to use zro to pay L0 fees * _adapterParams - flexible bytes array to indicate messaging adapter services in L0 */ function estimateSendFee( uint16 _dstChainId, bytes calldata _toAddress, uint256 _tokenId, bool _useZro, bytes calldata _adapterParams ) external view returns (uint256 nativeFee, uint256 zroFee); /** * @dev send token `_tokenId` to (`_dstChainId`, `_toAddress`) from `_from` * `_toAddress` can be any size depending on the `dstChainId`. * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParams` is a flexible bytes array to indicate messaging adapter services */ function sendFrom( address _from, uint16 _dstChainId, bytes calldata _toAddress, uint256 _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) external payable; /** * @dev Emitted when `_tokenId` are moved from the `_sender` to (`_dstChainId`, `_toAddress`) * `_nonce` is the outbound nonce from */ event SendToChain( address indexed _sender, uint16 indexed _dstChainId, bytes indexed _toAddress, uint256 _tokenId, uint64 _nonce ); /** * @dev Emitted when `_tokenId` are sent from `_srcChainId` to the `_toAddress` at this chain. `_nonce` is the inbound nonce. */ event ReceiveFromChain( uint16 indexed _srcChainId, bytes indexed _srcAddress, address indexed _toAddress, uint256 _tokenId, uint64 _nonce ); } // File contracts/abstracts/ERC721.Omnichain.sol abstract contract ERC721Omnichain is ERC721Enumerable, ERC721Pausable, ERC721Royalty, ERC721Burnable, URIMaskable, ClampedRandomizer, NonblockingLzApp, Cloneable, IERC721Omnichain { /** * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) * _dstChainId - L0 defined chain id to send tokens too * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain * _tokenId - token Id to transfer * _useZro - indicates to use zro to pay L0 fees * _adapterParams - flexible bytes array to indicate messaging adapter services in L0 */ function estimateSendFee( uint16 dstChainId, bytes memory to, uint256 tokenId, bool useZro, bytes memory adapterParams ) public view virtual returns (uint256 nativeFee, uint256 zroFee) { bytes memory payload = abi.encode(to, tokenId); return lzEndpoint.estimateFees(dstChainId, address(this), payload, useZro, adapterParams); } /** * @dev send token `_tokenId` to (`_dstChainId`, `_toAddress`) from `_from` * `_toAddress` can be any size depending on the `dstChainId`. * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParams` is a flexible bytes array to indicate messaging adapter services */ function sendFrom( address from, uint16 dstChainId, bytes memory to, uint256 tokenId, address payable refundAddress, address zroPaymentAddress, bytes memory adapterParams ) public payable virtual { _send(from, dstChainId, to, tokenId, refundAddress, zroPaymentAddress, adapterParams); } /****** INTERNAL METHODS ******/ function _nonblockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual override { // decode and load the toAddress (bytes memory toAddressBytes, uint256 tokenId) = abi.decode(_payload, (bytes, uint256)); address toAddress; assembly { toAddress := mload(add(toAddressBytes, 20)) } _creditTo(_srcChainId, toAddress, tokenId); emit ReceiveFromChain(_srcChainId, _srcAddress, toAddress, tokenId, _nonce); } function _creditTo( uint16, address to, uint256 tokenId ) internal virtual { _safeMint(to, tokenId); } function _debitFrom( address from, uint16, bytes memory, uint256 tokenId ) internal virtual { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: send caller is not owner nor approved"); require(ownerOf(tokenId) == from, "ERC721: send from incorrect owner"); _burn(tokenId); } /** * @dev send token `_tokenId` to (`_dstChainId`, `_toAddress`) from `_from` * `_toAddress` can be any size depending on the `dstChainId`. * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParams` is a flexible bytes array to indicate messaging adapter services */ function _send( address from, uint16 dstChainId, bytes memory to, uint256 tokenId, address payable refundAddress, address zroPaymentAddress, bytes memory adapterParams ) internal virtual { _debitFrom(from, dstChainId, to, tokenId); bytes memory payload = abi.encode(to, tokenId); _lzSend(dstChainId, payload, refundAddress, zroPaymentAddress, adapterParams); uint64 nonce = lzEndpoint.getOutboundNonce(dstChainId, address(this)); emit SendToChain(from, dstChainId, to, tokenId, nonce); } /** * @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 override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._afterTokenTransfer(from, 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 override(ERC721, ERC721Royalty) { super._burn(tokenId); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721, ERC721Enumerable, ERC721Royalty) returns (bool) { return ERC721Enumerable.supportsInterface(interfaceId) || ERC721Royalty.supportsInterface(interfaceId) || ERC721.supportsInterface(interfaceId) || interfaceId == type(IERC721Omnichain).interfaceId || super.supportsInterface(interfaceId); } // default receive function receive() external payable virtual {} } // File contracts/Buried/Buried.sol contract BuriedSkellies is ERC721Omnichain { using Address for address; uint256 public immutable MAX_SUPPLY = 1920; uint256 public immutable MAX_PER_WALLET = 50; uint256 public TOTAL_MINTED = 0; string private URI_PREFIX = ""; uint256 public MINT_START_TIME = 1655233200; uint256 public BASE_STAKING_REWARD = 10 ether; uint256 public BASE_STAKING_TIME = 60 days; uint256 public immutable DRIP_RATE = BASE_STAKING_REWARD / BASE_STAKING_TIME; mapping(uint256 => uint256) public lastClaimTimestamp; constructor() ERC721("Buried Skellies", "BS") ClampedRandomizer(1920) LzApp(0xb6319cC6c8c27A8F5dAF0dD3DF91EA35C4720dd7) { _enableMasking(); _setMaskingService(0xe60E6506d73C15C10DF4fA90380BBc6291152c41); _setDefaultRoyalty(address(this), 1000); // royalties paid to this contract, 10% } /****** PUBLIC METHODS ******/ function airdrop(address[] memory recipients, uint256[] memory counts) public onlyOwner { require(recipients.length == counts.length); for (uint256 i = 0; i < recipients.length; i++) { _mintNFT(recipients[i], counts[i]); } } function claim(address owner) public { (uint256 amount, uint256[] memory tokenIds) = claimable(owner); for (uint256 i = 0; i < tokenIds.length; i++) { lastClaimTimestamp[tokenIds[i]] = block.timestamp; } // if there's nothing left, there's nothing left, aight? (bool sent, ) = payable(owner).call{ value: amount }(""); require(sent, "could not distribute funds"); } function claimable(address owner) public view returns (uint256 amount, uint256[] memory tokenIds) { amount = 0; tokenIds = _stakedIds(owner); if (tokenIds.length == 0) { return (0, new uint256[](0)); } for (uint256 i = 0; i < tokenIds.length; i++) { if (lastClaimTimestamp[tokenIds[i]] <= block.timestamp) { amount += DRIP_RATE * (block.timestamp - lastClaimTimestamp[tokenIds[i]]); } } } function claimable(uint256 tokenId) public view returns (uint256) { if (lastClaimTimestamp[tokenId] >= block.timestamp) { return 0; } return DRIP_RATE * (block.timestamp - lastClaimTimestamp[tokenId]); } function isStaked(uint256 tokenId) public view returns (bool) { return _isStaked(tokenId); } function mint(uint256 count) public payable returns (uint256[] memory) { require(block.timestamp >= MINT_START_TIME, "mint not open"); require(count <= 10, "max mint per call exceeded"); require(msg.value == count * MINT_PRICE(), "caller supplied wrong value"); (bool sent, ) = payable(0xb1a9a840E7ED5b97e559aFCA416C566A6a0ad06F).call{ value: msg.value - (count * BASE_STAKING_REWARD) }(""); require(sent); return _mintNFT(_msgSender(), count); } function MINT_PRICE() public view returns (uint256) { if (block.timestamp >= MINT_START_TIME && block.timestamp <= MINT_START_TIME + 10 minutes) { if (IERC721(0x2F14c76B8793F775D37d45beE5ed6336471805c4).balanceOf(_msgSender()) != 0) { // cyber skellies return 15 ether; } else if (IERC721(0xBf73c78d6df63941d29593916DDf11a62B7B02f3).balanceOf(_msgSender()) != 0) { // champion skellies return 16 ether; } else if ( IERC721(0x5fFA60EF5790dC4c01113D24449fF445D97f22db).balanceOf(_msgSender()) != 0 || // mutants IERC721(0x11020CA3c1547a3332A2386dBF0a6d63dd1173Ee).balanceOf(_msgSender()) != 0 || // sharks IERC721(0x0DC238932032dE4ac7de445b533Be2a205892984).balanceOf(_msgSender()) != 0 || // OG skellies IERC721(0xf1EdD11dF477d5d3BF335C8b1b1B15177cb405b2).balanceOf(_msgSender()) != 0 || // punks v1 IERC721(0xE84EbAD6fc852Ba2bE5A6d737CdFf6e4B44C73A7).balanceOf(_msgSender()) != 0 // punks v2 ) { return 17 ether; } } return 20 ether; } function setMintStartTime(uint256 mintStartTime) public onlyOwner { MINT_START_TIME = mintStartTime; } function setURIPrefix(string memory prefix) public onlyOwner { URI_PREFIX = prefix; } function stake(uint256[] memory tokenIds) public { require(tokenIds.length != 0); for (uint256 i = 0; i < tokenIds.length; i++) { require(ownerOf(tokenIds[i]) == _msgSender(), "not the owner of token"); require(!_isStaked(tokenIds[i]), "token already staked"); lastClaimTimestamp[tokenIds[i]] = (block.timestamp > MINT_START_TIME) ? block.timestamp : MINT_START_TIME; } } function staked(address owner) public view returns (uint256[] memory tokenIds) { return _stakedIds(owner); } function tokenMask(uint256 tokenId) public view onlyMaskService returns (string memory) { return _generateURIMask(tokenId); } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: tokenID does not exist"); return string(abi.encodePacked(URI_PREFIX, _generateURIMask(tokenId), ".json")); } function unstake(uint256[] memory tokenIds) public { require(tokenIds.length != 0); for (uint256 i = 0; i < tokenIds.length; i++) { require(ownerOf(tokenIds[i]) == _msgSender(), "not the owner of token"); require(_isStaked(tokenIds[i]), "token not staked"); lastClaimTimestamp[tokenIds[i]] = type(uint256).max; } } /****** INTERNAL METHODS ******/ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override { if (from != address(0)) { require(!_isStaked(tokenId), "token is currently staked"); } if (!to.isContract() && to != address(0) && to != address(1)) { require(balanceOf(to) + 1 <= MAX_PER_WALLET, "max per wallet exceeded"); } super._beforeTokenTransfer(from, to, tokenId); } function _isStaked(uint256 tokenId) internal view returns (bool) { return lastClaimTimestamp[tokenId] != type(uint256).max; } function _mintNFT(address to, uint256 count) internal returns (uint256[] memory tokenIds) { require(TOTAL_MINTED + count <= MAX_SUPPLY, "max supply exceeded"); TOTAL_MINTED += count; tokenIds = new uint256[](count); for (uint256 i = 0; i < count; i++) { tokenIds[i] = _generateClampedNonce() + 1; _safeMint(to, tokenIds[i]); lastClaimTimestamp[tokenIds[i]] = (block.timestamp > MINT_START_TIME) ? block.timestamp : MINT_START_TIME; } } function _stakedCount(address owner) internal view returns (uint256 count) { count = 0; uint256[] memory tokenIds = _ownerTokens(owner); if (tokenIds.length == 0) { return 0; } for (uint256 i = 0; i < tokenIds.length; i++) { count += _isStaked(tokenIds[i]) ? 1 : 0; } } function _stakedIds(address owner) internal view returns (uint256[] memory tokenIds) { uint256 count = _stakedCount(owner); if (count == 0) { return new uint256[](0); } tokenIds = new uint256[](count); uint256[] memory ownedIds = _ownerTokens(owner); if (ownedIds.length == 0) { return new uint256[](0); } uint256 idx; for (uint256 i = 0; i < ownedIds.length; i++) { if (_isStaked(ownedIds[i])) { tokenIds[idx++] = ownedIds[i]; } } } function _ownerTokens(address owner) internal view returns (uint256[] memory tokenIds) { uint256 balance = balanceOf(owner); if (balance == 0) { return new uint256[](0); } tokenIds = new uint256[](balance); for (uint256 i = 0; i < balance; i++) { tokenIds[i] = tokenOfOwnerByIndex(owner, i); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_old","type":"address"},{"indexed":true,"internalType":"address","name":"_new","type":"address"}],"name":"ChangeURIService","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deployer","type":"address"},{"indexed":true,"internalType":"address","name":"progenitor","type":"address"},{"indexed":true,"internalType":"address","name":"clone","type":"address"},{"indexed":false,"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"CloneDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":true,"internalType":"address","name":"_toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"SetTrustedRemote","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"},{"anonymous":false,"inputs":[],"name":"URIMasked","type":"event"},{"anonymous":false,"inputs":[],"name":"URIUnmasked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BASE_STAKING_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_STAKING_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DRIP_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URI_MASKED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"bytes","name":"to","type":"bytes"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"useZro","type":"bool"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastClaimTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","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":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"pushOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"bytes","name":"to","type":"bytes"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintStartTime","type":"uint256"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"}],"name":"setURIPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"staked","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenMask","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6000600f81905561078060c052603260e052601781905561014060408190526101208290526200003391601891906200040f565b506362a8dab0601955678ac7230489e80000601a819055624f1a00601b8190556200005e91620004cb565b610100523480156200006f57600080fd5b5073b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76107806040518060400160405280600f81526020016e42757269656420536b656c6c69657360881b81525060405180604001604052806002815260200161425360f01b8152508160029080519060200190620000e39291906200040f565b508051620000f99060039060208401906200040f565b5050600c805460ff1916905550601055620001143362000161565b6001600160a01b03166080523060a0526200012e620001b3565b6200014d73e60e6506d73c15c10df4fa90380bbc6291152c416200024c565b6200015b306103e8620002a6565b62000597565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600e5460ff1615620001f95760405162461bcd60e51b815260206004820152600a602482015269155492481b585cdad95960b21b60448201526064015b60405180910390fd5b62000211600019620003a760201b62002da21760201c565b600d55600e805460ff191660011790556040517f308eba9d21b2f18f7c4885d8c7a0862d814b1bd0403476a7e1621b7fd0ab624290600090a1565b600e80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f5135a20bb07b198951dc756531d3e33a7cb6ffc38da770327a96ca24bb25788e90600090a35050565b6127106001600160601b0382161115620003165760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620001f0565b6001600160a01b0382166200036e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620001f0565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b600081620003b68183620003c8565b620003c29190620004e2565b92915050565b60003033414342446000368a8a604051602001620003f09a99989796959493929190620004f9565b60408051601f1981840301815291905280516020909101209392505050565b8280546200041d906200055b565b90600052602060002090601f0160209004810192826200044157600085556200048c565b82601f106200045c57805160ff19168380011785556200048c565b828001600101855582156200048c579182015b828111156200048c5782518255916020019190600101906200046f565b506200049a9291506200049e565b5090565b5b808211156200049a57600081556001016200049f565b634e487b7160e01b600052601260045260246000fd5b600082620004dd57620004dd620004b5565b500490565b600082620004f457620004f4620004b5565b500690565b6001600160601b031960608c811b821683528b811b821660148401528a901b166028820152603c8101889052605c8101879052607c810186905260008486609c84013750609c93019283019190915260bc82015260dc01979650505050505050565b600181811c908216806200057057607f821691505b6020821081036200059157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516157b0620006376000396000818161070f015281816118ea015261278e0152600081816104df0152613b9f01526000818161068d015261359f01526000610bd60152600081816109fe01528181610c4901528181610fb2015281816113950152818161159101528181611a34015281816126dc01528181612d20015281816134170152613f7501526157b06000f3fe6080604052600436106103b05760003560e01c806365e9707b116101e7578063b88d4fde1161010d578063d39ce77c116100a0578063eb8d72b71161006f578063eb8d72b714610ba7578063f05b3bff14610bc7578063f2fde38b14610c06578063f5ecbdbc14610c2657600080fd5b8063d39ce77c14610afe578063d5b3621b14610b1e578063e449f34114610b3e578063e985e9c514610b5e57600080fd5b8063c87b56dd116100dc578063c87b56dd14610a8b578063cbed8b9c14610aab578063d1d58b2514610acb578063d1deba1f14610aeb57600080fd5b8063b88d4fde14610a20578063baa51f8614610a40578063c002d23d14610a60578063c54d668f14610a7557600080fd5b80637e2ade0c1161018557806398807d841161015457806398807d841461098c578063a0712d68146109b9578063a22cb465146109cc578063b353aaa7146109ec57600080fd5b80637e2ade0c1461092e5780637ff28d3a146109445780638da5cb5b1461095957806395d89b411461097757600080fd5b80636bff2c24116101c15780636bff2c24146108b957806370a08231146108d9578063715018a6146108f95780637533d7881461090e57600080fd5b806365e9707b1461086357806366ad5c8a14610879578063672434821461089957600080fd5b80632a55205a116102d757806342966c681161026a578063519056361161023957806351905636146107c95780635b8c41e6146107dc5780635c975abb1461082b5780636352211e1461084357600080fd5b806342966c681461075157806342d65a8d146107715780634c971e56146107915780634f6ccce7146107a957600080fd5b80633d8b38f6116102a65780633d8b38f6146106af578063402914f5146106cf57806340f693e3146106fd57806342842e0e1461073157600080fd5b80632a55205a146105ef5780632b84bf0d1461062e5780632f745c591461065b57806332cb6b0c1461067b57600080fd5b80630f2cdd6c1161034f57806318160ddd1161031e57806318160ddd146105655780631e83409a1461057a57806323b872dd1461059a5780632a205e3d146105ba57600080fd5b80630f2cdd6c146104cd5780630fbf0a931461050f57806310ddb1371461052f5780631147f85b1461054f57600080fd5b806306fdde031161038b57806306fdde031461044057806307e0db1714610455578063081812fc14610475578063095ea7b3146104ad57600080fd5b80621d3567146103bc57806301ffc9a7146103de5780630451aefc1461041357600080fd5b366103b757005b600080fd5b3480156103c857600080fd5b506103dc6103d7366004614984565b610c46565b005b3480156103ea57600080fd5b506103fe6103f9366004614a23565b610ded565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e366004614a40565b610e46565b60405161040a9190614ab1565b34801561044c57600080fd5b50610433610ebf565b34801561046157600080fd5b506103dc610470366004614ac4565b610f51565b34801561048157600080fd5b50610495610490366004614a40565b611013565b6040516001600160a01b03909116815260200161040a565b3480156104b957600080fd5b506103dc6104c8366004614af4565b6110a8565b3480156104d957600080fd5b506105017f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161040a565b34801561051b57600080fd5b506103dc61052a366004614baa565b6111bd565b34801561053b57600080fd5b506103dc61054a366004614ac4565b611334565b34801561055b57600080fd5b50610501601b5481565b34801561057157600080fd5b50600a54610501565b34801561058657600080fd5b506103dc610595366004614bdf565b6113cc565b3480156105a657600080fd5b506103dc6105b5366004614bfc565b6114d6565b3480156105c657600080fd5b506105da6105d5366004614c4d565b611552565b6040805192835260208301919091520161040a565b3480156105fb57600080fd5b5061060f61060a366004614cdc565b61161d565b604080516001600160a01b03909316835260208301919091520161040a565b34801561063a57600080fd5b50610501610649366004614a40565b601c6020526000908152604090205481565b34801561066757600080fd5b50610501610676366004614af4565b6116da565b34801561068757600080fd5b506105017f000000000000000000000000000000000000000000000000000000000000000081565b3480156106bb57600080fd5b506103fe6106ca366004614d40565b611770565b3480156106db57600080fd5b506106ef6106ea366004614bdf565b61183c565b60405161040a929190614dce565b34801561070957600080fd5b506105017f000000000000000000000000000000000000000000000000000000000000000081565b34801561073d57600080fd5b506103dc61074c366004614bfc565b611933565b34801561075d57600080fd5b506103dc61076c366004614a40565b61194e565b34801561077d57600080fd5b506103dc61078c366004614d40565b6119d5565b34801561079d57600080fd5b50600e5460ff166103fe565b3480156107b557600080fd5b506105016107c4366004614a40565b611aa4565b6103dc6107d7366004614de7565b611b37565b3480156107e857600080fd5b506105016107f7366004614ea1565b6015602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561083757600080fd5b50600c5460ff166103fe565b34801561084f57600080fd5b5061049561085e366004614a40565b611b46565b34801561086f57600080fd5b50610501601a5481565b34801561088557600080fd5b506103dc610894366004614984565b611bbd565b3480156108a557600080fd5b506103dc6108b4366004614f03565b611c27565b3480156108c557600080fd5b506103dc6108d4366004614fc5565b611cd8565b3480156108e557600080fd5b506105016108f4366004614bdf565b611d33565b34801561090557600080fd5b506103dc611dba565b34801561091a57600080fd5b50610433610929366004614ac4565b611e0e565b34801561093a57600080fd5b5061050160195481565b34801561095057600080fd5b506103dc611ea8565b34801561096557600080fd5b506012546001600160a01b0316610495565b34801561098357600080fd5b50610433611f70565b34801561099857600080fd5b506109ac6109a7366004614bdf565b611f7f565b60405161040a919061500e565b6109ac6109c7366004614a40565b611f8a565b3480156109d857600080fd5b506103dc6109e7366004615021565b61210f565b3480156109f857600080fd5b506104957f000000000000000000000000000000000000000000000000000000000000000081565b348015610a2c57600080fd5b506103dc610a3b366004615056565b61211a565b348015610a4c57600080fd5b506103fe610a5b366004614a40565b612196565b348015610a6c57600080fd5b506105016121af565b348015610a8157600080fd5b5061050160175481565b348015610a9757600080fd5b50610433610aa6366004614a40565b6125d5565b348015610ab757600080fd5b506103dc610ac63660046150b6565b61267d565b348015610ad757600080fd5b50610501610ae6366004614a40565b612752565b6103dc610af9366004614984565b6127b2565b348015610b0a57600080fd5b506103dc610b19366004614bdf565b612906565b348015610b2a57600080fd5b506103dc610b39366004614a40565b612a0f565b348015610b4a57600080fd5b506103dc610b59366004614baa565b612a5c565b348015610b6a57600080fd5b506103fe610b79366004615125565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610bb357600080fd5b506103dc610bc2366004614d40565b612b92565b348015610bd357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163014156103fe565b348015610c1257600080fd5b506103dc610c21366004614bdf565b612c39565b348015610c3257600080fd5b50610433610c4136600461515e565b612cef565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610cc35760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff841660009081526014602052604081208054610ce1906151ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0d906151ab565b8015610d5a5780601f10610d2f57610100808354040283529160200191610d5a565b820191906000526020600020905b815481529060010190602001808311610d3d57829003601f168201915b5050505050905080518451148015610d7f575080805190602001208480519060200120145b610dda5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610cba565b610de685858585612db9565b5050505050565b6000610df882612eab565b80610e075750610e0782612ed0565b80610e165750610e1682612edb565b80610e3157506001600160e01b03198216637bb0080b60e01b145b80610e405750610e4082612ed0565b92915050565b600e5460609061010090046001600160a01b0316336001600160a01b031614610eb15760405162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206e6f74206d61736b696e6720736572766963650000000000006044820152606401610cba565b610e4082612f1b565b919050565b606060028054610ece906151ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610efa906151ab565b8015610f475780601f10610f1c57610100808354040283529160200191610f47565b820191906000526020600020905b815481529060010190602001808311610f2a57829003601f168201915b5050505050905090565b6012546001600160a01b03163314610f995760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610fff57600080fd5b505af1158015610de6573d6000803e3d6000fd5b6000818152600460205260408120546001600160a01b031661108c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cba565b506000908152600660205260409020546001600160a01b031690565b60006110b382611b46565b9050806001600160a01b0316836001600160a01b0316036111205760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cba565b336001600160a01b038216148061113c575061113c8133610b79565b6111ae5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610cba565b6111b88383612f5e565b505050565b80516000036111cb57600080fd5b60005b815181101561133057336001600160a01b03166112038383815181106111f6576111f66151e5565b6020026020010151611b46565b6001600160a01b0316146112595760405162461bcd60e51b815260206004820152601660248201527f6e6f7420746865206f776e6572206f6620746f6b656e000000000000000000006044820152606401610cba565b61128d82828151811061126e5761126e6151e5565b60200260200101516000908152601c6020526040902054600019141590565b156112da5760405162461bcd60e51b815260206004820152601460248201527f746f6b656e20616c7265616479207374616b65640000000000000000000000006044820152606401610cba565b60195442116112eb576019546112ed565b425b601c6000848481518110611303576113036151e5565b6020026020010151815260200190815260200160002081905550808061132890615211565b9150506111ce565b5050565b6012546001600160a01b0316331461137c5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610fe5565b6000806113d88361183c565b9150915060005b815181101561142c5742601c60008484815181106113ff576113ff6151e5565b6020026020010151815260200190815260200160002081905550808061142490615211565b9150506113df565b506000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461147a576040519150601f19603f3d011682016040523d82523d6000602084013e61147f565b606091505b50509050806114d05760405162461bcd60e51b815260206004820152601a60248201527f636f756c64206e6f7420646973747269627574652066756e64730000000000006044820152606401610cba565b50505050565b6114e1335b82612fcc565b6115475760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610cba565b6111b88383836130c2565b6000806000868660405160200161156a92919061522a565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb10906115ce908b90309086908b908b9060040161524c565b6040805180830381865afa1580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e919061529e565b92509250509550959350505050565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff1692820192909252829161169c5750604080518082019091526000546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b6020810151600090612710906116c0906bffffffffffffffffffffffff16876152c2565b6116ca91906152f7565b91519350909150505b9250929050565b60006116e583611d33565b82106117475760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610cba565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b61ffff831660009081526014602052604081208054829190611791906151ab565b80601f01602080910402602001604051908101604052809291908181526020018280546117bd906151ab565b801561180a5780601f106117df5761010080835404028352916020019161180a565b820191906000526020600020905b8154815290600101906020018083116117ed57829003601f168201915b50505050509050838360405161182192919061530b565b60405180910390208180519060200120149150509392505050565b6000606061184983613269565b9050805160000361186d576040805160008082526020820190925291509150915091565b60005b815181101561192d5742601c6000848481518110611890576118906151e5565b60200260200101518152602001908152602001600020541161191b57601c60008383815181106118c2576118c26151e5565b6020026020010151815260200190815260200160002054426118e4919061531b565b61190e907f00000000000000000000000000000000000000000000000000000000000000006152c2565b6119189084615332565b92505b8061192581615211565b915050611870565b50915091565b6111b88383836040518060200160405280600081525061211a565b611957336114db565b6119c95760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610cba565b6119d2816133ad565b50565b6012546001600160a01b03163314611a1d5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90611a6d90869086908690600401615373565b600060405180830381600087803b158015611a8757600080fd5b505af1158015611a9b573d6000803e3d6000fd5b50505050505050565b6000611aaf600a5490565b8210611b125760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610cba565b600a8281548110611b2557611b256151e5565b90600052602060002001549050919050565b611a9b878787878787876133b6565b6000818152600460205260408120546001600160a01b031680610e405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610cba565b333014611c1b5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610cba565b6114d0848484846134ff565b6012546001600160a01b03163314611c6f5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b8051825114611c7d57600080fd5b60005b82518110156111b857611cc5838281518110611c9e57611c9e6151e5565b6020026020010151838381518110611cb857611cb86151e5565b602002602001015161359b565b5080611cd081615211565b915050611c80565b6012546001600160a01b03163314611d205760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b8051611330906018906020840190614782565b60006001600160a01b038216611d9e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610cba565b506001600160a01b031660009081526005602052604090205490565b6012546001600160a01b03163314611e025760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b611e0c6000613733565b565b60146020526000908152604090208054611e27906151ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611e53906151ab565b8015611ea05780601f10611e7557610100808354040283529160200191611ea0565b820191906000526020600020905b815481529060010190602001808311611e8357829003601f168201915b505050505081565b6013546001600160a01b03163314611f0d5760405162461bcd60e51b815260206004820152602260248201527f4f776e61626c653a206d757374206265206e6577206f776e657220746f2070756044820152611b1b60f21b6064820152608401610cba565b6013546012546040516001600160a01b0392831692909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d90600090a3601354601280546001600160a01b0319166001600160a01b03909216919091179055565b606060038054610ece906151ab565b6060610e4082613269565b6060601954421015611fce5760405162461bcd60e51b815260206004820152600d60248201526c36b4b73a103737ba1037b832b760991b6044820152606401610cba565b600a82111561201f5760405162461bcd60e51b815260206004820152601a60248201527f6d6178206d696e74207065722063616c6c2065786365656465640000000000006044820152606401610cba565b6120276121af565b61203190836152c2565b341461207f5760405162461bcd60e51b815260206004820152601b60248201527f63616c6c657220737570706c6965642077726f6e672076616c756500000000006044820152606401610cba565b601a5460009073b1a9a840e7ed5b97e559afca416c566a6a0ad06f906120a590856152c2565b6120af903461531b565b604051600081818185875af1925050503d80600081146120eb576040519150601f19603f3d011682016040523d82523d6000602084013e6120f0565b606091505b50509050806120fe57600080fd5b612108338461359b565b9392505050565b611330338383613785565b6121243383612fcc565b61218a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610cba565b6114d084848484613853565b6000818152601c60205260408120546000191415610e40565b600060195442101580156121d157506019546121cd90610258615332565b4211155b156125c757732f14c76b8793f775d37d45bee5ed6336471805c46370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122599190615391565b1561226b575067d02ab486cedc000090565b73bf73c78d6df63941d29593916ddf11a62b7b02f36370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156122ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ee9190615391565b15612300575067de0b6b3a7640000090565b735ffa60ef5790dc4c01113d24449ff445d97f22db6370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561235f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123839190615391565b15158061241157507311020ca3c1547a3332a2386dbf0a6d63dd1173ee6370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156123ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240e9190615391565b15155b8061249d5750730dc238932032de4ac7de445b533be2a2058929846370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a9190615391565b15155b80612529575073f1edd11df477d5d3bf335c8b1b1b15177cb405b26370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190615391565b15155b806125b5575073e84ebad6fc852ba2be5a6d737cdff6e4b44c73a76370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561258e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b29190615391565b15155b156125c7575067ebec21ee1da4000090565b506801158e460913d0000090565b6000818152600460205260409020546060906001600160a01b031661264b5760405162461bcd60e51b815260206004820152602660248201527f4552433732314d657461646174613a20746f6b656e494420646f6573206e6f7460448201526508195e1a5cdd60d21b6064820152608401610cba565b601861265683612f1b565b6040516020016126679291906153c6565b6040516020818303038152906040529050919050565b6012546001600160a01b031633146126c55760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906127199088908890889088908890600401615480565b600060405180830381600087803b15801561273357600080fd5b505af1158015612747573d6000803e3d6000fd5b505050505050505050565b6000818152601c6020526040812054421161276f57506000919050565b6000828152601c6020526040902054612788904261531b565b610e40907f00000000000000000000000000000000000000000000000000000000000000006152c2565b61ffff841660009081526015602052604080822090516127d39086906154b9565b908152604080516020928190038301902067ffffffffffffffff8616600090815292529020549050806128545760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610cba565b8151602083012081146128b35760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610cba565b61ffff851660009081526015602052604080822090516128d49087906154b9565b908152604080516020928190038301902067ffffffffffffffff871660009081529252902055610de6858585856134ff565b6012546001600160a01b0316331461294e5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6001600160a01b0381166129b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cba565b6012546040516001600160a01b038084169216907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba90600090a3601380546001600160a01b0319166001600160a01b0392909216919091179055565b6012546001600160a01b03163314612a575760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b601955565b8051600003612a6a57600080fd5b60005b815181101561133057336001600160a01b0316612a958383815181106111f6576111f66151e5565b6001600160a01b031614612aeb5760405162461bcd60e51b815260206004820152601660248201527f6e6f7420746865206f776e6572206f6620746f6b656e000000000000000000006044820152606401610cba565b612b0082828151811061126e5761126e6151e5565b612b4c5760405162461bcd60e51b815260206004820152601060248201527f746f6b656e206e6f74207374616b6564000000000000000000000000000000006044820152606401610cba565b600019601c6000848481518110612b6557612b656151e5565b60200260200101518152602001908152602001600020819055508080612b8a90615211565b915050612a6d565b6012546001600160a01b03163314612bda5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b61ffff83166000908152601460205260409020612bf8908383614806565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051612c2c93929190615373565b60405180910390a1505050565b6012546001600160a01b03163314612c815760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6001600160a01b038116612ce65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cba565b6119d281613733565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612d6f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d97919081019061551a565b90505b949350505050565b600081612daf81836138d1565b610e40919061554f565b604051633356ae4560e11b815230906366ad5c8a90612de2908790879087908790600401615563565b600060405180830381600087803b158015612dfc57600080fd5b505af1925050508015612e0d575060015b6114d0578080519060200120601560008661ffff1661ffff16815260200190815260200160002084604051612e4291906154b9565b90815260408051918290036020908101832067ffffffffffffffff87166000908152915220919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90612e9e908690869086908690615563565b60405180910390a16114d0565b60006001600160e01b0319821663780e9d6360e01b1480610e405750610e4082612edb565b6000610e4082612eab565b60006001600160e01b031982166380ac58cd60e01b1480612f0c57506001600160e01b03198216635b5e139f60e01b145b80610e405750610e4082613916565b6060610e406020600d5484604051602001612f40929190918252602082015260400190565b60408051601f1981840301815291905280516020909101209061394b565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f9382611b46565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166130455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cba565b600061305083611b46565b9050806001600160a01b0316846001600160a01b0316148061309757506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b80612d9a5750836001600160a01b03166130b084611013565b6001600160a01b031614949350505050565b826001600160a01b03166130d582611b46565b6001600160a01b0316146131395760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610cba565b6001600160a01b03821661319b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cba565b6131a6838383613af4565b6131b1600082612f5e565b6001600160a01b03831660009081526005602052604081208054600192906131da90849061531b565b90915550506001600160a01b0382166000908152600560205260408120805460019290613208908490615332565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060600061327683613c2b565b9050806000036132b45760005b6040519080825280602002602001820160405280156132ac578160200160208202803683370190505b509392505050565b8067ffffffffffffffff8111156132cd576132cd6148a1565b6040519080825280602002602001820160405280156132f6578160200160208202803683370190505b509150600061330484613ca2565b9050805160000361332657505060408051600081526020810190915292915050565b6000805b82518110156133a45761334883828151811061126e5761126e6151e5565b156133925782818151811061335f5761335f6151e5565b602002602001015185838061337390615211565b945081518110613385576133856151e5565b6020026020010181815250505b8061339c81615211565b91505061332a565b50505050919050565b6119d281613d49565b6133c287878787613d63565b600085856040516020016133d792919061522a565b60405160208183030381529060405290506133f58782868686613e4a565b604051630f428ae960e31b815261ffff881660048201523060248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637a14574890604401602060405180830381865afa158015613466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348a91906155a2565b90508660405161349a91906154b9565b6040805191829003822088835267ffffffffffffffff841660208401529161ffff8b16916001600160a01b038d16917f024797cc77ce15dc717112d54fb1df125fdfd8c81344fb046c5e074427ce1543910160405180910390a4505050505050505050565b6000808280602001905181019061351691906155bf565b6014820151919350915061352b878284613ff0565b806001600160a01b03168660405161354391906154b9565b6040805191829003822085835267ffffffffffffffff891660208401529161ffff8b16917f64e10c37f404d128982dce114f5d233c14c5c7f6d8db93099e3d99dacb9e27ba910160405180910390a450505050505050565b60607f0000000000000000000000000000000000000000000000000000000000000000826017546135cc9190615332565b111561361a5760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610cba565b816017600082825461362c9190615332565b9091555082905067ffffffffffffffff81111561364b5761364b6148a1565b604051908082528060200260200182016040528015613674578160200160208202803683370190505b50905060005b8281101561372c5761368a613ffa565b613695906001615332565b8282815181106136a7576136a76151e5565b6020026020010181815250506136d6848383815181106136c9576136c96151e5565b60200260200101516140e7565b60195442116136e7576019546136e9565b425b601c60008484815181106136ff576136ff6151e5565b6020026020010151815260200190815260200160002081905550808061372490615211565b91505061367a565b5092915050565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036137e65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cba565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61385e8484846130c2565b61386a84848484614101565b6114d05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610cba565b60003033414342446000368a8a6040516020016138f79a99989796959493929190615606565b60408051601f1981840301815291905280516020909101209392505050565b60006001600160e01b0319821663152a902d60e11b1480610e4057506301ffc9a760e01b6001600160e01b0319831614610e40565b6060600061395a8360026152c2565b613965906002615332565b67ffffffffffffffff81111561397d5761397d6148a1565b6040519080825280601f01601f1916602001820160405280156139a7576020820181803683370190505b509050600360fc1b816000815181106139c2576139c26151e5565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106139f1576139f16151e5565b60200101906001600160f81b031916908160001a9053506000613a158460026152c2565b613a20906001615332565b90505b6001811115613aa5577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110613a6157613a616151e5565b1a60f81b828281518110613a7757613a776151e5565b60200101906001600160f81b031916908160001a90535060049490941c93613a9e8161566d565b9050613a23565b5083156121085760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cba565b6001600160a01b03831615613b62576000818152601c602052604090205460001914613b625760405162461bcd60e51b815260206004820152601960248201527f746f6b656e2069732063757272656e746c79207374616b6564000000000000006044820152606401610cba565b6001600160a01b0382163b158015613b8257506001600160a01b03821615155b8015613b9857506001600160a01b038216600114155b15613c20577f0000000000000000000000000000000000000000000000000000000000000000613bc783611d33565b613bd2906001615332565b1115613c205760405162461bcd60e51b815260206004820152601760248201527f6d6178207065722077616c6c65742065786365656465640000000000000000006044820152606401610cba565b6111b883838361424a565b600080613c3783613ca2565b90508051600003613c4b5750600092915050565b60005b8151811015613c9b57613c6c82828151811061126e5761126e6151e5565b613c77576000613c7a565b60015b613c879060ff1684615332565b925080613c9381615211565b915050613c4e565b5050919050565b60606000613caf83611d33565b905080600003613cc0576000613283565b8067ffffffffffffffff811115613cd957613cd96148a1565b604051908082528060200260200182016040528015613d02578160200160208202803683370190505b50915060005b81811015613c9b57613d1a84826116da565b838281518110613d2c57613d2c6151e5565b602090810291909101015280613d4181615211565b915050613d08565b613d5281614255565b600090815260016020526040812055565b613d6c336114db565b613dce5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2073656e642063616c6c6572206973206e6f74206f776e657260448201526c081b9bdc88185c1c1c9bdd9959609a1b6064820152608401610cba565b836001600160a01b0316613de182611b46565b6001600160a01b031614613e415760405162461bcd60e51b815260206004820152602160248201527f4552433732313a2073656e642066726f6d20696e636f7272656374206f776e656044820152603960f91b6064820152608401610cba565b6114d0816133ad565b61ffff851660009081526014602052604081208054613e68906151ab565b80601f0160208091040260200160405190810160405280929190818152602001828054613e94906151ab565b8015613ee15780601f10613eb657610100808354040283529160200191613ee1565b820191906000526020600020905b815481529060010190602001808311613ec457829003601f168201915b505050505090508051600003613f5f5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201527f61207472757374656420736f75726365000000000000000000000000000000006064820152608401610cba565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c5803100903490613fb6908a9086908b908b908b908b90600401615684565b6000604051808303818588803b158015613fcf57600080fd5b505af1158015613fe3573d6000803e3d6000fd5b5050505050505050505050565b6111b882826140e7565b600080600f5460105461400d919061531b565b9050600080600083614020600019612da2565b61402a919061554f565b90506011600061403b60018761531b565b8152602001908152602001600020546000036140635761405c60018561531b565b9250614084565b6011600061407260018761531b565b81526020019081526020016000205492505b60008181526011602052604081205490036140b25760008181526011602052604090208390559050806140c9565b600081815260116020526040902080549084905591505b600f80549060006140d983615211565b909155509195945050505050565b6113308282604051806020016040528060008152506142fc565b60006001600160a01b0384163b1561424257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906141459033908990889088906004016156eb565b6020604051808303816000875af1925050508015614180575060408051601f3d908101601f1916820190925261417d91810190615727565b60015b614228573d8080156141ae576040519150601f19603f3d011682016040523d82523d6000602084013e6141b3565b606091505b5080516000036142205760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610cba565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d9a565b506001612d9a565b6111b883838361437a565b600061426082611b46565b905061426e81600084613af4565b614279600083612f5e565b6001600160a01b03811660009081526005602052604081208054600192906142a290849061531b565b909155505060008281526004602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61430683836143ec565b6143136000848484614101565b6111b85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610cba565b61438583838361453a565b600c5460ff16156111b85760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610cba565b6001600160a01b0382166144425760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cba565b6000818152600460205260409020546001600160a01b0316156144a75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cba565b6144b360008383613af4565b6001600160a01b03821660009081526005602052604081208054600192906144dc908490615332565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166145955761459081600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6145b8565b816001600160a01b0316836001600160a01b0316146145b8576145b883826145f2565b6001600160a01b0382166145cf576111b88161468f565b826001600160a01b0316826001600160a01b0316146111b8576111b8828261473e565b600060016145ff84611d33565b614609919061531b565b60008381526009602052604090205490915080821461465c576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906146a19060019061531b565b6000838152600b6020526040812054600a80549394509092849081106146c9576146c96151e5565b9060005260206000200154905080600a83815481106146ea576146ea6151e5565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061472257614722615744565b6001900381819060005260206000200160009055905550505050565b600061474983611d33565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b82805461478e906151ab565b90600052602060002090601f0160209004810192826147b057600085556147f6565b82601f106147c957805160ff19168380011785556147f6565b828001600101855582156147f6579182015b828111156147f65782518255916020019190600101906147db565b5061480292915061487a565b5090565b828054614812906151ab565b90600052602060002090601f01602090048101928261483457600085556147f6565b82601f1061484d5782800160ff198235161785556147f6565b828001600101855582156147f6579182015b828111156147f657823582559160200191906001019061485f565b5b80821115614802576000815560010161487b565b803561ffff81168114610eba57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156148e0576148e06148a1565b604052919050565b600067ffffffffffffffff821115614902576149026148a1565b50601f01601f191660200190565b600061492361491e846148e8565b6148b7565b905082815283838301111561493757600080fd5b828260208301376000602084830101529392505050565b600082601f83011261495f57600080fd5b61210883833560208501614910565b67ffffffffffffffff811681146119d257600080fd5b6000806000806080858703121561499a57600080fd5b6149a38561488f565b9350602085013567ffffffffffffffff808211156149c057600080fd5b6149cc8883890161494e565b9450604087013591506149de8261496e565b909250606086013590808211156149f457600080fd5b50614a018782880161494e565b91505092959194509250565b6001600160e01b0319811681146119d257600080fd5b600060208284031215614a3557600080fd5b813561210881614a0d565b600060208284031215614a5257600080fd5b5035919050565b60005b83811015614a74578181015183820152602001614a5c565b838111156114d05750506000910152565b60008151808452614a9d816020860160208601614a59565b601f01601f19169290920160200192915050565b6020815260006121086020830184614a85565b600060208284031215614ad657600080fd5b6121088261488f565b6001600160a01b03811681146119d257600080fd5b60008060408385031215614b0757600080fd5b8235614b1281614adf565b946020939093013593505050565b600067ffffffffffffffff821115614b3a57614b3a6148a1565b5060051b60200190565b600082601f830112614b5557600080fd5b81356020614b6561491e83614b20565b82815260059290921b84018101918181019086841115614b8457600080fd5b8286015b84811015614b9f5780358352918301918301614b88565b509695505050505050565b600060208284031215614bbc57600080fd5b813567ffffffffffffffff811115614bd357600080fd5b612d9a84828501614b44565b600060208284031215614bf157600080fd5b813561210881614adf565b600080600060608486031215614c1157600080fd5b8335614c1c81614adf565b92506020840135614c2c81614adf565b929592945050506040919091013590565b80358015158114610eba57600080fd5b600080600080600060a08688031215614c6557600080fd5b614c6e8661488f565b9450602086013567ffffffffffffffff80821115614c8b57600080fd5b614c9789838a0161494e565b955060408801359450614cac60608901614c3d565b93506080880135915080821115614cc257600080fd5b50614ccf8882890161494e565b9150509295509295909350565b60008060408385031215614cef57600080fd5b50508035926020909101359150565b60008083601f840112614d1057600080fd5b50813567ffffffffffffffff811115614d2857600080fd5b6020830191508360208285010111156116d357600080fd5b600080600060408486031215614d5557600080fd5b614d5e8461488f565b9250602084013567ffffffffffffffff811115614d7a57600080fd5b614d8686828701614cfe565b9497909650939450505050565b600081518084526020808501945080840160005b83811015614dc357815187529582019590820190600101614da7565b509495945050505050565b828152604060208201526000612d9a6040830184614d93565b600080600080600080600060e0888a031215614e0257600080fd5b8735614e0d81614adf565b9650614e1b6020890161488f565b9550604088013567ffffffffffffffff80821115614e3857600080fd5b614e448b838c0161494e565b965060608a0135955060808a01359150614e5d82614adf565b90935060a089013590614e6f82614adf565b90925060c08901359080821115614e8557600080fd5b50614e928a828b0161494e565b91505092959891949750929550565b600080600060608486031215614eb657600080fd5b614ebf8461488f565b9250602084013567ffffffffffffffff811115614edb57600080fd5b614ee78682870161494e565b9250506040840135614ef88161496e565b809150509250925092565b60008060408385031215614f1657600080fd5b823567ffffffffffffffff80821115614f2e57600080fd5b818501915085601f830112614f4257600080fd5b81356020614f5261491e83614b20565b82815260059290921b84018101918181019089841115614f7157600080fd5b948201945b83861015614f98578535614f8981614adf565b82529482019490820190614f76565b96505086013592505080821115614fae57600080fd5b50614fbb85828601614b44565b9150509250929050565b600060208284031215614fd757600080fd5b813567ffffffffffffffff811115614fee57600080fd5b8201601f81018413614fff57600080fd5b612d9a84823560208401614910565b6020815260006121086020830184614d93565b6000806040838503121561503457600080fd5b823561503f81614adf565b915061504d60208401614c3d565b90509250929050565b6000806000806080858703121561506c57600080fd5b843561507781614adf565b9350602085013561508781614adf565b925060408501359150606085013567ffffffffffffffff8111156150aa57600080fd5b614a018782880161494e565b6000806000806000608086880312156150ce57600080fd5b6150d78661488f565b94506150e56020870161488f565b935060408601359250606086013567ffffffffffffffff81111561510857600080fd5b61511488828901614cfe565b969995985093965092949392505050565b6000806040838503121561513857600080fd5b823561514381614adf565b9150602083013561515381614adf565b809150509250929050565b6000806000806080858703121561517457600080fd5b61517d8561488f565b935061518b6020860161488f565b9250604085013561519b81614adf565b9396929550929360600135925050565b600181811c908216806151bf57607f821691505b6020821081036151df57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201615223576152236151fb565b5060010190565b60408152600061523d6040830185614a85565b90508260208301529392505050565b61ffff861681526001600160a01b038516602082015260a06040820152600061527860a0830186614a85565b841515606084015282810360808401526152928185614a85565b98975050505050505050565b600080604083850312156152b157600080fd5b505080516020909101519092909150565b60008160001904831182151516156152dc576152dc6151fb565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615306576153066152e1565b500490565b8183823760009101908152919050565b60008282101561532d5761532d6151fb565b500390565b60008219821115615345576153456151fb565b500190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000612d9760408301848661534a565b6000602082840312156153a357600080fd5b5051919050565b600081516153bc818560208601614a59565b9290920192915050565b600080845481600182811c9150808316806153e257607f831692505b6020808410820361540157634e487b7160e01b86526022600452602486fd5b818015615415576001811461542657615453565b60ff19861689528489019650615453565b60008b81526020902060005b8681101561544b5781548b820152908501908301615432565b505084890196505b50505050505061547761546682866153aa565b64173539b7b760d91b815260050190565b95945050505050565b600061ffff8088168352808716602084015250846040830152608060608301526154ae60808301848661534a565b979650505050505050565b600082516154cb818460208701614a59565b9190910192915050565b600082601f8301126154e657600080fd5b81516154f461491e826148e8565b81815284602083860101111561550957600080fd5b612d9a826020830160208701614a59565b60006020828403121561552c57600080fd5b815167ffffffffffffffff81111561554357600080fd5b612d9a848285016154d5565b60008261555e5761555e6152e1565b500690565b61ffff851681526080602082015260006155806080830186614a85565b67ffffffffffffffff8516604084015282810360608401526154ae8185614a85565b6000602082840312156155b457600080fd5b81516121088161496e565b600080604083850312156155d257600080fd5b825167ffffffffffffffff8111156155e957600080fd5b6155f5858286016154d5565b925050602083015190509250929050565b60006bffffffffffffffffffffffff19808d60601b168352808c60601b166014840152808b60601b1660288401525088603c83015287605c83015286607c8301528486609c84013750609c93019283019190915260bc82015260dc01979650505050505050565b60008161567c5761567c6151fb565b506000190190565b61ffff8716815260c0602082015260006156a160c0830188614a85565b82810360408401526156b38188614a85565b6001600160a01b0387811660608601528616608085015283810360a085015290506156de8185614a85565b9998505050505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261571d6080830184614a85565b9695505050505050565b60006020828403121561573957600080fd5b815161210881614a0d565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220ffb60f9591de66fa2c935e4c2d09d3e84b69ce2639374f5b6dd22918d95a1eff64736f6c634300080e0033
Deployed Bytecode
0x6080604052600436106103b05760003560e01c806365e9707b116101e7578063b88d4fde1161010d578063d39ce77c116100a0578063eb8d72b71161006f578063eb8d72b714610ba7578063f05b3bff14610bc7578063f2fde38b14610c06578063f5ecbdbc14610c2657600080fd5b8063d39ce77c14610afe578063d5b3621b14610b1e578063e449f34114610b3e578063e985e9c514610b5e57600080fd5b8063c87b56dd116100dc578063c87b56dd14610a8b578063cbed8b9c14610aab578063d1d58b2514610acb578063d1deba1f14610aeb57600080fd5b8063b88d4fde14610a20578063baa51f8614610a40578063c002d23d14610a60578063c54d668f14610a7557600080fd5b80637e2ade0c1161018557806398807d841161015457806398807d841461098c578063a0712d68146109b9578063a22cb465146109cc578063b353aaa7146109ec57600080fd5b80637e2ade0c1461092e5780637ff28d3a146109445780638da5cb5b1461095957806395d89b411461097757600080fd5b80636bff2c24116101c15780636bff2c24146108b957806370a08231146108d9578063715018a6146108f95780637533d7881461090e57600080fd5b806365e9707b1461086357806366ad5c8a14610879578063672434821461089957600080fd5b80632a55205a116102d757806342966c681161026a578063519056361161023957806351905636146107c95780635b8c41e6146107dc5780635c975abb1461082b5780636352211e1461084357600080fd5b806342966c681461075157806342d65a8d146107715780634c971e56146107915780634f6ccce7146107a957600080fd5b80633d8b38f6116102a65780633d8b38f6146106af578063402914f5146106cf57806340f693e3146106fd57806342842e0e1461073157600080fd5b80632a55205a146105ef5780632b84bf0d1461062e5780632f745c591461065b57806332cb6b0c1461067b57600080fd5b80630f2cdd6c1161034f57806318160ddd1161031e57806318160ddd146105655780631e83409a1461057a57806323b872dd1461059a5780632a205e3d146105ba57600080fd5b80630f2cdd6c146104cd5780630fbf0a931461050f57806310ddb1371461052f5780631147f85b1461054f57600080fd5b806306fdde031161038b57806306fdde031461044057806307e0db1714610455578063081812fc14610475578063095ea7b3146104ad57600080fd5b80621d3567146103bc57806301ffc9a7146103de5780630451aefc1461041357600080fd5b366103b757005b600080fd5b3480156103c857600080fd5b506103dc6103d7366004614984565b610c46565b005b3480156103ea57600080fd5b506103fe6103f9366004614a23565b610ded565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e366004614a40565b610e46565b60405161040a9190614ab1565b34801561044c57600080fd5b50610433610ebf565b34801561046157600080fd5b506103dc610470366004614ac4565b610f51565b34801561048157600080fd5b50610495610490366004614a40565b611013565b6040516001600160a01b03909116815260200161040a565b3480156104b957600080fd5b506103dc6104c8366004614af4565b6110a8565b3480156104d957600080fd5b506105017f000000000000000000000000000000000000000000000000000000000000003281565b60405190815260200161040a565b34801561051b57600080fd5b506103dc61052a366004614baa565b6111bd565b34801561053b57600080fd5b506103dc61054a366004614ac4565b611334565b34801561055b57600080fd5b50610501601b5481565b34801561057157600080fd5b50600a54610501565b34801561058657600080fd5b506103dc610595366004614bdf565b6113cc565b3480156105a657600080fd5b506103dc6105b5366004614bfc565b6114d6565b3480156105c657600080fd5b506105da6105d5366004614c4d565b611552565b6040805192835260208301919091520161040a565b3480156105fb57600080fd5b5061060f61060a366004614cdc565b61161d565b604080516001600160a01b03909316835260208301919091520161040a565b34801561063a57600080fd5b50610501610649366004614a40565b601c6020526000908152604090205481565b34801561066757600080fd5b50610501610676366004614af4565b6116da565b34801561068757600080fd5b506105017f000000000000000000000000000000000000000000000000000000000000078081565b3480156106bb57600080fd5b506103fe6106ca366004614d40565b611770565b3480156106db57600080fd5b506106ef6106ea366004614bdf565b61183c565b60405161040a929190614dce565b34801561070957600080fd5b506105017f000000000000000000000000000000000000000000000000000001c122187b4f81565b34801561073d57600080fd5b506103dc61074c366004614bfc565b611933565b34801561075d57600080fd5b506103dc61076c366004614a40565b61194e565b34801561077d57600080fd5b506103dc61078c366004614d40565b6119d5565b34801561079d57600080fd5b50600e5460ff166103fe565b3480156107b557600080fd5b506105016107c4366004614a40565b611aa4565b6103dc6107d7366004614de7565b611b37565b3480156107e857600080fd5b506105016107f7366004614ea1565b6015602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561083757600080fd5b50600c5460ff166103fe565b34801561084f57600080fd5b5061049561085e366004614a40565b611b46565b34801561086f57600080fd5b50610501601a5481565b34801561088557600080fd5b506103dc610894366004614984565b611bbd565b3480156108a557600080fd5b506103dc6108b4366004614f03565b611c27565b3480156108c557600080fd5b506103dc6108d4366004614fc5565b611cd8565b3480156108e557600080fd5b506105016108f4366004614bdf565b611d33565b34801561090557600080fd5b506103dc611dba565b34801561091a57600080fd5b50610433610929366004614ac4565b611e0e565b34801561093a57600080fd5b5061050160195481565b34801561095057600080fd5b506103dc611ea8565b34801561096557600080fd5b506012546001600160a01b0316610495565b34801561098357600080fd5b50610433611f70565b34801561099857600080fd5b506109ac6109a7366004614bdf565b611f7f565b60405161040a919061500e565b6109ac6109c7366004614a40565b611f8a565b3480156109d857600080fd5b506103dc6109e7366004615021565b61210f565b3480156109f857600080fd5b506104957f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd781565b348015610a2c57600080fd5b506103dc610a3b366004615056565b61211a565b348015610a4c57600080fd5b506103fe610a5b366004614a40565b612196565b348015610a6c57600080fd5b506105016121af565b348015610a8157600080fd5b5061050160175481565b348015610a9757600080fd5b50610433610aa6366004614a40565b6125d5565b348015610ab757600080fd5b506103dc610ac63660046150b6565b61267d565b348015610ad757600080fd5b50610501610ae6366004614a40565b612752565b6103dc610af9366004614984565b6127b2565b348015610b0a57600080fd5b506103dc610b19366004614bdf565b612906565b348015610b2a57600080fd5b506103dc610b39366004614a40565b612a0f565b348015610b4a57600080fd5b506103dc610b59366004614baa565b612a5c565b348015610b6a57600080fd5b506103fe610b79366004615125565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610bb357600080fd5b506103dc610bc2366004614d40565b612b92565b348015610bd357600080fd5b507f00000000000000000000000056ab21f58e06da7218f29104c9e134b4eacba6406001600160a01b03163014156103fe565b348015610c1257600080fd5b506103dc610c21366004614bdf565b612c39565b348015610c3257600080fd5b50610433610c4136600461515e565b612cef565b337f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76001600160a01b031614610cc35760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff841660009081526014602052604081208054610ce1906151ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0d906151ab565b8015610d5a5780601f10610d2f57610100808354040283529160200191610d5a565b820191906000526020600020905b815481529060010190602001808311610d3d57829003601f168201915b5050505050905080518451148015610d7f575080805190602001208480519060200120145b610dda5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610cba565b610de685858585612db9565b5050505050565b6000610df882612eab565b80610e075750610e0782612ed0565b80610e165750610e1682612edb565b80610e3157506001600160e01b03198216637bb0080b60e01b145b80610e405750610e4082612ed0565b92915050565b600e5460609061010090046001600160a01b0316336001600160a01b031614610eb15760405162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206e6f74206d61736b696e6720736572766963650000000000006044820152606401610cba565b610e4082612f1b565b919050565b606060028054610ece906151ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610efa906151ab565b8015610f475780601f10610f1c57610100808354040283529160200191610f47565b820191906000526020600020905b815481529060010190602001808311610f2a57829003601f168201915b5050505050905090565b6012546001600160a01b03163314610f995760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6040516307e0db1760e01b815261ffff821660048201527f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610fff57600080fd5b505af1158015610de6573d6000803e3d6000fd5b6000818152600460205260408120546001600160a01b031661108c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cba565b506000908152600660205260409020546001600160a01b031690565b60006110b382611b46565b9050806001600160a01b0316836001600160a01b0316036111205760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cba565b336001600160a01b038216148061113c575061113c8133610b79565b6111ae5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610cba565b6111b88383612f5e565b505050565b80516000036111cb57600080fd5b60005b815181101561133057336001600160a01b03166112038383815181106111f6576111f66151e5565b6020026020010151611b46565b6001600160a01b0316146112595760405162461bcd60e51b815260206004820152601660248201527f6e6f7420746865206f776e6572206f6620746f6b656e000000000000000000006044820152606401610cba565b61128d82828151811061126e5761126e6151e5565b60200260200101516000908152601c6020526040902054600019141590565b156112da5760405162461bcd60e51b815260206004820152601460248201527f746f6b656e20616c7265616479207374616b65640000000000000000000000006044820152606401610cba565b60195442116112eb576019546112ed565b425b601c6000848481518110611303576113036151e5565b6020026020010151815260200190815260200160002081905550808061132890615211565b9150506111ce565b5050565b6012546001600160a01b0316331461137c5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6040516310ddb13760e01b815261ffff821660048201527f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76001600160a01b0316906310ddb13790602401610fe5565b6000806113d88361183c565b9150915060005b815181101561142c5742601c60008484815181106113ff576113ff6151e5565b6020026020010151815260200190815260200160002081905550808061142490615211565b9150506113df565b506000836001600160a01b03168360405160006040518083038185875af1925050503d806000811461147a576040519150601f19603f3d011682016040523d82523d6000602084013e61147f565b606091505b50509050806114d05760405162461bcd60e51b815260206004820152601a60248201527f636f756c64206e6f7420646973747269627574652066756e64730000000000006044820152606401610cba565b50505050565b6114e1335b82612fcc565b6115475760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610cba565b6111b88383836130c2565b6000806000868660405160200161156a92919061522a565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd716906340a7bb10906115ce908b90309086908b908b9060040161524c565b6040805180830381865afa1580156115ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160e919061529e565b92509250509550959350505050565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff1692820192909252829161169c5750604080518082019091526000546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b6020810151600090612710906116c0906bffffffffffffffffffffffff16876152c2565b6116ca91906152f7565b91519350909150505b9250929050565b60006116e583611d33565b82106117475760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610cba565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b61ffff831660009081526014602052604081208054829190611791906151ab565b80601f01602080910402602001604051908101604052809291908181526020018280546117bd906151ab565b801561180a5780601f106117df5761010080835404028352916020019161180a565b820191906000526020600020905b8154815290600101906020018083116117ed57829003601f168201915b50505050509050838360405161182192919061530b565b60405180910390208180519060200120149150509392505050565b6000606061184983613269565b9050805160000361186d576040805160008082526020820190925291509150915091565b60005b815181101561192d5742601c6000848481518110611890576118906151e5565b60200260200101518152602001908152602001600020541161191b57601c60008383815181106118c2576118c26151e5565b6020026020010151815260200190815260200160002054426118e4919061531b565b61190e907f000000000000000000000000000000000000000000000000000001c122187b4f6152c2565b6119189084615332565b92505b8061192581615211565b915050611870565b50915091565b6111b88383836040518060200160405280600081525061211a565b611957336114db565b6119c95760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610cba565b6119d2816133ad565b50565b6012546001600160a01b03163314611a1d5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd716906342d65a8d90611a6d90869086908690600401615373565b600060405180830381600087803b158015611a8757600080fd5b505af1158015611a9b573d6000803e3d6000fd5b50505050505050565b6000611aaf600a5490565b8210611b125760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610cba565b600a8281548110611b2557611b256151e5565b90600052602060002001549050919050565b611a9b878787878787876133b6565b6000818152600460205260408120546001600160a01b031680610e405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610cba565b333014611c1b5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610cba565b6114d0848484846134ff565b6012546001600160a01b03163314611c6f5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b8051825114611c7d57600080fd5b60005b82518110156111b857611cc5838281518110611c9e57611c9e6151e5565b6020026020010151838381518110611cb857611cb86151e5565b602002602001015161359b565b5080611cd081615211565b915050611c80565b6012546001600160a01b03163314611d205760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b8051611330906018906020840190614782565b60006001600160a01b038216611d9e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610cba565b506001600160a01b031660009081526005602052604090205490565b6012546001600160a01b03163314611e025760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b611e0c6000613733565b565b60146020526000908152604090208054611e27906151ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611e53906151ab565b8015611ea05780601f10611e7557610100808354040283529160200191611ea0565b820191906000526020600020905b815481529060010190602001808311611e8357829003601f168201915b505050505081565b6013546001600160a01b03163314611f0d5760405162461bcd60e51b815260206004820152602260248201527f4f776e61626c653a206d757374206265206e6577206f776e657220746f2070756044820152611b1b60f21b6064820152608401610cba565b6013546012546040516001600160a01b0392831692909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d90600090a3601354601280546001600160a01b0319166001600160a01b03909216919091179055565b606060038054610ece906151ab565b6060610e4082613269565b6060601954421015611fce5760405162461bcd60e51b815260206004820152600d60248201526c36b4b73a103737ba1037b832b760991b6044820152606401610cba565b600a82111561201f5760405162461bcd60e51b815260206004820152601a60248201527f6d6178206d696e74207065722063616c6c2065786365656465640000000000006044820152606401610cba565b6120276121af565b61203190836152c2565b341461207f5760405162461bcd60e51b815260206004820152601b60248201527f63616c6c657220737570706c6965642077726f6e672076616c756500000000006044820152606401610cba565b601a5460009073b1a9a840e7ed5b97e559afca416c566a6a0ad06f906120a590856152c2565b6120af903461531b565b604051600081818185875af1925050503d80600081146120eb576040519150601f19603f3d011682016040523d82523d6000602084013e6120f0565b606091505b50509050806120fe57600080fd5b612108338461359b565b9392505050565b611330338383613785565b6121243383612fcc565b61218a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610cba565b6114d084848484613853565b6000818152601c60205260408120546000191415610e40565b600060195442101580156121d157506019546121cd90610258615332565b4211155b156125c757732f14c76b8793f775d37d45bee5ed6336471805c46370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122599190615391565b1561226b575067d02ab486cedc000090565b73bf73c78d6df63941d29593916ddf11a62b7b02f36370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156122ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ee9190615391565b15612300575067de0b6b3a7640000090565b735ffa60ef5790dc4c01113d24449ff445d97f22db6370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561235f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123839190615391565b15158061241157507311020ca3c1547a3332a2386dbf0a6d63dd1173ee6370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156123ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240e9190615391565b15155b8061249d5750730dc238932032de4ac7de445b533be2a2058929846370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a9190615391565b15155b80612529575073f1edd11df477d5d3bf335c8b1b1b15177cb405b26370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190615391565b15155b806125b5575073e84ebad6fc852ba2be5a6d737cdff6e4b44c73a76370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561258e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b29190615391565b15155b156125c7575067ebec21ee1da4000090565b506801158e460913d0000090565b6000818152600460205260409020546060906001600160a01b031661264b5760405162461bcd60e51b815260206004820152602660248201527f4552433732314d657461646174613a20746f6b656e494420646f6573206e6f7460448201526508195e1a5cdd60d21b6064820152608401610cba565b601861265683612f1b565b6040516020016126679291906153c6565b6040516020818303038152906040529050919050565b6012546001600160a01b031633146126c55760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6040516332fb62e760e21b81526001600160a01b037f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7169063cbed8b9c906127199088908890889088908890600401615480565b600060405180830381600087803b15801561273357600080fd5b505af1158015612747573d6000803e3d6000fd5b505050505050505050565b6000818152601c6020526040812054421161276f57506000919050565b6000828152601c6020526040902054612788904261531b565b610e40907f000000000000000000000000000000000000000000000000000001c122187b4f6152c2565b61ffff841660009081526015602052604080822090516127d39086906154b9565b908152604080516020928190038301902067ffffffffffffffff8616600090815292529020549050806128545760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610cba565b8151602083012081146128b35760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610cba565b61ffff851660009081526015602052604080822090516128d49087906154b9565b908152604080516020928190038301902067ffffffffffffffff871660009081529252902055610de6858585856134ff565b6012546001600160a01b0316331461294e5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6001600160a01b0381166129b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cba565b6012546040516001600160a01b038084169216907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba90600090a3601380546001600160a01b0319166001600160a01b0392909216919091179055565b6012546001600160a01b03163314612a575760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b601955565b8051600003612a6a57600080fd5b60005b815181101561133057336001600160a01b0316612a958383815181106111f6576111f66151e5565b6001600160a01b031614612aeb5760405162461bcd60e51b815260206004820152601660248201527f6e6f7420746865206f776e6572206f6620746f6b656e000000000000000000006044820152606401610cba565b612b0082828151811061126e5761126e6151e5565b612b4c5760405162461bcd60e51b815260206004820152601060248201527f746f6b656e206e6f74207374616b6564000000000000000000000000000000006044820152606401610cba565b600019601c6000848481518110612b6557612b656151e5565b60200260200101518152602001908152602001600020819055508080612b8a90615211565b915050612a6d565b6012546001600160a01b03163314612bda5760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b61ffff83166000908152601460205260409020612bf8908383614806565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051612c2c93929190615373565b60405180910390a1505050565b6012546001600160a01b03163314612c815760405162461bcd60e51b8152602060048201819052602482015260008051602061575b8339815191526044820152606401610cba565b6001600160a01b038116612ce65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cba565b6119d281613733565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612d6f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d97919081019061551a565b90505b949350505050565b600081612daf81836138d1565b610e40919061554f565b604051633356ae4560e11b815230906366ad5c8a90612de2908790879087908790600401615563565b600060405180830381600087803b158015612dfc57600080fd5b505af1925050508015612e0d575060015b6114d0578080519060200120601560008661ffff1661ffff16815260200190815260200160002084604051612e4291906154b9565b90815260408051918290036020908101832067ffffffffffffffff87166000908152915220919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90612e9e908690869086908690615563565b60405180910390a16114d0565b60006001600160e01b0319821663780e9d6360e01b1480610e405750610e4082612edb565b6000610e4082612eab565b60006001600160e01b031982166380ac58cd60e01b1480612f0c57506001600160e01b03198216635b5e139f60e01b145b80610e405750610e4082613916565b6060610e406020600d5484604051602001612f40929190918252602082015260400190565b60408051601f1981840301815291905280516020909101209061394b565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f9382611b46565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166130455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cba565b600061305083611b46565b9050806001600160a01b0316846001600160a01b0316148061309757506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b80612d9a5750836001600160a01b03166130b084611013565b6001600160a01b031614949350505050565b826001600160a01b03166130d582611b46565b6001600160a01b0316146131395760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610cba565b6001600160a01b03821661319b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cba565b6131a6838383613af4565b6131b1600082612f5e565b6001600160a01b03831660009081526005602052604081208054600192906131da90849061531b565b90915550506001600160a01b0382166000908152600560205260408120805460019290613208908490615332565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060600061327683613c2b565b9050806000036132b45760005b6040519080825280602002602001820160405280156132ac578160200160208202803683370190505b509392505050565b8067ffffffffffffffff8111156132cd576132cd6148a1565b6040519080825280602002602001820160405280156132f6578160200160208202803683370190505b509150600061330484613ca2565b9050805160000361332657505060408051600081526020810190915292915050565b6000805b82518110156133a45761334883828151811061126e5761126e6151e5565b156133925782818151811061335f5761335f6151e5565b602002602001015185838061337390615211565b945081518110613385576133856151e5565b6020026020010181815250505b8061339c81615211565b91505061332a565b50505050919050565b6119d281613d49565b6133c287878787613d63565b600085856040516020016133d792919061522a565b60405160208183030381529060405290506133f58782868686613e4a565b604051630f428ae960e31b815261ffff881660048201523060248201526000907f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76001600160a01b031690637a14574890604401602060405180830381865afa158015613466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061348a91906155a2565b90508660405161349a91906154b9565b6040805191829003822088835267ffffffffffffffff841660208401529161ffff8b16916001600160a01b038d16917f024797cc77ce15dc717112d54fb1df125fdfd8c81344fb046c5e074427ce1543910160405180910390a4505050505050505050565b6000808280602001905181019061351691906155bf565b6014820151919350915061352b878284613ff0565b806001600160a01b03168660405161354391906154b9565b6040805191829003822085835267ffffffffffffffff891660208401529161ffff8b16917f64e10c37f404d128982dce114f5d233c14c5c7f6d8db93099e3d99dacb9e27ba910160405180910390a450505050505050565b60607f0000000000000000000000000000000000000000000000000000000000000780826017546135cc9190615332565b111561361a5760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610cba565b816017600082825461362c9190615332565b9091555082905067ffffffffffffffff81111561364b5761364b6148a1565b604051908082528060200260200182016040528015613674578160200160208202803683370190505b50905060005b8281101561372c5761368a613ffa565b613695906001615332565b8282815181106136a7576136a76151e5565b6020026020010181815250506136d6848383815181106136c9576136c96151e5565b60200260200101516140e7565b60195442116136e7576019546136e9565b425b601c60008484815181106136ff576136ff6151e5565b6020026020010151815260200190815260200160002081905550808061372490615211565b91505061367a565b5092915050565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036137e65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cba565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61385e8484846130c2565b61386a84848484614101565b6114d05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610cba565b60003033414342446000368a8a6040516020016138f79a99989796959493929190615606565b60408051601f1981840301815291905280516020909101209392505050565b60006001600160e01b0319821663152a902d60e11b1480610e4057506301ffc9a760e01b6001600160e01b0319831614610e40565b6060600061395a8360026152c2565b613965906002615332565b67ffffffffffffffff81111561397d5761397d6148a1565b6040519080825280601f01601f1916602001820160405280156139a7576020820181803683370190505b509050600360fc1b816000815181106139c2576139c26151e5565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106139f1576139f16151e5565b60200101906001600160f81b031916908160001a9053506000613a158460026152c2565b613a20906001615332565b90505b6001811115613aa5577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110613a6157613a616151e5565b1a60f81b828281518110613a7757613a776151e5565b60200101906001600160f81b031916908160001a90535060049490941c93613a9e8161566d565b9050613a23565b5083156121085760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cba565b6001600160a01b03831615613b62576000818152601c602052604090205460001914613b625760405162461bcd60e51b815260206004820152601960248201527f746f6b656e2069732063757272656e746c79207374616b6564000000000000006044820152606401610cba565b6001600160a01b0382163b158015613b8257506001600160a01b03821615155b8015613b9857506001600160a01b038216600114155b15613c20577f0000000000000000000000000000000000000000000000000000000000000032613bc783611d33565b613bd2906001615332565b1115613c205760405162461bcd60e51b815260206004820152601760248201527f6d6178207065722077616c6c65742065786365656465640000000000000000006044820152606401610cba565b6111b883838361424a565b600080613c3783613ca2565b90508051600003613c4b5750600092915050565b60005b8151811015613c9b57613c6c82828151811061126e5761126e6151e5565b613c77576000613c7a565b60015b613c879060ff1684615332565b925080613c9381615211565b915050613c4e565b5050919050565b60606000613caf83611d33565b905080600003613cc0576000613283565b8067ffffffffffffffff811115613cd957613cd96148a1565b604051908082528060200260200182016040528015613d02578160200160208202803683370190505b50915060005b81811015613c9b57613d1a84826116da565b838281518110613d2c57613d2c6151e5565b602090810291909101015280613d4181615211565b915050613d08565b613d5281614255565b600090815260016020526040812055565b613d6c336114db565b613dce5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2073656e642063616c6c6572206973206e6f74206f776e657260448201526c081b9bdc88185c1c1c9bdd9959609a1b6064820152608401610cba565b836001600160a01b0316613de182611b46565b6001600160a01b031614613e415760405162461bcd60e51b815260206004820152602160248201527f4552433732313a2073656e642066726f6d20696e636f7272656374206f776e656044820152603960f91b6064820152608401610cba565b6114d0816133ad565b61ffff851660009081526014602052604081208054613e68906151ab565b80601f0160208091040260200160405190810160405280929190818152602001828054613e94906151ab565b8015613ee15780601f10613eb657610100808354040283529160200191613ee1565b820191906000526020600020905b815481529060010190602001808311613ec457829003601f168201915b505050505090508051600003613f5f5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201527f61207472757374656420736f75726365000000000000000000000000000000006064820152608401610cba565b60405162c5803160e81b81526001600160a01b037f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7169063c5803100903490613fb6908a9086908b908b908b908b90600401615684565b6000604051808303818588803b158015613fcf57600080fd5b505af1158015613fe3573d6000803e3d6000fd5b5050505050505050505050565b6111b882826140e7565b600080600f5460105461400d919061531b565b9050600080600083614020600019612da2565b61402a919061554f565b90506011600061403b60018761531b565b8152602001908152602001600020546000036140635761405c60018561531b565b9250614084565b6011600061407260018761531b565b81526020019081526020016000205492505b60008181526011602052604081205490036140b25760008181526011602052604090208390559050806140c9565b600081815260116020526040902080549084905591505b600f80549060006140d983615211565b909155509195945050505050565b6113308282604051806020016040528060008152506142fc565b60006001600160a01b0384163b1561424257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906141459033908990889088906004016156eb565b6020604051808303816000875af1925050508015614180575060408051601f3d908101601f1916820190925261417d91810190615727565b60015b614228573d8080156141ae576040519150601f19603f3d011682016040523d82523d6000602084013e6141b3565b606091505b5080516000036142205760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610cba565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612d9a565b506001612d9a565b6111b883838361437a565b600061426082611b46565b905061426e81600084613af4565b614279600083612f5e565b6001600160a01b03811660009081526005602052604081208054600192906142a290849061531b565b909155505060008281526004602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61430683836143ec565b6143136000848484614101565b6111b85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610cba565b61438583838361453a565b600c5460ff16156111b85760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610cba565b6001600160a01b0382166144425760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cba565b6000818152600460205260409020546001600160a01b0316156144a75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cba565b6144b360008383613af4565b6001600160a01b03821660009081526005602052604081208054600192906144dc908490615332565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383166145955761459081600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b6145b8565b816001600160a01b0316836001600160a01b0316146145b8576145b883826145f2565b6001600160a01b0382166145cf576111b88161468f565b826001600160a01b0316826001600160a01b0316146111b8576111b8828261473e565b600060016145ff84611d33565b614609919061531b565b60008381526009602052604090205490915080821461465c576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906146a19060019061531b565b6000838152600b6020526040812054600a80549394509092849081106146c9576146c96151e5565b9060005260206000200154905080600a83815481106146ea576146ea6151e5565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061472257614722615744565b6001900381819060005260206000200160009055905550505050565b600061474983611d33565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b82805461478e906151ab565b90600052602060002090601f0160209004810192826147b057600085556147f6565b82601f106147c957805160ff19168380011785556147f6565b828001600101855582156147f6579182015b828111156147f65782518255916020019190600101906147db565b5061480292915061487a565b5090565b828054614812906151ab565b90600052602060002090601f01602090048101928261483457600085556147f6565b82601f1061484d5782800160ff198235161785556147f6565b828001600101855582156147f6579182015b828111156147f657823582559160200191906001019061485f565b5b80821115614802576000815560010161487b565b803561ffff81168114610eba57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156148e0576148e06148a1565b604052919050565b600067ffffffffffffffff821115614902576149026148a1565b50601f01601f191660200190565b600061492361491e846148e8565b6148b7565b905082815283838301111561493757600080fd5b828260208301376000602084830101529392505050565b600082601f83011261495f57600080fd5b61210883833560208501614910565b67ffffffffffffffff811681146119d257600080fd5b6000806000806080858703121561499a57600080fd5b6149a38561488f565b9350602085013567ffffffffffffffff808211156149c057600080fd5b6149cc8883890161494e565b9450604087013591506149de8261496e565b909250606086013590808211156149f457600080fd5b50614a018782880161494e565b91505092959194509250565b6001600160e01b0319811681146119d257600080fd5b600060208284031215614a3557600080fd5b813561210881614a0d565b600060208284031215614a5257600080fd5b5035919050565b60005b83811015614a74578181015183820152602001614a5c565b838111156114d05750506000910152565b60008151808452614a9d816020860160208601614a59565b601f01601f19169290920160200192915050565b6020815260006121086020830184614a85565b600060208284031215614ad657600080fd5b6121088261488f565b6001600160a01b03811681146119d257600080fd5b60008060408385031215614b0757600080fd5b8235614b1281614adf565b946020939093013593505050565b600067ffffffffffffffff821115614b3a57614b3a6148a1565b5060051b60200190565b600082601f830112614b5557600080fd5b81356020614b6561491e83614b20565b82815260059290921b84018101918181019086841115614b8457600080fd5b8286015b84811015614b9f5780358352918301918301614b88565b509695505050505050565b600060208284031215614bbc57600080fd5b813567ffffffffffffffff811115614bd357600080fd5b612d9a84828501614b44565b600060208284031215614bf157600080fd5b813561210881614adf565b600080600060608486031215614c1157600080fd5b8335614c1c81614adf565b92506020840135614c2c81614adf565b929592945050506040919091013590565b80358015158114610eba57600080fd5b600080600080600060a08688031215614c6557600080fd5b614c6e8661488f565b9450602086013567ffffffffffffffff80821115614c8b57600080fd5b614c9789838a0161494e565b955060408801359450614cac60608901614c3d565b93506080880135915080821115614cc257600080fd5b50614ccf8882890161494e565b9150509295509295909350565b60008060408385031215614cef57600080fd5b50508035926020909101359150565b60008083601f840112614d1057600080fd5b50813567ffffffffffffffff811115614d2857600080fd5b6020830191508360208285010111156116d357600080fd5b600080600060408486031215614d5557600080fd5b614d5e8461488f565b9250602084013567ffffffffffffffff811115614d7a57600080fd5b614d8686828701614cfe565b9497909650939450505050565b600081518084526020808501945080840160005b83811015614dc357815187529582019590820190600101614da7565b509495945050505050565b828152604060208201526000612d9a6040830184614d93565b600080600080600080600060e0888a031215614e0257600080fd5b8735614e0d81614adf565b9650614e1b6020890161488f565b9550604088013567ffffffffffffffff80821115614e3857600080fd5b614e448b838c0161494e565b965060608a0135955060808a01359150614e5d82614adf565b90935060a089013590614e6f82614adf565b90925060c08901359080821115614e8557600080fd5b50614e928a828b0161494e565b91505092959891949750929550565b600080600060608486031215614eb657600080fd5b614ebf8461488f565b9250602084013567ffffffffffffffff811115614edb57600080fd5b614ee78682870161494e565b9250506040840135614ef88161496e565b809150509250925092565b60008060408385031215614f1657600080fd5b823567ffffffffffffffff80821115614f2e57600080fd5b818501915085601f830112614f4257600080fd5b81356020614f5261491e83614b20565b82815260059290921b84018101918181019089841115614f7157600080fd5b948201945b83861015614f98578535614f8981614adf565b82529482019490820190614f76565b96505086013592505080821115614fae57600080fd5b50614fbb85828601614b44565b9150509250929050565b600060208284031215614fd757600080fd5b813567ffffffffffffffff811115614fee57600080fd5b8201601f81018413614fff57600080fd5b612d9a84823560208401614910565b6020815260006121086020830184614d93565b6000806040838503121561503457600080fd5b823561503f81614adf565b915061504d60208401614c3d565b90509250929050565b6000806000806080858703121561506c57600080fd5b843561507781614adf565b9350602085013561508781614adf565b925060408501359150606085013567ffffffffffffffff8111156150aa57600080fd5b614a018782880161494e565b6000806000806000608086880312156150ce57600080fd5b6150d78661488f565b94506150e56020870161488f565b935060408601359250606086013567ffffffffffffffff81111561510857600080fd5b61511488828901614cfe565b969995985093965092949392505050565b6000806040838503121561513857600080fd5b823561514381614adf565b9150602083013561515381614adf565b809150509250929050565b6000806000806080858703121561517457600080fd5b61517d8561488f565b935061518b6020860161488f565b9250604085013561519b81614adf565b9396929550929360600135925050565b600181811c908216806151bf57607f821691505b6020821081036151df57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201615223576152236151fb565b5060010190565b60408152600061523d6040830185614a85565b90508260208301529392505050565b61ffff861681526001600160a01b038516602082015260a06040820152600061527860a0830186614a85565b841515606084015282810360808401526152928185614a85565b98975050505050505050565b600080604083850312156152b157600080fd5b505080516020909101519092909150565b60008160001904831182151516156152dc576152dc6151fb565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615306576153066152e1565b500490565b8183823760009101908152919050565b60008282101561532d5761532d6151fb565b500390565b60008219821115615345576153456151fb565b500190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000612d9760408301848661534a565b6000602082840312156153a357600080fd5b5051919050565b600081516153bc818560208601614a59565b9290920192915050565b600080845481600182811c9150808316806153e257607f831692505b6020808410820361540157634e487b7160e01b86526022600452602486fd5b818015615415576001811461542657615453565b60ff19861689528489019650615453565b60008b81526020902060005b8681101561544b5781548b820152908501908301615432565b505084890196505b50505050505061547761546682866153aa565b64173539b7b760d91b815260050190565b95945050505050565b600061ffff8088168352808716602084015250846040830152608060608301526154ae60808301848661534a565b979650505050505050565b600082516154cb818460208701614a59565b9190910192915050565b600082601f8301126154e657600080fd5b81516154f461491e826148e8565b81815284602083860101111561550957600080fd5b612d9a826020830160208701614a59565b60006020828403121561552c57600080fd5b815167ffffffffffffffff81111561554357600080fd5b612d9a848285016154d5565b60008261555e5761555e6152e1565b500690565b61ffff851681526080602082015260006155806080830186614a85565b67ffffffffffffffff8516604084015282810360608401526154ae8185614a85565b6000602082840312156155b457600080fd5b81516121088161496e565b600080604083850312156155d257600080fd5b825167ffffffffffffffff8111156155e957600080fd5b6155f5858286016154d5565b925050602083015190509250929050565b60006bffffffffffffffffffffffff19808d60601b168352808c60601b166014840152808b60601b1660288401525088603c83015287605c83015286607c8301528486609c84013750609c93019283019190915260bc82015260dc01979650505050505050565b60008161567c5761567c6151fb565b506000190190565b61ffff8716815260c0602082015260006156a160c0830188614a85565b82810360408401526156b38188614a85565b6001600160a01b0387811660608601528616608085015283810360a085015290506156de8185614a85565b9998505050505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261571d6080830184614a85565b9695505050505050565b60006020828403121561573957600080fd5b815161210881614a0d565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220ffb60f9591de66fa2c935e4c2d09d3e84b69ce2639374f5b6dd22918d95a1eff64736f6c634300080e0033
Deployed Bytecode Sourcemap
100176:8508:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66740:810;;;;;;;;;;-1:-1:-1;66740:810:0;;;;;:::i;:::-;;:::i;:::-;;99541:511;;;;;;;;;;-1:-1:-1;99541:511:0;;;;;:::i;:::-;;:::i;:::-;;;2782:14:1;;2775:22;2757:41;;2745:2;2730:18;99541:511:0;;;;;;;;105300:139;;;;;;;;;;-1:-1:-1;105300:139:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22373:100::-;;;;;;;;;;;;;:::i;69184:123::-;;;;;;;;;;-1:-1:-1;69184:123:0;;;;;:::i;:::-;;:::i;23933:221::-;;;;;;;;;;-1:-1:-1;23933:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4120:55:1;;;4102:74;;4090:2;4075:18;23933:221:0;3956:226:1;23456:411:0;;;;;;;;;;-1:-1:-1;23456:411:0;;;;;:::i;:::-;;:::i;100309:44::-;;;;;;;;;;;;;;;;;;4812:25:1;;;4800:2;4785:18;100309:44:0;4666:177:1;104720:442:0;;;;;;;;;;-1:-1:-1;104720:442:0;;;;;:::i;:::-;;:::i;69315:129::-;;;;;;;;;;-1:-1:-1;69315:129:0;;;;;:::i;:::-;;:::i;100539:42::-;;;;;;;;;;;;;;;;37838:113;;;;;;;;;;-1:-1:-1;37926:10:0;:17;37838:113;;101408:439;;;;;;;;;;-1:-1:-1;101408:439:0;;;;;:::i;:::-;;:::i;24683:339::-;;;;;;;;;;-1:-1:-1;24683:339:0;;;;;:::i;:::-;;:::i;94478:400::-;;;;;;;;;;-1:-1:-1;94478:400:0;;;;;:::i;:::-;;:::i;:::-;;;;7862:25:1;;;7918:2;7903:18;;7896:34;;;;7835:18;94478:400:0;7688:248:1;45834:494:0;;;;;;;;;;-1:-1:-1;45834:494:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8386:55:1;;;8368:74;;8473:2;8458:18;;8451:34;;;;8341:18;45834:494:0;8194:297:1;100673:53:0;;;;;;;;;;-1:-1:-1;100673:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;37506:256;;;;;;;;;;-1:-1:-1;37506:256:0;;;;;:::i;:::-;;:::i;100260:42::-;;;;;;;;;;;;;;;70000:250;;;;;;;;;;-1:-1:-1;70000:250:0;;;;;:::i;:::-;;:::i;101855:509::-;;;;;;;;;;-1:-1:-1;101855:509:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;100588:76::-;;;;;;;;;;;;;;;25093:185;;;;;;;;;;-1:-1:-1;25093:185:0;;;;;:::i;:::-;;:::i;50401:245::-;;;;;;;;;;-1:-1:-1;50401:245:0;;;;;:::i;:::-;;:::i;69452:178::-;;;;;;;;;;-1:-1:-1;69452:178:0;;;;;:::i;:::-;;:::i;88900:86::-;;;;;;;;;;-1:-1:-1;88967:11:0;;;;88900:86;;38028:233;;;;;;;;;;-1:-1:-1;38028:233:0;;;;;:::i;:::-;;:::i;95231:368::-;;;;;;:::i;:::-;;:::i;70709:85::-;;;;;;;;;;-1:-1:-1;70709:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51754:86;;;;;;;;;;-1:-1:-1;51825:7:0;;;;51754:86;;22067:239;;;;;;;;;;-1:-1:-1;22067:239:0;;;;;:::i;:::-;;:::i;100487:45::-;;;;;;;;;;;;;;;;71534:385;;;;;;;;;;-1:-1:-1;71534:385:0;;;;;:::i;:::-;;:::i;101131:269::-;;;;;;;;;;-1:-1:-1;101131:269:0;;;;;:::i;:::-;;:::i;104613:99::-;;;;;;;;;;-1:-1:-1;104613:99:0;;;;;:::i;:::-;;:::i;21797:208::-;;;;;;;;;;-1:-1:-1;21797:208:0;;;;;:::i;:::-;;:::i;57241:112::-;;;;;;;;;;;;;:::i;66415:51::-;;;;;;;;;;-1:-1:-1;66415:51:0;;;;;:::i;:::-;;:::i;100437:43::-;;;;;;;;;;;;;;;;56673:217;;;;;;;;;;;;;:::i;55813:96::-;;;;;;;;;;-1:-1:-1;55895:6:0;;-1:-1:-1;;;;;55895:6:0;55813:96;;22542:104;;;;;;;;;;;;;:::i;105170:122::-;;;;;;;;;;-1:-1:-1;105170:122:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;102742:527::-;;;;;;:::i;:::-;;:::i;24226:155::-;;;;;;;;;;-1:-1:-1;24226:155:0;;;;;:::i;:::-;;:::i;66360:46::-;;;;;;;;;;;;;;;25349:328;;;;;;;;;;-1:-1:-1;25349:328:0;;;;;:::i;:::-;;:::i;102628:106::-;;;;;;;;;;-1:-1:-1;102628:106:0;;;;;:::i;:::-;;:::i;103277:1204::-;;;;;;;;;;;;;:::i;100360:31::-;;;;;;;;;;;;;;;;105447:256;;;;;;;;;;-1:-1:-1;105447:256:0;;;;;:::i;:::-;;:::i;68926:250::-;;;;;;;;;;-1:-1:-1;68926:250:0;;;;;:::i;:::-;;:::i;102372:248::-;;;;;;;;;;-1:-1:-1;102372:248:0;;;;;:::i;:::-;;:::i;72148:724::-;;;;;;:::i;:::-;;:::i;56299:247::-;;;;;;;;;;-1:-1:-1;56299:247:0;;;;;:::i;:::-;;:::i;104489:116::-;;;;;;;;;;-1:-1:-1;104489:116:0;;;;;:::i;:::-;;:::i;105711:385::-;;;;;;;;;;-1:-1:-1;105711:385:0;;;;;:::i;:::-;;:::i;24452:164::-;;;;;;;;;;-1:-1:-1;24452:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24573:25:0;;;24549:4;24573:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24452:164;69684:216;;;;;;;;;;-1:-1:-1;69684:216:0;;;;;:::i;:::-;;:::i;83608:99::-;;;;;;;;;;-1:-1:-1;83689:10:0;-1:-1:-1;;;;;83672:27:0;83680:4;83672:27;;83608:99;;57508:210;;;;;;;;;;-1:-1:-1;57508:210:0;;;;;:::i;:::-;;:::i;68607:257::-;;;;;;;;;;-1:-1:-1;68607:257:0;;;;;:::i;:::-;;:::i;66740:810::-;16838:10;67019;-1:-1:-1;;;;;66995:35:0;;66987:78;;;;-1:-1:-1;;;66987:78:0;;17046:2:1;66987:78:0;;;17028:21:1;17085:2;17065:18;;;17058:30;17124:32;17104:18;;;17097:60;17174:18;;66987:78:0;;;;;;;;;67107:32;;;67078:26;67107:32;;;:19;:32;;;;;67078:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67327:13;:20;67305:11;:18;:42;:96;;;;;67387:13;67377:24;;;;;;67361:11;67351:22;;;;;;:50;67305:96;67283:184;;;;-1:-1:-1;;;67283:184:0;;17790:2:1;67283:184:0;;;17772:21:1;17829:2;17809:18;;;17802:30;17868:34;17848:18;;;17841:62;-1:-1:-1;;;17919:18:1;;;17912:36;17965:19;;67283:184:0;17588:402:1;67283:184:0;67480:62;67499:11;67512;67525:6;67533:8;67480:18;:62::i;:::-;66910:640;66740:810;;;;:::o;99541:511::-;99721:4;99763:47;99798:11;99763:34;:47::i;:::-;:108;;;;99827:44;99859:11;99827:31;:44::i;:::-;99763:162;;;;99888:37;99913:11;99888:24;:37::i;:::-;99763:228;;;-1:-1:-1;;;;;;;99942:49:0;;-1:-1:-1;;;99942:49:0;99763:228;:281;;;;100008:36;100032:11;100008:23;:36::i;:::-;99743:301;99541:511;-1:-1:-1;;99541:511:0:o;105300:139::-;88791:12;;105373:13;;88791:12;;;-1:-1:-1;;;;;88791:12:0;16838:10;-1:-1:-1;;;;;88775:28:0;;88767:67;;;;-1:-1:-1;;;88767:67:0;;18197:2:1;88767:67:0;;;18179:21:1;18236:2;18216:18;;;18209:30;18275:28;18255:18;;;18248:56;18321:18;;88767:67:0;17995:350:1;88767:67:0;105406:25:::1;105423:7;105406:16;:25::i;88845:1::-;105300:139:::0;;;:::o;22373:100::-;22427:13;22460:5;22453:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22373:100;:::o;69184:123::-;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;69264:35:::1;::::0;-1:-1:-1;;;69264:35:0;;18885:6:1;18873:19;;69264:35:0::1;::::0;::::1;18855:38:1::0;69264:10:0::1;-1:-1:-1::0;;;;;69264:25:0::1;::::0;::::1;::::0;18828:18:1;;69264:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;23933:221:::0;24009:7;27276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27276:16:0;24029:73;;;;-1:-1:-1;;;24029:73:0;;19106:2:1;24029:73:0;;;19088:21:1;19145:2;19125:18;;;19118:30;19184:34;19164:18;;;19157:62;-1:-1:-1;;;19235:18:1;;;19228:42;19287:19;;24029:73:0;18904:408:1;24029:73:0;-1:-1:-1;24122:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24122:24:0;;23933:221::o;23456:411::-;23537:13;23553:23;23568:7;23553:14;:23::i;:::-;23537:39;;23601:5;-1:-1:-1;;;;;23595:11:0;:2;-1:-1:-1;;;;;23595:11:0;;23587:57;;;;-1:-1:-1;;;23587:57:0;;19519:2:1;23587:57:0;;;19501:21:1;19558:2;19538:18;;;19531:30;19597:34;19577:18;;;19570:62;-1:-1:-1;;;19648:18:1;;;19641:31;19689:19;;23587:57:0;19317:397:1;23587:57:0;16838:10;-1:-1:-1;;;;;23679:21:0;;;;:62;;-1:-1:-1;23704:37:0;23721:5;16838:10;24452:164;:::i;23704:37::-;23657:168;;;;-1:-1:-1;;;23657:168:0;;19921:2:1;23657:168:0;;;19903:21:1;19960:2;19940:18;;;19933:30;19999:34;19979:18;;;19972:62;20070:26;20050:18;;;20043:54;20114:19;;23657:168:0;19719:420:1;23657:168:0;23838:21;23847:2;23851:7;23838:8;:21::i;:::-;23526:341;23456:411;;:::o;104720:442::-;104788:8;:15;104807:1;104788:20;104780:29;;;;;;104825:9;104820:335;104844:8;:15;104840:1;:19;104820:335;;;16838:10;-1:-1:-1;;;;;104889:36:0;:20;104897:8;104906:1;104897:11;;;;;;;;:::i;:::-;;;;;;;104889:7;:20::i;:::-;-1:-1:-1;;;;;104889:36:0;;104881:71;;;;-1:-1:-1;;;104881:71:0;;20478:2:1;104881:71:0;;;20460:21:1;20517:2;20497:18;;;20490:30;20556:24;20536:18;;;20529:52;20598:18;;104881:71:0;20276:346:1;104881:71:0;104976:22;104986:8;104995:1;104986:11;;;;;;;;:::i;:::-;;;;;;;106690:4;106714:27;;;:18;:27;;;;;;-1:-1:-1;;106714:48:0;;;106631:139;104976:22;104975:23;104967:56;;;;-1:-1:-1;;;104967:56:0;;20829:2:1;104967:56:0;;;20811:21:1;20868:2;20848:18;;;20841:30;20907:22;20887:18;;;20880:50;20947:18;;104967:56:0;20627:344:1;104967:56:0;105091:15;;105073;:33;105072:71;;105128:15;;105072:71;;;105110:15;105072:71;105038:18;:31;105057:8;105066:1;105057:11;;;;;;;;:::i;:::-;;;;;;;105038:31;;;;;;;;;;;:105;;;;104861:3;;;;;:::i;:::-;;;;104820:335;;;;104720:442;:::o;69315:129::-;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;69398:38:::1;::::0;-1:-1:-1;;;69398:38:0;;18885:6:1;18873:19;;69398:38:0::1;::::0;::::1;18855::1::0;69398:10:0::1;-1:-1:-1::0;;;;;69398:28:0::1;::::0;::::1;::::0;18828:18:1;;69398:38:0::1;18711:188:1::0;101408:439:0;101457:14;101473:25;101502:16;101512:5;101502:9;:16::i;:::-;101456:62;;;;101534:9;101529:122;101553:8;:15;101549:1;:19;101529:122;;;101624:15;101590:18;:31;101609:8;101618:1;101609:11;;;;;;;;:::i;:::-;;;;;;;101590:31;;;;;;;;;;;:49;;;;101570:3;;;;;:::i;:::-;;;;101529:122;;;;101730:9;101753:5;-1:-1:-1;;;;;101745:19:0;101773:6;101745:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101729:56;;;101804:4;101796:43;;;;-1:-1:-1;;;101796:43:0;;21660:2:1;101796:43:0;;;21642:21:1;21699:2;21679:18;;;21672:30;21738:28;21718:18;;;21711:56;21784:18;;101796:43:0;21458:350:1;101796:43:0;101445:402;;;101408:439;:::o;24683:339::-;24878:41;16838:10;24897:12;24911:7;24878:18;:41::i;:::-;24870:103;;;;-1:-1:-1;;;24870:103:0;;22015:2:1;24870:103:0;;;21997:21:1;22054:2;22034:18;;;22027:30;22093:34;22073:18;;;22066:62;-1:-1:-1;;;22144:18:1;;;22137:47;22201:19;;24870:103:0;21813:413:1;24870:103:0;24986:28;24996:4;25002:2;25006:7;24986:9;:28::i;94478:400::-;94678:17;94697:14;94724:20;94758:2;94762:7;94747:23;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;94747:23:0;;;;;;;;;;-1:-1:-1;;;94788:82:0;;94747:23;-1:-1:-1;;;;;;94788:10:0;:23;;;;:82;;94812:10;;94832:4;;94747:23;;94848:6;;94856:13;;94788:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;94781:89;;;;;94478:400;;;;;;;;:::o;45834:494::-;45978:7;46041:27;;;:17;:27;;;;;;;;46012:56;;;;;;;;;-1:-1:-1;;;;;46012:56:0;;;;;-1:-1:-1;;;46012:56:0;;;;;;;;;;;;45978:7;;46081:92;;-1:-1:-1;46132:29:0;;;;;;;;;-1:-1:-1;46132:29:0;-1:-1:-1;;;;;46132:29:0;;;;-1:-1:-1;;;46132:29:0;;;;;;;;46081:92;46223:23;;;;46185:21;;46694:5;;46210:36;;46209:58;46210:36;:10;:36;:::i;:::-;46209:58;;;;:::i;:::-;46288:16;;;-1:-1:-1;46185:82:0;;-1:-1:-1;;45834:494:0;;;;;;:::o;37506:256::-;37603:7;37639:23;37656:5;37639:16;:23::i;:::-;37631:5;:31;37623:87;;;;-1:-1:-1;;;37623:87:0;;24110:2:1;37623:87:0;;;24092:21:1;24149:2;24129:18;;;24122:30;24188:34;24168:18;;;24161:62;-1:-1:-1;;;24239:18:1;;;24232:41;24290:19;;37623:87:0;23908:407:1;37623:87:0;-1:-1:-1;;;;;;37728:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37506:256::o;70000:250::-;70142:32;;;70096:4;70142:32;;;:19;:32;;;;;70113:61;;70096:4;;70142:32;70113:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70230:11;;70220:22;;;;;;;:::i;:::-;;;;;;;;70202:13;70192:24;;;;;;:50;70185:57;;;70000:250;;;;;:::o;101855:509::-;101910:14;101926:25;101998:17;102009:5;101998:10;:17::i;:::-;101987:28;;102032:8;:15;102051:1;102032:20;102028:81;;102080:16;;;102077:1;102080:16;;;;;;;;;102069:28;;;;101855:509;;;:::o;102028:81::-;102126:9;102121:236;102145:8;:15;102141:1;:19;102121:236;;;102221:15;102186:18;:31;102205:8;102214:1;102205:11;;;;;;;;:::i;:::-;;;;;;;102186:31;;;;;;;;;;;;:50;102182:164;;102298:18;:31;102317:8;102326:1;102317:11;;;;;;;;:::i;:::-;;;;;;;102298:31;;;;;;;;;;;;102280:15;:49;;;;:::i;:::-;102267:63;;:9;:63;:::i;:::-;102257:73;;;;:::i;:::-;;;102182:164;102162:3;;;;:::i;:::-;;;;102121:236;;;;101855:509;;;:::o;25093:185::-;25231:39;25248:4;25254:2;25258:7;25231:39;;;;;;;;;;;;:16;:39::i;50401:245::-;50519:41;16838:10;50538:12;16758:98;50519:41;50511:102;;;;-1:-1:-1;;;50511:102:0;;25061:2:1;50511:102:0;;;25043:21:1;25100:2;25080:18;;;25073:30;25139:34;25119:18;;;25112:62;25210:18;25190;;;25183:46;25246:19;;50511:102:0;24859:412:1;50511:102:0;50624:14;50630:7;50624:5;:14::i;:::-;50401:245;:::o;69452:178::-;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;69567:55:::1;::::0;-1:-1:-1;;;69567:55:0;;-1:-1:-1;;;;;69567:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;69597:11;;69610;;;;69567:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;69452:178:::0;;;:::o;38028:233::-;38103:7;38139:30;37926:10;:17;;37838:113;38139:30;38131:5;:38;38123:95;;;;-1:-1:-1;;;38123:95:0;;26080:2:1;38123:95:0;;;26062:21:1;26119:2;26099:18;;;26092:30;26158:34;26138:18;;;26131:62;-1:-1:-1;;;26209:18:1;;;26202:42;26261:19;;38123:95:0;25878:408:1;38123:95:0;38236:10;38247:5;38236:17;;;;;;;;:::i;:::-;;;;;;;;;38229:24;;38028:233;;;:::o;95231:368::-;95506:85;95512:4;95518:10;95530:2;95534:7;95543:13;95558:17;95577:13;95506:5;:85::i;22067:239::-;22139:7;22175:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22175:16:0;;22202:73;;;;-1:-1:-1;;;22202:73:0;;26493:2:1;22202:73:0;;;26475:21:1;26532:2;26512:18;;;26505:30;26571:34;26551:18;;;26544:62;-1:-1:-1;;;26622:18:1;;;26615:39;26671:19;;22202:73:0;26291:405:1;71534:385:0;16838:10;71787:4;71763:29;71755:80;;;;-1:-1:-1;;;71755:80:0;;26903:2:1;71755:80:0;;;26885:21:1;26942:2;26922:18;;;26915:30;26981:34;26961:18;;;26954:62;-1:-1:-1;;;27032:18:1;;;27025:36;27078:19;;71755:80:0;26701:402:1;71755:80:0;71846:65;71868:11;71881;71894:6;71902:8;71846:21;:65::i;101131:269::-;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;101259:6:::1;:13;101238:10;:17;:34;101230:43;;;::::0;::::1;;101289:9;101284:109;101308:10;:17;101304:1;:21;101284:109;;;101347:34;101356:10;101367:1;101356:13;;;;;;;;:::i;:::-;;;;;;;101371:6;101378:1;101371:9;;;;;;;;:::i;:::-;;;;;;;101347:8;:34::i;:::-;-1:-1:-1::0;101327:3:0;::::1;::::0;::::1;:::i;:::-;;;;101284:109;;104613:99:::0;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;104685:19;;::::1;::::0;:10:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;21797:208::-:0;21869:7;-1:-1:-1;;;;;21897:19:0;;21889:74;;;;-1:-1:-1;;;21889:74:0;;27310:2:1;21889:74:0;;;27292:21:1;27349:2;27329:18;;;27322:30;27388:34;27368:18;;;27361:62;-1:-1:-1;;;27439:18:1;;;27432:40;27489:19;;21889:74:0;27108:406:1;21889:74:0;-1:-1:-1;;;;;;21981:16:0;;;;;:9;:16;;;;;;;21797:208::o;57241:112::-;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;57315:30:::1;57342:1;57315:18;:30::i;:::-;57241:112::o:0;66415:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56673:217::-;56755:9;;-1:-1:-1;;;;;56755:9:0;56741:10;:23;56733:70;;;;-1:-1:-1;;;56733:70:0;;27721:2:1;56733:70:0;;;27703:21:1;27760:2;27740:18;;;27733:30;27799:34;27779:18;;;27772:62;-1:-1:-1;;;27850:18:1;;;27843:32;27892:19;;56733:70:0;27519:398:1;56733:70:0;56843:9;;56835:6;;56819:34;;-1:-1:-1;;;;;56843:9:0;;;;56835:6;;;;56819:34;;56843:9;;56819:34;56873:9;;56864:6;:18;;-1:-1:-1;;;;;;56864:18:0;-1:-1:-1;;;;;56873:9:0;;;56864:18;;;;;;56673:217::o;22542:104::-;22598:13;22631:7;22624:14;;;;;:::i;105170:122::-;105222:25;105267:17;105278:5;105267:10;:17::i;102742:527::-;102795:16;102851:15;;102832;:34;;102824:60;;;;-1:-1:-1;;;102824:60:0;;28124:2:1;102824:60:0;;;28106:21:1;28163:2;28143:18;;;28136:30;-1:-1:-1;;;28182:18:1;;;28175:43;28235:18;;102824:60:0;27922:337:1;102824:60:0;102912:2;102903:5;:11;;102895:50;;;;-1:-1:-1;;;102895:50:0;;28466:2:1;102895:50:0;;;28448:21:1;28505:2;28485:18;;;28478:30;28544:28;28524:18;;;28517:56;28590:18;;102895:50:0;28264:350:1;102895:50:0;102985:12;:10;:12::i;:::-;102977:20;;:5;:20;:::i;:::-;102964:9;:33;102956:73;;;;-1:-1:-1;;;102956:73:0;;28821:2:1;102956:73:0;;;28803:21:1;28860:2;28840:18;;;28833:30;28899:29;28879:18;;;28872:57;28946:18;;102956:73:0;28619:351:1;102956:73:0;103155:19;;103041:9;;103064:42;;103147:27;;:5;:27;:::i;:::-;103134:41;;:9;:41;:::i;:::-;103056:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103040:150;;;103209:4;103201:13;;;;;;103232:29;16838:10;103255:5;103232:8;:29::i;:::-;103225:36;102742:527;-1:-1:-1;;;102742:527:0:o;24226:155::-;24321:52;16838:10;24354:8;24364;24321:18;:52::i;25349:328::-;25524:41;16838:10;25557:7;25524:18;:41::i;:::-;25516:103;;;;-1:-1:-1;;;25516:103:0;;22015:2:1;25516:103:0;;;21997:21:1;22054:2;22034:18;;;22027:30;22093:34;22073:18;;;22066:62;-1:-1:-1;;;22144:18:1;;;22137:47;22201:19;;25516:103:0;21813:413:1;25516:103:0;25630:39;25644:4;25650:2;25654:7;25663:5;25630:13;:39::i;102628:106::-;102684:4;106714:27;;;:18;:27;;;;;;-1:-1:-1;;106714:48:0;;102708:18;106631:139;103277:1204;103320:7;103363:15;;103344;:34;;:85;;;;-1:-1:-1;103401:15:0;;:28;;103419:10;103401:28;:::i;:::-;103382:15;:47;;103344:85;103340:1106;;;103458:42;103450:61;16838:10;103450:75;;-1:-1:-1;;;;;;103450:75:0;;;;;;;-1:-1:-1;;;;;4120:55:1;;;103450:75:0;;;4102:74:1;4075:18;;103450:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;103446:989;;-1:-1:-1;103593:8:0;;103277:1204::o;103446:989::-;103635:42;103627:61;16838:10;103627:75;;-1:-1:-1;;;;;;103627:75:0;;;;;;;-1:-1:-1;;;;;4120:55:1;;;103627:75:0;;;4102:74:1;4075:18;;103627:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;103623:812;;-1:-1:-1;103773:8:0;;103277:1204::o;103623:812::-;103833:42;103825:61;16838:10;103825:75;;-1:-1:-1;;;;;;103825:75:0;;;;;;;-1:-1:-1;;;;;4120:55:1;;;103825:75:0;;;4102:74:1;4075:18;;103825:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;;;:192;;-1:-1:-1;103945:42:0;103937:61;16838:10;103937:75;;-1:-1:-1;;;;;;103937:75:0;;;;;;;-1:-1:-1;;;;;4120:55:1;;;103937:75:0;;;4102:74:1;4075:18;;103937:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;;103825:192;:303;;;-1:-1:-1;104056:42:0;104048:61;16838:10;104048:75;;-1:-1:-1;;;;;;104048:75:0;;;;;;;-1:-1:-1;;;;;4120:55:1;;;104048:75:0;;;4102:74:1;4075:18;;104048:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;;103825:303;:419;;;-1:-1:-1;104172:42:0;104164:61;16838:10;104164:75;;-1:-1:-1;;;;;;104164:75:0;;;;;;;-1:-1:-1;;;;;4120:55:1;;;104164:75:0;;;4102:74:1;4075:18;;104164:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;;103825:419;:532;;;-1:-1:-1;104285:42:0;104277:61;16838:10;104277:75;;-1:-1:-1;;;;;;104277:75:0;;;;;;;-1:-1:-1;;;;;4120:55:1;;;104277:75:0;;;4102:74:1;4075:18;;104277:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;;103825:532;103803:632;;;-1:-1:-1;104411:8:0;;103277:1204::o;103803:632::-;-1:-1:-1;104465:8:0;;103277:1204::o;105447:256::-;27252:4;27276:16;;;:7;:16;;;;;;105512:13;;-1:-1:-1;;;;;27276:16:0;105538:67;;;;-1:-1:-1;;;105538:67:0;;29366:2:1;105538:67:0;;;29348:21:1;29405:2;29385:18;;;29378:30;29444:34;29424:18;;;29417:62;-1:-1:-1;;;29495:18:1;;;29488:36;29541:19;;105538:67:0;29164:402:1;105538:67:0;105647:10;105659:25;105676:7;105659:16;:25::i;:::-;105630:64;;;;;;;;;:::i;:::-;;;;;;;;;;;;;105616:79;;105447:256;;;:::o;68926:250::-;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;69106:62:::1;::::0;-1:-1:-1;;;69106:62:0;;-1:-1:-1;;;;;69106:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;69127:8;;69137;;69147:11;;69160:7;;;;69106:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;68926:250:::0;;;;;:::o;102372:248::-;102429:7;102453:27;;;:18;:27;;;;;;102484:15;-1:-1:-1;102449:87:0;;-1:-1:-1;102523:1:0;;102372:248;-1:-1:-1;102372:248:0:o;102449:87::-;102584:27;;;;:18;:27;;;;;;102566:45;;:15;:45;:::i;:::-;102553:59;;:9;:59;:::i;72148:724::-;72398:27;;;72376:19;72398:27;;;:14;:27;;;;;;:40;;;;72426:11;;72398:40;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;-1:-1:-1;72398:48:0;72457:73;;;;-1:-1:-1;;;72457:73:0;;32295:2:1;72457:73:0;;;32277:21:1;32334:2;32314:18;;;32307:30;32373:34;32353:18;;;32346:62;-1:-1:-1;;;32424:18:1;;;32417:33;32467:19;;72457:73:0;32093:399:1;72457:73:0;72549:19;;;;;;:34;;72541:80;;;;-1:-1:-1;;;72541:80:0;;32699:2:1;72541:80:0;;;32681:21:1;32738:2;32718:18;;;32711:30;32777:34;32757:18;;;32750:62;-1:-1:-1;;;32828:18:1;;;32821:31;32869:19;;72541:80:0;32497:397:1;72541:80:0;72669:27;;;72728:1;72669:27;;;:14;:27;;;;;;:40;;;;72697:11;;72669:40;:::i;:::-;;;;;;;;;;;;;;;;:48;;;;;;;;;;;:61;72799:65;72821:11;72834;72669:48;72855:8;72799:21;:65::i;56299:247::-;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;-1:-1:-1;;;;;56393:22:0;::::1;56385:73;;;::::0;-1:-1:-1;;;56385:73:0;;33101:2:1;56385:73:0::1;::::0;::::1;33083:21:1::0;33140:2;33120:18;;;33113:30;33179:34;33159:18;;;33152:62;-1:-1:-1;;;33230:18:1;;;33223:36;33276:19;;56385:73:0::1;32899:402:1::0;56385:73:0::1;56490:6;::::0;56474:33:::1;::::0;-1:-1:-1;;;;;56474:33:0;;::::1;::::0;56490:6:::1;::::0;56474:33:::1;::::0;56490:6:::1;::::0;56474:33:::1;56518:9;:20:::0;;-1:-1:-1;;;;;;56518:20:0::1;-1:-1:-1::0;;;;;56518:20:0;;;::::1;::::0;;;::::1;::::0;;56299:247::o;104489:116::-;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;104566:15:::1;:31:::0;104489:116::o;105711:385::-;105781:8;:15;105800:1;105781:20;105773:29;;;;;;105818:9;105813:276;105837:8;:15;105833:1;:19;105813:276;;;16838:10;-1:-1:-1;;;;;105882:36:0;:20;105890:8;105899:1;105890:11;;;;;;;;:::i;105882:20::-;-1:-1:-1;;;;;105882:36:0;;105874:71;;;;-1:-1:-1;;;105874:71:0;;20478:2:1;105874:71:0;;;20460:21:1;20517:2;20497:18;;;20490:30;20556:24;20536:18;;;20529:52;20598:18;;105874:71:0;20276:346:1;105874:71:0;105968:22;105978:8;105987:1;105978:11;;;;;;;;:::i;105968:22::-;105960:51;;;;-1:-1:-1;;;105960:51:0;;33508:2:1;105960:51:0;;;33490:21:1;33547:2;33527:18;;;33520:30;33586:18;33566;;;33559:46;33622:18;;105960:51:0;33306:340:1;105960:51:0;-1:-1:-1;;106026:18:0;:31;106045:8;106054:1;106045:11;;;;;;;;:::i;:::-;;;;;;;106026:31;;;;;;;;;;;:51;;;;105854:3;;;;;:::i;:::-;;;;105813:276;;69684:216;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;69788:32:::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:46:::1;::::0;69823:11;;69788:46:::1;:::i;:::-;;69850:42;69867:11;69880;;69850:42;;;;;;;;:::i;:::-;;;;;;;;69684:216:::0;;;:::o;57508:210::-;55895:6;;-1:-1:-1;;;;;55895:6:0;16838:10;56042:23;56034:68;;;;-1:-1:-1;;;56034:68:0;;18552:2:1;56034:68:0;;;18534:21:1;;;18571:18;;;18564:30;-1:-1:-1;;;;;;;;;;;18610:18:1;;;18603:62;18682:18;;56034:68:0;18350:356:1;56034:68:0;-1:-1:-1;;;;;57606:22:0;::::1;57598:73;;;::::0;-1:-1:-1;;;57598:73:0;;33101:2:1;57598:73:0::1;::::0;::::1;33083:21:1::0;33140:2;33120:18;;;33113:30;33179:34;33159:18;;;33152:62;-1:-1:-1;;;33230:18:1;;;33223:36;33276:19;;57598:73:0::1;32899:402:1::0;57598:73:0::1;57682:28;57701:8;57682:18;:28::i;68607:257::-:0;68788:68;;-1:-1:-1;;;68788:68:0;;33888:6:1;33921:15;;;68788:68:0;;;33903:34:1;33973:15;;33953:18;;;33946:43;68837:4:0;34005:18:1;;;33998:83;34097:18;;;34090:34;;;68756:12:0;;68788:10;-1:-1:-1;;;;;68788:20:0;;;;33850:19:1;;68788:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68788:68:0;;;;;;;;;;;;:::i;:::-;68781:75;;68607:257;;;;;;;:::o;86399:123::-;86456:7;86509:5;86483:23;86509:5;86456:7;86483:11;:23::i;:::-;:31;;;;:::i;70955:571::-;71195:69;;-1:-1:-1;;;71195:69:0;;:4;;:25;;:69;;71221:11;;71234;;71247:6;;71255:8;;71195:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71191:328;;71421:8;71411:19;;;;;;71360:14;:27;71375:11;71360:27;;;;;;;;;;;;;;;71388:11;71360:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:48;;;;;;;;;;:70;;;;71450:57;;;;71464:11;;71477;;71401:6;;71498:8;;71450:57;:::i;:::-;;;;;;;;71191:328;;37198:224;37300:4;-1:-1:-1;;;;;;37324:50:0;;-1:-1:-1;;;37324:50:0;;:90;;;37378:36;37402:11;37378:23;:36::i;49455:170::-;49557:4;49581:36;49605:11;49581:23;:36::i;21428:305::-;21530:4;-1:-1:-1;;;;;;21567:40:0;;-1:-1:-1;;;21567:40:0;;:105;;-1:-1:-1;;;;;;;21624:48:0;;-1:-1:-1;;;21624:48:0;21567:105;:158;;;;21689:36;21713:11;21689:23;:36::i;89338:182::-;89404:13;89437:75;89509:2;89472:12;;89486:7;89455:39;;;;;;;;35766:19:1;;;35810:2;35801:12;;35794:28;35847:2;35838:12;;35609:247;89455:39:0;;;;-1:-1:-1;;89455:39:0;;;;;;;;;89445:50;;89455:39;89445:50;;;;;89437:71;:75::i;31333:249::-;31446:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31446:29:0;-1:-1:-1;;;;;31446:29:0;;;;;;;;:24;;31500:23;31446:24;31500:14;:23::i;:::-;-1:-1:-1;;;;;31491:46:0;;;;;;;;;;;104820:335;104720:442;:::o;27481:348::-;27574:4;27276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27276:16:0;27591:73;;;;-1:-1:-1;;;27591:73:0;;36063:2:1;27591:73:0;;;36045:21:1;36102:2;36082:18;;;36075:30;36141:34;36121:18;;;36114:62;-1:-1:-1;;;36192:18:1;;;36185:42;36244:19;;27591:73:0;35861:408:1;27591:73:0;27675:13;27691:23;27706:7;27691:14;:23::i;:::-;27675:39;;27744:5;-1:-1:-1;;;;;27733:16:0;:7;-1:-1:-1;;;;;27733:16:0;;:52;;;-1:-1:-1;;;;;;24573:25:0;;;24549:4;24573:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27753:32;27733:87;;;;27813:7;-1:-1:-1;;;;;27789:31:0;:20;27801:7;27789:11;:20::i;:::-;-1:-1:-1;;;;;27789:31:0;;27725:96;27481:348;-1:-1:-1;;;;27481:348:0:o;30590:625::-;30749:4;-1:-1:-1;;;;;30722:31:0;:23;30737:7;30722:14;:23::i;:::-;-1:-1:-1;;;;;30722:31:0;;30714:81;;;;-1:-1:-1;;;30714:81:0;;36476:2:1;30714:81:0;;;36458:21:1;36515:2;36495:18;;;36488:30;36554:34;36534:18;;;36527:62;-1:-1:-1;;;36605:18:1;;;36598:35;36650:19;;30714:81:0;36274:401:1;30714:81:0;-1:-1:-1;;;;;30814:16:0;;30806:65;;;;-1:-1:-1;;;30806:65:0;;36882:2:1;30806:65:0;;;36864:21:1;36921:2;36901:18;;;36894:30;36960:34;36940:18;;;36933:62;-1:-1:-1;;;37011:18:1;;;37004:34;37055:19;;30806:65:0;36680:400:1;30806:65:0;30884:39;30905:4;30911:2;30915:7;30884:20;:39::i;:::-;30988:29;31005:1;31009:7;30988:8;:29::i;:::-;-1:-1:-1;;;;;31030:15:0;;;;;;:9;:15;;;;;:20;;31049:1;;31030:15;:20;;31049:1;;31030:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31061:13:0;;;;;;:9;:13;;;;;:18;;31078:1;;31061:13;:18;;31078:1;;31061:18;:::i;:::-;;;;-1:-1:-1;;31090:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31090:21:0;-1:-1:-1;;;;;31090:21:0;;;;;;;;;31129:27;;31090:16;;31129:27;;;;;;;23526:341;23456:411;;:::o;107680:607::-;107738:25;107776:13;107792:19;107805:5;107792:12;:19::i;:::-;107776:35;;107828:5;107837:1;107828:10;107824:66;;107876:1;107862:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107862:16:0;-1:-1:-1;107855:23:0;107680:607;-1:-1:-1;;;107680:607:0:o;107824:66::-;107927:5;107913:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107913:20:0;;107902:31;;107946:25;107974:19;107987:5;107974:12;:19::i;:::-;107946:47;;108010:8;:15;108029:1;108010:20;108006:76;;-1:-1:-1;;108054:16:0;;;108068:1;108054:16;;;;;;;;;108047:23;-1:-1:-1;;107680:607:0:o;108006:76::-;108094:11;;108116:164;108140:8;:15;108136:1;:19;108116:164;;;108181:22;108191:8;108200:1;108191:11;;;;;;;;:::i;108181:22::-;108177:92;;;108242:8;108251:1;108242:11;;;;;;;;:::i;:::-;;;;;;;108224:8;108233:5;;;;;:::i;:::-;;;108224:15;;;;;;;;:::i;:::-;;;;;;:29;;;;;108177:92;108157:3;;;;:::i;:::-;;;;108116:164;;;;107765:522;;;107680:607;;;:::o;99349:120::-;99441:20;99453:7;99441:11;:20::i;97116:613::-;97382:41;97393:4;97399:10;97411:2;97415:7;97382:10;:41::i;:::-;97436:20;97470:2;97474:7;97459:23;;;;;;;;;:::i;:::-;;;;;;;;;;;;;97436:46;;97495:77;97503:10;97515:7;97524:13;97539:17;97558:13;97495:7;:77::i;:::-;97600:54;;-1:-1:-1;;;97600:54:0;;37287:6:1;37275:19;;97600:54:0;;;37257:38:1;97648:4:0;37311:18:1;;;37304:83;97585:12:0;;97600:10;-1:-1:-1;;;;;97600:27:0;;;;37230:18:1;;97600:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97585:69;;97702:2;97672:49;;;;;;:::i;:::-;;;;;;;;;;37824:25:1;;;37897:18;37885:31;;37880:2;37865:18;;37858:59;97672:49:0;;;;;-1:-1:-1;;;;;97672:49:0;;;;;37797:18:1;97672:49:0;;;;;;;97371:358;;97116:613;;;;;;;:::o;95647:593::-;95885:27;95914:15;95944:8;95933:38;;;;;;;;;;;;:::i;:::-;96075:2;96055:23;;96049:30;95884:87;;-1:-1:-1;95884:87:0;-1:-1:-1;96102:42:0;96112:11;96049:30;95884:87;96102:9;:42::i;:::-;96205:9;-1:-1:-1;;;;;96162:70:0;96192:11;96162:70;;;;;;:::i;:::-;;;;;;;;;;37824:25:1;;;37897:18;37885:31;;37880:2;37865:18;;37858:59;96162:70:0;;;;;;;37797:18:1;96162:70:0;;;;;;;95831:409;;;95647:593;;;;:::o;106778:528::-;106841:25;106911:10;106902:5;106887:12;;:20;;;;:::i;:::-;:34;;106879:66;;;;-1:-1:-1;;;106879:66:0;;38531:2:1;106879:66:0;;;38513:21:1;38570:2;38550:18;;;38543:30;38609:21;38589:18;;;38582:49;38648:18;;106879:66:0;38329:343:1;106879:66:0;106972:5;106956:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;107015:5:0;;-1:-1:-1;107001:20:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107001:20:0;;106990:31;;107039:9;107034:265;107058:5;107054:1;:9;107034:265;;;107099:23;:21;:23::i;:::-;:27;;107125:1;107099:27;:::i;:::-;107085:8;107094:1;107085:11;;;;;;;;:::i;:::-;;;;;;:41;;;;;107141:26;107151:2;107155:8;107164:1;107155:11;;;;;;;;:::i;:::-;;;;;;;107141:9;:26::i;:::-;107235:15;;107217;:33;107216:71;;107272:15;;107216:71;;;107254:15;107216:71;107182:18;:31;107201:8;107210:1;107201:11;;;;;;;;:::i;:::-;;;;;;;107182:31;;;;;;;;;;;:105;;;;107065:3;;;;;:::i;:::-;;;;107034:265;;;;106778:528;;;;:::o;57878:191::-;57971:6;;;-1:-1:-1;;;;;57988:17:0;;;-1:-1:-1;;;;;;57988:17:0;;;;;;;58021:40;;57971:6;;;57988:17;57971:6;;58021:40;;57952:16;;58021:40;57941:128;57878:191;:::o;31724:432::-;31879:8;-1:-1:-1;;;;;31870:17:0;:5;-1:-1:-1;;;;;31870:17:0;;31862:55;;;;-1:-1:-1;;;31862:55:0;;38879:2:1;31862:55:0;;;38861:21:1;38918:2;38898:18;;;38891:30;38957:27;38937:18;;;38930:55;39002:18;;31862:55:0;38677:349:1;31862:55:0;-1:-1:-1;;;;;31987:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31987:46:0;;;;;;;;;;32049:41;;2757::1;;;32049::0;;2730:18:1;32049:41:0;;;;;;;23526:341;23456:411;;:::o;26559:315::-;26716:28;26726:4;26732:2;26736:7;26716:9;:28::i;:::-;26763:48;26786:4;26792:2;26796:7;26805:5;26763:22;:48::i;:::-;26755:111;;;;-1:-1:-1;;;26755:111:0;;39233:2:1;26755:111:0;;;39215:21:1;39272:2;39252:18;;;39245:30;39311:34;39291:18;;;39284:62;-1:-1:-1;;;39362:18:1;;;39355:48;39420:19;;26755:111:0;39031:414:1;87533:597:0;87608:7;87757:4;87789:10;87826:14;87867:12;87906:15;87948:16;87991:8;;88026:5;88058:7;87706:382;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;87706:382:0;;;;;;;;;87674:433;;87706:382;87674:433;;;;;87533:597;-1:-1:-1;;;87533:597:0:o;45564:215::-;45666:4;-1:-1:-1;;;;;;45690:41:0;;-1:-1:-1;;;45690:41:0;;:81;;-1:-1:-1;;;;;;;;;;20008:40:0;;;45735:36;19899:157;18608:451;18683:13;18709:19;18741:10;18745:6;18741:1;:10;:::i;:::-;:14;;18754:1;18741:14;:::i;:::-;18731:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18731:25:0;;18709:47;;-1:-1:-1;;;18767:6:0;18774:1;18767:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;18767:15:0;;;;;;;;;-1:-1:-1;;;18793:6:0;18800:1;18793:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;18793:15:0;;;;;;;;-1:-1:-1;18824:9:0;18836:10;18840:6;18836:1;:10;:::i;:::-;:14;;18849:1;18836:14;:::i;:::-;18824:26;;18819:135;18856:1;18852;:5;18819:135;;;18891:12;18904:5;18912:3;18904:11;18891:25;;;;;;;:::i;:::-;;;;18879:6;18886:1;18879:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;18879:37:0;;;;;;;;-1:-1:-1;18941:1:0;18931:11;;;;;18859:3;;;:::i;:::-;;;18819:135;;;-1:-1:-1;18972:10:0;;18964:55;;;;-1:-1:-1;;;18964:55:0;;40699:2:1;18964:55:0;;;40681:21:1;;;40718:18;;;40711:30;40777:34;40757:18;;;40750:62;40829:18;;18964:55:0;40497:356:1;106144:479:0;-1:-1:-1;;;;;106284:18:0;;;106280:108;;106690:4;106714:27;;;:18;:27;;;;;;-1:-1:-1;;106714:48:0;106319:57;;;;-1:-1:-1;;;106319:57:0;;41060:2:1;106319:57:0;;;41042:21:1;41099:2;41079:18;;;41072:30;41138:27;41118:18;;;41111:55;41183:18;;106319:57:0;40858:349:1;106319:57:0;-1:-1:-1;;;;;106405:13:0;;9130:19;:23;;;106404:36;;-1:-1:-1;;;;;;106424:16:0;;;;106404:36;:56;;;;-1:-1:-1;;;;;;106444:16:0;;106458:1;106444:16;;106404:56;106400:160;;;106506:14;106485:13;106495:2;106485:9;:13::i;:::-;:17;;106501:1;106485:17;:::i;:::-;:35;;106477:71;;;;-1:-1:-1;;;106477:71:0;;41414:2:1;106477:71:0;;;41396:21:1;41453:2;41433:18;;;41426:30;41492:25;41472:18;;;41465:53;41535:18;;106477:71:0;41212:347:1;106477:71:0;106570:45;106597:4;106603:2;106607:7;106570:26;:45::i;107314:358::-;107374:13;107420:25;107448:19;107461:5;107448:12;:19::i;:::-;107420:47;;107484:8;:15;107503:1;107484:20;107480:61;;-1:-1:-1;107528:1:0;;107314:358;-1:-1:-1;;107314:358:0:o;107480:61::-;107558:9;107553:112;107577:8;:15;107573:1;:19;107553:112;;;107623:22;107633:8;107642:1;107633:11;;;;;;;;:::i;107623:22::-;:30;;107652:1;107623:30;;;107648:1;107623:30;107614:39;;;;;;:::i;:::-;;-1:-1:-1;107594:3:0;;;;:::i;:::-;;;;107553:112;;;;107389:283;107314:358;;;:::o;108295:386::-;108355:25;108393:15;108411:16;108421:5;108411:9;:16::i;:::-;108393:34;;108444:7;108455:1;108444:12;108440:68;;108494:1;108480:16;;108440:68;108545:7;108531:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;108531:22:0;;108520:33;;108571:9;108566:108;108590:7;108586:1;:11;108566:108;;;108633:29;108653:5;108660:1;108633:19;:29::i;:::-;108619:8;108628:1;108619:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;108599:3;;;;:::i;:::-;;;;108566:108;;49757:135;49826:20;49838:7;49826:11;:20::i;:::-;48386:26;;;;:17;:26;;;;;48379:33;50401:245::o;96404:359::-;96556:41;16838:10;96575:12;16758:98;96556:41;96548:99;;;;-1:-1:-1;;;96548:99:0;;41766:2:1;96548:99:0;;;41748:21:1;41805:2;41785:18;;;41778:30;41844:34;41824:18;;;41817:62;-1:-1:-1;;;41895:18:1;;;41888:43;41948:19;;96548:99:0;41564:409:1;96548:99:0;96686:4;-1:-1:-1;;;;;96666:24:0;:16;96674:7;96666;:16::i;:::-;-1:-1:-1;;;;;96666:24:0;;96658:70;;;;-1:-1:-1;;;96658:70:0;;42180:2:1;96658:70:0;;;42162:21:1;42219:2;42199:18;;;42192:30;42258:34;42238:18;;;42231:62;-1:-1:-1;;;42309:18:1;;;42302:31;42350:19;;96658:70:0;41978:397:1;96658:70:0;96741:14;96747:7;96741:5;:14::i;67882:620::-;68140:32;;;68111:26;68140:32;;;:19;:32;;;;;68111:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68191:13;:20;68215:1;68191:25;68183:86;;;;-1:-1:-1;;;68183:86:0;;42582:2:1;68183:86:0;;;42564:21:1;42621:2;42601:18;;;42594:30;42660:34;42640:18;;;42633:62;42731:18;42711;;;42704:46;42767:19;;68183:86:0;42380:412:1;68183:86:0;68280:214;;-1:-1:-1;;;68280:214:0;;-1:-1:-1;;;;;68280:10:0;:15;;;;68304:9;;68280:214;;68330:11;;68356:13;;68384:8;;68407:14;;68436:18;;68469:14;;68280:214;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68100:402;67882:620;;;;;:::o;96248:148::-;96366:22;96376:2;96380:7;96366:9;:22::i;90694:840::-;90745:7;90765:13;90793:11;;90781:9;;:23;;;;:::i;:::-;90765:39;;90815:12;90838:14;90911:9;90955:5;90923:29;-1:-1:-1;;90923:27:0;:29::i;:::-;:37;;;;:::i;:::-;90911:49;-1:-1:-1;91037:11:0;:22;91049:9;91057:1;91049:5;:9;:::i;:::-;91037:22;;;;;;;;;;;;91063:1;91037:27;91033:138;;91088:9;91096:1;91088:5;:9;:::i;:::-;91081:16;;91033:138;;;91137:11;:22;91149:9;91157:1;91149:5;:9;:::i;:::-;91137:22;;;;;;;;;;;;91130:29;;91033:138;91293:14;;;;:11;:14;;;;;;:19;;91289:190;;91354:14;;;;:11;:14;;;;;:21;;;91338:1;-1:-1:-1;91338:1:0;91289:190;;;91417:14;;;;:11;:14;;;;;;;91446:21;;;;91417:14;-1:-1:-1;91289:190:0;91489:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;91520:6:0;;90694:840;-1:-1:-1;;;;;90694:840:0:o;28171:110::-;28247:26;28257:2;28261:7;28247:26;;;;;;;;;;;;:9;:26::i;32721:799::-;32876:4;-1:-1:-1;;;;;32897:13:0;;9130:19;:23;32893:620;;32933:72;;-1:-1:-1;;;32933:72:0;;-1:-1:-1;;;;;32933:36:0;;;;;:72;;16838:10;;32984:4;;32990:7;;32999:5;;32933:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32933:72:0;;;;;;;;-1:-1:-1;;32933:72:0;;;;;;;;;;;;:::i;:::-;;;32929:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33175:6;:13;33192:1;33175:18;33171:272;;33218:60;;-1:-1:-1;;;33218:60:0;;39233:2:1;33218:60:0;;;39215:21:1;39272:2;39252:18;;;39245:30;39311:34;39291:18;;;39284:62;-1:-1:-1;;;39362:18:1;;;39355:48;39420:19;;33218:60:0;39031:414:1;33171:272:0;33393:6;33387:13;33378:6;33374:2;33370:15;33363:38;32929:529;-1:-1:-1;;;;;;33056:51:0;-1:-1:-1;;;33056:51:0;;-1:-1:-1;33049:58:0;;32893:620;-1:-1:-1;33497:4:0;33490:11;;98301:239;98487:45;98514:4;98520:2;98524:7;98487:26;:45::i;29833:420::-;29893:13;29909:23;29924:7;29909:14;:23::i;:::-;29893:39;;29945:48;29966:5;29981:1;29985:7;29945:20;:48::i;:::-;30034:29;30051:1;30055:7;30034:8;:29::i;:::-;-1:-1:-1;;;;;30076:16:0;;;;;;:9;:16;;;;;:21;;30096:1;;30076:16;:21;;30096:1;;30076:21;:::i;:::-;;;;-1:-1:-1;;30115:16:0;;;;:7;:16;;;;;;30108:23;;-1:-1:-1;;;;;;30108:23:0;;;30149:36;30123:7;;30115:16;-1:-1:-1;;;;;30149:36:0;;;;;30115:16;;30149:36;104820:335;104720:442;:::o;28508:321::-;28638:18;28644:2;28648:7;28638:5;:18::i;:::-;28689:54;28720:1;28724:2;28728:7;28737:5;28689:22;:54::i;:::-;28667:154;;;;-1:-1:-1;;;28667:154:0;;39233:2:1;28667:154:0;;;39215:21:1;39272:2;39252:18;;;39245:30;39311:34;39291:18;;;39284:62;-1:-1:-1;;;39362:18:1;;;39355:48;39420:19;;28667:154:0;39031:414:1;53887:275:0;54031:45;54058:4;54064:2;54068:7;54031:26;:45::i;:::-;51825:7;;;;54097:9;54089:65;;;;-1:-1:-1;;;54089:65:0;;44682:2:1;54089:65:0;;;44664:21:1;44721:2;44701:18;;;44694:30;44760:34;44740:18;;;44733:62;-1:-1:-1;;;44811:18:1;;;44804:41;44862:19;;54089:65:0;44480:407:1;29165:439:0;-1:-1:-1;;;;;29245:16:0;;29237:61;;;;-1:-1:-1;;;29237:61:0;;45094:2:1;29237:61:0;;;45076:21:1;;;45113:18;;;45106:30;45172:34;45152:18;;;45145:62;45224:18;;29237:61:0;44892:356:1;29237:61:0;27252:4;27276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27276:16:0;:30;29309:58;;;;-1:-1:-1;;;29309:58:0;;45455:2:1;29309:58:0;;;45437:21:1;45494:2;45474:18;;;45467:30;45533;45513:18;;;45506:58;45581:18;;29309:58:0;45253:352:1;29309:58:0;29380:45;29409:1;29413:2;29417:7;29380:20;:45::i;:::-;-1:-1:-1;;;;;29438:13:0;;;;;;:9;:13;;;;;:18;;29455:1;;29438:13;:18;;29455:1;;29438:18;:::i;:::-;;;;-1:-1:-1;;29467:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29467:21:0;-1:-1:-1;;;;;29467:21:0;;;;;;;;29506:33;;29467:16;;;29506:33;;29467:16;;29506:33;104820:335;104720:442;:::o;38874:589::-;-1:-1:-1;;;;;39080:18:0;;39076:187;;39115:40;39147:7;40290:10;:17;;40263:24;;;;:15;:24;;;;;:44;;;40318:24;;;;;;;;;;;;40186:164;39115:40;39076:187;;;39185:2;-1:-1:-1;;;;;39177:10:0;:4;-1:-1:-1;;;;;39177:10:0;;39173:90;;39204:47;39237:4;39243:7;39204:32;:47::i;:::-;-1:-1:-1;;;;;39277:16:0;;39273:183;;39310:45;39347:7;39310:36;:45::i;39273:183::-;39383:4;-1:-1:-1;;;;;39377:10:0;:2;-1:-1:-1;;;;;39377:10:0;;39373:83;;39404:40;39432:2;39436:7;39404:27;:40::i;40977:988::-;41243:22;41293:1;41268:22;41285:4;41268:16;:22::i;:::-;:26;;;;:::i;:::-;41305:18;41326:26;;;:17;:26;;;;;;41243:51;;-1:-1:-1;41459:28:0;;;41455:328;;-1:-1:-1;;;;;41526:18:0;;41504:19;41526:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41577:30;;;;;;:44;;;41694:30;;:17;:30;;;;;:43;;;41455:328;-1:-1:-1;41879:26:0;;;;:17;:26;;;;;;;;41872:33;;;-1:-1:-1;;;;;41923:18:0;;;;;:12;:18;;;;;:34;;;;;;;41916:41;40977:988::o;42260:1079::-;42538:10;:17;42513:22;;42538:21;;42558:1;;42538:21;:::i;:::-;42570:18;42591:24;;;:15;:24;;;;;;42964:10;:26;;42513:46;;-1:-1:-1;42591:24:0;;42513:46;;42964:26;;;;;;:::i;:::-;;;;;;;;;42942:48;;43028:11;43003:10;43014;43003:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43108:28;;;:15;:28;;;;;;;:41;;;43280:24;;;;;43273:31;43315:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42331:1008;;;42260:1079;:::o;39764:221::-;39849:14;39866:20;39883:2;39866:16;:20::i;:::-;-1:-1:-1;;;;;39897:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39942:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39764:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;178:127;239:10;234:3;230:20;227:1;220:31;270:4;267:1;260:15;294:4;291:1;284:15;310:275;381:2;375:9;446:2;427:13;;-1:-1:-1;;423:27:1;411:40;;481:18;466:34;;502:22;;;463:62;460:88;;;528:18;;:::i;:::-;564:2;557:22;310:275;;-1:-1:-1;310:275:1:o;590:186::-;638:4;671:18;663:6;660:30;657:56;;;693:18;;:::i;:::-;-1:-1:-1;759:2:1;738:15;-1:-1:-1;;734:29:1;765:4;730:40;;590:186::o;781:336::-;845:5;874:52;890:35;918:6;890:35;:::i;:::-;874:52;:::i;:::-;865:61;;949:6;942:5;935:21;989:3;980:6;975:3;971:16;968:25;965:45;;;1006:1;1003;996:12;965:45;1055:6;1050:3;1043:4;1036:5;1032:16;1019:43;1109:1;1102:4;1093:6;1086:5;1082:18;1078:29;1071:40;781:336;;;;;:::o;1122:220::-;1164:5;1217:3;1210:4;1202:6;1198:17;1194:27;1184:55;;1235:1;1232;1225:12;1184:55;1257:79;1332:3;1323:6;1310:20;1303:4;1295:6;1291:17;1257:79;:::i;1347:129::-;1432:18;1425:5;1421:30;1414:5;1411:41;1401:69;;1466:1;1463;1456:12;1481:745;1583:6;1591;1599;1607;1660:3;1648:9;1639:7;1635:23;1631:33;1628:53;;;1677:1;1674;1667:12;1628:53;1700:28;1718:9;1700:28;:::i;:::-;1690:38;;1779:2;1768:9;1764:18;1751:32;1802:18;1843:2;1835:6;1832:14;1829:34;;;1859:1;1856;1849:12;1829:34;1882:49;1923:7;1914:6;1903:9;1899:22;1882:49;:::i;:::-;1872:59;;1981:2;1970:9;1966:18;1953:32;1940:45;;1994:30;2018:5;1994:30;:::i;:::-;2043:5;;-1:-1:-1;2101:2:1;2086:18;;2073:32;;2117:16;;;2114:36;;;2146:1;2143;2136:12;2114:36;;2169:51;2212:7;2201:8;2190:9;2186:24;2169:51;:::i;:::-;2159:61;;;1481:745;;;;;;;:::o;2231:131::-;-1:-1:-1;;;;;;2305:32:1;;2295:43;;2285:71;;2352:1;2349;2342:12;2367:245;2425:6;2478:2;2466:9;2457:7;2453:23;2449:32;2446:52;;;2494:1;2491;2484:12;2446:52;2533:9;2520:23;2552:30;2576:5;2552:30;:::i;2809:180::-;2868:6;2921:2;2909:9;2900:7;2896:23;2892:32;2889:52;;;2937:1;2934;2927:12;2889:52;-1:-1:-1;2960:23:1;;2809:180;-1:-1:-1;2809:180:1:o;2994:258::-;3066:1;3076:113;3090:6;3087:1;3084:13;3076:113;;;3166:11;;;3160:18;3147:11;;;3140:39;3112:2;3105:10;3076:113;;;3207:6;3204:1;3201:13;3198:48;;;-1:-1:-1;;3242:1:1;3224:16;;3217:27;2994:258::o;3257:269::-;3310:3;3348:5;3342:12;3375:6;3370:3;3363:19;3391:63;3447:6;3440:4;3435:3;3431:14;3424:4;3417:5;3413:16;3391:63;:::i;:::-;3508:2;3487:15;-1:-1:-1;;3483:29:1;3474:39;;;;3515:4;3470:50;;3257:269;-1:-1:-1;;3257:269:1:o;3531:231::-;3680:2;3669:9;3662:21;3643:4;3700:56;3752:2;3741:9;3737:18;3729:6;3700:56;:::i;3767:184::-;3825:6;3878:2;3866:9;3857:7;3853:23;3849:32;3846:52;;;3894:1;3891;3884:12;3846:52;3917:28;3935:9;3917:28;:::i;4187:154::-;-1:-1:-1;;;;;4266:5:1;4262:54;4255:5;4252:65;4242:93;;4331:1;4328;4321:12;4346:315;4414:6;4422;4475:2;4463:9;4454:7;4450:23;4446:32;4443:52;;;4491:1;4488;4481:12;4443:52;4530:9;4517:23;4549:31;4574:5;4549:31;:::i;:::-;4599:5;4651:2;4636:18;;;;4623:32;;-1:-1:-1;;;4346:315:1:o;4848:183::-;4908:4;4941:18;4933:6;4930:30;4927:56;;;4963:18;;:::i;:::-;-1:-1:-1;5008:1:1;5004:14;5020:4;5000:25;;4848:183::o;5036:662::-;5090:5;5143:3;5136:4;5128:6;5124:17;5120:27;5110:55;;5161:1;5158;5151:12;5110:55;5197:6;5184:20;5223:4;5247:60;5263:43;5303:2;5263:43;:::i;5247:60::-;5341:15;;;5427:1;5423:10;;;;5411:23;;5407:32;;;5372:12;;;;5451:15;;;5448:35;;;5479:1;5476;5469:12;5448:35;5515:2;5507:6;5503:15;5527:142;5543:6;5538:3;5535:15;5527:142;;;5609:17;;5597:30;;5647:12;;;;5560;;5527:142;;;-1:-1:-1;5687:5:1;5036:662;-1:-1:-1;;;;;;5036:662:1:o;5703:348::-;5787:6;5840:2;5828:9;5819:7;5815:23;5811:32;5808:52;;;5856:1;5853;5846:12;5808:52;5896:9;5883:23;5929:18;5921:6;5918:30;5915:50;;;5961:1;5958;5951:12;5915:50;5984:61;6037:7;6028:6;6017:9;6013:22;5984:61;:::i;6056:247::-;6115:6;6168:2;6156:9;6147:7;6143:23;6139:32;6136:52;;;6184:1;6181;6174:12;6136:52;6223:9;6210:23;6242:31;6267:5;6242:31;:::i;6308:456::-;6385:6;6393;6401;6454:2;6442:9;6433:7;6429:23;6425:32;6422:52;;;6470:1;6467;6460:12;6422:52;6509:9;6496:23;6528:31;6553:5;6528:31;:::i;:::-;6578:5;-1:-1:-1;6635:2:1;6620:18;;6607:32;6648:33;6607:32;6648:33;:::i;:::-;6308:456;;6700:7;;-1:-1:-1;;;6754:2:1;6739:18;;;;6726:32;;6308:456::o;6769:160::-;6834:20;;6890:13;;6883:21;6873:32;;6863:60;;6919:1;6916;6909:12;6934:749;7043:6;7051;7059;7067;7075;7128:3;7116:9;7107:7;7103:23;7099:33;7096:53;;;7145:1;7142;7135:12;7096:53;7168:28;7186:9;7168:28;:::i;:::-;7158:38;;7247:2;7236:9;7232:18;7219:32;7270:18;7311:2;7303:6;7300:14;7297:34;;;7327:1;7324;7317:12;7297:34;7350:49;7391:7;7382:6;7371:9;7367:22;7350:49;:::i;:::-;7340:59;;7446:2;7435:9;7431:18;7418:32;7408:42;;7469:35;7500:2;7489:9;7485:18;7469:35;:::i;:::-;7459:45;;7557:3;7546:9;7542:19;7529:33;7513:49;;7587:2;7577:8;7574:16;7571:36;;;7603:1;7600;7593:12;7571:36;;7626:51;7669:7;7658:8;7647:9;7643:24;7626:51;:::i;:::-;7616:61;;;6934:749;;;;;;;;:::o;7941:248::-;8009:6;8017;8070:2;8058:9;8049:7;8045:23;8041:32;8038:52;;;8086:1;8083;8076:12;8038:52;-1:-1:-1;;8109:23:1;;;8179:2;8164:18;;;8151:32;;-1:-1:-1;7941:248:1:o;8496:347::-;8547:8;8557:6;8611:3;8604:4;8596:6;8592:17;8588:27;8578:55;;8629:1;8626;8619:12;8578:55;-1:-1:-1;8652:20:1;;8695:18;8684:30;;8681:50;;;8727:1;8724;8717:12;8681:50;8764:4;8756:6;8752:17;8740:29;;8816:3;8809:4;8800:6;8792;8788:19;8784:30;8781:39;8778:59;;;8833:1;8830;8823:12;8848:481;8926:6;8934;8942;8995:2;8983:9;8974:7;8970:23;8966:32;8963:52;;;9011:1;9008;9001:12;8963:52;9034:28;9052:9;9034:28;:::i;:::-;9024:38;;9113:2;9102:9;9098:18;9085:32;9140:18;9132:6;9129:30;9126:50;;;9172:1;9169;9162:12;9126:50;9211:58;9261:7;9252:6;9241:9;9237:22;9211:58;:::i;:::-;8848:481;;9288:8;;-1:-1:-1;9185:84:1;;-1:-1:-1;;;;8848:481:1:o;9334:435::-;9387:3;9425:5;9419:12;9452:6;9447:3;9440:19;9478:4;9507:2;9502:3;9498:12;9491:19;;9544:2;9537:5;9533:14;9565:1;9575:169;9589:6;9586:1;9583:13;9575:169;;;9650:13;;9638:26;;9684:12;;;;9719:15;;;;9611:1;9604:9;9575:169;;;-1:-1:-1;9760:3:1;;9334:435;-1:-1:-1;;;;;9334:435:1:o;9774:332::-;9981:6;9970:9;9963:25;10024:2;10019;10008:9;10004:18;9997:30;9944:4;10044:56;10096:2;10085:9;10081:18;10073:6;10044:56;:::i;10111:1108::-;10249:6;10257;10265;10273;10281;10289;10297;10350:3;10338:9;10329:7;10325:23;10321:33;10318:53;;;10367:1;10364;10357:12;10318:53;10406:9;10393:23;10425:31;10450:5;10425:31;:::i;:::-;10475:5;-1:-1:-1;10499:37:1;10532:2;10517:18;;10499:37;:::i;:::-;10489:47;;10587:2;10576:9;10572:18;10559:32;10610:18;10651:2;10643:6;10640:14;10637:34;;;10667:1;10664;10657:12;10637:34;10690:49;10731:7;10722:6;10711:9;10707:22;10690:49;:::i;:::-;10680:59;;10786:2;10775:9;10771:18;10758:32;10748:42;;10842:3;10831:9;10827:19;10814:33;10799:48;;10856:33;10881:7;10856:33;:::i;:::-;10908:7;;-1:-1:-1;10967:3:1;10952:19;;10939:33;;10981;10939;10981;:::i;:::-;11033:7;;-1:-1:-1;11093:3:1;11078:19;;11065:33;;11110:16;;;11107:36;;;11139:1;11136;11129:12;11107:36;;11162:51;11205:7;11194:8;11183:9;11179:24;11162:51;:::i;:::-;11152:61;;;10111:1108;;;;;;;;;;:::o;11224:525::-;11308:6;11316;11324;11377:2;11365:9;11356:7;11352:23;11348:32;11345:52;;;11393:1;11390;11383:12;11345:52;11416:28;11434:9;11416:28;:::i;:::-;11406:38;;11495:2;11484:9;11480:18;11467:32;11522:18;11514:6;11511:30;11508:50;;;11554:1;11551;11544:12;11508:50;11577:49;11618:7;11609:6;11598:9;11594:22;11577:49;:::i;:::-;11567:59;;;11676:2;11665:9;11661:18;11648:32;11689:30;11713:5;11689:30;:::i;:::-;11738:5;11728:15;;;11224:525;;;;;:::o;11936:1215::-;12054:6;12062;12115:2;12103:9;12094:7;12090:23;12086:32;12083:52;;;12131:1;12128;12121:12;12083:52;12171:9;12158:23;12200:18;12241:2;12233:6;12230:14;12227:34;;;12257:1;12254;12247:12;12227:34;12295:6;12284:9;12280:22;12270:32;;12340:7;12333:4;12329:2;12325:13;12321:27;12311:55;;12362:1;12359;12352:12;12311:55;12398:2;12385:16;12420:4;12444:60;12460:43;12500:2;12460:43;:::i;12444:60::-;12538:15;;;12620:1;12616:10;;;;12608:19;;12604:28;;;12569:12;;;;12644:19;;;12641:39;;;12676:1;12673;12666:12;12641:39;12700:11;;;;12720:217;12736:6;12731:3;12728:15;12720:217;;;12816:3;12803:17;12833:31;12858:5;12833:31;:::i;:::-;12877:18;;12753:12;;;;12915;;;;12720:217;;;12956:5;-1:-1:-1;;12999:18:1;;12986:32;;-1:-1:-1;;13030:16:1;;;13027:36;;;13059:1;13056;13049:12;13027:36;;13082:63;13137:7;13126:8;13115:9;13111:24;13082:63;:::i;:::-;13072:73;;;11936:1215;;;;;:::o;13156:450::-;13225:6;13278:2;13266:9;13257:7;13253:23;13249:32;13246:52;;;13294:1;13291;13284:12;13246:52;13334:9;13321:23;13367:18;13359:6;13356:30;13353:50;;;13399:1;13396;13389:12;13353:50;13422:22;;13475:4;13467:13;;13463:27;-1:-1:-1;13453:55:1;;13504:1;13501;13494:12;13453:55;13527:73;13592:7;13587:2;13574:16;13569:2;13565;13561:11;13527:73;:::i;13845:261::-;14024:2;14013:9;14006:21;13987:4;14044:56;14096:2;14085:9;14081:18;14073:6;14044:56;:::i;14111:315::-;14176:6;14184;14237:2;14225:9;14216:7;14212:23;14208:32;14205:52;;;14253:1;14250;14243:12;14205:52;14292:9;14279:23;14311:31;14336:5;14311:31;:::i;:::-;14361:5;-1:-1:-1;14385:35:1;14416:2;14401:18;;14385:35;:::i;:::-;14375:45;;14111:315;;;;;:::o;14689:665::-;14784:6;14792;14800;14808;14861:3;14849:9;14840:7;14836:23;14832:33;14829:53;;;14878:1;14875;14868:12;14829:53;14917:9;14904:23;14936:31;14961:5;14936:31;:::i;:::-;14986:5;-1:-1:-1;15043:2:1;15028:18;;15015:32;15056:33;15015:32;15056:33;:::i;:::-;15108:7;-1:-1:-1;15162:2:1;15147:18;;15134:32;;-1:-1:-1;15217:2:1;15202:18;;15189:32;15244:18;15233:30;;15230:50;;;15276:1;15273;15266:12;15230:50;15299:49;15340:7;15331:6;15320:9;15316:22;15299:49;:::i;15359:622::-;15454:6;15462;15470;15478;15486;15539:3;15527:9;15518:7;15514:23;15510:33;15507:53;;;15556:1;15553;15546:12;15507:53;15579:28;15597:9;15579:28;:::i;:::-;15569:38;;15626:37;15659:2;15648:9;15644:18;15626:37;:::i;:::-;15616:47;;15710:2;15699:9;15695:18;15682:32;15672:42;;15765:2;15754:9;15750:18;15737:32;15792:18;15784:6;15781:30;15778:50;;;15824:1;15821;15814:12;15778:50;15863:58;15913:7;15904:6;15893:9;15889:22;15863:58;:::i;:::-;15359:622;;;;-1:-1:-1;15359:622:1;;-1:-1:-1;15940:8:1;;15837:84;15359:622;-1:-1:-1;;;15359:622:1:o;15986:388::-;16054:6;16062;16115:2;16103:9;16094:7;16090:23;16086:32;16083:52;;;16131:1;16128;16121:12;16083:52;16170:9;16157:23;16189:31;16214:5;16189:31;:::i;:::-;16239:5;-1:-1:-1;16296:2:1;16281:18;;16268:32;16309:33;16268:32;16309:33;:::i;:::-;16361:7;16351:17;;;15986:388;;;;;:::o;16379:460::-;16463:6;16471;16479;16487;16540:3;16528:9;16519:7;16515:23;16511:33;16508:53;;;16557:1;16554;16547:12;16508:53;16580:28;16598:9;16580:28;:::i;:::-;16570:38;;16627:37;16660:2;16649:9;16645:18;16627:37;:::i;:::-;16617:47;;16714:2;16703:9;16699:18;16686:32;16727:31;16752:5;16727:31;:::i;:::-;16379:460;;;;-1:-1:-1;16777:5:1;;16829:2;16814:18;16801:32;;-1:-1:-1;;16379:460:1:o;17203:380::-;17282:1;17278:12;;;;17325;;;17346:61;;17400:4;17392:6;17388:17;17378:27;;17346:61;17453:2;17445:6;17442:14;17422:18;17419:38;17416:161;;17499:10;17494:3;17490:20;17487:1;17480:31;17534:4;17531:1;17524:15;17562:4;17559:1;17552:15;17416:161;;17203:380;;;:::o;20144:127::-;20205:10;20200:3;20196:20;20193:1;20186:31;20236:4;20233:1;20226:15;20260:4;20257:1;20250:15;20976:127;21037:10;21032:3;21028:20;21025:1;21018:31;21068:4;21065:1;21058:15;21092:4;21089:1;21082:15;21108:135;21147:3;21168:17;;;21165:43;;21188:18;;:::i;:::-;-1:-1:-1;21235:1:1;21224:13;;21108:135::o;22231:300::-;22406:2;22395:9;22388:21;22369:4;22426:56;22478:2;22467:9;22463:18;22455:6;22426:56;:::i;:::-;22418:64;;22518:6;22513:2;22502:9;22498:18;22491:34;22231:300;;;;;:::o;22536:687::-;22817:6;22809;22805:19;22794:9;22787:38;-1:-1:-1;;;;;22865:6:1;22861:55;22856:2;22845:9;22841:18;22834:83;22953:3;22948:2;22937:9;22933:18;22926:31;22768:4;22980:57;23032:3;23021:9;23017:19;23009:6;22980:57;:::i;:::-;23087:6;23080:14;23073:22;23068:2;23057:9;23053:18;23046:50;23145:9;23137:6;23133:22;23127:3;23116:9;23112:19;23105:51;23173:44;23210:6;23202;23173:44;:::i;:::-;23165:52;22536:687;-1:-1:-1;;;;;;;;22536:687:1:o;23228:245::-;23307:6;23315;23368:2;23356:9;23347:7;23343:23;23339:32;23336:52;;;23384:1;23381;23374:12;23336:52;-1:-1:-1;;23407:16:1;;23463:2;23448:18;;;23442:25;23407:16;;23442:25;;-1:-1:-1;23228:245:1:o;23478:168::-;23518:7;23584:1;23580;23576:6;23572:14;23569:1;23566:21;23561:1;23554:9;23547:17;23543:45;23540:71;;;23591:18;;:::i;:::-;-1:-1:-1;23631:9:1;;23478:168::o;23651:127::-;23712:10;23707:3;23703:20;23700:1;23693:31;23743:4;23740:1;23733:15;23767:4;23764:1;23757:15;23783:120;23823:1;23849;23839:35;;23854:18;;:::i;:::-;-1:-1:-1;23888:9:1;;23783:120::o;24320:271::-;24503:6;24495;24490:3;24477:33;24459:3;24529:16;;24554:13;;;24529:16;24320:271;-1:-1:-1;24320:271:1:o;24596:125::-;24636:4;24664:1;24661;24658:8;24655:34;;;24669:18;;:::i;:::-;-1:-1:-1;24706:9:1;;24596:125::o;24726:128::-;24766:3;24797:1;24793:6;24790:1;24787:13;24784:39;;;24803:18;;:::i;:::-;-1:-1:-1;24839:9:1;;24726:128::o;25276:266::-;25364:6;25359:3;25352:19;25416:6;25409:5;25402:4;25397:3;25393:14;25380:43;-1:-1:-1;25468:1:1;25443:16;;;25461:4;25439:27;;;25432:38;;;;25524:2;25503:15;;;-1:-1:-1;;25499:29:1;25490:39;;;25486:50;;25276:266::o;25547:326::-;25742:6;25734;25730:19;25719:9;25712:38;25786:2;25781;25770:9;25766:18;25759:30;25693:4;25806:61;25863:2;25852:9;25848:18;25840:6;25832;25806:61;:::i;28975:184::-;29045:6;29098:2;29086:9;29077:7;29073:23;29069:32;29066:52;;;29114:1;29111;29104:12;29066:52;-1:-1:-1;29137:16:1;;28975:184;-1:-1:-1;28975:184:1:o;29697:185::-;29739:3;29777:5;29771:12;29792:52;29837:6;29832:3;29825:4;29818:5;29814:16;29792:52;:::i;:::-;29860:16;;;;;29697:185;-1:-1:-1;;29697:185:1:o;30005:1301::-;30282:3;30311:1;30344:6;30338:13;30374:3;30396:1;30424:9;30420:2;30416:18;30406:28;;30484:2;30473:9;30469:18;30506;30496:61;;30550:4;30542:6;30538:17;30528:27;;30496:61;30576:2;30624;30616:6;30613:14;30593:18;30590:38;30587:165;;-1:-1:-1;;;30651:33:1;;30707:4;30704:1;30697:15;30737:4;30658:3;30725:17;30587:165;30768:18;30795:104;;;;30913:1;30908:320;;;;30761:467;;30795:104;-1:-1:-1;;30828:24:1;;30816:37;;30873:16;;;;-1:-1:-1;30795:104:1;;30908:320;29644:1;29637:14;;;29681:4;29668:18;;31003:1;31017:165;31031:6;31028:1;31025:13;31017:165;;;31109:14;;31096:11;;;31089:35;31152:16;;;;31046:10;;31017:165;;;31021:3;;31211:6;31206:3;31202:16;31195:23;;30761:467;;;;;;;31244:56;31269:30;31295:3;31287:6;31269:30;:::i;:::-;-1:-1:-1;;;29947:20:1;;29992:1;29983:11;;29887:113;31244:56;31237:63;30005:1301;-1:-1:-1;;;;;30005:1301:1:o;31311:498::-;31511:4;31540:6;31585:2;31577:6;31573:15;31562:9;31555:34;31637:2;31629:6;31625:15;31620:2;31609:9;31605:18;31598:43;;31677:6;31672:2;31661:9;31657:18;31650:34;31720:3;31715:2;31704:9;31700:18;31693:31;31741:62;31798:3;31787:9;31783:19;31775:6;31767;31741:62;:::i;:::-;31733:70;31311:498;-1:-1:-1;;;;;;;31311:498:1:o;31814:274::-;31943:3;31981:6;31975:13;31997:53;32043:6;32038:3;32031:4;32023:6;32019:17;31997:53;:::i;:::-;32066:16;;;;;31814:274;-1:-1:-1;;31814:274:1:o;34135:428::-;34188:5;34241:3;34234:4;34226:6;34222:17;34218:27;34208:55;;34259:1;34256;34249:12;34208:55;34288:6;34282:13;34319:48;34335:31;34363:2;34335:31;:::i;34319:48::-;34392:2;34383:7;34376:19;34438:3;34431:4;34426:2;34418:6;34414:15;34410:26;34407:35;34404:55;;;34455:1;34452;34445:12;34404:55;34468:64;34529:2;34522:4;34513:7;34509:18;34502:4;34494:6;34490:17;34468:64;:::i;34568:335::-;34647:6;34700:2;34688:9;34679:7;34675:23;34671:32;34668:52;;;34716:1;34713;34706:12;34668:52;34749:9;34743:16;34782:18;34774:6;34771:30;34768:50;;;34814:1;34811;34804:12;34768:50;34837:60;34889:7;34880:6;34869:9;34865:22;34837:60;:::i;34908:112::-;34940:1;34966;34956:35;;34971:18;;:::i;:::-;-1:-1:-1;35005:9:1;;34908:112::o;35025:579::-;35282:6;35274;35270:19;35259:9;35252:38;35326:3;35321:2;35310:9;35306:18;35299:31;35233:4;35353:57;35405:3;35394:9;35390:19;35382:6;35353:57;:::i;:::-;35458:18;35450:6;35446:31;35441:2;35430:9;35426:18;35419:59;35526:9;35518:6;35514:22;35509:2;35498:9;35494:18;35487:50;35554:44;35591:6;35583;35554:44;:::i;37398:249::-;37467:6;37520:2;37508:9;37499:7;37495:23;37491:32;37488:52;;;37536:1;37533;37526:12;37488:52;37568:9;37562:16;37587:30;37611:5;37587:30;:::i;37928:396::-;38016:6;38024;38077:2;38065:9;38056:7;38052:23;38048:32;38045:52;;;38093:1;38090;38083:12;38045:52;38126:9;38120:16;38159:18;38151:6;38148:30;38145:50;;;38191:1;38188;38181:12;38145:50;38214:60;38266:7;38257:6;38246:9;38242:22;38214:60;:::i;:::-;38204:70;;;38314:2;38303:9;38299:18;38293:25;38283:35;;37928:396;;;;;:::o;39450:901::-;39829:3;39861:26;39857:31;39930:2;39921:6;39917:2;39913:15;39909:24;39904:3;39897:37;39985:2;39976:6;39972:2;39968:15;39964:24;39959:2;39954:3;39950:12;39943:46;40040:2;40031:6;40027:2;40023:15;40019:24;40014:2;40009:3;40005:12;39998:46;;40074:6;40069:2;40064:3;40060:12;40053:28;40111:6;40106:2;40101:3;40097:12;40090:28;40149:6;40143:3;40138;40134:13;40127:29;40201:6;40193;40187:3;40182;40178:13;40165:43;-1:-1:-1;40267:3:1;40227:16;;40259:12;;;40252:28;;;;40304:3;40296:12;;40289:28;40341:3;40333:12;;39450:901;-1:-1:-1;;;;;;;39450:901:1:o;40356:136::-;40395:3;40423:5;40413:39;;40432:18;;:::i;:::-;-1:-1:-1;;;40468:18:1;;40356:136::o;42797:896::-;43146:6;43138;43134:19;43123:9;43116:38;43190:3;43185:2;43174:9;43170:18;43163:31;43097:4;43217:57;43269:3;43258:9;43254:19;43246:6;43217:57;:::i;:::-;43322:9;43314:6;43310:22;43305:2;43294:9;43290:18;43283:50;43356:44;43393:6;43385;43356:44;:::i;:::-;-1:-1:-1;;;;;43497:15:1;;;43492:2;43477:18;;43470:43;43550:15;;43544:3;43529:19;;43522:44;43603:22;;;43597:3;43582:19;;43575:51;43342:58;-1:-1:-1;43643:44:1;43342:58;43672:6;43643:44;:::i;:::-;43635:52;42797:896;-1:-1:-1;;;;;;;;;42797:896:1:o;43698:523::-;43892:4;-1:-1:-1;;;;;44002:2:1;43994:6;43990:15;43979:9;43972:34;44054:2;44046:6;44042:15;44037:2;44026:9;44022:18;44015:43;;44094:6;44089:2;44078:9;44074:18;44067:34;44137:3;44132:2;44121:9;44117:18;44110:31;44158:57;44210:3;44199:9;44195:19;44187:6;44158:57;:::i;:::-;44150:65;43698:523;-1:-1:-1;;;;;;43698:523:1:o;44226:249::-;44295:6;44348:2;44336:9;44327:7;44323:23;44319:32;44316:52;;;44364:1;44361;44354:12;44316:52;44396:9;44390:16;44415:30;44439:5;44415:30;:::i;45610:127::-;45671:10;45666:3;45662:20;45659:1;45652:31;45702:4;45699:1;45692:15;45726:4;45723:1;45716:15
Swarm Source
ipfs://ffb60f9591de66fa2c935e4c2d09d3e84b69ce2639374f5b6dd22918d95a1eff
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.