ERC-721
Overview
Max Total Supply
6,041 FFF
Holders
484
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
6 FFFLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FuturisticFarmFrens
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-17 */ // SPDX-License-Identifier: MIT // File erc721a/contracts/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer( uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to ); } // File erc721a/contracts/extensions/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File erc721a/contracts/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ""; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or( owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags) ) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if ( !_isSenderApprovedOrOwner( approvedAddress, from, _msgSenderERC721A() ) ) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @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 memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received( _msgSenderERC721A(), from, tokenId, _data ) returns (bytes4 retval) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer( startTokenId, startTokenId + quantity - 1, address(0), to ); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if ( !_checkContractOnERC721Received( address(0), to, index++, _data ) ) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ""); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if ( !_isSenderApprovedOrOwner( approvedAddress, from, _msgSenderERC721A() ) ) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File erc721a/contracts/extensions/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[]( tokenIdsLength ); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for ( uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i ) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for ( uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i ) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256( abi.encodePacked(computedHash, proofElement) ); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256( abi.encodePacked(proofElement, computedHash) ); } } return computedHash; } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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; } } // File contracts/FFF.sol pragma solidity >=0.8.9 <0.9.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = 1; // compute log10(value), and add it to length uint256 valueCopy = value; if (valueCopy >= 10**64) { valueCopy /= 10**64; length += 64; } if (valueCopy >= 10**32) { valueCopy /= 10**32; length += 32; } if (valueCopy >= 10**16) { valueCopy /= 10**16; length += 16; } if (valueCopy >= 10**8) { valueCopy /= 10**8; length += 8; } if (valueCopy >= 10**4) { valueCopy /= 10**4; length += 4; } if (valueCopy >= 10**2) { valueCopy /= 10**2; length += 2; } if (valueCopy >= 10**1) { length += 1; } // now, length is log10(value) + 1 string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = 1; // compute log256(value), and add it to length uint256 valueCopy = value; if (valueCopy >= 1 << 128) { valueCopy >>= 128; length += 16; } if (valueCopy >= 1 << 64) { valueCopy >>= 64; length += 8; } if (valueCopy >= 1 << 32) { valueCopy >>= 32; length += 4; } if (valueCopy >= 1 << 16) { valueCopy >>= 16; length += 2; } if (valueCopy >= 1 << 8) { valueCopy >>= 8; length += 1; } // now, length is log256(value) + 1 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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } contract FuturisticFarmFrens is ERC721AQueryable, Ownable, ReentrancyGuard { using Strings for uint256; bytes32 public merkleRoot; mapping(address => bool) public whitelistClaimed; string public uriPrefix = ""; string public uriSuffix = ".json"; string public hiddenMetadataUri; uint256 public cost; uint256 public maxSupply; uint256 public maxMintAmountPerTx; uint256 private maxHonoraries; bool public paused = true; bool public whitelistMintEnabled = false; bool public revealed = false; constructor() ERC721A("Futuristic Farm Frens", "FFF") { setCost(0.035 ether); // .035eth || 35000000000000000000 maxSupply = 6111; setMaxMintAmountPerTx(15); setHiddenMetadataUri(""); setMaxHonoraries(70); } modifier mintCompliance(uint256 _mintAmount) { require( _mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!" ); require( totalSupply() + _mintAmount <= maxSupply - maxHonoraries, "Max supply exceeded!" ); _; } modifier mintPriceCompliance(uint256 _mintAmount) { require(msg.value >= cost * _mintAmount, "Insufficient funds!"); _; } function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { // Verify whitelist requirements require(whitelistMintEnabled, "The whitelist sale is not enabled!"); require(!whitelistClaimed[_msgSender()], "Address already claimed!"); bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require( MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof!" ); whitelistClaimed[_msgSender()] = true; _safeMint(_msgSender(), _mintAmount); } function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { require(!paused, "The contract is paused!"); _safeMint(_msgSender(), _mintAmount); } function mintHonorary(address _receiver) public onlyOwner { require(totalSupply() + 1 <= maxSupply, "Max supply exceeded!"); _safeMint(_receiver, 1); } function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { _safeMint(_receiver, _mintAmount); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, _tokenId.toString(), uriSuffix ) ) : ""; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } function setMaxHonoraries(uint256 _maxHonoraries) public onlyOwner { maxHonoraries = _maxHonoraries; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function setWhitelistMintEnabled(bool _state) public onlyOwner { whitelistMintEnabled = _state; } function withdraw() public onlyOwner nonReentrant { (bool a, ) = payable(0x5870F14442fADe3f06cd277D22057476Db38dfdf).call{ value: (address(this).balance * 30) / 100 }(""); require(a); (bool b, ) = payable(0xd3d8C8B39E5cbc2b48bBA4ffe06b6feab2BC3314).call{ value: (address(this).balance * 30) / 100 }(""); require(b); (bool c, ) = payable(0xa9e848a557bad7c4f78daA0C2dbc479852E62a2E).call{ value: (address(this).balance * 25) / 100 }(""); require(c); (bool d, ) = payable(0x6aD637e2B23fB8296A437Bb539f7eCA2c0A4C6D2).call{ value: (address(this).balance * 15) / 100 }(""); require(d); (bool e, ) = payable(owner()).call{value: address(this).balance}(""); require(e); // ============================================================================= } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintHonorary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxHonoraries","type":"uint256"}],"name":"setMaxHonoraries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040819052600060808190526200001b91600c91620002f0565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a91600d91620002f0565b506013805462ffffff191660011790553480156200006757600080fd5b50604080518082018252601581527f46757475726973746963204661726d204672656e73000000000000000000000060208083019182528351808501909452600384526223232360e91b908401528151919291620000c891600291620002f0565b508051620000de906003906020840190620002f0565b5050600160005550620000f13362000146565b600160095562000108667c58508723800062000198565b6117df6010556200011a600f620001ec565b60408051602081019091526000815262000134906200023c565b620001406046620002a0565b620003d3565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620001e75760405162461bcd60e51b81526020600482018190526024820152600080516020620030a583398151915260448201526064015b60405180910390fd5b600f55565b6008546001600160a01b03163314620002375760405162461bcd60e51b81526020600482018190526024820152600080516020620030a58339815191526044820152606401620001de565b601155565b6008546001600160a01b03163314620002875760405162461bcd60e51b81526020600482018190526024820152600080516020620030a58339815191526044820152606401620001de565b80516200029c90600e906020840190620002f0565b5050565b6008546001600160a01b03163314620002eb5760405162461bcd60e51b81526020600482018190526024820152600080516020620030a58339815191526044820152606401620001de565b601255565b828054620002fe9062000396565b90600052602060002090601f0160209004810192826200032257600085556200036d565b82601f106200033d57805160ff19168380011785556200036d565b828001600101855582156200036d579182015b828111156200036d57825182559160200191906001019062000350565b506200037b9291506200037f565b5090565b5b808211156200037b576000815560010162000380565b600181811c90821680620003ab57607f821691505b60208210811415620003cd57634e487b7160e01b600052602260045260246000fd5b50919050565b612cc280620003e36000396000f3fe6080604052600436106102885760003560e01c80637cb647591161015a578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb0114610785578063db4bec441461079b578063e0a80853146107cb578063e985e9c5146107eb578063efbd73f414610834578063f2fde38b1461085457600080fd5b8063b88d4fde146106c5578063bcc4efba146106e5578063c23dc68f14610705578063c87b56dd14610732578063cbd939ef14610752578063d2cab0561461077257600080fd5b806399a2557a1161011357806399a2557a1461061d578063a0712d681461063d578063a22cb46514610650578063a45ba8e714610670578063b071401b14610685578063b767a098146106a557600080fd5b80637cb64759146105675780637ec4a659146105875780638462151c146105a75780638da5cb5b146105d457806394354fd0146105f257806395d89b411461060857600080fd5b806342842e0e116101fe5780635c975abb116101b75780635c975abb146104c457806362b99ad4146104de5780636352211e146104f35780636caede3d1461051357806370a0823114610532578063715018a61461055257600080fd5b806342842e0e1461040257806344a0d68a146104225780634fdd43cb1461044257806351830227146104625780635503a0e8146104825780635bbb21771461049757600080fd5b806316ba10e01161025057806316ba10e01461036257806316c38b3c1461038257806318160ddd146103a257806323b872dd146103b75780632eb4a7ab146103d75780633ccfd60b146103ed57600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806313faede61461033e575b600080fd5b34801561029957600080fd5b506102ad6102a83660046124e6565b610874565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108c6565b6040516102b9919061255b565b3480156102f057600080fd5b506103046102ff36600461256e565b610958565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c6103373660046125a3565b61099c565b005b34801561034a57600080fd5b50610354600f5481565b6040519081526020016102b9565b34801561036e57600080fd5b5061033c61037d366004612658565b610a3c565b34801561038e57600080fd5b5061033c61039d3660046126b0565b610a86565b3480156103ae57600080fd5b50610354610ac3565b3480156103c357600080fd5b5061033c6103d23660046126cb565b610ad1565b3480156103e357600080fd5b50610354600a5481565b3480156103f957600080fd5b5061033c610c63565b34801561040e57600080fd5b5061033c61041d3660046126cb565b610f56565b34801561042e57600080fd5b5061033c61043d36600461256e565b610f76565b34801561044e57600080fd5b5061033c61045d366004612658565b610fa5565b34801561046e57600080fd5b506013546102ad9062010000900460ff1681565b34801561048e57600080fd5b506102d7610fe2565b3480156104a357600080fd5b506104b76104b2366004612752565b611070565b6040516102b991906127cf565b3480156104d057600080fd5b506013546102ad9060ff1681565b3480156104ea57600080fd5b506102d761113b565b3480156104ff57600080fd5b5061030461050e36600461256e565b611148565b34801561051f57600080fd5b506013546102ad90610100900460ff1681565b34801561053e57600080fd5b5061035461054d366004612811565b611153565b34801561055e57600080fd5b5061033c6111a1565b34801561057357600080fd5b5061033c61058236600461256e565b6111d7565b34801561059357600080fd5b5061033c6105a2366004612658565b611206565b3480156105b357600080fd5b506105c76105c2366004612811565b611243565b6040516102b9919061282c565b3480156105e057600080fd5b506008546001600160a01b0316610304565b3480156105fe57600080fd5b5061035460115481565b34801561061457600080fd5b506102d7611352565b34801561062957600080fd5b506105c7610638366004612864565b611361565b61033c61064b36600461256e565b6114ec565b34801561065c57600080fd5b5061033c61066b366004612897565b61160d565b34801561067c57600080fd5b506102d76116a3565b34801561069157600080fd5b5061033c6106a036600461256e565b6116b0565b3480156106b157600080fd5b5061033c6106c03660046126b0565b6116df565b3480156106d157600080fd5b5061033c6106e03660046128ca565b611723565b3480156106f157600080fd5b5061033c610700366004612811565b61176d565b34801561071157600080fd5b5061072561072036600461256e565b6117d9565b6040516102b99190612945565b34801561073e57600080fd5b506102d761074d36600461256e565b611861565b34801561075e57600080fd5b5061033c61076d36600461256e565b6119d0565b61033c610780366004612953565b6119ff565b34801561079157600080fd5b5061035460105481565b3480156107a757600080fd5b506102ad6107b6366004612811565b600b6020526000908152604090205460ff1681565b3480156107d757600080fd5b5061033c6107e63660046126b0565b611c60565b3480156107f757600080fd5b506102ad61080636600461299e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561084057600080fd5b5061033c61084f3660046129c8565b611ca6565b34801561086057600080fd5b5061033c61086f366004612811565b611d4a565b60006301ffc9a760e01b6001600160e01b0319831614806108a557506380ac58cd60e01b6001600160e01b03198316145b806108c05750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546108d5906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610901906129eb565b801561094e5780601f106109235761010080835404028352916020019161094e565b820191906000526020600020905b81548152906001019060200180831161093157829003601f168201915b5050505050905090565b600061096382611de2565b610980576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109a782611148565b9050336001600160a01b038216146109e0576109c38133610806565b6109e0576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a6f5760405162461bcd60e51b8152600401610a6690612a26565b60405180910390fd5b8051610a8290600d906020840190612437565b5050565b6008546001600160a01b03163314610ab05760405162461bcd60e51b8152600401610a6690612a26565b6013805460ff1916911515919091179055565b600154600054036000190190565b6000610adc82611e17565b9050836001600160a01b0316816001600160a01b031614610b0f5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610b5c57610b3f8633610806565b610b5c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b8357604051633a954ecd60e21b815260040160405180910390fd5b8015610b8e57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610c195760018401600081815260046020526040902054610c17576000548114610c175760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b03163314610c8d5760405162461bcd60e51b8152600401610a6690612a26565b60026009541415610ce05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a66565b60026009556000735870f14442fade3f06cd277d22057476db38dfdf6064610d0947601e612a71565b610d139190612a90565b604051600081818185875af1925050503d8060008114610d4f576040519150601f19603f3d011682016040523d82523d6000602084013e610d54565b606091505b5050905080610d6257600080fd5b600073d3d8c8b39e5cbc2b48bba4ffe06b6feab2bc33146064610d8647601e612a71565b610d909190612a90565b604051600081818185875af1925050503d8060008114610dcc576040519150601f19603f3d011682016040523d82523d6000602084013e610dd1565b606091505b5050905080610ddf57600080fd5b600073a9e848a557bad7c4f78daa0c2dbc479852e62a2e6064610e03476019612a71565b610e0d9190612a90565b604051600081818185875af1925050503d8060008114610e49576040519150601f19603f3d011682016040523d82523d6000602084013e610e4e565b606091505b5050905080610e5c57600080fd5b6000736ad637e2b23fb8296a437bb539f7eca2c0a4c6d26064610e8047600f612a71565b610e8a9190612a90565b604051600081818185875af1925050503d8060008114610ec6576040519150601f19603f3d011682016040523d82523d6000602084013e610ecb565b606091505b5050905080610ed957600080fd5b6000610eed6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5050905080610f4a57600080fd5b50506001600955505050565b610f7183838360405180602001604052806000815250611723565b505050565b6008546001600160a01b03163314610fa05760405162461bcd60e51b8152600401610a6690612a26565b600f55565b6008546001600160a01b03163314610fcf5760405162461bcd60e51b8152600401610a6690612a26565b8051610a8290600e906020840190612437565b600d8054610fef906129eb565b80601f016020809104026020016040519081016040528092919081815260200182805461101b906129eb565b80156110685780601f1061103d57610100808354040283529160200191611068565b820191906000526020600020905b81548152906001019060200180831161104b57829003601f168201915b505050505081565b6060816000816001600160401b0381111561108d5761108d6125cd565b6040519080825280602002602001820160405280156110df57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816110ab5790505b50905060005b8281146111325761110d86868381811061110157611101612ab2565b905060200201356117d9565b82828151811061111f5761111f612ab2565b60209081029190910101526001016110e5565b50949350505050565b600c8054610fef906129eb565b60006108c082611e17565b60006001600160a01b03821661117c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111cb5760405162461bcd60e51b8152600401610a6690612a26565b6111d56000611e80565b565b6008546001600160a01b031633146112015760405162461bcd60e51b8152600401610a6690612a26565b600a55565b6008546001600160a01b031633146112305760405162461bcd60e51b8152600401610a6690612a26565b8051610a8290600c906020840190612437565b6060600080600061125385611153565b90506000816001600160401b0381111561126f5761126f6125cd565b604051908082528060200260200182016040528015611298578160200160208202803683370190505b5090506112c560408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614611346576112d881611ed2565b91508160400151156112e95761133e565b81516001600160a01b0316156112fe57815194505b876001600160a01b0316856001600160a01b0316141561133e578083878060010198508151811061133157611331612ab2565b6020026020010181815250505b6001016112c8565b50909695505050505050565b6060600380546108d5906129eb565b606081831061138357604051631960ccad60e11b815260040160405180910390fd5b60008061138f60005490565b9050600185101561139f57600194505b808411156113ab578093505b60006113b687611153565b9050848610156113d557858503818110156113cf578091505b506113d9565b5060005b6000816001600160401b038111156113f3576113f36125cd565b60405190808252806020026020018201604052801561141c578160200160208202803683370190505b5090508161142f5793506114e592505050565b600061143a886117d9565b90506000816040015161144b575080515b885b88811415801561145d5750848714155b156114d95761146b81611ed2565b925082604001511561147c576114d1565b82516001600160a01b03161561149157825191505b8a6001600160a01b0316826001600160a01b031614156114d157808488806001019950815181106114c4576114c4612ab2565b6020026020010181815250505b60010161144d565b50505092835250909150505b9392505050565b806000811180156114ff57506011548111155b61151b5760405162461bcd60e51b8152600401610a6690612ac8565b60125460105461152b9190612af6565b81611534610ac3565b61153e9190612b0d565b111561155c5760405162461bcd60e51b8152600401610a6690612b25565b8180600f5461156b9190612a71565b3410156115b05760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610a66565b60135460ff16156116035760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610a66565b610f713384611f0e565b6001600160a01b0382163314156116375760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e8054610fef906129eb565b6008546001600160a01b031633146116da5760405162461bcd60e51b8152600401610a6690612a26565b601155565b6008546001600160a01b031633146117095760405162461bcd60e51b8152600401610a6690612a26565b601380549115156101000261ff0019909216919091179055565b61172e848484610ad1565b6001600160a01b0383163b156117675761174a84848484611f28565b611767576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117975760405162461bcd60e51b8152600401610a6690612a26565b6010546117a2610ac3565b6117ad906001612b0d565b11156117cb5760405162461bcd60e51b8152600401610a6690612b25565b6117d6816001611f0e565b50565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152600183108061183257506000548310155b1561183d5792915050565b61184683611ed2565b90508060400151156118585792915050565b6114e583612020565b606061186c82611de2565b6118d05760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a66565b60135462010000900460ff1661197257600e80546118ed906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611919906129eb565b80156119665780601f1061193b57610100808354040283529160200191611966565b820191906000526020600020905b81548152906001019060200180831161194957829003601f168201915b50505050509050919050565b600061197c612055565b9050600081511161199c57604051806020016040528060008152506114e5565b806119a684612064565b600d6040516020016119ba93929190612b53565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146119fa5760405162461bcd60e51b8152600401610a6690612a26565b601255565b82600081118015611a1257506011548111155b611a2e5760405162461bcd60e51b8152600401610a6690612ac8565b601254601054611a3e9190612af6565b81611a47610ac3565b611a519190612b0d565b1115611a6f5760405162461bcd60e51b8152600401610a6690612b25565b8380600f54611a7e9190612a71565b341015611ac35760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610a66565b601354610100900460ff16611b255760405162461bcd60e51b815260206004820152602260248201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604482015261642160f01b6064820152608401610a66565b336000908152600b602052604090205460ff1615611b855760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610a66565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bff85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506121ca565b611c3c5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610a66565b336000818152600b60205260409020805460ff19166001179055610c5b9087611f0e565b6008546001600160a01b03163314611c8a5760405162461bcd60e51b8152600401610a6690612a26565b60138054911515620100000262ff000019909216919091179055565b81600081118015611cb957506011548111155b611cd55760405162461bcd60e51b8152600401610a6690612ac8565b601254601054611ce59190612af6565b81611cee610ac3565b611cf89190612b0d565b1115611d165760405162461bcd60e51b8152600401610a6690612b25565b6008546001600160a01b03163314611d405760405162461bcd60e51b8152600401610a6690612a26565b610f718284611f0e565b6008546001600160a01b03163314611d745760405162461bcd60e51b8152600401610a6690612a26565b6001600160a01b038116611dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a66565b6117d681611e80565b600081600111158015611df6575060005482105b80156108c0575050600090815260046020526040902054600160e01b161590565b60008180600111611e6757600054811015611e6757600081815260046020526040902054600160e01b8116611e65575b806114e5575060001901600081815260046020526040902054611e47565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546108c0906121e0565b610a82828260405180602001604052806000815250612227565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f5d903390899088908890600401612c17565b602060405180830381600087803b158015611f7757600080fd5b505af1925050508015611fa7575060408051601f3d908101601f19168201909252611fa491810190612c54565b60015b612002573d808015611fd5576040519150601f19603f3d011682016040523d82523d6000602084013e611fda565b606091505b508051611ffa576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526108c061205083611e17565b6121e0565b6060600c80546108d5906129eb565b606060018272184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b81106120a7576040919091019072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90045b6d04ee2d6d415b85acef810000000081106120d557602091909101906d04ee2d6d415b85acef810000000090045b662386f26fc1000081106120f55760109190910190662386f26fc1000090045b6305f5e100811061210f57600891909101906305f5e10090045b6127108110612125576004919091019061271090045b606481106121395760029190910190606490045b600a8110612148576001820191505b6000826001600160401b03811115612162576121626125cd565b6040519080825280601f01601f19166020018201604052801561218c576020820181803683370190505b5090508281016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a87061a8153600a86049550856121c557611132565b612196565b6000826121d78584612294565b14949350505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6122318383612340565b6001600160a01b0383163b15610f71576000548281035b61225b6000868380600101945086611f28565b612278576040516368d2bf6b60e11b815260040160405180910390fd5b81811061224857816000541461228d57600080fd5b5050505050565b600081815b84518110156123385760008582815181106122b6576122b6612ab2565b602002602001015190508083116122f8576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612325565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061233081612c71565b915050612299565b509392505050565b600054816123615760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461241057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016123d8565b508161242e57604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054612443906129eb565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e57805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612490565b506124b79291506124bb565b5090565b5b808211156124b757600081556001016124bc565b6001600160e01b0319811681146117d657600080fd5b6000602082840312156124f857600080fd5b81356114e5816124d0565b60005b8381101561251e578181015183820152602001612506565b838111156117675750506000910152565b60008151808452612547816020860160208601612503565b601f01601f19169290920160200192915050565b6020815260006114e5602083018461252f565b60006020828403121561258057600080fd5b5035919050565b80356001600160a01b038116811461259e57600080fd5b919050565b600080604083850312156125b657600080fd5b6125bf83612587565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156125fd576125fd6125cd565b604051601f8501601f19908116603f01168101908282118183101715612625576126256125cd565b8160405280935085815286868601111561263e57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561266a57600080fd5b81356001600160401b0381111561268057600080fd5b8201601f8101841361269157600080fd5b612018848235602084016125e3565b8035801515811461259e57600080fd5b6000602082840312156126c257600080fd5b6114e5826126a0565b6000806000606084860312156126e057600080fd5b6126e984612587565b92506126f760208501612587565b9150604084013590509250925092565b60008083601f84011261271957600080fd5b5081356001600160401b0381111561273057600080fd5b6020830191508360208260051b850101111561274b57600080fd5b9250929050565b6000806020838503121561276557600080fd5b82356001600160401b0381111561277b57600080fd5b61278785828601612707565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015611346576127fe838551612793565b92840192608092909201916001016127eb565b60006020828403121561282357600080fd5b6114e582612587565b6020808252825182820181905260009190848201906040850190845b8181101561134657835183529284019291840191600101612848565b60008060006060848603121561287957600080fd5b61288284612587565b95602085013595506040909401359392505050565b600080604083850312156128aa57600080fd5b6128b383612587565b91506128c1602084016126a0565b90509250929050565b600080600080608085870312156128e057600080fd5b6128e985612587565b93506128f760208601612587565b92506040850135915060608501356001600160401b0381111561291957600080fd5b8501601f8101871361292a57600080fd5b612939878235602084016125e3565b91505092959194509250565b608081016108c08284612793565b60008060006040848603121561296857600080fd5b8335925060208401356001600160401b0381111561298557600080fd5b61299186828701612707565b9497909650939450505050565b600080604083850312156129b157600080fd5b6129ba83612587565b91506128c160208401612587565b600080604083850312156129db57600080fd5b823591506128c160208401612587565b600181811c908216806129ff57607f821691505b60208210811415612a2057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612a8b57612a8b612a5b565b500290565b600082612aad57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b600082821015612b0857612b08612a5b565b500390565b60008219821115612b2057612b20612a5b565b500190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b600084516020612b668285838a01612503565b855191840191612b798184848a01612503565b8554920191600090600181811c9080831680612b9657607f831692505b858310811415612bb457634e487b7160e01b85526022600452602485fd5b808015612bc85760018114612bd957612c06565b60ff19851688528388019550612c06565b60008b81526020902060005b85811015612bfe5781548a820152908401908801612be5565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c4a9083018461252f565b9695505050505050565b600060208284031215612c6657600080fd5b81516114e5816124d0565b6000600019821415612c8557612c85612a5b565b506001019056fea2646970667358221220facd34ba18c84ee6a929bfca3bf327d003516ade0607aa736ed59bfd57971b1d64736f6c634300080900334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x6080604052600436106102885760003560e01c80637cb647591161015a578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb0114610785578063db4bec441461079b578063e0a80853146107cb578063e985e9c5146107eb578063efbd73f414610834578063f2fde38b1461085457600080fd5b8063b88d4fde146106c5578063bcc4efba146106e5578063c23dc68f14610705578063c87b56dd14610732578063cbd939ef14610752578063d2cab0561461077257600080fd5b806399a2557a1161011357806399a2557a1461061d578063a0712d681461063d578063a22cb46514610650578063a45ba8e714610670578063b071401b14610685578063b767a098146106a557600080fd5b80637cb64759146105675780637ec4a659146105875780638462151c146105a75780638da5cb5b146105d457806394354fd0146105f257806395d89b411461060857600080fd5b806342842e0e116101fe5780635c975abb116101b75780635c975abb146104c457806362b99ad4146104de5780636352211e146104f35780636caede3d1461051357806370a0823114610532578063715018a61461055257600080fd5b806342842e0e1461040257806344a0d68a146104225780634fdd43cb1461044257806351830227146104625780635503a0e8146104825780635bbb21771461049757600080fd5b806316ba10e01161025057806316ba10e01461036257806316c38b3c1461038257806318160ddd146103a257806323b872dd146103b75780632eb4a7ab146103d75780633ccfd60b146103ed57600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c57806313faede61461033e575b600080fd5b34801561029957600080fd5b506102ad6102a83660046124e6565b610874565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108c6565b6040516102b9919061255b565b3480156102f057600080fd5b506103046102ff36600461256e565b610958565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c6103373660046125a3565b61099c565b005b34801561034a57600080fd5b50610354600f5481565b6040519081526020016102b9565b34801561036e57600080fd5b5061033c61037d366004612658565b610a3c565b34801561038e57600080fd5b5061033c61039d3660046126b0565b610a86565b3480156103ae57600080fd5b50610354610ac3565b3480156103c357600080fd5b5061033c6103d23660046126cb565b610ad1565b3480156103e357600080fd5b50610354600a5481565b3480156103f957600080fd5b5061033c610c63565b34801561040e57600080fd5b5061033c61041d3660046126cb565b610f56565b34801561042e57600080fd5b5061033c61043d36600461256e565b610f76565b34801561044e57600080fd5b5061033c61045d366004612658565b610fa5565b34801561046e57600080fd5b506013546102ad9062010000900460ff1681565b34801561048e57600080fd5b506102d7610fe2565b3480156104a357600080fd5b506104b76104b2366004612752565b611070565b6040516102b991906127cf565b3480156104d057600080fd5b506013546102ad9060ff1681565b3480156104ea57600080fd5b506102d761113b565b3480156104ff57600080fd5b5061030461050e36600461256e565b611148565b34801561051f57600080fd5b506013546102ad90610100900460ff1681565b34801561053e57600080fd5b5061035461054d366004612811565b611153565b34801561055e57600080fd5b5061033c6111a1565b34801561057357600080fd5b5061033c61058236600461256e565b6111d7565b34801561059357600080fd5b5061033c6105a2366004612658565b611206565b3480156105b357600080fd5b506105c76105c2366004612811565b611243565b6040516102b9919061282c565b3480156105e057600080fd5b506008546001600160a01b0316610304565b3480156105fe57600080fd5b5061035460115481565b34801561061457600080fd5b506102d7611352565b34801561062957600080fd5b506105c7610638366004612864565b611361565b61033c61064b36600461256e565b6114ec565b34801561065c57600080fd5b5061033c61066b366004612897565b61160d565b34801561067c57600080fd5b506102d76116a3565b34801561069157600080fd5b5061033c6106a036600461256e565b6116b0565b3480156106b157600080fd5b5061033c6106c03660046126b0565b6116df565b3480156106d157600080fd5b5061033c6106e03660046128ca565b611723565b3480156106f157600080fd5b5061033c610700366004612811565b61176d565b34801561071157600080fd5b5061072561072036600461256e565b6117d9565b6040516102b99190612945565b34801561073e57600080fd5b506102d761074d36600461256e565b611861565b34801561075e57600080fd5b5061033c61076d36600461256e565b6119d0565b61033c610780366004612953565b6119ff565b34801561079157600080fd5b5061035460105481565b3480156107a757600080fd5b506102ad6107b6366004612811565b600b6020526000908152604090205460ff1681565b3480156107d757600080fd5b5061033c6107e63660046126b0565b611c60565b3480156107f757600080fd5b506102ad61080636600461299e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561084057600080fd5b5061033c61084f3660046129c8565b611ca6565b34801561086057600080fd5b5061033c61086f366004612811565b611d4a565b60006301ffc9a760e01b6001600160e01b0319831614806108a557506380ac58cd60e01b6001600160e01b03198316145b806108c05750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546108d5906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610901906129eb565b801561094e5780601f106109235761010080835404028352916020019161094e565b820191906000526020600020905b81548152906001019060200180831161093157829003601f168201915b5050505050905090565b600061096382611de2565b610980576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109a782611148565b9050336001600160a01b038216146109e0576109c38133610806565b6109e0576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610a6f5760405162461bcd60e51b8152600401610a6690612a26565b60405180910390fd5b8051610a8290600d906020840190612437565b5050565b6008546001600160a01b03163314610ab05760405162461bcd60e51b8152600401610a6690612a26565b6013805460ff1916911515919091179055565b600154600054036000190190565b6000610adc82611e17565b9050836001600160a01b0316816001600160a01b031614610b0f5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610b5c57610b3f8633610806565b610b5c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b8357604051633a954ecd60e21b815260040160405180910390fd5b8015610b8e57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610c195760018401600081815260046020526040902054610c17576000548114610c175760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b03163314610c8d5760405162461bcd60e51b8152600401610a6690612a26565b60026009541415610ce05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a66565b60026009556000735870f14442fade3f06cd277d22057476db38dfdf6064610d0947601e612a71565b610d139190612a90565b604051600081818185875af1925050503d8060008114610d4f576040519150601f19603f3d011682016040523d82523d6000602084013e610d54565b606091505b5050905080610d6257600080fd5b600073d3d8c8b39e5cbc2b48bba4ffe06b6feab2bc33146064610d8647601e612a71565b610d909190612a90565b604051600081818185875af1925050503d8060008114610dcc576040519150601f19603f3d011682016040523d82523d6000602084013e610dd1565b606091505b5050905080610ddf57600080fd5b600073a9e848a557bad7c4f78daa0c2dbc479852e62a2e6064610e03476019612a71565b610e0d9190612a90565b604051600081818185875af1925050503d8060008114610e49576040519150601f19603f3d011682016040523d82523d6000602084013e610e4e565b606091505b5050905080610e5c57600080fd5b6000736ad637e2b23fb8296a437bb539f7eca2c0a4c6d26064610e8047600f612a71565b610e8a9190612a90565b604051600081818185875af1925050503d8060008114610ec6576040519150601f19603f3d011682016040523d82523d6000602084013e610ecb565b606091505b5050905080610ed957600080fd5b6000610eed6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610f37576040519150601f19603f3d011682016040523d82523d6000602084013e610f3c565b606091505b5050905080610f4a57600080fd5b50506001600955505050565b610f7183838360405180602001604052806000815250611723565b505050565b6008546001600160a01b03163314610fa05760405162461bcd60e51b8152600401610a6690612a26565b600f55565b6008546001600160a01b03163314610fcf5760405162461bcd60e51b8152600401610a6690612a26565b8051610a8290600e906020840190612437565b600d8054610fef906129eb565b80601f016020809104026020016040519081016040528092919081815260200182805461101b906129eb565b80156110685780601f1061103d57610100808354040283529160200191611068565b820191906000526020600020905b81548152906001019060200180831161104b57829003601f168201915b505050505081565b6060816000816001600160401b0381111561108d5761108d6125cd565b6040519080825280602002602001820160405280156110df57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816110ab5790505b50905060005b8281146111325761110d86868381811061110157611101612ab2565b905060200201356117d9565b82828151811061111f5761111f612ab2565b60209081029190910101526001016110e5565b50949350505050565b600c8054610fef906129eb565b60006108c082611e17565b60006001600160a01b03821661117c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111cb5760405162461bcd60e51b8152600401610a6690612a26565b6111d56000611e80565b565b6008546001600160a01b031633146112015760405162461bcd60e51b8152600401610a6690612a26565b600a55565b6008546001600160a01b031633146112305760405162461bcd60e51b8152600401610a6690612a26565b8051610a8290600c906020840190612437565b6060600080600061125385611153565b90506000816001600160401b0381111561126f5761126f6125cd565b604051908082528060200260200182016040528015611298578160200160208202803683370190505b5090506112c560408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614611346576112d881611ed2565b91508160400151156112e95761133e565b81516001600160a01b0316156112fe57815194505b876001600160a01b0316856001600160a01b0316141561133e578083878060010198508151811061133157611331612ab2565b6020026020010181815250505b6001016112c8565b50909695505050505050565b6060600380546108d5906129eb565b606081831061138357604051631960ccad60e11b815260040160405180910390fd5b60008061138f60005490565b9050600185101561139f57600194505b808411156113ab578093505b60006113b687611153565b9050848610156113d557858503818110156113cf578091505b506113d9565b5060005b6000816001600160401b038111156113f3576113f36125cd565b60405190808252806020026020018201604052801561141c578160200160208202803683370190505b5090508161142f5793506114e592505050565b600061143a886117d9565b90506000816040015161144b575080515b885b88811415801561145d5750848714155b156114d95761146b81611ed2565b925082604001511561147c576114d1565b82516001600160a01b03161561149157825191505b8a6001600160a01b0316826001600160a01b031614156114d157808488806001019950815181106114c4576114c4612ab2565b6020026020010181815250505b60010161144d565b50505092835250909150505b9392505050565b806000811180156114ff57506011548111155b61151b5760405162461bcd60e51b8152600401610a6690612ac8565b60125460105461152b9190612af6565b81611534610ac3565b61153e9190612b0d565b111561155c5760405162461bcd60e51b8152600401610a6690612b25565b8180600f5461156b9190612a71565b3410156115b05760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610a66565b60135460ff16156116035760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610a66565b610f713384611f0e565b6001600160a01b0382163314156116375760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e8054610fef906129eb565b6008546001600160a01b031633146116da5760405162461bcd60e51b8152600401610a6690612a26565b601155565b6008546001600160a01b031633146117095760405162461bcd60e51b8152600401610a6690612a26565b601380549115156101000261ff0019909216919091179055565b61172e848484610ad1565b6001600160a01b0383163b156117675761174a84848484611f28565b611767576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117975760405162461bcd60e51b8152600401610a6690612a26565b6010546117a2610ac3565b6117ad906001612b0d565b11156117cb5760405162461bcd60e51b8152600401610a6690612b25565b6117d6816001611f0e565b50565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152600183108061183257506000548310155b1561183d5792915050565b61184683611ed2565b90508060400151156118585792915050565b6114e583612020565b606061186c82611de2565b6118d05760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a66565b60135462010000900460ff1661197257600e80546118ed906129eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611919906129eb565b80156119665780601f1061193b57610100808354040283529160200191611966565b820191906000526020600020905b81548152906001019060200180831161194957829003601f168201915b50505050509050919050565b600061197c612055565b9050600081511161199c57604051806020016040528060008152506114e5565b806119a684612064565b600d6040516020016119ba93929190612b53565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146119fa5760405162461bcd60e51b8152600401610a6690612a26565b601255565b82600081118015611a1257506011548111155b611a2e5760405162461bcd60e51b8152600401610a6690612ac8565b601254601054611a3e9190612af6565b81611a47610ac3565b611a519190612b0d565b1115611a6f5760405162461bcd60e51b8152600401610a6690612b25565b8380600f54611a7e9190612a71565b341015611ac35760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610a66565b601354610100900460ff16611b255760405162461bcd60e51b815260206004820152602260248201527f5468652077686974656c6973742073616c65206973206e6f7420656e61626c65604482015261642160f01b6064820152608401610a66565b336000908152600b602052604090205460ff1615611b855760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610a66565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bff85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506121ca565b611c3c5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610a66565b336000818152600b60205260409020805460ff19166001179055610c5b9087611f0e565b6008546001600160a01b03163314611c8a5760405162461bcd60e51b8152600401610a6690612a26565b60138054911515620100000262ff000019909216919091179055565b81600081118015611cb957506011548111155b611cd55760405162461bcd60e51b8152600401610a6690612ac8565b601254601054611ce59190612af6565b81611cee610ac3565b611cf89190612b0d565b1115611d165760405162461bcd60e51b8152600401610a6690612b25565b6008546001600160a01b03163314611d405760405162461bcd60e51b8152600401610a6690612a26565b610f718284611f0e565b6008546001600160a01b03163314611d745760405162461bcd60e51b8152600401610a6690612a26565b6001600160a01b038116611dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a66565b6117d681611e80565b600081600111158015611df6575060005482105b80156108c0575050600090815260046020526040902054600160e01b161590565b60008180600111611e6757600054811015611e6757600081815260046020526040902054600160e01b8116611e65575b806114e5575060001901600081815260046020526040902054611e47565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546108c0906121e0565b610a82828260405180602001604052806000815250612227565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f5d903390899088908890600401612c17565b602060405180830381600087803b158015611f7757600080fd5b505af1925050508015611fa7575060408051601f3d908101601f19168201909252611fa491810190612c54565b60015b612002573d808015611fd5576040519150601f19603f3d011682016040523d82523d6000602084013e611fda565b606091505b508051611ffa576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526108c061205083611e17565b6121e0565b6060600c80546108d5906129eb565b606060018272184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b81106120a7576040919091019072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b90045b6d04ee2d6d415b85acef810000000081106120d557602091909101906d04ee2d6d415b85acef810000000090045b662386f26fc1000081106120f55760109190910190662386f26fc1000090045b6305f5e100811061210f57600891909101906305f5e10090045b6127108110612125576004919091019061271090045b606481106121395760029190910190606490045b600a8110612148576001820191505b6000826001600160401b03811115612162576121626125cd565b6040519080825280601f01601f19166020018201604052801561218c576020820181803683370190505b5090508281016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a87061a8153600a86049550856121c557611132565b612196565b6000826121d78584612294565b14949350505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6122318383612340565b6001600160a01b0383163b15610f71576000548281035b61225b6000868380600101945086611f28565b612278576040516368d2bf6b60e11b815260040160405180910390fd5b81811061224857816000541461228d57600080fd5b5050505050565b600081815b84518110156123385760008582815181106122b6576122b6612ab2565b602002602001015190508083116122f8576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612325565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061233081612c71565b915050612299565b509392505050565b600054816123615760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461241057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016123d8565b508161242e57604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054612443906129eb565b90600052602060002090601f01602090048101928261246557600085556124ab565b82601f1061247e57805160ff19168380011785556124ab565b828001600101855582156124ab579182015b828111156124ab578251825591602001919060010190612490565b506124b79291506124bb565b5090565b5b808211156124b757600081556001016124bc565b6001600160e01b0319811681146117d657600080fd5b6000602082840312156124f857600080fd5b81356114e5816124d0565b60005b8381101561251e578181015183820152602001612506565b838111156117675750506000910152565b60008151808452612547816020860160208601612503565b601f01601f19169290920160200192915050565b6020815260006114e5602083018461252f565b60006020828403121561258057600080fd5b5035919050565b80356001600160a01b038116811461259e57600080fd5b919050565b600080604083850312156125b657600080fd5b6125bf83612587565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b03808411156125fd576125fd6125cd565b604051601f8501601f19908116603f01168101908282118183101715612625576126256125cd565b8160405280935085815286868601111561263e57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561266a57600080fd5b81356001600160401b0381111561268057600080fd5b8201601f8101841361269157600080fd5b612018848235602084016125e3565b8035801515811461259e57600080fd5b6000602082840312156126c257600080fd5b6114e5826126a0565b6000806000606084860312156126e057600080fd5b6126e984612587565b92506126f760208501612587565b9150604084013590509250925092565b60008083601f84011261271957600080fd5b5081356001600160401b0381111561273057600080fd5b6020830191508360208260051b850101111561274b57600080fd5b9250929050565b6000806020838503121561276557600080fd5b82356001600160401b0381111561277b57600080fd5b61278785828601612707565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015611346576127fe838551612793565b92840192608092909201916001016127eb565b60006020828403121561282357600080fd5b6114e582612587565b6020808252825182820181905260009190848201906040850190845b8181101561134657835183529284019291840191600101612848565b60008060006060848603121561287957600080fd5b61288284612587565b95602085013595506040909401359392505050565b600080604083850312156128aa57600080fd5b6128b383612587565b91506128c1602084016126a0565b90509250929050565b600080600080608085870312156128e057600080fd5b6128e985612587565b93506128f760208601612587565b92506040850135915060608501356001600160401b0381111561291957600080fd5b8501601f8101871361292a57600080fd5b612939878235602084016125e3565b91505092959194509250565b608081016108c08284612793565b60008060006040848603121561296857600080fd5b8335925060208401356001600160401b0381111561298557600080fd5b61299186828701612707565b9497909650939450505050565b600080604083850312156129b157600080fd5b6129ba83612587565b91506128c160208401612587565b600080604083850312156129db57600080fd5b823591506128c160208401612587565b600181811c908216806129ff57607f821691505b60208210811415612a2057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612a8b57612a8b612a5b565b500290565b600082612aad57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b600082821015612b0857612b08612a5b565b500390565b60008219821115612b2057612b20612a5b565b500190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b600084516020612b668285838a01612503565b855191840191612b798184848a01612503565b8554920191600090600181811c9080831680612b9657607f831692505b858310811415612bb457634e487b7160e01b85526022600452602485fd5b808015612bc85760018114612bd957612c06565b60ff19851688528388019550612c06565b60008b81526020902060005b85811015612bfe5781548a820152908401908801612be5565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c4a9083018461252f565b9695505050505050565b600060208284031215612c6657600080fd5b81516114e5816124d0565b6000600019821415612c8557612c85612a5b565b506001019056fea2646970667358221220facd34ba18c84ee6a929bfca3bf327d003516ade0607aa736ed59bfd57971b1d64736f6c63430008090033
Deployed Bytecode Sourcemap
74580:5808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21410:689;;;;;;;;;;-1:-1:-1;21410:689:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;21410:689:0;;;;;;;;22362:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29251:268::-;;;;;;;;;;-1:-1:-1;29251:268:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;29251:268:0;1528:203:1;28692:400:0;;;;;;;;;;-1:-1:-1;28692:400:0;;;;;:::i;:::-;;:::i;:::-;;74900:19;;;;;;;;;;;;;;;;;;;2319:25:1;;;2307:2;2292:18;74900:19:0;2173:177:1;78887:106:0;;;;;;;;;;-1:-1:-1;78887:106:0;;;;;:::i;:::-;;:::i;79001:83::-;;;;;;;;;;-1:-1:-1;79001:83:0;;;;;:::i;:::-;;:::i;17935:323::-;;;;;;;;;;;;;:::i;33090:2995::-;;;;;;;;;;-1:-1:-1;33090:2995:0;;;;;:::i;:::-;;:::i;74696:25::-;;;;;;;;;;;;;;;;79323:944;;;;;;;;;;;;;:::i;36181:185::-;;;;;;;;;;-1:-1:-1;36181:185:0;;;;;:::i;:::-;;:::i;78202:80::-;;;;;;;;;;-1:-1:-1;78202:80:0;;;;;:::i;:::-;;:::i;78604:161::-;;;;;;;;;;-1:-1:-1;78604:161:0;;;;;:::i;:::-;;:::i;75114:28::-;;;;;;;;;;-1:-1:-1;75114:28:0;;;;;;;;;;;74820:33;;;;;;;;;;;;;:::i;57057:560::-;;;;;;;;;;-1:-1:-1;57057:560:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;75035:25::-;;;;;;;;;;-1:-1:-1;75035:25:0;;;;;;;;74785:28;;;;;;;;;;;;;:::i;23852:202::-;;;;;;;;;;-1:-1:-1;23852:202:0;;;;;:::i;:::-;;:::i;75067:40::-;;;;;;;;;;-1:-1:-1;75067:40:0;;;;;;;;;;;19119:283;;;;;;;;;;-1:-1:-1;19119:283:0;;;;;:::i;:::-;;:::i;64691:103::-;;;;;;;;;;;;;:::i;79092:104::-;;;;;;;;;;-1:-1:-1;79092:104:0;;;;;:::i;:::-;;:::i;78773:106::-;;;;;;;;;;-1:-1:-1;78773:106:0;;;;;:::i;:::-;;:::i;61031:1016::-;;;;;;;;;;-1:-1:-1;61031:1016:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64040:87::-;;;;;;;;;;-1:-1:-1;64113:6:0;;-1:-1:-1;;;;;64113:6:0;64040:87;;74957:33;;;;;;;;;;;;;;;;22538:104;;;;;;;;;;;;;:::i;58005:2579::-;;;;;;;;;;-1:-1:-1;58005:2579:0;;;;;:::i;:::-;;:::i;76609:263::-;;;;;;:::i;:::-;;:::i;29859:340::-;;;;;;;;;;-1:-1:-1;29859:340:0;;;;;:::i;:::-;;:::i;74860:31::-;;;;;;;;;;;;;:::i;78290:159::-;;;;;;;;;;-1:-1:-1;78290:159:0;;;;;:::i;:::-;;:::i;79204:111::-;;;;;;;;;;-1:-1:-1;79204:111:0;;;;;:::i;:::-;;:::i;36964:399::-;;;;;;;;;;-1:-1:-1;36964:399:0;;;;;:::i;:::-;;:::i;76880:174::-;;;;;;;;;;-1:-1:-1;76880:174:0;;;;;:::i;:::-;;:::i;56420:478::-;;;;;;;;;;-1:-1:-1;56420:478:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77372:727::-;;;;;;;;;;-1:-1:-1;77372:727:0;;;;;:::i;:::-;;:::i;78457:139::-;;;;;;;;;;-1:-1:-1;78457:139:0;;;;;:::i;:::-;;:::i;75911:690::-;;;;;;:::i;:::-;;:::i;74926:24::-;;;;;;;;;;;;;;;;74728:48;;;;;;;;;;-1:-1:-1;74728:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;78107:87;;;;;;;;;;-1:-1:-1;78107:87:0;;;;;:::i;:::-;;:::i;30356:214::-;;;;;;;;;;-1:-1:-1;30356:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;30527:25:0;;;30498:4;30527:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30356:214;77062:193;;;;;;;;;;-1:-1:-1;77062:193:0;;;;;:::i;:::-;;:::i;64949:238::-;;;;;;;;;;-1:-1:-1;64949:238:0;;;;;:::i;:::-;;:::i;21410:689::-;21540:4;-1:-1:-1;;;;;;;;;21869:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;21946:25:0;;;21869:102;:179;;;-1:-1:-1;;;;;;;;;;22023:25:0;;;21869:179;21849:199;21410:689;-1:-1:-1;;21410:689:0:o;22362:100::-;22416:13;22449:5;22442:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22362:100;:::o;29251:268::-;29372:7;29402:16;29410:7;29402;:16::i;:::-;29397:64;;29427:34;;-1:-1:-1;;;29427:34:0;;;;;;;;;;;29397:64;-1:-1:-1;29481:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;29481:30:0;;29251:268::o;28692:400::-;28773:13;28789:16;28797:7;28789;:16::i;:::-;28773:32;-1:-1:-1;53590:10:0;-1:-1:-1;;;;;28822:28:0;;;28818:175;;28870:44;28887:5;53590:10;30356:214;:::i;28870:44::-;28865:128;;28942:35;;-1:-1:-1;;;28942:35:0;;;;;;;;;;;28865:128;29005:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;29005:35:0;-1:-1:-1;;;;;29005:35:0;;;;;;;;;29056:28;;29005:24;;29056:28;;;;;;;28762:330;28692:400;;:::o;78887:106::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;;;;;;;;;78963:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;78887:106:::0;:::o;79001:83::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;79061:6:::1;:15:::0;;-1:-1:-1;;79061:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;79001:83::o;17935:323::-;77355:1;18209:12;17996:7;18193:13;:28;-1:-1:-1;;18193:46:0;;17935:323::o;33090:2995::-;33224:27;33254;33273:7;33254:18;:27::i;:::-;33224:57;;33339:4;-1:-1:-1;;;;;33298:45:0;33314:19;-1:-1:-1;;;;;33298:45:0;;33294:99;;33365:28;;-1:-1:-1;;;33365:28:0;;;;;;;;;;;33294:99;33421:27;32204:24;;;:15;:24;;;;;32426:26;;53590:10;31829:30;;;-1:-1:-1;;;;;31522:28:0;;31807:20;;;31804:56;33630:287;;33813:43;33830:4;53590:10;30356:214;:::i;33813:43::-;33808:109;;33882:35;;-1:-1:-1;;;33882:35:0;;;;;;;;;;;33808:109;-1:-1:-1;;;;;33934:16:0;;33930:52;;33959:23;;-1:-1:-1;;;33959:23:0;;;;;;;;;;;33930:52;34131:15;34128:160;;;34271:1;34250:19;34243:30;34128:160;-1:-1:-1;;;;;34668:24:0;;;;;;;:18;:24;;;;;;34666:26;;-1:-1:-1;;34666:26:0;;;34737:22;;;;;;;;;34735:24;;-1:-1:-1;34735:24:0;;;27504:11;27479:23;27475:41;27427:112;-1:-1:-1;;;27427:112:0;35030:26;;;;:17;:26;;;;;:196;-1:-1:-1;;;35346:47:0;;35342:627;;35451:1;35441:11;;35419:19;35574:30;;;:17;:30;;;;;;35570:384;;35712:13;;35697:11;:28;35693:242;;35859:30;;;;:17;:30;;;;;:52;;;35693:242;35400:569;35342:627;36016:7;36012:2;-1:-1:-1;;;;;35997:27:0;36006:4;-1:-1:-1;;;;;35997:27:0;;;;;;;;;;;36035:42;33213:2872;;;33090:2995;;;:::o;79323:944::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;69645:1:::1;70243:7;;:19;;70235:63;;;::::0;-1:-1:-1;;;70235:63:0;;10860:2:1;70235:63:0::1;::::0;::::1;10842:21:1::0;10899:2;10879:18;;;10872:30;10938:33;10918:18;;;10911:61;10989:18;;70235:63:0::1;10658:355:1::0;70235:63:0::1;69645:1;70376:7;:18:::0;79385:6:::2;79405:42;79506:3;79476:26;:21;79500:2;79476:26;:::i;:::-;79475:34;;;;:::i;:::-;79397:127;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79384:140;;;79543:1;79535:10;;;::::0;::::2;;79559:6;79579:42;79680:3;79650:26;:21;79674:2;79650:26;:::i;:::-;79649:34;;;;:::i;:::-;79571:127;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79558:140;;;79717:1;79709:10;;;::::0;::::2;;79733:6;79753:42;79854:3;79824:26;:21;79848:2;79824:26;:::i;:::-;79823:34;;;;:::i;:::-;79745:127;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79732:140;;;79891:1;79883:10;;;::::0;::::2;;79907:6;79927:42;80028:3;79998:26;:21;80022:2;79998:26;:::i;:::-;79997:34;;;;:::i;:::-;79919:127;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79906:140;;;80065:1;80057:10;;;::::0;::::2;;80081:6;80101:7;64113:6:::0;;-1:-1:-1;;;;;64113:6:0;;64040:87;80101:7:::2;-1:-1:-1::0;;;;;80093:21:0::2;80122;80093:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80080:68;;;80167:1;80159:10;;;::::0;::::2;;-1:-1:-1::0;;69601:1:0::1;70555:7;:22:::0;-1:-1:-1;;;79323:944:0:o;36181:185::-;36319:39;36336:4;36342:2;36346:7;36319:39;;;;;;;;;;;;:16;:39::i;:::-;36181:185;;;:::o;78202:80::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78262:4:::1;:12:::0;78202:80::o;78604:161::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78719:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;74820:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57057:560::-;57201:23;57292:8;57267:22;57292:8;-1:-1:-1;;;;;57359:68:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57359:68:0;;-1:-1:-1;;57359:68:0;;;;;;;;;;;;57322:105;;57447:9;57442:125;57463:14;57458:1;:19;57442:125;;57519:32;57539:8;;57548:1;57539:11;;;;;;;:::i;:::-;;;;;;;57519:19;:32::i;:::-;57503:10;57514:1;57503:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;57479:3;;57442:125;;;-1:-1:-1;57588:10:0;57057:560;-1:-1:-1;;;;57057:560:0:o;74785:28::-;;;;;;;:::i;23852:202::-;23969:7;24017:27;24036:7;24017:18;:27::i;19119:283::-;19236:7;-1:-1:-1;;;;;19265:19:0;;19261:60;;19293:28;;-1:-1:-1;;;19293:28:0;;;;;;;;;;;19261:60;-1:-1:-1;;;;;;19339:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;19339:55:0;;19119:283::o;64691:103::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;64756:30:::1;64783:1;64756:18;:30::i;:::-;64691:103::o:0;79092:104::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;79164:10:::1;:24:::0;79092:104::o;78773:106::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78849:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;61031:1016::-:0;61154:16;61213:19;61247:25;61287:22;61312:16;61322:5;61312:9;:16::i;:::-;61287:41;;61343:25;61385:14;-1:-1:-1;;;;;61371:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61371:29:0;;61343:57;;61415:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61415:31:0;77355:1;61461:538;61545:14;61530:11;:29;61461:538;;61628:15;61641:1;61628:12;:15::i;:::-;61616:27;;61666:9;:16;;;61662:73;;;61707:8;;61662:73;61757:14;;-1:-1:-1;;;;;61757:28:0;;61753:111;;61830:14;;;-1:-1:-1;61753:111:0;61907:5;-1:-1:-1;;;;;61886:26:0;:17;-1:-1:-1;;;;;61886:26:0;;61882:102;;;61963:1;61937:8;61946:13;;;;;;61937:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;61882:102;61578:3;;61461:538;;;-1:-1:-1;62020:8:0;;61031:1016;-1:-1:-1;;;;;;61031:1016:0:o;22538:104::-;22594:13;22627:7;22620:14;;;;;:::i;58005:2579::-;58148:16;58215:4;58206:5;:13;58202:45;;58228:19;;-1:-1:-1;;;58228:19:0;;;;;;;;;;;58202:45;58262:19;58296:17;58316:14;17677:7;17704:13;;17622:103;58316:14;58296:34;-1:-1:-1;77355:1:0;58408:5;:23;58404:87;;;77355:1;58452:23;;58404:87;58567:9;58560:4;:16;58556:73;;;58604:9;58597:16;;58556:73;58643:25;58671:16;58681:5;58671:9;:16::i;:::-;58643:44;;58865:4;58857:5;:12;58853:278;;;58912:12;;;58947:31;;;58943:111;;;59023:11;59003:31;;58943:111;58871:198;58853:278;;;-1:-1:-1;59114:1:0;58853:278;59145:25;59187:17;-1:-1:-1;;;;;59173:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59173:32:0;-1:-1:-1;59145:60:0;-1:-1:-1;59224:22:0;59220:78;;59274:8;-1:-1:-1;59267:15:0;;-1:-1:-1;;;59267:15:0;59220:78;59442:31;59476:26;59496:5;59476:19;:26::i;:::-;59442:60;;59517:25;59762:9;:16;;;59757:92;;-1:-1:-1;59819:14:0;;59757:92;59898:5;59863:544;59927:4;59922:1;:9;;:45;;;;;59950:17;59935:11;:32;;59922:45;59863:544;;;60036:15;60049:1;60036:12;:15::i;:::-;60024:27;;60074:9;:16;;;60070:73;;;60115:8;;60070:73;60165:14;;-1:-1:-1;;;;;60165:28:0;;60161:111;;60238:14;;;-1:-1:-1;60161:111:0;60315:5;-1:-1:-1;;;;;60294:26:0;:17;-1:-1:-1;;;;;60294:26:0;;60290:102;;;60371:1;60345:8;60354:13;;;;;;60345:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;60290:102;59986:3;;59863:544;;;-1:-1:-1;;;60492:29:0;;;-1:-1:-1;60499:8:0;;-1:-1:-1;;58005:2579:0;;;;;;:::o;76609:263::-;76701:11;75508:1;75494:11;:15;:52;;;;;75528:18;;75513:11;:33;;75494:52;75472:122;;;;-1:-1:-1;;;75472:122:0;;;;;;;:::i;:::-;75670:13;;75658:9;;:25;;;;:::i;:::-;75643:11;75627:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:56;;75605:126;;;;-1:-1:-1;;;75605:126:0;;;;;;;:::i;:::-;76743:11:::1;75848;75841:4;;:18;;;;:::i;:::-;75828:9;:31;;75820:63;;;::::0;-1:-1:-1;;;75820:63:0;;13182:2:1;75820:63:0::1;::::0;::::1;13164:21:1::0;13221:2;13201:18;;;13194:30;-1:-1:-1;;;13240:18:1;;;13233:49;13299:18;;75820:63:0::1;12980:343:1::0;75820:63:0::1;76781:6:::2;::::0;::::2;;76780:7;76772:43;;;::::0;-1:-1:-1;;;76772:43:0;;13530:2:1;76772:43:0::2;::::0;::::2;13512:21:1::0;13569:2;13549:18;;;13542:30;13608:25;13588:18;;;13581:53;13651:18;;76772:43:0::2;13328:347:1::0;76772:43:0::2;76828:36;53590:10:::0;76852:11:::2;76828:9;:36::i;29859:340::-:0;-1:-1:-1;;;;;29990:31:0;;53590:10;29990:31;29986:61;;;30030:17;;-1:-1:-1;;;30030:17:0;;;;;;;;;;;29986:61;53590:10;30060:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;30060:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;30060:60:0;;;;;;;;;;30136:55;;540:41:1;;;30060:49:0;;53590:10;30136:55;;513:18:1;30136:55:0;;;;;;;29859:340;;:::o;74860:31::-;;;;;;;:::i;78290:159::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78401:18:::1;:40:::0;78290:159::o;79204:111::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;79278:20:::1;:29:::0;;;::::1;;;;-1:-1:-1::0;;79278:29:0;;::::1;::::0;;;::::1;::::0;;79204:111::o;36964:399::-;37131:31;37144:4;37150:2;37154:7;37131:12;:31::i;:::-;-1:-1:-1;;;;;37177:14:0;;;:19;37173:183;;37216:56;37247:4;37253:2;37257:7;37266:5;37216:30;:56::i;:::-;37211:145;;37300:40;;-1:-1:-1;;;37300:40:0;;;;;;;;;;;37211:145;36964:399;;;;:::o;76880:174::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;76978:9:::1;;76957:13;:11;:13::i;:::-;:17;::::0;76973:1:::1;76957:17;:::i;:::-;:30;;76949:63;;;;-1:-1:-1::0;;;76949:63:0::1;;;;;;;:::i;:::-;77023:23;77033:9;77044:1;77023:9;:23::i;:::-;76880:174:::0;:::o;56420:478::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77355:1:0;56634:7;:25;:54;;;-1:-1:-1;17677:7:0;17704:13;56663:7;:25;;56634:54;56630:103;;;56712:9;56420:478;-1:-1:-1;;56420:478:0:o;56630:103::-;56755:21;56768:7;56755:12;:21::i;:::-;56743:33;;56791:9;:16;;;56787:65;;;56831:9;56420:478;-1:-1:-1;;56420:478:0:o;56787:65::-;56869:21;56882:7;56869:12;:21::i;77372:727::-;77491:13;77544:17;77552:8;77544:7;:17::i;:::-;77522:114;;;;-1:-1:-1;;;77522:114:0;;13882:2:1;77522:114:0;;;13864:21:1;13921:2;13901:18;;;13894:30;13960:34;13940:18;;;13933:62;-1:-1:-1;;;14011:18:1;;;14004:45;14066:19;;77522:114:0;13680:411:1;77522:114:0;77653:8;;;;;;;77649:74;;77694:17;77687:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77372:727;;;:::o;77649:74::-;77735:28;77766:10;:8;:10::i;:::-;77735:41;;77838:1;77813:14;77807:28;:32;:284;;;;;;;;;;;;;;;;;77931:14;77972:19;:8;:17;:19::i;:::-;78018:9;77888:162;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77787:304;77372:727;-1:-1:-1;;;77372:727:0:o;78457:139::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78558:13:::1;:30:::0;78457:139::o;75911:690::-;76045:11;75508:1;75494:11;:15;:52;;;;;75528:18;;75513:11;:33;;75494:52;75472:122;;;;-1:-1:-1;;;75472:122:0;;;;;;;:::i;:::-;75670:13;;75658:9;;:25;;;;:::i;:::-;75643:11;75627:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:56;;75605:126;;;;-1:-1:-1;;;75605:126:0;;;;;;;:::i;:::-;76087:11:::1;75848;75841:4;;:18;;;;:::i;:::-;75828:9;:31;;75820:63;;;::::0;-1:-1:-1;;;75820:63:0;;13182:2:1;75820:63:0::1;::::0;::::1;13164:21:1::0;13221:2;13201:18;;;13194:30;-1:-1:-1;;;13240:18:1;;;13233:49;13299:18;;75820:63:0::1;12980:343:1::0;75820:63:0::1;76166:20:::2;::::0;::::2;::::0;::::2;;;76158:67;;;::::0;-1:-1:-1;;;76158:67:0;;15956:2:1;76158:67:0::2;::::0;::::2;15938:21:1::0;15995:2;15975:18;;;15968:30;16034:34;16014:18;;;16007:62;-1:-1:-1;;;16085:18:1;;;16078:32;16127:19;;76158:67:0::2;15754:398:1::0;76158:67:0::2;53590:10:::0;76245:30:::2;::::0;;;:16:::2;:30;::::0;;;;;::::2;;76244:31;76236:68;;;::::0;-1:-1:-1;;;76236:68:0;;16359:2:1;76236:68:0::2;::::0;::::2;16341:21:1::0;16398:2;16378:18;;;16371:30;16437:26;16417:18;;;16410:54;16481:18;;76236:68:0::2;16157:348:1::0;76236:68:0::2;76340:30;::::0;-1:-1:-1;;53590:10:0;16659:2:1;16655:15;16651:53;76340:30:0::2;::::0;::::2;16639:66:1::0;76315:12:0::2;::::0;16721::1;;76340:30:0::2;;;;;;;;;;;;76330:41;;;;;;76315:56;;76404:50;76423:12;;76404:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;76437:10:0::2;::::0;;-1:-1:-1;76449:4:0;;-1:-1:-1;76404:18:0::2;:50::i;:::-;76382:114;;;::::0;-1:-1:-1;;;76382:114:0;;16946:2:1;76382:114:0::2;::::0;::::2;16928:21:1::0;16985:2;16965:18;;;16958:30;-1:-1:-1;;;17004:18:1;;;16997:44;17058:18;;76382:114:0::2;16744:338:1::0;76382:114:0::2;53590:10:::0;76509:30:::2;::::0;;;:16:::2;:30;::::0;;;;:37;;-1:-1:-1;;76509:37:0::2;76542:4;76509:37;::::0;;76557:36:::2;::::0;76581:11;76557:9:::2;:36::i;78107:87::-:0;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;78169:8:::1;:17:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;78169:17:0;;::::1;::::0;;;::::1;::::0;;78107:87::o;77062:193::-;77166:11;75508:1;75494:11;:15;:52;;;;;75528:18;;75513:11;:33;;75494:52;75472:122;;;;-1:-1:-1;;;75472:122:0;;;;;;;:::i;:::-;75670:13;;75658:9;;:25;;;;:::i;:::-;75643:11;75627:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:56;;75605:126;;;;-1:-1:-1;;;75605:126:0;;;;;;;:::i;:::-;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23:::1;64252:68;;;;-1:-1:-1::0;;;64252:68:0::1;;;;;;;:::i;:::-;77214:33:::2;77224:9;77235:11;77214:9;:33::i;64949:238::-:0;64113:6;;-1:-1:-1;;;;;64113:6:0;53590:10;64260:23;64252:68;;;;-1:-1:-1;;;64252:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65052:22:0;::::1;65030:110;;;::::0;-1:-1:-1;;;65030:110:0;;17289:2:1;65030:110:0::1;::::0;::::1;17271:21:1::0;17328:2;17308:18;;;17301:30;17367:34;17347:18;;;17340:62;-1:-1:-1;;;17418:18:1;;;17411:36;17464:19;;65030:110:0::1;17087:402:1::0;65030:110:0::1;65151:28;65170:8;65151:18;:28::i;30828:282::-:0;30893:4;30949:7;77355:1;30930:26;;:66;;;;;30983:13;;30973:7;:23;30930:66;:153;;;;-1:-1:-1;;31034:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;31034:44:0;:49;;30828:282::o;25139:1307::-;25233:7;25273;;77355:1;25322:23;25318:1061;;25375:13;;25368:4;:20;25364:1015;;;25413:14;25430:23;;;:17;:23;;;;;;-1:-1:-1;;;25519:24:0;;25515:845;;26184:113;26191:11;26184:113;;-1:-1:-1;;;26262:6:0;26244:25;;;;:17;:25;;;;;;26184:113;;25515:845;25390:989;25364:1015;26407:31;;-1:-1:-1;;;26407:31:0;;;;;;;;;;;65347:191;65440:6;;;-1:-1:-1;;;;;65457:17:0;;;-1:-1:-1;;;;;;65457:17:0;;;;;;;65490:40;;65440:6;;;65457:17;65440:6;;65490:40;;65421:16;;65490:40;65410:128;65347:191;:::o;24546:202::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24715:24:0;;;;:17;:24;;;;;;24696:44;;:18;:44::i;47116:112::-;47193:27;47203:2;47207:8;47193:27;;;;;;;;;;;;:9;:27::i;39447:831::-;39644:171;;-1:-1:-1;;;39644:171:0;;39610:4;;-1:-1:-1;;;;;39644:45:0;;;;;:171;;53590:10;;39746:4;;39769:7;;39795:5;;39644:171;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39644:171:0;;;;;;;;-1:-1:-1;;39644:171:0;;;;;;;;;;;;:::i;:::-;;;39627:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40029:13:0;;40025:235;;40075:40;;-1:-1:-1;;;40075:40:0;;;;;;;;;;;40025:235;40218:6;40212:13;40203:6;40199:2;40195:15;40188:38;39627:644;-1:-1:-1;;;;;;39888:81:0;-1:-1:-1;;;39888:81:0;;-1:-1:-1;39627:644:0;39447:831;;;;;;:::o;24243:207::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24395:47:0;24414:27;24433:7;24414:18;:27::i;:::-;24395:18;:47::i;80275:110::-;80335:13;80368:9;80361:16;;;;;:::i;70928:1666::-;70984:13;71052:1;71149:5;-1:-1:-1;;;71173:19:0;;71169:110;;71261:2;71251:12;;;;;-1:-1:-1;;;71213:19:0;;71169:110;71310:6;71297:9;:19;71293:110;;71385:2;71375:12;;;;;71350:6;71337:19;;71293:110;71434:6;71421:9;:19;71417:110;;71509:2;71499:12;;;;;71474:6;71461:19;;71417:110;71558:5;71545:9;:18;71541:107;;71631:1;71621:11;;;;;71597:5;71584:18;;71541:107;71679:5;71666:9;:18;71662:107;;71752:1;71742:11;;;;;71718:5;71705:18;;71662:107;71800:5;71787:9;:18;71783:107;;71873:1;71863:11;;;;;71839:5;71826:18;;71783:107;71921:5;71908:9;:18;71904:70;;71957:1;71947:11;;;;71904:70;72038:20;72072:6;-1:-1:-1;;;;;72061:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72061:18:0;-1:-1:-1;72038:41:0;-1:-1:-1;72203:28:0;;;72219:2;72203:28;72260:288;-1:-1:-1;;72292:5:0;-1:-1:-1;;;72429:2:0;72418:14;;72413:30;72292:5;72400:44;72490:2;72481:11;;;-1:-1:-1;72515:10:0;72511:21;;72527:5;;72511:21;72260:288;;66457:190;66582:4;66635;66606:25;66619:5;66626:4;66606:12;:25::i;:::-;:33;;66457:190;-1:-1:-1;;;;66457:190:0:o;26545:398::-;-1:-1:-1;;;;;;;;;;;;;26687:41:0;;;;13937:3;26773:33;;;-1:-1:-1;;;;;26739:68:0;-1:-1:-1;;;26739:68:0;-1:-1:-1;;;26837:24:0;;:29;;-1:-1:-1;;;26818:48:0;;;;14458:3;26906:28;;;;-1:-1:-1;;;26877:58:0;-1:-1:-1;26545:398:0:o;46152:880::-;46283:19;46289:2;46293:8;46283:5;:19::i;:::-;-1:-1:-1;;;;;46344:14:0;;;:19;46340:674;;46384:11;46398:13;46446:14;;;46479:424;46536:205;46605:1;46638:2;46671:7;;;;;;46709:5;46536:30;:205::i;:::-;46505:358;;46799:40;;-1:-1:-1;;;46799:40:0;;;;;;;;;;;46505:358;46898:3;46890:5;:11;46479:424;;46985:3;46968:13;;:20;46964:34;;46990:8;;;46964:34;46365:649;;46152:880;;;:::o;67009:813::-;67119:7;67167:4;67119:7;67182:603;67206:5;:12;67202:1;:16;67182:603;;;67240:20;67263:5;67269:1;67263:8;;;;;;;;:::i;:::-;;;;;;;67240:31;;67306:12;67290;:28;67286:488;;67465:44;;;;;;18399:19:1;;;18434:12;;;18427:28;;;18471:12;;67465:44:0;;;;;;;;;;;;67433:95;;;;;;67418:110;;67286:488;;;67695:44;;;;;;18399:19:1;;;18434:12;;;18427:28;;;18471:12;;67695:44:0;;;;;;;;;;;;67663:95;;;;;;67648:110;;67286:488;-1:-1:-1;67220:3:0;;;;:::i;:::-;;;;67182:603;;;-1:-1:-1;67802:12:0;67009:813;-1:-1:-1;;;67009:813:0:o;40740:2509::-;40813:20;40836:13;40864;40860:44;;40886:18;;-1:-1:-1;;;40886:18:0;;;;;;;;;;;40860:44;-1:-1:-1;;;;;41392:22:0;;;;;;:18;:22;;;;13416:2;41392:22;;;:105;;41464:32;41435:62;;41392:105;;;41740:31;;;:17;:31;;;;;-1:-1:-1;27981:15:0;;27955:24;27951:46;27504:11;27479:23;27475:41;27472:52;27427:112;;41740:194;;41996:23;;;;41740:31;;41392:22;;42495:25;41392:22;;42348:335;42763:1;42749:12;42745:20;42703:346;42804:3;42795:7;42792:16;42703:346;;43022:7;43012:8;43009:1;42982:25;42979:1;42976;42971:59;42857:1;42844:15;42703:346;;;-1:-1:-1;43082:13:0;43078:45;;43104:19;;-1:-1:-1;;;43104:19:0;;;;;;;;;;;43078:45;43140:13;:19;-1:-1:-1;36181:185:0;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;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:127::-;2416:10;2411:3;2407:20;2404:1;2397:31;2447:4;2444:1;2437:15;2471:4;2468:1;2461:15;2487:632;2552:5;-1:-1:-1;;;;;2623:2:1;2615:6;2612:14;2609:40;;;2629:18;;:::i;:::-;2704:2;2698:9;2672:2;2758:15;;-1:-1:-1;;2754:24:1;;;2780:2;2750:33;2746:42;2734:55;;;2804:18;;;2824:22;;;2801:46;2798:72;;;2850:18;;:::i;:::-;2890:10;2886:2;2879:22;2919:6;2910:15;;2949:6;2941;2934:22;2989:3;2980:6;2975:3;2971:16;2968:25;2965:45;;;3006:1;3003;2996:12;2965:45;3056:6;3051:3;3044:4;3036:6;3032:17;3019:44;3111:1;3104:4;3095:6;3087;3083:19;3079:30;3072:41;;;;2487:632;;;;;:::o;3124:451::-;3193:6;3246:2;3234:9;3225:7;3221:23;3217:32;3214:52;;;3262:1;3259;3252:12;3214:52;3302:9;3289:23;-1:-1:-1;;;;;3327:6:1;3324:30;3321:50;;;3367:1;3364;3357:12;3321:50;3390:22;;3443:4;3435:13;;3431:27;-1:-1:-1;3421:55:1;;3472:1;3469;3462:12;3421:55;3495:74;3561:7;3556:2;3543:16;3538:2;3534;3530:11;3495:74;:::i;3580:160::-;3645:20;;3701:13;;3694:21;3684:32;;3674:60;;3730:1;3727;3720:12;3745:180;3801:6;3854:2;3842:9;3833:7;3829:23;3825:32;3822:52;;;3870:1;3867;3860:12;3822:52;3893:26;3909:9;3893:26;:::i;3930:328::-;4007:6;4015;4023;4076:2;4064:9;4055:7;4051:23;4047:32;4044:52;;;4092:1;4089;4082:12;4044:52;4115:29;4134:9;4115:29;:::i;:::-;4105:39;;4163:38;4197:2;4186:9;4182:18;4163:38;:::i;:::-;4153:48;;4248:2;4237:9;4233:18;4220:32;4210:42;;3930:328;;;;;:::o;4445:367::-;4508:8;4518:6;4572:3;4565:4;4557:6;4553:17;4549:27;4539:55;;4590:1;4587;4580:12;4539:55;-1:-1:-1;4613:20:1;;-1:-1:-1;;;;;4645:30:1;;4642:50;;;4688:1;4685;4678:12;4642:50;4725:4;4717:6;4713:17;4701:29;;4785:3;4778:4;4768:6;4765:1;4761:14;4753:6;4749:27;4745:38;4742:47;4739:67;;;4802:1;4799;4792:12;4739:67;4445:367;;;;;:::o;4817:437::-;4903:6;4911;4964:2;4952:9;4943:7;4939:23;4935:32;4932:52;;;4980:1;4977;4970:12;4932:52;5020:9;5007:23;-1:-1:-1;;;;;5045:6:1;5042:30;5039:50;;;5085:1;5082;5075:12;5039:50;5124:70;5186:7;5177:6;5166:9;5162:22;5124:70;:::i;:::-;5213:8;;5098:96;;-1:-1:-1;4817:437:1;-1:-1:-1;;;;4817:437:1:o;5259:349::-;5343:12;;-1:-1:-1;;;;;5339:38:1;5327:51;;5431:4;5420:16;;;5414:23;-1:-1:-1;;;;;5410:48:1;5394:14;;;5387:72;5522:4;5511:16;;;5505:23;5498:31;5491:39;5475:14;;;5468:63;5584:4;5573:16;;;5567:23;5592:8;5563:38;5547:14;;5540:62;5259:349::o;5613:720::-;5844:2;5896:21;;;5966:13;;5869:18;;;5988:22;;;5815:4;;5844:2;6067:15;;;;6041:2;6026:18;;;5815:4;6110:197;6124:6;6121:1;6118:13;6110:197;;;6173:52;6221:3;6212:6;6206:13;6173:52;:::i;:::-;6282:15;;;;6254:4;6245:14;;;;;6146:1;6139:9;6110:197;;6338:186;6397:6;6450:2;6438:9;6429:7;6425:23;6421:32;6418:52;;;6466:1;6463;6456:12;6418:52;6489:29;6508:9;6489:29;:::i;6714:632::-;6885:2;6937:21;;;7007:13;;6910:18;;;7029:22;;;6856:4;;6885:2;7108:15;;;;7082:2;7067:18;;;6856:4;7151:169;7165:6;7162:1;7159:13;7151:169;;;7226:13;;7214:26;;7295:15;;;;7260:12;;;;7187:1;7180:9;7151:169;;7351:322;7428:6;7436;7444;7497:2;7485:9;7476:7;7472:23;7468:32;7465:52;;;7513:1;7510;7503:12;7465:52;7536:29;7555:9;7536:29;:::i;:::-;7526:39;7612:2;7597:18;;7584:32;;-1:-1:-1;7663:2:1;7648:18;;;7635:32;;7351:322;-1:-1:-1;;;7351:322:1:o;7678:254::-;7743:6;7751;7804:2;7792:9;7783:7;7779:23;7775:32;7772:52;;;7820:1;7817;7810:12;7772:52;7843:29;7862:9;7843:29;:::i;:::-;7833:39;;7891:35;7922:2;7911:9;7907:18;7891:35;:::i;:::-;7881:45;;7678:254;;;;;:::o;7937:667::-;8032:6;8040;8048;8056;8109:3;8097:9;8088:7;8084:23;8080:33;8077:53;;;8126:1;8123;8116:12;8077:53;8149:29;8168:9;8149:29;:::i;:::-;8139:39;;8197:38;8231:2;8220:9;8216:18;8197:38;:::i;:::-;8187:48;;8282:2;8271:9;8267:18;8254:32;8244:42;;8337:2;8326:9;8322:18;8309:32;-1:-1:-1;;;;;8356:6:1;8353:30;8350:50;;;8396:1;8393;8386:12;8350:50;8419:22;;8472:4;8464:13;;8460:27;-1:-1:-1;8450:55:1;;8501:1;8498;8491:12;8450:55;8524:74;8590:7;8585:2;8572:16;8567:2;8563;8559:11;8524:74;:::i;:::-;8514:84;;;7937:667;;;;;;;:::o;8609:264::-;8803:3;8788:19;;8816:51;8792:9;8849:6;8816:51;:::i;8878:505::-;8973:6;8981;8989;9042:2;9030:9;9021:7;9017:23;9013:32;9010:52;;;9058:1;9055;9048:12;9010:52;9094:9;9081:23;9071:33;;9155:2;9144:9;9140:18;9127:32;-1:-1:-1;;;;;9174:6:1;9171:30;9168:50;;;9214:1;9211;9204:12;9168:50;9253:70;9315:7;9306:6;9295:9;9291:22;9253:70;:::i;:::-;8878:505;;9342:8;;-1:-1:-1;9227:96:1;;-1:-1:-1;;;;8878:505:1:o;9388:260::-;9456:6;9464;9517:2;9505:9;9496:7;9492:23;9488:32;9485:52;;;9533:1;9530;9523:12;9485:52;9556:29;9575:9;9556:29;:::i;:::-;9546:39;;9604:38;9638:2;9627:9;9623:18;9604:38;:::i;9653:254::-;9721:6;9729;9782:2;9770:9;9761:7;9757:23;9753:32;9750:52;;;9798:1;9795;9788:12;9750:52;9834:9;9821:23;9811:33;;9863:38;9897:2;9886:9;9882:18;9863:38;:::i;9912:380::-;9991:1;9987:12;;;;10034;;;10055:61;;10109:4;10101:6;10097:17;10087:27;;10055:61;10162:2;10154:6;10151:14;10131:18;10128:38;10125:161;;;10208:10;10203:3;10199:20;10196:1;10189:31;10243:4;10240:1;10233:15;10271:4;10268:1;10261:15;10125:161;;9912:380;;;:::o;10297:356::-;10499:2;10481:21;;;10518:18;;;10511:30;10577:34;10572:2;10557:18;;10550:62;10644:2;10629:18;;10297:356::o;11018:127::-;11079:10;11074:3;11070:20;11067:1;11060:31;11110:4;11107:1;11100:15;11134:4;11131:1;11124:15;11150:168;11190:7;11256:1;11252;11248:6;11244:14;11241:1;11238:21;11233:1;11226:9;11219:17;11215:45;11212:71;;;11263:18;;:::i;:::-;-1:-1:-1;11303:9:1;;11150:168::o;11455:217::-;11495:1;11521;11511:132;;11565:10;11560:3;11556:20;11553:1;11546:31;11600:4;11597:1;11590:15;11628:4;11625:1;11618:15;11511:132;-1:-1:-1;11657:9:1;;11455:217::o;11887:127::-;11948:10;11943:3;11939:20;11936:1;11929:31;11979:4;11976:1;11969:15;12003:4;12000:1;11993:15;12019:344;12221:2;12203:21;;;12260:2;12240:18;;;12233:30;-1:-1:-1;;;12294:2:1;12279:18;;12272:50;12354:2;12339:18;;12019:344::o;12368:125::-;12408:4;12436:1;12433;12430:8;12427:34;;;12441:18;;:::i;:::-;-1:-1:-1;12478:9:1;;12368:125::o;12498:128::-;12538:3;12569:1;12565:6;12562:1;12559:13;12556:39;;;12575:18;;:::i;:::-;-1:-1:-1;12611:9:1;;12498:128::o;12631:344::-;12833:2;12815:21;;;12872:2;12852:18;;;12845:30;-1:-1:-1;;;12906:2:1;12891:18;;12884:50;12966:2;12951:18;;12631:344::o;14222:1527::-;14446:3;14484:6;14478:13;14510:4;14523:51;14567:6;14562:3;14557:2;14549:6;14545:15;14523:51;:::i;:::-;14637:13;;14596:16;;;;14659:55;14637:13;14596:16;14681:15;;;14659:55;:::i;:::-;14803:13;;14736:20;;;14776:1;;14863;14885:18;;;;14938;;;;14965:93;;15043:4;15033:8;15029:19;15017:31;;14965:93;15106:2;15096:8;15093:16;15073:18;15070:40;15067:167;;;-1:-1:-1;;;15133:33:1;;15189:4;15186:1;15179:15;15219:4;15140:3;15207:17;15067:167;15250:18;15277:110;;;;15401:1;15396:328;;;;15243:481;;15277:110;-1:-1:-1;;15312:24:1;;15298:39;;15357:20;;;;-1:-1:-1;15277:110:1;;15396:328;14169:1;14162:14;;;14206:4;14193:18;;15491:1;15505:169;15519:8;15516:1;15513:15;15505:169;;;15601:14;;15586:13;;;15579:37;15644:16;;;;15536:10;;15505:169;;;15509:3;;15705:8;15698:5;15694:20;15687:27;;15243:481;-1:-1:-1;15740:3:1;;14222:1527;-1:-1:-1;;;;;;;;;;;14222:1527:1:o;17494:489::-;-1:-1:-1;;;;;17763:15:1;;;17745:34;;17815:15;;17810:2;17795:18;;17788:43;17862:2;17847:18;;17840:34;;;17910:3;17905:2;17890:18;;17883:31;;;17688:4;;17931:46;;17957:19;;17949:6;17931:46;:::i;:::-;17923:54;17494:489;-1:-1:-1;;;;;;17494:489:1:o;17988:249::-;18057:6;18110:2;18098:9;18089:7;18085:23;18081:32;18078:52;;;18126:1;18123;18116:12;18078:52;18158:9;18152:16;18177:30;18201:5;18177:30;:::i;18494:135::-;18533:3;-1:-1:-1;;18554:17:1;;18551:43;;;18574:18;;:::i;:::-;-1:-1:-1;18621:1:1;18610:13;;18494:135::o
Swarm Source
ipfs://facd34ba18c84ee6a929bfca3bf327d003516ade0607aa736ed59bfd57971b1d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.