Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,555 TSUKIMI
Holders
1,433
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 TSUKIMILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Tsukimi
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "./ERC721A.sol"; import "./ERC721AQueryable.sol"; contract Tsukimi is ERC721A, ERC721AQueryable, Ownable, ReentrancyGuard { constructor() ERC721A("Tsukimi", "TSUKIMI") {} event AllowlistSale(bool indexed _type); event PublicSale(bool indexed _type); mapping (address => uint256) private tokenBalance; address public allowlistSigner = 0x51F62DaA652D1827e6912d1B582F9d33Db465CfA; struct AllowlistSaleConfig { uint256 allowlistSaleStartTime; uint256 allowlistSaleEndTime; bool allowlistStarted; } AllowlistSaleConfig public allowlistSaleConfig; using ECDSA for bytes32; bytes32 private DOMAIN_VERIFICATION = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes("TsukimiLoft")), keccak256(bytes("1")), 1, address(this) ) ); bool public isPublicSaleOn = false; string private _baseTokenURI; function isAllowlisted(address buyerWalletAddress, bytes memory _signature) public view returns (bool) { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_VERIFICATION, keccak256( abi.encode( keccak256( "daydreamers(address buyerWalletAddress,string saleType)" ), buyerWalletAddress, keccak256(bytes("allowlistSale")) ) ) ) ); return ECDSA.recover(digest, _signature) == allowlistSigner ? true : false; } // sets allowlist signer function setAllowlistSigner(address _allowlistSigner) external onlyOwner { allowlistSigner = _allowlistSigner; } // toggles public sale function togglePublicSale() public onlyOwner { isPublicSaleOn = !isPublicSaleOn; emit PublicSale(isPublicSaleOn); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } // sets base URI function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } // starts allowlist sale function startAllowListSale(uint256 _durationInMinutes) external onlyOwner { allowlistSaleConfig = AllowlistSaleConfig( block.timestamp, block.timestamp + (_durationInMinutes * 60), true ); emit AllowlistSale(true); } function stopAllowlistSale() external onlyOwner { allowlistSaleConfig = AllowlistSaleConfig(0, 0, false); emit AllowlistSale(false); } function allowListStarted() public view returns (bool) { AllowlistSaleConfig memory config = allowlistSaleConfig; return config.allowlistStarted; } function allowListTimeLeft() public view returns (uint256) { // returns time left in seconds AllowlistSaleConfig memory config = allowlistSaleConfig; uint32 startTime = uint32(config.allowlistSaleStartTime); uint32 endTime = uint32(config.allowlistSaleEndTime); if (block.timestamp >= startTime && block.timestamp <= endTime) { return endTime - block.timestamp; } return 0; } // dev mints function devMint(address _address, uint256 _amount) external onlyOwner { require( totalSupply() + _amount <= 5555, "Can't mint more than max supply" ); _mint(_address, _amount); } function AllowlistMint(uint256 _amount, bytes memory _signature) public payable { require(allowListTimeLeft() > 0, "Allowlist sale is not active"); require( isAllowlisted(msg.sender, _signature), "Address is not in allowlist" ); require( totalSupply() + _amount <= 5555, "Can't mint more than max tokens" ); require( 2 >= tokenBalance[msg.sender] + _amount, "Max token count per wallet exceeded!" ); _mint(msg.sender, _amount); tokenBalance[msg.sender]=tokenBalance[msg.sender]+_amount; } function mintPublicSale(uint256 _amount) public payable { require(isPublicSaleOn, "Public sale is not on"); require( totalSupply() + _amount <= 5555, "Can't mint more than max tokens" ); require( 2 >= tokenBalance[msg.sender] + _amount, "Max token count per wallet exceeded!" ); require( msg.value >= 0.02 ether * _amount, string( abi.encodePacked( "Not enough ETH! At least ", Strings.toString(0.02 ether * _amount), " wei has to be sent!" ) ) ); _mint(msg.sender, _amount); tokenBalance[msg.sender]=tokenBalance[msg.sender]+_amount; } function withdrawAll() public onlyOwner nonReentrant { (bool success, ) = payable(owner()).call{value: address(this).balance}( "" ); require(success, ""); } function withdraw(uint256 _weiAmount, address _to) public onlyOwner nonReentrant { require( address(this).balance >= _weiAmount, "Not enough ETH to withdraw!" ); (bool success, ) = payable(_to).call{value: _weiAmount}(""); require(success, ""); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721AQueryable.sol'; import '../ERC721A.sol'; /** * @title ERC721A Queryable * @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` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _currentIndex) { return ownership; } ownership = _ownerships[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[] memory tokenIds) external view 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 override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _currentIndex; // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, _currentIndex)`. 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 = _ownerships[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 pfp collections should be fine). */ function tokensOfOwner(address owner) external view 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 = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@openzeppelin/contracts/utils/Context.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/utils/introspection/ERC165.sol'; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary 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 { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, 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. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is 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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import '../IERC721A.sol'; /** * @dev Interface of an ERC721AQueryable compliant contract. */ 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` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ 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 pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_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) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev 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); } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol'; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * 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(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * 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(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
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":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"bool","name":"_type","type":"bool"}],"name":"AllowlistSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_type","type":"bool"}],"name":"PublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"AllowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"allowListStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListTimeLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistSaleConfig","outputs":[{"internalType":"uint256","name":"allowlistSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"allowlistSaleEndTime","type":"uint256"},{"internalType":"bool","name":"allowlistStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","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":"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":"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":[{"internalType":"address","name":"buyerWalletAddress","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintPublicSale","outputs":[],"stateMutability":"payable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_allowlistSigner","type":"address"}],"name":"setAllowlistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_durationInMinutes","type":"uint256"}],"name":"startAllowListSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopAllowlistSale","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":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"_weiAmount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040527351f62daa652d1827e6912d1b582f9d33db465cfa600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6040518060400160405280600b81526020017f5473756b696d694c6f6674000000000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001206001306040516020016200010d959493929190620003b2565b60405160208183030381529060405280519060200120600f556000601060006101000a81548160ff0219169083151502179055503480156200014e57600080fd5b506040518060400160405280600781526020017f5473756b696d69000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f5453554b494d49000000000000000000000000000000000000000000000000008152508160029081620001cc91906200067f565b508060039081620001de91906200067f565b50620001ef6200022560201b60201c565b6000819055505050620002176200020b6200022a60201b60201c565b6200023260201b60201c565b600160098190555062000766565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000819050919050565b6200030d81620002f8565b82525050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000620003556200034f620003498462000313565b6200032a565b6200031d565b9050919050565b620003678162000334565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200039a826200036d565b9050919050565b620003ac816200038d565b82525050565b600060a082019050620003c9600083018862000302565b620003d8602083018762000302565b620003e7604083018662000302565b620003f660608301856200035c565b620004056080830184620003a1565b9695505050505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200049157607f821691505b602082108103620004a757620004a662000449565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005117fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004d2565b6200051d8683620004d2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620005606200055a620005548462000535565b6200032a565b62000535565b9050919050565b6000819050919050565b6200057c836200053f565b620005946200058b8262000567565b848454620004df565b825550505050565b600090565b620005ab6200059c565b620005b881848462000571565b505050565b5b81811015620005e057620005d4600082620005a1565b600181019050620005be565b5050565b601f8211156200062f57620005f981620004ad565b6200060484620004c2565b8101602085101562000614578190505b6200062c6200062385620004c2565b830182620005bd565b50505b505050565b600082821c905092915050565b6000620006546000198460080262000634565b1980831691505092915050565b60006200066f838362000641565b9150826002028217905092915050565b6200068a826200040f565b67ffffffffffffffff811115620006a657620006a56200041a565b5b620006b2825462000478565b620006bf828285620005e4565b600060209050601f831160018114620006f75760008415620006e2578287015190505b620006ee858262000661565b8655506200075e565b601f1984166200070786620004ad565b60005b8281101562000731578489015182556001820191506020850194506020810190506200070a565b868310156200075157848901516200074d601f89168262000641565b8355505b6001600288020188555050505b505050505050565b61528080620007766000396000f3fe6080604052600436106102195760003560e01c80638462151c11610123578063c12f0396116100ab578063e222c7f91161006f578063e222c7f9146107dc578063e474def4146107f3578063e985e9c51461081c578063ebc90e1b14610859578063f2fde38b1461087057610219565b8063c12f0396146106df578063c23dc68f1461070a578063c32fe11b14610747578063c87b56dd14610772578063d5e2eb55146107af57610219565b806392f6f745116100f257806392f6f745146105fc57806395d89b411461062557806399a2557a14610650578063a22cb4651461068d578063b88d4fde146106b657610219565b80638462151c14610561578063853828b61461059e5780638da5cb5b146105b557806392ed4b10146105e057610219565b806349985a79116101a65780635bbb2177116101755780635bbb21771461046a578063627804af146104a75780636352211e146104d057806370a082311461050d578063715018a61461054a57610219565b806349985a79146103bd57806350cee227146103e857806355f804b3146104255780635a5e5d581461044e57610219565b8063095ea7b3116101ed578063095ea7b3146102ec57806318160ddd1461031557806323b872dd146103405780633f5e47411461036957806342842e0e1461039457610219565b8062f714ce1461021e57806301ffc9a71461024757806306fdde0314610284578063081812fc146102af575b600080fd5b34801561022a57600080fd5b506102456004803603810190610240919061380f565b610899565b005b34801561025357600080fd5b5061026e600480360381019061026991906138a7565b6109ea565b60405161027b91906138ef565b60405180910390f35b34801561029057600080fd5b50610299610acc565b6040516102a6919061399a565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d191906139bc565b610b5e565b6040516102e391906139f8565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613a13565b610bda565b005b34801561032157600080fd5b5061032a610cde565b6040516103379190613a62565b60405180910390f35b34801561034c57600080fd5b5061036760048036038101906103629190613a7d565b610cf5565b005b34801561037557600080fd5b5061037e610d05565b60405161038b91906138ef565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613a7d565b610d18565b005b3480156103c957600080fd5b506103d2610d38565b6040516103df91906138ef565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190613c05565b610d84565b60405161041c91906138ef565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613cc1565b610eab565b005b610468600480360381019061046391906139bc565b610ec9565b005b34801561047657600080fd5b50610491600480360381019061048c9190613dd1565b61112a565b60405161049e9190613f4c565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613a13565b6111eb565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906139bc565b611258565b60405161050491906139f8565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190613f6e565b61126e565b6040516105419190613a62565b60405180910390f35b34801561055657600080fd5b5061055f61133d565b005b34801561056d57600080fd5b5061058860048036038101906105839190613f6e565b611351565b6040516105959190614059565b60405180910390f35b3480156105aa57600080fd5b506105b361154c565b005b3480156105c157600080fd5b506105ca61165f565b6040516105d791906139f8565b60405180910390f35b6105fa60048036038101906105f5919061407b565b611689565b005b34801561060857600080fd5b50610623600480360381019061061e91906139bc565b61189d565b005b34801561063157600080fd5b5061063a611946565b604051610647919061399a565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906140d7565b6119d8565b6040516106849190614059565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190614156565b611c97565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190614196565b611e0e565b005b3480156106eb57600080fd5b506106f4611e86565b6040516107019190613a62565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c91906139bc565b611f21565b60405161073e919061425b565b60405180910390f35b34801561075357600080fd5b5061075c61203e565b60405161076991906139f8565b60405180910390f35b34801561077e57600080fd5b50610799600480360381019061079491906139bc565b612064565b6040516107a6919061399a565b60405180910390f35b3480156107bb57600080fd5b506107c4612102565b6040516107d393929190614276565b60405180910390f35b3480156107e857600080fd5b506107f1612127565b005b3480156107ff57600080fd5b5061081a60048036038101906108159190613f6e565b612199565b005b34801561082857600080fd5b50610843600480360381019061083e91906142ad565b6121e5565b60405161085091906138ef565b60405180910390f35b34801561086557600080fd5b5061086e612279565b005b34801561087c57600080fd5b5061089760048036038101906108929190613f6e565b61230c565b005b6108a161238f565b6002600954036108e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dd90614339565b60405180910390fd5b600260098190555081471015610931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610928906143a5565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051610957906143f6565b60006040518083038185875af1925050503d8060008114610994576040519150601f19603f3d011682016040523d82523d6000602084013e610999565b606091505b50509050806109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d49061442e565b60405180910390fd5b5060016009819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ab557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac55750610ac48261240d565b5b9050919050565b606060028054610adb9061447d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b079061447d565b8015610b545780601f10610b2957610100808354040283529160200191610b54565b820191906000526020600020905b815481529060010190602001808311610b3757829003601f168201915b5050505050905090565b6000610b6982612477565b610b9f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610be582611258565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c4c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6b6124c5565b73ffffffffffffffffffffffffffffffffffffffff1614610cce57610c9781610c926124c5565b6121e5565b610ccd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610cd98383836124cd565b505050565b6000610ce861257f565b6001546000540303905090565b610d00838383612584565b505050565b601060009054906101000a900460ff1681565b610d3383838360405180602001604052806000815250611e0e565b505050565b600080600c60405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1615151515815250509050806040015191505090565b600080600f547fe6b90c15f3ba2bb52929ad300ac2ab0bf348830f281145566f53d3691638349f856040518060400160405280600d81526020017f616c6c6f776c69737453616c650000000000000000000000000000000000000081525080519060200120604051602001610dfb939291906144c7565b60405160208183030381529060405280519060200120604051602001610e22929190614576565b604051602081830303815290604052805190602001209050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e7d8285612a38565b73ffffffffffffffffffffffffffffffffffffffff1614610e9f576000610ea2565b60015b91505092915050565b610eb361238f565b818160119182610ec4929190614764565b505050565b601060009054906101000a900460ff16610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614880565b60405180910390fd5b6115b381610f24610cde565b610f2e91906148cf565b1115610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f669061494f565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fba91906148cf565b60021015610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff4906149e1565b60405180910390fd5b8066470de4df8200006110109190614a01565b34101561102e8266470de4df8200006110299190614a01565b612a5f565b60405160200161103e9190614b0c565b6040516020818303038152906040529061108e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611085919061399a565b60405180910390fd5b506110993382612bbf565b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110e491906148cf565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b606060008251905060008167ffffffffffffffff81111561114e5761114d613ada565b5b60405190808252806020026020018201604052801561118757816020015b611174613724565b81526020019060019003908161116c5790505b50905060005b8281146111e0576111b78582815181106111aa576111a9614b39565b5b6020026020010151611f21565b8282815181106111ca576111c9614b39565b5b602002602001018190525080600101905061118d565b508092505050919050565b6111f361238f565b6115b3816111ff610cde565b61120991906148cf565b111561124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190614bb4565b60405180910390fd5b6112548282612bbf565b5050565b600061126382612e99565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112d5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61134561238f565b61134f6000613124565b565b606060008060006113618561126e565b905060008167ffffffffffffffff81111561137f5761137e613ada565b5b6040519080825280602002602001820160405280156113ad5781602001602082028036833780820191505090505b5090506113b8613724565b60006113c261257f565b90505b83861461153e57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015161153357600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146114d857816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611532578083878060010198508151811061152557611524614b39565b5b6020026020010181815250505b5b8060010190506113c5565b508195505050505050919050565b61155461238f565b600260095403611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090614339565b60405180910390fd5b600260098190555060006115ab61165f565b73ffffffffffffffffffffffffffffffffffffffff16476040516115ce906143f6565b60006040518083038185875af1925050503d806000811461160b576040519150601f19603f3d011682016040523d82523d6000602084013e611610565b606091505b5050905080611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b9061442e565b60405180910390fd5b506001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611693611e86565b116116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90614c20565b60405180910390fd5b6116dd3382610d84565b61171c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171390614c8c565b60405180910390fd5b6115b382611728610cde565b61173291906148cf565b1115611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a9061494f565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117be91906148cf565b60021015611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f8906149e1565b60405180910390fd5b61180b3383612bbf565b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461185691906148cf565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6118a561238f565b6040518060600160405280428152602001603c836118c39190614a01565b426118ce91906148cf565b815260200160011515815250600c600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550905050600115157f5db65beb593b110b71660a4f84d11eef4e452cf0255f5b1ff94258ffac07703660405160405180910390a250565b6060600380546119559061447d565b80601f01602080910402602001604051908101604052809291908181526020018280546119819061447d565b80156119ce5780601f106119a3576101008083540402835291602001916119ce565b820191906000526020600020905b8154815290600101906020018083116119b157829003601f168201915b5050505050905090565b6060818310611a13576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000549050611a2361257f565b851015611a3557611a3261257f565b94505b80841115611a41578093505b6000611a4c8761126e565b905084861015611a6f576000868603905081811015611a69578091505b50611a74565b600090505b60008167ffffffffffffffff811115611a9057611a8f613ada565b5b604051908082528060200260200182016040528015611abe5781602001602082028036833780820191505090505b50905060008203611ad55780945050505050611c90565b6000611ae088611f21565b905060008160400151611af557816000015190505b60008990505b888114158015611b0b5750848714155b15611c8257600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505092508260400151611c7757600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c1c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c765780848880600101995081518110611c6957611c68614b39565b5b6020026020010181815250505b5b806001019050611afb565b508583528296505050505050505b9392505050565b611c9f6124c5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d03576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d106124c5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dbd6124c5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e0291906138ef565b60405180910390a35050565b611e19848484612584565b611e388373ffffffffffffffffffffffffffffffffffffffff166131ea565b15611e8057611e498484848461320d565b611e7f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600080600c60405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505090506000816000015190506000826020015190508163ffffffff164210158015611ef557508063ffffffff164211155b15611f1657428163ffffffff16611f0c9190614cac565b9350505050611f1e565b600093505050505b90565b611f29613724565b611f31613724565b611f3961257f565b831080611f4857506000548310155b15611f565780915050612039565b600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561202c5780915050612039565b61203583612e99565b9150505b919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061206f82612477565b6120a5576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120af61335d565b905060008151036120cf57604051806020016040528060008152506120fa565b806120d984612a5f565b6040516020016120ea929190614ce0565b6040516020818303038152906040525b915050919050565b600c8060000154908060010154908060020160009054906101000a900460ff16905083565b61212f61238f565b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550601060009054906101000a900460ff1615157ff09b37ecbfe134bf1f6c2f38082fa76cd990d1ffddfb88add51b7c8348c79c4a60405160405180910390a2565b6121a161238f565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61228161238f565b6040518060600160405280600081526020016000815260200160001515815250600c600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550905050600015157f5db65beb593b110b71660a4f84d11eef4e452cf0255f5b1ff94258ffac07703660405160405180910390a2565b61231461238f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237a90614d76565b60405180910390fd5b61238c81613124565b50565b6123976124c5565b73ffffffffffffffffffffffffffffffffffffffff166123b561165f565b73ffffffffffffffffffffffffffffffffffffffff161461240b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240290614de2565b60405180910390fd5b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161248261257f565b11158015612491575060005482105b80156124be575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061258f82612e99565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125fa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661261b6124c5565b73ffffffffffffffffffffffffffffffffffffffff16148061264a5750612649856126446124c5565b6121e5565b5b8061268f57506126586124c5565b73ffffffffffffffffffffffffffffffffffffffff1661267784610b5e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126c8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361272e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273b85858560016133ef565b612747600084876124cd565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036129c65760005482146129c557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a3185858560016133f5565b5050505050565b6000806000612a4785856133fb565b91509150612a548161344c565b819250505092915050565b606060008203612aa6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bba565b600082905060005b60008214612ad8578080612ac190614e02565b915050600a82612ad19190614e79565b9150612aae565b60008167ffffffffffffffff811115612af457612af3613ada565b5b6040519080825280601f01601f191660200182016040528015612b265781602001600182028036833780820191505090505b5090505b60008514612bb357600182612b3f9190614cac565b9150600a85612b4e9190614eaa565b6030612b5a91906148cf565b60f81b818381518110612b7057612b6f614b39565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bac9190614e79565b9450612b2a565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c2b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612c65576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c7260008483856133ef565b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612e1557816000819055505050612e9460008483856133f5565b505050565b612ea1613724565b600082905080612eaf61257f565b116130ed576000548110156130ec576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130ea57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fce57809250505061311f565b5b6001156130e957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130e457809250505061311f565b612fcf565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132336124c5565b8786866040518563ffffffff1660e01b81526004016132559493929190614f30565b6020604051808303816000875af192505050801561329157506040513d601f19601f8201168201806040525081019061328e9190614f91565b60015b61330a573d80600081146132c1576040519150601f19603f3d011682016040523d82523d6000602084013e6132c6565b606091505b506000815103613302576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606011805461336c9061447d565b80601f01602080910402602001604051908101604052809291908181526020018280546133989061447d565b80156133e55780601f106133ba576101008083540402835291602001916133e5565b820191906000526020600020905b8154815290600101906020018083116133c857829003601f168201915b5050505050905090565b50505050565b50505050565b600080604183510361343c5760008060006020860151925060408601519150606086015160001a905061343087828585613618565b94509450505050613445565b60006002915091505b9250929050565b600060048111156134605761345f614fbe565b5b81600481111561347357613472614fbe565b5b0315613615576001600481111561348d5761348c614fbe565b5b8160048111156134a05761349f614fbe565b5b036134e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d790615039565b60405180910390fd5b600260048111156134f4576134f3614fbe565b5b81600481111561350757613506614fbe565b5b03613547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353e906150a5565b60405180910390fd5b6003600481111561355b5761355a614fbe565b5b81600481111561356e5761356d614fbe565b5b036135ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a590615137565b60405180910390fd5b6004808111156135c1576135c0614fbe565b5b8160048111156135d4576135d3614fbe565b5b03613614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360b906151c9565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561365357600060039150915061371b565b601b8560ff161415801561366b5750601c8560ff1614155b1561367d57600060049150915061371b565b6000600187878787604051600081526020016040526040516136a29493929190615205565b6020604051602081039080840390855afa1580156136c4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036137125760006001925092505061371b565b80600092509250505b94509492505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61378e8161377b565b811461379957600080fd5b50565b6000813590506137ab81613785565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137dc826137b1565b9050919050565b6137ec816137d1565b81146137f757600080fd5b50565b600081359050613809816137e3565b92915050565b6000806040838503121561382657613825613771565b5b60006138348582860161379c565b9250506020613845858286016137fa565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138848161384f565b811461388f57600080fd5b50565b6000813590506138a18161387b565b92915050565b6000602082840312156138bd576138bc613771565b5b60006138cb84828501613892565b91505092915050565b60008115159050919050565b6138e9816138d4565b82525050565b600060208201905061390460008301846138e0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613944578082015181840152602081019050613929565b60008484015250505050565b6000601f19601f8301169050919050565b600061396c8261390a565b6139768185613915565b9350613986818560208601613926565b61398f81613950565b840191505092915050565b600060208201905081810360008301526139b48184613961565b905092915050565b6000602082840312156139d2576139d1613771565b5b60006139e08482850161379c565b91505092915050565b6139f2816137d1565b82525050565b6000602082019050613a0d60008301846139e9565b92915050565b60008060408385031215613a2a57613a29613771565b5b6000613a38858286016137fa565b9250506020613a498582860161379c565b9150509250929050565b613a5c8161377b565b82525050565b6000602082019050613a776000830184613a53565b92915050565b600080600060608486031215613a9657613a95613771565b5b6000613aa4868287016137fa565b9350506020613ab5868287016137fa565b9250506040613ac68682870161379c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b1282613950565b810181811067ffffffffffffffff82111715613b3157613b30613ada565b5b80604052505050565b6000613b44613767565b9050613b508282613b09565b919050565b600067ffffffffffffffff821115613b7057613b6f613ada565b5b613b7982613950565b9050602081019050919050565b82818337600083830152505050565b6000613ba8613ba384613b55565b613b3a565b905082815260208101848484011115613bc457613bc3613ad5565b5b613bcf848285613b86565b509392505050565b600082601f830112613bec57613beb613ad0565b5b8135613bfc848260208601613b95565b91505092915050565b60008060408385031215613c1c57613c1b613771565b5b6000613c2a858286016137fa565b925050602083013567ffffffffffffffff811115613c4b57613c4a613776565b5b613c5785828601613bd7565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613c8157613c80613ad0565b5b8235905067ffffffffffffffff811115613c9e57613c9d613c61565b5b602083019150836001820283011115613cba57613cb9613c66565b5b9250929050565b60008060208385031215613cd857613cd7613771565b5b600083013567ffffffffffffffff811115613cf657613cf5613776565b5b613d0285828601613c6b565b92509250509250929050565b600067ffffffffffffffff821115613d2957613d28613ada565b5b602082029050602081019050919050565b6000613d4d613d4884613d0e565b613b3a565b90508083825260208201905060208402830185811115613d7057613d6f613c66565b5b835b81811015613d995780613d85888261379c565b845260208401935050602081019050613d72565b5050509392505050565b600082601f830112613db857613db7613ad0565b5b8135613dc8848260208601613d3a565b91505092915050565b600060208284031215613de757613de6613771565b5b600082013567ffffffffffffffff811115613e0557613e04613776565b5b613e1184828501613da3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e4f816137d1565b82525050565b600067ffffffffffffffff82169050919050565b613e7281613e55565b82525050565b613e81816138d4565b82525050565b606082016000820151613e9d6000850182613e46565b506020820151613eb06020850182613e69565b506040820151613ec36040850182613e78565b50505050565b6000613ed58383613e87565b60608301905092915050565b6000602082019050919050565b6000613ef982613e1a565b613f038185613e25565b9350613f0e83613e36565b8060005b83811015613f3f578151613f268882613ec9565b9750613f3183613ee1565b925050600181019050613f12565b5085935050505092915050565b60006020820190508181036000830152613f668184613eee565b905092915050565b600060208284031215613f8457613f83613771565b5b6000613f92848285016137fa565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fd08161377b565b82525050565b6000613fe28383613fc7565b60208301905092915050565b6000602082019050919050565b600061400682613f9b565b6140108185613fa6565b935061401b83613fb7565b8060005b8381101561404c5781516140338882613fd6565b975061403e83613fee565b92505060018101905061401f565b5085935050505092915050565b600060208201905081810360008301526140738184613ffb565b905092915050565b6000806040838503121561409257614091613771565b5b60006140a08582860161379c565b925050602083013567ffffffffffffffff8111156140c1576140c0613776565b5b6140cd85828601613bd7565b9150509250929050565b6000806000606084860312156140f0576140ef613771565b5b60006140fe868287016137fa565b935050602061410f8682870161379c565b92505060406141208682870161379c565b9150509250925092565b614133816138d4565b811461413e57600080fd5b50565b6000813590506141508161412a565b92915050565b6000806040838503121561416d5761416c613771565b5b600061417b858286016137fa565b925050602061418c85828601614141565b9150509250929050565b600080600080608085870312156141b0576141af613771565b5b60006141be878288016137fa565b94505060206141cf878288016137fa565b93505060406141e08782880161379c565b925050606085013567ffffffffffffffff81111561420157614200613776565b5b61420d87828801613bd7565b91505092959194509250565b60608201600082015161422f6000850182613e46565b5060208201516142426020850182613e69565b5060408201516142556040850182613e78565b50505050565b60006060820190506142706000830184614219565b92915050565b600060608201905061428b6000830186613a53565b6142986020830185613a53565b6142a560408301846138e0565b949350505050565b600080604083850312156142c4576142c3613771565b5b60006142d2858286016137fa565b92505060206142e3858286016137fa565b9150509250929050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614323601f83613915565b915061432e826142ed565b602082019050919050565b6000602082019050818103600083015261435281614316565b9050919050565b7f4e6f7420656e6f7567682045544820746f207769746864726177210000000000600082015250565b600061438f601b83613915565b915061439a82614359565b602082019050919050565b600060208201905081810360008301526143be81614382565b9050919050565b600081905092915050565b50565b60006143e06000836143c5565b91506143eb826143d0565b600082019050919050565b6000614401826143d3565b9150819050919050565b6000614418600083613915565b9150614423826143d0565b600082019050919050565b600060208201905081810360008301526144478161440b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061449557607f821691505b6020821081036144a8576144a761444e565b5b50919050565b6000819050919050565b6144c1816144ae565b82525050565b60006060820190506144dc60008301866144b8565b6144e960208301856139e9565b6144f660408301846144b8565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061453f6002836144fe565b915061454a82614509565b600282019050919050565b6000819050919050565b61457061456b826144ae565b614555565b82525050565b600061458182614532565b915061458d828561455f565b60208201915061459d828461455f565b6020820191508190509392505050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261461a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145dd565b61462486836145dd565b95508019841693508086168417925050509392505050565b6000819050919050565b600061466161465c6146578461377b565b61463c565b61377b565b9050919050565b6000819050919050565b61467b83614646565b61468f61468782614668565b8484546145ea565b825550505050565b600090565b6146a4614697565b6146af818484614672565b505050565b5b818110156146d3576146c860008261469c565b6001810190506146b5565b5050565b601f821115614718576146e9816145b8565b6146f2846145cd565b81016020851015614701578190505b61471561470d856145cd565b8301826146b4565b50505b505050565b600082821c905092915050565b600061473b6000198460080261471d565b1980831691505092915050565b6000614754838361472a565b9150826002028217905092915050565b61476e83836145ad565b67ffffffffffffffff81111561478757614786613ada565b5b614791825461447d565b61479c8282856146d7565b6000601f8311600181146147cb57600084156147b9578287013590505b6147c38582614748565b86555061482b565b601f1984166147d9866145b8565b60005b82811015614801578489013582556001820191506020850194506020810190506147dc565b8683101561481e578489013561481a601f89168261472a565b8355505b6001600288020188555050505b50505050505050565b7f5075626c69632073616c65206973206e6f74206f6e0000000000000000000000600082015250565b600061486a601583613915565b915061487582614834565b602082019050919050565b600060208201905081810360008301526148998161485d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148da8261377b565b91506148e58361377b565b92508282019050808211156148fd576148fc6148a0565b5b92915050565b7f43616e2774206d696e74206d6f7265207468616e206d617820746f6b656e7300600082015250565b6000614939601f83613915565b915061494482614903565b602082019050919050565b600060208201905081810360008301526149688161492c565b9050919050565b7f4d617820746f6b656e20636f756e74207065722077616c6c657420657863656560008201527f6465642100000000000000000000000000000000000000000000000000000000602082015250565b60006149cb602483613915565b91506149d68261496f565b604082019050919050565b600060208201905081810360008301526149fa816149be565b9050919050565b6000614a0c8261377b565b9150614a178361377b565b9250828202614a258161377b565b91508282048414831517614a3c57614a3b6148a0565b5b5092915050565b7f4e6f7420656e6f7567682045544821204174206c656173742000000000000000600082015250565b6000614a796019836144fe565b9150614a8482614a43565b601982019050919050565b6000614a9a8261390a565b614aa481856144fe565b9350614ab4818560208601613926565b80840191505092915050565b7f207765692068617320746f2062652073656e7421000000000000000000000000600082015250565b6000614af66014836144fe565b9150614b0182614ac0565b601482019050919050565b6000614b1782614a6c565b9150614b238284614a8f565b9150614b2e82614ae9565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206d696e74206d6f7265207468616e206d617820737570706c7900600082015250565b6000614b9e601f83613915565b9150614ba982614b68565b602082019050919050565b60006020820190508181036000830152614bcd81614b91565b9050919050565b7f416c6c6f776c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000614c0a601c83613915565b9150614c1582614bd4565b602082019050919050565b60006020820190508181036000830152614c3981614bfd565b9050919050565b7f41646472657373206973206e6f7420696e20616c6c6f776c6973740000000000600082015250565b6000614c76601b83613915565b9150614c8182614c40565b602082019050919050565b60006020820190508181036000830152614ca581614c69565b9050919050565b6000614cb78261377b565b9150614cc28361377b565b9250828203905081811115614cda57614cd96148a0565b5b92915050565b6000614cec8285614a8f565b9150614cf88284614a8f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d60602683613915565b9150614d6b82614d04565b604082019050919050565b60006020820190508181036000830152614d8f81614d53565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614dcc602083613915565b9150614dd782614d96565b602082019050919050565b60006020820190508181036000830152614dfb81614dbf565b9050919050565b6000614e0d8261377b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e3f57614e3e6148a0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e848261377b565b9150614e8f8361377b565b925082614e9f57614e9e614e4a565b5b828204905092915050565b6000614eb58261377b565b9150614ec08361377b565b925082614ed057614ecf614e4a565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f0282614edb565b614f0c8185614ee6565b9350614f1c818560208601613926565b614f2581613950565b840191505092915050565b6000608082019050614f4560008301876139e9565b614f5260208301866139e9565b614f5f6040830185613a53565b8181036060830152614f718184614ef7565b905095945050505050565b600081519050614f8b8161387b565b92915050565b600060208284031215614fa757614fa6613771565b5b6000614fb584828501614f7c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615023601883613915565b915061502e82614fed565b602082019050919050565b6000602082019050818103600083015261505281615016565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061508f601f83613915565b915061509a82615059565b602082019050919050565b600060208201905081810360008301526150be81615082565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615121602283613915565b915061512c826150c5565b604082019050919050565b6000602082019050818103600083015261515081615114565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006151b3602283613915565b91506151be82615157565b604082019050919050565b600060208201905081810360008301526151e2816151a6565b9050919050565b600060ff82169050919050565b6151ff816151e9565b82525050565b600060808201905061521a60008301876144b8565b61522760208301866151f6565b61523460408301856144b8565b61524160608301846144b8565b9594505050505056fea264697066735822122093307938c8f90ee5880a25af00d924b7d5099a50e4aac1f2250859e2e098840964736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102195760003560e01c80638462151c11610123578063c12f0396116100ab578063e222c7f91161006f578063e222c7f9146107dc578063e474def4146107f3578063e985e9c51461081c578063ebc90e1b14610859578063f2fde38b1461087057610219565b8063c12f0396146106df578063c23dc68f1461070a578063c32fe11b14610747578063c87b56dd14610772578063d5e2eb55146107af57610219565b806392f6f745116100f257806392f6f745146105fc57806395d89b411461062557806399a2557a14610650578063a22cb4651461068d578063b88d4fde146106b657610219565b80638462151c14610561578063853828b61461059e5780638da5cb5b146105b557806392ed4b10146105e057610219565b806349985a79116101a65780635bbb2177116101755780635bbb21771461046a578063627804af146104a75780636352211e146104d057806370a082311461050d578063715018a61461054a57610219565b806349985a79146103bd57806350cee227146103e857806355f804b3146104255780635a5e5d581461044e57610219565b8063095ea7b3116101ed578063095ea7b3146102ec57806318160ddd1461031557806323b872dd146103405780633f5e47411461036957806342842e0e1461039457610219565b8062f714ce1461021e57806301ffc9a71461024757806306fdde0314610284578063081812fc146102af575b600080fd5b34801561022a57600080fd5b506102456004803603810190610240919061380f565b610899565b005b34801561025357600080fd5b5061026e600480360381019061026991906138a7565b6109ea565b60405161027b91906138ef565b60405180910390f35b34801561029057600080fd5b50610299610acc565b6040516102a6919061399a565b60405180910390f35b3480156102bb57600080fd5b506102d660048036038101906102d191906139bc565b610b5e565b6040516102e391906139f8565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190613a13565b610bda565b005b34801561032157600080fd5b5061032a610cde565b6040516103379190613a62565b60405180910390f35b34801561034c57600080fd5b5061036760048036038101906103629190613a7d565b610cf5565b005b34801561037557600080fd5b5061037e610d05565b60405161038b91906138ef565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613a7d565b610d18565b005b3480156103c957600080fd5b506103d2610d38565b6040516103df91906138ef565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190613c05565b610d84565b60405161041c91906138ef565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613cc1565b610eab565b005b610468600480360381019061046391906139bc565b610ec9565b005b34801561047657600080fd5b50610491600480360381019061048c9190613dd1565b61112a565b60405161049e9190613f4c565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613a13565b6111eb565b005b3480156104dc57600080fd5b506104f760048036038101906104f291906139bc565b611258565b60405161050491906139f8565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190613f6e565b61126e565b6040516105419190613a62565b60405180910390f35b34801561055657600080fd5b5061055f61133d565b005b34801561056d57600080fd5b5061058860048036038101906105839190613f6e565b611351565b6040516105959190614059565b60405180910390f35b3480156105aa57600080fd5b506105b361154c565b005b3480156105c157600080fd5b506105ca61165f565b6040516105d791906139f8565b60405180910390f35b6105fa60048036038101906105f5919061407b565b611689565b005b34801561060857600080fd5b50610623600480360381019061061e91906139bc565b61189d565b005b34801561063157600080fd5b5061063a611946565b604051610647919061399a565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906140d7565b6119d8565b6040516106849190614059565b60405180910390f35b34801561069957600080fd5b506106b460048036038101906106af9190614156565b611c97565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190614196565b611e0e565b005b3480156106eb57600080fd5b506106f4611e86565b6040516107019190613a62565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c91906139bc565b611f21565b60405161073e919061425b565b60405180910390f35b34801561075357600080fd5b5061075c61203e565b60405161076991906139f8565b60405180910390f35b34801561077e57600080fd5b50610799600480360381019061079491906139bc565b612064565b6040516107a6919061399a565b60405180910390f35b3480156107bb57600080fd5b506107c4612102565b6040516107d393929190614276565b60405180910390f35b3480156107e857600080fd5b506107f1612127565b005b3480156107ff57600080fd5b5061081a60048036038101906108159190613f6e565b612199565b005b34801561082857600080fd5b50610843600480360381019061083e91906142ad565b6121e5565b60405161085091906138ef565b60405180910390f35b34801561086557600080fd5b5061086e612279565b005b34801561087c57600080fd5b5061089760048036038101906108929190613f6e565b61230c565b005b6108a161238f565b6002600954036108e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dd90614339565b60405180910390fd5b600260098190555081471015610931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610928906143a5565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051610957906143f6565b60006040518083038185875af1925050503d8060008114610994576040519150601f19603f3d011682016040523d82523d6000602084013e610999565b606091505b50509050806109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d49061442e565b60405180910390fd5b5060016009819055505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ab557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac55750610ac48261240d565b5b9050919050565b606060028054610adb9061447d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b079061447d565b8015610b545780601f10610b2957610100808354040283529160200191610b54565b820191906000526020600020905b815481529060010190602001808311610b3757829003601f168201915b5050505050905090565b6000610b6982612477565b610b9f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610be582611258565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c4c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6b6124c5565b73ffffffffffffffffffffffffffffffffffffffff1614610cce57610c9781610c926124c5565b6121e5565b610ccd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610cd98383836124cd565b505050565b6000610ce861257f565b6001546000540303905090565b610d00838383612584565b505050565b601060009054906101000a900460ff1681565b610d3383838360405180602001604052806000815250611e0e565b505050565b600080600c60405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1615151515815250509050806040015191505090565b600080600f547fe6b90c15f3ba2bb52929ad300ac2ab0bf348830f281145566f53d3691638349f856040518060400160405280600d81526020017f616c6c6f776c69737453616c650000000000000000000000000000000000000081525080519060200120604051602001610dfb939291906144c7565b60405160208183030381529060405280519060200120604051602001610e22929190614576565b604051602081830303815290604052805190602001209050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e7d8285612a38565b73ffffffffffffffffffffffffffffffffffffffff1614610e9f576000610ea2565b60015b91505092915050565b610eb361238f565b818160119182610ec4929190614764565b505050565b601060009054906101000a900460ff16610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614880565b60405180910390fd5b6115b381610f24610cde565b610f2e91906148cf565b1115610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f669061494f565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fba91906148cf565b60021015610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff4906149e1565b60405180910390fd5b8066470de4df8200006110109190614a01565b34101561102e8266470de4df8200006110299190614a01565b612a5f565b60405160200161103e9190614b0c565b6040516020818303038152906040529061108e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611085919061399a565b60405180910390fd5b506110993382612bbf565b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110e491906148cf565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b606060008251905060008167ffffffffffffffff81111561114e5761114d613ada565b5b60405190808252806020026020018201604052801561118757816020015b611174613724565b81526020019060019003908161116c5790505b50905060005b8281146111e0576111b78582815181106111aa576111a9614b39565b5b6020026020010151611f21565b8282815181106111ca576111c9614b39565b5b602002602001018190525080600101905061118d565b508092505050919050565b6111f361238f565b6115b3816111ff610cde565b61120991906148cf565b111561124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190614bb4565b60405180910390fd5b6112548282612bbf565b5050565b600061126382612e99565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112d5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61134561238f565b61134f6000613124565b565b606060008060006113618561126e565b905060008167ffffffffffffffff81111561137f5761137e613ada565b5b6040519080825280602002602001820160405280156113ad5781602001602082028036833780820191505090505b5090506113b8613724565b60006113c261257f565b90505b83861461153e57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015161153357600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146114d857816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611532578083878060010198508151811061152557611524614b39565b5b6020026020010181815250505b5b8060010190506113c5565b508195505050505050919050565b61155461238f565b600260095403611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090614339565b60405180910390fd5b600260098190555060006115ab61165f565b73ffffffffffffffffffffffffffffffffffffffff16476040516115ce906143f6565b60006040518083038185875af1925050503d806000811461160b576040519150601f19603f3d011682016040523d82523d6000602084013e611610565b606091505b5050905080611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b9061442e565b60405180910390fd5b506001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611693611e86565b116116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca90614c20565b60405180910390fd5b6116dd3382610d84565b61171c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171390614c8c565b60405180910390fd5b6115b382611728610cde565b61173291906148cf565b1115611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176a9061494f565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117be91906148cf565b60021015611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f8906149e1565b60405180910390fd5b61180b3383612bbf565b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461185691906148cf565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6118a561238f565b6040518060600160405280428152602001603c836118c39190614a01565b426118ce91906148cf565b815260200160011515815250600c600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550905050600115157f5db65beb593b110b71660a4f84d11eef4e452cf0255f5b1ff94258ffac07703660405160405180910390a250565b6060600380546119559061447d565b80601f01602080910402602001604051908101604052809291908181526020018280546119819061447d565b80156119ce5780601f106119a3576101008083540402835291602001916119ce565b820191906000526020600020905b8154815290600101906020018083116119b157829003601f168201915b5050505050905090565b6060818310611a13576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000549050611a2361257f565b851015611a3557611a3261257f565b94505b80841115611a41578093505b6000611a4c8761126e565b905084861015611a6f576000868603905081811015611a69578091505b50611a74565b600090505b60008167ffffffffffffffff811115611a9057611a8f613ada565b5b604051908082528060200260200182016040528015611abe5781602001602082028036833780820191505090505b50905060008203611ad55780945050505050611c90565b6000611ae088611f21565b905060008160400151611af557816000015190505b60008990505b888114158015611b0b5750848714155b15611c8257600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505092508260400151611c7757600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c1c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c765780848880600101995081518110611c6957611c68614b39565b5b6020026020010181815250505b5b806001019050611afb565b508583528296505050505050505b9392505050565b611c9f6124c5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d03576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d106124c5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dbd6124c5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e0291906138ef565b60405180910390a35050565b611e19848484612584565b611e388373ffffffffffffffffffffffffffffffffffffffff166131ea565b15611e8057611e498484848461320d565b611e7f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600080600c60405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505090506000816000015190506000826020015190508163ffffffff164210158015611ef557508063ffffffff164211155b15611f1657428163ffffffff16611f0c9190614cac565b9350505050611f1e565b600093505050505b90565b611f29613724565b611f31613724565b611f3961257f565b831080611f4857506000548310155b15611f565780915050612039565b600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561202c5780915050612039565b61203583612e99565b9150505b919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061206f82612477565b6120a5576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006120af61335d565b905060008151036120cf57604051806020016040528060008152506120fa565b806120d984612a5f565b6040516020016120ea929190614ce0565b6040516020818303038152906040525b915050919050565b600c8060000154908060010154908060020160009054906101000a900460ff16905083565b61212f61238f565b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550601060009054906101000a900460ff1615157ff09b37ecbfe134bf1f6c2f38082fa76cd990d1ffddfb88add51b7c8348c79c4a60405160405180910390a2565b6121a161238f565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61228161238f565b6040518060600160405280600081526020016000815260200160001515815250600c600082015181600001556020820151816001015560408201518160020160006101000a81548160ff021916908315150217905550905050600015157f5db65beb593b110b71660a4f84d11eef4e452cf0255f5b1ff94258ffac07703660405160405180910390a2565b61231461238f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237a90614d76565b60405180910390fd5b61238c81613124565b50565b6123976124c5565b73ffffffffffffffffffffffffffffffffffffffff166123b561165f565b73ffffffffffffffffffffffffffffffffffffffff161461240b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240290614de2565b60405180910390fd5b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161248261257f565b11158015612491575060005482105b80156124be575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061258f82612e99565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125fa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661261b6124c5565b73ffffffffffffffffffffffffffffffffffffffff16148061264a5750612649856126446124c5565b6121e5565b5b8061268f57506126586124c5565b73ffffffffffffffffffffffffffffffffffffffff1661267784610b5e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126c8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361272e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273b85858560016133ef565b612747600084876124cd565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036129c65760005482146129c557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a3185858560016133f5565b5050505050565b6000806000612a4785856133fb565b91509150612a548161344c565b819250505092915050565b606060008203612aa6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bba565b600082905060005b60008214612ad8578080612ac190614e02565b915050600a82612ad19190614e79565b9150612aae565b60008167ffffffffffffffff811115612af457612af3613ada565b5b6040519080825280601f01601f191660200182016040528015612b265781602001600182028036833780820191505090505b5090505b60008514612bb357600182612b3f9190614cac565b9150600a85612b4e9190614eaa565b6030612b5a91906148cf565b60f81b818381518110612b7057612b6f614b39565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bac9190614e79565b9450612b2a565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c2b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612c65576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c7260008483856133ef565b81600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612e1557816000819055505050612e9460008483856133f5565b505050565b612ea1613724565b600082905080612eaf61257f565b116130ed576000548110156130ec576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130ea57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fce57809250505061311f565b5b6001156130e957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130e457809250505061311f565b612fcf565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132336124c5565b8786866040518563ffffffff1660e01b81526004016132559493929190614f30565b6020604051808303816000875af192505050801561329157506040513d601f19601f8201168201806040525081019061328e9190614f91565b60015b61330a573d80600081146132c1576040519150601f19603f3d011682016040523d82523d6000602084013e6132c6565b606091505b506000815103613302576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606011805461336c9061447d565b80601f01602080910402602001604051908101604052809291908181526020018280546133989061447d565b80156133e55780601f106133ba576101008083540402835291602001916133e5565b820191906000526020600020905b8154815290600101906020018083116133c857829003601f168201915b5050505050905090565b50505050565b50505050565b600080604183510361343c5760008060006020860151925060408601519150606086015160001a905061343087828585613618565b94509450505050613445565b60006002915091505b9250929050565b600060048111156134605761345f614fbe565b5b81600481111561347357613472614fbe565b5b0315613615576001600481111561348d5761348c614fbe565b5b8160048111156134a05761349f614fbe565b5b036134e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d790615039565b60405180910390fd5b600260048111156134f4576134f3614fbe565b5b81600481111561350757613506614fbe565b5b03613547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353e906150a5565b60405180910390fd5b6003600481111561355b5761355a614fbe565b5b81600481111561356e5761356d614fbe565b5b036135ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a590615137565b60405180910390fd5b6004808111156135c1576135c0614fbe565b5b8160048111156135d4576135d3614fbe565b5b03613614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360b906151c9565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561365357600060039150915061371b565b601b8560ff161415801561366b5750601c8560ff1614155b1561367d57600060049150915061371b565b6000600187878787604051600081526020016040526040516136a29493929190615205565b6020604051602081039080840390855afa1580156136c4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036137125760006001925092505061371b565b80600092509250505b94509492505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61378e8161377b565b811461379957600080fd5b50565b6000813590506137ab81613785565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137dc826137b1565b9050919050565b6137ec816137d1565b81146137f757600080fd5b50565b600081359050613809816137e3565b92915050565b6000806040838503121561382657613825613771565b5b60006138348582860161379c565b9250506020613845858286016137fa565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138848161384f565b811461388f57600080fd5b50565b6000813590506138a18161387b565b92915050565b6000602082840312156138bd576138bc613771565b5b60006138cb84828501613892565b91505092915050565b60008115159050919050565b6138e9816138d4565b82525050565b600060208201905061390460008301846138e0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613944578082015181840152602081019050613929565b60008484015250505050565b6000601f19601f8301169050919050565b600061396c8261390a565b6139768185613915565b9350613986818560208601613926565b61398f81613950565b840191505092915050565b600060208201905081810360008301526139b48184613961565b905092915050565b6000602082840312156139d2576139d1613771565b5b60006139e08482850161379c565b91505092915050565b6139f2816137d1565b82525050565b6000602082019050613a0d60008301846139e9565b92915050565b60008060408385031215613a2a57613a29613771565b5b6000613a38858286016137fa565b9250506020613a498582860161379c565b9150509250929050565b613a5c8161377b565b82525050565b6000602082019050613a776000830184613a53565b92915050565b600080600060608486031215613a9657613a95613771565b5b6000613aa4868287016137fa565b9350506020613ab5868287016137fa565b9250506040613ac68682870161379c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b1282613950565b810181811067ffffffffffffffff82111715613b3157613b30613ada565b5b80604052505050565b6000613b44613767565b9050613b508282613b09565b919050565b600067ffffffffffffffff821115613b7057613b6f613ada565b5b613b7982613950565b9050602081019050919050565b82818337600083830152505050565b6000613ba8613ba384613b55565b613b3a565b905082815260208101848484011115613bc457613bc3613ad5565b5b613bcf848285613b86565b509392505050565b600082601f830112613bec57613beb613ad0565b5b8135613bfc848260208601613b95565b91505092915050565b60008060408385031215613c1c57613c1b613771565b5b6000613c2a858286016137fa565b925050602083013567ffffffffffffffff811115613c4b57613c4a613776565b5b613c5785828601613bd7565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613c8157613c80613ad0565b5b8235905067ffffffffffffffff811115613c9e57613c9d613c61565b5b602083019150836001820283011115613cba57613cb9613c66565b5b9250929050565b60008060208385031215613cd857613cd7613771565b5b600083013567ffffffffffffffff811115613cf657613cf5613776565b5b613d0285828601613c6b565b92509250509250929050565b600067ffffffffffffffff821115613d2957613d28613ada565b5b602082029050602081019050919050565b6000613d4d613d4884613d0e565b613b3a565b90508083825260208201905060208402830185811115613d7057613d6f613c66565b5b835b81811015613d995780613d85888261379c565b845260208401935050602081019050613d72565b5050509392505050565b600082601f830112613db857613db7613ad0565b5b8135613dc8848260208601613d3a565b91505092915050565b600060208284031215613de757613de6613771565b5b600082013567ffffffffffffffff811115613e0557613e04613776565b5b613e1184828501613da3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e4f816137d1565b82525050565b600067ffffffffffffffff82169050919050565b613e7281613e55565b82525050565b613e81816138d4565b82525050565b606082016000820151613e9d6000850182613e46565b506020820151613eb06020850182613e69565b506040820151613ec36040850182613e78565b50505050565b6000613ed58383613e87565b60608301905092915050565b6000602082019050919050565b6000613ef982613e1a565b613f038185613e25565b9350613f0e83613e36565b8060005b83811015613f3f578151613f268882613ec9565b9750613f3183613ee1565b925050600181019050613f12565b5085935050505092915050565b60006020820190508181036000830152613f668184613eee565b905092915050565b600060208284031215613f8457613f83613771565b5b6000613f92848285016137fa565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fd08161377b565b82525050565b6000613fe28383613fc7565b60208301905092915050565b6000602082019050919050565b600061400682613f9b565b6140108185613fa6565b935061401b83613fb7565b8060005b8381101561404c5781516140338882613fd6565b975061403e83613fee565b92505060018101905061401f565b5085935050505092915050565b600060208201905081810360008301526140738184613ffb565b905092915050565b6000806040838503121561409257614091613771565b5b60006140a08582860161379c565b925050602083013567ffffffffffffffff8111156140c1576140c0613776565b5b6140cd85828601613bd7565b9150509250929050565b6000806000606084860312156140f0576140ef613771565b5b60006140fe868287016137fa565b935050602061410f8682870161379c565b92505060406141208682870161379c565b9150509250925092565b614133816138d4565b811461413e57600080fd5b50565b6000813590506141508161412a565b92915050565b6000806040838503121561416d5761416c613771565b5b600061417b858286016137fa565b925050602061418c85828601614141565b9150509250929050565b600080600080608085870312156141b0576141af613771565b5b60006141be878288016137fa565b94505060206141cf878288016137fa565b93505060406141e08782880161379c565b925050606085013567ffffffffffffffff81111561420157614200613776565b5b61420d87828801613bd7565b91505092959194509250565b60608201600082015161422f6000850182613e46565b5060208201516142426020850182613e69565b5060408201516142556040850182613e78565b50505050565b60006060820190506142706000830184614219565b92915050565b600060608201905061428b6000830186613a53565b6142986020830185613a53565b6142a560408301846138e0565b949350505050565b600080604083850312156142c4576142c3613771565b5b60006142d2858286016137fa565b92505060206142e3858286016137fa565b9150509250929050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614323601f83613915565b915061432e826142ed565b602082019050919050565b6000602082019050818103600083015261435281614316565b9050919050565b7f4e6f7420656e6f7567682045544820746f207769746864726177210000000000600082015250565b600061438f601b83613915565b915061439a82614359565b602082019050919050565b600060208201905081810360008301526143be81614382565b9050919050565b600081905092915050565b50565b60006143e06000836143c5565b91506143eb826143d0565b600082019050919050565b6000614401826143d3565b9150819050919050565b6000614418600083613915565b9150614423826143d0565b600082019050919050565b600060208201905081810360008301526144478161440b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061449557607f821691505b6020821081036144a8576144a761444e565b5b50919050565b6000819050919050565b6144c1816144ae565b82525050565b60006060820190506144dc60008301866144b8565b6144e960208301856139e9565b6144f660408301846144b8565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061453f6002836144fe565b915061454a82614509565b600282019050919050565b6000819050919050565b61457061456b826144ae565b614555565b82525050565b600061458182614532565b915061458d828561455f565b60208201915061459d828461455f565b6020820191508190509392505050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261461a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145dd565b61462486836145dd565b95508019841693508086168417925050509392505050565b6000819050919050565b600061466161465c6146578461377b565b61463c565b61377b565b9050919050565b6000819050919050565b61467b83614646565b61468f61468782614668565b8484546145ea565b825550505050565b600090565b6146a4614697565b6146af818484614672565b505050565b5b818110156146d3576146c860008261469c565b6001810190506146b5565b5050565b601f821115614718576146e9816145b8565b6146f2846145cd565b81016020851015614701578190505b61471561470d856145cd565b8301826146b4565b50505b505050565b600082821c905092915050565b600061473b6000198460080261471d565b1980831691505092915050565b6000614754838361472a565b9150826002028217905092915050565b61476e83836145ad565b67ffffffffffffffff81111561478757614786613ada565b5b614791825461447d565b61479c8282856146d7565b6000601f8311600181146147cb57600084156147b9578287013590505b6147c38582614748565b86555061482b565b601f1984166147d9866145b8565b60005b82811015614801578489013582556001820191506020850194506020810190506147dc565b8683101561481e578489013561481a601f89168261472a565b8355505b6001600288020188555050505b50505050505050565b7f5075626c69632073616c65206973206e6f74206f6e0000000000000000000000600082015250565b600061486a601583613915565b915061487582614834565b602082019050919050565b600060208201905081810360008301526148998161485d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148da8261377b565b91506148e58361377b565b92508282019050808211156148fd576148fc6148a0565b5b92915050565b7f43616e2774206d696e74206d6f7265207468616e206d617820746f6b656e7300600082015250565b6000614939601f83613915565b915061494482614903565b602082019050919050565b600060208201905081810360008301526149688161492c565b9050919050565b7f4d617820746f6b656e20636f756e74207065722077616c6c657420657863656560008201527f6465642100000000000000000000000000000000000000000000000000000000602082015250565b60006149cb602483613915565b91506149d68261496f565b604082019050919050565b600060208201905081810360008301526149fa816149be565b9050919050565b6000614a0c8261377b565b9150614a178361377b565b9250828202614a258161377b565b91508282048414831517614a3c57614a3b6148a0565b5b5092915050565b7f4e6f7420656e6f7567682045544821204174206c656173742000000000000000600082015250565b6000614a796019836144fe565b9150614a8482614a43565b601982019050919050565b6000614a9a8261390a565b614aa481856144fe565b9350614ab4818560208601613926565b80840191505092915050565b7f207765692068617320746f2062652073656e7421000000000000000000000000600082015250565b6000614af66014836144fe565b9150614b0182614ac0565b601482019050919050565b6000614b1782614a6c565b9150614b238284614a8f565b9150614b2e82614ae9565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206d696e74206d6f7265207468616e206d617820737570706c7900600082015250565b6000614b9e601f83613915565b9150614ba982614b68565b602082019050919050565b60006020820190508181036000830152614bcd81614b91565b9050919050565b7f416c6c6f776c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000614c0a601c83613915565b9150614c1582614bd4565b602082019050919050565b60006020820190508181036000830152614c3981614bfd565b9050919050565b7f41646472657373206973206e6f7420696e20616c6c6f776c6973740000000000600082015250565b6000614c76601b83613915565b9150614c8182614c40565b602082019050919050565b60006020820190508181036000830152614ca581614c69565b9050919050565b6000614cb78261377b565b9150614cc28361377b565b9250828203905081811115614cda57614cd96148a0565b5b92915050565b6000614cec8285614a8f565b9150614cf88284614a8f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614d60602683613915565b9150614d6b82614d04565b604082019050919050565b60006020820190508181036000830152614d8f81614d53565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614dcc602083613915565b9150614dd782614d96565b602082019050919050565b60006020820190508181036000830152614dfb81614dbf565b9050919050565b6000614e0d8261377b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e3f57614e3e6148a0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e848261377b565b9150614e8f8361377b565b925082614e9f57614e9e614e4a565b5b828204905092915050565b6000614eb58261377b565b9150614ec08361377b565b925082614ed057614ecf614e4a565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f0282614edb565b614f0c8185614ee6565b9350614f1c818560208601613926565b614f2581613950565b840191505092915050565b6000608082019050614f4560008301876139e9565b614f5260208301866139e9565b614f5f6040830185613a53565b8181036060830152614f718184614ef7565b905095945050505050565b600081519050614f8b8161387b565b92915050565b600060208284031215614fa757614fa6613771565b5b6000614fb584828501614f7c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615023601883613915565b915061502e82614fed565b602082019050919050565b6000602082019050818103600083015261505281615016565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061508f601f83613915565b915061509a82615059565b602082019050919050565b600060208201905081810360008301526150be81615082565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615121602283613915565b915061512c826150c5565b604082019050919050565b6000602082019050818103600083015261515081615114565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006151b3602283613915565b91506151be82615157565b604082019050919050565b600060208201905081810360008301526151e2816151a6565b9050919050565b600060ff82169050919050565b6151ff816151e9565b82525050565b600060808201905061521a60008301876144b8565b61522760208301866151f6565b61523460408301856144b8565b61524160608301846144b8565b9594505050505056fea264697066735822122093307938c8f90ee5880a25af00d924b7d5099a50e4aac1f2250859e2e098840964736f6c63430008110033
Deployed Bytecode Sourcemap
305:5949:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5906:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3147:305:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6262:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7766:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7328:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2387:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8631:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1323:34:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8872:185:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3257:170:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1401:761;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2652:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4860:829;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1548:468:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3917:237:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6070:125:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3516:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;5362:891:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5697:201:15;;;;;;;;;;;;;:::i;:::-;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4162:690:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2796:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6431:104:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2406:2507:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8042:287:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9128:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3435:456:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;971:418:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;587:75:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6606:318:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;826:46:15;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;2362:138;;;;;;;;;;;;;:::i;:::-;;2200:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8400:164:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3092:157:15;;;;;;;;;;;;;:::i;:::-;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5906:345:15;1094:13:0;:11;:13::i;:::-;1744:1:1::1;2325:7;;:19:::0;2317:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;6077:10:15::2;6052:21;:35;;6030:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;6154:12;6180:3;6172:17;;6197:10;6172:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6153:59;;;6231:7;6223:20;;;;;;;;;;;;:::i;:::-;;;;;;;;;6019:232;1701:1:1::1;2628:7;:22;;;;5906:345:15::0;;:::o;3147:305:11:-;3249:4;3301:25;3286:40;;;:11;:40;;;;:105;;;;3358:33;3343:48;;;:11;:48;;;;3286:105;:158;;;;3408:36;3432:11;3408:23;:36::i;:::-;3286:158;3266:178;;3147:305;;;:::o;6262:100::-;6316:13;6349:5;6342:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6262:100;:::o;7766:204::-;7834:7;7859:16;7867:7;7859;:16::i;:::-;7854:64;;7884:34;;;;;;;;;;;;;;7854:64;7938:15;:24;7954:7;7938:24;;;;;;;;;;;;;;;;;;;;;7931:31;;7766:204;;;:::o;7328:372::-;7401:13;7417:24;7433:7;7417:15;:24::i;:::-;7401:40;;7462:5;7456:11;;:2;:11;;;7452:48;;7476:24;;;;;;;;;;;;;;7452:48;7533:5;7517:21;;:12;:10;:12::i;:::-;:21;;;7513:139;;7544:37;7561:5;7568:12;:10;:12::i;:::-;7544:16;:37::i;:::-;7540:112;;7605:35;;;;;;;;;;;;;;7540:112;7513:139;7664:28;7673:2;7677:7;7686:5;7664:8;:28::i;:::-;7390:310;7328:372;;:::o;2387:312::-;2440:7;2665:15;:13;:15::i;:::-;2650:12;;2634:13;;:28;:46;2627:53;;2387:312;:::o;8631:170::-;8765:28;8775:4;8781:2;8785:7;8765:9;:28::i;:::-;8631:170;;;:::o;1323:34:15:-;;;;;;;;;;;;;:::o;8872:185:11:-;9010:39;9027:4;9033:2;9037:7;9010:39;;;;;;;;;;;;:16;:39::i;:::-;8872:185;;;:::o;3257:170:15:-;3306:4;3323:33;3359:19;3323:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3396:6;:23;;;3389:30;;;3257:170;:::o;1401:761::-;1525:4;1547:14;1652:19;;1759:124;1910:18;1965:22;;;;;;;;;;;;;;;;;1955:33;;;;;;1722:289;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1690:340;;;;;;1588:457;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1564:492;;;;;;1547:509;;2124:15;;;;;;;;;;;2087:52;;:33;2101:6;2109:10;2087:13;:33::i;:::-;:52;;;:67;;2149:5;2087:67;;;2142:4;2087:67;2067:87;;;1401:761;;;;:::o;2652:106::-;1094:13:0;:11;:13::i;:::-;2743:7:15::1;;2727:13;:23;;;;;;;:::i;:::-;;2652:106:::0;;:::o;4860:829::-;4935:14;;;;;;;;;;;4927:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;5037:4;5026:7;5010:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:31;;4988:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;5176:7;5149:12;:24;5162:10;5149:24;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;5144:1;:39;;5122:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;5310:7;5297:10;:20;;;;:::i;:::-;5284:9;:33;;5446:38;5476:7;5463:10;:20;;;;:::i;:::-;5446:16;:38::i;:::-;5357:191;;;;;;;;:::i;:::-;;;;;;;;;;;;;5262:312;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5587:26;5593:10;5605:7;5587:5;:26::i;:::-;5674:7;5649:12;:24;5662:10;5649:24;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;5624:12;:24;5637:10;5624:24;;;;;;;;;;;;;;;:57;;;;4860:829;:::o;1548:468:12:-;1637:23;1698:22;1723:8;:15;1698:40;;1753:34;1811:14;1790:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1753:73;;1846:9;1841:125;1862:14;1857:1;:19;1841:125;;1918:32;1938:8;1947:1;1938:11;;;;;;;;:::i;:::-;;;;;;;;1918:19;:32::i;:::-;1902:10;1913:1;1902:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;1878:3;;;;;1841:125;;;;1987:10;1980:17;;;;1548:468;;;:::o;3917:237:15:-;1094:13:0;:11;:13::i;:::-;4048:4:15::1;4037:7;4021:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:31;;3999:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;4122:24;4128:8;4138:7;4122:5;:24::i;:::-;3917:237:::0;;:::o;6070:125:11:-;6134:7;6161:21;6174:7;6161:12;:21::i;:::-;:26;;;6154:33;;6070:125;;;:::o;3516:206::-;3580:7;3621:1;3604:19;;:5;:19;;;3600:60;;3632:28;;;;;;;;;;;;;;3600:60;3686:12;:19;3699:5;3686:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;3678:36;;3671:43;;3516:206;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;5362:891:12:-;5432:16;5486:19;5520:25;5560:22;5585:16;5595:5;5585:9;:16::i;:::-;5560:41;;5616:25;5658:14;5644:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:57;;5688:31;;:::i;:::-;5739:9;5751:15;:13;:15::i;:::-;5739:27;;5734:471;5783:14;5768:11;:29;5734:471;;5835:11;:14;5847:1;5835:14;;;;;;;;;;;5823:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5872:9;:16;;;5913:8;5868:73;5989:1;5963:28;;:9;:14;;;:28;;;5959:111;;6036:9;:14;;;6016:34;;5959:111;6113:5;6092:26;;:17;:26;;;6088:102;;6169:1;6143:8;6152:13;;;;;;6143:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6088:102;5734:471;5799:3;;;;;5734:471;;;;6226:8;6219:15;;;;;;;5362:891;;;:::o;5697:201:15:-;1094:13:0;:11;:13::i;:::-;1744:1:1::1;2325:7;;:19:::0;2317:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;5762:12:15::2;5788:7;:5;:7::i;:::-;5780:21;;5809;5780:79;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5761:98;;;5878:7;5870:20;;;;;;;;;;;;:::i;:::-;;;;;;;;;5750:148;1701:1:1::1;2628:7;:22;;;;5697:201:15:o:0;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;4162:690:15:-;4306:1;4284:19;:17;:19::i;:::-;:23;4276:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4375:37;4389:10;4401;4375:13;:37::i;:::-;4353:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;4529:4;4518:7;4502:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:31;;4480:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;4658:7;4631:12;:24;4644:10;4631:24;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;4626:1;:39;;4604:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;4750:26;4756:10;4768:7;4750:5;:26::i;:::-;4837:7;4812:12;:24;4825:10;4812:24;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;4787:12;:24;4800:10;4787:24;;;;;;;;;;;;;;;:57;;;;4162:690;;:::o;2796:288::-;1094:13:0;:11;:13::i;:::-;2904:137:15::1;;;;;;;;2938:15;2904:137;;;;3008:2;2987:18;:23;;;;:::i;:::-;2968:15;:43;;;;:::i;:::-;2904:137;;;;3026:4;2904:137;;;;::::0;2882:19:::1;:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3071:4;3057:19;;;;;;;;;;;;2796:288:::0;:::o;6431:104:11:-;6487:13;6520:7;6513:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6431:104;:::o;2406:2507:12:-;2541:16;2608:4;2599:5;:13;2595:45;;2621:19;;;;;;;;;;;;;;2595:45;2655:19;2689:17;2709:13;;2689:33;;2808:15;:13;:15::i;:::-;2800:5;:23;2796:87;;;2852:15;:13;:15::i;:::-;2844:23;;2796:87;2963:9;2956:4;:16;2952:73;;;3000:9;2993:16;;2952:73;3039:25;3067:16;3077:5;3067:9;:16::i;:::-;3039:44;;3261:4;3253:5;:12;3249:278;;;3286:19;3315:5;3308:4;:12;3286:34;;3357:17;3343:11;:31;3339:111;;;3419:11;3399:31;;3339:111;3267:198;3249:278;;;3510:1;3490:21;;3249:278;3541:25;3583:17;3569:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3541:60;;3641:1;3620:17;:22;3616:78;;3670:8;3663:15;;;;;;;;3616:78;3838:31;3872:26;3892:5;3872:19;:26::i;:::-;3838:60;;3913:25;4158:9;:16;;;4153:92;;4215:9;:14;;;4195:34;;4153:92;4264:9;4276:5;4264:17;;4259:477;4288:4;4283:1;:9;;:45;;;;;4311:17;4296:11;:32;;4283:45;4259:477;;;4366:11;:14;4378:1;4366:14;;;;;;;;;;;4354:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4403:9;:16;;;4444:8;4399:73;4520:1;4494:28;;:9;:14;;;:28;;;4490:111;;4567:9;:14;;;4547:34;;4490:111;4644:5;4623:26;;:17;:26;;;4619:102;;4700:1;4674:8;4683:13;;;;;;4674:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4619:102;4259:477;4330:3;;;;;4259:477;;;;4838:11;4828:8;4821:29;4886:8;4879:15;;;;;;;;2406:2507;;;;;;:::o;8042:287:11:-;8153:12;:10;:12::i;:::-;8141:24;;:8;:24;;;8137:54;;8174:17;;;;;;;;;;;;;;8137:54;8249:8;8204:18;:32;8223:12;:10;:12::i;:::-;8204:32;;;;;;;;;;;;;;;:42;8237:8;8204:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;8302:8;8273:48;;8288:12;:10;:12::i;:::-;8273:48;;;8312:8;8273:48;;;;;;:::i;:::-;;;;;;;;8042:287;;:::o;9128:370::-;9295:28;9305:4;9311:2;9315:7;9295:9;:28::i;:::-;9338:15;:2;:13;;;:15::i;:::-;9334:157;;;9359:56;9390:4;9396:2;9400:7;9409:5;9359:30;:56::i;:::-;9355:136;;9439:40;;;;;;;;;;;;;;9355:136;9334:157;9128:370;;;;:::o;3435:456:15:-;3485:7;3546:33;3582:19;3546:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3612:16;3638:6;:29;;;3612:56;;3679:14;3703:6;:27;;;3679:52;;3765:9;3746:28;;:15;:28;;:58;;;;;3797:7;3778:26;;:15;:26;;3746:58;3742:123;;;3838:15;3828:7;:25;;;;;;:::i;:::-;3821:32;;;;;;;3742:123;3882:1;3875:8;;;;;3435:456;;:::o;971:418:12:-;1047:21;;:::i;:::-;1081:31;;:::i;:::-;1137:15;:13;:15::i;:::-;1127:7;:25;:53;;;;1167:13;;1156:7;:24;;1127:53;1123:102;;;1204:9;1197:16;;;;;1123:102;1247:11;:20;1259:7;1247:20;;;;;;;;;;;1235:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1282:9;:16;;;1278:65;;;1322:9;1315:16;;;;;1278:65;1360:21;1373:7;1360:12;:21::i;:::-;1353:28;;;971:418;;;;:::o;587:75:15:-;;;;;;;;;;;;;:::o;6606:318:11:-;6679:13;6710:16;6718:7;6710;:16::i;:::-;6705:59;;6735:29;;;;;;;;;;;;;;6705:59;6777:21;6801:10;:8;:10::i;:::-;6777:34;;6854:1;6835:7;6829:21;:26;:87;;;;;;;;;;;;;;;;;6882:7;6891:18;:7;:16;:18::i;:::-;6865:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6829:87;6822:94;;;6606:318;;;:::o;826:46:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2362:138::-;1094:13:0;:11;:13::i;:::-;2436:14:15::1;;;;;;;;;;;2435:15;2418:14;;:32;;;;;;;;;;;;;;;;;;2477:14;;;;;;;;;;;2466:26;;;;;;;;;;;;2362:138::o:0;2200:126::-;1094:13:0;:11;:13::i;:::-;2302:16:15::1;2284:15;;:34;;;;;;;;;;;;;;;;;;2200:126:::0;:::o;8400:164:11:-;8497:4;8521:18;:25;8540:5;8521:25;;;;;;;;;;;;;;;:35;8547:8;8521:35;;;;;;;;;;;;;;;;;;;;;;;;;8514:42;;8400:164;;;;:::o;3092:157:15:-;1094:13:0;:11;:13::i;:::-;3173:32:15::1;;;;;;;;3193:1;3173:32;;;;3196:1;3173:32;;;;3199:5;3173:32;;;;::::0;3151:19:::1;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3235:5;3221:20;;;;;;;;;;;;3092:157::o:0;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1359:130::-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;829:155:9:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;9753:174:11:-;9810:4;9853:7;9834:15;:13;:15::i;:::-;:26;;:53;;;;;9874:13;;9864:7;:23;9834:53;:85;;;;;9892:11;:20;9904:7;9892:20;;;;;;;;;;;:27;;;;;;;;;;;;9891:28;9834:85;9827:92;;9753:174;;;:::o;640:96:6:-;693:7;719:10;712:17;;640:96;:::o;18975:196:11:-;19117:2;19090:15;:24;19106:7;19090:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19155:7;19151:2;19135:28;;19144:5;19135:28;;;;;;;;;;;;18975:196;;;:::o;2161:92::-;2217:7;2161:92;:::o;13923:2130::-;14038:35;14076:21;14089:7;14076:12;:21::i;:::-;14038:59;;14136:4;14114:26;;:13;:18;;;:26;;;14110:67;;14149:28;;;;;;;;;;;;;;14110:67;14190:22;14232:4;14216:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;14253:36;14270:4;14276:12;:10;:12::i;:::-;14253:16;:36::i;:::-;14216:73;:126;;;;14330:12;:10;:12::i;:::-;14306:36;;:20;14318:7;14306:11;:20::i;:::-;:36;;;14216:126;14190:153;;14361:17;14356:66;;14387:35;;;;;;;;;;;;;;14356:66;14451:1;14437:16;;:2;:16;;;14433:52;;14462:23;;;;;;;;;;;;;;14433:52;14498:43;14520:4;14526:2;14530:7;14539:1;14498:21;:43::i;:::-;14606:35;14623:1;14627:7;14636:4;14606:8;:35::i;:::-;14967:1;14937:12;:18;14950:4;14937:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15011:1;14983:12;:16;14996:2;14983:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15029:31;15063:11;:20;15075:7;15063:20;;;;;;;;;;;15029:54;;15114:2;15098:8;:13;;;:18;;;;;;;;;;;;;;;;;;15164:15;15131:8;:23;;;:49;;;;;;;;;;;;;;;;;;15432:19;15464:1;15454:7;:11;15432:33;;15480:31;15514:11;:24;15526:11;15514:24;;;;;;;;;;;15480:58;;15582:1;15557:27;;:8;:13;;;;;;;;;;;;:27;;;15553:384;;15767:13;;15752:11;:28;15748:174;;15821:4;15805:8;:13;;;:20;;;;;;;;;;;;;;;;;;15874:13;:28;;;15848:8;:23;;;:54;;;;;;;;;;;;;;;;;;15748:174;15553:384;14912:1036;;;15984:7;15980:2;15965:27;;15974:4;15965:27;;;;;;;;;;;;16003:42;16024:4;16030:2;16034:7;16043:1;16003:20;:42::i;:::-;14027:2026;;13923:2130;;;:::o;3759:227:8:-;3837:7;3857:17;3876:18;3898:27;3909:4;3915:9;3898:10;:27::i;:::-;3856:69;;;;3935:18;3947:5;3935:11;:18::i;:::-;3970:9;3963:16;;;;3759:227;;;;:::o;392:703:7:-;448:13;674:1;665:5;:10;661:51;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;12496:1173:11:-;12561:20;12584:13;;12561:36;;12626:1;12612:16;;:2;:16;;;12608:48;;12637:19;;;;;;;;;;;;;;12608:48;12683:1;12671:8;:13;12667:44;;12693:18;;;;;;;;;;;;;;12667:44;12724:61;12754:1;12758:2;12762:12;12776:8;12724:21;:61::i;:::-;13097:8;13062:12;:16;13075:2;13062:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13161:8;13121:12;:16;13134:2;13121:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13220:2;13187:11;:25;13199:12;13187:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13287:15;13237:11;:25;13249:12;13237:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;13320:20;13343:12;13320:35;;13370:11;13399:8;13384:12;:23;13370:37;;13424:111;13476:14;;;;;;13472:2;13451:40;;13468:1;13451:40;;;;;;;;;;;;13530:3;13515:12;:18;13424:111;;13567:12;13551:13;:28;;;;13037:554;;13601:60;13630:1;13634:2;13638:12;13652:8;13601:20;:60::i;:::-;12550:1119;12496:1173;;:::o;4897:1111::-;4959:21;;:::i;:::-;4993:12;5008:7;4993:22;;5076:4;5057:15;:13;:15::i;:::-;:23;5053:888;;5093:13;;5086:4;:20;5082:859;;;5127:31;5161:11;:17;5173:4;5161:17;;;;;;;;;;;5127:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5202:9;:16;;;5197:729;;5273:1;5247:28;;:9;:14;;;:28;;;5243:101;;5311:9;5304:16;;;;;;5243:101;5646:261;5653:4;5646:261;;;5686:6;;;;;;;;5731:11;:17;5743:4;5731:17;;;;;;;;;;;5719:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5805:1;5779:28;;:9;:14;;;:28;;;5775:109;;5847:9;5840:16;;;;;;5775:109;5646:261;;;5197:729;5108:833;5082:859;5053:888;5969:31;;;;;;;;;;;;;;4897:1111;;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;1175:320:5:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;19663:667:11:-;19826:4;19863:2;19847:36;;;19884:12;:10;:12::i;:::-;19898:4;19904:7;19913:5;19847:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19843:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20098:1;20081:6;:13;:18;20077:235;;20127:40;;;;;;;;;;;;;;20077:235;20270:6;20264:13;20255:6;20251:2;20247:15;20240:38;19843:480;19976:45;;;19966:55;;;:6;:55;;;;19959:62;;;19663:667;;;;;;:::o;2508:114:15:-;2568:13;2601;2594:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2508:114;:::o;20978:159:11:-;;;;;:::o;21796:158::-;;;;;:::o;2243:730:8:-;2324:7;2333:12;2381:2;2361:9;:16;:22;2357:610;;2399:9;2422;2445:7;2697:4;2686:9;2682:20;2676:27;2671:32;;2746:4;2735:9;2731:20;2725:27;2720:32;;2803:4;2792:9;2788:20;2782:27;2779:1;2774:36;2769:41;;2844:25;2855:4;2861:1;2864;2867;2844:10;:25::i;:::-;2837:32;;;;;;;;;2357:610;2916:1;2920:35;2900:56;;;;2243:730;;;;;;:::o;548:631::-;625:20;616:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;612:561;661:7;612:561;721:29;712:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;708:465;;766:34;;;;;;;;;;:::i;:::-;;;;;;;;708:465;830:35;821:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;817:356;;881:41;;;;;;;;;;:::i;:::-;;;;;;;;817:356;952:30;943:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;939:234;;998:44;;;;;;;;;;:::i;:::-;;;;;;;;939:234;1072:30;1063:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1059:114;;1118:44;;;;;;;;;;:::i;:::-;;;;;;;;1059:114;548:631;;:::o;5167:1603::-;5293:7;5302:12;6217:66;6212:1;6204:10;;:79;6200:161;;;6315:1;6319:30;6299:51;;;;;;6200:161;6379:2;6374:1;:7;;;;:18;;;;;6390:2;6385:1;:7;;;;6374:18;6370:100;;;6424:1;6428:30;6408:51;;;;;;6370:100;6564:14;6581:24;6591:4;6597:1;6600;6603;6581:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6564:41;;6637:1;6619:20;;:6;:20;;;6615:101;;6671:1;6675:29;6655:50;;;;;;;6615:101;6734:6;6742:20;6726:37;;;;;5167:1603;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:16:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:126::-;727:7;767:42;760:5;756:54;745:65;;690:126;;;:::o;822:96::-;859:7;888:24;906:5;888:24;:::i;:::-;877:35;;822:96;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:149::-;1713:7;1753:66;1746:5;1742:78;1731:89;;1677:149;;;:::o;1832:120::-;1904:23;1921:5;1904:23;:::i;:::-;1897:5;1894:34;1884:62;;1942:1;1939;1932:12;1884:62;1832:120;:::o;1958:137::-;2003:5;2041:6;2028:20;2019:29;;2057:32;2083:5;2057:32;:::i;:::-;1958:137;;;;:::o;2101:327::-;2159:6;2208:2;2196:9;2187:7;2183:23;2179:32;2176:119;;;2214:79;;:::i;:::-;2176:119;2334:1;2359:52;2403:7;2394:6;2383:9;2379:22;2359:52;:::i;:::-;2349:62;;2305:116;2101:327;;;;:::o;2434:90::-;2468:7;2511:5;2504:13;2497:21;2486:32;;2434:90;;;:::o;2530:109::-;2611:21;2626:5;2611:21;:::i;:::-;2606:3;2599:34;2530:109;;:::o;2645:210::-;2732:4;2770:2;2759:9;2755:18;2747:26;;2783:65;2845:1;2834:9;2830:17;2821:6;2783:65;:::i;:::-;2645:210;;;;:::o;2861:99::-;2913:6;2947:5;2941:12;2931:22;;2861:99;;;:::o;2966:169::-;3050:11;3084:6;3079:3;3072:19;3124:4;3119:3;3115:14;3100:29;;2966:169;;;;:::o;3141:246::-;3222:1;3232:113;3246:6;3243:1;3240:13;3232:113;;;3331:1;3326:3;3322:11;3316:18;3312:1;3307:3;3303:11;3296:39;3268:2;3265:1;3261:10;3256:15;;3232:113;;;3379:1;3370:6;3365:3;3361:16;3354:27;3203:184;3141:246;;;:::o;3393:102::-;3434:6;3485:2;3481:7;3476:2;3469:5;3465:14;3461:28;3451:38;;3393:102;;;:::o;3501:377::-;3589:3;3617:39;3650:5;3617:39;:::i;:::-;3672:71;3736:6;3731:3;3672:71;:::i;:::-;3665:78;;3752:65;3810:6;3805:3;3798:4;3791:5;3787:16;3752:65;:::i;:::-;3842:29;3864:6;3842:29;:::i;:::-;3837:3;3833:39;3826:46;;3593:285;3501:377;;;;:::o;3884:313::-;3997:4;4035:2;4024:9;4020:18;4012:26;;4084:9;4078:4;4074:20;4070:1;4059:9;4055:17;4048:47;4112:78;4185:4;4176:6;4112:78;:::i;:::-;4104:86;;3884:313;;;;:::o;4203:329::-;4262:6;4311:2;4299:9;4290:7;4286:23;4282:32;4279:119;;;4317:79;;:::i;:::-;4279:119;4437:1;4462:53;4507:7;4498:6;4487:9;4483:22;4462:53;:::i;:::-;4452:63;;4408:117;4203:329;;;;:::o;4538:118::-;4625:24;4643:5;4625:24;:::i;:::-;4620:3;4613:37;4538:118;;:::o;4662:222::-;4755:4;4793:2;4782:9;4778:18;4770:26;;4806:71;4874:1;4863:9;4859:17;4850:6;4806:71;:::i;:::-;4662:222;;;;:::o;4890:474::-;4958:6;4966;5015:2;5003:9;4994:7;4990:23;4986:32;4983:119;;;5021:79;;:::i;:::-;4983:119;5141:1;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5112:117;5268:2;5294:53;5339:7;5330:6;5319:9;5315:22;5294:53;:::i;:::-;5284:63;;5239:118;4890:474;;;;;:::o;5370:118::-;5457:24;5475:5;5457:24;:::i;:::-;5452:3;5445:37;5370:118;;:::o;5494:222::-;5587:4;5625:2;5614:9;5610:18;5602:26;;5638:71;5706:1;5695:9;5691:17;5682:6;5638:71;:::i;:::-;5494:222;;;;:::o;5722:619::-;5799:6;5807;5815;5864:2;5852:9;5843:7;5839:23;5835:32;5832:119;;;5870:79;;:::i;:::-;5832:119;5990:1;6015:53;6060:7;6051:6;6040:9;6036:22;6015:53;:::i;:::-;6005:63;;5961:117;6117:2;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6088:118;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5722:619;;;;;:::o;6347:117::-;6456:1;6453;6446:12;6470:117;6579:1;6576;6569:12;6593:180;6641:77;6638:1;6631:88;6738:4;6735:1;6728:15;6762:4;6759:1;6752:15;6779:281;6862:27;6884:4;6862:27;:::i;:::-;6854:6;6850:40;6992:6;6980:10;6977:22;6956:18;6944:10;6941:34;6938:62;6935:88;;;7003:18;;:::i;:::-;6935:88;7043:10;7039:2;7032:22;6822:238;6779:281;;:::o;7066:129::-;7100:6;7127:20;;:::i;:::-;7117:30;;7156:33;7184:4;7176:6;7156:33;:::i;:::-;7066:129;;;:::o;7201:307::-;7262:4;7352:18;7344:6;7341:30;7338:56;;;7374:18;;:::i;:::-;7338:56;7412:29;7434:6;7412:29;:::i;:::-;7404:37;;7496:4;7490;7486:15;7478:23;;7201:307;;;:::o;7514:146::-;7611:6;7606:3;7601;7588:30;7652:1;7643:6;7638:3;7634:16;7627:27;7514:146;;;:::o;7666:423::-;7743:5;7768:65;7784:48;7825:6;7784:48;:::i;:::-;7768:65;:::i;:::-;7759:74;;7856:6;7849:5;7842:21;7894:4;7887:5;7883:16;7932:3;7923:6;7918:3;7914:16;7911:25;7908:112;;;7939:79;;:::i;:::-;7908:112;8029:54;8076:6;8071:3;8066;8029:54;:::i;:::-;7749:340;7666:423;;;;;:::o;8108:338::-;8163:5;8212:3;8205:4;8197:6;8193:17;8189:27;8179:122;;8220:79;;:::i;:::-;8179:122;8337:6;8324:20;8362:78;8436:3;8428:6;8421:4;8413:6;8409:17;8362:78;:::i;:::-;8353:87;;8169:277;8108:338;;;;:::o;8452:652::-;8529:6;8537;8586:2;8574:9;8565:7;8561:23;8557:32;8554:119;;;8592:79;;:::i;:::-;8554:119;8712:1;8737:53;8782:7;8773:6;8762:9;8758:22;8737:53;:::i;:::-;8727:63;;8683:117;8867:2;8856:9;8852:18;8839:32;8898:18;8890:6;8887:30;8884:117;;;8920:79;;:::i;:::-;8884:117;9025:62;9079:7;9070:6;9059:9;9055:22;9025:62;:::i;:::-;9015:72;;8810:287;8452:652;;;;;:::o;9110:117::-;9219:1;9216;9209:12;9233:117;9342:1;9339;9332:12;9370:553;9428:8;9438:6;9488:3;9481:4;9473:6;9469:17;9465:27;9455:122;;9496:79;;:::i;:::-;9455:122;9609:6;9596:20;9586:30;;9639:18;9631:6;9628:30;9625:117;;;9661:79;;:::i;:::-;9625:117;9775:4;9767:6;9763:17;9751:29;;9829:3;9821:4;9813:6;9809:17;9799:8;9795:32;9792:41;9789:128;;;9836:79;;:::i;:::-;9789:128;9370:553;;;;;:::o;9929:529::-;10000:6;10008;10057:2;10045:9;10036:7;10032:23;10028:32;10025:119;;;10063:79;;:::i;:::-;10025:119;10211:1;10200:9;10196:17;10183:31;10241:18;10233:6;10230:30;10227:117;;;10263:79;;:::i;:::-;10227:117;10376:65;10433:7;10424:6;10413:9;10409:22;10376:65;:::i;:::-;10358:83;;;;10154:297;9929:529;;;;;:::o;10464:311::-;10541:4;10631:18;10623:6;10620:30;10617:56;;;10653:18;;:::i;:::-;10617:56;10703:4;10695:6;10691:17;10683:25;;10763:4;10757;10753:15;10745:23;;10464:311;;;:::o;10798:710::-;10894:5;10919:81;10935:64;10992:6;10935:64;:::i;:::-;10919:81;:::i;:::-;10910:90;;11020:5;11049:6;11042:5;11035:21;11083:4;11076:5;11072:16;11065:23;;11136:4;11128:6;11124:17;11116:6;11112:30;11165:3;11157:6;11154:15;11151:122;;;11184:79;;:::i;:::-;11151:122;11299:6;11282:220;11316:6;11311:3;11308:15;11282:220;;;11391:3;11420:37;11453:3;11441:10;11420:37;:::i;:::-;11415:3;11408:50;11487:4;11482:3;11478:14;11471:21;;11358:144;11342:4;11337:3;11333:14;11326:21;;11282:220;;;11286:21;10900:608;;10798:710;;;;;:::o;11531:370::-;11602:5;11651:3;11644:4;11636:6;11632:17;11628:27;11618:122;;11659:79;;:::i;:::-;11618:122;11776:6;11763:20;11801:94;11891:3;11883:6;11876:4;11868:6;11864:17;11801:94;:::i;:::-;11792:103;;11608:293;11531:370;;;;:::o;11907:539::-;11991:6;12040:2;12028:9;12019:7;12015:23;12011:32;12008:119;;;12046:79;;:::i;:::-;12008:119;12194:1;12183:9;12179:17;12166:31;12224:18;12216:6;12213:30;12210:117;;;12246:79;;:::i;:::-;12210:117;12351:78;12421:7;12412:6;12401:9;12397:22;12351:78;:::i;:::-;12341:88;;12137:302;11907:539;;;;:::o;12452:146::-;12551:6;12585:5;12579:12;12569:22;;12452:146;;;:::o;12604:216::-;12735:11;12769:6;12764:3;12757:19;12809:4;12804:3;12800:14;12785:29;;12604:216;;;;:::o;12826:164::-;12925:4;12948:3;12940:11;;12978:4;12973:3;12969:14;12961:22;;12826:164;;;:::o;12996:108::-;13073:24;13091:5;13073:24;:::i;:::-;13068:3;13061:37;12996:108;;:::o;13110:101::-;13146:7;13186:18;13179:5;13175:30;13164:41;;13110:101;;;:::o;13217:105::-;13292:23;13309:5;13292:23;:::i;:::-;13287:3;13280:36;13217:105;;:::o;13328:99::-;13399:21;13414:5;13399:21;:::i;:::-;13394:3;13387:34;13328:99;;:::o;13505:689::-;13656:4;13651:3;13647:14;13743:4;13736:5;13732:16;13726:23;13762:63;13819:4;13814:3;13810:14;13796:12;13762:63;:::i;:::-;13671:164;13927:4;13920:5;13916:16;13910:23;13946:61;14001:4;13996:3;13992:14;13978:12;13946:61;:::i;:::-;13845:172;14101:4;14094:5;14090:16;14084:23;14120:57;14171:4;14166:3;14162:14;14148:12;14120:57;:::i;:::-;14027:160;13625:569;13505:689;;:::o;14200:307::-;14333:10;14354:110;14460:3;14452:6;14354:110;:::i;:::-;14496:4;14491:3;14487:14;14473:28;;14200:307;;;;:::o;14513:145::-;14615:4;14647;14642:3;14638:14;14630:22;;14513:145;;;:::o;14740:988::-;14923:3;14952:86;15032:5;14952:86;:::i;:::-;15054:118;15165:6;15160:3;15054:118;:::i;:::-;15047:125;;15196:88;15278:5;15196:88;:::i;:::-;15307:7;15338:1;15323:380;15348:6;15345:1;15342:13;15323:380;;;15424:6;15418:13;15451:127;15574:3;15559:13;15451:127;:::i;:::-;15444:134;;15601:92;15686:6;15601:92;:::i;:::-;15591:102;;15383:320;15370:1;15367;15363:9;15358:14;;15323:380;;;15327:14;15719:3;15712:10;;14928:800;;;14740:988;;;;:::o;15734:501::-;15941:4;15979:2;15968:9;15964:18;15956:26;;16028:9;16022:4;16018:20;16014:1;16003:9;15999:17;15992:47;16056:172;16223:4;16214:6;16056:172;:::i;:::-;16048:180;;15734:501;;;;:::o;16241:329::-;16300:6;16349:2;16337:9;16328:7;16324:23;16320:32;16317:119;;;16355:79;;:::i;:::-;16317:119;16475:1;16500:53;16545:7;16536:6;16525:9;16521:22;16500:53;:::i;:::-;16490:63;;16446:117;16241:329;;;;:::o;16576:114::-;16643:6;16677:5;16671:12;16661:22;;16576:114;;;:::o;16696:184::-;16795:11;16829:6;16824:3;16817:19;16869:4;16864:3;16860:14;16845:29;;16696:184;;;;:::o;16886:132::-;16953:4;16976:3;16968:11;;17006:4;17001:3;16997:14;16989:22;;16886:132;;;:::o;17024:108::-;17101:24;17119:5;17101:24;:::i;:::-;17096:3;17089:37;17024:108;;:::o;17138:179::-;17207:10;17228:46;17270:3;17262:6;17228:46;:::i;:::-;17306:4;17301:3;17297:14;17283:28;;17138:179;;;;:::o;17323:113::-;17393:4;17425;17420:3;17416:14;17408:22;;17323:113;;;:::o;17472:732::-;17591:3;17620:54;17668:5;17620:54;:::i;:::-;17690:86;17769:6;17764:3;17690:86;:::i;:::-;17683:93;;17800:56;17850:5;17800:56;:::i;:::-;17879:7;17910:1;17895:284;17920:6;17917:1;17914:13;17895:284;;;17996:6;17990:13;18023:63;18082:3;18067:13;18023:63;:::i;:::-;18016:70;;18109:60;18162:6;18109:60;:::i;:::-;18099:70;;17955:224;17942:1;17939;17935:9;17930:14;;17895:284;;;17899:14;18195:3;18188:10;;17596:608;;;17472:732;;;;:::o;18210:373::-;18353:4;18391:2;18380:9;18376:18;18368:26;;18440:9;18434:4;18430:20;18426:1;18415:9;18411:17;18404:47;18468:108;18571:4;18562:6;18468:108;:::i;:::-;18460:116;;18210:373;;;;:::o;18589:652::-;18666:6;18674;18723:2;18711:9;18702:7;18698:23;18694:32;18691:119;;;18729:79;;:::i;:::-;18691:119;18849:1;18874:53;18919:7;18910:6;18899:9;18895:22;18874:53;:::i;:::-;18864:63;;18820:117;19004:2;18993:9;18989:18;18976:32;19035:18;19027:6;19024:30;19021:117;;;19057:79;;:::i;:::-;19021:117;19162:62;19216:7;19207:6;19196:9;19192:22;19162:62;:::i;:::-;19152:72;;18947:287;18589:652;;;;;:::o;19247:619::-;19324:6;19332;19340;19389:2;19377:9;19368:7;19364:23;19360:32;19357:119;;;19395:79;;:::i;:::-;19357:119;19515:1;19540:53;19585:7;19576:6;19565:9;19561:22;19540:53;:::i;:::-;19530:63;;19486:117;19642:2;19668:53;19713:7;19704:6;19693:9;19689:22;19668:53;:::i;:::-;19658:63;;19613:118;19770:2;19796:53;19841:7;19832:6;19821:9;19817:22;19796:53;:::i;:::-;19786:63;;19741:118;19247:619;;;;;:::o;19872:116::-;19942:21;19957:5;19942:21;:::i;:::-;19935:5;19932:32;19922:60;;19978:1;19975;19968:12;19922:60;19872:116;:::o;19994:133::-;20037:5;20075:6;20062:20;20053:29;;20091:30;20115:5;20091:30;:::i;:::-;19994:133;;;;:::o;20133:468::-;20198:6;20206;20255:2;20243:9;20234:7;20230:23;20226:32;20223:119;;;20261:79;;:::i;:::-;20223:119;20381:1;20406:53;20451:7;20442:6;20431:9;20427:22;20406:53;:::i;:::-;20396:63;;20352:117;20508:2;20534:50;20576:7;20567:6;20556:9;20552:22;20534:50;:::i;:::-;20524:60;;20479:115;20133:468;;;;;:::o;20607:943::-;20702:6;20710;20718;20726;20775:3;20763:9;20754:7;20750:23;20746:33;20743:120;;;20782:79;;:::i;:::-;20743:120;20902:1;20927:53;20972:7;20963:6;20952:9;20948:22;20927:53;:::i;:::-;20917:63;;20873:117;21029:2;21055:53;21100:7;21091:6;21080:9;21076:22;21055:53;:::i;:::-;21045:63;;21000:118;21157:2;21183:53;21228:7;21219:6;21208:9;21204:22;21183:53;:::i;:::-;21173:63;;21128:118;21313:2;21302:9;21298:18;21285:32;21344:18;21336:6;21333:30;21330:117;;;21366:79;;:::i;:::-;21330:117;21471:62;21525:7;21516:6;21505:9;21501:22;21471:62;:::i;:::-;21461:72;;21256:287;20607:943;;;;;;;:::o;21628:699::-;21789:4;21784:3;21780:14;21876:4;21869:5;21865:16;21859:23;21895:63;21952:4;21947:3;21943:14;21929:12;21895:63;:::i;:::-;21804:164;22060:4;22053:5;22049:16;22043:23;22079:61;22134:4;22129:3;22125:14;22111:12;22079:61;:::i;:::-;21978:172;22234:4;22227:5;22223:16;22217:23;22253:57;22304:4;22299:3;22295:14;22281:12;22253:57;:::i;:::-;22160:160;21758:569;21628:699;;:::o;22333:350::-;22490:4;22528:2;22517:9;22513:18;22505:26;;22541:135;22673:1;22662:9;22658:17;22649:6;22541:135;:::i;:::-;22333:350;;;;:::o;22689:430::-;22832:4;22870:2;22859:9;22855:18;22847:26;;22883:71;22951:1;22940:9;22936:17;22927:6;22883:71;:::i;:::-;22964:72;23032:2;23021:9;23017:18;23008:6;22964:72;:::i;:::-;23046:66;23108:2;23097:9;23093:18;23084:6;23046:66;:::i;:::-;22689:430;;;;;;:::o;23125:474::-;23193:6;23201;23250:2;23238:9;23229:7;23225:23;23221:32;23218:119;;;23256:79;;:::i;:::-;23218:119;23376:1;23401:53;23446:7;23437:6;23426:9;23422:22;23401:53;:::i;:::-;23391:63;;23347:117;23503:2;23529:53;23574:7;23565:6;23554:9;23550:22;23529:53;:::i;:::-;23519:63;;23474:118;23125:474;;;;;:::o;23605:181::-;23745:33;23741:1;23733:6;23729:14;23722:57;23605:181;:::o;23792:366::-;23934:3;23955:67;24019:2;24014:3;23955:67;:::i;:::-;23948:74;;24031:93;24120:3;24031:93;:::i;:::-;24149:2;24144:3;24140:12;24133:19;;23792:366;;;:::o;24164:419::-;24330:4;24368:2;24357:9;24353:18;24345:26;;24417:9;24411:4;24407:20;24403:1;24392:9;24388:17;24381:47;24445:131;24571:4;24445:131;:::i;:::-;24437:139;;24164:419;;;:::o;24589:177::-;24729:29;24725:1;24717:6;24713:14;24706:53;24589:177;:::o;24772:366::-;24914:3;24935:67;24999:2;24994:3;24935:67;:::i;:::-;24928:74;;25011:93;25100:3;25011:93;:::i;:::-;25129:2;25124:3;25120:12;25113:19;;24772:366;;;:::o;25144:419::-;25310:4;25348:2;25337:9;25333:18;25325:26;;25397:9;25391:4;25387:20;25383:1;25372:9;25368:17;25361:47;25425:131;25551:4;25425:131;:::i;:::-;25417:139;;25144:419;;;:::o;25569:147::-;25670:11;25707:3;25692:18;;25569:147;;;;:::o;25722:114::-;;:::o;25842:398::-;26001:3;26022:83;26103:1;26098:3;26022:83;:::i;:::-;26015:90;;26114:93;26203:3;26114:93;:::i;:::-;26232:1;26227:3;26223:11;26216:18;;25842:398;;;:::o;26246:379::-;26430:3;26452:147;26595:3;26452:147;:::i;:::-;26445:154;;26616:3;26609:10;;26246:379;;;:::o;26631:364::-;26773:3;26794:66;26858:1;26853:3;26794:66;:::i;:::-;26787:73;;26869:93;26958:3;26869:93;:::i;:::-;26987:1;26982:3;26978:11;26971:18;;26631:364;;;:::o;27001:419::-;27167:4;27205:2;27194:9;27190:18;27182:26;;27254:9;27248:4;27244:20;27240:1;27229:9;27225:17;27218:47;27282:131;27408:4;27282:131;:::i;:::-;27274:139;;27001:419;;;:::o;27426:180::-;27474:77;27471:1;27464:88;27571:4;27568:1;27561:15;27595:4;27592:1;27585:15;27612:320;27656:6;27693:1;27687:4;27683:12;27673:22;;27740:1;27734:4;27730:12;27761:18;27751:81;;27817:4;27809:6;27805:17;27795:27;;27751:81;27879:2;27871:6;27868:14;27848:18;27845:38;27842:84;;27898:18;;:::i;:::-;27842:84;27663:269;27612:320;;;:::o;27938:77::-;27975:7;28004:5;27993:16;;27938:77;;;:::o;28021:118::-;28108:24;28126:5;28108:24;:::i;:::-;28103:3;28096:37;28021:118;;:::o;28145:442::-;28294:4;28332:2;28321:9;28317:18;28309:26;;28345:71;28413:1;28402:9;28398:17;28389:6;28345:71;:::i;:::-;28426:72;28494:2;28483:9;28479:18;28470:6;28426:72;:::i;:::-;28508;28576:2;28565:9;28561:18;28552:6;28508:72;:::i;:::-;28145:442;;;;;;:::o;28593:148::-;28695:11;28732:3;28717:18;;28593:148;;;;:::o;28747:214::-;28887:66;28883:1;28875:6;28871:14;28864:90;28747:214;:::o;28967:400::-;29127:3;29148:84;29230:1;29225:3;29148:84;:::i;:::-;29141:91;;29241:93;29330:3;29241:93;:::i;:::-;29359:1;29354:3;29350:11;29343:18;;28967:400;;;:::o;29373:79::-;29412:7;29441:5;29430:16;;29373:79;;;:::o;29458:157::-;29563:45;29583:24;29601:5;29583:24;:::i;:::-;29563:45;:::i;:::-;29558:3;29551:58;29458:157;;:::o;29621:663::-;29862:3;29884:148;30028:3;29884:148;:::i;:::-;29877:155;;30042:75;30113:3;30104:6;30042:75;:::i;:::-;30142:2;30137:3;30133:12;30126:19;;30155:75;30226:3;30217:6;30155:75;:::i;:::-;30255:2;30250:3;30246:12;30239:19;;30275:3;30268:10;;29621:663;;;;;:::o;30290:97::-;30349:6;30377:3;30367:13;;30290:97;;;;:::o;30393:141::-;30442:4;30465:3;30457:11;;30488:3;30485:1;30478:14;30522:4;30519:1;30509:18;30501:26;;30393:141;;;:::o;30540:93::-;30577:6;30624:2;30619;30612:5;30608:14;30604:23;30594:33;;30540:93;;;:::o;30639:107::-;30683:8;30733:5;30727:4;30723:16;30702:37;;30639:107;;;;:::o;30752:393::-;30821:6;30871:1;30859:10;30855:18;30894:97;30924:66;30913:9;30894:97;:::i;:::-;31012:39;31042:8;31031:9;31012:39;:::i;:::-;31000:51;;31084:4;31080:9;31073:5;31069:21;31060:30;;31133:4;31123:8;31119:19;31112:5;31109:30;31099:40;;30828:317;;30752:393;;;;;:::o;31151:60::-;31179:3;31200:5;31193:12;;31151:60;;;:::o;31217:142::-;31267:9;31300:53;31318:34;31327:24;31345:5;31327:24;:::i;:::-;31318:34;:::i;:::-;31300:53;:::i;:::-;31287:66;;31217:142;;;:::o;31365:75::-;31408:3;31429:5;31422:12;;31365:75;;;:::o;31446:269::-;31556:39;31587:7;31556:39;:::i;:::-;31617:91;31666:41;31690:16;31666:41;:::i;:::-;31658:6;31651:4;31645:11;31617:91;:::i;:::-;31611:4;31604:105;31522:193;31446:269;;;:::o;31721:73::-;31766:3;31721:73;:::o;31800:189::-;31877:32;;:::i;:::-;31918:65;31976:6;31968;31962:4;31918:65;:::i;:::-;31853:136;31800:189;;:::o;31995:186::-;32055:120;32072:3;32065:5;32062:14;32055:120;;;32126:39;32163:1;32156:5;32126:39;:::i;:::-;32099:1;32092:5;32088:13;32079:22;;32055:120;;;31995:186;;:::o;32187:543::-;32288:2;32283:3;32280:11;32277:446;;;32322:38;32354:5;32322:38;:::i;:::-;32406:29;32424:10;32406:29;:::i;:::-;32396:8;32392:44;32589:2;32577:10;32574:18;32571:49;;;32610:8;32595:23;;32571:49;32633:80;32689:22;32707:3;32689:22;:::i;:::-;32679:8;32675:37;32662:11;32633:80;:::i;:::-;32292:431;;32277:446;32187:543;;;:::o;32736:117::-;32790:8;32840:5;32834:4;32830:16;32809:37;;32736:117;;;;:::o;32859:169::-;32903:6;32936:51;32984:1;32980:6;32972:5;32969:1;32965:13;32936:51;:::i;:::-;32932:56;33017:4;33011;33007:15;32997:25;;32910:118;32859:169;;;;:::o;33033:295::-;33109:4;33255:29;33280:3;33274:4;33255:29;:::i;:::-;33247:37;;33317:3;33314:1;33310:11;33304:4;33301:21;33293:29;;33033:295;;;;:::o;33333:1403::-;33457:44;33497:3;33492;33457:44;:::i;:::-;33566:18;33558:6;33555:30;33552:56;;;33588:18;;:::i;:::-;33552:56;33632:38;33664:4;33658:11;33632:38;:::i;:::-;33717:67;33777:6;33769;33763:4;33717:67;:::i;:::-;33811:1;33840:2;33832:6;33829:14;33857:1;33852:632;;;;34528:1;34545:6;34542:84;;;34601:9;34596:3;34592:19;34579:33;34570:42;;34542:84;34652:67;34712:6;34705:5;34652:67;:::i;:::-;34646:4;34639:81;34501:229;33822:908;;33852:632;33904:4;33900:9;33892:6;33888:22;33938:37;33970:4;33938:37;:::i;:::-;33997:1;34011:215;34025:7;34022:1;34019:14;34011:215;;;34111:9;34106:3;34102:19;34089:33;34081:6;34074:49;34162:1;34154:6;34150:14;34140:24;;34209:2;34198:9;34194:18;34181:31;;34048:4;34045:1;34041:12;34036:17;;34011:215;;;34254:6;34245:7;34242:19;34239:186;;;34319:9;34314:3;34310:19;34297:33;34362:48;34404:4;34396:6;34392:17;34381:9;34362:48;:::i;:::-;34354:6;34347:64;34262:163;34239:186;34471:1;34467;34459:6;34455:14;34451:22;34445:4;34438:36;33859:625;;;33822:908;;33432:1304;;;33333:1403;;;:::o;34742:171::-;34882:23;34878:1;34870:6;34866:14;34859:47;34742:171;:::o;34919:366::-;35061:3;35082:67;35146:2;35141:3;35082:67;:::i;:::-;35075:74;;35158:93;35247:3;35158:93;:::i;:::-;35276:2;35271:3;35267:12;35260:19;;34919:366;;;:::o;35291:419::-;35457:4;35495:2;35484:9;35480:18;35472:26;;35544:9;35538:4;35534:20;35530:1;35519:9;35515:17;35508:47;35572:131;35698:4;35572:131;:::i;:::-;35564:139;;35291:419;;;:::o;35716:180::-;35764:77;35761:1;35754:88;35861:4;35858:1;35851:15;35885:4;35882:1;35875:15;35902:191;35942:3;35961:20;35979:1;35961:20;:::i;:::-;35956:25;;35995:20;36013:1;35995:20;:::i;:::-;35990:25;;36038:1;36035;36031:9;36024:16;;36059:3;36056:1;36053:10;36050:36;;;36066:18;;:::i;:::-;36050:36;35902:191;;;;:::o;36099:181::-;36239:33;36235:1;36227:6;36223:14;36216:57;36099:181;:::o;36286:366::-;36428:3;36449:67;36513:2;36508:3;36449:67;:::i;:::-;36442:74;;36525:93;36614:3;36525:93;:::i;:::-;36643:2;36638:3;36634:12;36627:19;;36286:366;;;:::o;36658:419::-;36824:4;36862:2;36851:9;36847:18;36839:26;;36911:9;36905:4;36901:20;36897:1;36886:9;36882:17;36875:47;36939:131;37065:4;36939:131;:::i;:::-;36931:139;;36658:419;;;:::o;37083:223::-;37223:34;37219:1;37211:6;37207:14;37200:58;37292:6;37287:2;37279:6;37275:15;37268:31;37083:223;:::o;37312:366::-;37454:3;37475:67;37539:2;37534:3;37475:67;:::i;:::-;37468:74;;37551:93;37640:3;37551:93;:::i;:::-;37669:2;37664:3;37660:12;37653:19;;37312:366;;;:::o;37684:419::-;37850:4;37888:2;37877:9;37873:18;37865:26;;37937:9;37931:4;37927:20;37923:1;37912:9;37908:17;37901:47;37965:131;38091:4;37965:131;:::i;:::-;37957:139;;37684:419;;;:::o;38109:410::-;38149:7;38172:20;38190:1;38172:20;:::i;:::-;38167:25;;38206:20;38224:1;38206:20;:::i;:::-;38201:25;;38261:1;38258;38254:9;38283:30;38301:11;38283:30;:::i;:::-;38272:41;;38462:1;38453:7;38449:15;38446:1;38443:22;38423:1;38416:9;38396:83;38373:139;;38492:18;;:::i;:::-;38373:139;38157:362;38109:410;;;;:::o;38525:175::-;38665:27;38661:1;38653:6;38649:14;38642:51;38525:175;:::o;38706:402::-;38866:3;38887:85;38969:2;38964:3;38887:85;:::i;:::-;38880:92;;38981:93;39070:3;38981:93;:::i;:::-;39099:2;39094:3;39090:12;39083:19;;38706:402;;;:::o;39114:390::-;39220:3;39248:39;39281:5;39248:39;:::i;:::-;39303:89;39385:6;39380:3;39303:89;:::i;:::-;39296:96;;39401:65;39459:6;39454:3;39447:4;39440:5;39436:16;39401:65;:::i;:::-;39491:6;39486:3;39482:16;39475:23;;39224:280;39114:390;;;;:::o;39510:170::-;39650:22;39646:1;39638:6;39634:14;39627:46;39510:170;:::o;39686:402::-;39846:3;39867:85;39949:2;39944:3;39867:85;:::i;:::-;39860:92;;39961:93;40050:3;39961:93;:::i;:::-;40079:2;40074:3;40070:12;40063:19;;39686:402;;;:::o;40094:807::-;40428:3;40450:148;40594:3;40450:148;:::i;:::-;40443:155;;40615:95;40706:3;40697:6;40615:95;:::i;:::-;40608:102;;40727:148;40871:3;40727:148;:::i;:::-;40720:155;;40892:3;40885:10;;40094:807;;;;:::o;40907:180::-;40955:77;40952:1;40945:88;41052:4;41049:1;41042:15;41076:4;41073:1;41066:15;41093:181;41233:33;41229:1;41221:6;41217:14;41210:57;41093:181;:::o;41280:366::-;41422:3;41443:67;41507:2;41502:3;41443:67;:::i;:::-;41436:74;;41519:93;41608:3;41519:93;:::i;:::-;41637:2;41632:3;41628:12;41621:19;;41280:366;;;:::o;41652:419::-;41818:4;41856:2;41845:9;41841:18;41833:26;;41905:9;41899:4;41895:20;41891:1;41880:9;41876:17;41869:47;41933:131;42059:4;41933:131;:::i;:::-;41925:139;;41652:419;;;:::o;42077:178::-;42217:30;42213:1;42205:6;42201:14;42194:54;42077:178;:::o;42261:366::-;42403:3;42424:67;42488:2;42483:3;42424:67;:::i;:::-;42417:74;;42500:93;42589:3;42500:93;:::i;:::-;42618:2;42613:3;42609:12;42602:19;;42261:366;;;:::o;42633:419::-;42799:4;42837:2;42826:9;42822:18;42814:26;;42886:9;42880:4;42876:20;42872:1;42861:9;42857:17;42850:47;42914:131;43040:4;42914:131;:::i;:::-;42906:139;;42633:419;;;:::o;43058:177::-;43198:29;43194:1;43186:6;43182:14;43175:53;43058:177;:::o;43241:366::-;43383:3;43404:67;43468:2;43463:3;43404:67;:::i;:::-;43397:74;;43480:93;43569:3;43480:93;:::i;:::-;43598:2;43593:3;43589:12;43582:19;;43241:366;;;:::o;43613:419::-;43779:4;43817:2;43806:9;43802:18;43794:26;;43866:9;43860:4;43856:20;43852:1;43841:9;43837:17;43830:47;43894:131;44020:4;43894:131;:::i;:::-;43886:139;;43613:419;;;:::o;44038:194::-;44078:4;44098:20;44116:1;44098:20;:::i;:::-;44093:25;;44132:20;44150:1;44132:20;:::i;:::-;44127:25;;44176:1;44173;44169:9;44161:17;;44200:1;44194:4;44191:11;44188:37;;;44205:18;;:::i;:::-;44188:37;44038:194;;;;:::o;44238:435::-;44418:3;44440:95;44531:3;44522:6;44440:95;:::i;:::-;44433:102;;44552:95;44643:3;44634:6;44552:95;:::i;:::-;44545:102;;44664:3;44657:10;;44238:435;;;;;:::o;44679:225::-;44819:34;44815:1;44807:6;44803:14;44796:58;44888:8;44883:2;44875:6;44871:15;44864:33;44679:225;:::o;44910:366::-;45052:3;45073:67;45137:2;45132:3;45073:67;:::i;:::-;45066:74;;45149:93;45238:3;45149:93;:::i;:::-;45267:2;45262:3;45258:12;45251:19;;44910:366;;;:::o;45282:419::-;45448:4;45486:2;45475:9;45471:18;45463:26;;45535:9;45529:4;45525:20;45521:1;45510:9;45506:17;45499:47;45563:131;45689:4;45563:131;:::i;:::-;45555:139;;45282:419;;;:::o;45707:182::-;45847:34;45843:1;45835:6;45831:14;45824:58;45707:182;:::o;45895:366::-;46037:3;46058:67;46122:2;46117:3;46058:67;:::i;:::-;46051:74;;46134:93;46223:3;46134:93;:::i;:::-;46252:2;46247:3;46243:12;46236:19;;45895:366;;;:::o;46267:419::-;46433:4;46471:2;46460:9;46456:18;46448:26;;46520:9;46514:4;46510:20;46506:1;46495:9;46491:17;46484:47;46548:131;46674:4;46548:131;:::i;:::-;46540:139;;46267:419;;;:::o;46692:233::-;46731:3;46754:24;46772:5;46754:24;:::i;:::-;46745:33;;46800:66;46793:5;46790:77;46787:103;;46870:18;;:::i;:::-;46787:103;46917:1;46910:5;46906:13;46899:20;;46692:233;;;:::o;46931:180::-;46979:77;46976:1;46969:88;47076:4;47073:1;47066:15;47100:4;47097:1;47090:15;47117:185;47157:1;47174:20;47192:1;47174:20;:::i;:::-;47169:25;;47208:20;47226:1;47208:20;:::i;:::-;47203:25;;47247:1;47237:35;;47252:18;;:::i;:::-;47237:35;47294:1;47291;47287:9;47282:14;;47117:185;;;;:::o;47308:176::-;47340:1;47357:20;47375:1;47357:20;:::i;:::-;47352:25;;47391:20;47409:1;47391:20;:::i;:::-;47386:25;;47430:1;47420:35;;47435:18;;:::i;:::-;47420:35;47476:1;47473;47469:9;47464:14;;47308:176;;;;:::o;47490:98::-;47541:6;47575:5;47569:12;47559:22;;47490:98;;;:::o;47594:168::-;47677:11;47711:6;47706:3;47699:19;47751:4;47746:3;47742:14;47727:29;;47594:168;;;;:::o;47768:373::-;47854:3;47882:38;47914:5;47882:38;:::i;:::-;47936:70;47999:6;47994:3;47936:70;:::i;:::-;47929:77;;48015:65;48073:6;48068:3;48061:4;48054:5;48050:16;48015:65;:::i;:::-;48105:29;48127:6;48105:29;:::i;:::-;48100:3;48096:39;48089:46;;47858:283;47768:373;;;;:::o;48147:640::-;48342:4;48380:3;48369:9;48365:19;48357:27;;48394:71;48462:1;48451:9;48447:17;48438:6;48394:71;:::i;:::-;48475:72;48543:2;48532:9;48528:18;48519:6;48475:72;:::i;:::-;48557;48625:2;48614:9;48610:18;48601:6;48557:72;:::i;:::-;48676:9;48670:4;48666:20;48661:2;48650:9;48646:18;48639:48;48704:76;48775:4;48766:6;48704:76;:::i;:::-;48696:84;;48147:640;;;;;;;:::o;48793:141::-;48849:5;48880:6;48874:13;48865:22;;48896:32;48922:5;48896:32;:::i;:::-;48793:141;;;;:::o;48940:349::-;49009:6;49058:2;49046:9;49037:7;49033:23;49029:32;49026:119;;;49064:79;;:::i;:::-;49026:119;49184:1;49209:63;49264:7;49255:6;49244:9;49240:22;49209:63;:::i;:::-;49199:73;;49155:127;48940:349;;;;:::o;49295:180::-;49343:77;49340:1;49333:88;49440:4;49437:1;49430:15;49464:4;49461:1;49454:15;49481:174;49621:26;49617:1;49609:6;49605:14;49598:50;49481:174;:::o;49661:366::-;49803:3;49824:67;49888:2;49883:3;49824:67;:::i;:::-;49817:74;;49900:93;49989:3;49900:93;:::i;:::-;50018:2;50013:3;50009:12;50002:19;;49661:366;;;:::o;50033:419::-;50199:4;50237:2;50226:9;50222:18;50214:26;;50286:9;50280:4;50276:20;50272:1;50261:9;50257:17;50250:47;50314:131;50440:4;50314:131;:::i;:::-;50306:139;;50033:419;;;:::o;50458:181::-;50598:33;50594:1;50586:6;50582:14;50575:57;50458:181;:::o;50645:366::-;50787:3;50808:67;50872:2;50867:3;50808:67;:::i;:::-;50801:74;;50884:93;50973:3;50884:93;:::i;:::-;51002:2;50997:3;50993:12;50986:19;;50645:366;;;:::o;51017:419::-;51183:4;51221:2;51210:9;51206:18;51198:26;;51270:9;51264:4;51260:20;51256:1;51245:9;51241:17;51234:47;51298:131;51424:4;51298:131;:::i;:::-;51290:139;;51017:419;;;:::o;51442:221::-;51582:34;51578:1;51570:6;51566:14;51559:58;51651:4;51646:2;51638:6;51634:15;51627:29;51442:221;:::o;51669:366::-;51811:3;51832:67;51896:2;51891:3;51832:67;:::i;:::-;51825:74;;51908:93;51997:3;51908:93;:::i;:::-;52026:2;52021:3;52017:12;52010:19;;51669:366;;;:::o;52041:419::-;52207:4;52245:2;52234:9;52230:18;52222:26;;52294:9;52288:4;52284:20;52280:1;52269:9;52265:17;52258:47;52322:131;52448:4;52322:131;:::i;:::-;52314:139;;52041:419;;;:::o;52466:221::-;52606:34;52602:1;52594:6;52590:14;52583:58;52675:4;52670:2;52662:6;52658:15;52651:29;52466:221;:::o;52693:366::-;52835:3;52856:67;52920:2;52915:3;52856:67;:::i;:::-;52849:74;;52932:93;53021:3;52932:93;:::i;:::-;53050:2;53045:3;53041:12;53034:19;;52693:366;;;:::o;53065:419::-;53231:4;53269:2;53258:9;53254:18;53246:26;;53318:9;53312:4;53308:20;53304:1;53293:9;53289:17;53282:47;53346:131;53472:4;53346:131;:::i;:::-;53338:139;;53065:419;;;:::o;53490:86::-;53525:7;53565:4;53558:5;53554:16;53543:27;;53490:86;;;:::o;53582:112::-;53665:22;53681:5;53665:22;:::i;:::-;53660:3;53653:35;53582:112;;:::o;53700:545::-;53873:4;53911:3;53900:9;53896:19;53888:27;;53925:71;53993:1;53982:9;53978:17;53969:6;53925:71;:::i;:::-;54006:68;54070:2;54059:9;54055:18;54046:6;54006:68;:::i;:::-;54084:72;54152:2;54141:9;54137:18;54128:6;54084:72;:::i;:::-;54166;54234:2;54223:9;54219:18;54210:6;54166:72;:::i;:::-;53700:545;;;;;;;:::o
Swarm Source
ipfs://93307938c8f90ee5880a25af00d924b7d5099a50e4aac1f2250859e2e0988409
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.