Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
1205
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Chibimon
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import './ERC721A.sol'; import './Ownable.sol'; import './ECDSA.sol'; error IncorrectSignature(); error SoldOut(); error MaxMintTokensExceeded(); error AddressCantBeBurner(); error CantWithdrawFunds(); error StakingNotActive(); error SenderNotOwner(); error AlreadyStaked(); error TokenIsStaked(); error NotStaked(); error NeedMoreStakingTime(); contract Chibimon is ERC721A, Ownable { using ECDSA for bytes32; address private _signerAddress; address private _authorWallet; string public baseURI; uint256 public maxSupply; bool public stakingStatus; uint256 public revealTime; mapping(uint256 => uint256) public tokenStaked; mapping(uint256 => bool) public tokenRevealed; constructor( uint256 newMaxSupply, address newSignerAddress, string memory newBaseURI, bool newStakingStatus, uint256 newRevealTime ) ERC721A("Chibimon", "CHBMN") { maxSupply = newMaxSupply; baseURI = newBaseURI; _signerAddress = newSignerAddress; stakingStatus = newStakingStatus; revealTime = newRevealTime; } // public functions /** * @dev Important: You will need a valid signature to mint. The signature will only be generated on the official website. */ function mint(bytes calldata signature, uint256 quantity, uint256 maxMintable, bool stakeTokens) external payable { if( !_verifySig(msg.sender, msg.value, maxMintable, signature) ) revert IncorrectSignature(); if( totalSupply() + quantity > maxSupply ) revert SoldOut(); if( _numberMinted(msg.sender) + quantity > maxMintable ) revert MaxMintTokensExceeded(); uint256 tokenIdStart = _nextTokenId(); _mint(msg.sender, quantity); if( stakeTokens ) { uint256 tokenIdEnd = _nextTokenId(); while( tokenIdStart < tokenIdEnd ) { tokenStaked[tokenIdStart] = block.timestamp; tokenIdStart++; } } } /** * @dev Check how many tokens the given address minted */ function numberMinted(address minter) external view returns(uint256) { return _numberMinted(minter); } /** * @dev Stake the given token */ function stake(uint256 tokenId) public { if( !stakingStatus ) revert StakingNotActive(); if( msg.sender != ownerOf(tokenId) && msg.sender != owner() ) revert SenderNotOwner(); if( tokenStaked[tokenId] != 0 ) revert AlreadyStaked(); tokenStaked[tokenId] = block.timestamp; } /** * @dev Unstake the given token */ function unstake(uint256 tokenId) public { if( msg.sender != ownerOf(tokenId) && msg.sender != owner() ) revert SenderNotOwner(); if( tokenStaked[tokenId] == 0 ) revert NotStaked(); tokenStaked[tokenId] = 0; } /** * @dev Batch stake/unstake the given tokens */ function batchStakeStatus(uint256[] memory tokenIds, bool status) external { for (uint256 i; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; if (status) { stake(tokenId); } else { unstake(tokenId); } } } /** * @dev Reveal given token if staked long enough (s. reveal time) */ function reveal(uint256 tokenId) public { if( msg.sender != ownerOf(tokenId) && msg.sender != owner() ) revert SenderNotOwner(); if( tokenStaked[tokenId] == 0 ) revert NotStaked(); if( block.timestamp - tokenStaked[tokenId] < revealTime ) revert NeedMoreStakingTime(); tokenRevealed[tokenId] = true; tokenStaked[tokenId] = 0; } /** * @dev Returns the tokenIds of the given address */ function tokensOf(address owner) external view returns (uint256[] memory) { unchecked { uint256[] memory tokenIds = new uint256[](balanceOf(owner)); uint256 tokenIdsIdx; for (uint256 i; i < totalSupply(); i++) { TokenOwnership memory ownership = _ownershipOf(i); if (ownership.burned || ownership.addr == address(0)) { continue; } if (ownership.addr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } // internal functions function _verifySig(address sender, uint256 valueSent, uint256 maxMintable, bytes memory signature) internal view returns(bool) { bytes32 messageHash = keccak256(abi.encodePacked(sender, valueSent, maxMintable)); return _signerAddress == messageHash.toEthSignedMessageHash().recover(signature); } // owner functions /** * @dev Batch aidrop tokens to given addresses (onlyOwner) */ function giveaway(address[] calldata receivers, uint256[] calldata quantities ) external onlyOwner { uint256 totalQuantity = 0; for( uint256 i = 0; i < quantities.length; i++ ) { totalQuantity += quantities[i]; } if( totalSupply() + totalQuantity > maxSupply ) revert SoldOut(); for( uint256 i = 0; i < receivers.length; i++ ) { _mint(receivers[i], quantities[i]); } } /** * @dev Set the signer address to verify signatures (onlyOwner) */ function setSignerAddress(address newSignerAddress) external onlyOwner { if( newSignerAddress == address(0) ) revert AddressCantBeBurner(); _signerAddress = newSignerAddress; } /** * @dev Set base uri for token metadata (onlyOwner) */ function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } /** * @dev Enable/Disable staking (onlyOwner) */ function setStakingStatus(bool status) external onlyOwner { stakingStatus = status; } /** * @dev Set reveal time in seconds (onlyOwner) */ function setRevealTime(uint256 time) external onlyOwner { revealTime = time; } /** * @dev Withdraw all funds (onlyOwner) */ function withdrawAll() external onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); if( !success ) revert CantWithdrawFunds(); } // overrides function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function transferFrom( address from, address to, uint256 tokenId ) public override(ERC721A) { if( tokenStaked[tokenId] != 0 ) revert TokenIsStaked(); super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override(ERC721A) { if( tokenStaked[tokenId] != 0 ) revert TokenIsStaked(); super.safeTransferFrom(from, to, tokenId, _data); } }
// 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/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 // Deprecated in v4.8 } 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"); } } /** * @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 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 // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./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 // 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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"},{"internalType":"address","name":"newSignerAddress","type":"address"},{"internalType":"string","name":"newBaseURI","type":"string"},{"internalType":"bool","name":"newStakingStatus","type":"bool"},{"internalType":"uint256","name":"newRevealTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressCantBeBurner","type":"error"},{"inputs":[],"name":"AlreadyStaked","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"CantWithdrawFunds","type":"error"},{"inputs":[],"name":"IncorrectSignature","type":"error"},{"inputs":[],"name":"MaxMintTokensExceeded","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NeedMoreStakingTime","type":"error"},{"inputs":[],"name":"NotStaked","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"SenderNotOwner","type":"error"},{"inputs":[],"name":"SoldOut","type":"error"},{"inputs":[],"name":"StakingNotActive","type":"error"},{"inputs":[],"name":"TokenIsStaked","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"batchStakeStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"maxMintable","type":"uint256"},{"internalType":"bool","name":"stakeTokens","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setRevealTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSignerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setStakingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOf","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":"tokenId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620045bb380380620045bb8339818101604052810190620000379190620003e0565b6040518060400160405280600881526020017f43686962696d6f6e0000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4348424d4e0000000000000000000000000000000000000000000000000000008152508160029080519060200190620000bb9291906200026d565b508060039080519060200190620000d49291906200026d565b50620000e56200019a60201b60201c565b60008190555050506200010d620001016200019f60201b60201c565b620001a760201b60201c565b84600c8190555082600b90805190602001906200012c9291906200026d565b5083600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d60006101000a81548160ff02191690831515021790555080600e819055505050505050620006a3565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027b9062000566565b90600052602060002090601f0160209004810192826200029f5760008555620002eb565b82601f10620002ba57805160ff1916838001178555620002eb565b82800160010185558215620002eb579182015b82811115620002ea578251825591602001919060010190620002cd565b5b509050620002fa9190620002fe565b5090565b5b8082111562000319576000816000905550600101620002ff565b5090565b6000620003346200032e84620004b0565b62000487565b90508281526020810184848401111562000353576200035262000635565b5b6200036084828562000530565b509392505050565b600081519050620003798162000655565b92915050565b60008151905062000390816200066f565b92915050565b600082601f830112620003ae57620003ad62000630565b5b8151620003c08482602086016200031d565b91505092915050565b600081519050620003da8162000689565b92915050565b600080600080600060a08688031215620003ff57620003fe6200063f565b5b60006200040f88828901620003c9565b9550506020620004228882890162000368565b945050604086015167ffffffffffffffff8111156200044657620004456200063a565b5b620004548882890162000396565b935050606062000467888289016200037f565b92505060806200047a88828901620003c9565b9150509295509295909350565b600062000493620004a6565b9050620004a182826200059c565b919050565b6000604051905090565b600067ffffffffffffffff821115620004ce57620004cd62000601565b5b620004d98262000644565b9050602081019050919050565b6000620004f38262000506565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200055057808201518184015260208101905062000533565b8381111562000560576000848401525b50505050565b600060028204905060018216806200057f57607f821691505b60208210811415620005965762000595620005d2565b5b50919050565b620005a78262000644565b810181811067ffffffffffffffff82111715620005c957620005c862000601565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200066081620004e6565b81146200066c57600080fd5b50565b6200067a81620004fa565b81146200068657600080fd5b50565b620006948162000526565b8114620006a057600080fd5b50565b613f0880620006b36000396000f3fe60806040526004361061020f5760003560e01c80638da5cb5b11610118578063c1e28507116100a0578063dbecbf591161006f578063dbecbf5914610797578063dc33e681146107b3578063e985e9c5146107f0578063f2fde38b1461082d578063ffc8befd146108565761020f565b8063c1e28507146106dd578063c2ca0ac514610706578063c87b56dd1461072f578063d5abeb011461076c5761020f565b8063a694fc3a116100e7578063a694fc3a1461060e578063af255acd14610637578063b88d4fde14610660578063b8bec6a014610689578063ba829d71146106b25761020f565b80638da5cb5b1461055257806395d89b411461057d5780639d897351146105a8578063a22cb465146105e55761020f565b8063455ab53c1161019b5780636352211e1161016a5780636352211e1461047f5780636c0360eb146104bc57806370a08231146104e7578063715018a614610524578063853828b61461053b5761020f565b8063455ab53c146103b157806355f804b3146103dc5780635a3f26721461040557806363315760146104425761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806318160ddd1461030b57806323b872dd146103365780632e17de781461035f57806342842e0e146103885761020f565b806301ffc9a714610214578063046dc1661461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061322e565b61087f565b6040516102489190613758565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190612f61565b610911565b005b34801561028657600080fd5b5061028f6109c4565b60405161029c91906137b8565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613359565b610a56565b6040516102d991906136cf565b60405180910390f35b3480156102ee57600080fd5b50610309600480360381019061030491906130e4565b610ad5565b005b34801561031757600080fd5b50610320610c19565b60405161032d919061387a565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190612fce565b610c30565b005b34801561036b57600080fd5b5061038660048036038101906103819190613359565b610c8d565b005b34801561039457600080fd5b506103af60048036038101906103aa9190612fce565b610da5565b005b3480156103bd57600080fd5b506103c6610dc5565b6040516103d39190613758565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613310565b610dd8565b005b34801561041157600080fd5b5061042c60048036038101906104279190612f61565b610dfa565b6040516104399190613736565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190613359565b610f35565b604051610476919061387a565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190613359565b610f4d565b6040516104b391906136cf565b60405180910390f35b3480156104c857600080fd5b506104d1610f5f565b6040516104de91906137b8565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190612f61565b610fed565b60405161051b919061387a565b60405180910390f35b34801561053057600080fd5b506105396110a6565b005b34801561054757600080fd5b506105506110ba565b005b34801561055e57600080fd5b50610567611168565b60405161057491906136cf565b60405180910390f35b34801561058957600080fd5b50610592611192565b60405161059f91906137b8565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613359565b611224565b6040516105dc9190613758565b60405180910390f35b3480156105f157600080fd5b5061060c600480360381019061060791906130a4565b611244565b005b34801561061a57600080fd5b5061063560048036038101906106309190613359565b61134f565b005b34801561064357600080fd5b5061065e60048036038101906106599190613124565b6114ab565b005b34801561066c57600080fd5b5061068760048036038101906106829190613021565b6115be565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613201565b61161d565b005b3480156106be57600080fd5b506106c7611642565b6040516106d4919061387a565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613359565b611648565b005b34801561071257600080fd5b5061072d60048036038101906107289190613359565b61165a565b005b34801561073b57600080fd5b5061075660048036038101906107519190613359565b6117f8565b60405161076391906137b8565b60405180910390f35b34801561077857600080fd5b50610781611897565b60405161078e919061387a565b60405180910390f35b6107b160048036038101906107ac9190613288565b61189d565b005b3480156107bf57600080fd5b506107da60048036038101906107d59190612f61565b611a24565b6040516107e7919061387a565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190612f8e565b611a36565b6040516108249190613758565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190612f61565b611aca565b005b34801561086257600080fd5b5061087d600480360381019061087891906131a5565b611b4e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108da57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610919611bb0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610980576040517f746ef87300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600280546109d390613b26565b80601f01602080910402602001604051908101604052809291908181526020018280546109ff90613b26565b8015610a4c5780601f10610a2157610100808354040283529160200191610a4c565b820191906000526020600020905b815481529060010190602001808311610a2f57829003601f168201915b5050505050905090565b6000610a6182611c2e565b610a97576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ae082610f4d565b90508073ffffffffffffffffffffffffffffffffffffffff16610b01611c8d565b73ffffffffffffffffffffffffffffffffffffffff1614610b6457610b2d81610b28611c8d565b611a36565b610b63576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c23611c95565b6001546000540303905090565b6000600f60008381526020019081526020016000205414610c7d576040517f3899ae3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c88838383611c9a565b505050565b610c9681610f4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610d045750610cd4611168565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d3b576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f6000838152602001908152602001600020541415610d89576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f60008381526020019081526020016000208190555050565b610dc0838383604051806020016040528060008152506115be565b505050565b600d60009054906101000a900460ff1681565b610de0611bb0565b80600b9080519060200190610df6929190612b86565b5050565b60606000610e0783610fed565b67ffffffffffffffff811115610e2057610e1f613cc6565b5b604051908082528060200260200182016040528015610e4e5781602001602082028036833780820191505090505b5090506000805b610e5d610c19565b811015610f2a576000610e6f82611fbf565b9050806040015180610eb15750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16145b15610ebc5750610f1d565b8573ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610f1b5781848480600101955081518110610f0e57610f0d613c97565b5b6020026020010181815250505b505b8080600101915050610e55565b508192505050919050565b600f6020528060005260406000206000915090505481565b6000610f5882611fdf565b9050919050565b600b8054610f6c90613b26565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9890613b26565b8015610fe55780601f10610fba57610100808354040283529160200191610fe5565b820191906000526020600020905b815481529060010190602001808311610fc857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611055576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110ae611bb0565b6110b860006120ad565b565b6110c2611bb0565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110e8906136ba565b60006040518083038185875af1925050503d8060008114611125576040519150601f19603f3d011682016040523d82523d6000602084013e61112a565b606091505b5050905080611165576040517fc9ae8eaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111a190613b26565b80601f01602080910402602001604051908101604052809291908181526020018280546111cd90613b26565b801561121a5780601f106111ef5761010080835404028352916020019161121a565b820191906000526020600020905b8154815290600101906020018083116111fd57829003601f168201915b5050505050905090565b60106020528060005260406000206000915054906101000a900460ff1681565b8060076000611251611c8d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112fe611c8d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113439190613758565b60405180910390a35050565b600d60009054906101000a900460ff16611395576040517f6929bcec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139e81610f4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561140c57506113dc611168565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611443576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f60008381526020019081526020016000205414611490576040517f0ae3514d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42600f60008381526020019081526020016000208190555050565b6114b3611bb0565b6000805b838390508110156114fc578383828181106114d5576114d4613c97565b5b90506020020135826114e791906139cf565b915080806114f490613b89565b9150506114b7565b50600c5481611509610c19565b61151391906139cf565b111561154b576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b858590508110156115b6576115a386868381811061156f5761156e613c97565b5b90506020020160208101906115849190612f61565b85858481811061159757611596613c97565b5b90506020020135612173565b80806115ae90613b89565b91505061154e565b505050505050565b6000600f6000848152602001908152602001600020541461160b576040517f3899ae3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61161784848484612330565b50505050565b611625611bb0565b80600d60006101000a81548160ff02191690831515021790555050565b600e5481565b611650611bb0565b80600e8190555050565b61166381610f4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156116d157506116a1611168565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611708576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f6000838152602001908152602001600020541415611756576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54600f600083815260200190815260200160002054426117789190613a25565b10156117b0576040517ff414d34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016010600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600f60008381526020019081526020016000208190555050565b606061180382611c2e565b611839576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118436123a3565b9050600081511415611864576040518060200160405280600081525061188f565b8061186e84612435565b60405160200161187f929190613670565b6040516020818303038152906040525b915050919050565b600c5481565b6118ed33348488888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612485565b611923576040517fc1606c2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c548361192f610c19565b61193991906139cf565b1115611971576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818361197c3361252b565b61198691906139cf565b11156119be576040517fd58a411000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119c8612582565b90506119d43385612173565b8115611a1c5760006119e4612582565b90505b80821015611a1a5742600f6000848152602001908152602001600020819055508180611a1290613b89565b9250506119e7565b505b505050505050565b6000611a2f8261252b565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ad2611bb0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b399061381a565b60405180910390fd5b611b4b816120ad565b50565b60005b8251811015611bab576000838281518110611b6f57611b6e613c97565b5b602002602001015190508215611b8d57611b888161134f565b611b97565b611b9681610c8d565b5b508080611ba390613b89565b915050611b51565b505050565b611bb861258b565b73ffffffffffffffffffffffffffffffffffffffff16611bd6611168565b73ffffffffffffffffffffffffffffffffffffffff1614611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c239061385a565b60405180910390fd5b565b600081611c39611c95565b11158015611c48575060005482105b8015611c86575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611ca582611fdf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d1884612593565b91509150611d2e8187611d29611c8d565b6125ba565b611d7a57611d4386611d3e611c8d565b611a36565b611d79576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611de1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dee86868660016125fe565b8015611df957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611ec785611ea3888887612604565b7c02000000000000000000000000000000000000000000000000000000001761262c565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611f4f576000600185019050600060046000838152602001908152602001600020541415611f4d576000548114611f4c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fb78686866001612657565b505050505050565b611fc7612c0c565b611fd8611fd383611fdf565b61265d565b9050919050565b60008082905080611fee611c95565b11612076576000548110156120755760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612073575b600081141561206957600460008360019003935083815260200190815260200160002054905061203e565b80925050506120a8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054905060008214156121b4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121c160008483856125fe565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612238836122296000866000612604565b61223285612713565b1761262c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146122d957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061229e565b506000821415612315576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061232b6000848385612657565b505050565b61233b848484610c30565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461239d5761236684848484612723565b61239c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600b80546123b290613b26565b80601f01602080910402602001604051908101604052809291908181526020018280546123de90613b26565b801561242b5780601f106124005761010080835404028352916020019161242b565b820191906000526020600020905b81548152906001019060200180831161240e57829003601f168201915b5050505050905090565b606060806040510190508060405280825b60011561247157600183039250600a81066030018353600a810490508061246c57612471565b612446565b508181036020830392508083525050919050565b60008085858560405160200161249d93929190613633565b6040516020818303038152906040528051906020012090506124d0836124c283612883565b6128b390919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008054905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861261b8686846128da565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612665612c0c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612749611c8d565b8786866040518563ffffffff1660e01b815260040161276b94939291906136ea565b602060405180830381600087803b15801561278557600080fd5b505af19250505080156127b657506040513d601f19601f820116820180604052508101906127b3919061325b565b60015b612830573d80600081146127e6576040519150601f19603f3d011682016040523d82523d6000602084013e6127eb565b606091505b50600081511415612828576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000816040516020016128969190613694565b604051602081830303815290604052805190602001209050919050565b60008060006128c285856128e3565b915091506128cf81612935565b819250505092915050565b60009392505050565b6000806041835114156129255760008060006020860151925060408601519150606086015160001a905061291987828585612aa3565b9450945050505061292e565b60006002915091505b9250929050565b6000600481111561294957612948613c39565b5b81600481111561295c5761295b613c39565b5b141561296757612aa0565b6001600481111561297b5761297a613c39565b5b81600481111561298e5761298d613c39565b5b14156129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c6906137da565b60405180910390fd5b600260048111156129e3576129e2613c39565b5b8160048111156129f6576129f5613c39565b5b1415612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e906137fa565b60405180910390fd5b60036004811115612a4b57612a4a613c39565b5b816004811115612a5e57612a5d613c39565b5b1415612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a969061383a565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612ade576000600391509150612b7d565b600060018787878760405160008152602001604052604051612b039493929190613773565b6020604051602081039080840390855afa158015612b25573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b7457600060019250925050612b7d565b80600092509250505b94509492505050565b828054612b9290613b26565b90600052602060002090601f016020900481019282612bb45760008555612bfb565b82601f10612bcd57805160ff1916838001178555612bfb565b82800160010185558215612bfb579182015b82811115612bfa578251825591602001919060010190612bdf565b5b509050612c089190612c5b565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612c74576000816000905550600101612c5c565b5090565b6000612c8b612c86846138ba565b613895565b90508083825260208201905082856020860282011115612cae57612cad613cff565b5b60005b85811015612cde5781612cc48882612f4c565b845260208401935060208301925050600181019050612cb1565b5050509392505050565b6000612cfb612cf6846138e6565b613895565b905082815260208101848484011115612d1757612d16613d04565b5b612d22848285613ae4565b509392505050565b6000612d3d612d3884613917565b613895565b905082815260208101848484011115612d5957612d58613d04565b5b612d64848285613ae4565b509392505050565b600081359050612d7b81613e76565b92915050565b60008083601f840112612d9757612d96613cfa565b5b8235905067ffffffffffffffff811115612db457612db3613cf5565b5b602083019150836020820283011115612dd057612dcf613cff565b5b9250929050565b60008083601f840112612ded57612dec613cfa565b5b8235905067ffffffffffffffff811115612e0a57612e09613cf5565b5b602083019150836020820283011115612e2657612e25613cff565b5b9250929050565b600082601f830112612e4257612e41613cfa565b5b8135612e52848260208601612c78565b91505092915050565b600081359050612e6a81613e8d565b92915050565b600081359050612e7f81613ea4565b92915050565b600081519050612e9481613ea4565b92915050565b60008083601f840112612eb057612eaf613cfa565b5b8235905067ffffffffffffffff811115612ecd57612ecc613cf5565b5b602083019150836001820283011115612ee957612ee8613cff565b5b9250929050565b600082601f830112612f0557612f04613cfa565b5b8135612f15848260208601612ce8565b91505092915050565b600082601f830112612f3357612f32613cfa565b5b8135612f43848260208601612d2a565b91505092915050565b600081359050612f5b81613ebb565b92915050565b600060208284031215612f7757612f76613d0e565b5b6000612f8584828501612d6c565b91505092915050565b60008060408385031215612fa557612fa4613d0e565b5b6000612fb385828601612d6c565b9250506020612fc485828601612d6c565b9150509250929050565b600080600060608486031215612fe757612fe6613d0e565b5b6000612ff586828701612d6c565b935050602061300686828701612d6c565b925050604061301786828701612f4c565b9150509250925092565b6000806000806080858703121561303b5761303a613d0e565b5b600061304987828801612d6c565b945050602061305a87828801612d6c565b935050604061306b87828801612f4c565b925050606085013567ffffffffffffffff81111561308c5761308b613d09565b5b61309887828801612ef0565b91505092959194509250565b600080604083850312156130bb576130ba613d0e565b5b60006130c985828601612d6c565b92505060206130da85828601612e5b565b9150509250929050565b600080604083850312156130fb576130fa613d0e565b5b600061310985828601612d6c565b925050602061311a85828601612f4c565b9150509250929050565b6000806000806040858703121561313e5761313d613d0e565b5b600085013567ffffffffffffffff81111561315c5761315b613d09565b5b61316887828801612d81565b9450945050602085013567ffffffffffffffff81111561318b5761318a613d09565b5b61319787828801612dd7565b925092505092959194509250565b600080604083850312156131bc576131bb613d0e565b5b600083013567ffffffffffffffff8111156131da576131d9613d09565b5b6131e685828601612e2d565b92505060206131f785828601612e5b565b9150509250929050565b60006020828403121561321757613216613d0e565b5b600061322584828501612e5b565b91505092915050565b60006020828403121561324457613243613d0e565b5b600061325284828501612e70565b91505092915050565b60006020828403121561327157613270613d0e565b5b600061327f84828501612e85565b91505092915050565b6000806000806000608086880312156132a4576132a3613d0e565b5b600086013567ffffffffffffffff8111156132c2576132c1613d09565b5b6132ce88828901612e9a565b955095505060206132e188828901612f4c565b93505060406132f288828901612f4c565b925050606061330388828901612e5b565b9150509295509295909350565b60006020828403121561332657613325613d0e565b5b600082013567ffffffffffffffff81111561334457613343613d09565b5b61335084828501612f1e565b91505092915050565b60006020828403121561336f5761336e613d0e565b5b600061337d84828501612f4c565b91505092915050565b600061339283836135ef565b60208301905092915050565b6133a781613a59565b82525050565b6133be6133b982613a59565b613bd2565b82525050565b60006133cf82613958565b6133d98185613986565b93506133e483613948565b8060005b838110156134155781516133fc8882613386565b975061340783613979565b9250506001810190506133e8565b5085935050505092915050565b61342b81613a6b565b82525050565b61343a81613a77565b82525050565b61345161344c82613a77565b613be4565b82525050565b600061346282613963565b61346c8185613997565b935061347c818560208601613af3565b61348581613d13565b840191505092915050565b600061349b8261396e565b6134a581856139b3565b93506134b5818560208601613af3565b6134be81613d13565b840191505092915050565b60006134d48261396e565b6134de81856139c4565b93506134ee818560208601613af3565b80840191505092915050565b60006135076018836139b3565b915061351282613d31565b602082019050919050565b600061352a601f836139b3565b915061353582613d5a565b602082019050919050565b600061354d601c836139c4565b915061355882613d83565b601c82019050919050565b60006135706026836139b3565b915061357b82613dac565b604082019050919050565b60006135936022836139b3565b915061359e82613dfb565b604082019050919050565b60006135b66020836139b3565b91506135c182613e4a565b602082019050919050565b60006135d96000836139a8565b91506135e482613e73565b600082019050919050565b6135f881613acd565b82525050565b61360781613acd565b82525050565b61361e61361982613acd565b613c00565b82525050565b61362d81613ad7565b82525050565b600061363f82866133ad565b60148201915061364f828561360d565b60208201915061365f828461360d565b602082019150819050949350505050565b600061367c82856134c9565b915061368882846134c9565b91508190509392505050565b600061369f82613540565b91506136ab8284613440565b60208201915081905092915050565b60006136c5826135cc565b9150819050919050565b60006020820190506136e4600083018461339e565b92915050565b60006080820190506136ff600083018761339e565b61370c602083018661339e565b61371960408301856135fe565b818103606083015261372b8184613457565b905095945050505050565b6000602082019050818103600083015261375081846133c4565b905092915050565b600060208201905061376d6000830184613422565b92915050565b60006080820190506137886000830187613431565b6137956020830186613624565b6137a26040830185613431565b6137af6060830184613431565b95945050505050565b600060208201905081810360008301526137d28184613490565b905092915050565b600060208201905081810360008301526137f3816134fa565b9050919050565b600060208201905081810360008301526138138161351d565b9050919050565b6000602082019050818103600083015261383381613563565b9050919050565b6000602082019050818103600083015261385381613586565b9050919050565b60006020820190508181036000830152613873816135a9565b9050919050565b600060208201905061388f60008301846135fe565b92915050565b600061389f6138b0565b90506138ab8282613b58565b919050565b6000604051905090565b600067ffffffffffffffff8211156138d5576138d4613cc6565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561390157613900613cc6565b5b61390a82613d13565b9050602081019050919050565b600067ffffffffffffffff82111561393257613931613cc6565b5b61393b82613d13565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139da82613acd565b91506139e583613acd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a1a57613a19613c0a565b5b828201905092915050565b6000613a3082613acd565b9150613a3b83613acd565b925082821015613a4e57613a4d613c0a565b5b828203905092915050565b6000613a6482613aad565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613b11578082015181840152602081019050613af6565b83811115613b20576000848401525b50505050565b60006002820490506001821680613b3e57607f821691505b60208210811415613b5257613b51613c68565b5b50919050565b613b6182613d13565b810181811067ffffffffffffffff82111715613b8057613b7f613cc6565b5b80604052505050565b6000613b9482613acd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bc757613bc6613c0a565b5b600182019050919050565b6000613bdd82613bee565b9050919050565b6000819050919050565b6000613bf982613d24565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b613e7f81613a59565b8114613e8a57600080fd5b50565b613e9681613a6b565b8114613ea157600080fd5b50565b613ead81613a81565b8114613eb857600080fd5b50565b613ec481613acd565b8114613ecf57600080fd5b5056fea26469706673582212206f0d7c4d1a1d8aa9e5d1c7ad2c8b7ac42655fbdc9b9697f7d2d21a4c8f5d452a64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000006130000000000000000000000006b2341bf6d8e7f914a1afee9fbdc7449f875f61f00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f6170692e63686962696d6f6e2e78797a2f6d657461646174612f000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80638da5cb5b11610118578063c1e28507116100a0578063dbecbf591161006f578063dbecbf5914610797578063dc33e681146107b3578063e985e9c5146107f0578063f2fde38b1461082d578063ffc8befd146108565761020f565b8063c1e28507146106dd578063c2ca0ac514610706578063c87b56dd1461072f578063d5abeb011461076c5761020f565b8063a694fc3a116100e7578063a694fc3a1461060e578063af255acd14610637578063b88d4fde14610660578063b8bec6a014610689578063ba829d71146106b25761020f565b80638da5cb5b1461055257806395d89b411461057d5780639d897351146105a8578063a22cb465146105e55761020f565b8063455ab53c1161019b5780636352211e1161016a5780636352211e1461047f5780636c0360eb146104bc57806370a08231146104e7578063715018a614610524578063853828b61461053b5761020f565b8063455ab53c146103b157806355f804b3146103dc5780635a3f26721461040557806363315760146104425761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806318160ddd1461030b57806323b872dd146103365780632e17de781461035f57806342842e0e146103885761020f565b806301ffc9a714610214578063046dc1661461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061322e565b61087f565b6040516102489190613758565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190612f61565b610911565b005b34801561028657600080fd5b5061028f6109c4565b60405161029c91906137b8565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613359565b610a56565b6040516102d991906136cf565b60405180910390f35b3480156102ee57600080fd5b50610309600480360381019061030491906130e4565b610ad5565b005b34801561031757600080fd5b50610320610c19565b60405161032d919061387a565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190612fce565b610c30565b005b34801561036b57600080fd5b5061038660048036038101906103819190613359565b610c8d565b005b34801561039457600080fd5b506103af60048036038101906103aa9190612fce565b610da5565b005b3480156103bd57600080fd5b506103c6610dc5565b6040516103d39190613758565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613310565b610dd8565b005b34801561041157600080fd5b5061042c60048036038101906104279190612f61565b610dfa565b6040516104399190613736565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190613359565b610f35565b604051610476919061387a565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190613359565b610f4d565b6040516104b391906136cf565b60405180910390f35b3480156104c857600080fd5b506104d1610f5f565b6040516104de91906137b8565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190612f61565b610fed565b60405161051b919061387a565b60405180910390f35b34801561053057600080fd5b506105396110a6565b005b34801561054757600080fd5b506105506110ba565b005b34801561055e57600080fd5b50610567611168565b60405161057491906136cf565b60405180910390f35b34801561058957600080fd5b50610592611192565b60405161059f91906137b8565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613359565b611224565b6040516105dc9190613758565b60405180910390f35b3480156105f157600080fd5b5061060c600480360381019061060791906130a4565b611244565b005b34801561061a57600080fd5b5061063560048036038101906106309190613359565b61134f565b005b34801561064357600080fd5b5061065e60048036038101906106599190613124565b6114ab565b005b34801561066c57600080fd5b5061068760048036038101906106829190613021565b6115be565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613201565b61161d565b005b3480156106be57600080fd5b506106c7611642565b6040516106d4919061387a565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff9190613359565b611648565b005b34801561071257600080fd5b5061072d60048036038101906107289190613359565b61165a565b005b34801561073b57600080fd5b5061075660048036038101906107519190613359565b6117f8565b60405161076391906137b8565b60405180910390f35b34801561077857600080fd5b50610781611897565b60405161078e919061387a565b60405180910390f35b6107b160048036038101906107ac9190613288565b61189d565b005b3480156107bf57600080fd5b506107da60048036038101906107d59190612f61565b611a24565b6040516107e7919061387a565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190612f8e565b611a36565b6040516108249190613758565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190612f61565b611aca565b005b34801561086257600080fd5b5061087d600480360381019061087891906131a5565b611b4e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108da57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610919611bb0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610980576040517f746ef87300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600280546109d390613b26565b80601f01602080910402602001604051908101604052809291908181526020018280546109ff90613b26565b8015610a4c5780601f10610a2157610100808354040283529160200191610a4c565b820191906000526020600020905b815481529060010190602001808311610a2f57829003601f168201915b5050505050905090565b6000610a6182611c2e565b610a97576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ae082610f4d565b90508073ffffffffffffffffffffffffffffffffffffffff16610b01611c8d565b73ffffffffffffffffffffffffffffffffffffffff1614610b6457610b2d81610b28611c8d565b611a36565b610b63576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c23611c95565b6001546000540303905090565b6000600f60008381526020019081526020016000205414610c7d576040517f3899ae3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c88838383611c9a565b505050565b610c9681610f4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610d045750610cd4611168565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d3b576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f6000838152602001908152602001600020541415610d89576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f60008381526020019081526020016000208190555050565b610dc0838383604051806020016040528060008152506115be565b505050565b600d60009054906101000a900460ff1681565b610de0611bb0565b80600b9080519060200190610df6929190612b86565b5050565b60606000610e0783610fed565b67ffffffffffffffff811115610e2057610e1f613cc6565b5b604051908082528060200260200182016040528015610e4e5781602001602082028036833780820191505090505b5090506000805b610e5d610c19565b811015610f2a576000610e6f82611fbf565b9050806040015180610eb15750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16145b15610ebc5750610f1d565b8573ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610f1b5781848480600101955081518110610f0e57610f0d613c97565b5b6020026020010181815250505b505b8080600101915050610e55565b508192505050919050565b600f6020528060005260406000206000915090505481565b6000610f5882611fdf565b9050919050565b600b8054610f6c90613b26565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9890613b26565b8015610fe55780601f10610fba57610100808354040283529160200191610fe5565b820191906000526020600020905b815481529060010190602001808311610fc857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611055576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110ae611bb0565b6110b860006120ad565b565b6110c2611bb0565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516110e8906136ba565b60006040518083038185875af1925050503d8060008114611125576040519150601f19603f3d011682016040523d82523d6000602084013e61112a565b606091505b5050905080611165576040517fc9ae8eaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111a190613b26565b80601f01602080910402602001604051908101604052809291908181526020018280546111cd90613b26565b801561121a5780601f106111ef5761010080835404028352916020019161121a565b820191906000526020600020905b8154815290600101906020018083116111fd57829003601f168201915b5050505050905090565b60106020528060005260406000206000915054906101000a900460ff1681565b8060076000611251611c8d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112fe611c8d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113439190613758565b60405180910390a35050565b600d60009054906101000a900460ff16611395576040517f6929bcec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139e81610f4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561140c57506113dc611168565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611443576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f60008381526020019081526020016000205414611490576040517f0ae3514d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42600f60008381526020019081526020016000208190555050565b6114b3611bb0565b6000805b838390508110156114fc578383828181106114d5576114d4613c97565b5b90506020020135826114e791906139cf565b915080806114f490613b89565b9150506114b7565b50600c5481611509610c19565b61151391906139cf565b111561154b576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b858590508110156115b6576115a386868381811061156f5761156e613c97565b5b90506020020160208101906115849190612f61565b85858481811061159757611596613c97565b5b90506020020135612173565b80806115ae90613b89565b91505061154e565b505050505050565b6000600f6000848152602001908152602001600020541461160b576040517f3899ae3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61161784848484612330565b50505050565b611625611bb0565b80600d60006101000a81548160ff02191690831515021790555050565b600e5481565b611650611bb0565b80600e8190555050565b61166381610f4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156116d157506116a1611168565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611708576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600f6000838152602001908152602001600020541415611756576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54600f600083815260200190815260200160002054426117789190613a25565b10156117b0576040517ff414d34d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016010600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600f60008381526020019081526020016000208190555050565b606061180382611c2e565b611839576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118436123a3565b9050600081511415611864576040518060200160405280600081525061188f565b8061186e84612435565b60405160200161187f929190613670565b6040516020818303038152906040525b915050919050565b600c5481565b6118ed33348488888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612485565b611923576040517fc1606c2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c548361192f610c19565b61193991906139cf565b1115611971576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818361197c3361252b565b61198691906139cf565b11156119be576040517fd58a411000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119c8612582565b90506119d43385612173565b8115611a1c5760006119e4612582565b90505b80821015611a1a5742600f6000848152602001908152602001600020819055508180611a1290613b89565b9250506119e7565b505b505050505050565b6000611a2f8261252b565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ad2611bb0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b399061381a565b60405180910390fd5b611b4b816120ad565b50565b60005b8251811015611bab576000838281518110611b6f57611b6e613c97565b5b602002602001015190508215611b8d57611b888161134f565b611b97565b611b9681610c8d565b5b508080611ba390613b89565b915050611b51565b505050565b611bb861258b565b73ffffffffffffffffffffffffffffffffffffffff16611bd6611168565b73ffffffffffffffffffffffffffffffffffffffff1614611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c239061385a565b60405180910390fd5b565b600081611c39611c95565b11158015611c48575060005482105b8015611c86575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611ca582611fdf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d1884612593565b91509150611d2e8187611d29611c8d565b6125ba565b611d7a57611d4386611d3e611c8d565b611a36565b611d79576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611de1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dee86868660016125fe565b8015611df957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611ec785611ea3888887612604565b7c02000000000000000000000000000000000000000000000000000000001761262c565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611f4f576000600185019050600060046000838152602001908152602001600020541415611f4d576000548114611f4c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fb78686866001612657565b505050505050565b611fc7612c0c565b611fd8611fd383611fdf565b61265d565b9050919050565b60008082905080611fee611c95565b11612076576000548110156120755760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612073575b600081141561206957600460008360019003935083815260200190815260200160002054905061203e565b80925050506120a8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008054905060008214156121b4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121c160008483856125fe565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612238836122296000866000612604565b61223285612713565b1761262c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146122d957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061229e565b506000821415612315576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061232b6000848385612657565b505050565b61233b848484610c30565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461239d5761236684848484612723565b61239c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600b80546123b290613b26565b80601f01602080910402602001604051908101604052809291908181526020018280546123de90613b26565b801561242b5780601f106124005761010080835404028352916020019161242b565b820191906000526020600020905b81548152906001019060200180831161240e57829003601f168201915b5050505050905090565b606060806040510190508060405280825b60011561247157600183039250600a81066030018353600a810490508061246c57612471565b612446565b508181036020830392508083525050919050565b60008085858560405160200161249d93929190613633565b6040516020818303038152906040528051906020012090506124d0836124c283612883565b6128b390919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008054905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861261b8686846128da565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612665612c0c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612749611c8d565b8786866040518563ffffffff1660e01b815260040161276b94939291906136ea565b602060405180830381600087803b15801561278557600080fd5b505af19250505080156127b657506040513d601f19601f820116820180604052508101906127b3919061325b565b60015b612830573d80600081146127e6576040519150601f19603f3d011682016040523d82523d6000602084013e6127eb565b606091505b50600081511415612828576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000816040516020016128969190613694565b604051602081830303815290604052805190602001209050919050565b60008060006128c285856128e3565b915091506128cf81612935565b819250505092915050565b60009392505050565b6000806041835114156129255760008060006020860151925060408601519150606086015160001a905061291987828585612aa3565b9450945050505061292e565b60006002915091505b9250929050565b6000600481111561294957612948613c39565b5b81600481111561295c5761295b613c39565b5b141561296757612aa0565b6001600481111561297b5761297a613c39565b5b81600481111561298e5761298d613c39565b5b14156129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c6906137da565b60405180910390fd5b600260048111156129e3576129e2613c39565b5b8160048111156129f6576129f5613c39565b5b1415612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e906137fa565b60405180910390fd5b60036004811115612a4b57612a4a613c39565b5b816004811115612a5e57612a5d613c39565b5b1415612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a969061383a565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612ade576000600391509150612b7d565b600060018787878760405160008152602001604052604051612b039493929190613773565b6020604051602081039080840390855afa158015612b25573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b7457600060019250925050612b7d565b80600092509250505b94509492505050565b828054612b9290613b26565b90600052602060002090601f016020900481019282612bb45760008555612bfb565b82601f10612bcd57805160ff1916838001178555612bfb565b82800160010185558215612bfb579182015b82811115612bfa578251825591602001919060010190612bdf565b5b509050612c089190612c5b565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612c74576000816000905550600101612c5c565b5090565b6000612c8b612c86846138ba565b613895565b90508083825260208201905082856020860282011115612cae57612cad613cff565b5b60005b85811015612cde5781612cc48882612f4c565b845260208401935060208301925050600181019050612cb1565b5050509392505050565b6000612cfb612cf6846138e6565b613895565b905082815260208101848484011115612d1757612d16613d04565b5b612d22848285613ae4565b509392505050565b6000612d3d612d3884613917565b613895565b905082815260208101848484011115612d5957612d58613d04565b5b612d64848285613ae4565b509392505050565b600081359050612d7b81613e76565b92915050565b60008083601f840112612d9757612d96613cfa565b5b8235905067ffffffffffffffff811115612db457612db3613cf5565b5b602083019150836020820283011115612dd057612dcf613cff565b5b9250929050565b60008083601f840112612ded57612dec613cfa565b5b8235905067ffffffffffffffff811115612e0a57612e09613cf5565b5b602083019150836020820283011115612e2657612e25613cff565b5b9250929050565b600082601f830112612e4257612e41613cfa565b5b8135612e52848260208601612c78565b91505092915050565b600081359050612e6a81613e8d565b92915050565b600081359050612e7f81613ea4565b92915050565b600081519050612e9481613ea4565b92915050565b60008083601f840112612eb057612eaf613cfa565b5b8235905067ffffffffffffffff811115612ecd57612ecc613cf5565b5b602083019150836001820283011115612ee957612ee8613cff565b5b9250929050565b600082601f830112612f0557612f04613cfa565b5b8135612f15848260208601612ce8565b91505092915050565b600082601f830112612f3357612f32613cfa565b5b8135612f43848260208601612d2a565b91505092915050565b600081359050612f5b81613ebb565b92915050565b600060208284031215612f7757612f76613d0e565b5b6000612f8584828501612d6c565b91505092915050565b60008060408385031215612fa557612fa4613d0e565b5b6000612fb385828601612d6c565b9250506020612fc485828601612d6c565b9150509250929050565b600080600060608486031215612fe757612fe6613d0e565b5b6000612ff586828701612d6c565b935050602061300686828701612d6c565b925050604061301786828701612f4c565b9150509250925092565b6000806000806080858703121561303b5761303a613d0e565b5b600061304987828801612d6c565b945050602061305a87828801612d6c565b935050604061306b87828801612f4c565b925050606085013567ffffffffffffffff81111561308c5761308b613d09565b5b61309887828801612ef0565b91505092959194509250565b600080604083850312156130bb576130ba613d0e565b5b60006130c985828601612d6c565b92505060206130da85828601612e5b565b9150509250929050565b600080604083850312156130fb576130fa613d0e565b5b600061310985828601612d6c565b925050602061311a85828601612f4c565b9150509250929050565b6000806000806040858703121561313e5761313d613d0e565b5b600085013567ffffffffffffffff81111561315c5761315b613d09565b5b61316887828801612d81565b9450945050602085013567ffffffffffffffff81111561318b5761318a613d09565b5b61319787828801612dd7565b925092505092959194509250565b600080604083850312156131bc576131bb613d0e565b5b600083013567ffffffffffffffff8111156131da576131d9613d09565b5b6131e685828601612e2d565b92505060206131f785828601612e5b565b9150509250929050565b60006020828403121561321757613216613d0e565b5b600061322584828501612e5b565b91505092915050565b60006020828403121561324457613243613d0e565b5b600061325284828501612e70565b91505092915050565b60006020828403121561327157613270613d0e565b5b600061327f84828501612e85565b91505092915050565b6000806000806000608086880312156132a4576132a3613d0e565b5b600086013567ffffffffffffffff8111156132c2576132c1613d09565b5b6132ce88828901612e9a565b955095505060206132e188828901612f4c565b93505060406132f288828901612f4c565b925050606061330388828901612e5b565b9150509295509295909350565b60006020828403121561332657613325613d0e565b5b600082013567ffffffffffffffff81111561334457613343613d09565b5b61335084828501612f1e565b91505092915050565b60006020828403121561336f5761336e613d0e565b5b600061337d84828501612f4c565b91505092915050565b600061339283836135ef565b60208301905092915050565b6133a781613a59565b82525050565b6133be6133b982613a59565b613bd2565b82525050565b60006133cf82613958565b6133d98185613986565b93506133e483613948565b8060005b838110156134155781516133fc8882613386565b975061340783613979565b9250506001810190506133e8565b5085935050505092915050565b61342b81613a6b565b82525050565b61343a81613a77565b82525050565b61345161344c82613a77565b613be4565b82525050565b600061346282613963565b61346c8185613997565b935061347c818560208601613af3565b61348581613d13565b840191505092915050565b600061349b8261396e565b6134a581856139b3565b93506134b5818560208601613af3565b6134be81613d13565b840191505092915050565b60006134d48261396e565b6134de81856139c4565b93506134ee818560208601613af3565b80840191505092915050565b60006135076018836139b3565b915061351282613d31565b602082019050919050565b600061352a601f836139b3565b915061353582613d5a565b602082019050919050565b600061354d601c836139c4565b915061355882613d83565b601c82019050919050565b60006135706026836139b3565b915061357b82613dac565b604082019050919050565b60006135936022836139b3565b915061359e82613dfb565b604082019050919050565b60006135b66020836139b3565b91506135c182613e4a565b602082019050919050565b60006135d96000836139a8565b91506135e482613e73565b600082019050919050565b6135f881613acd565b82525050565b61360781613acd565b82525050565b61361e61361982613acd565b613c00565b82525050565b61362d81613ad7565b82525050565b600061363f82866133ad565b60148201915061364f828561360d565b60208201915061365f828461360d565b602082019150819050949350505050565b600061367c82856134c9565b915061368882846134c9565b91508190509392505050565b600061369f82613540565b91506136ab8284613440565b60208201915081905092915050565b60006136c5826135cc565b9150819050919050565b60006020820190506136e4600083018461339e565b92915050565b60006080820190506136ff600083018761339e565b61370c602083018661339e565b61371960408301856135fe565b818103606083015261372b8184613457565b905095945050505050565b6000602082019050818103600083015261375081846133c4565b905092915050565b600060208201905061376d6000830184613422565b92915050565b60006080820190506137886000830187613431565b6137956020830186613624565b6137a26040830185613431565b6137af6060830184613431565b95945050505050565b600060208201905081810360008301526137d28184613490565b905092915050565b600060208201905081810360008301526137f3816134fa565b9050919050565b600060208201905081810360008301526138138161351d565b9050919050565b6000602082019050818103600083015261383381613563565b9050919050565b6000602082019050818103600083015261385381613586565b9050919050565b60006020820190508181036000830152613873816135a9565b9050919050565b600060208201905061388f60008301846135fe565b92915050565b600061389f6138b0565b90506138ab8282613b58565b919050565b6000604051905090565b600067ffffffffffffffff8211156138d5576138d4613cc6565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561390157613900613cc6565b5b61390a82613d13565b9050602081019050919050565b600067ffffffffffffffff82111561393257613931613cc6565b5b61393b82613d13565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139da82613acd565b91506139e583613acd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a1a57613a19613c0a565b5b828201905092915050565b6000613a3082613acd565b9150613a3b83613acd565b925082821015613a4e57613a4d613c0a565b5b828203905092915050565b6000613a6482613aad565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613b11578082015181840152602081019050613af6565b83811115613b20576000848401525b50505050565b60006002820490506001821680613b3e57607f821691505b60208210811415613b5257613b51613c68565b5b50919050565b613b6182613d13565b810181811067ffffffffffffffff82111715613b8057613b7f613cc6565b5b80604052505050565b6000613b9482613acd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bc757613bc6613c0a565b5b600182019050919050565b6000613bdd82613bee565b9050919050565b6000819050919050565b6000613bf982613d24565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b613e7f81613a59565b8114613e8a57600080fd5b50565b613e9681613a6b565b8114613ea157600080fd5b50565b613ead81613a81565b8114613eb857600080fd5b50565b613ec481613acd565b8114613ecf57600080fd5b5056fea26469706673582212206f0d7c4d1a1d8aa9e5d1c7ad2c8b7ac42655fbdc9b9697f7d2d21a4c8f5d452a64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000006130000000000000000000000006b2341bf6d8e7f914a1afee9fbdc7449f875f61f00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f6170692e63686962696d6f6e2e78797a2f6d657461646174612f000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : newMaxSupply (uint256): 1555
Arg [1] : newSignerAddress (address): 0x6B2341bf6d8E7f914a1aFEe9fBDC7449f875f61f
Arg [2] : newBaseURI (string): https://api.chibimon.xyz/metadata/
Arg [3] : newStakingStatus (bool): True
Arg [4] : newRevealTime (uint256): 172800
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000613
Arg [1] : 0000000000000000000000006b2341bf6d8e7f914a1afee9fbdc7449f875f61f
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000000000000000000000000000000000000002a300
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [6] : 68747470733a2f2f6170692e63686962696d6f6e2e78797a2f6d657461646174
Arg [7] : 612f000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
426:6845:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9367:639:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5600:199:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10269:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16752:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16193:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6020:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6724:245:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2730:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23304:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;637:25:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5882:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3930:642;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;703:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11662:152:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;578:21:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7204:233:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:5;;;;;;;;;;;;;:::i;:::-;;6399:181:0;;;;;;;;;;;;;:::i;:::-;;1236:87:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10445:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;756:45:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17310:234:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2351:316:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5044:461;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6977:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6060:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;669:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6237:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3469:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10655:318:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;606:24:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1351:737;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2174:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17701:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2142:201:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3049:323:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9367:639:3;9452:4;9791:10;9776:25;;:11;:25;;;;:102;;;;9868:10;9853:25;;:11;:25;;;;9776:102;:179;;;;9945:10;9930:25;;:11;:25;;;;9776:179;9756:199;;9367:639;;;:::o;5600:199:0:-;1122:13:5;:11;:13::i;:::-;5714:1:0::1;5686:30;;:16;:30;;;5682:65;;;5726:21;;;;;;;;;;;;;;5682:65;5775:16;5758:14;;:33;;;;;;;;;;;;;;;;;;5600:199:::0;:::o;10269:100:3:-;10323:13;10356:5;10349:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10269:100;:::o;16752:218::-;16828:7;16853:16;16861:7;16853;:16::i;:::-;16848:64;;16878:34;;;;;;;;;;;;;;16848:64;16932:15;:24;16948:7;16932:24;;;;;;;;;;;:30;;;;;;;;;;;;16925:37;;16752:218;;;:::o;16193:400::-;16274:13;16290:16;16298:7;16290;:16::i;:::-;16274:32;;16346:5;16323:28;;:19;:17;:19::i;:::-;:28;;;16319:175;;16371:44;16388:5;16395:19;:17;:19::i;:::-;16371:16;:44::i;:::-;16366:128;;16443:35;;;;;;;;;;;;;;16366:128;16319:175;16539:2;16506:15;:24;16522:7;16506:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16577:7;16573:2;16557:28;;16566:5;16557:28;;;;;;;;;;;;16263:330;16193:400;;:::o;6020:323::-;6081:7;6309:15;:13;:15::i;:::-;6294:12;;6278:13;;:28;:46;6271:53;;6020:323;:::o;6724:245:0:-;6887:1;6863:11;:20;6875:7;6863:20;;;;;;;;;;;;:25;6859:54;;6898:15;;;;;;;;;;;;;;6859:54;6924:37;6943:4;6949:2;6953:7;6924:18;:37::i;:::-;6724:245;;;:::o;2730:243::-;2800:16;2808:7;2800;:16::i;:::-;2786:30;;:10;:30;;;;:55;;;;;2834:7;:5;:7::i;:::-;2820:21;;:10;:21;;;;2786:55;2782:85;;;2851:16;;;;;;;;;;;;;;2782:85;2906:1;2882:11;:20;2894:7;2882:20;;;;;;;;;;;;:25;2878:50;;;2917:11;;;;;;;;;;;;;;2878:50;2964:1;2941:11;:20;2953:7;2941:20;;;;;;;;;;;:24;;;;2730:243;:::o;23304:185:3:-;23442:39;23459:4;23465:2;23469:7;23442:39;;;;;;;;;;;;:16;:39::i;:::-;23304:185;;;:::o;637:25:0:-;;;;;;;;;;;;;:::o;5882:104::-;1122:13:5;:11;:13::i;:::-;5968:10:0::1;5958:7;:20;;;;;;;;;;;;:::i;:::-;;5882:104:::0;:::o;3930:642::-;3986:16;4040:25;4082:16;4092:5;4082:9;:16::i;:::-;4068:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4040:59;;4114:19;4155:9;4150:372;4170:13;:11;:13::i;:::-;4166:1;:17;4150:372;;;4211:31;4245:15;4258:1;4245:12;:15::i;:::-;4211:49;;4285:9;:16;;;:48;;;;4331:1;4305:28;;:9;:14;;;:28;;;4285:48;4281:105;;;4358:8;;;4281:105;4428:5;4410:23;;:9;:14;;;:23;;;4406:99;;;4484:1;4458:8;4467:13;;;;;;4458:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4406:99;4190:332;4150:372;4185:3;;;;;;;4150:372;;;;4545:8;4538:15;;;;3930:642;;;:::o;703:46::-;;;;;;;;;;;;;;;;;:::o;11662:152:3:-;11734:7;11777:27;11796:7;11777:18;:27::i;:::-;11754:52;;11662:152;;;:::o;578:21:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7204:233:3:-;7276:7;7317:1;7300:19;;:5;:19;;;7296:60;;;7328:28;;;;;;;;;;;;;;7296:60;1363:13;7374:18;:25;7393:5;7374:25;;;;;;;;;;;;;;;;:55;7367:62;;7204:233;;;:::o;1884:103:5:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;6399:181:0:-;1122:13:5;:11;:13::i;:::-;6453:12:0::1;6471:10;:15;;6494:21;6471:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6452:68;;;6536:7;6531:41;;6553:19;;;;;;;;;;;;;;6531:41;6441:139;6399:181::o:0;1236:87:5:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;10445:104:3:-;10501:13;10534:7;10527:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10445:104;:::o;756:45:0:-;;;;;;;;;;;;;;;;;;;;;;:::o;17310:234:3:-;17457:8;17405:18;:39;17424:19;:17;:19::i;:::-;17405:39;;;;;;;;;;;;;;;:49;17445:8;17405:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17517:8;17481:55;;17496:19;:17;:19::i;:::-;17481:55;;;17527:8;17481:55;;;;;;:::i;:::-;;;;;;;;17310:234;;:::o;2351:316:0:-;2406:13;;;;;;;;;;;2401:46;;2429:18;;;;;;;;;;;;;;2401:46;2476:16;2484:7;2476;:16::i;:::-;2462:30;;:10;:30;;;;:55;;;;;2510:7;:5;:7::i;:::-;2496:21;;:10;:21;;;;2462:55;2458:85;;;2527:16;;;;;;;;;;;;;;2458:85;2582:1;2558:11;:20;2570:7;2558:20;;;;;;;;;;;;:25;2554:54;;2593:15;;;;;;;;;;;;;;2554:54;2644:15;2621:11;:20;2633:7;2621:20;;;;;;;;;;;:38;;;;2351:316;:::o;5044:461::-;1122:13:5;:11;:13::i;:::-;5156:21:0::1;5199:9:::0;5194:106:::1;5218:10;;:17;;5214:1;:21;5194:106;;;5275:10;;5286:1;5275:13;;;;;;;:::i;:::-;;;;;;;;5258:30;;;;;:::i;:::-;;;5237:3;;;;;:::i;:::-;;;;5194:106;;;;5348:9;;5332:13;5316;:11;:13::i;:::-;:29;;;;:::i;:::-;:41;5312:64;;;5367:9;;;;;;;;;;;;;;5312:64;5394:9;5389:109;5413:9;;:16;;5409:1;:20;5389:109;;;5452:34;5458:9;;5468:1;5458:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5472:10;;5483:1;5472:13;;;;;;;:::i;:::-;;;;;;;;5452:5;:34::i;:::-;5431:3;;;;;:::i;:::-;;;;5389:109;;;;5143:362;5044:461:::0;;;;:::o;6977:289::-;7173:1;7149:11;:20;7161:7;7149:20;;;;;;;;;;;;:25;7145:54;;7184:15;;;;;;;;;;;;;;7145:54;7210:48;7233:4;7239:2;7243:7;7252:5;7210:22;:48::i;:::-;6977:289;;;;:::o;6060:99::-;1122:13:5;:11;:13::i;:::-;6145:6:0::1;6129:13;;:22;;;;;;;;;;;;;;;;;;6060:99:::0;:::o;669:25::-;;;;:::o;6237:92::-;1122:13:5;:11;:13::i;:::-;6317:4:0::1;6304:10;:17;;;;6237:92:::0;:::o;3469:379::-;3538:16;3546:7;3538;:16::i;:::-;3524:30;;:10;:30;;;;:55;;;;;3572:7;:5;:7::i;:::-;3558:21;;:10;:21;;;;3524:55;3520:85;;;3589:16;;;;;;;;;;;;;;3520:85;3644:1;3620:11;:20;3632:7;3620:20;;;;;;;;;;;;:25;3616:50;;;3655:11;;;;;;;;;;;;;;3616:50;3722:10;;3699:11;:20;3711:7;3699:20;;;;;;;;;;;;3681:15;:38;;;;:::i;:::-;:51;3677:86;;;3742:21;;;;;;;;;;;;;;3677:86;3801:4;3776:13;:22;3790:7;3776:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;3839:1;3816:11;:20;3828:7;3816:20;;;;;;;;;;;:24;;;;3469:379;:::o;10655:318:3:-;10728:13;10759:16;10767:7;10759;:16::i;:::-;10754:59;;10784:29;;;;;;;;;;;;;;10754:59;10826:21;10850:10;:8;:10::i;:::-;10826:34;;10903:1;10884:7;10878:21;:26;;:87;;;;;;;;;;;;;;;;;10931:7;10940:18;10950:7;10940:9;:18::i;:::-;10914:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10878:87;10871:94;;;10655:318;;;:::o;606:24:0:-;;;;:::o;1351:737::-;1481:57;1492:10;1504:9;1515:11;1528:9;;1481:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:57::i;:::-;1476:92;;1548:20;;;;;;;;;;;;;;1476:92;1610:9;;1599:8;1583:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;1579:59;;;1629:9;;;;;;;;;;;;;;1579:59;1692:11;1681:8;1653:25;1667:10;1653:13;:25::i;:::-;:36;;;;:::i;:::-;:50;1649:87;;;1713:23;;;;;;;;;;;;;;1649:87;1749:20;1772:14;:12;:14::i;:::-;1749:37;;1799:27;1805:10;1817:8;1799:5;:27::i;:::-;1843:11;1839:242;;;1872:18;1893:14;:12;:14::i;:::-;1872:35;;1924:146;1946:10;1931:12;:25;1924:146;;;2006:15;1978:11;:25;1990:12;1978:25;;;;;;;;;;;:43;;;;2040:14;;;;;:::i;:::-;;;;1924:146;;;1857:224;1839:242;1465:623;1351:737;;;;;:::o;2174:116::-;2234:7;2261:21;2275:6;2261:13;:21::i;:::-;2254:28;;2174:116;;;:::o;17701:164:3:-;17798:4;17822:18;:25;17841:5;17822:25;;;;;;;;;;;;;;;:35;17848:8;17822:35;;;;;;;;;;;;;;;;;;;;;;;;;17815:42;;17701:164;;;;:::o;2142:201:5:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;;;2223:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;3049:323:0:-;3140:9;3135:230;3155:8;:15;3151:1;:19;3135:230;;;3192:15;3210:8;3219:1;3210:11;;;;;;;;:::i;:::-;;;;;;;;3192:29;;3240:6;3236:118;;;3267:14;3273:7;3267:5;:14::i;:::-;3236:118;;;3322:16;3330:7;3322;:16::i;:::-;3236:118;3177:188;3172:3;;;;;:::i;:::-;;;;3135:230;;;;3049:323;;:::o;1401:132:5:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;18123:282:3:-;18188:4;18244:7;18225:15;:13;:15::i;:::-;:26;;:66;;;;;18278:13;;18268:7;:23;18225:66;:153;;;;;18377:1;2139:8;18329:17;:26;18347:7;18329:26;;;;;;;;;;;;:44;:49;18225:153;18205:173;;18123:282;;;:::o;40161:105::-;40221:7;40248:10;40241:17;;40161:105;:::o;5536:92::-;5592:7;5536:92;:::o;20391:2817::-;20525:27;20555;20574:7;20555:18;:27::i;:::-;20525:57;;20640:4;20599:45;;20615:19;20599:45;;;20595:86;;20653:28;;;;;;;;;;;;;;20595:86;20695:27;20724:23;20751:35;20778:7;20751:26;:35::i;:::-;20694:92;;;;20886:68;20911:15;20928:4;20934:19;:17;:19::i;:::-;20886:24;:68::i;:::-;20881:180;;20974:43;20991:4;20997:19;:17;:19::i;:::-;20974:16;:43::i;:::-;20969:92;;21026:35;;;;;;;;;;;;;;20969:92;20881:180;21092:1;21078:16;;:2;:16;;;21074:52;;;21103:23;;;;;;;;;;;;;;21074:52;21139:43;21161:4;21167:2;21171:7;21180:1;21139:21;:43::i;:::-;21275:15;21272:160;;;21415:1;21394:19;21387:30;21272:160;21812:18;:24;21831:4;21812:24;;;;;;;;;;;;;;;;21810:26;;;;;;;;;;;;21881:18;:22;21900:2;21881:22;;;;;;;;;;;;;;;;21879:24;;;;;;;;;;;22203:146;22240:2;22289:45;22304:4;22310:2;22314:19;22289:14;:45::i;:::-;2419:8;22261:73;22203:18;:146::i;:::-;22174:17;:26;22192:7;22174:26;;;;;;;;;;;:175;;;;22520:1;2419:8;22469:19;:47;:52;22465:627;;;22542:19;22574:1;22564:7;:11;22542:33;;22731:1;22697:17;:30;22715:11;22697:30;;;;;;;;;;;;:35;22693:384;;;22835:13;;22820:11;:28;22816:242;;23015:19;22982:17;:30;23000:11;22982:30;;;;;;;;;;;:52;;;;22816:242;22693:384;22523:569;22465:627;23139:7;23135:2;23120:27;;23129:4;23120:27;;;;;;;;;;;;23158:42;23179:4;23185:2;23189:7;23198:1;23158:20;:42::i;:::-;20514:2694;;;20391:2817;;;:::o;12003:166::-;12073:21;;:::i;:::-;12114:47;12133:27;12152:7;12133:18;:27::i;:::-;12114:18;:47::i;:::-;12107:54;;12003:166;;;:::o;12817:1275::-;12884:7;12904:12;12919:7;12904:22;;12987:4;12968:15;:13;:15::i;:::-;:23;12964:1061;;13021:13;;13014:4;:20;13010:1015;;;13059:14;13076:17;:23;13094:4;13076:23;;;;;;;;;;;;13059:40;;13193:1;2139:8;13165:6;:24;:29;13161:845;;;13830:113;13847:1;13837:6;:11;13830:113;;;13890:17;:25;13908:6;;;;;;;13890:25;;;;;;;;;;;;13881:34;;13830:113;;;13976:6;13969:13;;;;;;13161:845;13036:989;13010:1015;12964:1061;14053:31;;;;;;;;;;;;;;12817:1275;;;;:::o;2503:191:5:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;27748:2720:3:-;27821:20;27844:13;;27821:36;;27884:1;27872:8;:13;27868:44;;;27894:18;;;;;;;;;;;;;;27868:44;27925:61;27955:1;27959:2;27963:12;27977:8;27925:21;:61::i;:::-;28469:1;1501:2;28439:1;:26;;28438:32;28426:8;:45;28400:18;:22;28419:2;28400:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28748:139;28785:2;28839:33;28862:1;28866:2;28870:1;28839:14;:33::i;:::-;28806:30;28827:8;28806:20;:30::i;:::-;:66;28748:18;:139::i;:::-;28714:17;:31;28732:12;28714:31;;;;;;;;;;;:173;;;;28904:16;28935:11;28964:8;28949:12;:23;28935:37;;29485:16;29481:2;29477:25;29465:37;;29857:12;29817:8;29776:1;29714:25;29655:1;29594;29567:335;29982:1;29968:12;29964:20;29922:346;30023:3;30014:7;30011:16;29922:346;;30241:7;30231:8;30228:1;30201:25;30198:1;30195;30190:59;30076:1;30067:7;30063:15;30052:26;;29922:346;;;29926:77;30313:1;30301:8;:13;30297:45;;;30323:19;;;;;;;;;;;;;;30297:45;30375:3;30359:13;:19;;;;28174:2216;;30400:60;30429:1;30433:2;30437:12;30451:8;30400:20;:60::i;:::-;27810:2658;27748:2720;;:::o;24087:399::-;24254:31;24267:4;24273:2;24277:7;24254:12;:31::i;:::-;24318:1;24300:2;:14;;;:19;24296:183;;24339:56;24370:4;24376:2;24380:7;24389:5;24339:30;:56::i;:::-;24334:145;;24423:40;;;;;;;;;;;;;;24334:145;24296:183;24087:399;;;;:::o;6608:108:0:-;6668:13;6701:7;6694:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6608:108;:::o;40368:1582:3:-;40433:17;40859:4;40852;40846:11;40842:22;40835:29;;40951:3;40945:4;40938:17;41057:3;41296:5;41278:428;41304:1;41278:428;;;41344:1;41339:3;41335:11;41328:18;;41515:2;41509:4;41505:13;41501:2;41497:22;41492:3;41484:36;41609:2;41603:4;41599:13;41591:21;;41676:4;41666:25;;41684:5;;41666:25;41278:428;;;41282:21;41745:3;41740;41736:13;41860:4;41855:3;41851:14;41844:21;;41925:6;41920:3;41913:19;40472:1471;;40368:1582;;;:::o;4609:319:0:-;4731:4;4748:19;4797:6;4805:9;4816:11;4780:48;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4770:59;;;;;;4748:81;;4865:55;4910:9;4865:36;:11;:34;:36::i;:::-;:44;;:55;;;;:::i;:::-;4847:73;;:14;;;;;;;;;;;:73;;;4840:80;;;4609:319;;;;;;:::o;7519:178:3:-;7580:7;1363:13;1501:2;7608:18;:25;7627:5;7608:25;;;;;;;;;;;;;;;;:50;;7607:82;7600:89;;7519:178;;;:::o;5707:103::-;5762:7;5789:13;;5782:20;;5707:103;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;19286:485:3:-;19388:27;19417:23;19458:38;19499:15;:24;19515:7;19499:24;;;;;;;;;;;19458:65;;19676:18;19653:41;;19733:19;19727:26;19708:45;;19638:126;19286:485;;;:::o;18514:659::-;18663:11;18828:16;18821:5;18817:28;18808:37;;18988:16;18977:9;18973:32;18960:45;;19138:15;19127:9;19124:30;19116:5;19105:9;19102:20;19099:56;19089:66;;18514:659;;;;;:::o;25148:159::-;;;;;:::o;39470:311::-;39605:7;39625:16;2543:3;39651:19;:41;;39625:68;;2543:3;39719:31;39730:4;39736:2;39740:9;39719:10;:31::i;:::-;39711:40;;:62;;39704:69;;;39470:311;;;;;:::o;14640:450::-;14720:14;14888:16;14881:5;14877:28;14868:37;;15065:5;15051:11;15026:23;15022:41;15019:52;15012:5;15009:63;14999:73;;14640:450;;;;:::o;25972:158::-;;;;;:::o;14191:366::-;14257:31;;:::i;:::-;14334:6;14301:9;:14;;:41;;;;;;;;;;;2022:3;14387:6;:33;;14353:9;:24;;:68;;;;;;;;;;;14479:1;2139:8;14451:6;:24;:29;;14432:9;:16;;:48;;;;;;;;;;;2543:3;14520:6;:28;;14491:9;:19;;:58;;;;;;;;;;;14191:366;;;:::o;15192:324::-;15262:14;15495:1;15485:8;15482:15;15456:24;15452:46;15442:56;;15192:324;;;:::o;26570:716::-;26733:4;26779:2;26754:45;;;26800:19;:17;:19::i;:::-;26821:4;26827:7;26836:5;26754:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26750:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27054:1;27037:6;:13;:18;27033:235;;;27083:40;;;;;;;;;;;;;;27033:235;27226:6;27220:13;27211:6;27207:2;27203:15;27196:38;26750:529;26923:54;;;26913:64;;;:6;:64;;;;26906:71;;;26570:716;;;;;;:::o;7437:269:2:-;7506:7;7692:4;7639:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;7629:69;;;;;;7622:76;;7437:269;;;:::o;3747:231::-;3825:7;3846:17;3865:18;3887:27;3898:4;3904:9;3887:10;:27::i;:::-;3845:69;;;;3925:18;3937:5;3925:11;:18::i;:::-;3961:9;3954:16;;;;3747:231;;;;:::o;39171:147:3:-;39308:6;39171:147;;;;;:::o;2198:747:2:-;2279:7;2288:12;2337:2;2317:9;:16;:22;2313:625;;;2356:9;2380;2404:7;2661:4;2650:9;2646:20;2640:27;2635:32;;2711:4;2700:9;2696:20;2690:27;2685:32;;2769:4;2758:9;2754:20;2748:27;2745:1;2740:36;2735:41;;2812:25;2823:4;2829:1;2832;2835;2812:10;:25::i;:::-;2805:32;;;;;;;;;2313:625;2886:1;2890:35;2870:56;;;;2198:747;;;;;;:::o;591:521::-;669:20;660:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;656:449;;;706:7;;656:449;767:29;758:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;754:351;;;813:34;;;;;;;;;;:::i;:::-;;;;;;;;754:351;878:35;869:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;865:240;;;930:41;;;;;;;;;;:::i;:::-;;;;;;;;865:240;1002:30;993:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;989:116;;;1049:44;;;;;;;;;;:::i;:::-;;;;;;;;989:116;591:521;;:::o;5199:1520::-;5330:7;5339:12;6264:66;6259:1;6251:10;;:79;6247:163;;;6363:1;6367:30;6347:51;;;;;;6247:163;6507:14;6524:24;6534:4;6540:1;6543;6546;6524:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6507:41;;6581:1;6563:20;;:6;:20;;;6559:103;;;6616:1;6620:29;6600:50;;;;;;;6559:103;6682:6;6690:20;6674:37;;;;;5199:1520;;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:7:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:::-;2412:8;2422:6;2472:3;2465:4;2457:6;2453:17;2449:27;2439:122;;2480:79;;:::i;:::-;2439:122;2593:6;2580:20;2570:30;;2623:18;2615:6;2612:30;2609:117;;;2645:79;;:::i;:::-;2609:117;2759:4;2751:6;2747:17;2735:29;;2813:3;2805:4;2797:6;2793:17;2783:8;2779:32;2776:41;2773:128;;;2820:79;;:::i;:::-;2773:128;2339:568;;;;;:::o;2930:370::-;3001:5;3050:3;3043:4;3035:6;3031:17;3027:27;3017:122;;3058:79;;:::i;:::-;3017:122;3175:6;3162:20;3200:94;3290:3;3282:6;3275:4;3267:6;3263:17;3200:94;:::i;:::-;3191:103;;3007:293;2930:370;;;;:::o;3306:133::-;3349:5;3387:6;3374:20;3365:29;;3403:30;3427:5;3403:30;:::i;:::-;3306:133;;;;:::o;3445:137::-;3490:5;3528:6;3515:20;3506:29;;3544:32;3570:5;3544:32;:::i;:::-;3445:137;;;;:::o;3588:141::-;3644:5;3675:6;3669:13;3660:22;;3691:32;3717:5;3691:32;:::i;:::-;3588:141;;;;:::o;3748:552::-;3805:8;3815:6;3865:3;3858:4;3850:6;3846:17;3842:27;3832:122;;3873:79;;:::i;:::-;3832:122;3986:6;3973:20;3963:30;;4016:18;4008:6;4005:30;4002:117;;;4038:79;;:::i;:::-;4002:117;4152:4;4144:6;4140:17;4128:29;;4206:3;4198:4;4190:6;4186:17;4176:8;4172:32;4169:41;4166:128;;;4213:79;;:::i;:::-;4166:128;3748:552;;;;;:::o;4319:338::-;4374:5;4423:3;4416:4;4408:6;4404:17;4400:27;4390:122;;4431:79;;:::i;:::-;4390:122;4548:6;4535:20;4573:78;4647:3;4639:6;4632:4;4624:6;4620:17;4573:78;:::i;:::-;4564:87;;4380:277;4319:338;;;;:::o;4677:340::-;4733:5;4782:3;4775:4;4767:6;4763:17;4759:27;4749:122;;4790:79;;:::i;:::-;4749:122;4907:6;4894:20;4932:79;5007:3;4999:6;4992:4;4984:6;4980:17;4932:79;:::i;:::-;4923:88;;4739:278;4677:340;;;;:::o;5023:139::-;5069:5;5107:6;5094:20;5085:29;;5123:33;5150:5;5123:33;:::i;:::-;5023:139;;;;:::o;5168:329::-;5227:6;5276:2;5264:9;5255:7;5251:23;5247:32;5244:119;;;5282:79;;:::i;:::-;5244:119;5402:1;5427:53;5472:7;5463:6;5452:9;5448:22;5427:53;:::i;:::-;5417:63;;5373:117;5168:329;;;;:::o;5503:474::-;5571:6;5579;5628:2;5616:9;5607:7;5603:23;5599:32;5596:119;;;5634:79;;:::i;:::-;5596:119;5754:1;5779:53;5824:7;5815:6;5804:9;5800:22;5779:53;:::i;:::-;5769:63;;5725:117;5881:2;5907:53;5952:7;5943:6;5932:9;5928:22;5907:53;:::i;:::-;5897:63;;5852:118;5503:474;;;;;:::o;5983:619::-;6060:6;6068;6076;6125:2;6113:9;6104:7;6100:23;6096:32;6093:119;;;6131:79;;:::i;:::-;6093:119;6251:1;6276:53;6321:7;6312:6;6301:9;6297:22;6276:53;:::i;:::-;6266:63;;6222:117;6378:2;6404:53;6449:7;6440:6;6429:9;6425:22;6404:53;:::i;:::-;6394:63;;6349:118;6506:2;6532:53;6577:7;6568:6;6557:9;6553:22;6532:53;:::i;:::-;6522:63;;6477:118;5983:619;;;;;:::o;6608:943::-;6703:6;6711;6719;6727;6776:3;6764:9;6755:7;6751:23;6747:33;6744:120;;;6783:79;;:::i;:::-;6744:120;6903:1;6928:53;6973:7;6964:6;6953:9;6949:22;6928:53;:::i;:::-;6918:63;;6874:117;7030:2;7056:53;7101:7;7092:6;7081:9;7077:22;7056:53;:::i;:::-;7046:63;;7001:118;7158:2;7184:53;7229:7;7220:6;7209:9;7205:22;7184:53;:::i;:::-;7174:63;;7129:118;7314:2;7303:9;7299:18;7286:32;7345:18;7337:6;7334:30;7331:117;;;7367:79;;:::i;:::-;7331:117;7472:62;7526:7;7517:6;7506:9;7502:22;7472:62;:::i;:::-;7462:72;;7257:287;6608:943;;;;;;;:::o;7557:468::-;7622:6;7630;7679:2;7667:9;7658:7;7654:23;7650:32;7647:119;;;7685:79;;:::i;:::-;7647:119;7805:1;7830:53;7875:7;7866:6;7855:9;7851:22;7830:53;:::i;:::-;7820:63;;7776:117;7932:2;7958:50;8000:7;7991:6;7980:9;7976:22;7958:50;:::i;:::-;7948:60;;7903:115;7557:468;;;;;:::o;8031:474::-;8099:6;8107;8156:2;8144:9;8135:7;8131:23;8127:32;8124:119;;;8162:79;;:::i;:::-;8124:119;8282:1;8307:53;8352:7;8343:6;8332:9;8328:22;8307:53;:::i;:::-;8297:63;;8253:117;8409:2;8435:53;8480:7;8471:6;8460:9;8456:22;8435:53;:::i;:::-;8425:63;;8380:118;8031:474;;;;;:::o;8511:934::-;8633:6;8641;8649;8657;8706:2;8694:9;8685:7;8681:23;8677:32;8674:119;;;8712:79;;:::i;:::-;8674:119;8860:1;8849:9;8845:17;8832:31;8890:18;8882:6;8879:30;8876:117;;;8912:79;;:::i;:::-;8876:117;9025:80;9097:7;9088:6;9077:9;9073:22;9025:80;:::i;:::-;9007:98;;;;8803:312;9182:2;9171:9;9167:18;9154:32;9213:18;9205:6;9202:30;9199:117;;;9235:79;;:::i;:::-;9199:117;9348:80;9420:7;9411:6;9400:9;9396:22;9348:80;:::i;:::-;9330:98;;;;9125:313;8511:934;;;;;;;:::o;9451:678::-;9541:6;9549;9598:2;9586:9;9577:7;9573:23;9569:32;9566:119;;;9604:79;;:::i;:::-;9566:119;9752:1;9741:9;9737:17;9724:31;9782:18;9774:6;9771:30;9768:117;;;9804:79;;:::i;:::-;9768:117;9909:78;9979:7;9970:6;9959:9;9955:22;9909:78;:::i;:::-;9899:88;;9695:302;10036:2;10062:50;10104:7;10095:6;10084:9;10080:22;10062:50;:::i;:::-;10052:60;;10007:115;9451:678;;;;;:::o;10135:323::-;10191:6;10240:2;10228:9;10219:7;10215:23;10211:32;10208:119;;;10246:79;;:::i;:::-;10208:119;10366:1;10391:50;10433:7;10424:6;10413:9;10409:22;10391:50;:::i;:::-;10381:60;;10337:114;10135:323;;;;:::o;10464:327::-;10522:6;10571:2;10559:9;10550:7;10546:23;10542:32;10539:119;;;10577:79;;:::i;:::-;10539:119;10697:1;10722:52;10766:7;10757:6;10746:9;10742:22;10722:52;:::i;:::-;10712:62;;10668:116;10464:327;;;;:::o;10797:349::-;10866:6;10915:2;10903:9;10894:7;10890:23;10886:32;10883:119;;;10921:79;;:::i;:::-;10883:119;11041:1;11066:63;11121:7;11112:6;11101:9;11097:22;11066:63;:::i;:::-;11056:73;;11012:127;10797:349;;;;:::o;11152:957::-;11246:6;11254;11262;11270;11278;11327:3;11315:9;11306:7;11302:23;11298:33;11295:120;;;11334:79;;:::i;:::-;11295:120;11482:1;11471:9;11467:17;11454:31;11512:18;11504:6;11501:30;11498:117;;;11534:79;;:::i;:::-;11498:117;11647:64;11703:7;11694:6;11683:9;11679:22;11647:64;:::i;:::-;11629:82;;;;11425:296;11760:2;11786:53;11831:7;11822:6;11811:9;11807:22;11786:53;:::i;:::-;11776:63;;11731:118;11888:2;11914:53;11959:7;11950:6;11939:9;11935:22;11914:53;:::i;:::-;11904:63;;11859:118;12016:2;12042:50;12084:7;12075:6;12064:9;12060:22;12042:50;:::i;:::-;12032:60;;11987:115;11152:957;;;;;;;;:::o;12115:509::-;12184:6;12233:2;12221:9;12212:7;12208:23;12204:32;12201:119;;;12239:79;;:::i;:::-;12201:119;12387:1;12376:9;12372:17;12359:31;12417:18;12409:6;12406:30;12403:117;;;12439:79;;:::i;:::-;12403:117;12544:63;12599:7;12590:6;12579:9;12575:22;12544:63;:::i;:::-;12534:73;;12330:287;12115:509;;;;:::o;12630:329::-;12689:6;12738:2;12726:9;12717:7;12713:23;12709:32;12706:119;;;12744:79;;:::i;:::-;12706:119;12864:1;12889:53;12934:7;12925:6;12914:9;12910:22;12889:53;:::i;:::-;12879:63;;12835:117;12630:329;;;;:::o;12965:179::-;13034:10;13055:46;13097:3;13089:6;13055:46;:::i;:::-;13133:4;13128:3;13124:14;13110:28;;12965:179;;;;:::o;13150:118::-;13237:24;13255:5;13237:24;:::i;:::-;13232:3;13225:37;13150:118;;:::o;13274:157::-;13379:45;13399:24;13417:5;13399:24;:::i;:::-;13379:45;:::i;:::-;13374:3;13367:58;13274:157;;:::o;13467:732::-;13586:3;13615:54;13663:5;13615:54;:::i;:::-;13685:86;13764:6;13759:3;13685:86;:::i;:::-;13678:93;;13795:56;13845:5;13795:56;:::i;:::-;13874:7;13905:1;13890:284;13915:6;13912:1;13909:13;13890:284;;;13991:6;13985:13;14018:63;14077:3;14062:13;14018:63;:::i;:::-;14011:70;;14104:60;14157:6;14104:60;:::i;:::-;14094:70;;13950:224;13937:1;13934;13930:9;13925:14;;13890:284;;;13894:14;14190:3;14183:10;;13591:608;;;13467:732;;;;:::o;14205:109::-;14286:21;14301:5;14286:21;:::i;:::-;14281:3;14274:34;14205:109;;:::o;14320:118::-;14407:24;14425:5;14407:24;:::i;:::-;14402:3;14395:37;14320:118;;:::o;14444:157::-;14549:45;14569:24;14587:5;14569:24;:::i;:::-;14549:45;:::i;:::-;14544:3;14537:58;14444:157;;:::o;14607:360::-;14693:3;14721:38;14753:5;14721:38;:::i;:::-;14775:70;14838:6;14833:3;14775:70;:::i;:::-;14768:77;;14854:52;14899:6;14894:3;14887:4;14880:5;14876:16;14854:52;:::i;:::-;14931:29;14953:6;14931:29;:::i;:::-;14926:3;14922:39;14915:46;;14697:270;14607:360;;;;:::o;14973:364::-;15061:3;15089:39;15122:5;15089:39;:::i;:::-;15144:71;15208:6;15203:3;15144:71;:::i;:::-;15137:78;;15224:52;15269:6;15264:3;15257:4;15250:5;15246:16;15224:52;:::i;:::-;15301:29;15323:6;15301:29;:::i;:::-;15296:3;15292:39;15285:46;;15065:272;14973:364;;;;:::o;15343:377::-;15449:3;15477:39;15510:5;15477:39;:::i;:::-;15532:89;15614:6;15609:3;15532:89;:::i;:::-;15525:96;;15630:52;15675:6;15670:3;15663:4;15656:5;15652:16;15630:52;:::i;:::-;15707:6;15702:3;15698:16;15691:23;;15453:267;15343:377;;;;:::o;15726:366::-;15868:3;15889:67;15953:2;15948:3;15889:67;:::i;:::-;15882:74;;15965:93;16054:3;15965:93;:::i;:::-;16083:2;16078:3;16074:12;16067:19;;15726:366;;;:::o;16098:::-;16240:3;16261:67;16325:2;16320:3;16261:67;:::i;:::-;16254:74;;16337:93;16426:3;16337:93;:::i;:::-;16455:2;16450:3;16446:12;16439:19;;16098:366;;;:::o;16470:402::-;16630:3;16651:85;16733:2;16728:3;16651:85;:::i;:::-;16644:92;;16745:93;16834:3;16745:93;:::i;:::-;16863:2;16858:3;16854:12;16847:19;;16470:402;;;:::o;16878:366::-;17020:3;17041:67;17105:2;17100:3;17041:67;:::i;:::-;17034:74;;17117:93;17206:3;17117:93;:::i;:::-;17235:2;17230:3;17226:12;17219:19;;16878:366;;;:::o;17250:::-;17392:3;17413:67;17477:2;17472:3;17413:67;:::i;:::-;17406:74;;17489:93;17578:3;17489:93;:::i;:::-;17607:2;17602:3;17598:12;17591:19;;17250:366;;;:::o;17622:::-;17764:3;17785:67;17849:2;17844:3;17785:67;:::i;:::-;17778:74;;17861:93;17950:3;17861:93;:::i;:::-;17979:2;17974:3;17970:12;17963:19;;17622:366;;;:::o;17994:398::-;18153:3;18174:83;18255:1;18250:3;18174:83;:::i;:::-;18167:90;;18266:93;18355:3;18266:93;:::i;:::-;18384:1;18379:3;18375:11;18368:18;;17994:398;;;:::o;18398:108::-;18475:24;18493:5;18475:24;:::i;:::-;18470:3;18463:37;18398:108;;:::o;18512:118::-;18599:24;18617:5;18599:24;:::i;:::-;18594:3;18587:37;18512:118;;:::o;18636:157::-;18741:45;18761:24;18779:5;18761:24;:::i;:::-;18741:45;:::i;:::-;18736:3;18729:58;18636:157;;:::o;18799:112::-;18882:22;18898:5;18882:22;:::i;:::-;18877:3;18870:35;18799:112;;:::o;18917:538::-;19085:3;19100:75;19171:3;19162:6;19100:75;:::i;:::-;19200:2;19195:3;19191:12;19184:19;;19213:75;19284:3;19275:6;19213:75;:::i;:::-;19313:2;19308:3;19304:12;19297:19;;19326:75;19397:3;19388:6;19326:75;:::i;:::-;19426:2;19421:3;19417:12;19410:19;;19446:3;19439:10;;18917:538;;;;;;:::o;19461:435::-;19641:3;19663:95;19754:3;19745:6;19663:95;:::i;:::-;19656:102;;19775:95;19866:3;19857:6;19775:95;:::i;:::-;19768:102;;19887:3;19880:10;;19461:435;;;;;:::o;19902:522::-;20115:3;20137:148;20281:3;20137:148;:::i;:::-;20130:155;;20295:75;20366:3;20357:6;20295:75;:::i;:::-;20395:2;20390:3;20386:12;20379:19;;20415:3;20408:10;;19902:522;;;;:::o;20430:379::-;20614:3;20636:147;20779:3;20636:147;:::i;:::-;20629:154;;20800:3;20793:10;;20430:379;;;:::o;20815:222::-;20908:4;20946:2;20935:9;20931:18;20923:26;;20959:71;21027:1;21016:9;21012:17;21003:6;20959:71;:::i;:::-;20815:222;;;;:::o;21043:640::-;21238:4;21276:3;21265:9;21261:19;21253:27;;21290:71;21358:1;21347:9;21343:17;21334:6;21290:71;:::i;:::-;21371:72;21439:2;21428:9;21424:18;21415:6;21371:72;:::i;:::-;21453;21521:2;21510:9;21506:18;21497:6;21453:72;:::i;:::-;21572:9;21566:4;21562:20;21557:2;21546:9;21542:18;21535:48;21600:76;21671:4;21662:6;21600:76;:::i;:::-;21592:84;;21043:640;;;;;;;:::o;21689:373::-;21832:4;21870:2;21859:9;21855:18;21847:26;;21919:9;21913:4;21909:20;21905:1;21894:9;21890:17;21883:47;21947:108;22050:4;22041:6;21947:108;:::i;:::-;21939:116;;21689:373;;;;:::o;22068:210::-;22155:4;22193:2;22182:9;22178:18;22170:26;;22206:65;22268:1;22257:9;22253:17;22244:6;22206:65;:::i;:::-;22068:210;;;;:::o;22284:545::-;22457:4;22495:3;22484:9;22480:19;22472:27;;22509:71;22577:1;22566:9;22562:17;22553:6;22509:71;:::i;:::-;22590:68;22654:2;22643:9;22639:18;22630:6;22590:68;:::i;:::-;22668:72;22736:2;22725:9;22721:18;22712:6;22668:72;:::i;:::-;22750;22818:2;22807:9;22803:18;22794:6;22750:72;:::i;:::-;22284:545;;;;;;;:::o;22835:313::-;22948:4;22986:2;22975:9;22971:18;22963:26;;23035:9;23029:4;23025:20;23021:1;23010:9;23006:17;22999:47;23063:78;23136:4;23127:6;23063:78;:::i;:::-;23055:86;;22835:313;;;;:::o;23154:419::-;23320:4;23358:2;23347:9;23343:18;23335:26;;23407:9;23401:4;23397:20;23393:1;23382:9;23378:17;23371:47;23435:131;23561:4;23435:131;:::i;:::-;23427:139;;23154:419;;;:::o;23579:::-;23745:4;23783:2;23772:9;23768:18;23760:26;;23832:9;23826:4;23822:20;23818:1;23807:9;23803:17;23796:47;23860:131;23986:4;23860:131;:::i;:::-;23852:139;;23579:419;;;:::o;24004:::-;24170:4;24208:2;24197:9;24193:18;24185:26;;24257:9;24251:4;24247:20;24243:1;24232:9;24228:17;24221:47;24285:131;24411:4;24285:131;:::i;:::-;24277:139;;24004:419;;;:::o;24429:::-;24595:4;24633:2;24622:9;24618:18;24610:26;;24682:9;24676:4;24672:20;24668:1;24657:9;24653:17;24646:47;24710:131;24836:4;24710:131;:::i;:::-;24702:139;;24429:419;;;:::o;24854:::-;25020:4;25058:2;25047:9;25043:18;25035:26;;25107:9;25101:4;25097:20;25093:1;25082:9;25078:17;25071:47;25135:131;25261:4;25135:131;:::i;:::-;25127:139;;24854:419;;;:::o;25279:222::-;25372:4;25410:2;25399:9;25395:18;25387:26;;25423:71;25491:1;25480:9;25476:17;25467:6;25423:71;:::i;:::-;25279:222;;;;:::o;25507:129::-;25541:6;25568:20;;:::i;:::-;25558:30;;25597:33;25625:4;25617:6;25597:33;:::i;:::-;25507:129;;;:::o;25642:75::-;25675:6;25708:2;25702:9;25692:19;;25642:75;:::o;25723:311::-;25800:4;25890:18;25882:6;25879:30;25876:56;;;25912:18;;:::i;:::-;25876:56;25962:4;25954:6;25950:17;25942:25;;26022:4;26016;26012:15;26004:23;;25723:311;;;:::o;26040:307::-;26101:4;26191:18;26183:6;26180:30;26177:56;;;26213:18;;:::i;:::-;26177:56;26251:29;26273:6;26251:29;:::i;:::-;26243:37;;26335:4;26329;26325:15;26317:23;;26040:307;;;:::o;26353:308::-;26415:4;26505:18;26497:6;26494:30;26491:56;;;26527:18;;:::i;:::-;26491:56;26565:29;26587:6;26565:29;:::i;:::-;26557:37;;26649:4;26643;26639:15;26631:23;;26353:308;;;:::o;26667:132::-;26734:4;26757:3;26749:11;;26787:4;26782:3;26778:14;26770:22;;26667:132;;;:::o;26805:114::-;26872:6;26906:5;26900:12;26890:22;;26805:114;;;:::o;26925:98::-;26976:6;27010:5;27004:12;26994:22;;26925:98;;;:::o;27029:99::-;27081:6;27115:5;27109:12;27099:22;;27029:99;;;:::o;27134:113::-;27204:4;27236;27231:3;27227:14;27219:22;;27134:113;;;:::o;27253:184::-;27352:11;27386:6;27381:3;27374:19;27426:4;27421:3;27417:14;27402:29;;27253:184;;;;:::o;27443:168::-;27526:11;27560:6;27555:3;27548:19;27600:4;27595:3;27591:14;27576:29;;27443:168;;;;:::o;27617:147::-;27718:11;27755:3;27740:18;;27617:147;;;;:::o;27770:169::-;27854:11;27888:6;27883:3;27876:19;27928:4;27923:3;27919:14;27904:29;;27770:169;;;;:::o;27945:148::-;28047:11;28084:3;28069:18;;27945:148;;;;:::o;28099:305::-;28139:3;28158:20;28176:1;28158:20;:::i;:::-;28153:25;;28192:20;28210:1;28192:20;:::i;:::-;28187:25;;28346:1;28278:66;28274:74;28271:1;28268:81;28265:107;;;28352:18;;:::i;:::-;28265:107;28396:1;28393;28389:9;28382:16;;28099:305;;;;:::o;28410:191::-;28450:4;28470:20;28488:1;28470:20;:::i;:::-;28465:25;;28504:20;28522:1;28504:20;:::i;:::-;28499:25;;28543:1;28540;28537:8;28534:34;;;28548:18;;:::i;:::-;28534:34;28593:1;28590;28586:9;28578:17;;28410:191;;;;:::o;28607:96::-;28644:7;28673:24;28691:5;28673:24;:::i;:::-;28662:35;;28607:96;;;:::o;28709:90::-;28743:7;28786:5;28779:13;28772:21;28761:32;;28709:90;;;:::o;28805:77::-;28842:7;28871:5;28860:16;;28805:77;;;:::o;28888:149::-;28924:7;28964:66;28957:5;28953:78;28942:89;;28888:149;;;:::o;29043:126::-;29080:7;29120:42;29113:5;29109:54;29098:65;;29043:126;;;:::o;29175:77::-;29212:7;29241:5;29230:16;;29175:77;;;:::o;29258:86::-;29293:7;29333:4;29326:5;29322:16;29311:27;;29258:86;;;:::o;29350:154::-;29434:6;29429:3;29424;29411:30;29496:1;29487:6;29482:3;29478:16;29471:27;29350:154;;;:::o;29510:307::-;29578:1;29588:113;29602:6;29599:1;29596:13;29588:113;;;29687:1;29682:3;29678:11;29672:18;29668:1;29663:3;29659:11;29652:39;29624:2;29621:1;29617:10;29612:15;;29588:113;;;29719:6;29716:1;29713:13;29710:101;;;29799:1;29790:6;29785:3;29781:16;29774:27;29710:101;29559:258;29510:307;;;:::o;29823:320::-;29867:6;29904:1;29898:4;29894:12;29884:22;;29951:1;29945:4;29941:12;29972:18;29962:81;;30028:4;30020:6;30016:17;30006:27;;29962:81;30090:2;30082:6;30079:14;30059:18;30056:38;30053:84;;;30109:18;;:::i;:::-;30053:84;29874:269;29823:320;;;:::o;30149:281::-;30232:27;30254:4;30232:27;:::i;:::-;30224:6;30220:40;30362:6;30350:10;30347:22;30326:18;30314:10;30311:34;30308:62;30305:88;;;30373:18;;:::i;:::-;30305:88;30413:10;30409:2;30402:22;30192:238;30149:281;;:::o;30436:233::-;30475:3;30498:24;30516:5;30498:24;:::i;:::-;30489:33;;30544:66;30537:5;30534:77;30531:103;;;30614:18;;:::i;:::-;30531:103;30661:1;30654:5;30650:13;30643:20;;30436:233;;;:::o;30675:100::-;30714:7;30743:26;30763:5;30743:26;:::i;:::-;30732:37;;30675:100;;;:::o;30781:79::-;30820:7;30849:5;30838:16;;30781:79;;;:::o;30866:94::-;30905:7;30934:20;30948:5;30934:20;:::i;:::-;30923:31;;30866:94;;;:::o;30966:79::-;31005:7;31034:5;31023:16;;30966:79;;;:::o;31051:180::-;31099:77;31096:1;31089:88;31196:4;31193:1;31186:15;31220:4;31217:1;31210:15;31237:180;31285:77;31282:1;31275:88;31382:4;31379:1;31372:15;31406:4;31403:1;31396:15;31423:180;31471:77;31468:1;31461:88;31568:4;31565:1;31558:15;31592:4;31589:1;31582:15;31609:180;31657:77;31654:1;31647:88;31754:4;31751:1;31744:15;31778:4;31775:1;31768:15;31795:180;31843:77;31840:1;31833:88;31940:4;31937:1;31930:15;31964:4;31961:1;31954:15;31981:117;32090:1;32087;32080:12;32104:117;32213:1;32210;32203:12;32227:117;32336:1;32333;32326:12;32350:117;32459:1;32456;32449:12;32473:117;32582:1;32579;32572:12;32596:117;32705:1;32702;32695:12;32719:102;32760:6;32811:2;32807:7;32802:2;32795:5;32791:14;32787:28;32777:38;;32719:102;;;:::o;32827:94::-;32860:8;32908:5;32904:2;32900:14;32879:35;;32827:94;;;:::o;32927:174::-;33067:26;33063:1;33055:6;33051:14;33044:50;32927:174;:::o;33107:181::-;33247:33;33243:1;33235:6;33231:14;33224:57;33107:181;:::o;33294:214::-;33434:66;33430:1;33422:6;33418:14;33411:90;33294:214;:::o;33514:225::-;33654:34;33650:1;33642:6;33638:14;33631:58;33723:8;33718:2;33710:6;33706:15;33699:33;33514:225;:::o;33745:221::-;33885:34;33881:1;33873:6;33869:14;33862:58;33954:4;33949:2;33941:6;33937:15;33930:29;33745:221;:::o;33972:182::-;34112:34;34108:1;34100:6;34096:14;34089:58;33972:182;:::o;34160:114::-;;:::o;34280:122::-;34353:24;34371:5;34353:24;:::i;:::-;34346:5;34343:35;34333:63;;34392:1;34389;34382:12;34333:63;34280:122;:::o;34408:116::-;34478:21;34493:5;34478:21;:::i;:::-;34471:5;34468:32;34458:60;;34514:1;34511;34504:12;34458:60;34408:116;:::o;34530:120::-;34602:23;34619:5;34602:23;:::i;:::-;34595:5;34592:34;34582:62;;34640:1;34637;34630:12;34582:62;34530:120;:::o;34656:122::-;34729:24;34747:5;34729:24;:::i;:::-;34722:5;34719:35;34709:63;;34768:1;34765;34758:12;34709:63;34656:122;:::o
Swarm Source
ipfs://6f0d7c4d1a1d8aa9e5d1c7ad2c8b7ac42655fbdc9b9697f7d2d21a4c8f5d452a
Loading...
Loading
Loading...
Loading
[ 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.