Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,000 Loopsssd
Holders
2,112
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 LoopsssdLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Loopssssd
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-12 */ // File: contracts/IMeta.sol // _,.---._ _,.---._ _ __ ,-,--. ,-,--. ,-,--. ,-,--. // _.-. ,-.' , - `. ,-.' , - `. .-`.' ,`. ,-.'- _\ ,-.'- _\ ,-.'- _\ ,-.'- _\ _,..---._ // .-,.'| /==/_, , - \ /==/_, , - \ /==/, - \/==/_ ,_.'/==/_ ,_.'/==/_ ,_.'/==/_ ,_.'/==/, - \ //|==|, | |==| .=. |==| .=. |==| _ .=. |\==\ \ \==\ \ \==\ \ \==\ \ |==| _ _\ //|==|- | |==|_ : ;=: - |==|_ : ;=: - |==| , '=',| \==\ -\ \==\ -\ \==\ -\ \==\ -\ |==| .=. | //|==|, | |==| , '=' |==| , '=' |==|- '..' _\==\ ,\ _\==\ ,\ _\==\ ,\ _\==\ ,\ |==|,| | -| //|==|- `-._\==\ - ,_ / \==\ - ,_ /|==|, | /==/\/ _ |/==/\/ _ |/==/\/ _ |/==/\/ _ ||==| '=' / ///==/ - , ,/'.='. - .' '.='. - .' /==/ - | \==\ - , /\==\ - , /\==\ - , /\==\ - , /|==|-, _`/ //`--`-----' `--`--'' `--`--'' `--`---' `--`---' `--`---' `--`---' `--`---' `-.`.____.' //creator : @TheLoopssessed //website : loopssssd.xyz pragma solidity ^0.8.0; interface IMeta { function getMetadata(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Strings.sol // 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); } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // 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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // 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 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // 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 tokenId of the next token 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 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @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 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 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 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 returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ 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: 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. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view 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 { 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; } /** * 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 ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * 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); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @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 See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _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 ''; } /** * @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)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _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 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 { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` 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 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _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 { 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 Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function 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) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try 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)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { 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 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; } /** * @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 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 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 returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/Loopssssd.sol //SPDX-License-Identifier: MIT // _,.---._ _,.---._ _ __ ,-,--. ,-,--. ,-,--. ,-,--. // _.-. ,-.' , - `. ,-.' , - `. .-`.' ,`. ,-.'- _\ ,-.'- _\ ,-.'- _\ ,-.'- _\ _,..---._ // .-,.'| /==/_, , - \ /==/_, , - \ /==/, - \/==/_ ,_.'/==/_ ,_.'/==/_ ,_.'/==/_ ,_.'/==/, - \ //|==|, | |==| .=. |==| .=. |==| _ .=. |\==\ \ \==\ \ \==\ \ \==\ \ |==| _ _\ //|==|- | |==|_ : ;=: - |==|_ : ;=: - |==| , '=',| \==\ -\ \==\ -\ \==\ -\ \==\ -\ |==| .=. | //|==|, | |==| , '=' |==| , '=' |==|- '..' _\==\ ,\ _\==\ ,\ _\==\ ,\ _\==\ ,\ |==|,| | -| //|==|- `-._\==\ - ,_ / \==\ - ,_ /|==|, | /==/\/ _ |/==/\/ _ |/==/\/ _ |/==/\/ _ ||==| '=' / ///==/ - , ,/'.='. - .' '.='. - .' /==/ - | \==\ - , /\==\ - , /\==\ - , /\==\ - , /|==|-, _`/ //`--`-----' `--`--'' `--`--'' `--`---' `--`---' `--`---' `--`---' `--`---' `-.`.____.' //creator : @TheLoopssessed //website : loopssssd.xyz pragma solidity ^0.8.0; contract Loopssssd is ERC721A, Ownable, Pausable { using Strings for uint256; uint256 public totalColSize = 5000; mapping(address => uint256) public mintList; uint256 public walletMintLimit = 2; bytes32 public WLMerkleRoot = 0xec85fdcc3b5d1f75860fbb011d86280c43ba670aa6bf82b9d1b2db18c12bbf93; address public mdProvider; string private baseTokenURI; bool public providerBasedURI; bool public WLFreeMintActive; bool public publicFreeMintActive; constructor ( string memory _name, string memory _symbol, string memory _baseTokenURI ) ERC721A(_name, _symbol) { baseTokenURI = _baseTokenURI; } modifier callerIsUser() { require(tx.origin == msg.sender, "Caller is contract"); _; } modifier onlyWLFreeMintActive() { require(WLFreeMintActive, "WL Minting is not active"); _; } modifier onlyPublicFreeMintActive() { require(publicFreeMintActive, "Public Minting is not active"); _; } function setMdProvider(address _mdProvider) external onlyOwner { mdProvider = _mdProvider; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "Token not existed"); require( providerBasedURI ? ( mdProvider != address(0) ) : ( keccak256(abi.encodePacked(baseTokenURI)) != keccak256(abi.encodePacked("")) ), "Invalid metadata provider address" ); return providerBasedURI ? IMeta(mdProvider).getMetadata(_tokenId) : string(abi.encodePacked(baseTokenURI, _tokenId.toString(),".json")); } function setBaseURI(string calldata _baseTokenURI) external onlyOwner { baseTokenURI = _baseTokenURI; } function _startTokenId() internal pure override returns (uint256) { return 1; } function setFreeWLMerkleRoot(bytes32 _WLMerkleRoot) external onlyOwner { WLMerkleRoot = _WLMerkleRoot; } function WLFreeMint(bytes32[] calldata _merkleProof, uint256 quantity) external payable onlyWLFreeMintActive callerIsUser { require(mintList[msg.sender] + quantity <= walletMintLimit, "Up to 2 mints allowed per wallet"); require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require( MerkleProof.verify(_merkleProof, WLMerkleRoot, leaf), "You are not whitelisted" ); mintList[msg.sender] += quantity; _safeMint(msg.sender, quantity); } function publicFreeMint(uint256 quantity) external payable onlyPublicFreeMintActive callerIsUser { require(mintList[msg.sender] + quantity <= walletMintLimit, "Up to 2 mints allowed per wallet"); require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE"); mintList[msg.sender] += quantity; _safeMint(msg.sender, quantity); } function teamMint(uint256 quantity) external payable onlyOwner { require(quantity > 0, "Invalid quantity"); require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE"); _safeMint(msg.sender, quantity); } function airdrop(address toAdd,uint256 quantity) external payable onlyOwner { require(quantity > 0, "Invalid quantity"); require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE"); _safeMint(toAdd, quantity); } function toggleProviderBasedURI() external onlyOwner { providerBasedURI = !providerBasedURI; } function toggleWLFreeMint() external onlyOwner { WLFreeMintActive = !WLFreeMintActive; } function togglePublicFreeMint() external onlyOwner { publicFreeMintActive = !publicFreeMintActive; } function toggleSoldOut() external onlyOwner { WLFreeMintActive = !WLFreeMintActive; publicFreeMintActive = !publicFreeMintActive; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function _beforeTokenTransfers( address from, address to, uint256 tokenId, uint256 quantity ) internal override(ERC721A) whenNotPaused { super._beforeTokenTransfers(from, to, tokenId, quantity); } function changeSupply(uint256 _decreaseAmount) external onlyOwner { require(_decreaseAmount > 0 ,"Amount must be greater than 0"); require(totalSupply() < totalColSize ,"Just sold out" ); require(totalColSize - _decreaseAmount >= totalSupply() ,"Insufficient amount" ); totalColSize -= _decreaseAmount; } function changeMintLimitPerWallet(uint256 _newWalletMintLimit) external onlyOwner { require(_newWalletMintLimit > 0 ,"Invalid value"); walletMintLimit = _newWalletMintLimit; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"WLFreeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"WLFreeMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAdd","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWalletMintLimit","type":"uint256"}],"name":"changeMintLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_decreaseAmount","type":"uint256"}],"name":"changeSupply","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mdProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"providerBasedURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicFreeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicFreeMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_WLMerkleRoot","type":"bytes32"}],"name":"setFreeWLMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mdProvider","type":"address"}],"name":"setMdProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"toggleProviderBasedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSoldOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWLFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalColSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526113886009556002600b557fec85fdcc3b5d1f75860fbb011d86280c43ba670aa6bf82b9d1b2db18c12bbf9360001b600c553480156200004357600080fd5b50604051620045da380380620045da833981810160405281019062000069919062000317565b8282816002908051906020019062000083929190620001e9565b5080600390805190602001906200009c929190620001e9565b50620000ad6200011260201b60201c565b6000819055505050620000d5620000c96200011b60201b60201c565b6200012360201b60201c565b6000600860146101000a81548160ff02191690831515021790555080600e908051906020019062000108929190620001e9565b5050505062000554565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f79062000465565b90600052602060002090601f0160209004810192826200021b576000855562000267565b82601f106200023657805160ff191683800117855562000267565b8280016001018555821562000267579182015b828111156200026657825182559160200191906001019062000249565b5b5090506200027691906200027a565b5090565b5b80821115620002955760008160009055506001016200027b565b5090565b6000620002b0620002aa84620003f9565b620003d0565b905082815260208101848484011115620002cf57620002ce62000534565b5b620002dc8482856200042f565b509392505050565b600082601f830112620002fc57620002fb6200052f565b5b81516200030e84826020860162000299565b91505092915050565b6000806000606084860312156200033357620003326200053e565b5b600084015167ffffffffffffffff81111562000354576200035362000539565b5b6200036286828701620002e4565b935050602084015167ffffffffffffffff81111562000386576200038562000539565b5b6200039486828701620002e4565b925050604084015167ffffffffffffffff811115620003b857620003b762000539565b5b620003c686828701620002e4565b9150509250925092565b6000620003dc620003ef565b9050620003ea82826200049b565b919050565b6000604051905090565b600067ffffffffffffffff82111562000417576200041662000500565b5b620004228262000543565b9050602081019050919050565b60005b838110156200044f57808201518184015260208101905062000432565b838111156200045f576000848401525b50505050565b600060028204905060018216806200047e57607f821691505b60208210811415620004955762000494620004d1565b5b50919050565b620004a68262000543565b810181811067ffffffffffffffff82111715620004c857620004c762000500565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61407680620005646000396000f3fe6080604052600436106102465760003560e01c806370a08231116101395780638ed21d6a116100b6578063bef432c61161007a578063bef432c61461079a578063c566fc15146107d7578063c87b56dd14610802578063e985e9c51461083f578063f2fde38b1461087c578063fec627e0146108a557610246565b80638ed21d6a146106db57806395d89b41146106f2578063a22cb4651461071d578063aea4832814610746578063b88d4fde1461077157610246565b80637bb232ad116100fd5780637bb232ad146106275780637dc64bba146106525780638456cb591461067d5780638ba4cc3c146106945780638da5cb5b146106b057610246565b806370a0823114610566578063715018a6146105a357806374c28561146105ba57806378c68e16146105e55780637a2c88f11461061057610246565b806340b29b4a116101c757806355f804b31161018b57806355f804b3146104a25780635c975abb146104cb5780636352211e146104f657806363b28ee6146105335780636f3fc2871461054f57610246565b806340b29b4a146103e057806342842e0e146104095780634ac50c901461043257806352148e731461044e5780635501298f1461047757610246565b806323b872dd1161020e57806323b872dd146103445780632d1c34e81461036d5780632fbba1151461038457806339a7919f146103a05780633f4ba83a146103c957610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612f7f565b6108ce565b60405161027f9190613587565b60405180910390f35b34801561029457600080fd5b5061029d610960565b6040516102aa91906135bd565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061306f565b6109f2565b6040516102e79190613520565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612eb2565b610a6e565b005b34801561032557600080fd5b5061032e610baf565b60405161033b91906137ff565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190612d9c565b610bc6565b005b34801561037957600080fd5b50610382610eeb565b005b61039e6004803603810190610399919061306f565b610f1f565b005b3480156103ac57600080fd5b506103c760048036038101906103c2919061306f565b610fce565b005b3480156103d557600080fd5b506103de6110d7565b005b3480156103ec57600080fd5b506104076004803603810190610402919061306f565b6110e9565b005b34801561041557600080fd5b50610430600480360381019061042b9190612d9c565b61113e565b005b61044c60048036038101906104479190612ef2565b61115e565b005b34801561045a57600080fd5b5061047560048036038101906104709190612d2f565b61141f565b005b34801561048357600080fd5b5061048c61146b565b6040516104999190613587565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612fd9565b61147e565b005b3480156104d757600080fd5b506104e061149c565b6040516104ed9190613587565b60405180910390f35b34801561050257600080fd5b5061051d6004803603810190610518919061306f565b6114b3565b60405161052a9190613520565b60405180910390f35b61054d6004803603810190610548919061306f565b6114c5565b005b34801561055b57600080fd5b506105646116cb565b005b34801561057257600080fd5b5061058d60048036038101906105889190612d2f565b6116ff565b60405161059a91906137ff565b60405180910390f35b3480156105af57600080fd5b506105b86117b8565b005b3480156105c657600080fd5b506105cf6117cc565b6040516105dc91906137ff565b60405180910390f35b3480156105f157600080fd5b506105fa6117d2565b6040516106079190613520565b60405180910390f35b34801561061c57600080fd5b506106256117f8565b005b34801561063357600080fd5b5061063c611856565b60405161064991906137ff565b60405180910390f35b34801561065e57600080fd5b5061066761185c565b6040516106749190613587565b60405180910390f35b34801561068957600080fd5b5061069261186f565b005b6106ae60048036038101906106a99190612eb2565b611881565b005b3480156106bc57600080fd5b506106c5611931565b6040516106d29190613520565b60405180910390f35b3480156106e757600080fd5b506106f061195b565b005b3480156106fe57600080fd5b5061070761198f565b60405161071491906135bd565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f9190612e72565b611a21565b005b34801561075257600080fd5b5061075b611b99565b60405161076891906135a2565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190612def565b611b9f565b005b3480156107a657600080fd5b506107c160048036038101906107bc9190612d2f565b611c12565b6040516107ce91906137ff565b60405180910390f35b3480156107e357600080fd5b506107ec611c2a565b6040516107f99190613587565b60405180910390f35b34801561080e57600080fd5b506108296004803603810190610824919061306f565b611c3d565b60405161083691906135bd565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190612d5c565b611e7e565b6040516108739190613587565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190612d2f565b611f12565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190612f52565b611f96565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096f90613a74565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90613a74565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b5050505050905090565b60006109fd82611fa8565b610a33576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a79826114b3565b90508073ffffffffffffffffffffffffffffffffffffffff16610a9a612007565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57610ac681610ac1612007565b611e7e565b610afc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bb961200f565b6001546000540303905090565b6000610bd182612018565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c38576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c44846120e6565b91509150610c5a8187610c55612007565b612108565b610ca657610c6f86610c6a612007565b611e7e565b610ca5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d0d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1a868686600161214c565b8015610d2557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610df385610dcf888887612166565b7c02000000000000000000000000000000000000000000000000000000001761218e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e7b576000600185019050600060046000838152602001908152602001600020541415610e79576000548114610e78578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ee386868660016121b9565b505050505050565b610ef36121bf565b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b610f276121bf565b60008111610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f61906136bf565b60405180910390fd5b60095481610f76610baf565b610f8091906138f9565b1115610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb89061361f565b60405180910390fd5b610fcb338261223d565b50565b610fd66121bf565b60008111611019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110109061365f565b60405180910390fd5b600954611024610baf565b10611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b906136df565b60405180910390fd5b61106c610baf565b8160095461107a9190613980565b10156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906137bf565b60405180910390fd5b80600960008282546110cd9190613980565b9250508190555050565b6110df6121bf565b6110e761225b565b565b6110f16121bf565b60008111611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b9061377f565b60405180910390fd5b80600b8190555050565b61115983838360405180602001604052806000815250611b9f565b505050565b600f60019054906101000a900460ff166111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a4906137df565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112129061379f565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126991906138f9565b11156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906136ff565b60405180910390fd5b600954816112b6610baf565b6112c091906138f9565b1115611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f89061361f565b60405180910390fd5b60003360405160200161131491906134aa565b60405160208183030381529060405280519060200120905061137a848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c54836122be565b6113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b09061371f565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461140891906138f9565b92505081905550611419338361223d565b50505050565b6114276121bf565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60019054906101000a900460ff1681565b6114866121bf565b8181600e9190611497929190612a82565b505050565b6000600860149054906101000a900460ff16905090565b60006114be82612018565b9050919050565b600f60029054906101000a900460ff16611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906135df565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115799061379f565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115d091906138f9565b1115611611576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611608906136ff565b60405180910390fd5b6009548161161d610baf565b61162791906138f9565b1115611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f9061361f565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b791906138f9565b925050819055506116c8338261223d565b50565b6116d36121bf565b600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611767576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117c06121bf565b6117ca60006122d5565b565b600b5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118006121bf565b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b60095481565b600f60029054906101000a900460ff1681565b6118776121bf565b61187f61239b565b565b6118896121bf565b600081116118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c3906136bf565b60405180910390fd5b600954816118d8610baf565b6118e291906138f9565b1115611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a9061361f565b60405180910390fd5b61192d828261223d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119636121bf565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60606003805461199e90613a74565b80601f01602080910402602001604051908101604052809291908181526020018280546119ca90613a74565b8015611a175780601f106119ec57610100808354040283529160200191611a17565b820191906000526020600020905b8154815290600101906020018083116119fa57829003601f168201915b5050505050905090565b611a29612007565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a9b612007565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b48612007565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8d9190613587565b60405180910390a35050565b600c5481565b611baa848484610bc6565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c0c57611bd5848484846123fe565b611c0b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a6020528060005260406000206000915090505481565b600f60009054906101000a900460ff1681565b6060611c4882611fa8565b611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e9061369f565b60405180910390fd5b600f60009054906101000a900460ff16611cef57604051602001611caa9061350b565b60405160208183030381529060405280519060200120600e604051602001611cd291906134c5565b604051602081830303815290604052805190602001201415611d43565b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d799061375f565b60405180910390fd5b600f60009054906101000a900460ff16611dc657600e611da18361255e565b604051602001611db29291906134dc565b604051602081830303815290604052611e77565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a574cea4836040518263ffffffff1660e01b8152600401611e2191906137ff565b60006040518083038186803b158015611e3957600080fd5b505afa158015611e4d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611e769190613026565b5b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f1a6121bf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f819061363f565b60405180910390fd5b611f93816122d5565b50565b611f9e6121bf565b80600c8190555050565b600081611fb361200f565b11158015611fc2575060005482105b8015612000575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061202761200f565b116120af576000548110156120ae5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120ac575b60008114156120a2576004600083600190039350838152602001908152602001600020549050612077565b80925050506120e1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b6121546126bf565b61216084848484612709565b50505050565b60008060e883901c905060e861217d86868461270f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6121c7612718565b73ffffffffffffffffffffffffffffffffffffffff166121e5611931565b73ffffffffffffffffffffffffffffffffffffffff161461223b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122329061373f565b60405180910390fd5b565b612257828260405180602001604052806000815250612720565b5050565b6122636127bd565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122a7612718565b6040516122b49190613520565b60405180910390a1565b6000826122cb8584612806565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123a36126bf565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123e7612718565b6040516123f49190613520565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612424612007565b8786866040518563ffffffff1660e01b8152600401612446949392919061353b565b602060405180830381600087803b15801561246057600080fd5b505af192505050801561249157506040513d601f19601f8201168201806040525081019061248e9190612fac565b60015b61250b573d80600081146124c1576040519150601f19603f3d011682016040523d82523d6000602084013e6124c6565b606091505b50600081511415612503576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156125a6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ba565b600082905060005b600082146125d85780806125c190613ad7565b915050600a826125d1919061394f565b91506125ae565b60008167ffffffffffffffff8111156125f4576125f3613c31565b5b6040519080825280601f01601f1916602001820160405280156126265781602001600182028036833780820191505090505b5090505b600085146126b35760018261263f9190613980565b9150600a8561264e9190613b44565b603061265a91906138f9565b60f81b8183815181106126705761266f613c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ac919061394f565b945061262a565b8093505050505b919050565b6126c761149c565b15612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe9061367f565b60405180910390fd5b565b50505050565b60009392505050565b600033905090565b61272a838361285c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127b857600080549050600083820390505b61276a60008683806001019450866123fe565b6127a0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127575781600054146127b557600080fd5b50505b505050565b6127c561149c565b612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb906135ff565b60405180910390fd5b565b60008082905060005b84518110156128515761283c8286838151811061282f5761282e613c02565b5b6020026020010151612a30565b9150808061284990613ad7565b91505061280f565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128c9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612904576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612911600084838561214c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612988836129796000866000612166565b61298285612a5b565b1761218e565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129ac57806000819055505050612a2b60008483856121b9565b505050565b6000818310612a4857612a438284612a6b565b612a53565b612a528383612a6b565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612a8e90613a74565b90600052602060002090601f016020900481019282612ab05760008555612af7565b82601f10612ac957803560ff1916838001178555612af7565b82800160010185558215612af7579182015b82811115612af6578235825591602001919060010190612adb565b5b509050612b049190612b08565b5090565b5b80821115612b21576000816000905550600101612b09565b5090565b6000612b38612b338461383f565b61381a565b905082815260208101848484011115612b5457612b53613c6f565b5b612b5f848285613a32565b509392505050565b6000612b7a612b7584613870565b61381a565b905082815260208101848484011115612b9657612b95613c6f565b5b612ba1848285613a41565b509392505050565b600081359050612bb881613fcd565b92915050565b60008083601f840112612bd457612bd3613c65565b5b8235905067ffffffffffffffff811115612bf157612bf0613c60565b5b602083019150836020820283011115612c0d57612c0c613c6a565b5b9250929050565b600081359050612c2381613fe4565b92915050565b600081359050612c3881613ffb565b92915050565b600081359050612c4d81614012565b92915050565b600081519050612c6281614012565b92915050565b600082601f830112612c7d57612c7c613c65565b5b8135612c8d848260208601612b25565b91505092915050565b60008083601f840112612cac57612cab613c65565b5b8235905067ffffffffffffffff811115612cc957612cc8613c60565b5b602083019150836001820283011115612ce557612ce4613c6a565b5b9250929050565b600082601f830112612d0157612d00613c65565b5b8151612d11848260208601612b67565b91505092915050565b600081359050612d2981614029565b92915050565b600060208284031215612d4557612d44613c79565b5b6000612d5384828501612ba9565b91505092915050565b60008060408385031215612d7357612d72613c79565b5b6000612d8185828601612ba9565b9250506020612d9285828601612ba9565b9150509250929050565b600080600060608486031215612db557612db4613c79565b5b6000612dc386828701612ba9565b9350506020612dd486828701612ba9565b9250506040612de586828701612d1a565b9150509250925092565b60008060008060808587031215612e0957612e08613c79565b5b6000612e1787828801612ba9565b9450506020612e2887828801612ba9565b9350506040612e3987828801612d1a565b925050606085013567ffffffffffffffff811115612e5a57612e59613c74565b5b612e6687828801612c68565b91505092959194509250565b60008060408385031215612e8957612e88613c79565b5b6000612e9785828601612ba9565b9250506020612ea885828601612c14565b9150509250929050565b60008060408385031215612ec957612ec8613c79565b5b6000612ed785828601612ba9565b9250506020612ee885828601612d1a565b9150509250929050565b600080600060408486031215612f0b57612f0a613c79565b5b600084013567ffffffffffffffff811115612f2957612f28613c74565b5b612f3586828701612bbe565b93509350506020612f4886828701612d1a565b9150509250925092565b600060208284031215612f6857612f67613c79565b5b6000612f7684828501612c29565b91505092915050565b600060208284031215612f9557612f94613c79565b5b6000612fa384828501612c3e565b91505092915050565b600060208284031215612fc257612fc1613c79565b5b6000612fd084828501612c53565b91505092915050565b60008060208385031215612ff057612fef613c79565b5b600083013567ffffffffffffffff81111561300e5761300d613c74565b5b61301a85828601612c96565b92509250509250929050565b60006020828403121561303c5761303b613c79565b5b600082015167ffffffffffffffff81111561305a57613059613c74565b5b61306684828501612cec565b91505092915050565b60006020828403121561308557613084613c79565b5b600061309384828501612d1a565b91505092915050565b6130a5816139b4565b82525050565b6130bc6130b7826139b4565b613b20565b82525050565b6130cb816139c6565b82525050565b6130da816139d2565b82525050565b60006130eb826138b6565b6130f581856138cc565b9350613105818560208601613a41565b61310e81613c7e565b840191505092915050565b6000613124826138c1565b61312e81856138dd565b935061313e818560208601613a41565b61314781613c7e565b840191505092915050565b600061315d826138c1565b61316781856138ee565b9350613177818560208601613a41565b80840191505092915050565b6000815461319081613a74565b61319a81866138ee565b945060018216600081146131b557600181146131c6576131f9565b60ff198316865281860193506131f9565b6131cf856138a1565b60005b838110156131f1578154818901526001820191506020810190506131d2565b838801955050505b50505092915050565b600061320f601c836138dd565b915061321a82613c9c565b602082019050919050565b60006132326014836138dd565b915061323d82613cc5565b602082019050919050565b6000613255600f836138dd565b915061326082613cee565b602082019050919050565b60006132786026836138dd565b915061328382613d17565b604082019050919050565b600061329b601d836138dd565b91506132a682613d66565b602082019050919050565b60006132be6010836138dd565b91506132c982613d8f565b602082019050919050565b60006132e16011836138dd565b91506132ec82613db8565b602082019050919050565b60006133046010836138dd565b915061330f82613de1565b602082019050919050565b6000613327600d836138dd565b915061333282613e0a565b602082019050919050565b600061334a6020836138dd565b915061335582613e33565b602082019050919050565b600061336d6017836138dd565b915061337882613e5c565b602082019050919050565b60006133906005836138ee565b915061339b82613e85565b600582019050919050565b60006133b36020836138dd565b91506133be82613eae565b602082019050919050565b60006133d66021836138dd565b91506133e182613ed7565b604082019050919050565b60006133f9600d836138dd565b915061340482613f26565b602082019050919050565b600061341c6012836138dd565b915061342782613f4f565b602082019050919050565b600061343f6013836138dd565b915061344a82613f78565b602082019050919050565b60006134626000836138ee565b915061346d82613fa1565b600082019050919050565b60006134856018836138dd565b915061349082613fa4565b602082019050919050565b6134a481613a28565b82525050565b60006134b682846130ab565b60148201915081905092915050565b60006134d18284613183565b915081905092915050565b60006134e88285613183565b91506134f48284613152565b91506134ff82613383565b91508190509392505050565b600061351682613455565b9150819050919050565b6000602082019050613535600083018461309c565b92915050565b6000608082019050613550600083018761309c565b61355d602083018661309c565b61356a604083018561349b565b818103606083015261357c81846130e0565b905095945050505050565b600060208201905061359c60008301846130c2565b92915050565b60006020820190506135b760008301846130d1565b92915050565b600060208201905081810360008301526135d78184613119565b905092915050565b600060208201905081810360008301526135f881613202565b9050919050565b6000602082019050818103600083015261361881613225565b9050919050565b6000602082019050818103600083015261363881613248565b9050919050565b600060208201905081810360008301526136588161326b565b9050919050565b600060208201905081810360008301526136788161328e565b9050919050565b60006020820190508181036000830152613698816132b1565b9050919050565b600060208201905081810360008301526136b8816132d4565b9050919050565b600060208201905081810360008301526136d8816132f7565b9050919050565b600060208201905081810360008301526136f88161331a565b9050919050565b600060208201905081810360008301526137188161333d565b9050919050565b6000602082019050818103600083015261373881613360565b9050919050565b60006020820190508181036000830152613758816133a6565b9050919050565b60006020820190508181036000830152613778816133c9565b9050919050565b60006020820190508181036000830152613798816133ec565b9050919050565b600060208201905081810360008301526137b88161340f565b9050919050565b600060208201905081810360008301526137d881613432565b9050919050565b600060208201905081810360008301526137f881613478565b9050919050565b6000602082019050613814600083018461349b565b92915050565b6000613824613835565b90506138308282613aa6565b919050565b6000604051905090565b600067ffffffffffffffff82111561385a57613859613c31565b5b61386382613c7e565b9050602081019050919050565b600067ffffffffffffffff82111561388b5761388a613c31565b5b61389482613c7e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061390482613a28565b915061390f83613a28565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561394457613943613b75565b5b828201905092915050565b600061395a82613a28565b915061396583613a28565b92508261397557613974613ba4565b5b828204905092915050565b600061398b82613a28565b915061399683613a28565b9250828210156139a9576139a8613b75565b5b828203905092915050565b60006139bf82613a08565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a5f578082015181840152602081019050613a44565b83811115613a6e576000848401525b50505050565b60006002820490506001821680613a8c57607f821691505b60208210811415613aa057613a9f613bd3565b5b50919050565b613aaf82613c7e565b810181811067ffffffffffffffff82111715613ace57613acd613c31565b5b80604052505050565b6000613ae282613a28565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b1557613b14613b75565b5b600182019050919050565b6000613b2b82613b32565b9050919050565b6000613b3d82613c8f565b9050919050565b6000613b4f82613a28565b9150613b5a83613a28565b925082613b6a57613b69613ba4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c6963204d696e74696e67206973206e6f742061637469766500000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4558434545445f434f4c5f53495a450000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546f6b656e206e6f742065786973746564000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4a75737420736f6c64206f757400000000000000000000000000000000000000600082015250565b7f557020746f2032206d696e747320616c6c6f776564207065722077616c6c6574600082015250565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964206d657461646174612070726f76696465722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f43616c6c657220697320636f6e74726163740000000000000000000000000000600082015250565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b50565b7f574c204d696e74696e67206973206e6f74206163746976650000000000000000600082015250565b613fd6816139b4565b8114613fe157600080fd5b50565b613fed816139c6565b8114613ff857600080fd5b50565b614004816139d2565b811461400f57600080fd5b50565b61401b816139dc565b811461402657600080fd5b50565b61403281613a28565b811461403d57600080fd5b5056fea2646970667358221220f459ece54c7ccb593bafb74606845b744ad7a7de61407f7d9b81795c46b898d164736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000e5468654c6f6f707373657373656400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084c6f6f7073737364000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f73746f726167656170692e666c65656b2e636f2f35343637646635372d376636322d346565362d396637632d3236613238663164633735382d6275636b65742f7365637265745f6d642f0000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102465760003560e01c806370a08231116101395780638ed21d6a116100b6578063bef432c61161007a578063bef432c61461079a578063c566fc15146107d7578063c87b56dd14610802578063e985e9c51461083f578063f2fde38b1461087c578063fec627e0146108a557610246565b80638ed21d6a146106db57806395d89b41146106f2578063a22cb4651461071d578063aea4832814610746578063b88d4fde1461077157610246565b80637bb232ad116100fd5780637bb232ad146106275780637dc64bba146106525780638456cb591461067d5780638ba4cc3c146106945780638da5cb5b146106b057610246565b806370a0823114610566578063715018a6146105a357806374c28561146105ba57806378c68e16146105e55780637a2c88f11461061057610246565b806340b29b4a116101c757806355f804b31161018b57806355f804b3146104a25780635c975abb146104cb5780636352211e146104f657806363b28ee6146105335780636f3fc2871461054f57610246565b806340b29b4a146103e057806342842e0e146104095780634ac50c901461043257806352148e731461044e5780635501298f1461047757610246565b806323b872dd1161020e57806323b872dd146103445780632d1c34e81461036d5780632fbba1151461038457806339a7919f146103a05780633f4ba83a146103c957610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612f7f565b6108ce565b60405161027f9190613587565b60405180910390f35b34801561029457600080fd5b5061029d610960565b6040516102aa91906135bd565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061306f565b6109f2565b6040516102e79190613520565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612eb2565b610a6e565b005b34801561032557600080fd5b5061032e610baf565b60405161033b91906137ff565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190612d9c565b610bc6565b005b34801561037957600080fd5b50610382610eeb565b005b61039e6004803603810190610399919061306f565b610f1f565b005b3480156103ac57600080fd5b506103c760048036038101906103c2919061306f565b610fce565b005b3480156103d557600080fd5b506103de6110d7565b005b3480156103ec57600080fd5b506104076004803603810190610402919061306f565b6110e9565b005b34801561041557600080fd5b50610430600480360381019061042b9190612d9c565b61113e565b005b61044c60048036038101906104479190612ef2565b61115e565b005b34801561045a57600080fd5b5061047560048036038101906104709190612d2f565b61141f565b005b34801561048357600080fd5b5061048c61146b565b6040516104999190613587565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612fd9565b61147e565b005b3480156104d757600080fd5b506104e061149c565b6040516104ed9190613587565b60405180910390f35b34801561050257600080fd5b5061051d6004803603810190610518919061306f565b6114b3565b60405161052a9190613520565b60405180910390f35b61054d6004803603810190610548919061306f565b6114c5565b005b34801561055b57600080fd5b506105646116cb565b005b34801561057257600080fd5b5061058d60048036038101906105889190612d2f565b6116ff565b60405161059a91906137ff565b60405180910390f35b3480156105af57600080fd5b506105b86117b8565b005b3480156105c657600080fd5b506105cf6117cc565b6040516105dc91906137ff565b60405180910390f35b3480156105f157600080fd5b506105fa6117d2565b6040516106079190613520565b60405180910390f35b34801561061c57600080fd5b506106256117f8565b005b34801561063357600080fd5b5061063c611856565b60405161064991906137ff565b60405180910390f35b34801561065e57600080fd5b5061066761185c565b6040516106749190613587565b60405180910390f35b34801561068957600080fd5b5061069261186f565b005b6106ae60048036038101906106a99190612eb2565b611881565b005b3480156106bc57600080fd5b506106c5611931565b6040516106d29190613520565b60405180910390f35b3480156106e757600080fd5b506106f061195b565b005b3480156106fe57600080fd5b5061070761198f565b60405161071491906135bd565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f9190612e72565b611a21565b005b34801561075257600080fd5b5061075b611b99565b60405161076891906135a2565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190612def565b611b9f565b005b3480156107a657600080fd5b506107c160048036038101906107bc9190612d2f565b611c12565b6040516107ce91906137ff565b60405180910390f35b3480156107e357600080fd5b506107ec611c2a565b6040516107f99190613587565b60405180910390f35b34801561080e57600080fd5b506108296004803603810190610824919061306f565b611c3d565b60405161083691906135bd565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190612d5c565b611e7e565b6040516108739190613587565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190612d2f565b611f12565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190612f52565b611f96565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096f90613a74565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90613a74565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b5050505050905090565b60006109fd82611fa8565b610a33576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a79826114b3565b90508073ffffffffffffffffffffffffffffffffffffffff16610a9a612007565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57610ac681610ac1612007565b611e7e565b610afc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bb961200f565b6001546000540303905090565b6000610bd182612018565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c38576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c44846120e6565b91509150610c5a8187610c55612007565b612108565b610ca657610c6f86610c6a612007565b611e7e565b610ca5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d0d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1a868686600161214c565b8015610d2557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610df385610dcf888887612166565b7c02000000000000000000000000000000000000000000000000000000001761218e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e7b576000600185019050600060046000838152602001908152602001600020541415610e79576000548114610e78578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ee386868660016121b9565b505050505050565b610ef36121bf565b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b610f276121bf565b60008111610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f61906136bf565b60405180910390fd5b60095481610f76610baf565b610f8091906138f9565b1115610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb89061361f565b60405180910390fd5b610fcb338261223d565b50565b610fd66121bf565b60008111611019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110109061365f565b60405180910390fd5b600954611024610baf565b10611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b906136df565b60405180910390fd5b61106c610baf565b8160095461107a9190613980565b10156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906137bf565b60405180910390fd5b80600960008282546110cd9190613980565b9250508190555050565b6110df6121bf565b6110e761225b565b565b6110f16121bf565b60008111611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b9061377f565b60405180910390fd5b80600b8190555050565b61115983838360405180602001604052806000815250611b9f565b505050565b600f60019054906101000a900460ff166111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a4906137df565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112129061379f565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126991906138f9565b11156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906136ff565b60405180910390fd5b600954816112b6610baf565b6112c091906138f9565b1115611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f89061361f565b60405180910390fd5b60003360405160200161131491906134aa565b60405160208183030381529060405280519060200120905061137a848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c54836122be565b6113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b09061371f565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461140891906138f9565b92505081905550611419338361223d565b50505050565b6114276121bf565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60019054906101000a900460ff1681565b6114866121bf565b8181600e9190611497929190612a82565b505050565b6000600860149054906101000a900460ff16905090565b60006114be82612018565b9050919050565b600f60029054906101000a900460ff16611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906135df565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115799061379f565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115d091906138f9565b1115611611576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611608906136ff565b60405180910390fd5b6009548161161d610baf565b61162791906138f9565b1115611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f9061361f565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b791906138f9565b925050819055506116c8338261223d565b50565b6116d36121bf565b600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611767576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117c06121bf565b6117ca60006122d5565b565b600b5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118006121bf565b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b60095481565b600f60029054906101000a900460ff1681565b6118776121bf565b61187f61239b565b565b6118896121bf565b600081116118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c3906136bf565b60405180910390fd5b600954816118d8610baf565b6118e291906138f9565b1115611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a9061361f565b60405180910390fd5b61192d828261223d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119636121bf565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60606003805461199e90613a74565b80601f01602080910402602001604051908101604052809291908181526020018280546119ca90613a74565b8015611a175780601f106119ec57610100808354040283529160200191611a17565b820191906000526020600020905b8154815290600101906020018083116119fa57829003601f168201915b5050505050905090565b611a29612007565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a9b612007565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b48612007565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8d9190613587565b60405180910390a35050565b600c5481565b611baa848484610bc6565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c0c57611bd5848484846123fe565b611c0b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a6020528060005260406000206000915090505481565b600f60009054906101000a900460ff1681565b6060611c4882611fa8565b611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e9061369f565b60405180910390fd5b600f60009054906101000a900460ff16611cef57604051602001611caa9061350b565b60405160208183030381529060405280519060200120600e604051602001611cd291906134c5565b604051602081830303815290604052805190602001201415611d43565b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d799061375f565b60405180910390fd5b600f60009054906101000a900460ff16611dc657600e611da18361255e565b604051602001611db29291906134dc565b604051602081830303815290604052611e77565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a574cea4836040518263ffffffff1660e01b8152600401611e2191906137ff565b60006040518083038186803b158015611e3957600080fd5b505afa158015611e4d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611e769190613026565b5b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f1a6121bf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f819061363f565b60405180910390fd5b611f93816122d5565b50565b611f9e6121bf565b80600c8190555050565b600081611fb361200f565b11158015611fc2575060005482105b8015612000575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061202761200f565b116120af576000548110156120ae5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120ac575b60008114156120a2576004600083600190039350838152602001908152602001600020549050612077565b80925050506120e1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b6121546126bf565b61216084848484612709565b50505050565b60008060e883901c905060e861217d86868461270f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6121c7612718565b73ffffffffffffffffffffffffffffffffffffffff166121e5611931565b73ffffffffffffffffffffffffffffffffffffffff161461223b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122329061373f565b60405180910390fd5b565b612257828260405180602001604052806000815250612720565b5050565b6122636127bd565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122a7612718565b6040516122b49190613520565b60405180910390a1565b6000826122cb8584612806565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123a36126bf565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123e7612718565b6040516123f49190613520565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612424612007565b8786866040518563ffffffff1660e01b8152600401612446949392919061353b565b602060405180830381600087803b15801561246057600080fd5b505af192505050801561249157506040513d601f19601f8201168201806040525081019061248e9190612fac565b60015b61250b573d80600081146124c1576040519150601f19603f3d011682016040523d82523d6000602084013e6124c6565b606091505b50600081511415612503576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156125a6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ba565b600082905060005b600082146125d85780806125c190613ad7565b915050600a826125d1919061394f565b91506125ae565b60008167ffffffffffffffff8111156125f4576125f3613c31565b5b6040519080825280601f01601f1916602001820160405280156126265781602001600182028036833780820191505090505b5090505b600085146126b35760018261263f9190613980565b9150600a8561264e9190613b44565b603061265a91906138f9565b60f81b8183815181106126705761266f613c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ac919061394f565b945061262a565b8093505050505b919050565b6126c761149c565b15612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe9061367f565b60405180910390fd5b565b50505050565b60009392505050565b600033905090565b61272a838361285c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127b857600080549050600083820390505b61276a60008683806001019450866123fe565b6127a0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127575781600054146127b557600080fd5b50505b505050565b6127c561149c565b612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb906135ff565b60405180910390fd5b565b60008082905060005b84518110156128515761283c8286838151811061282f5761282e613c02565b5b6020026020010151612a30565b9150808061284990613ad7565b91505061280f565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128c9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612904576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612911600084838561214c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612988836129796000866000612166565b61298285612a5b565b1761218e565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129ac57806000819055505050612a2b60008483856121b9565b505050565b6000818310612a4857612a438284612a6b565b612a53565b612a528383612a6b565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612a8e90613a74565b90600052602060002090601f016020900481019282612ab05760008555612af7565b82601f10612ac957803560ff1916838001178555612af7565b82800160010185558215612af7579182015b82811115612af6578235825591602001919060010190612adb565b5b509050612b049190612b08565b5090565b5b80821115612b21576000816000905550600101612b09565b5090565b6000612b38612b338461383f565b61381a565b905082815260208101848484011115612b5457612b53613c6f565b5b612b5f848285613a32565b509392505050565b6000612b7a612b7584613870565b61381a565b905082815260208101848484011115612b9657612b95613c6f565b5b612ba1848285613a41565b509392505050565b600081359050612bb881613fcd565b92915050565b60008083601f840112612bd457612bd3613c65565b5b8235905067ffffffffffffffff811115612bf157612bf0613c60565b5b602083019150836020820283011115612c0d57612c0c613c6a565b5b9250929050565b600081359050612c2381613fe4565b92915050565b600081359050612c3881613ffb565b92915050565b600081359050612c4d81614012565b92915050565b600081519050612c6281614012565b92915050565b600082601f830112612c7d57612c7c613c65565b5b8135612c8d848260208601612b25565b91505092915050565b60008083601f840112612cac57612cab613c65565b5b8235905067ffffffffffffffff811115612cc957612cc8613c60565b5b602083019150836001820283011115612ce557612ce4613c6a565b5b9250929050565b600082601f830112612d0157612d00613c65565b5b8151612d11848260208601612b67565b91505092915050565b600081359050612d2981614029565b92915050565b600060208284031215612d4557612d44613c79565b5b6000612d5384828501612ba9565b91505092915050565b60008060408385031215612d7357612d72613c79565b5b6000612d8185828601612ba9565b9250506020612d9285828601612ba9565b9150509250929050565b600080600060608486031215612db557612db4613c79565b5b6000612dc386828701612ba9565b9350506020612dd486828701612ba9565b9250506040612de586828701612d1a565b9150509250925092565b60008060008060808587031215612e0957612e08613c79565b5b6000612e1787828801612ba9565b9450506020612e2887828801612ba9565b9350506040612e3987828801612d1a565b925050606085013567ffffffffffffffff811115612e5a57612e59613c74565b5b612e6687828801612c68565b91505092959194509250565b60008060408385031215612e8957612e88613c79565b5b6000612e9785828601612ba9565b9250506020612ea885828601612c14565b9150509250929050565b60008060408385031215612ec957612ec8613c79565b5b6000612ed785828601612ba9565b9250506020612ee885828601612d1a565b9150509250929050565b600080600060408486031215612f0b57612f0a613c79565b5b600084013567ffffffffffffffff811115612f2957612f28613c74565b5b612f3586828701612bbe565b93509350506020612f4886828701612d1a565b9150509250925092565b600060208284031215612f6857612f67613c79565b5b6000612f7684828501612c29565b91505092915050565b600060208284031215612f9557612f94613c79565b5b6000612fa384828501612c3e565b91505092915050565b600060208284031215612fc257612fc1613c79565b5b6000612fd084828501612c53565b91505092915050565b60008060208385031215612ff057612fef613c79565b5b600083013567ffffffffffffffff81111561300e5761300d613c74565b5b61301a85828601612c96565b92509250509250929050565b60006020828403121561303c5761303b613c79565b5b600082015167ffffffffffffffff81111561305a57613059613c74565b5b61306684828501612cec565b91505092915050565b60006020828403121561308557613084613c79565b5b600061309384828501612d1a565b91505092915050565b6130a5816139b4565b82525050565b6130bc6130b7826139b4565b613b20565b82525050565b6130cb816139c6565b82525050565b6130da816139d2565b82525050565b60006130eb826138b6565b6130f581856138cc565b9350613105818560208601613a41565b61310e81613c7e565b840191505092915050565b6000613124826138c1565b61312e81856138dd565b935061313e818560208601613a41565b61314781613c7e565b840191505092915050565b600061315d826138c1565b61316781856138ee565b9350613177818560208601613a41565b80840191505092915050565b6000815461319081613a74565b61319a81866138ee565b945060018216600081146131b557600181146131c6576131f9565b60ff198316865281860193506131f9565b6131cf856138a1565b60005b838110156131f1578154818901526001820191506020810190506131d2565b838801955050505b50505092915050565b600061320f601c836138dd565b915061321a82613c9c565b602082019050919050565b60006132326014836138dd565b915061323d82613cc5565b602082019050919050565b6000613255600f836138dd565b915061326082613cee565b602082019050919050565b60006132786026836138dd565b915061328382613d17565b604082019050919050565b600061329b601d836138dd565b91506132a682613d66565b602082019050919050565b60006132be6010836138dd565b91506132c982613d8f565b602082019050919050565b60006132e16011836138dd565b91506132ec82613db8565b602082019050919050565b60006133046010836138dd565b915061330f82613de1565b602082019050919050565b6000613327600d836138dd565b915061333282613e0a565b602082019050919050565b600061334a6020836138dd565b915061335582613e33565b602082019050919050565b600061336d6017836138dd565b915061337882613e5c565b602082019050919050565b60006133906005836138ee565b915061339b82613e85565b600582019050919050565b60006133b36020836138dd565b91506133be82613eae565b602082019050919050565b60006133d66021836138dd565b91506133e182613ed7565b604082019050919050565b60006133f9600d836138dd565b915061340482613f26565b602082019050919050565b600061341c6012836138dd565b915061342782613f4f565b602082019050919050565b600061343f6013836138dd565b915061344a82613f78565b602082019050919050565b60006134626000836138ee565b915061346d82613fa1565b600082019050919050565b60006134856018836138dd565b915061349082613fa4565b602082019050919050565b6134a481613a28565b82525050565b60006134b682846130ab565b60148201915081905092915050565b60006134d18284613183565b915081905092915050565b60006134e88285613183565b91506134f48284613152565b91506134ff82613383565b91508190509392505050565b600061351682613455565b9150819050919050565b6000602082019050613535600083018461309c565b92915050565b6000608082019050613550600083018761309c565b61355d602083018661309c565b61356a604083018561349b565b818103606083015261357c81846130e0565b905095945050505050565b600060208201905061359c60008301846130c2565b92915050565b60006020820190506135b760008301846130d1565b92915050565b600060208201905081810360008301526135d78184613119565b905092915050565b600060208201905081810360008301526135f881613202565b9050919050565b6000602082019050818103600083015261361881613225565b9050919050565b6000602082019050818103600083015261363881613248565b9050919050565b600060208201905081810360008301526136588161326b565b9050919050565b600060208201905081810360008301526136788161328e565b9050919050565b60006020820190508181036000830152613698816132b1565b9050919050565b600060208201905081810360008301526136b8816132d4565b9050919050565b600060208201905081810360008301526136d8816132f7565b9050919050565b600060208201905081810360008301526136f88161331a565b9050919050565b600060208201905081810360008301526137188161333d565b9050919050565b6000602082019050818103600083015261373881613360565b9050919050565b60006020820190508181036000830152613758816133a6565b9050919050565b60006020820190508181036000830152613778816133c9565b9050919050565b60006020820190508181036000830152613798816133ec565b9050919050565b600060208201905081810360008301526137b88161340f565b9050919050565b600060208201905081810360008301526137d881613432565b9050919050565b600060208201905081810360008301526137f881613478565b9050919050565b6000602082019050613814600083018461349b565b92915050565b6000613824613835565b90506138308282613aa6565b919050565b6000604051905090565b600067ffffffffffffffff82111561385a57613859613c31565b5b61386382613c7e565b9050602081019050919050565b600067ffffffffffffffff82111561388b5761388a613c31565b5b61389482613c7e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061390482613a28565b915061390f83613a28565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561394457613943613b75565b5b828201905092915050565b600061395a82613a28565b915061396583613a28565b92508261397557613974613ba4565b5b828204905092915050565b600061398b82613a28565b915061399683613a28565b9250828210156139a9576139a8613b75565b5b828203905092915050565b60006139bf82613a08565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a5f578082015181840152602081019050613a44565b83811115613a6e576000848401525b50505050565b60006002820490506001821680613a8c57607f821691505b60208210811415613aa057613a9f613bd3565b5b50919050565b613aaf82613c7e565b810181811067ffffffffffffffff82111715613ace57613acd613c31565b5b80604052505050565b6000613ae282613a28565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b1557613b14613b75565b5b600182019050919050565b6000613b2b82613b32565b9050919050565b6000613b3d82613c8f565b9050919050565b6000613b4f82613a28565b9150613b5a83613a28565b925082613b6a57613b69613ba4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c6963204d696e74696e67206973206e6f742061637469766500000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4558434545445f434f4c5f53495a450000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546f6b656e206e6f742065786973746564000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4a75737420736f6c64206f757400000000000000000000000000000000000000600082015250565b7f557020746f2032206d696e747320616c6c6f776564207065722077616c6c6574600082015250565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964206d657461646174612070726f76696465722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f43616c6c657220697320636f6e74726163740000000000000000000000000000600082015250565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b50565b7f574c204d696e74696e67206973206e6f74206163746976650000000000000000600082015250565b613fd6816139b4565b8114613fe157600080fd5b50565b613fed816139c6565b8114613ff857600080fd5b50565b614004816139d2565b811461400f57600080fd5b50565b61401b816139dc565b811461402657600080fd5b50565b61403281613a28565b811461403d57600080fd5b5056fea2646970667358221220f459ece54c7ccb593bafb74606845b744ad7a7de61407f7d9b81795c46b898d164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000e5468654c6f6f707373657373656400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084c6f6f7073737364000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f73746f726167656170692e666c65656b2e636f2f35343637646635372d376636322d346565362d396637632d3236613238663164633735382d6275636b65742f7365637265745f6d642f0000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): TheLoopssessed
Arg [1] : _symbol (string): Loopsssd
Arg [2] : _baseTokenURI (string): https://storageapi.fleek.co/5467df57-7f62-4ee6-9f7c-26a28f1dc758-bucket/secret_md/
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [4] : 5468654c6f6f7073736573736564000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 4c6f6f7073737364000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [8] : 68747470733a2f2f73746f726167656170692e666c65656b2e636f2f35343637
Arg [9] : 646635372d376636322d346565362d396637632d323661323866316463373538
Arg [10] : 2d6275636b65742f7365637265745f6d642f0000000000000000000000000000
Deployed Bytecode Sourcemap
64547:5506:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33268:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38915:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40861:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40409:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32322:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50126:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68562:128;;;;;;;;;;;;;:::i;:::-;;67840:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69445:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69101:67;;;;;;;;;;;;;:::i;:::-;;69824:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41751:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66725:663;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65644:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64979:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66340:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14994:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38704:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67396:432;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68696:140;;;;;;;;;;;;;:::i;:::-;;33947:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17859:103;;;;;;;;;;;;;:::i;:::-;;64734:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64878:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68842:180;;;;;;;;;;;;;:::i;:::-;;64643:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65014:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69030:63;;;;;;;;;;;;;:::i;:::-;;68126:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17211:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68420:134;;;;;;;;;;;;;:::i;:::-;;39084:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41137:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64775:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42007:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64684:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64944:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65758:564;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41516:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18117:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66574:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33268:615;33353:4;33668:10;33653:25;;:11;:25;;;;:102;;;;33745:10;33730:25;;:11;:25;;;;33653:102;:179;;;;33822:10;33807:25;;:11;:25;;;;33653:179;33633:199;;33268:615;;;:::o;38915:100::-;38969:13;39002:5;38995:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38915:100;:::o;40861:204::-;40929:7;40954:16;40962:7;40954;:16::i;:::-;40949:64;;40979:34;;;;;;;;;;;;;;40949:64;41033:15;:24;41049:7;41033:24;;;;;;;;;;;;;;;;;;;;;41026:31;;40861:204;;;:::o;40409:386::-;40482:13;40498:16;40506:7;40498;:16::i;:::-;40482:32;;40554:5;40531:28;;:19;:17;:19::i;:::-;:28;;;40527:175;;40579:44;40596:5;40603:19;:17;:19::i;:::-;40579:16;:44::i;:::-;40574:128;;40651:35;;;;;;;;;;;;;;40574:128;40527:175;40741:2;40714:15;:24;40730:7;40714:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40779:7;40775:2;40759:28;;40768:5;40759:28;;;;;;;;;;;;40471:324;40409:386;;:::o;32322:315::-;32375:7;32603:15;:13;:15::i;:::-;32588:12;;32572:13;;:28;:46;32565:53;;32322:315;:::o;50126:2800::-;50260:27;50290;50309:7;50290:18;:27::i;:::-;50260:57;;50375:4;50334:45;;50350:19;50334:45;;;50330:86;;50388:28;;;;;;;;;;;;;;50330:86;50430:27;50459:23;50486:28;50506:7;50486:19;:28::i;:::-;50429:85;;;;50614:62;50633:15;50650:4;50656:19;:17;:19::i;:::-;50614:18;:62::i;:::-;50609:174;;50696:43;50713:4;50719:19;:17;:19::i;:::-;50696:16;:43::i;:::-;50691:92;;50748:35;;;;;;;;;;;;;;50691:92;50609:174;50814:1;50800:16;;:2;:16;;;50796:52;;;50825:23;;;;;;;;;;;;;;50796:52;50861:43;50883:4;50889:2;50893:7;50902:1;50861:21;:43::i;:::-;50997:15;50994:160;;;51137:1;51116:19;51109:30;50994:160;51532:18;:24;51551:4;51532:24;;;;;;;;;;;;;;;;51530:26;;;;;;;;;;;;51601:18;:22;51620:2;51601:22;;;;;;;;;;;;;;;;51599:24;;;;;;;;;;;51923:145;51960:2;52008:45;52023:4;52029:2;52033:19;52008:14;:45::i;:::-;29550:8;51981:72;51923:18;:145::i;:::-;51894:17;:26;51912:7;51894:26;;;;;;;;;;;:174;;;;52238:1;29550:8;52188:19;:46;:51;52184:626;;;52260:19;52292:1;52282:7;:11;52260:33;;52449:1;52415:17;:30;52433:11;52415:30;;;;;;;;;;;;:35;52411:384;;;52553:13;;52538:11;:28;52534:242;;52733:19;52700:17;:30;52718:11;52700:30;;;;;;;;;;;:52;;;;52534:242;52411:384;52241:569;52184:626;52857:7;52853:2;52838:27;;52847:4;52838:27;;;;;;;;;;;;52876:42;52897:4;52903:2;52907:7;52916:1;52876:20;:42::i;:::-;50249:2677;;;50126:2800;;;:::o;68562:128::-;17097:13;:11;:13::i;:::-;68666:16:::1;;;;;;;;;;;68665:17;68646:16;;:36;;;;;;;;;;;;;;;;;;68562:128::o:0;67840:278::-;17097:13;:11;:13::i;:::-;67965:1:::1;67954:8;:12;67946:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;68034:12;;68022:8;68006:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;67998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68079:31;68089:10;68101:8;68079:9;:31::i;:::-;67840:278:::0;:::o;69445:371::-;17097:13;:11;:13::i;:::-;69574:1:::1;69556:15;:19;69548:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;69644:12;;69628:13;:11;:13::i;:::-;:28;69620:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;69728:13;:11;:13::i;:::-;69709:15;69694:12;;:30;;;;:::i;:::-;:47;;69686:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;69793:15;69777:12;;:31;;;;;;;:::i;:::-;;;;;;;;69445:371:::0;:::o;69101:67::-;17097:13;:11;:13::i;:::-;69150:10:::1;:8;:10::i;:::-;69101:67::o:0;69824:224::-;17097:13;:11;:13::i;:::-;69973:1:::1;69951:19;:23;69943:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;70021:19;70003:15;:37;;;;69824:224:::0;:::o;41751:185::-;41889:39;41906:4;41912:2;41916:7;41889:39;;;;;;;;;;;;:16;:39::i;:::-;41751:185;;;:::o;66725:663::-;65437:16;;;;;;;;;;;65429:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;65325:10:::1;65312:23;;:9;:23;;;65304:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;66953:15:::2;;66941:8;66918;:20;66927:10;66918:20;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:50;;66910:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;67052:12;;67040:8;67024:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;67016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67100:12;67142:10;67125:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;67115:39;;;;;;67100:54;;67188:52;67207:12;;67188:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67221:12;;67235:4;67188:18;:52::i;:::-;67165:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;67330:8;67306;:20;67315:10;67306:20;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;67349:31;67359:10;67371:8;67349:9;:31::i;:::-;66889:499;66725:663:::0;;;:::o;65644:106::-;17097:13;:11;:13::i;:::-;65731:11:::1;65718:10;;:24;;;;;;;;;;;;;;;;;;65644:106:::0;:::o;64979:28::-;;;;;;;;;;;;;:::o;66340:123::-;17097:13;:11;:13::i;:::-;66442::::1;;66427:12;:28;;;;;;;:::i;:::-;;66340:123:::0;;:::o;14994:86::-;15041:4;15065:7;;;;;;;;;;;15058:14;;14994:86;:::o;38704:144::-;38768:7;38811:27;38830:7;38811:18;:27::i;:::-;38788:52;;38704:144;;;:::o;67396:432::-;65563:20;;;;;;;;;;;65555:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;65325:10:::1;65312:23;;:9;:23;;;65304:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;67602:15:::2;;67590:8;67567;:20;67576:10;67567:20;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:50;;67559:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;67701:12;;67689:8;67673:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;67665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67770:8;67746;:20;67755:10;67746:20;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;67789:31;67799:10;67811:8;67789:9;:31::i;:::-;67396:432:::0;:::o;68696:140::-;17097:13;:11;:13::i;:::-;68808:20:::1;;;;;;;;;;;68807:21;68784:20;;:44;;;;;;;;;;;;;;;;;;68696:140::o:0;33947:224::-;34011:7;34052:1;34035:19;;:5;:19;;;34031:60;;;34063:28;;;;;;;;;;;;;;34031:60;28502:13;34109:18;:25;34128:5;34109:25;;;;;;;;;;;;;;;;:54;34102:61;;33947:224;;;:::o;17859:103::-;17097:13;:11;:13::i;:::-;17924:30:::1;17951:1;17924:18;:30::i;:::-;17859:103::o:0;64734:34::-;;;;:::o;64878:25::-;;;;;;;;;;;;;:::o;68842:180::-;17097:13;:11;:13::i;:::-;68943:16:::1;;;;;;;;;;;68942:17;68923:16;;:36;;;;;;;;;;;;;;;;;;68994:20;;;;;;;;;;;68993:21;68970:20;;:44;;;;;;;;;;;;;;;;;;68842:180::o:0;64643:34::-;;;;:::o;65014:32::-;;;;;;;;;;;;;:::o;69030:63::-;17097:13;:11;:13::i;:::-;69077:8:::1;:6;:8::i;:::-;69030:63::o:0;68126:286::-;17097:13;:11;:13::i;:::-;68264:1:::1;68253:8;:12;68245:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;68333:12;;68321:8;68305:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;68297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68378:26;68388:5;68395:8;68378:9;:26::i;:::-;68126:286:::0;;:::o;17211:87::-;17257:7;17284:6;;;;;;;;;;;17277:13;;17211:87;:::o;68420:134::-;17097:13;:11;:13::i;:::-;68530:16:::1;;;;;;;;;;;68529:17;68510:16;;:36;;;;;;;;;;;;;;;;;;68420:134::o:0;39084:104::-;39140:13;39173:7;39166:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39084:104;:::o;41137:308::-;41248:19;:17;:19::i;:::-;41236:31;;:8;:31;;;41232:61;;;41276:17;;;;;;;;;;;;;;41232:61;41358:8;41306:18;:39;41325:19;:17;:19::i;:::-;41306:39;;;;;;;;;;;;;;;:49;41346:8;41306:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;41418:8;41382:55;;41397:19;:17;:19::i;:::-;41382:55;;;41428:8;41382:55;;;;;;:::i;:::-;;;;;;;;41137:308;;:::o;64775:96::-;;;;:::o;42007:399::-;42174:31;42187:4;42193:2;42197:7;42174:12;:31::i;:::-;42238:1;42220:2;:14;;;:19;42216:183;;42259:56;42290:4;42296:2;42300:7;42309:5;42259:30;:56::i;:::-;42254:145;;42343:40;;;;;;;;;;;;;;42254:145;42216:183;42007:399;;;;:::o;64684:43::-;;;;;;;;;;;;;;;;;:::o;64944:28::-;;;;;;;;;;;;;:::o;65758:564::-;65877:13;65916:17;65924:8;65916:7;:17::i;:::-;65908:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;65975:16;;;;;;;;;;;:130;;66082:20;;;;;;;:::i;:::-;;;;;;;;;;;;;66072:31;;;;;;66054:12;66037:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;66027:41;;;;;;:76;;65975:130;;;66018:1;65996:24;;:10;;;;;;;;;;;:24;;;;65975:130;65966:200;;;;;;;;;;;;:::i;:::-;;;;;;;;;66186:16;;;;;;;;;;;:128;;66271:12;66285:19;:8;:17;:19::i;:::-;66254:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66186:128;;;66211:10;;;;;;;;;;;66205:29;;;66235:8;66205:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66186:128;66179:135;;65758:564;;;:::o;41516:164::-;41613:4;41637:18;:25;41656:5;41637:25;;;;;;;;;;;;;;;:35;41663:8;41637:35;;;;;;;;;;;;;;;;;;;;;;;;;41630:42;;41516:164;;;;:::o;18117:201::-;17097:13;:11;:13::i;:::-;18226:1:::1;18206:22;;:8;:22;;;;18198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18282:28;18301:8;18282:18;:28::i;:::-;18117:201:::0;:::o;66574:141::-;17097:13;:11;:13::i;:::-;66694::::1;66679:12;:28;;;;66574:141:::0;:::o;42661:273::-;42718:4;42774:7;42755:15;:13;:15::i;:::-;:26;;:66;;;;;42808:13;;42798:7;:23;42755:66;:152;;;;;42906:1;29272:8;42859:17;:26;42877:7;42859:26;;;;;;;;;;;;:43;:48;42755:152;42735:172;;42661:273;;;:::o;61222:105::-;61282:7;61309:10;61302:17;;61222:105;:::o;66473:93::-;66530:7;66557:1;66550:8;;66473:93;:::o;35621:1129::-;35688:7;35708:12;35723:7;35708:22;;35791:4;35772:15;:13;:15::i;:::-;:23;35768:915;;35825:13;;35818:4;:20;35814:869;;;35863:14;35880:17;:23;35898:4;35880:23;;;;;;;;;;;;35863:40;;35996:1;29272:8;35969:6;:23;:28;35965:699;;;36488:113;36505:1;36495:6;:11;36488:113;;;36548:17;:25;36566:6;;;;;;;36548:25;;;;;;;;;;;;36539:34;;36488:113;;;36634:6;36627:13;;;;;;35965:699;35840:843;35814:869;35768:915;36711:31;;;;;;;;;;;;;;35621:1129;;;;:::o;48462:652::-;48557:27;48586:23;48627:53;48683:15;48627:71;;48869:7;48863:4;48856:21;48904:22;48898:4;48891:36;48980:4;48974;48964:21;48941:44;;49076:19;49070:26;49051:45;;48807:300;48462:652;;;:::o;49227:645::-;49369:11;49531:15;49525:4;49521:26;49513:34;;49690:15;49679:9;49675:31;49662:44;;49837:15;49826:9;49823:30;49816:4;49805:9;49802:19;49799:55;49789:65;;49227:645;;;;;:::o;69180:257::-;14599:19;:17;:19::i;:::-;69373:56:::1;69401:4;69407:2;69411:7;69420:8;69373:27;:56::i;:::-;69180:257:::0;;;;:::o;58367:309::-;58502:7;58522:16;29673:3;58548:19;:40;;58522:67;;29673:3;58615:31;58626:4;58632:2;58636:9;58615:10;:31::i;:::-;58607:40;;:61;;58600:68;;;58367:309;;;;;:::o;38195:447::-;38275:14;38443:15;38436:5;38432:27;38423:36;;38617:5;38603:11;38579:22;38575:40;38572:51;38565:5;38562:62;38552:72;;38195:447;;;;:::o;60873:158::-;;;;;:::o;17376:132::-;17451:12;:10;:12::i;:::-;17440:23;;:7;:5;:7::i;:::-;:23;;;17432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17376:132::o;43018:104::-;43087:27;43097:2;43101:8;43087:27;;;;;;;;;;;;:9;:27::i;:::-;43018:104;;:::o;15849:120::-;14858:16;:14;:16::i;:::-;15918:5:::1;15908:7;;:15;;;;;;;;;;;;;;;;;;15939:22;15948:12;:10;:12::i;:::-;15939:22;;;;;;:::i;:::-;;;;;;;;15849:120::o:0;4922:190::-;5047:4;5100;5071:25;5084:5;5091:4;5071:12;:25::i;:::-;:33;5064:40;;4922:190;;;;;:::o;18478:191::-;18552:16;18571:6;;;;;;;;;;;18552:25;;18597:8;18588:6;;:17;;;;;;;;;;;;;;;;;;18652:8;18621:40;;18642:8;18621:40;;;;;;;;;;;;18541:128;18478:191;:::o;15590:118::-;14599:19;:17;:19::i;:::-;15660:4:::1;15650:7;;:14;;;;;;;;;;;;;;;;;;15680:20;15687:12;:10;:12::i;:::-;15680:20;;;;;;:::i;:::-;;;;;;;;15590:118::o:0;56877:716::-;57040:4;57086:2;57061:45;;;57107:19;:17;:19::i;:::-;57128:4;57134:7;57143:5;57061:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57057:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57361:1;57344:6;:13;:18;57340:235;;;57390:40;;;;;;;;;;;;;;57340:235;57533:6;57527:13;57518:6;57514:2;57510:15;57503:38;57057:529;57230:54;;;57220:64;;;:6;:64;;;;57213:71;;;56877:716;;;;;;:::o;1636:723::-;1692:13;1922:1;1913:5;:10;1909:53;;;1940:10;;;;;;;;;;;;;;;;;;;;;1909:53;1972:12;1987:5;1972:20;;2003:14;2028:78;2043:1;2035:4;:9;2028:78;;2061:8;;;;;:::i;:::-;;;;2092:2;2084:10;;;;;:::i;:::-;;;2028:78;;;2116:19;2148:6;2138:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2116:39;;2166:154;2182:1;2173:5;:10;2166:154;;2210:1;2200:11;;;;;:::i;:::-;;;2277:2;2269:5;:10;;;;:::i;:::-;2256:2;:24;;;;:::i;:::-;2243:39;;2226:6;2233;2226:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2306:2;2297:11;;;;;:::i;:::-;;;2166:154;;;2344:6;2330:21;;;;;1636:723;;;;:::o;15153:108::-;15224:8;:6;:8::i;:::-;15223:9;15215:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;15153:108::o;60055:159::-;;;;;:::o;59252:147::-;59389:6;59252:147;;;;;:::o;13107:98::-;13160:7;13187:10;13180:17;;13107:98;:::o;43538:681::-;43661:19;43667:2;43671:8;43661:5;:19::i;:::-;43740:1;43722:2;:14;;;:19;43718:483;;43762:11;43776:13;;43762:27;;43808:13;43830:8;43824:3;:14;43808:30;;43857:233;43888:62;43927:1;43931:2;43935:7;;;;;;43944:5;43888:30;:62::i;:::-;43883:167;;43986:40;;;;;;;;;;;;;;43883:167;44085:3;44077:5;:11;43857:233;;44172:3;44155:13;;:20;44151:34;;44177:8;;;44151:34;43743:458;;43718:483;43538:681;;;:::o;15338:108::-;15405:8;:6;:8::i;:::-;15397:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;15338:108::o;5789:296::-;5872:7;5892:20;5915:4;5892:27;;5935:9;5930:118;5954:5;:12;5950:1;:16;5930:118;;;6003:33;6013:12;6027:5;6033:1;6027:8;;;;;;;;:::i;:::-;;;;;;;;6003:9;:33::i;:::-;5988:48;;5968:3;;;;;:::i;:::-;;;;5930:118;;;;6065:12;6058:19;;;5789:296;;;;:::o;44492:1529::-;44557:20;44580:13;;44557:36;;44622:1;44608:16;;:2;:16;;;44604:48;;;44633:19;;;;;;;;;;;;;;44604:48;44679:1;44667:8;:13;44663:44;;;44689:18;;;;;;;;;;;;;;44663:44;44720:61;44750:1;44754:2;44758:12;44772:8;44720:21;:61::i;:::-;45263:1;28639:2;45234:1;:25;;45233:31;45221:8;:44;45195:18;:22;45214:2;45195:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;45542:139;45579:2;45633:33;45656:1;45660:2;45664:1;45633:14;:33::i;:::-;45600:30;45621:8;45600:20;:30::i;:::-;:66;45542:18;:139::i;:::-;45508:17;:31;45526:12;45508:31;;;;;;;;;;;:173;;;;45698:15;45716:12;45698:30;;45743:11;45772:8;45757:12;:23;45743:37;;45795:101;45847:9;;;;;;45843:2;45822:35;;45839:1;45822:35;;;;;;;;;;;;45891:3;45881:7;:13;45795:101;;45928:3;45912:13;:19;;;;44969:974;;45953:60;45982:1;45986:2;45990:12;46004:8;45953:20;:60::i;:::-;44546:1475;44492:1529;;:::o;11996:149::-;12059:7;12090:1;12086;:5;:51;;12117:20;12132:1;12135;12117:14;:20::i;:::-;12086:51;;;12094:20;12109:1;12112;12094:14;:20::i;:::-;12086:51;12079:58;;11996:149;;;;:::o;40025:322::-;40095:14;40326:1;40316:8;40313:15;40288:23;40284:45;40274:55;;40025:322;;;:::o;12153:268::-;12221:13;12328:1;12322:4;12315:15;12357:1;12351:4;12344:15;12398:4;12392;12382:21;12373:30;;12153:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:421::-;512:5;537:66;553:49;595:6;553:49;:::i;:::-;537:66;:::i;:::-;528:75;;626:6;619:5;612:21;664:4;657:5;653:16;702:3;693:6;688:3;684:16;681:25;678:112;;;709:79;;:::i;:::-;678:112;799:39;831:6;826:3;821;799:39;:::i;:::-;518:326;423:421;;;;;:::o;850:139::-;896:5;934:6;921:20;912:29;;950:33;977:5;950:33;:::i;:::-;850:139;;;;:::o;1012:568::-;1085:8;1095:6;1145:3;1138:4;1130:6;1126:17;1122:27;1112:122;;1153:79;;:::i;:::-;1112:122;1266:6;1253:20;1243:30;;1296:18;1288:6;1285:30;1282:117;;;1318:79;;:::i;:::-;1282:117;1432:4;1424:6;1420:17;1408:29;;1486:3;1478:4;1470:6;1466:17;1456:8;1452:32;1449:41;1446:128;;;1493:79;;:::i;:::-;1446:128;1012:568;;;;;:::o;1586:133::-;1629:5;1667:6;1654:20;1645:29;;1683:30;1707:5;1683:30;:::i;:::-;1586:133;;;;:::o;1725:139::-;1771:5;1809:6;1796:20;1787:29;;1825:33;1852:5;1825:33;:::i;:::-;1725:139;;;;:::o;1870:137::-;1915:5;1953:6;1940:20;1931:29;;1969:32;1995:5;1969:32;:::i;:::-;1870:137;;;;:::o;2013:141::-;2069:5;2100:6;2094:13;2085:22;;2116:32;2142:5;2116:32;:::i;:::-;2013:141;;;;:::o;2173:338::-;2228:5;2277:3;2270:4;2262:6;2258:17;2254:27;2244:122;;2285:79;;:::i;:::-;2244:122;2402:6;2389:20;2427:78;2501:3;2493:6;2486:4;2478:6;2474:17;2427:78;:::i;:::-;2418:87;;2234:277;2173:338;;;;:::o;2531:553::-;2589:8;2599:6;2649:3;2642:4;2634:6;2630:17;2626:27;2616:122;;2657:79;;:::i;:::-;2616:122;2770:6;2757:20;2747:30;;2800:18;2792:6;2789:30;2786:117;;;2822:79;;:::i;:::-;2786:117;2936:4;2928:6;2924:17;2912:29;;2990:3;2982:4;2974:6;2970:17;2960:8;2956:32;2953:41;2950:128;;;2997:79;;:::i;:::-;2950:128;2531:553;;;;;:::o;3104:355::-;3171:5;3220:3;3213:4;3205:6;3201:17;3197:27;3187:122;;3228:79;;:::i;:::-;3187:122;3338:6;3332:13;3363:90;3449:3;3441:6;3434:4;3426:6;3422:17;3363:90;:::i;:::-;3354:99;;3177:282;3104:355;;;;:::o;3465:139::-;3511:5;3549:6;3536:20;3527:29;;3565:33;3592:5;3565:33;:::i;:::-;3465:139;;;;:::o;3610:329::-;3669:6;3718:2;3706:9;3697:7;3693:23;3689:32;3686:119;;;3724:79;;:::i;:::-;3686:119;3844:1;3869:53;3914:7;3905:6;3894:9;3890:22;3869:53;:::i;:::-;3859:63;;3815:117;3610:329;;;;:::o;3945:474::-;4013:6;4021;4070:2;4058:9;4049:7;4045:23;4041:32;4038:119;;;4076:79;;:::i;:::-;4038:119;4196:1;4221:53;4266:7;4257:6;4246:9;4242:22;4221:53;:::i;:::-;4211:63;;4167:117;4323:2;4349:53;4394:7;4385:6;4374:9;4370:22;4349:53;:::i;:::-;4339:63;;4294:118;3945:474;;;;;:::o;4425:619::-;4502:6;4510;4518;4567:2;4555:9;4546:7;4542:23;4538:32;4535:119;;;4573:79;;:::i;:::-;4535:119;4693:1;4718:53;4763:7;4754:6;4743:9;4739:22;4718:53;:::i;:::-;4708:63;;4664:117;4820:2;4846:53;4891:7;4882:6;4871:9;4867:22;4846:53;:::i;:::-;4836:63;;4791:118;4948:2;4974:53;5019:7;5010:6;4999:9;4995:22;4974:53;:::i;:::-;4964:63;;4919:118;4425:619;;;;;:::o;5050:943::-;5145:6;5153;5161;5169;5218:3;5206:9;5197:7;5193:23;5189:33;5186:120;;;5225:79;;:::i;:::-;5186:120;5345:1;5370:53;5415:7;5406:6;5395:9;5391:22;5370:53;:::i;:::-;5360:63;;5316:117;5472:2;5498:53;5543:7;5534:6;5523:9;5519:22;5498:53;:::i;:::-;5488:63;;5443:118;5600:2;5626:53;5671:7;5662:6;5651:9;5647:22;5626:53;:::i;:::-;5616:63;;5571:118;5756:2;5745:9;5741:18;5728:32;5787:18;5779:6;5776:30;5773:117;;;5809:79;;:::i;:::-;5773:117;5914:62;5968:7;5959:6;5948:9;5944:22;5914:62;:::i;:::-;5904:72;;5699:287;5050:943;;;;;;;:::o;5999:468::-;6064:6;6072;6121:2;6109:9;6100:7;6096:23;6092:32;6089:119;;;6127:79;;:::i;:::-;6089:119;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6374:2;6400:50;6442:7;6433:6;6422:9;6418:22;6400:50;:::i;:::-;6390:60;;6345:115;5999:468;;;;;:::o;6473:474::-;6541:6;6549;6598:2;6586:9;6577:7;6573:23;6569:32;6566:119;;;6604:79;;:::i;:::-;6566:119;6724:1;6749:53;6794:7;6785:6;6774:9;6770:22;6749:53;:::i;:::-;6739:63;;6695:117;6851:2;6877:53;6922:7;6913:6;6902:9;6898:22;6877:53;:::i;:::-;6867:63;;6822:118;6473:474;;;;;:::o;6953:704::-;7048:6;7056;7064;7113:2;7101:9;7092:7;7088:23;7084:32;7081:119;;;7119:79;;:::i;:::-;7081:119;7267:1;7256:9;7252:17;7239:31;7297:18;7289:6;7286:30;7283:117;;;7319:79;;:::i;:::-;7283:117;7432:80;7504:7;7495:6;7484:9;7480:22;7432:80;:::i;:::-;7414:98;;;;7210:312;7561:2;7587:53;7632:7;7623:6;7612:9;7608:22;7587:53;:::i;:::-;7577:63;;7532:118;6953:704;;;;;:::o;7663:329::-;7722:6;7771:2;7759:9;7750:7;7746:23;7742:32;7739:119;;;7777:79;;:::i;:::-;7739:119;7897:1;7922:53;7967:7;7958:6;7947:9;7943:22;7922:53;:::i;:::-;7912:63;;7868:117;7663:329;;;;:::o;7998:327::-;8056:6;8105:2;8093:9;8084:7;8080:23;8076:32;8073:119;;;8111:79;;:::i;:::-;8073:119;8231:1;8256:52;8300:7;8291:6;8280:9;8276:22;8256:52;:::i;:::-;8246:62;;8202:116;7998:327;;;;:::o;8331:349::-;8400:6;8449:2;8437:9;8428:7;8424:23;8420:32;8417:119;;;8455:79;;:::i;:::-;8417:119;8575:1;8600:63;8655:7;8646:6;8635:9;8631:22;8600:63;:::i;:::-;8590:73;;8546:127;8331:349;;;;:::o;8686:529::-;8757:6;8765;8814:2;8802:9;8793:7;8789:23;8785:32;8782:119;;;8820:79;;:::i;:::-;8782:119;8968:1;8957:9;8953:17;8940:31;8998:18;8990:6;8987:30;8984:117;;;9020:79;;:::i;:::-;8984:117;9133:65;9190:7;9181:6;9170:9;9166:22;9133:65;:::i;:::-;9115:83;;;;8911:297;8686:529;;;;;:::o;9221:524::-;9301:6;9350:2;9338:9;9329:7;9325:23;9321:32;9318:119;;;9356:79;;:::i;:::-;9318:119;9497:1;9486:9;9482:17;9476:24;9527:18;9519:6;9516:30;9513:117;;;9549:79;;:::i;:::-;9513:117;9654:74;9720:7;9711:6;9700:9;9696:22;9654:74;:::i;:::-;9644:84;;9447:291;9221:524;;;;:::o;9751:329::-;9810:6;9859:2;9847:9;9838:7;9834:23;9830:32;9827:119;;;9865:79;;:::i;:::-;9827:119;9985:1;10010:53;10055:7;10046:6;10035:9;10031:22;10010:53;:::i;:::-;10000:63;;9956:117;9751:329;;;;:::o;10086:118::-;10173:24;10191:5;10173:24;:::i;:::-;10168:3;10161:37;10086:118;;:::o;10210:157::-;10315:45;10335:24;10353:5;10335:24;:::i;:::-;10315:45;:::i;:::-;10310:3;10303:58;10210:157;;:::o;10373:109::-;10454:21;10469:5;10454:21;:::i;:::-;10449:3;10442:34;10373:109;;:::o;10488:118::-;10575:24;10593:5;10575:24;:::i;:::-;10570:3;10563:37;10488:118;;:::o;10612:360::-;10698:3;10726:38;10758:5;10726:38;:::i;:::-;10780:70;10843:6;10838:3;10780:70;:::i;:::-;10773:77;;10859:52;10904:6;10899:3;10892:4;10885:5;10881:16;10859:52;:::i;:::-;10936:29;10958:6;10936:29;:::i;:::-;10931:3;10927:39;10920:46;;10702:270;10612:360;;;;:::o;10978:364::-;11066:3;11094:39;11127:5;11094:39;:::i;:::-;11149:71;11213:6;11208:3;11149:71;:::i;:::-;11142:78;;11229:52;11274:6;11269:3;11262:4;11255:5;11251:16;11229:52;:::i;:::-;11306:29;11328:6;11306:29;:::i;:::-;11301:3;11297:39;11290:46;;11070:272;10978:364;;;;:::o;11348:377::-;11454:3;11482:39;11515:5;11482:39;:::i;:::-;11537:89;11619:6;11614:3;11537:89;:::i;:::-;11530:96;;11635:52;11680:6;11675:3;11668:4;11661:5;11657:16;11635:52;:::i;:::-;11712:6;11707:3;11703:16;11696:23;;11458:267;11348:377;;;;:::o;11755:845::-;11858:3;11895:5;11889:12;11924:36;11950:9;11924:36;:::i;:::-;11976:89;12058:6;12053:3;11976:89;:::i;:::-;11969:96;;12096:1;12085:9;12081:17;12112:1;12107:137;;;;12258:1;12253:341;;;;12074:520;;12107:137;12191:4;12187:9;12176;12172:25;12167:3;12160:38;12227:6;12222:3;12218:16;12211:23;;12107:137;;12253:341;12320:38;12352:5;12320:38;:::i;:::-;12380:1;12394:154;12408:6;12405:1;12402:13;12394:154;;;12482:7;12476:14;12472:1;12467:3;12463:11;12456:35;12532:1;12523:7;12519:15;12508:26;;12430:4;12427:1;12423:12;12418:17;;12394:154;;;12577:6;12572:3;12568:16;12561:23;;12260:334;;12074:520;;11862:738;;11755:845;;;;:::o;12606:366::-;12748:3;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12845:93;12934:3;12845:93;:::i;:::-;12963:2;12958:3;12954:12;12947:19;;12606:366;;;:::o;12978:::-;13120:3;13141:67;13205:2;13200:3;13141:67;:::i;:::-;13134:74;;13217:93;13306:3;13217:93;:::i;:::-;13335:2;13330:3;13326:12;13319:19;;12978:366;;;:::o;13350:::-;13492:3;13513:67;13577:2;13572:3;13513:67;:::i;:::-;13506:74;;13589:93;13678:3;13589:93;:::i;:::-;13707:2;13702:3;13698:12;13691:19;;13350:366;;;:::o;13722:::-;13864:3;13885:67;13949:2;13944:3;13885:67;:::i;:::-;13878:74;;13961:93;14050:3;13961:93;:::i;:::-;14079:2;14074:3;14070:12;14063:19;;13722:366;;;:::o;14094:::-;14236:3;14257:67;14321:2;14316:3;14257:67;:::i;:::-;14250:74;;14333:93;14422:3;14333:93;:::i;:::-;14451:2;14446:3;14442:12;14435:19;;14094:366;;;:::o;14466:::-;14608:3;14629:67;14693:2;14688:3;14629:67;:::i;:::-;14622:74;;14705:93;14794:3;14705:93;:::i;:::-;14823:2;14818:3;14814:12;14807:19;;14466:366;;;:::o;14838:::-;14980:3;15001:67;15065:2;15060:3;15001:67;:::i;:::-;14994:74;;15077:93;15166:3;15077:93;:::i;:::-;15195:2;15190:3;15186:12;15179:19;;14838:366;;;:::o;15210:::-;15352:3;15373:67;15437:2;15432:3;15373:67;:::i;:::-;15366:74;;15449:93;15538:3;15449:93;:::i;:::-;15567:2;15562:3;15558:12;15551:19;;15210:366;;;:::o;15582:::-;15724:3;15745:67;15809:2;15804:3;15745:67;:::i;:::-;15738:74;;15821:93;15910:3;15821:93;:::i;:::-;15939:2;15934:3;15930:12;15923:19;;15582:366;;;:::o;15954:::-;16096:3;16117:67;16181:2;16176:3;16117:67;:::i;:::-;16110:74;;16193:93;16282:3;16193:93;:::i;:::-;16311:2;16306:3;16302:12;16295:19;;15954:366;;;:::o;16326:::-;16468:3;16489:67;16553:2;16548:3;16489:67;:::i;:::-;16482:74;;16565:93;16654:3;16565:93;:::i;:::-;16683:2;16678:3;16674:12;16667:19;;16326:366;;;:::o;16698:400::-;16858:3;16879:84;16961:1;16956:3;16879:84;:::i;:::-;16872:91;;16972:93;17061:3;16972:93;:::i;:::-;17090:1;17085:3;17081:11;17074:18;;16698:400;;;:::o;17104:366::-;17246:3;17267:67;17331:2;17326:3;17267:67;:::i;:::-;17260:74;;17343:93;17432:3;17343:93;:::i;:::-;17461:2;17456:3;17452:12;17445:19;;17104:366;;;:::o;17476:::-;17618:3;17639:67;17703:2;17698:3;17639:67;:::i;:::-;17632:74;;17715:93;17804:3;17715:93;:::i;:::-;17833:2;17828:3;17824:12;17817:19;;17476:366;;;:::o;17848:::-;17990:3;18011:67;18075:2;18070:3;18011:67;:::i;:::-;18004:74;;18087:93;18176:3;18087:93;:::i;:::-;18205:2;18200:3;18196:12;18189:19;;17848:366;;;:::o;18220:::-;18362:3;18383:67;18447:2;18442:3;18383:67;:::i;:::-;18376:74;;18459:93;18548:3;18459:93;:::i;:::-;18577:2;18572:3;18568:12;18561:19;;18220:366;;;:::o;18592:::-;18734:3;18755:67;18819:2;18814:3;18755:67;:::i;:::-;18748:74;;18831:93;18920:3;18831:93;:::i;:::-;18949:2;18944:3;18940:12;18933:19;;18592:366;;;:::o;18964:400::-;19124:3;19145:84;19227:1;19222:3;19145:84;:::i;:::-;19138:91;;19238:93;19327:3;19238:93;:::i;:::-;19356:1;19351:3;19347:11;19340:18;;18964:400;;;:::o;19370:366::-;19512:3;19533:67;19597:2;19592:3;19533:67;:::i;:::-;19526:74;;19609:93;19698:3;19609:93;:::i;:::-;19727:2;19722:3;19718:12;19711:19;;19370:366;;;:::o;19742:118::-;19829:24;19847:5;19829:24;:::i;:::-;19824:3;19817:37;19742:118;;:::o;19866:256::-;19978:3;19993:75;20064:3;20055:6;19993:75;:::i;:::-;20093:2;20088:3;20084:12;20077:19;;20113:3;20106:10;;19866:256;;;;:::o;20128:269::-;20257:3;20279:92;20367:3;20358:6;20279:92;:::i;:::-;20272:99;;20388:3;20381:10;;20128:269;;;;:::o;20403:695::-;20681:3;20703:92;20791:3;20782:6;20703:92;:::i;:::-;20696:99;;20812:95;20903:3;20894:6;20812:95;:::i;:::-;20805:102;;20924:148;21068:3;20924:148;:::i;:::-;20917:155;;21089:3;21082:10;;20403:695;;;;;:::o;21104:381::-;21289:3;21311:148;21455:3;21311:148;:::i;:::-;21304:155;;21476:3;21469:10;;21104:381;;;:::o;21491:222::-;21584:4;21622:2;21611:9;21607:18;21599:26;;21635:71;21703:1;21692:9;21688:17;21679:6;21635:71;:::i;:::-;21491:222;;;;:::o;21719:640::-;21914:4;21952:3;21941:9;21937:19;21929:27;;21966:71;22034:1;22023:9;22019:17;22010:6;21966:71;:::i;:::-;22047:72;22115:2;22104:9;22100:18;22091:6;22047:72;:::i;:::-;22129;22197:2;22186:9;22182:18;22173:6;22129:72;:::i;:::-;22248:9;22242:4;22238:20;22233:2;22222:9;22218:18;22211:48;22276:76;22347:4;22338:6;22276:76;:::i;:::-;22268:84;;21719:640;;;;;;;:::o;22365:210::-;22452:4;22490:2;22479:9;22475:18;22467:26;;22503:65;22565:1;22554:9;22550:17;22541:6;22503:65;:::i;:::-;22365:210;;;;:::o;22581:222::-;22674:4;22712:2;22701:9;22697:18;22689:26;;22725:71;22793:1;22782:9;22778:17;22769:6;22725:71;:::i;:::-;22581:222;;;;:::o;22809:313::-;22922:4;22960:2;22949:9;22945:18;22937:26;;23009:9;23003:4;22999:20;22995:1;22984:9;22980:17;22973:47;23037:78;23110:4;23101:6;23037:78;:::i;:::-;23029:86;;22809:313;;;;:::o;23128:419::-;23294:4;23332:2;23321:9;23317:18;23309:26;;23381:9;23375:4;23371:20;23367:1;23356:9;23352:17;23345:47;23409:131;23535:4;23409:131;:::i;:::-;23401:139;;23128:419;;;:::o;23553:::-;23719:4;23757:2;23746:9;23742:18;23734:26;;23806:9;23800:4;23796:20;23792:1;23781:9;23777:17;23770:47;23834:131;23960:4;23834:131;:::i;:::-;23826:139;;23553:419;;;:::o;23978:::-;24144:4;24182:2;24171:9;24167:18;24159:26;;24231:9;24225:4;24221:20;24217:1;24206:9;24202:17;24195:47;24259:131;24385:4;24259:131;:::i;:::-;24251:139;;23978:419;;;:::o;24403:::-;24569:4;24607:2;24596:9;24592:18;24584:26;;24656:9;24650:4;24646:20;24642:1;24631:9;24627:17;24620:47;24684:131;24810:4;24684:131;:::i;:::-;24676:139;;24403:419;;;:::o;24828:::-;24994:4;25032:2;25021:9;25017:18;25009:26;;25081:9;25075:4;25071:20;25067:1;25056:9;25052:17;25045:47;25109:131;25235:4;25109:131;:::i;:::-;25101:139;;24828:419;;;:::o;25253:::-;25419:4;25457:2;25446:9;25442:18;25434:26;;25506:9;25500:4;25496:20;25492:1;25481:9;25477:17;25470:47;25534:131;25660:4;25534:131;:::i;:::-;25526:139;;25253:419;;;:::o;25678:::-;25844:4;25882:2;25871:9;25867:18;25859:26;;25931:9;25925:4;25921:20;25917:1;25906:9;25902:17;25895:47;25959:131;26085:4;25959:131;:::i;:::-;25951:139;;25678:419;;;:::o;26103:::-;26269:4;26307:2;26296:9;26292:18;26284:26;;26356:9;26350:4;26346:20;26342:1;26331:9;26327:17;26320:47;26384:131;26510:4;26384:131;:::i;:::-;26376:139;;26103:419;;;:::o;26528:::-;26694:4;26732:2;26721:9;26717:18;26709:26;;26781:9;26775:4;26771:20;26767:1;26756:9;26752:17;26745:47;26809:131;26935:4;26809:131;:::i;:::-;26801:139;;26528:419;;;:::o;26953:::-;27119:4;27157:2;27146:9;27142:18;27134:26;;27206:9;27200:4;27196:20;27192:1;27181:9;27177:17;27170:47;27234:131;27360:4;27234:131;:::i;:::-;27226:139;;26953:419;;;:::o;27378:::-;27544:4;27582:2;27571:9;27567:18;27559:26;;27631:9;27625:4;27621:20;27617:1;27606:9;27602:17;27595:47;27659:131;27785:4;27659:131;:::i;:::-;27651:139;;27378:419;;;:::o;27803:::-;27969:4;28007:2;27996:9;27992:18;27984:26;;28056:9;28050:4;28046:20;28042:1;28031:9;28027:17;28020:47;28084:131;28210:4;28084:131;:::i;:::-;28076:139;;27803:419;;;:::o;28228:::-;28394:4;28432:2;28421:9;28417:18;28409:26;;28481:9;28475:4;28471:20;28467:1;28456:9;28452:17;28445:47;28509:131;28635:4;28509:131;:::i;:::-;28501:139;;28228:419;;;:::o;28653:::-;28819:4;28857:2;28846:9;28842:18;28834:26;;28906:9;28900:4;28896:20;28892:1;28881:9;28877:17;28870:47;28934:131;29060:4;28934:131;:::i;:::-;28926:139;;28653:419;;;:::o;29078:::-;29244:4;29282:2;29271:9;29267:18;29259:26;;29331:9;29325:4;29321:20;29317:1;29306:9;29302:17;29295:47;29359:131;29485:4;29359:131;:::i;:::-;29351:139;;29078:419;;;:::o;29503:::-;29669:4;29707:2;29696:9;29692:18;29684:26;;29756:9;29750:4;29746:20;29742:1;29731:9;29727:17;29720:47;29784:131;29910:4;29784:131;:::i;:::-;29776:139;;29503:419;;;:::o;29928:::-;30094:4;30132:2;30121:9;30117:18;30109:26;;30181:9;30175:4;30171:20;30167:1;30156:9;30152:17;30145:47;30209:131;30335:4;30209:131;:::i;:::-;30201:139;;29928:419;;;:::o;30353:222::-;30446:4;30484:2;30473:9;30469:18;30461:26;;30497:71;30565:1;30554:9;30550:17;30541:6;30497:71;:::i;:::-;30353:222;;;;:::o;30581:129::-;30615:6;30642:20;;:::i;:::-;30632:30;;30671:33;30699:4;30691:6;30671:33;:::i;:::-;30581:129;;;:::o;30716:75::-;30749:6;30782:2;30776:9;30766:19;;30716:75;:::o;30797:307::-;30858:4;30948:18;30940:6;30937:30;30934:56;;;30970:18;;:::i;:::-;30934:56;31008:29;31030:6;31008:29;:::i;:::-;31000:37;;31092:4;31086;31082:15;31074:23;;30797:307;;;:::o;31110:308::-;31172:4;31262:18;31254:6;31251:30;31248:56;;;31284:18;;:::i;:::-;31248:56;31322:29;31344:6;31322:29;:::i;:::-;31314:37;;31406:4;31400;31396:15;31388:23;;31110:308;;;:::o;31424:141::-;31473:4;31496:3;31488:11;;31519:3;31516:1;31509:14;31553:4;31550:1;31540:18;31532:26;;31424:141;;;:::o;31571:98::-;31622:6;31656:5;31650:12;31640:22;;31571:98;;;:::o;31675:99::-;31727:6;31761:5;31755:12;31745:22;;31675:99;;;:::o;31780:168::-;31863:11;31897:6;31892:3;31885:19;31937:4;31932:3;31928:14;31913:29;;31780:168;;;;:::o;31954:169::-;32038:11;32072:6;32067:3;32060:19;32112:4;32107:3;32103:14;32088:29;;31954:169;;;;:::o;32129:148::-;32231:11;32268:3;32253:18;;32129:148;;;;:::o;32283:305::-;32323:3;32342:20;32360:1;32342:20;:::i;:::-;32337:25;;32376:20;32394:1;32376:20;:::i;:::-;32371:25;;32530:1;32462:66;32458:74;32455:1;32452:81;32449:107;;;32536:18;;:::i;:::-;32449:107;32580:1;32577;32573:9;32566:16;;32283:305;;;;:::o;32594:185::-;32634:1;32651:20;32669:1;32651:20;:::i;:::-;32646:25;;32685:20;32703:1;32685:20;:::i;:::-;32680:25;;32724:1;32714:35;;32729:18;;:::i;:::-;32714:35;32771:1;32768;32764:9;32759:14;;32594:185;;;;:::o;32785:191::-;32825:4;32845:20;32863:1;32845:20;:::i;:::-;32840:25;;32879:20;32897:1;32879:20;:::i;:::-;32874:25;;32918:1;32915;32912:8;32909:34;;;32923:18;;:::i;:::-;32909:34;32968:1;32965;32961:9;32953:17;;32785:191;;;;:::o;32982:96::-;33019:7;33048:24;33066:5;33048:24;:::i;:::-;33037:35;;32982:96;;;:::o;33084:90::-;33118:7;33161:5;33154:13;33147:21;33136:32;;33084:90;;;:::o;33180:77::-;33217:7;33246:5;33235:16;;33180:77;;;:::o;33263:149::-;33299:7;33339:66;33332:5;33328:78;33317:89;;33263:149;;;:::o;33418:126::-;33455:7;33495:42;33488:5;33484:54;33473:65;;33418:126;;;:::o;33550:77::-;33587:7;33616:5;33605:16;;33550:77;;;:::o;33633:154::-;33717:6;33712:3;33707;33694:30;33779:1;33770:6;33765:3;33761:16;33754:27;33633:154;;;:::o;33793:307::-;33861:1;33871:113;33885:6;33882:1;33879:13;33871:113;;;33970:1;33965:3;33961:11;33955:18;33951:1;33946:3;33942:11;33935:39;33907:2;33904:1;33900:10;33895:15;;33871:113;;;34002:6;33999:1;33996:13;33993:101;;;34082:1;34073:6;34068:3;34064:16;34057:27;33993:101;33842:258;33793:307;;;:::o;34106:320::-;34150:6;34187:1;34181:4;34177:12;34167:22;;34234:1;34228:4;34224:12;34255:18;34245:81;;34311:4;34303:6;34299:17;34289:27;;34245:81;34373:2;34365:6;34362:14;34342:18;34339:38;34336:84;;;34392:18;;:::i;:::-;34336:84;34157:269;34106:320;;;:::o;34432:281::-;34515:27;34537:4;34515:27;:::i;:::-;34507:6;34503:40;34645:6;34633:10;34630:22;34609:18;34597:10;34594:34;34591:62;34588:88;;;34656:18;;:::i;:::-;34588:88;34696:10;34692:2;34685:22;34475:238;34432:281;;:::o;34719:233::-;34758:3;34781:24;34799:5;34781:24;:::i;:::-;34772:33;;34827:66;34820:5;34817:77;34814:103;;;34897:18;;:::i;:::-;34814:103;34944:1;34937:5;34933:13;34926:20;;34719:233;;;:::o;34958:100::-;34997:7;35026:26;35046:5;35026:26;:::i;:::-;35015:37;;34958:100;;;:::o;35064:94::-;35103:7;35132:20;35146:5;35132:20;:::i;:::-;35121:31;;35064:94;;;:::o;35164:176::-;35196:1;35213:20;35231:1;35213:20;:::i;:::-;35208:25;;35247:20;35265:1;35247:20;:::i;:::-;35242:25;;35286:1;35276:35;;35291:18;;:::i;:::-;35276:35;35332:1;35329;35325:9;35320:14;;35164:176;;;;:::o;35346:180::-;35394:77;35391:1;35384:88;35491:4;35488:1;35481:15;35515:4;35512:1;35505:15;35532:180;35580:77;35577:1;35570:88;35677:4;35674:1;35667:15;35701:4;35698:1;35691:15;35718:180;35766:77;35763:1;35756:88;35863:4;35860:1;35853:15;35887:4;35884:1;35877:15;35904:180;35952:77;35949:1;35942:88;36049:4;36046:1;36039:15;36073:4;36070:1;36063:15;36090:180;36138:77;36135:1;36128:88;36235:4;36232:1;36225:15;36259:4;36256:1;36249:15;36276:117;36385:1;36382;36375:12;36399:117;36508:1;36505;36498:12;36522:117;36631:1;36628;36621:12;36645:117;36754:1;36751;36744:12;36768:117;36877:1;36874;36867:12;36891:117;37000:1;36997;36990:12;37014:102;37055:6;37106:2;37102:7;37097:2;37090:5;37086:14;37082:28;37072:38;;37014:102;;;:::o;37122:94::-;37155:8;37203:5;37199:2;37195:14;37174:35;;37122:94;;;:::o;37222:178::-;37362:30;37358:1;37350:6;37346:14;37339:54;37222:178;:::o;37406:170::-;37546:22;37542:1;37534:6;37530:14;37523:46;37406:170;:::o;37582:165::-;37722:17;37718:1;37710:6;37706:14;37699:41;37582:165;:::o;37753:225::-;37893:34;37889:1;37881:6;37877:14;37870:58;37962:8;37957:2;37949:6;37945:15;37938:33;37753:225;:::o;37984:179::-;38124:31;38120:1;38112:6;38108:14;38101:55;37984:179;:::o;38169:166::-;38309:18;38305:1;38297:6;38293:14;38286:42;38169:166;:::o;38341:167::-;38481:19;38477:1;38469:6;38465:14;38458:43;38341:167;:::o;38514:166::-;38654:18;38650:1;38642:6;38638:14;38631:42;38514:166;:::o;38686:163::-;38826:15;38822:1;38814:6;38810:14;38803:39;38686:163;:::o;38855:182::-;38995:34;38991:1;38983:6;38979:14;38972:58;38855:182;:::o;39043:173::-;39183:25;39179:1;39171:6;39167:14;39160:49;39043:173;:::o;39222:155::-;39362:7;39358:1;39350:6;39346:14;39339:31;39222:155;:::o;39383:182::-;39523:34;39519:1;39511:6;39507:14;39500:58;39383:182;:::o;39571:220::-;39711:34;39707:1;39699:6;39695:14;39688:58;39780:3;39775:2;39767:6;39763:15;39756:28;39571:220;:::o;39797:163::-;39937:15;39933:1;39925:6;39921:14;39914:39;39797:163;:::o;39966:168::-;40106:20;40102:1;40094:6;40090:14;40083:44;39966:168;:::o;40140:169::-;40280:21;40276:1;40268:6;40264:14;40257:45;40140:169;:::o;40315:114::-;;:::o;40435:174::-;40575:26;40571:1;40563:6;40559:14;40552:50;40435:174;:::o;40615:122::-;40688:24;40706:5;40688:24;:::i;:::-;40681:5;40678:35;40668:63;;40727:1;40724;40717:12;40668:63;40615:122;:::o;40743:116::-;40813:21;40828:5;40813:21;:::i;:::-;40806:5;40803:32;40793:60;;40849:1;40846;40839:12;40793:60;40743:116;:::o;40865:122::-;40938:24;40956:5;40938:24;:::i;:::-;40931:5;40928:35;40918:63;;40977:1;40974;40967:12;40918:63;40865:122;:::o;40993:120::-;41065:23;41082:5;41065:23;:::i;:::-;41058:5;41055:34;41045:62;;41103:1;41100;41093:12;41045:62;40993:120;:::o;41119:122::-;41192:24;41210:5;41192:24;:::i;:::-;41185:5;41182:35;41172:63;;41231:1;41228;41221:12;41172:63;41119:122;:::o
Swarm Source
ipfs://f459ece54c7ccb593bafb74606845b744ad7a7de61407f7d9b81795c46b898d1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.