ERC-721
Overview
Max Total Supply
3,939 SERVANT
Holders
1,459
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
16 SERVANTLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FactionsManager
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-02-12 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.11; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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); } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _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 || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(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 {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @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(); } } /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @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 private _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 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()); } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } abstract contract OwnerRecovery is Ownable { function recoverLostAVAX() external onlyOwner { payable(owner()).transfer(address(this).balance); } function recoverLostTokens( address _token, address _to, uint256 _amount ) external onlyOwner { IERC20(_token).transfer(_to, _amount); } } interface ISpookyVerse is IERC20 { function owner() external view returns (address); function accountBurn(address account, uint256 amount) external; function accountReward(address account, uint256 amount) external; function liquidityReward(uint256 amount) external; } abstract contract SpookyVerseImplementationPointer is Ownable { ISpookyVerse internal spookyVerse; event UpdateSpookyVerse( address indexed oldImplementation, address indexed newImplementation ); modifier onlySpookyVerse() { require( address(spookyVerse) != address(0), "Implementations: SpookyVerse is not set" ); address sender = _msgSender(); require( sender == address(spookyVerse), "Implementations: Not SpookyVerse" ); _; } function getSpookyVerseImplementation() public view returns (address) { return address(spookyVerse); } function changeSpookyVerseImplementation(address newImplementation) public virtual onlyOwner { address oldImplementation = address(spookyVerse); require( Address.isContract(newImplementation) || newImplementation == address(0), "SpookyVerse: You can only set 0x0 or a contract address as a new implementation" ); spookyVerse = ISpookyVerse(newImplementation); emit UpdateSpookyVerse(oldImplementation, newImplementation); } uint256[49] private __gap; } interface ILiquidityPoolManager { function owner() external view returns (address); function getRouter() external view returns (address); function getPair() external view returns (address); function getLeftSide() external view returns (address); function getRightSide() external view returns (address); function isPair(address _pair) external view returns (bool); function isRouter(address _router) external view returns (bool); function isFeeReceiver(address _receiver) external view returns (bool); function isLiquidityIntact() external view returns (bool); function isLiquidityAdded() external view returns (bool); function afterTokenTransfer(address sender) external returns (bool); } abstract contract LiquidityPoolManagerImplementationPointer is Ownable { ILiquidityPoolManager internal liquidityPoolManager; event UpdateLiquidityPoolManager( address indexed oldImplementation, address indexed newImplementation ); modifier onlyLiquidityPoolManager() { require( address(liquidityPoolManager) != address(0), "Implementations: LiquidityPoolManager is not set" ); address sender = _msgSender(); require( sender == address(liquidityPoolManager), "Implementations: Not LiquidityPoolManager" ); _; } function getLiquidityPoolManagerImplementation() public view returns (address) { return address(liquidityPoolManager); } function changeLiquidityPoolManagerImplementation(address newImplementation) public virtual onlyOwner { address oldImplementation = address(liquidityPoolManager); require( Address.isContract(newImplementation) || newImplementation == address(0), "LiquidityPoolManager: You can only set 0x0 or a contract address as a new implementation" ); liquidityPoolManager = ILiquidityPoolManager(newImplementation); emit UpdateLiquidityPoolManager(oldImplementation, newImplementation); } uint256[49] private __gap; } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /* * .,. * (%#######@. * /############# * ##/############(/ * .@@& *## ######### /#(. @@@ * %#####( /##. ##### /##* #####(@ * %,(###### *(### ,##(/(## ,###(* (######, % * , #########( **##### ,####(*, ########## / * /*###(#########/*****,/### ####( ###*,*****(#######(#/###*( * #####*#(.#########(****.################( ,**##########/#(/##### * ##((**,# *#######(####/, ,##############(// /####(######( *# **((## * ** #* .(######.(#####*###############(#(####((#######(*,((.*. * ##**(#####(# *######################(######*,#(####(***## * #((#######(*( *(########(#########/########/ .#,(#######(## * ,((//*,#, .(######((/#########*((######(* .#****(. * **.#((*(#######** #########,**########*##(*** * .############(,,#########**(###########( * ############(.#######,(############ * #############(#####(############( * ,(###########(. * **(#####/** * **###**, * * * * Web : https://spookyverse.money */ contract FactionsManager is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, OwnerRecovery, ReentrancyGuard, SpookyVerseImplementationPointer, LiquidityPoolManagerImplementationPointer { using Counters for Counters.Counter; struct ServantInfoEntity { ServantEntity servant; uint256 id; uint256 pendingRewards; uint256 rewardPerDay; uint256 compoundDelay; } struct ServantEntity { uint256 id; string name; uint256 creationTime; uint256 lastProcessingTimestamp; uint256 rewardMult; uint256 servantValue; uint256 totalClaimed; bool exists; } struct TierStorage { uint256 rewardMult; uint256 amountLockedInTier; bool exists; } Counters.Counter private _servantCounter; mapping(uint256 => ServantEntity) private _servants; mapping(uint256 => TierStorage) private _tierTracking; uint256[] _tiersTracked; uint256 public rewardPerDay; uint256 public creationMinPrice; uint256 public compoundDelay; // 0 : mint fees, 1 : claim fees, 2 : compound fees, 3 : rename fees uint8[4] public processingFee; uint24[6] public tierLevel; uint16[6] public tierSlope; uint256 private constant ONE_DAY = 86400; uint256 public totalValueLocked; uint256 public burnedFromRenaming; constructor () ERC721("SpookyVerse Ecosystem", "SERVANT") { // Initialize contract changeRewardPerDay(34722); // 3% per day changeNodeMinPrice(42_000 * (10**18)); // 42,000 FEAR changeCompoundDelay(14400); // 4h changeProcessingFee([30, 34, 28, 5]); changeTierSystem( [100000, 105000, 110000, 120000, 130000, 140000], [1000, 500, 100, 50, 10, 0] ); } modifier onlyServantOwner() { address sender = _msgSender(); require( sender != address(0), "Factions: Cannot be from the zero address" ); require( isOwnerOfServants(sender), "Factions: No Servant owned by this account" ); require( !liquidityPoolManager.isFeeReceiver(sender), "Factions: Fee receivers cannot own Servant" ); _; } modifier checkPermissions(uint256 _servantId) { address sender = _msgSender(); require(servantExists(_servantId), "Factions: This servant doesn't exist"); require( isOwnerOfServant(sender, _servantId), "Factions: You do not control this Servant" ); _; } modifier spookyVerseSet() { require( address(spookyVerse) != address(0), "Factions: SpookyVerse is not set" ); _; } event Compound( address indexed account, uint256 indexed servantId, uint256 amountToCompound ); event Cashout( address indexed account, uint256 indexed servantId, uint256 rewardAmount ); event CompoundAll( address indexed account, uint256[] indexed affectedServants, uint256 amountToCompound ); event CashoutAll( address indexed account, uint256[] indexed affectedServants, uint256 rewardAmount ); event Create( address indexed account, uint256 indexed newServantId, uint256 amount ); event Rename( address indexed account, string indexed previousName, string indexed newName ); function tokenURI(uint256 tokenId) public view virtual override(ERC721URIStorage, ERC721) returns (string memory) { // return Strings.strConcat( // _baseTokenURI(), // Strings.uint2str(tokenId) // ); // ToDo: fix this // To fix: https://andyhartnett.medium.com/solidity-tutorial-how-to-store-nft-metadata-and-svgs-on-the-blockchain-6df44314406b // Base64 support for names coming: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2884/files //string memory tokenURI = "test"; //_setTokenURI(newServantId, tokenURI); return ERC721URIStorage.tokenURI(tokenId); } function createServantWithTokens( string memory servantName, uint256 servantValue ) external nonReentrant whenNotPaused spookyVerseSet returns (uint256) { address sender = _msgSender(); require( bytes(servantName).length > 4 && bytes(servantName).length < 32, "Factions: Incorrect name length. Must be between 4 to 32" ); require( servantValue >= creationMinPrice, "Factions: Servant value set below minimum" ); require( isNameAvailable(sender, servantName), "Factions: Name not available" ); require( spookyVerse.balanceOf(sender) >= creationMinPrice, "Factions: Balance too low for creation" ); // Burn the tokens used to mint the NFT spookyVerse.accountBurn(sender, servantValue); // Send processing fee to liquidity (, uint256 feeAmount) = getProcessingFee( servantValue, processingFee[0] ); spookyVerse.liquidityReward(feeAmount); // Increment the total number of tokens _servantCounter.increment(); uint256 newServantId = _servantCounter.current(); uint256 currentTime = block.timestamp; // Add this to the TVL totalValueLocked += servantValue; logTier(tierLevel[0], int256(servantValue)); // Add Servant _servants[newServantId] = ServantEntity({ id: newServantId, name: servantName, creationTime: currentTime, lastProcessingTimestamp: currentTime, rewardMult: tierLevel[0], servantValue: servantValue, totalClaimed: 0, exists: true }); // Assign the Servant to this account _mint(sender, newServantId); emit Create(sender, newServantId, servantValue); return newServantId; } function cashoutReward(uint256 _servantId) external nonReentrant onlyServantOwner checkPermissions(_servantId) whenNotPaused spookyVerseSet { address account = _msgSender(); uint256 reward = _getServantCashoutRewards(_servantId); _cashoutReward(reward); emit Cashout(account, _servantId, reward); } function renameServant(uint256 _servantId, string memory servantName) external nonReentrant onlyServantOwner checkPermissions(_servantId) whenNotPaused spookyVerseSet { address account = _msgSender(); require( bytes(servantName).length > 1 && bytes(servantName).length < 32, "Servants: Incorrect name length, must be between 2 to 31" ); ServantEntity storage servant = _servants[_servantId]; require(servant.servantValue > 0, "Error: Servant is empty"); (uint256 newServantValue, uint256 feeAmount) = getProcessingFee( servant.servantValue, processingFee[3] ); logTier(servant.rewardMult, -int256(feeAmount)); burnedFromRenaming += feeAmount; servant.servantValue = newServantValue; string memory previousName = servant.name; servant.name = servantName; emit Rename(account, previousName, servantName); } function cashoutAll() external nonReentrant onlyServantOwner whenNotPaused spookyVerseSet { address account = _msgSender(); uint256 rewardsTotal = 0; uint256[] memory servantsOwned = getServantIdsOf(account); for (uint256 i = 0; i < servantsOwned.length; i++) { rewardsTotal += _getServantCashoutRewards(servantsOwned[i]); } _cashoutReward(rewardsTotal); emit CashoutAll(account, servantsOwned, rewardsTotal); } function compoundReward(uint256 _servantId) external nonReentrant onlyServantOwner checkPermissions(_servantId) whenNotPaused spookyVerseSet { address account = _msgSender(); ( uint256 amountToCompound, uint256 feeAmount ) = _getServantCompoundRewards(_servantId); require( amountToCompound > 0, "Factions: You must wait until you can compound again" ); if (feeAmount > 0) { spookyVerse.liquidityReward(feeAmount); } emit Compound(account, _servantId, amountToCompound); } function compoundAll() external nonReentrant onlyServantOwner whenNotPaused spookyVerseSet { address account = _msgSender(); uint256 feesAmount = 0; uint256 amountsToCompound = 0; uint256[] memory servantsOwned = getServantIdsOf(account); uint256[] memory servantsAffected = new uint256[](servantsOwned.length); for (uint256 i = 0; i < servantsOwned.length; i++) { ( uint256 amountToCompound, uint256 feeAmount ) = _getServantCompoundRewards(servantsOwned[i]); if (amountToCompound > 0) { servantsAffected[i] = servantsOwned[i]; feesAmount += feeAmount; amountsToCompound += amountToCompound; } else { delete servantsAffected[i]; } } require(amountsToCompound > 0, "Factions: No rewards to compound"); if (feesAmount > 0) { spookyVerse.liquidityReward(feesAmount); } emit CompoundAll(account, servantsAffected, amountsToCompound); } // Private reward functions function _getServantCashoutRewards(uint256 _servantId) private returns (uint256) { ServantEntity storage servant = _servants[_servantId]; if (!isProcessable(servant)) { return 0; } uint256 reward = calculateReward(servant); servant.totalClaimed += reward; if (servant.rewardMult != tierLevel[0]) { logTier(servant.rewardMult, -int256(servant.servantValue)); logTier(tierLevel[0], int256(servant.servantValue)); } servant.rewardMult = tierLevel[0]; servant.lastProcessingTimestamp = block.timestamp; return reward; } function _getServantCompoundRewards(uint256 _servantId) private returns (uint256, uint256) { ServantEntity storage servant = _servants[_servantId]; if (!isProcessable(servant)) { return (0, 0); } uint256 reward = calculateReward(servant); if (reward > 0) { (uint256 amountToCompound, uint256 feeAmount) = getProcessingFee( reward, processingFee[2] ); totalValueLocked += amountToCompound; logTier(servant.rewardMult, -int256(servant.servantValue)); servant.lastProcessingTimestamp = block.timestamp; servant.servantValue += amountToCompound; servant.rewardMult += increaseMultiplier(servant.rewardMult); logTier(servant.rewardMult, int256(servant.servantValue)); return (amountToCompound, feeAmount); } return (0, 0); } function _cashoutReward(uint256 amount) private { require( amount > 0, "Factions: You don't have enough reward to cash out" ); address to = _msgSender(); (uint256 amountToReward, uint256 feeAmount) = getProcessingFee( amount, processingFee[1] ); spookyVerse.accountReward(to, amountToReward); // Send the fee to the contract where liquidity will be added later on spookyVerse.liquidityReward(feeAmount); } function logTier(uint256 mult, int256 amount) private { TierStorage storage tierStorage = _tierTracking[mult]; if (tierStorage.exists) { require( tierStorage.rewardMult == mult, "Factions: rewardMult does not match in TierStorage" ); uint256 amountLockedInTier = uint256( int256(tierStorage.amountLockedInTier) + amount ); require( amountLockedInTier >= 0, "Factions: amountLockedInTier cannot underflow" ); tierStorage.amountLockedInTier = amountLockedInTier; } else { // Tier isn't registered exist, register it require( amount > 0, "Factions: Fatal error while creating new TierStorage. Amount cannot be below zero." ); _tierTracking[mult] = TierStorage({ rewardMult: mult, amountLockedInTier: uint256(amount), exists: true }); _tiersTracked.push(mult); } } // Private view functions function getProcessingFee(uint256 rewardAmount, uint256 _feeAmount) private pure returns (uint256, uint256) { uint256 feeAmount = 0; if (_feeAmount > 0) { feeAmount = (rewardAmount * _feeAmount) / 100; } return (rewardAmount - feeAmount, feeAmount); } function increaseMultiplier(uint256 prevMult) private view returns (uint256) { if (prevMult >= tierLevel[5]) { return tierSlope[5]; } else if (prevMult >= tierLevel[4]) { return tierSlope[4]; } else if (prevMult >= tierLevel[3]) { return tierSlope[2]; } else if (prevMult >= tierLevel[2]) { return tierSlope[2]; } else if (prevMult >= tierLevel[1]) { return tierSlope[1]; } else { return tierSlope[0]; } } function isProcessable(ServantEntity memory servant) private view returns (bool) { return block.timestamp >= servant.lastProcessingTimestamp + compoundDelay; } function calculateReward(ServantEntity memory servant) private view returns (uint256) { return _calculateRewardsFromValue( servant.servantValue, servant.rewardMult, block.timestamp - servant.lastProcessingTimestamp, rewardPerDay ); } function rewardPerDayFor(ServantEntity memory servant) private view returns (uint256) { return _calculateRewardsFromValue( servant.servantValue, servant.rewardMult, ONE_DAY, rewardPerDay ); } function _calculateRewardsFromValue( uint256 _servantValue, uint256 _rewardMult, uint256 _timeRewards, uint256 _rewardPerDay ) private pure returns (uint256) { uint256 rewards = (_timeRewards * _rewardPerDay) / 1000000; uint256 rewardsMultiplicated = (rewards * _rewardMult) / 100000; return (rewardsMultiplicated * _servantValue) / 100000; } function servantExists(uint256 _servantId) private view returns (bool) { require(_servantId > 0, "Factions: Id must be higher than zero"); ServantEntity memory servant = _servants[_servantId]; if (servant.exists) { return true; } return false; } // Public view functions function calculateEstimatedRewardPerDay(address _account) external view returns (uint rewardsTotal) { uint256[] memory servantsOwned = getServantIdsOf(_account); for (uint256 i = 0; i < servantsOwned.length; i++) { rewardsTotal += rewardPerDayFor(_servants[servantsOwned[i]]); } } function calculateTotalPendingReward(address _account) external view returns (uint rewardsTotal) { uint256[] memory servantsOwned = getServantIdsOf(_account); for (uint256 i = 0; i < servantsOwned.length; i++) { rewardsTotal += calculateReward(_servants[servantsOwned[i]]); } } function calculateTotalDailyEmission() external view returns (uint256) { uint256 dailyEmission = 0; for (uint256 i = 0; i < _tiersTracked.length; i++) { TierStorage memory tierStorage = _tierTracking[_tiersTracked[i]]; dailyEmission += _calculateRewardsFromValue( tierStorage.amountLockedInTier, tierStorage.rewardMult, ONE_DAY, rewardPerDay ); } return dailyEmission; } function isNameAvailable(address account, string memory servantName) public view returns (bool) { uint256[] memory servantsOwned = getServantIdsOf(account); for (uint256 i = 0; i < servantsOwned.length; i++) { ServantEntity memory servant = _servants[servantsOwned[i]]; if (keccak256(bytes(servant.name)) == keccak256(bytes(servantName))) { return false; } } return true; } function isOwnerOfServants(address account) public view returns (bool) { return balanceOf(account) > 0; } function isOwnerOfServant(address account, uint256 _servantId) public view returns (bool) { uint256[] memory servantIdsOf = getServantIdsOf(account); for (uint256 i = 0; i < servantIdsOf.length; i++) { if (servantIdsOf[i] == _servantId) { return true; } } return false; } function getServantIdsOf(address account) public view returns (uint256[] memory) { uint256 numberOfServants = balanceOf(account); uint256[] memory servantIds = new uint256[](numberOfServants); for (uint256 i = 0; i < numberOfServants; i++) { uint256 servantId = tokenOfOwnerByIndex(account, i); require( servantExists(servantId), "Factions: This servant doesn't exist" ); servantIds[i] = servantId; } return servantIds; } function getServantsByIds(uint256[] memory _servantIds) external view returns (ServantInfoEntity[] memory) { ServantInfoEntity[] memory servantsInfo = new ServantInfoEntity[]( _servantIds.length ); for (uint256 i = 0; i < _servantIds.length; i++) { uint256 servantId = _servantIds[i]; ServantEntity memory servant = _servants[servantId]; servantsInfo[i] = ServantInfoEntity( servant, servantId, calculateReward(servant), rewardPerDayFor(servant), compoundDelay ); } return servantsInfo; } // Owner functions function changeNodeMinPrice(uint256 _creationMinPrice) public onlyOwner { require( _creationMinPrice > 0, "Factions: Minimum price to create a Servant must be above 0" ); creationMinPrice = _creationMinPrice; } function changeCompoundDelay(uint256 _compoundDelay) public onlyOwner { require( _compoundDelay > 0, "Factions: compoundDelay must be greater than 0" ); compoundDelay = _compoundDelay; } function changeRewardPerDay(uint256 _rewardPerDay) public onlyOwner { require( _rewardPerDay > 0, "Factions: rewardPerDay must be greater than 0" ); rewardPerDay = _rewardPerDay; } function changeTierSystem( uint24[6] memory _tierLevel, uint16[6] memory _tierSlope ) public onlyOwner { require( _tierLevel.length == 6, "Factions: newTierLevels length has to be 6" ); require( _tierSlope.length == 6, "Factions: newTierSlopes length has to be 6" ); tierLevel = _tierLevel; tierSlope = _tierSlope; } function changeProcessingFee(uint8[4] memory _fees) public onlyOwner { require(_fees[0] <= 40, "Mint fee can never exceed 30%"); require(_fees[1] <= 45, "Claim fee can never exceed 30%"); require(_fees[2] <= 35, "Compound fee can never exceed 30%"); require(_fees[3] <= 15, "Rename fee can never exceed 15%"); processingFee = _fees; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } // Mandatory overrides function _burn(uint256 tokenId) internal override(ERC721URIStorage, ERC721) { ERC721._burn(tokenId); ERC721URIStorage._burn(tokenId); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override(ERC721, ERC721Enumerable) whenNotPaused { super._beforeTokenTransfer(from, to, amount); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
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":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"servantId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"Cashout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256[]","name":"affectedServants","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"CashoutAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"servantId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToCompound","type":"uint256"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256[]","name":"affectedServants","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"amountToCompound","type":"uint256"}],"name":"CompoundAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"newServantId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Create","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":"address","name":"account","type":"address"},{"indexed":true,"internalType":"string","name":"previousName","type":"string"},{"indexed":true,"internalType":"string","name":"newName","type":"string"}],"name":"Rename","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":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldImplementation","type":"address"},{"indexed":true,"internalType":"address","name":"newImplementation","type":"address"}],"name":"UpdateLiquidityPoolManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldImplementation","type":"address"},{"indexed":true,"internalType":"address","name":"newImplementation","type":"address"}],"name":"UpdateSpookyVerse","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedFromRenaming","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"calculateEstimatedRewardPerDay","outputs":[{"internalType":"uint256","name":"rewardsTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalDailyEmission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"calculateTotalPendingReward","outputs":[{"internalType":"uint256","name":"rewardsTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashoutAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_servantId","type":"uint256"}],"name":"cashoutReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_compoundDelay","type":"uint256"}],"name":"changeCompoundDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"changeLiquidityPoolManagerImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_creationMinPrice","type":"uint256"}],"name":"changeNodeMinPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[4]","name":"_fees","type":"uint8[4]"}],"name":"changeProcessingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerDay","type":"uint256"}],"name":"changeRewardPerDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"changeSpookyVerseImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24[6]","name":"_tierLevel","type":"uint24[6]"},{"internalType":"uint16[6]","name":"_tierSlope","type":"uint16[6]"}],"name":"changeTierSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compoundAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compoundDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_servantId","type":"uint256"}],"name":"compoundReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"servantName","type":"string"},{"internalType":"uint256","name":"servantValue","type":"uint256"}],"name":"createServantWithTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creationMinPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityPoolManagerImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getServantIdsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_servantIds","type":"uint256[]"}],"name":"getServantsByIds","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"lastProcessingTimestamp","type":"uint256"},{"internalType":"uint256","name":"rewardMult","type":"uint256"},{"internalType":"uint256","name":"servantValue","type":"uint256"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"internalType":"struct FactionsManager.ServantEntity","name":"servant","type":"tuple"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"pendingRewards","type":"uint256"},{"internalType":"uint256","name":"rewardPerDay","type":"uint256"},{"internalType":"uint256","name":"compoundDelay","type":"uint256"}],"internalType":"struct FactionsManager.ServantInfoEntity[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSpookyVerseImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"string","name":"servantName","type":"string"}],"name":"isNameAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_servantId","type":"uint256"}],"name":"isOwnerOfServant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwnerOfServants","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"processingFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverLostAVAX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverLostTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_servantId","type":"uint256"},{"internalType":"string","name":"servantName","type":"string"}],"name":"renameServant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tierLevel","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tierSlope","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalValueLocked","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252601581527f53706f6f6b7956657273652045636f73797374656d000000000000000000000060208083019182528351808501909452600784526614d1549590539560ca1b9084015281519192916200007691600091620006c4565b5080516200008c906001906020840190620006c4565b5050600b805460ff1916905550620000a433620001c8565b6001600c55620000b66187a262000222565b620000cb6908e4d316827686400000620002e4565b620000d8613840620003b2565b60408051608081018252601e815260226020820152601c9181019190915260056060820152620001089062000471565b620001c26040518060c00160405280620186a062ffffff16815260200162019a2862ffffff1681526020016201adb062ffffff1681526020016201d4c062ffffff1681526020016201fbd062ffffff168152602001620222e062ffffff168152506040518060c001604052806103e861ffff1681526020016101f461ffff168152602001606461ffff168152602001603261ffff168152602001600a61ffff168152602001600061ffff168152506200064f60201b60201c565b62000951565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b546001600160a01b03610100909104163314620002775760405162461bcd60e51b815260206004820181905260248201526000805160206200603783398151915260448201526064015b60405180910390fd5b60008111620002df5760405162461bcd60e51b815260206004820152602d60248201527f46616374696f6e733a20726577617264506572446179206d757374206265206760448201526c0726561746572207468616e203609c1b60648201526084016200026e565b607555565b600b546001600160a01b03610100909104163314620003355760405162461bcd60e51b815260206004820181905260248201526000805160206200603783398151915260448201526064016200026e565b60008111620003ad5760405162461bcd60e51b815260206004820152603b60248201527f46616374696f6e733a204d696e696d756d20707269636520746f20637265617460448201527f6520612053657276616e74206d7573742062652061626f76652030000000000060648201526084016200026e565b607655565b600b546001600160a01b03610100909104163314620004035760405162461bcd60e51b815260206004820181905260248201526000805160206200603783398151915260448201526064016200026e565b600081116200046c5760405162461bcd60e51b815260206004820152602e60248201527f46616374696f6e733a20636f6d706f756e6444656c6179206d7573742062652060448201526d067726561746572207468616e20360941b60648201526084016200026e565b607755565b600b546001600160a01b03610100909104163314620004c25760405162461bcd60e51b815260206004820181905260248201526000805160206200603783398151915260448201526064016200026e565b8051602860ff90911611156200051b5760405162461bcd60e51b815260206004820152601d60248201527f4d696e74206665652063616e206e65766572206578636565642033302500000060448201526064016200026e565b602d816001602002015160ff161115620005785760405162461bcd60e51b815260206004820152601e60248201527f436c61696d206665652063616e206e657665722065786365656420333025000060448201526064016200026e565b6023816002602002015160ff161115620005df5760405162461bcd60e51b815260206004820152602160248201527f436f6d706f756e64206665652063616e206e65766572206578636565642033306044820152602560f81b60648201526084016200026e565b600f816003602002015160ff1611156200063c5760405162461bcd60e51b815260206004820152601f60248201527f52656e616d65206665652063616e206e6576657220657863656564203135250060448201526064016200026e565b6200064b607882600462000753565b5050565b600b546001600160a01b03610100909104163314620006a05760405162461bcd60e51b815260206004820181905260248201526000805160206200603783398151915260448201526064016200026e565b620006af6079836006620007e8565b50620006bf607a82600662000874565b505050565b828054620006d29062000914565b90600052602060002090601f016020900481019282620006f6576000855562000741565b82601f106200071157805160ff191683800117855562000741565b8280016001018555821562000741579182015b828111156200074157825182559160200191906001019062000724565b506200074f929150620008fd565b5090565b600183019183908215620007415791602002820160005b83821115620007aa57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026200076a565b8015620007d95782816101000a81549060ff0219169055600101602081600001049283019260010302620007aa565b50506200074f929150620008fd565b600183019183908215620007415791602002820160005b838211156200084357835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302620007ff565b8015620007d95782816101000a81549062ffffff021916905560030160208160020104928301926001030262000843565b600183019183908215620007415791602002820160005b83821115620008cd57835183826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026200088b565b8015620007d95782816101000a81549061ffff0219169055600201602081600101049283019260010302620008cd565b5b808211156200074f5760008155600101620008fe565b600181811c908216806200092957607f821691505b602082108114156200094b57634e487b7160e01b600052602260045260246000fd5b50919050565b6156d680620009616000396000f3fe608060405234801561001057600080fd5b50600436106102ed5760003560e01c80638456cb5911610193578063b88d4fde116100e4578063d098371611610092578063d09837161461065a578063da0d75a614610680578063de2dcedf14610693578063dfe59ed4146106a6578063e985e9c5146106af578063ec18154e146106c2578063f2fde38b146106cb57600080fd5b8063b88d4fde146105b8578063c583afac146105cb578063c63150d7146105de578063c7bfc869146105f1578063c87b56dd14610616578063c9247a3314610629578063cce222c51461064957600080fd5b806395d89b411161014157806395d89b411461054a5780639b05ddb314610552578063a22cb4651461055a578063a647c9ff1461056d578063a80df91414610575578063aac26e7a14610588578063af8f42b8146105af57600080fd5b80638456cb59146104e35780638504565b146104eb5780638da5cb5b146104f35780638df72957146104fb57806393399b7e1461050e578063949bf3a51461051757806394a64ab01461053757600080fd5b80634060e2571161024d5780636352211e116101fb5780636352211e1461046b57806365bfe4301461047e57806370a0823114610491578063715018a6146104a457806371a1f4ad146104ac5780638005f735146104bf57806382b9b95b146104d257600080fd5b80634060e257146103f957806342842e0e1461040c5780634f6ccce71461041f5780634fa6df811461043257806354557973146104455780635c975abb1461044d57806361dec3541461045857600080fd5b806323b872dd116102aa57806323b872dd1461037f5780632668a131146103925780632a5d52a8146103a55780632d9ecafb146103b85780632f745c59146103cb5780633bc3639f146103de5780633f4ba83a146103f157600080fd5b806301ffc9a7146102f257806306fdde031461031a578063081812fc1461032f578063095ea7b31461034f57806318160ddd1461036457806321fa7e2914610376575b600080fd5b610305610300366004614a0b565b6106de565b60405190151581526020015b60405180910390f35b6103226106ef565b6040516103119190614a80565b61034261033d366004614a93565b610781565b6040516103119190614aac565b61036261035d366004614ad7565b61080e565b005b6008545b604051908152602001610311565b61036860765481565b61036261038d366004614b01565b61091f565b6103686103a0366004614b3d565b610950565b6103056103b3366004614c3d565b610aad565b6103626103c6366004614b3d565b610c28565b6103686103d9366004614ad7565b610d5d565b6103056103ec366004614b3d565b610df3565b610362610e06565b610362610407366004614a93565b610e3f565b61036261041a366004614b01565b611105565b61036861042d366004614a93565b611120565b610368610440366004614c8a565b6111b3565b6103626116b6565b600b5460ff16610305565b610362610466366004614b01565b6118c3565b610342610479366004614a93565b611969565b61036261048c366004614a93565b6119e0565b61036861049f366004614b3d565b611bd9565b610362611c60565b6103626104ba366004614cce565b611c99565b6103626104cd366004614a93565b612077565b600d546001600160a01b0316610342565b610362612121565b610368612158565b610342612203565b610362610509366004614cfe565b612217565b61036860775481565b61052a610525366004614b3d565b612261565b6040516103119190614dd0565b610362610545366004614e14565b61232d565b6103226124df565b6103626124ee565b610362610568366004614eaf565b612854565b61036261285f565b610305610583366004614ad7565b6128d1565b61059b610596366004614a93565b612934565b60405162ffffff9091168152602001610311565b61036860755481565b6103626105c6366004614ee6565b612963565b6103686105d9366004614b3d565b612995565b6103626105ec366004614a93565b612aeb565b6106046105ff366004614a93565b612b85565b60405160ff9091168152602001610311565b610322610624366004614a93565b612baf565b61063c610637366004614f61565b612bba565b6040516103119190615006565b603f546001600160a01b0316610342565b61066d610668366004614a93565b612dbb565b60405161ffff9091168152602001610311565b61036261068e366004614a93565b612de9565b6103626106a1366004614b3d565b612e84565b610368607c5481565b6103056106bd3660046150ef565b612fb0565b610368607b5481565b6103626106d9366004614b3d565b612fde565b60006106e98261307b565b92915050565b6060600080546106fe90615122565b80601f016020809104026020016040519081016040528092919081815260200182805461072a90615122565b80156107775780601f1061074c57610100808354040283529160200191610777565b820191906000526020600020905b81548152906001019060200180831161075a57829003601f168201915b5050505050905090565b600061078c826130a0565b6107f25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061081982611969565b9050806001600160a01b0316836001600160a01b031614156108875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107e9565b336001600160a01b03821614806108a357506108a38133612fb0565b6109105760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016107e9565b61091a83836130bd565b505050565b610929338261312b565b6109455760405162461bcd60e51b81526004016107e990615157565b61091a8383836131f5565b60008061095c83612261565b905060005b8151811015610aa657610a8860726000848481518110610983576109836151a8565b6020026020010151815260200190815260200160002060405180610100016040529081600082015481526020016001820180546109bf90615122565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb90615122565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a082015260079091015460ff16151560c0909101526133a0565b610a9290846151d4565b925080610a9e816151ec565b915050610961565b5050919050565b600080610ab984612261565b905060005b8151811015610c1d57600060726000848481518110610adf57610adf6151a8565b602002602001015181526020019081526020016000206040518061010001604052908160008201548152602001600182018054610b1b90615122565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4790615122565b8015610b945780601f10610b6957610100808354040283529160200191610b94565b820191906000526020600020905b815481529060010190602001808311610b7757829003601f168201915b50505091835250506002820154602080830191909152600383015460408301526004830154606083015260058301546080830152600683015460a083015260079092015460ff16151560c0909101528651878201208282015180519201919091209192501415610c0a57600093505050506106e9565b5080610c15816151ec565b915050610abe565b506001949350505050565b33610c31612203565b6001600160a01b031614610c575760405162461bcd60e51b81526004016107e990615207565b603f546001600160a01b0316813b151580610c7957506001600160a01b038216155b610d0c5760405162461bcd60e51b815260206004820152605860248201527f4c6971756964697479506f6f6c4d616e616765723a20596f752063616e206f6e60448201527f6c792073657420307830206f72206120636f6e747261637420616464726573736064820152771030b99030903732bb9034b6b83632b6b2b73a30ba34b7b760411b608482015260a4016107e9565b603f80546001600160a01b0319166001600160a01b0384811691821790925560405190918316907fdcde9a93392ce8f6a02392dc08f42df39d1fb10ce386c7e9c6c1faba80b2a42490600090a35050565b6000610d6883611bd9565b8210610dca5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107e9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600080610dff83611bd9565b1192915050565b33610e0f612203565b6001600160a01b031614610e355760405162461bcd60e51b81526004016107e990615207565b610e3d6133c7565b565b6002600c541415610e625760405162461bcd60e51b81526004016107e99061523c565b6002600c553380610e855760405162461bcd60e51b81526004016107e990615273565b610e8e81610df3565b610eaa5760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90610eda908490600401614aac565b602060405180830381865afa158015610ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1b9190615306565b15610f385760405162461bcd60e51b81526004016107e990615323565b8133610f4382613454565b610f5f5760405162461bcd60e51b81526004016107e99061536d565b610f6981836128d1565b610f855760405162461bcd60e51b81526004016107e9906153b1565b600b5460ff1615610fa85760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b0316610fd05760405162461bcd60e51b81526004016107e990615424565b33600080610fdd876135d1565b915091506000821161104e5760405162461bcd60e51b815260206004820152603460248201527f46616374696f6e733a20596f75206d757374207761697420756e74696c20796f6044820152733a9031b0b71031b7b6b837bab7321030b3b0b4b760611b60648201526084016107e9565b80156110b357600d5460405163d02dd2b360e01b8152600481018390526001600160a01b039091169063d02dd2b390602401600060405180830381600087803b15801561109a57600080fd5b505af11580156110ae573d6000803e3d6000fd5b505050505b86836001600160a01b03167f0e311a2c6dbfb0153ec3a8a5bdca09070b3e5f60768fdc10a20453f38d186873846040516110ef91815260200190565b60405180910390a350506001600c555050505050565b61091a83838360405180602001604052806000815250612963565b600061112b60085490565b821061118e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107e9565b600882815481106111a1576111a16151a8565b90600052602060002001549050919050565b60006002600c5414156111d85760405162461bcd60e51b81526004016107e99061523c565b6002600c55600b5460ff16156112005760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b03166112285760405162461bcd60e51b81526004016107e990615424565b82513390600410801561123c575060208451105b6112a95760405162461bcd60e51b815260206004820152603860248201527f46616374696f6e733a20496e636f7272656374206e616d65206c656e6774682e6044820152771026bab9ba103132903132ba3bb2b2b7101a103a3790199960411b60648201526084016107e9565b60765483101561130d5760405162461bcd60e51b815260206004820152602960248201527f46616374696f6e733a2053657276616e742076616c7565207365742062656c6f60448201526877206d696e696d756d60b81b60648201526084016107e9565b6113178185610aad565b6113635760405162461bcd60e51b815260206004820152601c60248201527f46616374696f6e733a204e616d65206e6f7420617661696c61626c650000000060448201526064016107e9565b607654600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190611396908590600401614aac565b602060405180830381865afa1580156113b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d79190615459565b10156114345760405162461bcd60e51b815260206004820152602660248201527f46616374696f6e733a2042616c616e636520746f6f206c6f7720666f7220637260448201526532b0ba34b7b760d11b60648201526084016107e9565b600d5460405163db0e185b60e01b81526001600160a01b039091169063db0e185b906114669084908790600401615472565b600060405180830381600087803b15801561148057600080fd5b505af1158015611494573d6000803e3d6000fd5b5050505060006114cd8460786000600481106114b2576114b26151a8565b602081049091015460ff601f9092166101000a9004166137da565b600d5460405163d02dd2b360e01b8152600481018390529193506001600160a01b0316915063d02dd2b390602401600060405180830381600087803b15801561151557600080fd5b505af1158015611529573d6000803e3d6000fd5b5050505061153b607180546001019055565b600061154660715490565b9050600042905085607b600082825461155f91906151d4565b90915550506079546115769062ffffff1687613811565b60405180610100016040528083815260200188815260200182815260200182815260200160796000600681106115ae576115ae6151a8565b600a80820492909201549190066003026101000a900462ffffff1681526020808201899052600060408084018290526001606090940184905286825260728352902083518155838201518051919361160c939085019291019061474c565b5060408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0909101516007909101805460ff191691151591909117905561166384836139c1565b81846001600160a01b03167f278b0fd0170e87df8d6e9c94b47d3ff7382de693c547e6089b53f9972c5323898860405161169f91815260200190565b60405180910390a3506001600c5595945050505050565b6002600c5414156116d95760405162461bcd60e51b81526004016107e99061523c565b6002600c5533806116fc5760405162461bcd60e51b81526004016107e990615273565b61170581610df3565b6117215760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90611751908490600401614aac565b602060405180830381865afa15801561176e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117929190615306565b156117af5760405162461bcd60e51b81526004016107e990615323565b600b5460ff16156117d25760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b03166117fa5760405162461bcd60e51b81526004016107e990615424565b3360008061180783612261565b905060005b81518110156118555761183782828151811061182a5761182a6151a8565b6020026020010151613b00565b61184190846151d4565b92508061184d816151ec565b91505061180c565b5061185f82613bf4565b8060405161186d919061548b565b6040518091039020836001600160a01b03167fb19b49535c30c050254f8a50fbb3d50f125497777abe768053959123e48f1baf846040516118b091815260200190565b60405180910390a350506001600c555050565b336118cc612203565b6001600160a01b0316146118f25760405162461bcd60e51b81526004016107e990615207565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906119209085908590600401615472565b6020604051808303816000875af115801561193f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119639190615306565b50505050565b6000818152600260205260408120546001600160a01b0316806106e95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107e9565b6002600c541415611a035760405162461bcd60e51b81526004016107e99061523c565b6002600c553380611a265760405162461bcd60e51b81526004016107e990615273565b611a2f81610df3565b611a4b5760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90611a7b908490600401614aac565b602060405180830381865afa158015611a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abc9190615306565b15611ad95760405162461bcd60e51b81526004016107e990615323565b8133611ae482613454565b611b005760405162461bcd60e51b81526004016107e99061536d565b611b0a81836128d1565b611b265760405162461bcd60e51b81526004016107e9906153b1565b600b5460ff1615611b495760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b0316611b715760405162461bcd60e51b81526004016107e990615424565b336000611b7d86613b00565b9050611b8881613bf4565b85826001600160a01b03167f4f32a1005fcf45a64a68bc4258b4e0f5522b7aa6a06506781aa4e6c6395c48d083604051611bc491815260200190565b60405180910390a350506001600c5550505050565b60006001600160a01b038216611c445760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107e9565b506001600160a01b031660009081526003602052604090205490565b33611c69612203565b6001600160a01b031614611c8f5760405162461bcd60e51b81526004016107e990615207565b610e3d6000613d3c565b6002600c541415611cbc5760405162461bcd60e51b81526004016107e99061523c565b6002600c553380611cdf5760405162461bcd60e51b81526004016107e990615273565b611ce881610df3565b611d045760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90611d34908490600401614aac565b602060405180830381865afa158015611d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d759190615306565b15611d925760405162461bcd60e51b81526004016107e990615323565b8233611d9d82613454565b611db95760405162461bcd60e51b81526004016107e99061536d565b611dc381836128d1565b611ddf5760405162461bcd60e51b81526004016107e9906153b1565b600b5460ff1615611e025760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b0316611e2a5760405162461bcd60e51b81526004016107e990615424565b835133906001108015611e3e575060208551105b611eab5760405162461bcd60e51b815260206004820152603860248201527f53657276616e74733a20496e636f7272656374206e616d65206c656e6774682c604482015277206d757374206265206265747765656e203220746f20333160401b60648201526084016107e9565b60008681526072602052604090206005810154611f045760405162461bcd60e51b81526020600482015260176024820152764572726f723a2053657276616e7420697320656d70747960481b60448201526064016107e9565b600080611f23836005015460786003600481106114b2576114b26151a8565b91509150611f3e836004015482611f39906154c1565b613811565b80607c6000828254611f5091906151d4565b90915550506005830182905560018301805460009190611f6f90615122565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9b90615122565b8015611fe85780601f10611fbd57610100808354040283529160200191611fe8565b820191906000526020600020905b815481529060010190602001808311611fcb57829003601f168201915b50508c519394506120069360018901935060208e019250905061474c565b508860405161201591906154de565b60405180910390208160405161202b91906154de565b604051908190038120906001600160a01b038816907f0d48d45af1b1b964a93dad6fe3f832865a8b610c6364bd1850790e2c74e535ce90600090a450506001600c555050505050505050565b33612080612203565b6001600160a01b0316146120a65760405162461bcd60e51b81526004016107e990615207565b6000811161211c5760405162461bcd60e51b815260206004820152603b60248201527f46616374696f6e733a204d696e696d756d20707269636520746f20637265617460448201527f6520612053657276616e74206d7573742062652061626f76652030000000000060648201526084016107e9565b607655565b3361212a612203565b6001600160a01b0316146121505760405162461bcd60e51b81526004016107e990615207565b610e3d613d96565b600080805b6074548110156121fd5760006073600060748481548110612180576121806151a8565b60009182526020808320909101548352828101939093526040918201902081516060810183528154808252600183015494820185905260029092015460ff161515928101929092526075549193506121dd92916201518090613dee565b6121e790846151d4565b92505080806121f5906151ec565b91505061215d565b50919050565b600b5461010090046001600160a01b031690565b33612220612203565b6001600160a01b0316146122465760405162461bcd60e51b81526004016107e990615207565b61225360798360066147d0565b5061091a607a826006614864565b6060600061226e83611bd9565b90506000816001600160401b0381111561228a5761228a614b58565b6040519080825280602002602001820160405280156122b3578160200160208202803683370190505b50905060005b828110156123255760006122cd8683610d5d565b90506122d881613454565b6122f45760405162461bcd60e51b81526004016107e99061536d565b80838381518110612307576123076151a8565b6020908102919091010152508061231d816151ec565b9150506122b9565b509392505050565b33612336612203565b6001600160a01b03161461235c5760405162461bcd60e51b81526004016107e990615207565b8051602860ff90911611156123b35760405162461bcd60e51b815260206004820152601d60248201527f4d696e74206665652063616e206e65766572206578636565642033302500000060448201526064016107e9565b602d816001602002015160ff16111561240e5760405162461bcd60e51b815260206004820152601e60248201527f436c61696d206665652063616e206e657665722065786365656420333025000060448201526064016107e9565b6023816002602002015160ff1611156124735760405162461bcd60e51b815260206004820152602160248201527f436f6d706f756e64206665652063616e206e65766572206578636565642033306044820152602560f81b60648201526084016107e9565b600f816003602002015160ff1611156124ce5760405162461bcd60e51b815260206004820152601f60248201527f52656e616d65206665652063616e206e6576657220657863656564203135250060448201526064016107e9565b6124db60788260046148e8565b5050565b6060600180546106fe90615122565b6002600c5414156125115760405162461bcd60e51b81526004016107e99061523c565b6002600c5533806125345760405162461bcd60e51b81526004016107e990615273565b61253d81610df3565b6125595760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90612589908490600401614aac565b602060405180830381865afa1580156125a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ca9190615306565b156125e75760405162461bcd60e51b81526004016107e990615323565b600b5460ff161561260a5760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b03166126325760405162461bcd60e51b81526004016107e990615424565b336000808061264084612261565b9050600081516001600160401b0381111561265d5761265d614b58565b604051908082528060200260200182016040528015612686578160200160208202803683370190505b50905060005b825181101561274d576000806126ba8584815181106126ad576126ad6151a8565b60200260200101516135d1565b90925090508115612719578483815181106126d7576126d76151a8565b60200260200101518484815181106126f1576126f16151a8565b602090810291909101015261270681886151d4565b965061271282876151d4565b9550612738565b83838151811061272b5761272b6151a8565b6020026020010160008152505b50508080612745906151ec565b91505061268c565b506000831161279e5760405162461bcd60e51b815260206004820181905260248201527f46616374696f6e733a204e6f207265776172647320746f20636f6d706f756e6460448201526064016107e9565b831561280357600d5460405163d02dd2b360e01b8152600481018690526001600160a01b039091169063d02dd2b390602401600060405180830381600087803b1580156127ea57600080fd5b505af11580156127fe573d6000803e3d6000fd5b505050505b80604051612811919061548b565b6040518091039020856001600160a01b03167ff6fa3b3c4cc7c3050320415a19ca5bae8e2029684a976274a45e4165eedfcd9b85604051611bc491815260200190565b6124db338383613e4a565b33612868612203565b6001600160a01b03161461288e5760405162461bcd60e51b81526004016107e990615207565b612896612203565b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050501580156128ce573d6000803e3d6000fd5b50565b6000806128dd84612261565b905060005b815181101561292957838282815181106128fe576128fe6151a8565b60200260200101511415612917576001925050506106e9565b80612921816151ec565b9150506128e2565b506000949350505050565b6079816006811061294457600080fd5b600a9182820401919006600302915054906101000a900462ffffff1681565b61296d338361312b565b6129895760405162461bcd60e51b81526004016107e990615157565b61196384848484613f15565b6000806129a183612261565b905060005b8151811015610aa657612acd607260008484815181106129c8576129c86151a8565b602002602001015181526020019081526020016000206040518061010001604052908160008201548152602001600182018054612a0490615122565b80601f0160208091040260200160405190810160405280929190818152602001828054612a3090615122565b8015612a7d5780601f10612a5257610100808354040283529160200191612a7d565b820191906000526020600020905b815481529060010190602001808311612a6057829003601f168201915b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a082015260079091015460ff16151560c090910152613f48565b612ad790846151d4565b925080612ae3816151ec565b9150506129a6565b33612af4612203565b6001600160a01b031614612b1a5760405162461bcd60e51b81526004016107e990615207565b60008111612b805760405162461bcd60e51b815260206004820152602d60248201527f46616374696f6e733a20726577617264506572446179206d757374206265206760448201526c0726561746572207468616e203609c1b60648201526084016107e9565b607555565b60788160048110612b9557600080fd5b60209182820401919006915054906101000a900460ff1681565b60606106e982613f63565b6060600082516001600160401b03811115612bd757612bd7614b58565b604051908082528060200260200182016040528015612c1057816020015b612bfd614969565b815260200190600190039081612bf55790505b50905060005b8351811015612db4576000848281518110612c3357612c336151a8565b602002602001015190506000607260008381526020019081526020016000206040518061010001604052908160008201548152602001600182018054612c7890615122565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca490615122565b8015612cf15780601f10612cc657610100808354040283529160200191612cf1565b820191906000526020600020905b815481529060010190602001808311612cd457829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff16151515158152505090506040518060a00160405280828152602001838152602001612d69836133a0565b8152602001612d7783613f48565b8152602001607754815250848481518110612d9457612d946151a8565b602002602001018190525050508080612dac906151ec565b915050612c16565b5092915050565b607a8160068110612dcb57600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b33612df2612203565b6001600160a01b031614612e185760405162461bcd60e51b81526004016107e990615207565b60008111612e7f5760405162461bcd60e51b815260206004820152602e60248201527f46616374696f6e733a20636f6d706f756e6444656c6179206d7573742062652060448201526d067726561746572207468616e20360941b60648201526084016107e9565b607755565b33612e8d612203565b6001600160a01b031614612eb35760405162461bcd60e51b81526004016107e990615207565b600d546001600160a01b0316813b151580612ed557506001600160a01b038216155b612f5f5760405162461bcd60e51b815260206004820152604f60248201527f53706f6f6b7956657273653a20596f752063616e206f6e6c792073657420307860448201527f30206f72206120636f6e747261637420616464726573732061732061206e657760648201526e1034b6b83632b6b2b73a30ba34b7b760891b608482015260a4016107e9565b600d80546001600160a01b0319166001600160a01b0384811691821790925560405190918316907f94524bf89ed2549da4e64e75f26c959d0e6fce2cb54ef8b1b870ac375599377c90600090a35050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b33612fe7612203565b6001600160a01b03161461300d5760405162461bcd60e51b81526004016107e990615207565b6001600160a01b0381166130725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e9565b6128ce81613d3c565b60006001600160e01b0319821663780e9d6360e01b14806106e957506106e9826140d2565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130f282611969565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613136826130a0565b6131975760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107e9565b60006131a283611969565b9050806001600160a01b0316846001600160a01b031614806131dd5750836001600160a01b03166131d284610781565b6001600160a01b0316145b806131ed57506131ed8185612fb0565b949350505050565b826001600160a01b031661320882611969565b6001600160a01b0316146132705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107e9565b6001600160a01b0382166132d25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107e9565b6132dd838383614122565b6132e86000826130bd565b6001600160a01b03831660009081526003602052604081208054600192906133119084906154fa565b90915550506001600160a01b038216600090815260036020526040812080546001929061333f9084906151d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006106e98260a0015183608001518460600151426133bf91906154fa565b607554613dee565b600b5460ff166134105760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107e9565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405161344a9190614aac565b60405180910390a1565b60008082116134b35760405162461bcd60e51b815260206004820152602560248201527f46616374696f6e733a204964206d75737420626520686967686572207468616e604482015264207a65726f60d81b60648201526084016107e9565b60006072600084815260200190815260200160002060405180610100016040529081600082015481526020016001820180546134ee90615122565b80601f016020809104026020016040519081016040528092919081815260200182805461351a90615122565b80156135675780601f1061353c57610100808354040283529160200191613567565b820191906000526020600020905b81548152906001019060200180831161354a57829003601f168201915b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a082015260079091015460ff16151560c09091015260e0810151909150156135c85750600192915050565b50600092915050565b60008060006072600085815260200190815260200160002090506136de81604051806101000160405290816000820154815260200160018201805461361590615122565b80601f016020809104026020016040519081016040528092919081815260200182805461364190615122565b801561368e5780601f106136635761010080835404028352916020019161368e565b820191906000526020600020905b81548152906001019060200180831161367157829003601f168201915b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a082015260079091015460ff16151560c090910152614150565b6136ee5750600093849350915050565b600061371a8260405180610100016040529081600082015481526020016001820180546109bf90615122565b905080156137cd5760008061373283607860026114b2565b9150915081607b600082825461374891906151d4565b9250508190555061376584600401548560050154611f39906154c1565b4284600301819055508184600501600082825461378291906151d4565b909155505060048401546137959061416d565b8460040160008282546137a891906151d4565b925050819055506137c184600401548560050154613811565b90969095509350505050565b5060009485945092505050565b6000808083156137fd5760646137f08587615511565b6137fa9190615546565b90505b61380781866154fa565b9590945092505050565b6000828152607360205260409020600281015460ff16156138b557805483146138975760405162461bcd60e51b815260206004820152603260248201527f46616374696f6e733a207265776172644d756c7420646f6573206e6f74206d6160448201527174636820696e205469657253746f7261676560701b60648201526084016107e9565b60008282600101546138a9919061555a565b90506001820155505050565b600082136139465760405162461bcd60e51b815260206004820152605260248201527f46616374696f6e733a20466174616c206572726f72207768696c65206372656160448201527f74696e67206e6577205469657253746f726167652e20416d6f756e742063616e6064820152713737ba103132903132b637bb903d32b9379760711b608482015260a4016107e9565b506040805160608101825283815260208082019384526001828401818152600087815260739093529382209251835593518285015591516002909101805460ff191691151591909117905560748054928301815590527f19a0b39aa25ac793b5f6e9a0534364cc0b3fd1ea9b651e79c7f50a59d48ef8130155565b6001600160a01b038216613a175760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e9565b613a20816130a0565b15613a6d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e9565b613a7960008383614122565b6001600160a01b0382166000908152600360205260408120805460019290613aa29084906151d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080607260008481526020019081526020016000209050613b4281604051806101000160405290816000820154815260200160018201805461361590615122565b613b4f5750600092915050565b6000613b7b8260405180610100016040529081600082015481526020016001820180546109bf90615122565b905080826006016000828254613b9191906151d4565b9091555050607954600483015462ffffff90911614613bd757613bc082600401548360050154611f39906154c1565b6079546005830154613bd79162ffffff1690613811565b60795462ffffff1660048301554260039092019190915592915050565b60008111613c5f5760405162461bcd60e51b815260206004820152603260248201527f46616374696f6e733a20596f7520646f6e2774206861766520656e6f756768206044820152711c995dd85c99081d1bc818d85cda081bdd5d60721b60648201526084016107e9565b33600080613c7084607860016114b2565b600d54604051639b5f7c6560e01b81529294509092506001600160a01b031690639b5f7c6590613ca69086908690600401615472565b600060405180830381600087803b158015613cc057600080fd5b505af1158015613cd4573d6000803e3d6000fd5b5050600d5460405163d02dd2b360e01b8152600481018590526001600160a01b03909116925063d02dd2b39150602401600060405180830381600087803b158015613d1e57600080fd5b505af1158015613d32573d6000803e3d6000fd5b5050505050505050565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b5460ff1615613db95760405162461bcd60e51b81526004016107e9906153fa565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861343d3390565b600080620f4240613dff8486615511565b613e099190615546565b90506000620186a0613e1b8784615511565b613e259190615546565b9050620186a0613e358883615511565b613e3f9190615546565b979650505050505050565b816001600160a01b0316836001600160a01b03161415613ea85760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016107e9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613f208484846131f5565b613f2c84848484614234565b6119635760405162461bcd60e51b81526004016107e99061559b565b60006106e98260a00151836080015162015180607554613dee565b6060613f6e826130a0565b613fd45760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016107e9565b6000828152600a602052604081208054613fed90615122565b80601f016020809104026020016040519081016040528092919081815260200182805461401990615122565b80156140665780601f1061403b57610100808354040283529160200191614066565b820191906000526020600020905b81548152906001019060200180831161404957829003601f168201915b50505050509050600061408460408051602081019091526000815290565b9050805160001415614097575092915050565b8151156140c95780826040516020016140b19291906155ed565b60405160208183030381529060405292505050919050565b6131ed8461432f565b60006001600160e01b031982166380ac58cd60e01b148061410357506001600160e01b03198216635b5e139f60e01b145b806106e957506301ffc9a760e01b6001600160e01b03198316146106e9565b600b5460ff16156141455760405162461bcd60e51b81526004016107e9906153fa565b61091a838383614407565b6000607754826060015161416491906151d4565b42101592915050565b607954600090600160781b900462ffffff1682106141ab57607a60055b601081049190910154600f9091166002026101000a900461ffff1692915050565b607954600160601b900462ffffff1682106141c957607a600461418a565b607954600160481b900462ffffff1682106141e757607a600261418a565b6079546601000000000000900462ffffff16821061420857607a600261418a565b6079546301000000900462ffffff16821061422657607a600161418a565b607a600061418a565b919050565b60006001600160a01b0384163b1561432757604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061427890339089908890889060040161561c565b6020604051808303816000875af19250505080156142b3575060408051601f3d908101601f191682019092526142b091810190615659565b60015b61430d573d8080156142e1576040519150601f19603f3d011682016040523d82523d6000602084013e6142e6565b606091505b5080516143055760405162461bcd60e51b81526004016107e99061559b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506131ed565b5060016131ed565b606061433a826130a0565b61439e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107e9565b60006143b560408051602081019091526000815290565b905060008151116143d55760405180602001604052806000815250614400565b806143df846144bf565b6040516020016143f09291906155ed565b6040516020818303038152906040525b9392505050565b6001600160a01b0383166144625761445d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614485565b816001600160a01b0316836001600160a01b0316146144855761448583826145bc565b6001600160a01b03821661449c5761091a81614659565b826001600160a01b0316826001600160a01b03161461091a5761091a8282614708565b6060816144e35750506040805180820190915260018152600360fc1b602082015290565b8160005b811561450d57806144f7816151ec565b91506145069050600a83615546565b91506144e7565b6000816001600160401b0381111561452757614527614b58565b6040519080825280601f01601f191660200182016040528015614551576020820181803683370190505b5090505b84156131ed576145666001836154fa565b9150614573600a86615676565b61457e9060306151d4565b60f81b818381518110614593576145936151a8565b60200101906001600160f81b031916908160001a9053506145b5600a86615546565b9450614555565b600060016145c984611bd9565b6145d391906154fa565b600083815260076020526040902054909150808214614626576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061466b906001906154fa565b60008381526009602052604081205460088054939450909284908110614693576146936151a8565b9060005260206000200154905080600883815481106146b4576146b46151a8565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806146ec576146ec61568a565b6001900381819060005260206000200160009055905550505050565b600061471383611bd9565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461475890615122565b90600052602060002090601f01602090048101928261477a57600085556147c0565b82601f1061479357805160ff19168380011785556147c0565b828001600101855582156147c0579182015b828111156147c05782518255916020019190600101906147a5565b506147cc9291506149e0565b5090565b6001830191839082156147c05791602002820160005b8382111561482857835183826101000a81548162ffffff021916908362ffffff16021790555092602001926003016020816002010492830192600103026147e6565b80156148575782816101000a81549062ffffff0219169055600301602081600201049283019260010302614828565b50506147cc9291506149e0565b6001830191839082156147c05791602002820160005b838211156148ba57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030261487a565b80156148575782816101000a81549061ffff02191690556002016020816001010492830192600103026148ba565b6001830191839082156147c05791602002820160005b8382111561493c57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026148fe565b80156148575782816101000a81549060ff021916905560010160208160000104928301926001030261493c565b6040518060a001604052806149be604051806101000160405280600081526020016060815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b8152602001600081526020016000815260200160008152602001600081525090565b5b808211156147cc57600081556001016149e1565b6001600160e01b0319811681146128ce57600080fd5b600060208284031215614a1d57600080fd5b8135614400816149f5565b60005b83811015614a43578181015183820152602001614a2b565b838111156119635750506000910152565b60008151808452614a6c816020860160208601614a28565b601f01601f19169290920160200192915050565b6020815260006144006020830184614a54565b600060208284031215614aa557600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461422f57600080fd5b60008060408385031215614aea57600080fd5b614af383614ac0565b946020939093013593505050565b600080600060608486031215614b1657600080fd5b614b1f84614ac0565b9250614b2d60208501614ac0565b9150604084013590509250925092565b600060208284031215614b4f57600080fd5b61440082614ac0565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b0381118282101715614b9057614b90614b58565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bbe57614bbe614b58565b604052919050565b60006001600160401b03831115614bdf57614bdf614b58565b614bf2601f8401601f1916602001614b96565b9050828152838383011115614c0657600080fd5b828260208301376000602084830101529392505050565b600082601f830112614c2e57600080fd5b61440083833560208501614bc6565b60008060408385031215614c5057600080fd5b614c5983614ac0565b915060208301356001600160401b03811115614c7457600080fd5b614c8085828601614c1d565b9150509250929050565b60008060408385031215614c9d57600080fd5b82356001600160401b03811115614cb357600080fd5b614cbf85828601614c1d565b95602094909401359450505050565b60008060408385031215614ce157600080fd5b8235915060208301356001600160401b03811115614c7457600080fd5b600080610180808486031215614d1357600080fd5b84601f850112614d2257600080fd5b614d2a614b6e565b8060c0860187811115614d3c57600080fd5b865b81811015614d6857803562ffffff81168114614d5a5760008081fd5b845260209384019301614d3e565b508195508760df880112614d7b57600080fd5b614d83614b6e565b93870193925082915087841115614d9957600080fd5b83811015614dc257803561ffff81168114614db45760008081fd5b835260209283019201614d99565b508093505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015614e0857835183529284019291840191600101614dec565b50909695505050505050565b600060808284031215614e2657600080fd5b82601f830112614e3557600080fd5b604051608081018181106001600160401b0382111715614e5757614e57614b58565b604052806080840185811115614e6c57600080fd5b845b81811015614e9657803560ff81168114614e885760008081fd5b835260209283019201614e6e565b509195945050505050565b80151581146128ce57600080fd5b60008060408385031215614ec257600080fd5b614ecb83614ac0565b91506020830135614edb81614ea1565b809150509250929050565b60008060008060808587031215614efc57600080fd5b614f0585614ac0565b9350614f1360208601614ac0565b92506040850135915060608501356001600160401b03811115614f3557600080fd5b8501601f81018713614f4657600080fd5b614f5587823560208401614bc6565b91505092959194509250565b60006020808385031215614f7457600080fd5b82356001600160401b0380821115614f8b57600080fd5b818501915085601f830112614f9f57600080fd5b813581811115614fb157614fb1614b58565b8060051b9150614fc2848301614b96565b8181529183018401918481019088841115614fdc57600080fd5b938501935b83851015614ffa57843582529385019390850190614fe1565b98975050505050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156150e157603f19898403018552815160a081518186528051828701528981015161010060c081818a01526150696101a08a0184614a54565b848d015160e08b810191909152606080870151948c01949094526080808701516101208d0152968601516101408c0152918501516101608b01529301511515610180890152848c01518c890152848b0151888c015284810151908801525091810151940193909352938601939086019060010161502d565b509098975050505050505050565b6000806040838503121561510257600080fd5b61510b83614ac0565b915061511960208401614ac0565b90509250929050565b600181811c9082168061513657607f821691505b602082108114156121fd57634e487b7160e01b600052602260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156151e7576151e76151be565b500190565b6000600019821415615200576152006151be565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526029908201527f46616374696f6e733a2043616e6e6f742062652066726f6d20746865207a65726040820152686f206164647265737360b81b606082015260800190565b6020808252602a908201527f46616374696f6e733a204e6f2053657276616e74206f776e65642062792074686040820152691a5cc81858d8dbdd5b9d60b21b606082015260800190565b60006020828403121561531857600080fd5b815161440081614ea1565b6020808252602a908201527f46616374696f6e733a20466565207265636569766572732063616e6e6f74206f6040820152691ddb8814d95c9d985b9d60b21b606082015260800190565b60208082526024908201527f46616374696f6e733a20546869732073657276616e7420646f65736e277420656040820152631e1a5cdd60e21b606082015260800190565b60208082526029908201527f46616374696f6e733a20596f7520646f206e6f7420636f6e74726f6c207468696040820152681cc814d95c9d985b9d60ba1b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f46616374696f6e733a2053706f6f6b795665727365206973206e6f7420736574604082015260600190565b60006020828403121561546b57600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b815160009082906020808601845b838110156154b557815185529382019390820190600101615499565b50929695505050505050565b6000600160ff1b8214156154d7576154d76151be565b5060000390565b600082516154f0818460208701614a28565b9190910192915050565b60008282101561550c5761550c6151be565b500390565b600081600019048311821515161561552b5761552b6151be565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261555557615555615530565b500490565b600080821280156001600160ff1b038490038513161561557c5761557c6151be565b600160ff1b8390038412811615615595576155956151be565b50500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516155ff818460208801614a28565b835190830190615613818360208801614a28565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061564f90830184614a54565b9695505050505050565b60006020828403121561566b57600080fd5b8151614400816149f5565b60008261568557615685615530565b500690565b634e487b7160e01b600052603160045260246000fdfea264697066735822122017d5039494d73e4850b3780d1a7f3fd668a5e7c960a803fc51da0827b4f24ae964736f6c634300080b00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102ed5760003560e01c80638456cb5911610193578063b88d4fde116100e4578063d098371611610092578063d09837161461065a578063da0d75a614610680578063de2dcedf14610693578063dfe59ed4146106a6578063e985e9c5146106af578063ec18154e146106c2578063f2fde38b146106cb57600080fd5b8063b88d4fde146105b8578063c583afac146105cb578063c63150d7146105de578063c7bfc869146105f1578063c87b56dd14610616578063c9247a3314610629578063cce222c51461064957600080fd5b806395d89b411161014157806395d89b411461054a5780639b05ddb314610552578063a22cb4651461055a578063a647c9ff1461056d578063a80df91414610575578063aac26e7a14610588578063af8f42b8146105af57600080fd5b80638456cb59146104e35780638504565b146104eb5780638da5cb5b146104f35780638df72957146104fb57806393399b7e1461050e578063949bf3a51461051757806394a64ab01461053757600080fd5b80634060e2571161024d5780636352211e116101fb5780636352211e1461046b57806365bfe4301461047e57806370a0823114610491578063715018a6146104a457806371a1f4ad146104ac5780638005f735146104bf57806382b9b95b146104d257600080fd5b80634060e257146103f957806342842e0e1461040c5780634f6ccce71461041f5780634fa6df811461043257806354557973146104455780635c975abb1461044d57806361dec3541461045857600080fd5b806323b872dd116102aa57806323b872dd1461037f5780632668a131146103925780632a5d52a8146103a55780632d9ecafb146103b85780632f745c59146103cb5780633bc3639f146103de5780633f4ba83a146103f157600080fd5b806301ffc9a7146102f257806306fdde031461031a578063081812fc1461032f578063095ea7b31461034f57806318160ddd1461036457806321fa7e2914610376575b600080fd5b610305610300366004614a0b565b6106de565b60405190151581526020015b60405180910390f35b6103226106ef565b6040516103119190614a80565b61034261033d366004614a93565b610781565b6040516103119190614aac565b61036261035d366004614ad7565b61080e565b005b6008545b604051908152602001610311565b61036860765481565b61036261038d366004614b01565b61091f565b6103686103a0366004614b3d565b610950565b6103056103b3366004614c3d565b610aad565b6103626103c6366004614b3d565b610c28565b6103686103d9366004614ad7565b610d5d565b6103056103ec366004614b3d565b610df3565b610362610e06565b610362610407366004614a93565b610e3f565b61036261041a366004614b01565b611105565b61036861042d366004614a93565b611120565b610368610440366004614c8a565b6111b3565b6103626116b6565b600b5460ff16610305565b610362610466366004614b01565b6118c3565b610342610479366004614a93565b611969565b61036261048c366004614a93565b6119e0565b61036861049f366004614b3d565b611bd9565b610362611c60565b6103626104ba366004614cce565b611c99565b6103626104cd366004614a93565b612077565b600d546001600160a01b0316610342565b610362612121565b610368612158565b610342612203565b610362610509366004614cfe565b612217565b61036860775481565b61052a610525366004614b3d565b612261565b6040516103119190614dd0565b610362610545366004614e14565b61232d565b6103226124df565b6103626124ee565b610362610568366004614eaf565b612854565b61036261285f565b610305610583366004614ad7565b6128d1565b61059b610596366004614a93565b612934565b60405162ffffff9091168152602001610311565b61036860755481565b6103626105c6366004614ee6565b612963565b6103686105d9366004614b3d565b612995565b6103626105ec366004614a93565b612aeb565b6106046105ff366004614a93565b612b85565b60405160ff9091168152602001610311565b610322610624366004614a93565b612baf565b61063c610637366004614f61565b612bba565b6040516103119190615006565b603f546001600160a01b0316610342565b61066d610668366004614a93565b612dbb565b60405161ffff9091168152602001610311565b61036261068e366004614a93565b612de9565b6103626106a1366004614b3d565b612e84565b610368607c5481565b6103056106bd3660046150ef565b612fb0565b610368607b5481565b6103626106d9366004614b3d565b612fde565b60006106e98261307b565b92915050565b6060600080546106fe90615122565b80601f016020809104026020016040519081016040528092919081815260200182805461072a90615122565b80156107775780601f1061074c57610100808354040283529160200191610777565b820191906000526020600020905b81548152906001019060200180831161075a57829003601f168201915b5050505050905090565b600061078c826130a0565b6107f25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061081982611969565b9050806001600160a01b0316836001600160a01b031614156108875760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107e9565b336001600160a01b03821614806108a357506108a38133612fb0565b6109105760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016107e9565b61091a83836130bd565b505050565b610929338261312b565b6109455760405162461bcd60e51b81526004016107e990615157565b61091a8383836131f5565b60008061095c83612261565b905060005b8151811015610aa657610a8860726000848481518110610983576109836151a8565b6020026020010151815260200190815260200160002060405180610100016040529081600082015481526020016001820180546109bf90615122565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb90615122565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a082015260079091015460ff16151560c0909101526133a0565b610a9290846151d4565b925080610a9e816151ec565b915050610961565b5050919050565b600080610ab984612261565b905060005b8151811015610c1d57600060726000848481518110610adf57610adf6151a8565b602002602001015181526020019081526020016000206040518061010001604052908160008201548152602001600182018054610b1b90615122565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4790615122565b8015610b945780601f10610b6957610100808354040283529160200191610b94565b820191906000526020600020905b815481529060010190602001808311610b7757829003601f168201915b50505091835250506002820154602080830191909152600383015460408301526004830154606083015260058301546080830152600683015460a083015260079092015460ff16151560c0909101528651878201208282015180519201919091209192501415610c0a57600093505050506106e9565b5080610c15816151ec565b915050610abe565b506001949350505050565b33610c31612203565b6001600160a01b031614610c575760405162461bcd60e51b81526004016107e990615207565b603f546001600160a01b0316813b151580610c7957506001600160a01b038216155b610d0c5760405162461bcd60e51b815260206004820152605860248201527f4c6971756964697479506f6f6c4d616e616765723a20596f752063616e206f6e60448201527f6c792073657420307830206f72206120636f6e747261637420616464726573736064820152771030b99030903732bb9034b6b83632b6b2b73a30ba34b7b760411b608482015260a4016107e9565b603f80546001600160a01b0319166001600160a01b0384811691821790925560405190918316907fdcde9a93392ce8f6a02392dc08f42df39d1fb10ce386c7e9c6c1faba80b2a42490600090a35050565b6000610d6883611bd9565b8210610dca5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107e9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600080610dff83611bd9565b1192915050565b33610e0f612203565b6001600160a01b031614610e355760405162461bcd60e51b81526004016107e990615207565b610e3d6133c7565b565b6002600c541415610e625760405162461bcd60e51b81526004016107e99061523c565b6002600c553380610e855760405162461bcd60e51b81526004016107e990615273565b610e8e81610df3565b610eaa5760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90610eda908490600401614aac565b602060405180830381865afa158015610ef7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1b9190615306565b15610f385760405162461bcd60e51b81526004016107e990615323565b8133610f4382613454565b610f5f5760405162461bcd60e51b81526004016107e99061536d565b610f6981836128d1565b610f855760405162461bcd60e51b81526004016107e9906153b1565b600b5460ff1615610fa85760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b0316610fd05760405162461bcd60e51b81526004016107e990615424565b33600080610fdd876135d1565b915091506000821161104e5760405162461bcd60e51b815260206004820152603460248201527f46616374696f6e733a20596f75206d757374207761697420756e74696c20796f6044820152733a9031b0b71031b7b6b837bab7321030b3b0b4b760611b60648201526084016107e9565b80156110b357600d5460405163d02dd2b360e01b8152600481018390526001600160a01b039091169063d02dd2b390602401600060405180830381600087803b15801561109a57600080fd5b505af11580156110ae573d6000803e3d6000fd5b505050505b86836001600160a01b03167f0e311a2c6dbfb0153ec3a8a5bdca09070b3e5f60768fdc10a20453f38d186873846040516110ef91815260200190565b60405180910390a350506001600c555050505050565b61091a83838360405180602001604052806000815250612963565b600061112b60085490565b821061118e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107e9565b600882815481106111a1576111a16151a8565b90600052602060002001549050919050565b60006002600c5414156111d85760405162461bcd60e51b81526004016107e99061523c565b6002600c55600b5460ff16156112005760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b03166112285760405162461bcd60e51b81526004016107e990615424565b82513390600410801561123c575060208451105b6112a95760405162461bcd60e51b815260206004820152603860248201527f46616374696f6e733a20496e636f7272656374206e616d65206c656e6774682e6044820152771026bab9ba103132903132ba3bb2b2b7101a103a3790199960411b60648201526084016107e9565b60765483101561130d5760405162461bcd60e51b815260206004820152602960248201527f46616374696f6e733a2053657276616e742076616c7565207365742062656c6f60448201526877206d696e696d756d60b81b60648201526084016107e9565b6113178185610aad565b6113635760405162461bcd60e51b815260206004820152601c60248201527f46616374696f6e733a204e616d65206e6f7420617661696c61626c650000000060448201526064016107e9565b607654600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190611396908590600401614aac565b602060405180830381865afa1580156113b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d79190615459565b10156114345760405162461bcd60e51b815260206004820152602660248201527f46616374696f6e733a2042616c616e636520746f6f206c6f7720666f7220637260448201526532b0ba34b7b760d11b60648201526084016107e9565b600d5460405163db0e185b60e01b81526001600160a01b039091169063db0e185b906114669084908790600401615472565b600060405180830381600087803b15801561148057600080fd5b505af1158015611494573d6000803e3d6000fd5b5050505060006114cd8460786000600481106114b2576114b26151a8565b602081049091015460ff601f9092166101000a9004166137da565b600d5460405163d02dd2b360e01b8152600481018390529193506001600160a01b0316915063d02dd2b390602401600060405180830381600087803b15801561151557600080fd5b505af1158015611529573d6000803e3d6000fd5b5050505061153b607180546001019055565b600061154660715490565b9050600042905085607b600082825461155f91906151d4565b90915550506079546115769062ffffff1687613811565b60405180610100016040528083815260200188815260200182815260200182815260200160796000600681106115ae576115ae6151a8565b600a80820492909201549190066003026101000a900462ffffff1681526020808201899052600060408084018290526001606090940184905286825260728352902083518155838201518051919361160c939085019291019061474c565b5060408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0909101516007909101805460ff191691151591909117905561166384836139c1565b81846001600160a01b03167f278b0fd0170e87df8d6e9c94b47d3ff7382de693c547e6089b53f9972c5323898860405161169f91815260200190565b60405180910390a3506001600c5595945050505050565b6002600c5414156116d95760405162461bcd60e51b81526004016107e99061523c565b6002600c5533806116fc5760405162461bcd60e51b81526004016107e990615273565b61170581610df3565b6117215760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90611751908490600401614aac565b602060405180830381865afa15801561176e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117929190615306565b156117af5760405162461bcd60e51b81526004016107e990615323565b600b5460ff16156117d25760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b03166117fa5760405162461bcd60e51b81526004016107e990615424565b3360008061180783612261565b905060005b81518110156118555761183782828151811061182a5761182a6151a8565b6020026020010151613b00565b61184190846151d4565b92508061184d816151ec565b91505061180c565b5061185f82613bf4565b8060405161186d919061548b565b6040518091039020836001600160a01b03167fb19b49535c30c050254f8a50fbb3d50f125497777abe768053959123e48f1baf846040516118b091815260200190565b60405180910390a350506001600c555050565b336118cc612203565b6001600160a01b0316146118f25760405162461bcd60e51b81526004016107e990615207565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906119209085908590600401615472565b6020604051808303816000875af115801561193f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119639190615306565b50505050565b6000818152600260205260408120546001600160a01b0316806106e95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107e9565b6002600c541415611a035760405162461bcd60e51b81526004016107e99061523c565b6002600c553380611a265760405162461bcd60e51b81526004016107e990615273565b611a2f81610df3565b611a4b5760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90611a7b908490600401614aac565b602060405180830381865afa158015611a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abc9190615306565b15611ad95760405162461bcd60e51b81526004016107e990615323565b8133611ae482613454565b611b005760405162461bcd60e51b81526004016107e99061536d565b611b0a81836128d1565b611b265760405162461bcd60e51b81526004016107e9906153b1565b600b5460ff1615611b495760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b0316611b715760405162461bcd60e51b81526004016107e990615424565b336000611b7d86613b00565b9050611b8881613bf4565b85826001600160a01b03167f4f32a1005fcf45a64a68bc4258b4e0f5522b7aa6a06506781aa4e6c6395c48d083604051611bc491815260200190565b60405180910390a350506001600c5550505050565b60006001600160a01b038216611c445760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107e9565b506001600160a01b031660009081526003602052604090205490565b33611c69612203565b6001600160a01b031614611c8f5760405162461bcd60e51b81526004016107e990615207565b610e3d6000613d3c565b6002600c541415611cbc5760405162461bcd60e51b81526004016107e99061523c565b6002600c553380611cdf5760405162461bcd60e51b81526004016107e990615273565b611ce881610df3565b611d045760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90611d34908490600401614aac565b602060405180830381865afa158015611d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d759190615306565b15611d925760405162461bcd60e51b81526004016107e990615323565b8233611d9d82613454565b611db95760405162461bcd60e51b81526004016107e99061536d565b611dc381836128d1565b611ddf5760405162461bcd60e51b81526004016107e9906153b1565b600b5460ff1615611e025760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b0316611e2a5760405162461bcd60e51b81526004016107e990615424565b835133906001108015611e3e575060208551105b611eab5760405162461bcd60e51b815260206004820152603860248201527f53657276616e74733a20496e636f7272656374206e616d65206c656e6774682c604482015277206d757374206265206265747765656e203220746f20333160401b60648201526084016107e9565b60008681526072602052604090206005810154611f045760405162461bcd60e51b81526020600482015260176024820152764572726f723a2053657276616e7420697320656d70747960481b60448201526064016107e9565b600080611f23836005015460786003600481106114b2576114b26151a8565b91509150611f3e836004015482611f39906154c1565b613811565b80607c6000828254611f5091906151d4565b90915550506005830182905560018301805460009190611f6f90615122565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9b90615122565b8015611fe85780601f10611fbd57610100808354040283529160200191611fe8565b820191906000526020600020905b815481529060010190602001808311611fcb57829003601f168201915b50508c519394506120069360018901935060208e019250905061474c565b508860405161201591906154de565b60405180910390208160405161202b91906154de565b604051908190038120906001600160a01b038816907f0d48d45af1b1b964a93dad6fe3f832865a8b610c6364bd1850790e2c74e535ce90600090a450506001600c555050505050505050565b33612080612203565b6001600160a01b0316146120a65760405162461bcd60e51b81526004016107e990615207565b6000811161211c5760405162461bcd60e51b815260206004820152603b60248201527f46616374696f6e733a204d696e696d756d20707269636520746f20637265617460448201527f6520612053657276616e74206d7573742062652061626f76652030000000000060648201526084016107e9565b607655565b3361212a612203565b6001600160a01b0316146121505760405162461bcd60e51b81526004016107e990615207565b610e3d613d96565b600080805b6074548110156121fd5760006073600060748481548110612180576121806151a8565b60009182526020808320909101548352828101939093526040918201902081516060810183528154808252600183015494820185905260029092015460ff161515928101929092526075549193506121dd92916201518090613dee565b6121e790846151d4565b92505080806121f5906151ec565b91505061215d565b50919050565b600b5461010090046001600160a01b031690565b33612220612203565b6001600160a01b0316146122465760405162461bcd60e51b81526004016107e990615207565b61225360798360066147d0565b5061091a607a826006614864565b6060600061226e83611bd9565b90506000816001600160401b0381111561228a5761228a614b58565b6040519080825280602002602001820160405280156122b3578160200160208202803683370190505b50905060005b828110156123255760006122cd8683610d5d565b90506122d881613454565b6122f45760405162461bcd60e51b81526004016107e99061536d565b80838381518110612307576123076151a8565b6020908102919091010152508061231d816151ec565b9150506122b9565b509392505050565b33612336612203565b6001600160a01b03161461235c5760405162461bcd60e51b81526004016107e990615207565b8051602860ff90911611156123b35760405162461bcd60e51b815260206004820152601d60248201527f4d696e74206665652063616e206e65766572206578636565642033302500000060448201526064016107e9565b602d816001602002015160ff16111561240e5760405162461bcd60e51b815260206004820152601e60248201527f436c61696d206665652063616e206e657665722065786365656420333025000060448201526064016107e9565b6023816002602002015160ff1611156124735760405162461bcd60e51b815260206004820152602160248201527f436f6d706f756e64206665652063616e206e65766572206578636565642033306044820152602560f81b60648201526084016107e9565b600f816003602002015160ff1611156124ce5760405162461bcd60e51b815260206004820152601f60248201527f52656e616d65206665652063616e206e6576657220657863656564203135250060448201526064016107e9565b6124db60788260046148e8565b5050565b6060600180546106fe90615122565b6002600c5414156125115760405162461bcd60e51b81526004016107e99061523c565b6002600c5533806125345760405162461bcd60e51b81526004016107e990615273565b61253d81610df3565b6125595760405162461bcd60e51b81526004016107e9906152bc565b603f5460405163b278110f60e01b81526001600160a01b039091169063b278110f90612589908490600401614aac565b602060405180830381865afa1580156125a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ca9190615306565b156125e75760405162461bcd60e51b81526004016107e990615323565b600b5460ff161561260a5760405162461bcd60e51b81526004016107e9906153fa565b600d546001600160a01b03166126325760405162461bcd60e51b81526004016107e990615424565b336000808061264084612261565b9050600081516001600160401b0381111561265d5761265d614b58565b604051908082528060200260200182016040528015612686578160200160208202803683370190505b50905060005b825181101561274d576000806126ba8584815181106126ad576126ad6151a8565b60200260200101516135d1565b90925090508115612719578483815181106126d7576126d76151a8565b60200260200101518484815181106126f1576126f16151a8565b602090810291909101015261270681886151d4565b965061271282876151d4565b9550612738565b83838151811061272b5761272b6151a8565b6020026020010160008152505b50508080612745906151ec565b91505061268c565b506000831161279e5760405162461bcd60e51b815260206004820181905260248201527f46616374696f6e733a204e6f207265776172647320746f20636f6d706f756e6460448201526064016107e9565b831561280357600d5460405163d02dd2b360e01b8152600481018690526001600160a01b039091169063d02dd2b390602401600060405180830381600087803b1580156127ea57600080fd5b505af11580156127fe573d6000803e3d6000fd5b505050505b80604051612811919061548b565b6040518091039020856001600160a01b03167ff6fa3b3c4cc7c3050320415a19ca5bae8e2029684a976274a45e4165eedfcd9b85604051611bc491815260200190565b6124db338383613e4a565b33612868612203565b6001600160a01b03161461288e5760405162461bcd60e51b81526004016107e990615207565b612896612203565b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050501580156128ce573d6000803e3d6000fd5b50565b6000806128dd84612261565b905060005b815181101561292957838282815181106128fe576128fe6151a8565b60200260200101511415612917576001925050506106e9565b80612921816151ec565b9150506128e2565b506000949350505050565b6079816006811061294457600080fd5b600a9182820401919006600302915054906101000a900462ffffff1681565b61296d338361312b565b6129895760405162461bcd60e51b81526004016107e990615157565b61196384848484613f15565b6000806129a183612261565b905060005b8151811015610aa657612acd607260008484815181106129c8576129c86151a8565b602002602001015181526020019081526020016000206040518061010001604052908160008201548152602001600182018054612a0490615122565b80601f0160208091040260200160405190810160405280929190818152602001828054612a3090615122565b8015612a7d5780601f10612a5257610100808354040283529160200191612a7d565b820191906000526020600020905b815481529060010190602001808311612a6057829003601f168201915b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a082015260079091015460ff16151560c090910152613f48565b612ad790846151d4565b925080612ae3816151ec565b9150506129a6565b33612af4612203565b6001600160a01b031614612b1a5760405162461bcd60e51b81526004016107e990615207565b60008111612b805760405162461bcd60e51b815260206004820152602d60248201527f46616374696f6e733a20726577617264506572446179206d757374206265206760448201526c0726561746572207468616e203609c1b60648201526084016107e9565b607555565b60788160048110612b9557600080fd5b60209182820401919006915054906101000a900460ff1681565b60606106e982613f63565b6060600082516001600160401b03811115612bd757612bd7614b58565b604051908082528060200260200182016040528015612c1057816020015b612bfd614969565b815260200190600190039081612bf55790505b50905060005b8351811015612db4576000848281518110612c3357612c336151a8565b602002602001015190506000607260008381526020019081526020016000206040518061010001604052908160008201548152602001600182018054612c7890615122565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca490615122565b8015612cf15780601f10612cc657610100808354040283529160200191612cf1565b820191906000526020600020905b815481529060010190602001808311612cd457829003601f168201915b5050505050815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff16151515158152505090506040518060a00160405280828152602001838152602001612d69836133a0565b8152602001612d7783613f48565b8152602001607754815250848481518110612d9457612d946151a8565b602002602001018190525050508080612dac906151ec565b915050612c16565b5092915050565b607a8160068110612dcb57600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b33612df2612203565b6001600160a01b031614612e185760405162461bcd60e51b81526004016107e990615207565b60008111612e7f5760405162461bcd60e51b815260206004820152602e60248201527f46616374696f6e733a20636f6d706f756e6444656c6179206d7573742062652060448201526d067726561746572207468616e20360941b60648201526084016107e9565b607755565b33612e8d612203565b6001600160a01b031614612eb35760405162461bcd60e51b81526004016107e990615207565b600d546001600160a01b0316813b151580612ed557506001600160a01b038216155b612f5f5760405162461bcd60e51b815260206004820152604f60248201527f53706f6f6b7956657273653a20596f752063616e206f6e6c792073657420307860448201527f30206f72206120636f6e747261637420616464726573732061732061206e657760648201526e1034b6b83632b6b2b73a30ba34b7b760891b608482015260a4016107e9565b600d80546001600160a01b0319166001600160a01b0384811691821790925560405190918316907f94524bf89ed2549da4e64e75f26c959d0e6fce2cb54ef8b1b870ac375599377c90600090a35050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b33612fe7612203565b6001600160a01b03161461300d5760405162461bcd60e51b81526004016107e990615207565b6001600160a01b0381166130725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e9565b6128ce81613d3c565b60006001600160e01b0319821663780e9d6360e01b14806106e957506106e9826140d2565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130f282611969565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613136826130a0565b6131975760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107e9565b60006131a283611969565b9050806001600160a01b0316846001600160a01b031614806131dd5750836001600160a01b03166131d284610781565b6001600160a01b0316145b806131ed57506131ed8185612fb0565b949350505050565b826001600160a01b031661320882611969565b6001600160a01b0316146132705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107e9565b6001600160a01b0382166132d25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107e9565b6132dd838383614122565b6132e86000826130bd565b6001600160a01b03831660009081526003602052604081208054600192906133119084906154fa565b90915550506001600160a01b038216600090815260036020526040812080546001929061333f9084906151d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006106e98260a0015183608001518460600151426133bf91906154fa565b607554613dee565b600b5460ff166134105760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107e9565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405161344a9190614aac565b60405180910390a1565b60008082116134b35760405162461bcd60e51b815260206004820152602560248201527f46616374696f6e733a204964206d75737420626520686967686572207468616e604482015264207a65726f60d81b60648201526084016107e9565b60006072600084815260200190815260200160002060405180610100016040529081600082015481526020016001820180546134ee90615122565b80601f016020809104026020016040519081016040528092919081815260200182805461351a90615122565b80156135675780601f1061353c57610100808354040283529160200191613567565b820191906000526020600020905b81548152906001019060200180831161354a57829003601f168201915b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a082015260079091015460ff16151560c09091015260e0810151909150156135c85750600192915050565b50600092915050565b60008060006072600085815260200190815260200160002090506136de81604051806101000160405290816000820154815260200160018201805461361590615122565b80601f016020809104026020016040519081016040528092919081815260200182805461364190615122565b801561368e5780601f106136635761010080835404028352916020019161368e565b820191906000526020600020905b81548152906001019060200180831161367157829003601f168201915b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a082015260079091015460ff16151560c090910152614150565b6136ee5750600093849350915050565b600061371a8260405180610100016040529081600082015481526020016001820180546109bf90615122565b905080156137cd5760008061373283607860026114b2565b9150915081607b600082825461374891906151d4565b9250508190555061376584600401548560050154611f39906154c1565b4284600301819055508184600501600082825461378291906151d4565b909155505060048401546137959061416d565b8460040160008282546137a891906151d4565b925050819055506137c184600401548560050154613811565b90969095509350505050565b5060009485945092505050565b6000808083156137fd5760646137f08587615511565b6137fa9190615546565b90505b61380781866154fa565b9590945092505050565b6000828152607360205260409020600281015460ff16156138b557805483146138975760405162461bcd60e51b815260206004820152603260248201527f46616374696f6e733a207265776172644d756c7420646f6573206e6f74206d6160448201527174636820696e205469657253746f7261676560701b60648201526084016107e9565b60008282600101546138a9919061555a565b90506001820155505050565b600082136139465760405162461bcd60e51b815260206004820152605260248201527f46616374696f6e733a20466174616c206572726f72207768696c65206372656160448201527f74696e67206e6577205469657253746f726167652e20416d6f756e742063616e6064820152713737ba103132903132b637bb903d32b9379760711b608482015260a4016107e9565b506040805160608101825283815260208082019384526001828401818152600087815260739093529382209251835593518285015591516002909101805460ff191691151591909117905560748054928301815590527f19a0b39aa25ac793b5f6e9a0534364cc0b3fd1ea9b651e79c7f50a59d48ef8130155565b6001600160a01b038216613a175760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e9565b613a20816130a0565b15613a6d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e9565b613a7960008383614122565b6001600160a01b0382166000908152600360205260408120805460019290613aa29084906151d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080607260008481526020019081526020016000209050613b4281604051806101000160405290816000820154815260200160018201805461361590615122565b613b4f5750600092915050565b6000613b7b8260405180610100016040529081600082015481526020016001820180546109bf90615122565b905080826006016000828254613b9191906151d4565b9091555050607954600483015462ffffff90911614613bd757613bc082600401548360050154611f39906154c1565b6079546005830154613bd79162ffffff1690613811565b60795462ffffff1660048301554260039092019190915592915050565b60008111613c5f5760405162461bcd60e51b815260206004820152603260248201527f46616374696f6e733a20596f7520646f6e2774206861766520656e6f756768206044820152711c995dd85c99081d1bc818d85cda081bdd5d60721b60648201526084016107e9565b33600080613c7084607860016114b2565b600d54604051639b5f7c6560e01b81529294509092506001600160a01b031690639b5f7c6590613ca69086908690600401615472565b600060405180830381600087803b158015613cc057600080fd5b505af1158015613cd4573d6000803e3d6000fd5b5050600d5460405163d02dd2b360e01b8152600481018590526001600160a01b03909116925063d02dd2b39150602401600060405180830381600087803b158015613d1e57600080fd5b505af1158015613d32573d6000803e3d6000fd5b5050505050505050565b600b80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b5460ff1615613db95760405162461bcd60e51b81526004016107e9906153fa565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861343d3390565b600080620f4240613dff8486615511565b613e099190615546565b90506000620186a0613e1b8784615511565b613e259190615546565b9050620186a0613e358883615511565b613e3f9190615546565b979650505050505050565b816001600160a01b0316836001600160a01b03161415613ea85760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016107e9565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613f208484846131f5565b613f2c84848484614234565b6119635760405162461bcd60e51b81526004016107e99061559b565b60006106e98260a00151836080015162015180607554613dee565b6060613f6e826130a0565b613fd45760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016107e9565b6000828152600a602052604081208054613fed90615122565b80601f016020809104026020016040519081016040528092919081815260200182805461401990615122565b80156140665780601f1061403b57610100808354040283529160200191614066565b820191906000526020600020905b81548152906001019060200180831161404957829003601f168201915b50505050509050600061408460408051602081019091526000815290565b9050805160001415614097575092915050565b8151156140c95780826040516020016140b19291906155ed565b60405160208183030381529060405292505050919050565b6131ed8461432f565b60006001600160e01b031982166380ac58cd60e01b148061410357506001600160e01b03198216635b5e139f60e01b145b806106e957506301ffc9a760e01b6001600160e01b03198316146106e9565b600b5460ff16156141455760405162461bcd60e51b81526004016107e9906153fa565b61091a838383614407565b6000607754826060015161416491906151d4565b42101592915050565b607954600090600160781b900462ffffff1682106141ab57607a60055b601081049190910154600f9091166002026101000a900461ffff1692915050565b607954600160601b900462ffffff1682106141c957607a600461418a565b607954600160481b900462ffffff1682106141e757607a600261418a565b6079546601000000000000900462ffffff16821061420857607a600261418a565b6079546301000000900462ffffff16821061422657607a600161418a565b607a600061418a565b919050565b60006001600160a01b0384163b1561432757604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061427890339089908890889060040161561c565b6020604051808303816000875af19250505080156142b3575060408051601f3d908101601f191682019092526142b091810190615659565b60015b61430d573d8080156142e1576040519150601f19603f3d011682016040523d82523d6000602084013e6142e6565b606091505b5080516143055760405162461bcd60e51b81526004016107e99061559b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506131ed565b5060016131ed565b606061433a826130a0565b61439e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107e9565b60006143b560408051602081019091526000815290565b905060008151116143d55760405180602001604052806000815250614400565b806143df846144bf565b6040516020016143f09291906155ed565b6040516020818303038152906040525b9392505050565b6001600160a01b0383166144625761445d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614485565b816001600160a01b0316836001600160a01b0316146144855761448583826145bc565b6001600160a01b03821661449c5761091a81614659565b826001600160a01b0316826001600160a01b03161461091a5761091a8282614708565b6060816144e35750506040805180820190915260018152600360fc1b602082015290565b8160005b811561450d57806144f7816151ec565b91506145069050600a83615546565b91506144e7565b6000816001600160401b0381111561452757614527614b58565b6040519080825280601f01601f191660200182016040528015614551576020820181803683370190505b5090505b84156131ed576145666001836154fa565b9150614573600a86615676565b61457e9060306151d4565b60f81b818381518110614593576145936151a8565b60200101906001600160f81b031916908160001a9053506145b5600a86615546565b9450614555565b600060016145c984611bd9565b6145d391906154fa565b600083815260076020526040902054909150808214614626576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061466b906001906154fa565b60008381526009602052604081205460088054939450909284908110614693576146936151a8565b9060005260206000200154905080600883815481106146b4576146b46151a8565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806146ec576146ec61568a565b6001900381819060005260206000200160009055905550505050565b600061471383611bd9565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461475890615122565b90600052602060002090601f01602090048101928261477a57600085556147c0565b82601f1061479357805160ff19168380011785556147c0565b828001600101855582156147c0579182015b828111156147c05782518255916020019190600101906147a5565b506147cc9291506149e0565b5090565b6001830191839082156147c05791602002820160005b8382111561482857835183826101000a81548162ffffff021916908362ffffff16021790555092602001926003016020816002010492830192600103026147e6565b80156148575782816101000a81549062ffffff0219169055600301602081600201049283019260010302614828565b50506147cc9291506149e0565b6001830191839082156147c05791602002820160005b838211156148ba57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030261487a565b80156148575782816101000a81549061ffff02191690556002016020816001010492830192600103026148ba565b6001830191839082156147c05791602002820160005b8382111561493c57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026148fe565b80156148575782816101000a81549060ff021916905560010160208160000104928301926001030261493c565b6040518060a001604052806149be604051806101000160405280600081526020016060815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b8152602001600081526020016000815260200160008152602001600081525090565b5b808211156147cc57600081556001016149e1565b6001600160e01b0319811681146128ce57600080fd5b600060208284031215614a1d57600080fd5b8135614400816149f5565b60005b83811015614a43578181015183820152602001614a2b565b838111156119635750506000910152565b60008151808452614a6c816020860160208601614a28565b601f01601f19169290920160200192915050565b6020815260006144006020830184614a54565b600060208284031215614aa557600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461422f57600080fd5b60008060408385031215614aea57600080fd5b614af383614ac0565b946020939093013593505050565b600080600060608486031215614b1657600080fd5b614b1f84614ac0565b9250614b2d60208501614ac0565b9150604084013590509250925092565b600060208284031215614b4f57600080fd5b61440082614ac0565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b0381118282101715614b9057614b90614b58565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bbe57614bbe614b58565b604052919050565b60006001600160401b03831115614bdf57614bdf614b58565b614bf2601f8401601f1916602001614b96565b9050828152838383011115614c0657600080fd5b828260208301376000602084830101529392505050565b600082601f830112614c2e57600080fd5b61440083833560208501614bc6565b60008060408385031215614c5057600080fd5b614c5983614ac0565b915060208301356001600160401b03811115614c7457600080fd5b614c8085828601614c1d565b9150509250929050565b60008060408385031215614c9d57600080fd5b82356001600160401b03811115614cb357600080fd5b614cbf85828601614c1d565b95602094909401359450505050565b60008060408385031215614ce157600080fd5b8235915060208301356001600160401b03811115614c7457600080fd5b600080610180808486031215614d1357600080fd5b84601f850112614d2257600080fd5b614d2a614b6e565b8060c0860187811115614d3c57600080fd5b865b81811015614d6857803562ffffff81168114614d5a5760008081fd5b845260209384019301614d3e565b508195508760df880112614d7b57600080fd5b614d83614b6e565b93870193925082915087841115614d9957600080fd5b83811015614dc257803561ffff81168114614db45760008081fd5b835260209283019201614d99565b508093505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015614e0857835183529284019291840191600101614dec565b50909695505050505050565b600060808284031215614e2657600080fd5b82601f830112614e3557600080fd5b604051608081018181106001600160401b0382111715614e5757614e57614b58565b604052806080840185811115614e6c57600080fd5b845b81811015614e9657803560ff81168114614e885760008081fd5b835260209283019201614e6e565b509195945050505050565b80151581146128ce57600080fd5b60008060408385031215614ec257600080fd5b614ecb83614ac0565b91506020830135614edb81614ea1565b809150509250929050565b60008060008060808587031215614efc57600080fd5b614f0585614ac0565b9350614f1360208601614ac0565b92506040850135915060608501356001600160401b03811115614f3557600080fd5b8501601f81018713614f4657600080fd5b614f5587823560208401614bc6565b91505092959194509250565b60006020808385031215614f7457600080fd5b82356001600160401b0380821115614f8b57600080fd5b818501915085601f830112614f9f57600080fd5b813581811115614fb157614fb1614b58565b8060051b9150614fc2848301614b96565b8181529183018401918481019088841115614fdc57600080fd5b938501935b83851015614ffa57843582529385019390850190614fe1565b98975050505050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156150e157603f19898403018552815160a081518186528051828701528981015161010060c081818a01526150696101a08a0184614a54565b848d015160e08b810191909152606080870151948c01949094526080808701516101208d0152968601516101408c0152918501516101608b01529301511515610180890152848c01518c890152848b0151888c015284810151908801525091810151940193909352938601939086019060010161502d565b509098975050505050505050565b6000806040838503121561510257600080fd5b61510b83614ac0565b915061511960208401614ac0565b90509250929050565b600181811c9082168061513657607f821691505b602082108114156121fd57634e487b7160e01b600052602260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156151e7576151e76151be565b500190565b6000600019821415615200576152006151be565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526029908201527f46616374696f6e733a2043616e6e6f742062652066726f6d20746865207a65726040820152686f206164647265737360b81b606082015260800190565b6020808252602a908201527f46616374696f6e733a204e6f2053657276616e74206f776e65642062792074686040820152691a5cc81858d8dbdd5b9d60b21b606082015260800190565b60006020828403121561531857600080fd5b815161440081614ea1565b6020808252602a908201527f46616374696f6e733a20466565207265636569766572732063616e6e6f74206f6040820152691ddb8814d95c9d985b9d60b21b606082015260800190565b60208082526024908201527f46616374696f6e733a20546869732073657276616e7420646f65736e277420656040820152631e1a5cdd60e21b606082015260800190565b60208082526029908201527f46616374696f6e733a20596f7520646f206e6f7420636f6e74726f6c207468696040820152681cc814d95c9d985b9d60ba1b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f46616374696f6e733a2053706f6f6b795665727365206973206e6f7420736574604082015260600190565b60006020828403121561546b57600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b815160009082906020808601845b838110156154b557815185529382019390820190600101615499565b50929695505050505050565b6000600160ff1b8214156154d7576154d76151be565b5060000390565b600082516154f0818460208701614a28565b9190910192915050565b60008282101561550c5761550c6151be565b500390565b600081600019048311821515161561552b5761552b6151be565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261555557615555615530565b500490565b600080821280156001600160ff1b038490038513161561557c5761557c6151be565b600160ff1b8390038412811615615595576155956151be565b50500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516155ff818460208801614a28565b835190830190615613818360208801614a28565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061564f90830184614a54565b9695505050505050565b60006020828403121561566b57600080fd5b8151614400816149f5565b60008261568557615685615530565b500690565b634e487b7160e01b600052603160045260246000fdfea264697066735822122017d5039494d73e4850b3780d1a7f3fd668a5e7c960a803fc51da0827b4f24ae964736f6c634300080b0033
Deployed Bytecode Sourcemap
59271:22569:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81608:229;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;81608:229:0;;;;;;;;23176:100;;;:::i;:::-;;;;;;;:::i;24735:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24258:411::-;;;;;;:::i;:::-;;:::i;:::-;;37005:113;37093:10;:17;37005:113;;;2319:25:1;;;2307:2;2292:18;37005:113:0;2173:177:1;60377:31:0;;;;;;25485:339;;;;;;:::i;:::-;;:::i;76100:322::-;;;;;;:::i;:::-;;:::i;76956:502::-;;;;;;:::i;:::-;;:::i;55379:602::-;;;;;;:::i;:::-;;:::i;36673:256::-;;;;;;:::i;:::-;;:::i;77466:119::-;;;;;;:::i;:::-;;:::i;81032:65::-;;;:::i;67807:677::-;;;;;;:::i;:::-;;:::i;25895:185::-;;;;;;:::i;:::-;;:::i;37195:233::-;;;;;;:::i;:::-;;:::i;63768:2024::-;;;;;;:::i;:::-;;:::i;67253:546::-;;;:::i;47904:86::-;47975:7;;;;47904:86;;52008:182;;;;;;:::i;:::-;;:::i;22870:239::-;;;;;;:::i;:::-;;:::i;65800:400::-;;;;;;:::i;:::-;;:::i;22600:208::-;;;;;;:::i;:::-;;:::i;2387:103::-;;;:::i;66208:1037::-;;;;;;:::i;:::-;;:::i;79339:268::-;;;;;;:::i;:::-;;:::i;53085:116::-;53181:11;;-1:-1:-1;;;;;53181:11:0;53085:116;;80963:61;;;:::i;76430:518::-;;;:::i;1736:87::-;;;:::i;80113:450::-;;;;;;:::i;:::-;;:::i;60415:28::-;;;;;;77988:589;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;80571:384::-;;;;;;:::i;:::-;;:::i;23345:104::-;;;:::i;68492:1172::-;;;:::i;25028:155::-;;;;;;:::i;:::-;;:::i;51887:113::-;;;:::i;77593:387::-;;;;;;:::i;:::-;;:::i;60564:26::-;;;;;;:::i;:::-;;:::i;:::-;;;9036:8:1;9024:21;;;9006:40;;8994:2;8979:18;60564:26:0;8862:190:1;60343:27:0;;;;;;26151:328;;;;;;:::i;:::-;;:::i;75767:325::-;;;;;;:::i;:::-;;:::i;79867:238::-;;;;;;:::i;:::-;;:::i;60526:29::-;;;;;;:::i;:::-;;:::i;:::-;;;9901:4:1;9889:17;;;9871:36;;9859:2;9844:18;60526:29:0;9729:184:1;63032:728:0;;;;;;:::i;:::-;;:::i;78585:720::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55237:134::-;55342:20;;-1:-1:-1;;;;;55342:20:0;55237:134;;60597:26;;;;;;:::i;:::-;;:::i;:::-;;;13066:6:1;13054:19;;;13036:38;;13024:2;13009:18;60597:26:0;12892:188:1;79615:244:0;;;;;;:::i;:::-;;:::i;53209:548::-;;;;;;:::i;:::-;;:::i;60719:33::-;;;;;;25254:164;;;;;;:::i;:::-;;:::i;60679:31::-;;;;;;2645:201;;;;;;:::i;:::-;;:::i;81608:229::-;81764:4;81793:36;81817:11;81793:23;:36::i;:::-;81786:43;81608:229;-1:-1:-1;;81608:229:0:o;23176:100::-;23230:13;23263:5;23256:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23176:100;:::o;24735:221::-;24811:7;24839:16;24847:7;24839;:16::i;:::-;24831:73;;;;-1:-1:-1;;;24831:73:0;;13937:2:1;24831:73:0;;;13919:21:1;13976:2;13956:18;;;13949:30;14015:34;13995:18;;;13988:62;-1:-1:-1;;;14066:18:1;;;14059:42;14118:19;;24831:73:0;;;;;;;;;-1:-1:-1;24924:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24924:24:0;;24735:221::o;24258:411::-;24339:13;24355:23;24370:7;24355:14;:23::i;:::-;24339:39;;24403:5;-1:-1:-1;;;;;24397:11:0;:2;-1:-1:-1;;;;;24397:11:0;;;24389:57;;;;-1:-1:-1;;;24389:57:0;;14350:2:1;24389:57:0;;;14332:21:1;14389:2;14369:18;;;14362:30;14428:34;14408:18;;;14401:62;-1:-1:-1;;;14479:18:1;;;14472:31;14520:19;;24389:57:0;14148:397:1;24389:57:0;683:10;-1:-1:-1;;;;;24481:21:0;;;;:62;;-1:-1:-1;24506:37:0;24523:5;683:10;25254:164;:::i;24506:37::-;24459:168;;;;-1:-1:-1;;;24459:168:0;;14752:2:1;24459:168:0;;;14734:21:1;14791:2;14771:18;;;14764:30;14830:34;14810:18;;;14803:62;-1:-1:-1;;;14881:18:1;;;14874:54;14945:19;;24459:168:0;14550:420:1;24459:168:0;24640:21;24649:2;24653:7;24640:8;:21::i;:::-;24328:341;24258:411;;:::o;25485:339::-;25680:41;683:10;25713:7;25680:18;:41::i;:::-;25672:103;;;;-1:-1:-1;;;25672:103:0;;;;;;;:::i;:::-;25788:28;25798:4;25804:2;25808:7;25788:9;:28::i;76100:322::-;76178:17;76208:30;76241:25;76257:8;76241:15;:25::i;:::-;76208:58;;76282:9;76277:138;76301:13;:20;76297:1;:24;76277:138;;;76359:44;76375:9;:27;76385:13;76399:1;76385:16;;;;;;;;:::i;:::-;;;;;;;76375:27;;;;;;;;;;;76359:44;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;76359:44:0;;;-1:-1:-1;;76359:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:44::i;:::-;76343:60;;;;:::i;:::-;;-1:-1:-1;76323:3:0;;;;:::i;:::-;;;;76277:138;;;;76197:225;76100:322;;;:::o;76956:502::-;77073:4;77095:30;77128:24;77144:7;77128:15;:24::i;:::-;77095:57;;77168:9;77163:266;77187:13;:20;77183:1;:24;77163:266;;;77229:28;77260:9;:27;77270:13;77284:1;77270:16;;;;;;;;:::i;:::-;;;;;;;77260:27;;;;;;;;;;;77229:58;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77229:58:0;;;-1:-1:-1;;77229:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77340:29;;;;;;77322:12;;;;77306:30;;;;;;;;77229:58;;-1:-1:-1;77306:63:0;77302:116;;;77397:5;77390:12;;;;;;;77302:116;-1:-1:-1;77209:3:0;;;;:::i;:::-;;;;77163:266;;;-1:-1:-1;77446:4:0;;76956:502;-1:-1:-1;;;;76956:502:0:o;55379:602::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;55560:20:::1;::::0;-1:-1:-1;;;;;55560:20:0::1;11149::::0;;11197:8;;55614:89:::1;;;-1:-1:-1::0;;;;;;55672:31:0;::::1;::::0;55614:89:::1;55592:227;;;::::0;-1:-1:-1;;;55592:227:0;;16493:2:1;55592:227:0::1;::::0;::::1;16475:21:1::0;16532:2;16512:18;;;16505:30;16571:34;16551:18;;;16544:62;16642:34;16622:18;;;16615:62;-1:-1:-1;;;16693:19:1;;;16686:55;16758:19;;55592:227:0::1;16291:492:1::0;55592:227:0::1;55830:20;:63:::0;;-1:-1:-1;;;;;;55830:63:0::1;-1:-1:-1::0;;;;;55830:63:0;;::::1;::::0;;::::1;::::0;;;55909:64:::1;::::0;55830:63;;55909:64;::::1;::::0;::::1;::::0;-1:-1:-1;;55909:64:0::1;55513:468;55379:602:::0;:::o;36673:256::-;36770:7;36806:23;36823:5;36806:16;:23::i;:::-;36798:5;:31;36790:87;;;;-1:-1:-1;;;36790:87:0;;16990:2:1;36790:87:0;;;16972:21:1;17029:2;17009:18;;;17002:30;17068:34;17048:18;;;17041:62;-1:-1:-1;;;17119:18:1;;;17112:41;17170:19;;36790:87:0;16788:407:1;36790:87:0;-1:-1:-1;;;;;;36895:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36673:256::o;77466:119::-;77531:4;77576:1;77555:18;77565:7;77555:9;:18::i;:::-;:22;;77466:119;-1:-1:-1;;77466:119:0:o;81032:65::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;81079:10:::1;:8;:10::i;:::-;81032:65::o:0;67807:677::-;45974:1;46572:7;;:19;;46564:63;;;;-1:-1:-1;;;46564:63:0;;;;;;;:::i;:::-;45974:1;46705:7;:18;683:10;;61292:111:::1;;;;-1:-1:-1::0;;;61292:111:0::1;;;;;;;:::i;:::-;61436:25;61454:6;61436:17;:25::i;:::-;61414:117;;;;-1:-1:-1::0;;;61414:117:0::1;;;;;;;:::i;:::-;61565:20;::::0;:42:::1;::::0;-1:-1:-1;;;61565:42:0;;-1:-1:-1;;;;;61565:20:0;;::::1;::::0;:34:::1;::::0;:42:::1;::::0;61600:6;;61565:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61564:43;61542:135;;;;-1:-1:-1::0;;;61542:135:0::1;;;;;;;:::i;:::-;67943:10:::0;683;61810:25:::2;67943:10:::0;61810:13:::2;:25::i;:::-;61802:74;;;;-1:-1:-1::0;;;61802:74:0::2;;;;;;;:::i;:::-;61909:36;61926:6;61934:10;61909:16;:36::i;:::-;61887:127;;;;-1:-1:-1::0;;;61887:127:0::2;;;;;;;:::i;:::-;47975:7:::0;;;;48229:9:::3;48221:38;;;;-1:-1:-1::0;;;48221:38:0::3;;;;;;;:::i;:::-;62109:11:::4;::::0;-1:-1:-1;;;;;62109:11:0::4;62079:116;;;;-1:-1:-1::0;;;62079:116:0::4;;;;;;;:::i;:::-;683:10:::0;68018:15:::5;::::0;68146:38:::5;68173:10:::0;68146:26:::5;:38::i;:::-;68061:123;;;;68236:1;68217:16;:20;68195:122;;;::::0;-1:-1:-1;;;68195:122:0;;20765:2:1;68195:122:0::5;::::0;::::5;20747:21:1::0;20804:2;20784:18;;;20777:30;20843:34;20823:18;;;20816:62;-1:-1:-1;;;20894:18:1;;;20887:50;20954:19;;68195:122:0::5;20563:416:1::0;68195:122:0::5;68332:13:::0;;68328:84:::5;;68362:11;::::0;:38:::5;::::0;-1:-1:-1;;;68362:38:0;;::::5;::::0;::::5;2319:25:1::0;;;-1:-1:-1;;;;;68362:11:0;;::::5;::::0;:27:::5;::::0;2292:18:1;;68362:38:0::5;;;;;;;;;;;;;;;;;::::0;::::5;;;;;;;;;;;;::::0;::::5;;;;;;;;;68328:84;68447:10;68438:7;-1:-1:-1::0;;;;;68429:47:0::5;;68459:16;68429:47;;;;2319:25:1::0;;2307:2;2292:18;;2173:177;68429:47:0::5;;;;;;;;-1:-1:-1::0;;45930:1:0;46884:7;:22;-1:-1:-1;;;;;67807:677:0:o;25895:185::-;26033:39;26050:4;26056:2;26060:7;26033:39;;;;;;;;;;;;:16;:39::i;37195:233::-;37270:7;37306:30;37093:10;:17;;37005:113;37306:30;37298:5;:38;37290:95;;;;-1:-1:-1;;;37290:95:0;;21186:2:1;37290:95:0;;;21168:21:1;21225:2;21205:18;;;21198:30;21264:34;21244:18;;;21237:62;-1:-1:-1;;;21315:18:1;;;21308:42;21367:19;;37290:95:0;20984:408:1;37290:95:0;37403:10;37414:5;37403:17;;;;;;;;:::i;:::-;;;;;;;;;37396:24;;37195:233;;;:::o;63768:2024::-;63935:7;45974:1;46572:7;;:19;;46564:63;;;;-1:-1:-1;;;46564:63:0;;;;;;;:::i;:::-;45974:1;46705:7;:18;47975:7;;;;48229:9:::1;48221:38;;;;-1:-1:-1::0;;;48221:38:0::1;;;;;;;:::i;:::-;62109:11:::2;::::0;-1:-1:-1;;;;;62109:11:0::2;62079:116;;;;-1:-1:-1::0;;;62079:116:0::2;;;;;;;:::i;:::-;64019:25:::0;;683:10;;64047:1:::3;-1:-1:-1::0;64019:63:0;::::3;;;;64080:2;64058:11;64052:25;:30;64019:63;63997:169;;;::::0;-1:-1:-1;;;63997:169:0;;21599:2:1;63997:169:0::3;::::0;::::3;21581:21:1::0;21638:2;21618:18;;;21611:30;21677:34;21657:18;;;21650:62;-1:-1:-1;;;21728:18:1;;;21721:54;21792:19;;63997:169:0::3;21397:420:1::0;63997:169:0::3;64215:16;;64199:12;:32;;64177:123;;;::::0;-1:-1:-1;;;64177:123:0;;22024:2:1;64177:123:0::3;::::0;::::3;22006:21:1::0;22063:2;22043:18;;;22036:30;22102:34;22082:18;;;22075:62;-1:-1:-1;;;22153:18:1;;;22146:39;22202:19;;64177:123:0::3;21822:405:1::0;64177:123:0::3;64333:36;64349:6;64357:11;64333:15;:36::i;:::-;64311:114;;;::::0;-1:-1:-1;;;64311:114:0;;22434:2:1;64311:114:0::3;::::0;::::3;22416:21:1::0;22473:2;22453:18;;;22446:30;22512;22492:18;;;22485:58;22560:18;;64311:114:0::3;22232:352:1::0;64311:114:0::3;64491:16;::::0;64458:11:::3;::::0;:29:::3;::::0;-1:-1:-1;;;64458:29:0;;-1:-1:-1;;;;;64458:11:0;;::::3;::::0;:21:::3;::::0;:29:::3;::::0;64480:6;;64458:29:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;64436:137;;;::::0;-1:-1:-1;;;64436:137:0;;22980:2:1;64436:137:0::3;::::0;::::3;22962:21:1::0;23019:2;22999:18;;;22992:30;23058:34;23038:18;;;23031:62;-1:-1:-1;;;23109:18:1;;;23102:36;23155:19;;64436:137:0::3;22778:402:1::0;64436:137:0::3;64635:11;::::0;:45:::3;::::0;-1:-1:-1;;;64635:45:0;;-1:-1:-1;;;;;64635:11:0;;::::3;::::0;:23:::3;::::0;:45:::3;::::0;64659:6;;64667:12;;64635:45:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;64741:17;64762:85;64793:12;64820:13;64834:1;64820:16;;;;;;;:::i;:::-;;::::0;::::3;::::0;;::::3;::::0;::::3;::::0;;;;::::3;;::::0;::::3;;64762;:85::i;:::-;64858:11;::::0;:38:::3;::::0;-1:-1:-1;;;64858:38:0;;::::3;::::0;::::3;2319:25:1::0;;;64738:109:0;;-1:-1:-1;;;;;;64858:11:0::3;::::0;-1:-1:-1;64858:27:0::3;::::0;2292:18:1;;64858:38:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;64958:27;:15;56964:19:::0;;56982:1;56964:19;;;56875:127;64958:27:::3;64998:20;65021:25;:15;56845:14:::0;;56753:114;65021:25:::3;64998:48;;65057:19;65079:15;65057:37;;65159:12;65139:16;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65190:9:0::3;:12:::0;65182:43:::3;::::0;65190:12:::3;;65211::::0;65182:7:::3;:43::i;:::-;65288:317;;;;;;;;65321:12;65288:317;;;;65354:11;65288:317;;;;65394:11;65288:317;;;;65445:11;65288:317;;;;65483:9;65493:1;65483:12;;;;;;;:::i;:::-;;::::0;;::::3;::::0;;;::::3;::::0;;;::::3;;;;;::::0;::::3;;;65288:317:::0;;::::3;::::0;;::::3;::::0;;;-1:-1:-1;65288:317:0;;;;;;;65589:4:::3;65288:317:::0;;;;;;;65262:23;;;:9:::3;:23:::0;;;;:343;;;;;;::::3;::::0;;;:23;;:343:::3;::::0;;;::::3;::::0;;::::3;::::0;::::3;:::i;:::-;-1:-1:-1::0;65262:343:0::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;;::::3;::::0;::::3;::::0;;::::3;::::0;;-1:-1:-1;;65262:343:0::3;::::0;::::3;;::::0;;;::::3;::::0;;65665:27:::3;65671:6:::0;65679:12;65665:5:::3;:27::i;:::-;65725:12;65717:6;-1:-1:-1::0;;;;;65710:42:0::3;;65739:12;65710:42;;;;2319:25:1::0;;2307:2;2292:18;;2173:177;65710:42:0::3;;;;;;;;-1:-1:-1::0;45930:1:0;46884:7;:22;65772:12;63768:2024;-1:-1:-1;;;;;63768:2024:0:o;67253:546::-;45974:1;46572:7;;:19;;46564:63;;;;-1:-1:-1;;;46564:63:0;;;;;;;:::i;:::-;45974:1;46705:7;:18;683:10;;61292:111:::1;;;;-1:-1:-1::0;;;61292:111:0::1;;;;;;;:::i;:::-;61436:25;61454:6;61436:17;:25::i;:::-;61414:117;;;;-1:-1:-1::0;;;61414:117:0::1;;;;;;;:::i;:::-;61565:20;::::0;:42:::1;::::0;-1:-1:-1;;;61565:42:0;;-1:-1:-1;;;;;61565:20:0;;::::1;::::0;:34:::1;::::0;:42:::1;::::0;61600:6;;61565:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61564:43;61542:135;;;;-1:-1:-1::0;;;61542:135:0::1;;;;;;;:::i;:::-;47975:7:::0;;;;48229:9:::2;48221:38;;;;-1:-1:-1::0;;;48221:38:0::2;;;;;;;:::i;:::-;62109:11:::3;::::0;-1:-1:-1;;;;;62109:11:0::3;62079:116;;;;-1:-1:-1::0;;;62079:116:0::3;;;;;;;:::i;:::-;683:10:::0;67404:15:::4;::::0;67515:24:::4;683:10:::0;67515:15:::4;:24::i;:::-;67482:57;;67555:9;67550:137;67574:13;:20;67570:1;:24;67550:137;;;67632:43;67658:13;67672:1;67658:16;;;;;;;;:::i;:::-;;;;;;;67632:25;:43::i;:::-;67616:59;::::0;;::::4;:::i;:::-;::::0;-1:-1:-1;67596:3:0;::::4;::::0;::::4;:::i;:::-;;;;67550:137;;;;67697:28;67712:12;67697:14;:28::i;:::-;67763:13;67743:48;;;;;;:::i;:::-;;;;;;;;67754:7;-1:-1:-1::0;;;;;67743:48:0::4;;67778:12;67743:48;;;;2319:25:1::0;;2307:2;2292:18;;2173:177;67743:48:0::4;;;;;;;;-1:-1:-1::0;;45930:1:0;46884:7;:22;-1:-1:-1;;67253:546:0:o;52008:182::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;52145:37:::1;::::0;-1:-1:-1;;;52145:37:0;;-1:-1:-1;;;;;52145:23:0;::::1;::::0;::::1;::::0;:37:::1;::::0;52169:3;;52174:7;;52145:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52008:182:::0;;;:::o;22870:239::-;22942:7;22978:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22978:16:0;23013:19;23005:73;;;;-1:-1:-1;;;23005:73:0;;24214:2:1;23005:73:0;;;24196:21:1;24253:2;24233:18;;;24226:30;24292:34;24272:18;;;24265:62;-1:-1:-1;;;24343:18:1;;;24336:39;24392:19;;23005:73:0;24012:405:1;65800:400:0;45974:1;46572:7;;:19;;46564:63;;;;-1:-1:-1;;;46564:63:0;;;;;;;:::i;:::-;45974:1;46705:7;:18;683:10;;61292:111:::1;;;;-1:-1:-1::0;;;61292:111:0::1;;;;;;;:::i;:::-;61436:25;61454:6;61436:17;:25::i;:::-;61414:117;;;;-1:-1:-1::0;;;61414:117:0::1;;;;;;;:::i;:::-;61565:20;::::0;:42:::1;::::0;-1:-1:-1;;;61565:42:0;;-1:-1:-1;;;;;61565:20:0;;::::1;::::0;:34:::1;::::0;:42:::1;::::0;61600:6;;61565:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61564:43;61542:135;;;;-1:-1:-1::0;;;61542:135:0::1;;;;;;;:::i;:::-;65935:10:::0;683;61810:25:::2;65935:10:::0;61810:13:::2;:25::i;:::-;61802:74;;;;-1:-1:-1::0;;;61802:74:0::2;;;;;;;:::i;:::-;61909:36;61926:6;61934:10;61909:16;:36::i;:::-;61887:127;;;;-1:-1:-1::0;;;61887:127:0::2;;;;;;;:::i;:::-;47975:7:::0;;;;48229:9:::3;48221:38;;;;-1:-1:-1::0;;;48221:38:0::3;;;;;;;:::i;:::-;62109:11:::4;::::0;-1:-1:-1;;;;;62109:11:0::4;62079:116;;;;-1:-1:-1::0;;;62079:116:0::4;;;;;;;:::i;:::-;683:10:::0;66010:15:::5;66068:37;66094:10:::0;66068:25:::5;:37::i;:::-;66051:54;;66116:22;66131:6;66116:14;:22::i;:::-;66173:10;66164:7;-1:-1:-1::0;;;;;66156:36:0::5;;66185:6;66156:36;;;;2319:25:1::0;;2307:2;2292:18;;2173:177;66156:36:0::5;;;;;;;;-1:-1:-1::0;;45930:1:0;46884:7;:22;-1:-1:-1;;;;65800:400:0:o;22600:208::-;22672:7;-1:-1:-1;;;;;22700:19:0;;22692:74;;;;-1:-1:-1;;;22692:74:0;;24624:2:1;22692:74:0;;;24606:21:1;24663:2;24643:18;;;24636:30;24702:34;24682:18;;;24675:62;-1:-1:-1;;;24753:18:1;;;24746:40;24803:19;;22692:74:0;24422:406:1;22692:74:0;-1:-1:-1;;;;;;22784:16:0;;;;;:9;:16;;;;;;;22600:208::o;2387:103::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;2452:30:::1;2479:1;2452:18;:30::i;66208:1037::-:0;45974:1;46572:7;;:19;;46564:63;;;;-1:-1:-1;;;46564:63:0;;;;;;;:::i;:::-;45974:1;46705:7;:18;683:10;;61292:111:::1;;;;-1:-1:-1::0;;;61292:111:0::1;;;;;;;:::i;:::-;61436:25;61454:6;61436:17;:25::i;:::-;61414:117;;;;-1:-1:-1::0;;;61414:117:0::1;;;;;;;:::i;:::-;61565:20;::::0;:42:::1;::::0;-1:-1:-1;;;61565:42:0;;-1:-1:-1;;;;;61565:20:0;;::::1;::::0;:34:::1;::::0;:42:::1;::::0;61600:6;;61565:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61564:43;61542:135;;;;-1:-1:-1::0;;;61542:135:0::1;;;;;;;:::i;:::-;66370:10:::0;683;61810:25:::2;66370:10:::0;61810:13:::2;:25::i;:::-;61802:74;;;;-1:-1:-1::0;;;61802:74:0::2;;;;;;;:::i;:::-;61909:36;61926:6;61934:10;61909:16;:36::i;:::-;61887:127;;;;-1:-1:-1::0;;;61887:127:0::2;;;;;;;:::i;:::-;47975:7:::0;;;;48229:9:::3;48221:38;;;;-1:-1:-1::0;;;48221:38:0::3;;;;;;;:::i;:::-;62109:11:::4;::::0;-1:-1:-1;;;;;62109:11:0::4;62079:116;;;;-1:-1:-1::0;;;62079:116:0::4;;;;;;;:::i;:::-;66508:25:::0;;683:10;;66536:1:::5;-1:-1:-1::0;66508:63:0;::::5;;;;66569:2;66547:11;66541:25;:30;66508:63;66486:169;;;::::0;-1:-1:-1;;;66486:169:0;;25035:2:1;66486:169:0::5;::::0;::::5;25017:21:1::0;25074:2;25054:18;;;25047:30;25113:34;25093:18;;;25086:62;-1:-1:-1;;;25164:18:1;;;25157:54;25228:19;;66486:169:0::5;24833:420:1::0;66486:169:0::5;66666:29;66698:21:::0;;;:9:::5;:21;::::0;;;;66738:20:::5;::::0;::::5;::::0;66730:60:::5;;;::::0;-1:-1:-1;;;66730:60:0;;25460:2:1;66730:60:0::5;::::0;::::5;25442:21:1::0;25499:2;25479:18;;;25472:30;-1:-1:-1;;;25518:18:1;;;25511:53;25581:18;;66730:60:0::5;25258:347:1::0;66730:60:0::5;66802:23;66827:17:::0;66848:93:::5;66879:7;:20;;;66914:13;66928:1;66914:16;;;;;;;:::i;66848:93::-;66801:140;;;;66952:47;66960:7;:18;;;66988:9;66980:18;;;:::i;:::-;66952:7;:47::i;:::-;67032:9;67010:18;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;67052:20:0::5;::::0;::::5;:38:::0;;;67130:12:::5;::::0;::::5;67101:41:::0;;:26:::5;::::0;67130:12;67101:41:::5;::::0;::::5;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;67153:26:0;;67101:41;;-1:-1:-1;67153:26:0::5;::::0;:12:::5;::::0;::::5;::::0;-1:-1:-1;67153:26:0::5;::::0;::::5;::::0;-1:-1:-1;67153:26:0;-1:-1:-1;67153:26:0::5;:::i;:::-;;67225:11;67195:42;;;;;;:::i;:::-;;;;;;;;67211:12;67195:42;;;;;;:::i;:::-;;::::0;;;;::::5;::::0;;;-1:-1:-1;;;;;67195:42:0;::::5;::::0;::::5;::::0;;;::::5;-1:-1:-1::0;;45930:1:0;46884:7;:22;-1:-1:-1;;;;;;;;66208:1037:0:o;79339:268::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;79464:1:::1;79444:17;:21;79422:130;;;::::0;-1:-1:-1;;;79422:130:0;;26234:2:1;79422:130:0::1;::::0;::::1;26216:21:1::0;26273:2;26253:18;;;26246:30;26312:34;26292:18;;;26285:62;26383:29;26363:18;;;26356:57;26430:19;;79422:130:0::1;26032:423:1::0;79422:130:0::1;79563:16;:36:::0;79339:268::o;80963:61::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;81008:8:::1;:6;:8::i;76430:518::-:0;76492:7;;;76548:362;76572:13;:20;76568:24;;76548:362;;;76614:30;76647:13;:31;76661:13;76675:1;76661:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;76647:31;;;;;;;;;;;;;;;76614:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76871:12;;76614:64;;-1:-1:-1;76710:188:0;;76614:64;60667:5;;76710:26;:188::i;:::-;76693:205;;;;:::i;:::-;;;76599:311;76594:3;;;;;:::i;:::-;;;;76548:362;;;-1:-1:-1;76927:13:0;76430:518;-1:-1:-1;76430:518:0:o;1736:87::-;1809:6;;;;;-1:-1:-1;;;;;1809:6:0;;1736:87::o;80113:450::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;80500:22:::1;:9;80512:10:::0;80500:22:::1;;:::i;:::-;-1:-1:-1::0;80533:22:0::1;:9;80545:10:::0;80533:22:::1;;:::i;77988:589::-:0;78078:16;78112:24;78139:18;78149:7;78139:9;:18::i;:::-;78112:45;;78168:27;78212:16;-1:-1:-1;;;;;78198:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78198:31:0;;78168:61;;78245:9;78240:302;78264:16;78260:1;:20;78240:302;;;78302:17;78322:31;78342:7;78351:1;78322:19;:31::i;:::-;78302:51;;78394:24;78408:9;78394:13;:24::i;:::-;78368:122;;;;-1:-1:-1;;;78368:122:0;;;;;;;:::i;:::-;78521:9;78505:10;78516:1;78505:13;;;;;;;;:::i;:::-;;;;;;;;;;:25;-1:-1:-1;78282:3:0;;;;:::i;:::-;;;;78240:302;;;-1:-1:-1;78559:10:0;77988:589;-1:-1:-1;;;77988:589:0:o;80571:384::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;80659:8;;80671:2:::1;80659:14;::::0;;::::1;;;80651:56;;;::::0;-1:-1:-1;;;80651:56:0;;27484:2:1;80651:56:0::1;::::0;::::1;27466:21:1::0;27523:2;27503:18;;;27496:30;27562:31;27542:18;;;27535:59;27611:18;;80651:56:0::1;27282:353:1::0;80651:56:0::1;80738:2;80726:5:::0;80732:1:::1;80726:8;;;;:14;;;;80718:57;;;::::0;-1:-1:-1;;;80718:57:0;;27842:2:1;80718:57:0::1;::::0;::::1;27824:21:1::0;27881:2;27861:18;;;27854:30;27920:32;27900:18;;;27893:60;27970:18;;80718:57:0::1;27640:354:1::0;80718:57:0::1;80806:2;80794:5:::0;80800:1:::1;80794:8;;;;:14;;;;80786:60;;;::::0;-1:-1:-1;;;80786:60:0;;28201:2:1;80786:60:0::1;::::0;::::1;28183:21:1::0;28240:2;28220:18;;;28213:30;28279:34;28259:18;;;28252:62;-1:-1:-1;;;28330:18:1;;;28323:31;28371:19;;80786:60:0::1;27999:397:1::0;80786:60:0::1;80877:2;80865:5:::0;80871:1:::1;80865:8;;;;:14;;;;80857:58;;;::::0;-1:-1:-1;;;80857:58:0;;28603:2:1;80857:58:0::1;::::0;::::1;28585:21:1::0;28642:2;28622:18;;;28615:30;28681:33;28661:18;;;28654:61;28732:18;;80857:58:0::1;28401:355:1::0;80857:58:0::1;80926:21;:13;80942:5:::0;80926:21:::1;;:::i;:::-;;80571:384:::0;:::o;23345:104::-;23401:13;23434:7;23427:14;;;;;:::i;68492:1172::-;45974:1;46572:7;;:19;;46564:63;;;;-1:-1:-1;;;46564:63:0;;;;;;;:::i;:::-;45974:1;46705:7;:18;683:10;;61292:111:::1;;;;-1:-1:-1::0;;;61292:111:0::1;;;;;;;:::i;:::-;61436:25;61454:6;61436:17;:25::i;:::-;61414:117;;;;-1:-1:-1::0;;;61414:117:0::1;;;;;;;:::i;:::-;61565:20;::::0;:42:::1;::::0;-1:-1:-1;;;61565:42:0;;-1:-1:-1;;;;;61565:20:0;;::::1;::::0;:34:::1;::::0;:42:::1;::::0;61600:6;;61565:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61564:43;61542:135;;;;-1:-1:-1::0;;;61542:135:0::1;;;;;;;:::i;:::-;47975:7:::0;;;;48229:9:::2;48221:38;;;;-1:-1:-1::0;;;48221:38:0::2;;;;;;;:::i;:::-;62109:11:::3;::::0;-1:-1:-1;;;;;62109:11:0::3;62079:116;;;;-1:-1:-1::0;;;62079:116:0::3;;;;;;;:::i;:::-;683:10:::0;68644:15:::4;::::0;;68791:24:::4;683:10:::0;68791:15:::4;:24::i;:::-;68758:57;;68826:33;68876:13;:20;-1:-1:-1::0;;;;;68862:35:0::4;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;68862:35:0::4;;68826:71;;68915:9;68910:497;68934:13;:20;68930:1;:24;68910:497;;;68995:24;69038:17:::0;69073:44:::4;69100:13;69114:1;69100:16;;;;;;;;:::i;:::-;;;;;;;69073:26;:44::i;:::-;68976:141:::0;;-1:-1:-1;68976:141:0;-1:-1:-1;69136:20:0;;69132:264:::4;;69199:13;69213:1;69199:16;;;;;;;;:::i;:::-;;;;;;;69177;69194:1;69177:19;;;;;;;;:::i;:::-;;::::0;;::::4;::::0;;;;;:38;69234:23:::4;69248:9:::0;69234:23;::::4;:::i;:::-;::::0;-1:-1:-1;69276:37:0::4;69297:16:::0;69276:37;::::4;:::i;:::-;;;69132:264;;;69361:16;69378:1;69361:19;;;;;;;;:::i;:::-;;;;;;69354:26;;;::::0;69132:264:::4;68961:446;;68956:3;;;;;:::i;:::-;;;;68910:497;;;;69447:1;69427:17;:21;69419:66;;;::::0;-1:-1:-1;;;69419:66:0;;28963:2:1;69419:66:0::4;::::0;::::4;28945:21:1::0;;;28982:18;;;28975:30;29041:34;29021:18;;;29014:62;29093:18;;69419:66:0::4;28761:356:1::0;69419:66:0::4;69500:14:::0;;69496:86:::4;;69531:11;::::0;:39:::4;::::0;-1:-1:-1;;;69531:39:0;;::::4;::::0;::::4;2319:25:1::0;;;-1:-1:-1;;;;;69531:11:0;;::::4;::::0;:27:::4;::::0;2292:18:1;;69531:39:0::4;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;69496:86;69620:16;69599:57;;;;;;:::i;:::-;;;;;;;;69611:7;-1:-1:-1::0;;;;;69599:57:0::4;;69638:17;69599:57;;;;2319:25:1::0;;2307:2;2292:18;;2173:177;25028:155:0;25123:52;683:10;25156:8;25166;25123:18;:52::i;51887:113::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;51952:7:::1;:5;:7::i;:::-;-1:-1:-1::0;;;;;51944:25:0::1;:48;51970:21;51944:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51887:113::o:0;77593:387::-;77704:4;77726:29;77758:24;77774:7;77758:15;:24::i;:::-;77726:56;;77798:9;77793:157;77817:12;:19;77813:1;:23;77793:157;;;77881:10;77862:12;77875:1;77862:15;;;;;;;;:::i;:::-;;;;;;;:29;77858:81;;;77919:4;77912:11;;;;;;77858:81;77838:3;;;;:::i;:::-;;;;77793:157;;;-1:-1:-1;77967:5:0;;77593:387;-1:-1:-1;;;;77593:387:0:o;60564:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26151:328::-;26326:41;683:10;26359:7;26326:18;:41::i;:::-;26318:103;;;;-1:-1:-1;;;26318:103:0;;;;;;;:::i;:::-;26432:39;26446:4;26452:2;26456:7;26465:5;26432:13;:39::i;75767:325::-;75848:17;75878:30;75911:25;75927:8;75911:15;:25::i;:::-;75878:58;;75952:9;75947:138;75971:13;:20;75967:1;:24;75947:138;;;76029:44;76045:9;:27;76055:13;76069:1;76055:16;;;;;;;;:::i;:::-;;;;;;;76045:27;;;;;;;;;;;76029:44;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;76029:44:0;;;-1:-1:-1;;76029:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:44::i;:::-;76013:60;;;;:::i;:::-;;-1:-1:-1;75993:3:0;;;;:::i;:::-;;;;75947:138;;79867:238;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;79984:1:::1;79968:13;:17;79946:112;;;::::0;-1:-1:-1;;;79946:112:0;;29324:2:1;79946:112:0::1;::::0;::::1;29306:21:1::0;29363:2;29343:18;;;29336:30;29402:34;29382:18;;;29375:62;-1:-1:-1;;;29453:18:1;;;29446:43;29506:19;;79946:112:0::1;29122:409:1::0;79946:112:0::1;80069:12;:28:::0;79867:238::o;60526:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63032:728::-;63176:13;63718:34;63744:7;63718:25;:34::i;78585:720::-;78691:26;78735:39;78815:11;:18;-1:-1:-1;;;;;78777:67:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;78735:109;;78860:9;78855:413;78879:11;:18;78875:1;:22;78855:413;;;78919:17;78939:11;78951:1;78939:14;;;;;;;;:::i;:::-;;;;;;;78919:34;;78968:28;78999:9;:20;79009:9;78999:20;;;;;;;;;;;78968:51;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79052:204;;;;;;;;79088:7;79052:204;;;;79114:9;79052:204;;;;79142:24;79158:7;79142:15;:24::i;:::-;79052:204;;;;79185:24;79201:7;79185:15;:24::i;:::-;79052:204;;;;79228:13;;79052:204;;;79034:12;79047:1;79034:15;;;;;;;;:::i;:::-;;;;;;:222;;;;78904:364;;78899:3;;;;;:::i;:::-;;;;78855:413;;;-1:-1:-1;79285:12:0;78585:720;-1:-1:-1;;78585:720:0:o;60597:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;79615:244::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;79735:1:::1;79718:14;:18;79696:114;;;::::0;-1:-1:-1;;;79696:114:0;;29738:2:1;79696:114:0::1;::::0;::::1;29720:21:1::0;29777:2;29757:18;;;29750:30;29816:34;29796:18;;;29789:62;-1:-1:-1;;;29867:18:1;;;29860:44;29921:19;;79696:114:0::1;29536:410:1::0;79696:114:0::1;79821:13;:30:::0;79615:244::o;53209:548::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;53381:11:::1;::::0;-1:-1:-1;;;;;53381:11:0::1;11149:20:::0;;11197:8;;53426:89:::1;;;-1:-1:-1::0;;;;;;53484:31:0;::::1;::::0;53426:89:::1;53404:218;;;::::0;-1:-1:-1;;;53404:218:0;;30153:2:1;53404:218:0::1;::::0;::::1;30135:21:1::0;30192:2;30172:18;;;30165:30;30231:34;30211:18;;;30204:62;30302:34;30282:18;;;30275:62;-1:-1:-1;;;30353:19:1;;;30346:46;30409:19;;53404:218:0::1;29951:483:1::0;53404:218:0::1;53633:11;:45:::0;;-1:-1:-1;;;;;;53633:45:0::1;-1:-1:-1::0;;;;;53633:45:0;;::::1;::::0;;::::1;::::0;;;53694:55:::1;::::0;53633:45;;53694:55;::::1;::::0;::::1;::::0;-1:-1:-1;;53694:55:0::1;53334:423;53209:548:::0;:::o;25254:164::-;-1:-1:-1;;;;;25375:25:0;;;25351:4;25375:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25254:164::o;2645:201::-;683:10;1956:7;:5;:7::i;:::-;-1:-1:-1;;;;;1956:23:0;;1948:68;;;;-1:-1:-1;;;1948:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2734:22:0;::::1;2726:73;;;::::0;-1:-1:-1;;;2726:73:0;;30641:2:1;2726:73:0::1;::::0;::::1;30623:21:1::0;30680:2;30660:18;;;30653:30;30719:34;30699:18;;;30692:62;-1:-1:-1;;;30770:18:1;;;30763:36;30816:19;;2726:73:0::1;30439:402:1::0;2726:73:0::1;2810:28;2829:8;2810:18;:28::i;36365:224::-:0;36467:4;-1:-1:-1;;;;;;36491:50:0;;-1:-1:-1;;;36491:50:0;;:90;;;36545:36;36569:11;36545:23;:36::i;27989:127::-;28054:4;28078:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28078:16:0;:30;;;27989:127::o;31971:174::-;32046:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32046:29:0;-1:-1:-1;;;;;32046:29:0;;;;;;;;:24;;32100:23;32046:24;32100:14;:23::i;:::-;-1:-1:-1;;;;;32091:46:0;;;;;;;;;;;31971:174;;:::o;28283:348::-;28376:4;28401:16;28409:7;28401;:16::i;:::-;28393:73;;;;-1:-1:-1;;;28393:73:0;;31048:2:1;28393:73:0;;;31030:21:1;31087:2;31067:18;;;31060:30;31126:34;31106:18;;;31099:62;-1:-1:-1;;;31177:18:1;;;31170:42;31229:19;;28393:73:0;30846:408:1;28393:73:0;28477:13;28493:23;28508:7;28493:14;:23::i;:::-;28477:39;;28546:5;-1:-1:-1;;;;;28535:16:0;:7;-1:-1:-1;;;;;28535:16:0;;:51;;;;28579:7;-1:-1:-1;;;;;28555:31:0;:20;28567:7;28555:11;:20::i;:::-;-1:-1:-1;;;;;28555:31:0;;28535:51;:87;;;;28590:32;28607:5;28614:7;28590:16;:32::i;:::-;28527:96;28283:348;-1:-1:-1;;;;28283:348:0:o;31275:578::-;31434:4;-1:-1:-1;;;;;31407:31:0;:23;31422:7;31407:14;:23::i;:::-;-1:-1:-1;;;;;31407:31:0;;31399:85;;;;-1:-1:-1;;;31399:85:0;;31461:2:1;31399:85:0;;;31443:21:1;31500:2;31480:18;;;31473:30;31539:34;31519:18;;;31512:62;-1:-1:-1;;;31590:18:1;;;31583:39;31639:19;;31399:85:0;31259:405:1;31399:85:0;-1:-1:-1;;;;;31503:16:0;;31495:65;;;;-1:-1:-1;;;31495:65:0;;31871:2:1;31495:65:0;;;31853:21:1;31910:2;31890:18;;;31883:30;31949:34;31929:18;;;31922:62;-1:-1:-1;;;32000:18:1;;;31993:34;32044:19;;31495:65:0;31669:400:1;31495:65:0;31573:39;31594:4;31600:2;31604:7;31573:20;:39::i;:::-;31677:29;31694:1;31698:7;31677:8;:29::i;:::-;-1:-1:-1;;;;;31719:15:0;;;;;;:9;:15;;;;;:20;;31738:1;;31719:15;:20;;31738:1;;31719:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31750:13:0;;;;;;:9;:13;;;;;:18;;31767:1;;31750:13;:18;;31767:1;;31750:18;:::i;:::-;;;;-1:-1:-1;;31779:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31779:21:0;-1:-1:-1;;;;;31779:21:0;;;;;;;;;31818:27;;31779:16;;31818:27;;;;;;;31275:578;;;:::o;74276:373::-;74380:7;74425:216;74470:7;:20;;;74509:7;:18;;;74564:7;:31;;;74546:15;:49;;;;:::i;:::-;74614:12;;74425:26;:216::i;48963:120::-;47975:7;;;;48499:41;;;;-1:-1:-1;;;48499:41:0;;32406:2:1;48499:41:0;;;32388:21:1;32445:2;32425:18;;;32418:30;-1:-1:-1;;;32464:18:1;;;32457:50;32524:18;;48499:41:0;32204:344:1;48499:41:0;49022:7:::1;:15:::0;;-1:-1:-1;;49022:15:0::1;::::0;;49053:22:::1;683:10:::0;49062:12:::1;49053:22;;;;;;:::i;:::-;;;;;;;;48963:120::o:0;75419:308::-;75484:4;75522:1;75509:10;:14;75501:64;;;;-1:-1:-1;;;75501:64:0;;32755:2:1;75501:64:0;;;32737:21:1;32794:2;32774:18;;;32767:30;32833:34;32813:18;;;32806:62;-1:-1:-1;;;32884:18:1;;;32877:35;32929:19;;75501:64:0;32553:401:1;75501:64:0;75576:28;75607:9;:21;75617:10;75607:21;;;;;;;;;;;75576:52;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75576:52:0;;;-1:-1:-1;;75576:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75643:14;;;;75576:52;;-1:-1:-1;75639:58:0;;;-1:-1:-1;75681:4:0;;75419:308;-1:-1:-1;;75419:308:0:o;75639:58::-;-1:-1:-1;75714:5:0;;75419:308;-1:-1:-1;;75419:308:0:o;70395:988::-;70486:7;70495;70520:29;70552:9;:21;70562:10;70552:21;;;;;;;;;;;70520:53;;70591:22;70605:7;70591:22;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70591:22:0;;;-1:-1:-1;;70591:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:22::i;:::-;70586:69;;-1:-1:-1;70638:1:0;;;;-1:-1:-1;70395:988:0;-1:-1:-1;;70395:988:0:o;70586:69::-;70667:14;70684:24;70700:7;70684:24;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70667:41;-1:-1:-1;70723:10:0;;70719:631;;70751:24;;70798:91;70833:6;70858:13;70872:1;70858:16;;70798:91;70750:139;;;;70924:16;70904;;:36;;;;;;;:::i;:::-;;;;;;;;70957:58;70965:7;:18;;;70993:7;:20;;;70985:29;;;:::i;70957:58::-;71066:15;71032:7;:31;;:49;;;;71120:16;71096:7;:20;;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;;71192:18:0;;;;71173:38;;:18;:38::i;:::-;71151:7;:18;;;:60;;;;;;;:::i;:::-;;;;;;;;71228:57;71236:7;:18;;;71263:7;:20;;;71228:7;:57::i;:::-;71310:16;;71328:9;;-1:-1:-1;70395:988:0;-1:-1:-1;;;;70395:988:0:o;70719:631::-;-1:-1:-1;71370:1:0;;;;-1:-1:-1;70395:988:0;-1:-1:-1;;;70395:988:0:o;73114:337::-;73231:7;;;73301:14;;73297:92;;73374:3;73345:25;73360:10;73345:12;:25;:::i;:::-;73344:33;;;;:::i;:::-;73332:45;;73297:92;73407:24;73422:9;73407:12;:24;:::i;:::-;73399:44;73433:9;;-1:-1:-1;73114:337:0;-1:-1:-1;;;73114:337:0:o;71933:1140::-;71998:31;72032:19;;;:13;:19;;;;;72066:18;;;;;;72062:1004;;;72127:22;;:30;;72101:142;;;;-1:-1:-1;;;72101:142:0;;33591:2:1;72101:142:0;;;33573:21:1;33630:2;33610:18;;;33603:30;33669:34;33649:18;;;33642:62;-1:-1:-1;;;33720:18:1;;;33713:48;33778:19;;72101:142:0;33389:414:1;72101:142:0;72258:26;72354:6;72320:11;:30;;;72313:47;;;;:::i;:::-;72258:117;-1:-1:-1;72535:30:0;;;:51;24328:341;24258:411;;:::o;72062:1004::-;72711:1;72702:6;:10;72676:154;;;;-1:-1:-1;;;72676:154:0;;34694:2:1;72676:154:0;;;34676:21:1;34733:2;34713:18;;;34706:30;34772:34;34752:18;;;34745:62;34843:34;34823:18;;;34816:62;-1:-1:-1;;;34894:19:1;;;34887:49;34953:19;;72676:154:0;34492:486:1;72676:154:0;-1:-1:-1;72867:148:0;;;;;;;;;;;;;;;;;;72995:4;72867:148;;;;;;-1:-1:-1;72845:19:0;;;:13;:19;;;;;;:170;;;;;;;;;;;;;;;;;;-1:-1:-1;;72845:170:0;;;;;;;;;;73030:13;:24;;;;;;;;;;;;71933:1140::o;29967:382::-;-1:-1:-1;;;;;30047:16:0;;30039:61;;;;-1:-1:-1;;;30039:61:0;;35185:2:1;30039:61:0;;;35167:21:1;;;35204:18;;;35197:30;35263:34;35243:18;;;35236:62;35315:18;;30039:61:0;34983:356:1;30039:61:0;30120:16;30128:7;30120;:16::i;:::-;30119:17;30111:58;;;;-1:-1:-1;;;30111:58:0;;35546:2:1;30111:58:0;;;35528:21:1;35585:2;35565:18;;;35558:30;35624;35604:18;;;35597:58;35672:18;;30111:58:0;35344:352:1;30111:58:0;30182:45;30211:1;30215:2;30219:7;30182:20;:45::i;:::-;-1:-1:-1;;;;;30240:13:0;;;;;;:9;:13;;;;;:18;;30257:1;;30240:13;:18;;30257:1;;30240:18;:::i;:::-;;;;-1:-1:-1;;30269:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30269:21:0;-1:-1:-1;;;;;30269:21:0;;;;;;;;30308:33;;30269:16;;;30308:33;;30269:16;;30308:33;29967:382;;:::o;69707:680::-;69797:7;69822:29;69854:9;:21;69864:10;69854:21;;;;;;;;;;;69822:53;;69893:22;69907:7;69893:22;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69888:64;;-1:-1:-1;69939:1:0;;69707:680;-1:-1:-1;;69707:680:0:o;69888:64::-;69964:14;69981:24;69997:7;69981:24;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69964:41;;70040:6;70016:7;:20;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;70085:9:0;:12;70063:18;;;;70085:12;;;;70063:34;70059:191;;70114:58;70122:7;:18;;;70150:7;:20;;;70142:29;;;:::i;70114:58::-;70195:9;:12;70216:20;;;;70187:51;;70195:12;;;70187:7;:51::i;:::-;70283:9;:12;;;70262:18;;;:33;70340:15;70283:12;70306:31;;;:49;;;;;;-1:-1:-1;;69707:680:0:o;71391:534::-;71481:1;71472:6;:10;71450:110;;;;-1:-1:-1;;;71450:110:0;;35903:2:1;71450:110:0;;;35885:21:1;35942:2;35922:18;;;35915:30;35981:34;35961:18;;;35954:62;-1:-1:-1;;;36032:18:1;;;36025:48;36090:19;;71450:110:0;35701:414:1;71450:110:0;683:10;71571;;71653:79;71684:6;71705:13;71719:1;71705:16;;71653:79;71743:11;;:45;;-1:-1:-1;;;71743:45:0;;71607:125;;-1:-1:-1;71607:125:0;;-1:-1:-1;;;;;;71743:11:0;;:25;;:45;;71769:2;;71607:125;;71743:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;71879:11:0;;:38;;-1:-1:-1;;;71879:38:0;;;;;2319:25:1;;;-1:-1:-1;;;;;71879:11:0;;;;-1:-1:-1;71879:27:0;;-1:-1:-1;2292:18:1;;71879:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71439:486;;;71391:534;:::o;3006:191::-;3099:6;;;-1:-1:-1;;;;;3116:17:0;;;3099:6;3116:17;;;-1:-1:-1;;;;;;3116:17:0;;;;;;3149:40;;3099:6;;;;;;;;3149:40;;3080:16;;3149:40;3069:128;3006:191;:::o;48704:118::-;47975:7;;;;48229:9;48221:38;;;;-1:-1:-1;;;48221:38:0;;;;;;;:::i;:::-;48764:7:::1;:14:::0;;-1:-1:-1;;48764:14:0::1;48774:4;48764:14;::::0;;48794:20:::1;48801:12;683:10:::0;;603:98;74996:415;75186:7;;75257;75225:28;75240:13;75225:12;:28;:::i;:::-;75224:40;;;;:::i;:::-;75206:58;-1:-1:-1;75275:28:0;75332:6;75307:21;75317:11;75206:58;75307:21;:::i;:::-;75306:32;;;;:::i;:::-;75275:63;-1:-1:-1;75397:6:0;75357:36;75380:13;75275:63;75357:36;:::i;:::-;75356:47;;;;:::i;:::-;75349:54;74996:415;-1:-1:-1;;;;;;;74996:415:0:o;32287:315::-;32442:8;-1:-1:-1;;;;;32433:17:0;:5;-1:-1:-1;;;;;32433:17:0;;;32425:55;;;;-1:-1:-1;;;32425:55:0;;36322:2:1;32425:55:0;;;36304:21:1;36361:2;36341:18;;;36334:30;-1:-1:-1;;;36380:18:1;;;36373:55;36445:18;;32425:55:0;36120:349:1;32425:55:0;-1:-1:-1;;;;;32491:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32491:46:0;;;;;;;;;;32553:41;;540::1;;;32553::0;;513:18:1;32553:41:0;;;;;;;32287:315;;;:::o;27361:::-;27518:28;27528:4;27534:2;27538:7;27518:9;:28::i;:::-;27565:48;27588:4;27594:2;27598:7;27607:5;27565:22;:48::i;:::-;27557:111;;;;-1:-1:-1;;;27557:111:0;;;;;;;:::i;74657:331::-;74761:7;74806:174;74851:7;:20;;;74890:7;:18;;;60667:5;74953:12;;74806:26;:174::i;42829:679::-;42902:13;42936:16;42944:7;42936;:16::i;:::-;42928:78;;;;-1:-1:-1;;;42928:78:0;;37095:2:1;42928:78:0;;;37077:21:1;37134:2;37114:18;;;37107:30;37173:34;37153:18;;;37146:62;-1:-1:-1;;;37224:18:1;;;37217:47;37281:19;;42928:78:0;36893:413:1;42928:78:0;43019:23;43045:19;;;:10;:19;;;;;43019:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43075:18;43096:10;24179:9;;;;;;;;;-1:-1:-1;24179:9:0;;;24102:94;43096:10;43075:31;;43188:4;43182:18;43204:1;43182:23;43178:72;;;-1:-1:-1;43229:9:0;42829:679;-1:-1:-1;;42829:679:0:o;43178:72::-;43354:23;;:27;43350:108;;43429:4;43435:9;43412:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43398:48;;;;42829:679;;;:::o;43350:108::-;43477:23;43492:7;43477:14;:23::i;22231:305::-;22333:4;-1:-1:-1;;;;;;22370:40:0;;-1:-1:-1;;;22370:40:0;;:105;;-1:-1:-1;;;;;;;22427:48:0;;-1:-1:-1;;;22427:48:0;22370:105;:158;;;-1:-1:-1;;;;;;;;;;20949:40:0;;;22492:36;20840:157;81324:276;47975:7;;;;48229:9;48221:38;;;;-1:-1:-1;;;48221:38:0;;;;;;;:::i;:::-;81548:44:::1;81575:4;81581:2;81585:6;81548:26;:44::i;74050:218::-:0;74152:4;74247:13;;74213:7;:31;;;:47;;;;:::i;:::-;74194:15;:66;;;74050:218;-1:-1:-1;;74050:218:0:o;73459:583::-;73595:9;:12;73554:7;;-1:-1:-1;;;73595:12:0;;;;73583:24;;73579:456;;73631:9;73641:1;73631:12;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73459:583:0:o;73579:456::-;73677:9;:12;-1:-1:-1;;;73677:12:0;;;;73665:24;;73661:374;;73713:9;73723:1;73713:12;;73661:374;73759:9;:12;-1:-1:-1;;;73759:12:0;;;;73747:24;;73743:292;;73795:9;73805:1;73795:12;;73743:292;73841:9;:12;;;;;;73829:24;;73825:210;;73877:9;73887:1;73877:12;;73825:210;73923:9;:12;;;;;;73911:24;;73907:128;;73959:9;73969:1;73959:12;;73907:128;74011:9;74021:1;74011:12;;73907:128;73459:583;;;:::o;33167:799::-;33322:4;-1:-1:-1;;;;;33343:13:0;;11149:20;11197:8;33339:620;;33379:72;;-1:-1:-1;;;33379:72:0;;-1:-1:-1;;;;;33379:36:0;;;;;:72;;683:10;;33430:4;;33436:7;;33445:5;;33379:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33379:72:0;;;;;;;;-1:-1:-1;;33379:72:0;;;;;;;;;;;;:::i;:::-;;;33375:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33621:13:0;;33617:272;;33664:60;;-1:-1:-1;;;33664:60:0;;;;;;;:::i;33617:272::-;33839:6;33833:13;33824:6;33820:2;33816:15;33809:38;33375:529;-1:-1:-1;;;;;;33502:51:0;-1:-1:-1;;;33502:51:0;;-1:-1:-1;33495:58:0;;33339:620;-1:-1:-1;33943:4:0;33936:11;;23520:334;23593:13;23627:16;23635:7;23627;:16::i;:::-;23619:76;;;;-1:-1:-1;;;23619:76:0;;38736:2:1;23619:76:0;;;38718:21:1;38775:2;38755:18;;;38748:30;38814:34;38794:18;;;38787:62;-1:-1:-1;;;38865:18:1;;;38858:45;38920:19;;23619:76:0;38534:411:1;23619:76:0;23708:21;23732:10;24179:9;;;;;;;;;-1:-1:-1;24179:9:0;;;24102:94;23732:10;23708:34;;23784:1;23766:7;23760:21;:25;:86;;;;;;;;;;;;;;;;;23812:7;23821:18;:7;:16;:18::i;:::-;23795:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23760:86;23753:93;23520:334;-1:-1:-1;;;23520:334:0:o;38041:589::-;-1:-1:-1;;;;;38247:18:0;;38243:187;;38282:40;38314:7;39457:10;:17;;39430:24;;;;:15;:24;;;;;:44;;;39485:24;;;;;;;;;;;;39353:164;38282:40;38243:187;;;38352:2;-1:-1:-1;;;;;38344:10:0;:4;-1:-1:-1;;;;;38344:10:0;;38340:90;;38371:47;38404:4;38410:7;38371:32;:47::i;:::-;-1:-1:-1;;;;;38444:16:0;;38440:183;;38477:45;38514:7;38477:36;:45::i;38440:183::-;38550:4;-1:-1:-1;;;;;38544:10:0;:2;-1:-1:-1;;;;;38544:10:0;;38540:83;;38571:40;38599:2;38603:7;38571:27;:40::i;18383:723::-;18439:13;18660:10;18656:53;;-1:-1:-1;;18687:10:0;;;;;;;;;;;;-1:-1:-1;;;18687:10:0;;;;;18383:723::o;18656:53::-;18734:5;18719:12;18775:78;18782:9;;18775:78;;18808:8;;;;:::i;:::-;;-1:-1:-1;18831:10:0;;-1:-1:-1;18839:2:0;18831:10;;:::i;:::-;;;18775:78;;;18863:19;18895:6;-1:-1:-1;;;;;18885:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18885:17:0;;18863:39;;18913:154;18920:10;;18913:154;;18947:11;18957:1;18947:11;;:::i;:::-;;-1:-1:-1;19016:10:0;19024:2;19016:5;:10;:::i;:::-;19003:24;;:2;:24;:::i;:::-;18990:39;;18973:6;18980;18973:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18973:56:0;;;;;;;;-1:-1:-1;19044:11:0;19053:2;19044:11;;:::i;:::-;;;18913:154;;40144:988;40410:22;40460:1;40435:22;40452:4;40435:16;:22::i;:::-;:26;;;;:::i;:::-;40472:18;40493:26;;;:17;:26;;;;;;40410:51;;-1:-1:-1;40626:28:0;;;40622:328;;-1:-1:-1;;;;;40693:18:0;;40671:19;40693:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40744:30;;;;;;:44;;;40861:30;;:17;:30;;;;;:43;;;40622:328;-1:-1:-1;41046:26:0;;;;:17;:26;;;;;;;;41039:33;;;-1:-1:-1;;;;;41090:18:0;;;;;:12;:18;;;;;:34;;;;;;;41083:41;40144:988::o;41427:1079::-;41705:10;:17;41680:22;;41705:21;;41725:1;;41705:21;:::i;:::-;41737:18;41758:24;;;:15;:24;;;;;;42131:10;:26;;41680:46;;-1:-1:-1;41758:24:0;;41680:46;;42131:26;;;;;;:::i;:::-;;;;;;;;;42109:48;;42195:11;42170:10;42181;42170:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42275:28;;;:15;:28;;;;;;;:41;;;42447:24;;;;;42440:31;42482:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41498:1008;;;41427:1079;:::o;38931:221::-;39016:14;39033:20;39050:2;39033:16;:20::i;:::-;-1:-1:-1;;;;;39064:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39109:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38931:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1528:203::-;-1:-1:-1;;;;;1692:32:1;;;;1674:51;;1662:2;1647:18;;1528:203::o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1914:254;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;2879:127::-;2940:10;2935:3;2931:20;2928:1;2921:31;2971:4;2968:1;2961:15;2995:4;2992:1;2985:15;3011:252;3083:2;3077:9;3125:3;3113:16;;-1:-1:-1;;;;;3144:34:1;;3180:22;;;3141:62;3138:88;;;3206:18;;:::i;:::-;3242:2;3235:22;3011:252;:::o;3268:275::-;3339:2;3333:9;3404:2;3385:13;;-1:-1:-1;;3381:27:1;3369:40;;-1:-1:-1;;;;;3424:34:1;;3460:22;;;3421:62;3418:88;;;3486:18;;:::i;:::-;3522:2;3515:22;3268:275;;-1:-1:-1;3268:275:1:o;3548:407::-;3613:5;-1:-1:-1;;;;;3639:6:1;3636:30;3633:56;;;3669:18;;:::i;:::-;3707:57;3752:2;3731:15;;-1:-1:-1;;3727:29:1;3758:4;3723:40;3707:57;:::i;:::-;3698:66;;3787:6;3780:5;3773:21;3827:3;3818:6;3813:3;3809:16;3806:25;3803:45;;;3844:1;3841;3834:12;3803:45;3893:6;3888:3;3881:4;3874:5;3870:16;3857:43;3947:1;3940:4;3931:6;3924:5;3920:18;3916:29;3909:40;3548:407;;;;;:::o;3960:222::-;4003:5;4056:3;4049:4;4041:6;4037:17;4033:27;4023:55;;4074:1;4071;4064:12;4023:55;4096:80;4172:3;4163:6;4150:20;4143:4;4135:6;4131:17;4096:80;:::i;4187:396::-;4265:6;4273;4326:2;4314:9;4305:7;4301:23;4297:32;4294:52;;;4342:1;4339;4332:12;4294:52;4365:29;4384:9;4365:29;:::i;:::-;4355:39;;4445:2;4434:9;4430:18;4417:32;-1:-1:-1;;;;;4464:6:1;4461:30;4458:50;;;4504:1;4501;4494:12;4458:50;4527;4569:7;4560:6;4549:9;4545:22;4527:50;:::i;:::-;4517:60;;;4187:396;;;;;:::o;4588:390::-;4666:6;4674;4727:2;4715:9;4706:7;4702:23;4698:32;4695:52;;;4743:1;4740;4733:12;4695:52;4783:9;4770:23;-1:-1:-1;;;;;4808:6:1;4805:30;4802:50;;;4848:1;4845;4838:12;4802:50;4871;4913:7;4904:6;4893:9;4889:22;4871:50;:::i;:::-;4861:60;4968:2;4953:18;;;;4940:32;;-1:-1:-1;;;;4588:390:1:o;4983:::-;5061:6;5069;5122:2;5110:9;5101:7;5097:23;5093:32;5090:52;;;5138:1;5135;5128:12;5090:52;5174:9;5161:23;5151:33;;5235:2;5224:9;5220:18;5207:32;-1:-1:-1;;;;;5254:6:1;5251:30;5248:50;;;5294:1;5291;5284:12;5378:1466;5490:6;5498;5529:3;5573:2;5561:9;5552:7;5548:23;5544:32;5541:52;;;5589:1;5586;5579:12;5541:52;5638:7;5631:4;5620:9;5616:20;5612:34;5602:62;;5660:1;5657;5650:12;5602:62;5684:22;;:::i;:::-;5728:3;5769;5758:9;5754:19;5796:7;5788:6;5785:19;5782:39;;;5817:1;5814;5807:12;5782:39;5841:9;5859:319;5875:6;5870:3;5867:15;5859:319;;;5957:3;5944:17;6005:8;5998:5;5994:20;5987:5;5984:31;5974:129;;6057:1;6086:2;6082;6075:14;5974:129;6116:18;;6163:4;6154:14;;;;5892;5859:319;;;5863:3;6197:5;6187:15;;6246:7;6240:3;6229:9;6225:19;6221:33;6211:61;;6268:1;6265;6258:12;6211:61;6294:22;;:::i;:::-;6368:18;;;;6281:35;-1:-1:-1;6281:35:1;;-1:-1:-1;6398:21:1;;;6395:41;;;6432:1;6429;6422:12;6395:41;6491:8;6484:5;6481:19;6473:341;;;6581:5;6568:19;6635:6;6626:7;6622:20;6613:7;6610:33;6600:131;;6685:1;6714:2;6710;6703:14;6600:131;6744:22;;6799:4;6788:16;;;;6512;6473:341;;;6477:3;6833:5;6823:15;;;;;5378:1466;;;;;:::o;6849:632::-;7020:2;7072:21;;;7142:13;;7045:18;;;7164:22;;;6991:4;;7020:2;7243:15;;;;7217:2;7202:18;;;6991:4;7286:169;7300:6;7297:1;7294:13;7286:169;;;7361:13;;7349:26;;7430:15;;;;7395:12;;;;7322:1;7315:9;7286:169;;;-1:-1:-1;7472:3:1;;6849:632;-1:-1:-1;;;;;;6849:632:1:o;7486:928::-;7566:6;7619:3;7607:9;7598:7;7594:23;7590:33;7587:53;;;7636:1;7633;7626:12;7587:53;7685:7;7678:4;7667:9;7663:20;7659:34;7649:62;;7707:1;7704;7697:12;7649:62;7740:2;7734:9;7782:3;7774:6;7770:16;7852:6;7840:10;7837:22;-1:-1:-1;;;;;7804:10:1;7801:34;7798:62;7795:88;;;7863:18;;:::i;:::-;7899:2;7892:22;7934:6;7978:3;7963:19;;7994;;;7991:39;;;8026:1;8023;8016:12;7991:39;8050:9;8068:315;8084:6;8079:3;8076:15;8068:315;;;8166:3;8153:17;8214:4;8207:5;8203:16;8196:5;8193:27;8183:125;;8262:1;8291:2;8287;8280:14;8183:125;8321:18;;8368:4;8359:14;;;;8101;8068:315;;;-1:-1:-1;8402:6:1;;7486:928;-1:-1:-1;;;;;7486:928:1:o;8419:118::-;8505:5;8498:13;8491:21;8484:5;8481:32;8471:60;;8527:1;8524;8517:12;8542:315;8607:6;8615;8668:2;8656:9;8647:7;8643:23;8639:32;8636:52;;;8684:1;8681;8674:12;8636:52;8707:29;8726:9;8707:29;:::i;:::-;8697:39;;8786:2;8775:9;8771:18;8758:32;8799:28;8821:5;8799:28;:::i;:::-;8846:5;8836:15;;;8542:315;;;;;:::o;9057:667::-;9152:6;9160;9168;9176;9229:3;9217:9;9208:7;9204:23;9200:33;9197:53;;;9246:1;9243;9236:12;9197:53;9269:29;9288:9;9269:29;:::i;:::-;9259:39;;9317:38;9351:2;9340:9;9336:18;9317:38;:::i;:::-;9307:48;;9402:2;9391:9;9387:18;9374:32;9364:42;;9457:2;9446:9;9442:18;9429:32;-1:-1:-1;;;;;9476:6:1;9473:30;9470:50;;;9516:1;9513;9506:12;9470:50;9539:22;;9592:4;9584:13;;9580:27;-1:-1:-1;9570:55:1;;9621:1;9618;9611:12;9570:55;9644:74;9710:7;9705:2;9692:16;9687:2;9683;9679:11;9644:74;:::i;:::-;9634:84;;;9057:667;;;;;;;:::o;9918:946::-;10002:6;10033:2;10076;10064:9;10055:7;10051:23;10047:32;10044:52;;;10092:1;10089;10082:12;10044:52;10132:9;10119:23;-1:-1:-1;;;;;10202:2:1;10194:6;10191:14;10188:34;;;10218:1;10215;10208:12;10188:34;10256:6;10245:9;10241:22;10231:32;;10301:7;10294:4;10290:2;10286:13;10282:27;10272:55;;10323:1;10320;10313:12;10272:55;10359:2;10346:16;10381:2;10377;10374:10;10371:36;;;10387:18;;:::i;:::-;10433:2;10430:1;10426:10;10416:20;;10456:28;10480:2;10476;10472:11;10456:28;:::i;:::-;10518:15;;;10588:11;;;10584:20;;;10549:12;;;;10616:19;;;10613:39;;;10648:1;10645;10638:12;10613:39;10672:11;;;;10692:142;10708:6;10703:3;10700:15;10692:142;;;10774:17;;10762:30;;10725:12;;;;10812;;;;10692:142;;;10853:5;9918:946;-1:-1:-1;;;;;;;;9918:946:1:o;10869:2018::-;11081:4;11110:2;11150;11139:9;11135:18;11180:2;11169:9;11162:21;11203:6;11238;11232:13;11269:6;11261;11254:22;11295:2;11285:12;;11328:2;11317:9;11313:18;11306:25;;11390:2;11380:6;11377:1;11373:14;11362:9;11358:30;11354:39;11428:2;11420:6;11416:15;11449:1;11459:1399;11473:6;11470:1;11467:13;11459:1399;;;11566:2;11562:7;11550:9;11542:6;11538:22;11534:36;11529:3;11522:49;11600:6;11594:13;11630:4;11673:2;11667:9;11704:2;11696:6;11689:18;11750:12;11744:19;11739:2;11731:6;11727:15;11720:44;11823:2;11809:12;11805:21;11799:28;11850:6;11879:3;11919:2;11914;11906:6;11902:15;11895:27;11949:51;11995:3;11987:6;11983:16;11967:14;11949:51;:::i;:::-;12029:21;;;12023:28;12074:3;12097:15;;;12090:27;;;;12140:4;12187:21;;;12181:28;12164:15;;;12157:53;;;;12234:4;12282:22;;;12276:29;12270:3;12258:16;;12251:55;12350:21;;;12344:28;12338:3;12326:16;;12319:54;12417:21;;;12411:28;12405:3;12393:16;;12386:54;12498:21;;12492:28;12485:36;12478:44;12472:3;12460:16;;12453:70;12566:11;;;12560:18;12543:15;;;12536:43;12622:11;;;12616:18;12599:15;;;12592:43;12678:11;;;12672:18;12655:15;;;12648:43;-1:-1:-1;12735:12:1;;;12729:19;12711:16;;12704:45;;;;12836:12;;;;12801:15;;;;11495:1;11488:9;11459:1399;;;-1:-1:-1;12875:6:1;;10869:2018;-1:-1:-1;;;;;;;;10869:2018:1:o;13085:260::-;13153:6;13161;13214:2;13202:9;13193:7;13189:23;13185:32;13182:52;;;13230:1;13227;13220:12;13182:52;13253:29;13272:9;13253:29;:::i;:::-;13243:39;;13301:38;13335:2;13324:9;13320:18;13301:38;:::i;:::-;13291:48;;13085:260;;;;;:::o;13350:380::-;13429:1;13425:12;;;;13472;;;13493:61;;13547:4;13539:6;13535:17;13525:27;;13493:61;13600:2;13592:6;13589:14;13569:18;13566:38;13563:161;;;13646:10;13641:3;13637:20;13634:1;13627:31;13681:4;13678:1;13671:15;13709:4;13706:1;13699:15;14975:413;15177:2;15159:21;;;15216:2;15196:18;;;15189:30;15255:34;15250:2;15235:18;;15228:62;-1:-1:-1;;;15321:2:1;15306:18;;15299:47;15378:3;15363:19;;14975:413::o;15393:127::-;15454:10;15449:3;15445:20;15442:1;15435:31;15485:4;15482:1;15475:15;15509:4;15506:1;15499:15;15525:127;15586:10;15581:3;15577:20;15574:1;15567:31;15617:4;15614:1;15607:15;15641:4;15638:1;15631:15;15657:128;15697:3;15728:1;15724:6;15721:1;15718:13;15715:39;;;15734:18;;:::i;:::-;-1:-1:-1;15770:9:1;;15657:128::o;15790:135::-;15829:3;-1:-1:-1;;15850:17:1;;15847:43;;;15870:18;;:::i;:::-;-1:-1:-1;15917:1:1;15906:13;;15790:135::o;15930:356::-;16132:2;16114:21;;;16151:18;;;16144:30;16210:34;16205:2;16190:18;;16183:62;16277:2;16262:18;;15930:356::o;17200:355::-;17402:2;17384:21;;;17441:2;17421:18;;;17414:30;17480:33;17475:2;17460:18;;17453:61;17546:2;17531:18;;17200:355::o;17560:405::-;17762:2;17744:21;;;17801:2;17781:18;;;17774:30;17840:34;17835:2;17820:18;;17813:62;-1:-1:-1;;;17906:2:1;17891:18;;17884:39;17955:3;17940:19;;17560:405::o;17970:406::-;18172:2;18154:21;;;18211:2;18191:18;;;18184:30;18250:34;18245:2;18230:18;;18223:62;-1:-1:-1;;;18316:2:1;18301:18;;18294:40;18366:3;18351:19;;17970:406::o;18381:245::-;18448:6;18501:2;18489:9;18480:7;18476:23;18472:32;18469:52;;;18517:1;18514;18507:12;18469:52;18549:9;18543:16;18568:28;18590:5;18568:28;:::i;18631:406::-;18833:2;18815:21;;;18872:2;18852:18;;;18845:30;18911:34;18906:2;18891:18;;18884:62;-1:-1:-1;;;18977:2:1;18962:18;;18955:40;19027:3;19012:19;;18631:406::o;19042:400::-;19244:2;19226:21;;;19283:2;19263:18;;;19256:30;19322:34;19317:2;19302:18;;19295:62;-1:-1:-1;;;19388:2:1;19373:18;;19366:34;19432:3;19417:19;;19042:400::o;19447:405::-;19649:2;19631:21;;;19688:2;19668:18;;;19661:30;19727:34;19722:2;19707:18;;19700:62;-1:-1:-1;;;19793:2:1;19778:18;;19771:39;19842:3;19827:19;;19447:405::o;19857:340::-;20059:2;20041:21;;;20098:2;20078:18;;;20071:30;-1:-1:-1;;;20132:2:1;20117:18;;20110:46;20188:2;20173:18;;19857:340::o;20202:356::-;20404:2;20386:21;;;20423:18;;;20416:30;20482:34;20477:2;20462:18;;20455:62;20549:2;20534:18;;20202:356::o;22589:184::-;22659:6;22712:2;22700:9;22691:7;22687:23;22683:32;22680:52;;;22728:1;22725;22718:12;22680:52;-1:-1:-1;22751:16:1;;22589:184;-1:-1:-1;22589:184:1:o;23185:274::-;-1:-1:-1;;;;;23377:32:1;;;;23359:51;;23441:2;23426:18;;23419:34;23347:2;23332:18;;23185:274::o;23464:543::-;23682:13;;23625:3;;23656;;23735:4;23762:15;;;23625:3;23805:175;23819:6;23816:1;23813:13;23805:175;;;23882:13;;23868:28;;23918:14;;;;23955:15;;;;23841:1;23834:9;23805:175;;;-1:-1:-1;23996:5:1;;23464:543;-1:-1:-1;;;;;;23464:543:1:o;25610:136::-;25645:3;-1:-1:-1;;;25666:22:1;;25663:48;;;25691:18;;:::i;:::-;-1:-1:-1;25731:1:1;25727:13;;25610:136::o;25751:276::-;25882:3;25920:6;25914:13;25936:53;25982:6;25977:3;25970:4;25962:6;25958:17;25936:53;:::i;:::-;26005:16;;;;;25751:276;-1:-1:-1;;25751:276:1:o;32074:125::-;32114:4;32142:1;32139;32136:8;32133:34;;;32147:18;;:::i;:::-;-1:-1:-1;32184:9:1;;32074:125::o;32959:168::-;32999:7;33065:1;33061;33057:6;33053:14;33050:1;33047:21;33042:1;33035:9;33028:17;33024:45;33021:71;;;33072:18;;:::i;:::-;-1:-1:-1;33112:9:1;;32959:168::o;33132:127::-;33193:10;33188:3;33184:20;33181:1;33174:31;33224:4;33221:1;33214:15;33248:4;33245:1;33238:15;33264:120;33304:1;33330;33320:35;;33335:18;;:::i;:::-;-1:-1:-1;33369:9:1;;33264:120::o;33808:265::-;33847:3;33875:9;;;33900:10;;-1:-1:-1;;;;;33919:27:1;;;33912:35;;33896:52;33893:78;;;33951:18;;:::i;:::-;-1:-1:-1;;;33998:19:1;;;33991:27;;33983:36;;33980:62;;;34022:18;;:::i;:::-;-1:-1:-1;;34058:9:1;;33808:265::o;36474:414::-;36676:2;36658:21;;;36715:2;36695:18;;;36688:30;36754:34;36749:2;36734:18;;36727:62;-1:-1:-1;;;36820:2:1;36805:18;;36798:48;36878:3;36863:19;;36474:414::o;37311:470::-;37490:3;37528:6;37522:13;37544:53;37590:6;37585:3;37578:4;37570:6;37566:17;37544:53;:::i;:::-;37660:13;;37619:16;;;;37682:57;37660:13;37619:16;37716:4;37704:17;;37682:57;:::i;:::-;37755:20;;37311:470;-1:-1:-1;;;;37311:470:1:o;37786:489::-;-1:-1:-1;;;;;38055:15:1;;;38037:34;;38107:15;;38102:2;38087:18;;38080:43;38154:2;38139:18;;38132:34;;;38202:3;38197:2;38182:18;;38175:31;;;37980:4;;38223:46;;38249:19;;38241:6;38223:46;:::i;:::-;38215:54;37786:489;-1:-1:-1;;;;;;37786:489:1:o;38280:249::-;38349:6;38402:2;38390:9;38381:7;38377:23;38373:32;38370:52;;;38418:1;38415;38408:12;38370:52;38450:9;38444:16;38469:30;38493:5;38469:30;:::i;38950:112::-;38982:1;39008;38998:35;;39013:18;;:::i;:::-;-1:-1:-1;39047:9:1;;38950:112::o;39067:127::-;39128:10;39123:3;39119:20;39116:1;39109:31;39159:4;39156:1;39149:15;39183:4;39180:1;39173:15
Swarm Source
ipfs://17d5039494d73e4850b3780d1a7f3fd668a5e7c960a803fc51da0827b4f24ae9
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.