Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,446 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Whitelist Mint | 15984045 | 619 days ago | IN | 0 ETH | 0.00054305 | ||||
Whitelist Mint | 15775406 | 648 days ago | IN | 0 ETH | 0.00047944 | ||||
Whitelist Mint | 15763453 | 650 days ago | IN | 0 ETH | 0.000352 | ||||
Whitelist Mint | 15763451 | 650 days ago | IN | 0 ETH | 0.00040444 | ||||
Whitelist Mint | 15763449 | 650 days ago | IN | 0 ETH | 0.00037325 | ||||
Whitelist Mint | 15763447 | 650 days ago | IN | 0 ETH | 0.00042414 | ||||
Whitelist Mint | 15763446 | 650 days ago | IN | 0 ETH | 0.00038402 | ||||
Whitelist Mint | 15759691 | 650 days ago | IN | 0 ETH | 0.00035837 | ||||
Whitelist Mint | 15759691 | 650 days ago | IN | 0 ETH | 0.00035837 | ||||
Whitelist Mint | 15755692 | 651 days ago | IN | 0 ETH | 0.00044266 | ||||
Whitelist Mint | 15736493 | 654 days ago | IN | 0 ETH | 0.00040643 | ||||
Whitelist Mint | 15736493 | 654 days ago | IN | 0 ETH | 0.00040643 | ||||
Whitelist Mint | 15736493 | 654 days ago | IN | 0 ETH | 0.00040643 | ||||
Whitelist Mint | 15736493 | 654 days ago | IN | 0 ETH | 0.00040643 | ||||
Whitelist Mint | 15736493 | 654 days ago | IN | 0 ETH | 0.00040643 | ||||
Whitelist Mint | 15736493 | 654 days ago | IN | 0 ETH | 0.00040643 | ||||
Whitelist Mint | 15736493 | 654 days ago | IN | 0 ETH | 0.00040643 | ||||
Whitelist Mint | 15728131 | 655 days ago | IN | 0 ETH | 0.00037375 | ||||
Whitelist Mint | 15728131 | 655 days ago | IN | 0 ETH | 0.00037375 | ||||
Whitelist Mint | 15727990 | 655 days ago | IN | 0 ETH | 0.00041788 | ||||
Whitelist Mint | 15726716 | 655 days ago | IN | 0 ETH | 0.00055348 | ||||
Whitelist Mint | 15726716 | 655 days ago | IN | 0 ETH | 0.00057297 | ||||
Whitelist Mint | 15726716 | 655 days ago | IN | 0 ETH | 0.00054305 | ||||
Whitelist Mint | 15722521 | 656 days ago | IN | 0 ETH | 0.00050029 | ||||
Whitelist Mint | 15722513 | 656 days ago | IN | 0 ETH | 0.00050321 |
Loading...
Loading
Contract Name:
Skydancers
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-06 */ // 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: contracts/1_Storage.sol /** *Submitted for verification at Etherscan.io on 2022-10-05 */ // 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/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) } } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI"s implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } pragma solidity ^0.8.0; contract Skydancers is ERC721A, Ownable { using Strings for uint; using ECDSA for bytes32; uint public constant maxSupply = 5555; uint public constant maxPerWalletWhitelist = 1; uint public constant maxPerWalletPublic = 4; uint public constant priceWhitelist = 0 ether; uint public constant pricePublic = 0.04 ether; bool public revealed = false; bool public isWhitelistMintEnabled = false; bool public isPaused = true; string public _baseURL = ""; string public _unrevealedURL = ""; mapping(address => uint) private _walletMintedCount; bytes32 immutable public merkleRoot;//0xf3245c896ff0766793f684a207a56b641704b13ea50b655f42c69d3e11f09c0f constructor(bytes32 _merkleRoot) ERC721A("Skydancers", "SD") { merkleRoot = _merkleRoot; } function _baseURI() internal view override returns (string memory) { return _baseURL; } function _startTokenId() internal pure override returns (uint) { return 1; } function contractURI() public pure returns (string memory) { return ""; } function mintedCount(address owner) external view returns (uint) { return _walletMintedCount[owner]; } function PublicMint(uint256 quantity) external payable { require(!isPaused, "Sales are off"); require(msg.value >= pricePublic, "Transaction value is underpriced"); require(_totalMinted() + quantity <= maxSupply,"Exceeds max supply"); require(quantity <= maxPerWalletPublic,"Exceeds max per transaction"); require(_walletMintedCount[msg.sender] + quantity <= maxPerWalletPublic,"Exceeds max per wallet"); _walletMintedCount[msg.sender] += quantity; _safeMint(msg.sender, quantity); } function WhitelistMint(uint256 quantity, bytes32[] calldata merkleProof) external payable { require(!isPaused, "Sales are off"); require(isWhitelistMintEnabled, "Whitelist mint has not started yet"); require(_totalMinted() + quantity <= maxSupply,"Exceeds max supply"); require(quantity <= maxPerWalletWhitelist,"Exceeds max per transaction"); require(_walletMintedCount[msg.sender] + quantity <= maxPerWalletWhitelist,"Exceeds max per wallet"); require(MerkleProof.verify(merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender))) == true, "invalid merkle proof"); _walletMintedCount[msg.sender] += quantity; _safeMint(msg.sender, quantity); } function tokenURI(uint256 tokenId) public view virtual override returns(string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if (revealed == false) { return _unrevealedURL; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), ".json")) : ""; } function reveal()public onlyOwner { revealed = true; } function setBaseUri(string memory url) external onlyOwner { _baseURL = url; } function setUnrevealedUri(string memory url) external onlyOwner { _unrevealedURL = url; } function flipWhitelistMintEnabled() external onlyOwner { isWhitelistMintEnabled = !isWhitelistMintEnabled; } function start(bool paused) external onlyOwner { isPaused = paused; } function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"WhitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_baseURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_unrevealedURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"flipWhitelistMintEnabled","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":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"mintedCount","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":"pricePublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setUnrevealedUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526000600860146101000a81548160ff0219169083151502179055506000600860156101000a81548160ff0219169083151502179055506001600860166101000a81548160ff02191690831515021790555060405180602001604052806000815250600990805190602001906200007c92919062000294565b5060405180602001604052806000815250600a9080519060200190620000a492919062000294565b50348015620000b257600080fd5b5060405162003d2338038062003d238339818101604052810190620000d891906200035b565b6040518060400160405280600a81526020017f536b7964616e63657273000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f534400000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200015c92919062000294565b5080600390805190602001906200017592919062000294565b5062000186620001bd60201b60201c565b6000819055505050620001ae620001a2620001c660201b60201c565b620001ce60201b60201c565b8060808181525050506200041b565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002a29062000397565b90600052602060002090601f016020900481019282620002c6576000855562000312565b82601f10620002e157805160ff191683800117855562000312565b8280016001018555821562000312579182015b8281111562000311578251825591602001919060010190620002f4565b5b50905062000321919062000325565b5090565b5b808211156200034057600081600090555060010162000326565b5090565b600081519050620003558162000401565b92915050565b600060208284031215620003745762000373620003fc565b5b6000620003848482850162000344565b91505092915050565b6000819050919050565b60006002820490506001821680620003b057607f821691505b60208210811415620003c757620003c6620003cd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200040c816200038d565b81146200041857600080fd5b50565b6080516138e56200043e60003960008181610b2f01526111b901526138e56000f3fe6080604052600436106102255760003560e01c8063735ba9fb11610123578063b187bd26116100ab578063e8a3d4851161006f578063e8a3d48514610791578063e985e9c5146107bc578063f2fde38b146107f9578063f9e0edae14610822578063fddcb5ea1461084d57610225565b8063b187bd26146106ac578063b88d4fde146106d7578063c877cf3714610700578063c87b56dd14610729578063d5abeb011461076657610225565b80639fb17e34116100f25780639fb17e34146105fc578063a0bcfc7f14610618578063a22cb46514610641578063a475b5dd1461066a578063b029a5141461068157610225565b8063735ba9fb146105525780638da5cb5b1461057d57806390fb5fb9146105a857806395d89b41146105d157610225565b80632fff1796116101b15780635183022711610175578063518302271461046b57806351aaceab146104965780636352211e146104c157806370a08231146104fe578063715018a61461053b57610225565b80632fff1796146103be57806336a4e19b146103e95780633ccfd60b1461041457806342842e0e1461042b578063435461111461045457610225565b8063095ea7b3116101f8578063095ea7b3146102eb578063102e766d1461031457806318160ddd1461033f57806323b872dd1461036a5780632eb4a7ab1461039357610225565b806301ffc9a71461022a5780630528a65b1461026757806306fdde0314610283578063081812fc146102ae575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612b60565b61088a565b60405161025e9190612ff0565b60405180910390f35b610281600480360381019061027c9190612c30565b61091c565b005b34801561028f57600080fd5b50610298610c21565b6040516102a59190613026565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612c03565b610cb3565b6040516102e29190612f89565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612af3565b610d2f565b005b34801561032057600080fd5b50610329610e70565b6040516103369190613188565b60405180910390f35b34801561034b57600080fd5b50610354610e7b565b6040516103619190613188565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c91906129dd565b610e92565b005b34801561039f57600080fd5b506103a86111b7565b6040516103b5919061300b565b60405180910390f35b3480156103ca57600080fd5b506103d36111db565b6040516103e09190613188565b60405180910390f35b3480156103f557600080fd5b506103fe6111e0565b60405161040b9190613188565b60405180910390f35b34801561042057600080fd5b506104296111e5565b005b34801561043757600080fd5b50610452600480360381019061044d91906129dd565b611266565b005b34801561046057600080fd5b50610469611286565b005b34801561047757600080fd5b506104806112ba565b60405161048d9190612ff0565b60405180910390f35b3480156104a257600080fd5b506104ab6112cd565b6040516104b89190612ff0565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190612c03565b6112e0565b6040516104f59190612f89565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612970565b6112f2565b6040516105329190613188565b60405180910390f35b34801561054757600080fd5b506105506113ab565b005b34801561055e57600080fd5b506105676113bf565b6040516105749190613026565b60405180910390f35b34801561058957600080fd5b5061059261144d565b60405161059f9190612f89565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190612bba565b611477565b005b3480156105dd57600080fd5b506105e6611499565b6040516105f39190613026565b60405180910390f35b61061660048036038101906106119190612c03565b61152b565b005b34801561062457600080fd5b5061063f600480360381019061063a9190612bba565b611751565b005b34801561064d57600080fd5b5061066860048036038101906106639190612ab3565b611773565b005b34801561067657600080fd5b5061067f6118eb565b005b34801561068d57600080fd5b50610696611910565b6040516106a39190613188565b60405180910390f35b3480156106b857600080fd5b506106c1611915565b6040516106ce9190612ff0565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190612a30565b611928565b005b34801561070c57600080fd5b5061072760048036038101906107229190612b33565b61199b565b005b34801561073557600080fd5b50610750600480360381019061074b9190612c03565b6119c0565b60405161075d9190613026565b60405180910390f35b34801561077257600080fd5b5061077b611b16565b6040516107889190613188565b60405180910390f35b34801561079d57600080fd5b506107a6611b1c565b6040516107b39190613026565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de919061299d565b611b33565b6040516107f09190612ff0565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b9190612970565b611bc7565b005b34801561082e57600080fd5b50610837611c4b565b6040516108449190613026565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190612970565b611cd9565b6040516108819190613188565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109155750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600860169054906101000a900460ff161561096c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610963906130a8565b60405180910390fd5b600860159054906101000a900460ff166109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613048565b60405180910390fd5b6115b3836109c7611d22565b6109d19190613278565b1115610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a09906130c8565b60405180910390fd5b6001831115610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d90613148565b60405180910390fd5b600183600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610aa39190613278565b1115610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90613168565b60405180910390fd5b60011515610b7a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f000000000000000000000000000000000000000000000000000000000000000033604051602001610b5f9190612f2a565b60405160208183030381529060405280519060200120611d35565b151514610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb390613088565b60405180910390fd5b82600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c0b9190613278565b92505081905550610c1c3384611d4c565b505050565b606060028054610c30906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5c906133f3565b8015610ca95780601f10610c7e57610100808354040283529160200191610ca9565b820191906000526020600020905b815481529060010190602001808311610c8c57829003601f168201915b5050505050905090565b6000610cbe82611d6a565b610cf4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3a826112e0565b90508073ffffffffffffffffffffffffffffffffffffffff16610d5b611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614610dbe57610d8781610d82611dc9565b611b33565b610dbd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b668e1bc9bf04000081565b6000610e85611dd1565b6001546000540303905090565b6000610e9d82611dda565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f04576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f1084611ea8565b91509150610f268187610f21611dc9565b611eca565b610f7257610f3b86610f36611dc9565b611b33565b610f71576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fd9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fe68686866001611f0e565b8015610ff157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110bf8561109b888887611f14565b7c020000000000000000000000000000000000000000000000000000000017611f3c565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611147576000600185019050600060046000838152602001908152602001600020541415611145576000548114611144578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111af8686866001611f67565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081565b600181565b6111ed611f6d565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161121390612f74565b60006040518083038185875af1925050503d8060008114611250576040519150601f19603f3d011682016040523d82523d6000602084013e611255565b606091505b505090508061126357600080fd5b50565b61128183838360405180602001604052806000815250611928565b505050565b61128e611f6d565b600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b600860149054906101000a900460ff1681565b600860159054906101000a900460ff1681565b60006112eb82611dda565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113b3611f6d565b6113bd6000611feb565b565b600a80546113cc906133f3565b80601f01602080910402602001604051908101604052809291908181526020018280546113f8906133f3565b80156114455780601f1061141a57610100808354040283529160200191611445565b820191906000526020600020905b81548152906001019060200180831161142857829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61147f611f6d565b80600a908051906020019061149592919061272e565b5050565b6060600380546114a8906133f3565b80601f01602080910402602001604051908101604052809291908181526020018280546114d4906133f3565b80156115215780601f106114f657610100808354040283529160200191611521565b820191906000526020600020905b81548152906001019060200180831161150457829003601f168201915b5050505050905090565b600860169054906101000a900460ff161561157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611572906130a8565b60405180910390fd5b668e1bc9bf0400003410156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90613128565b60405180910390fd5b6115b3816115d1611d22565b6115db9190613278565b111561161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906130c8565b60405180910390fd5b6004811115611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165790613148565b60405180910390fd5b600481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ad9190613278565b11156116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590613168565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461173d9190613278565b9250508190555061174e3382611d4c565b50565b611759611f6d565b806009908051906020019061176f92919061272e565b5050565b61177b611dc9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117e0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117ed611dc9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661189a611dc9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118df9190612ff0565b60405180910390a35050565b6118f3611f6d565b6001600860146101000a81548160ff021916908315150217905550565b600481565b600860169054906101000a900460ff1681565b611933848484610e92565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119955761195e848484846120b1565b611994576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6119a3611f6d565b80600860166101000a81548160ff02191690831515021790555050565b60606119cb82611d6a565b611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190613108565b60405180910390fd5b60001515600860149054906101000a900460ff1615151415611ab857600a8054611a33906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5f906133f3565b8015611aac5780601f10611a8157610100808354040283529160200191611aac565b820191906000526020600020905b815481529060010190602001808311611a8f57829003601f168201915b50505050509050611b11565b6000611ac2612211565b90506000815111611ae25760405180602001604052806000815250611b0d565b80611aec846122a3565b604051602001611afd929190612f45565b6040516020818303038152906040525b9150505b919050565b6115b381565b606060405180602001604052806000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bcf611f6d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3690613068565b60405180910390fd5b611c4881611feb565b50565b60098054611c58906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611c84906133f3565b8015611cd15780601f10611ca657610100808354040283529160200191611cd1565b820191906000526020600020905b815481529060010190602001808311611cb457829003601f168201915b505050505081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611d2c611dd1565b60005403905090565b600082611d428584612404565b1490509392505050565b611d6682826040518060200160405280600081525061245a565b5050565b600081611d75611dd1565b11158015611d84575060005482105b8015611dc2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611de9611dd1565b11611e7157600054811015611e705760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e6e575b6000811415611e64576004600083600190039350838152602001908152602001600020549050611e39565b8092505050611ea3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f2b8686846124f7565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611f75612500565b73ffffffffffffffffffffffffffffffffffffffff16611f9361144d565b73ffffffffffffffffffffffffffffffffffffffff1614611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe0906130e8565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120d7611dc9565b8786866040518563ffffffff1660e01b81526004016120f99493929190612fa4565b602060405180830381600087803b15801561211357600080fd5b505af192505050801561214457506040513d601f19601f820116820180604052508101906121419190612b8d565b60015b6121be573d8060008114612174576040519150601f19603f3d011682016040523d82523d6000602084013e612179565b606091505b506000815114156121b6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612220906133f3565b80601f016020809104026020016040519081016040528092919081815260200182805461224c906133f3565b80156122995780601f1061226e57610100808354040283529160200191612299565b820191906000526020600020905b81548152906001019060200180831161227c57829003601f168201915b5050505050905090565b606060008214156122eb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123ff565b600082905060005b6000821461231d57808061230690613456565b915050600a8261231691906132ce565b91506122f3565b60008167ffffffffffffffff811115612339576123386135b0565b5b6040519080825280601f01601f19166020018201604052801561236b5781602001600182028036833780820191505090505b5090505b600085146123f85760018261238491906132ff565b9150600a8561239391906134c3565b603061239f9190613278565b60f81b8183815181106123b5576123b4613581565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123f191906132ce565b945061236f565b8093505050505b919050565b60008082905060005b845181101561244f5761243a8286838151811061242d5761242c613581565b5b6020026020010151612508565b9150808061244790613456565b91505061240d565b508091505092915050565b6124648383612533565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124f257600080549050600083820390505b6124a460008683806001019450866120b1565b6124da576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106124915781600054146124ef57600080fd5b50505b505050565b60009392505050565b600033905090565b60008183106125205761251b8284612707565b61252b565b61252a8383612707565b5b905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125a0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156125db576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125e86000848385611f0e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061265f836126506000866000611f14565b6126598561271e565b17611f3c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612683578060008190555050506127026000848385611f67565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461273a906133f3565b90600052602060002090601f01602090048101928261275c57600085556127a3565b82601f1061277557805160ff19168380011785556127a3565b828001600101855582156127a3579182015b828111156127a2578251825591602001919060010190612787565b5b5090506127b091906127b4565b5090565b5b808211156127cd5760008160009055506001016127b5565b5090565b60006127e46127df846131c8565b6131a3565b905082815260208101848484011115612800576127ff6135ee565b5b61280b8482856133b1565b509392505050565b6000612826612821846131f9565b6131a3565b905082815260208101848484011115612842576128416135ee565b5b61284d8482856133b1565b509392505050565b60008135905061286481613853565b92915050565b60008083601f8401126128805761287f6135e4565b5b8235905067ffffffffffffffff81111561289d5761289c6135df565b5b6020830191508360208202830111156128b9576128b86135e9565b5b9250929050565b6000813590506128cf8161386a565b92915050565b6000813590506128e481613881565b92915050565b6000815190506128f981613881565b92915050565b600082601f830112612914576129136135e4565b5b81356129248482602086016127d1565b91505092915050565b600082601f830112612942576129416135e4565b5b8135612952848260208601612813565b91505092915050565b60008135905061296a81613898565b92915050565b600060208284031215612986576129856135f8565b5b600061299484828501612855565b91505092915050565b600080604083850312156129b4576129b36135f8565b5b60006129c285828601612855565b92505060206129d385828601612855565b9150509250929050565b6000806000606084860312156129f6576129f56135f8565b5b6000612a0486828701612855565b9350506020612a1586828701612855565b9250506040612a268682870161295b565b9150509250925092565b60008060008060808587031215612a4a57612a496135f8565b5b6000612a5887828801612855565b9450506020612a6987828801612855565b9350506040612a7a8782880161295b565b925050606085013567ffffffffffffffff811115612a9b57612a9a6135f3565b5b612aa7878288016128ff565b91505092959194509250565b60008060408385031215612aca57612ac96135f8565b5b6000612ad885828601612855565b9250506020612ae9858286016128c0565b9150509250929050565b60008060408385031215612b0a57612b096135f8565b5b6000612b1885828601612855565b9250506020612b298582860161295b565b9150509250929050565b600060208284031215612b4957612b486135f8565b5b6000612b57848285016128c0565b91505092915050565b600060208284031215612b7657612b756135f8565b5b6000612b84848285016128d5565b91505092915050565b600060208284031215612ba357612ba26135f8565b5b6000612bb1848285016128ea565b91505092915050565b600060208284031215612bd057612bcf6135f8565b5b600082013567ffffffffffffffff811115612bee57612bed6135f3565b5b612bfa8482850161292d565b91505092915050565b600060208284031215612c1957612c186135f8565b5b6000612c278482850161295b565b91505092915050565b600080600060408486031215612c4957612c486135f8565b5b6000612c578682870161295b565b935050602084013567ffffffffffffffff811115612c7857612c776135f3565b5b612c848682870161286a565b92509250509250925092565b612c9981613333565b82525050565b612cb0612cab82613333565b61349f565b82525050565b612cbf81613345565b82525050565b612cce81613351565b82525050565b6000612cdf8261322a565b612ce98185613240565b9350612cf98185602086016133c0565b612d02816135fd565b840191505092915050565b6000612d1882613235565b612d22818561325c565b9350612d328185602086016133c0565b612d3b816135fd565b840191505092915050565b6000612d5182613235565b612d5b818561326d565b9350612d6b8185602086016133c0565b80840191505092915050565b6000612d8460228361325c565b9150612d8f8261361b565b604082019050919050565b6000612da760268361325c565b9150612db28261366a565b604082019050919050565b6000612dca60148361325c565b9150612dd5826136b9565b602082019050919050565b6000612ded600d8361325c565b9150612df8826136e2565b602082019050919050565b6000612e1060128361325c565b9150612e1b8261370b565b602082019050919050565b6000612e3360058361326d565b9150612e3e82613734565b600582019050919050565b6000612e5660208361325c565b9150612e618261375d565b602082019050919050565b6000612e79602f8361325c565b9150612e8482613786565b604082019050919050565b6000612e9c60208361325c565b9150612ea7826137d5565b602082019050919050565b6000612ebf601b8361325c565b9150612eca826137fe565b602082019050919050565b6000612ee2600083613251565b9150612eed82613827565b600082019050919050565b6000612f0560168361325c565b9150612f108261382a565b602082019050919050565b612f24816133a7565b82525050565b6000612f368284612c9f565b60148201915081905092915050565b6000612f518285612d46565b9150612f5d8284612d46565b9150612f6882612e26565b91508190509392505050565b6000612f7f82612ed5565b9150819050919050565b6000602082019050612f9e6000830184612c90565b92915050565b6000608082019050612fb96000830187612c90565b612fc66020830186612c90565b612fd36040830185612f1b565b8181036060830152612fe58184612cd4565b905095945050505050565b60006020820190506130056000830184612cb6565b92915050565b60006020820190506130206000830184612cc5565b92915050565b600060208201905081810360008301526130408184612d0d565b905092915050565b6000602082019050818103600083015261306181612d77565b9050919050565b6000602082019050818103600083015261308181612d9a565b9050919050565b600060208201905081810360008301526130a181612dbd565b9050919050565b600060208201905081810360008301526130c181612de0565b9050919050565b600060208201905081810360008301526130e181612e03565b9050919050565b6000602082019050818103600083015261310181612e49565b9050919050565b6000602082019050818103600083015261312181612e6c565b9050919050565b6000602082019050818103600083015261314181612e8f565b9050919050565b6000602082019050818103600083015261316181612eb2565b9050919050565b6000602082019050818103600083015261318181612ef8565b9050919050565b600060208201905061319d6000830184612f1b565b92915050565b60006131ad6131be565b90506131b98282613425565b919050565b6000604051905090565b600067ffffffffffffffff8211156131e3576131e26135b0565b5b6131ec826135fd565b9050602081019050919050565b600067ffffffffffffffff821115613214576132136135b0565b5b61321d826135fd565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613283826133a7565b915061328e836133a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132c3576132c26134f4565b5b828201905092915050565b60006132d9826133a7565b91506132e4836133a7565b9250826132f4576132f3613523565b5b828204905092915050565b600061330a826133a7565b9150613315836133a7565b925082821015613328576133276134f4565b5b828203905092915050565b600061333e82613387565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156133de5780820151818401526020810190506133c3565b838111156133ed576000848401525b50505050565b6000600282049050600182168061340b57607f821691505b6020821081141561341f5761341e613552565b5b50919050565b61342e826135fd565b810181811067ffffffffffffffff8211171561344d5761344c6135b0565b5b80604052505050565b6000613461826133a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613494576134936134f4565b5b600182019050919050565b60006134aa826134b1565b9050919050565b60006134bc8261360e565b9050919050565b60006134ce826133a7565b91506134d9836133a7565b9250826134e9576134e8613523565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57686974656c697374206d696e7420686173206e6f742073746172746564207960008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b7f53616c657320617265206f666600000000000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e2076616c756520697320756e646572707269636564600082015250565b7f45786365656473206d617820706572207472616e73616374696f6e0000000000600082015250565b50565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b61385c81613333565b811461386757600080fd5b50565b61387381613345565b811461387e57600080fd5b50565b61388a8161335b565b811461389557600080fd5b50565b6138a1816133a7565b81146138ac57600080fd5b5056fea2646970667358221220d820f747df09e5d28c6f117ce1a125349a8e892073e4f57763b6f68ab2ed320864736f6c63430008070033f3245c896ff0766793f684a207a56b641704b13ea50b655f42c69d3e11f09c0f
Deployed Bytecode
0x6080604052600436106102255760003560e01c8063735ba9fb11610123578063b187bd26116100ab578063e8a3d4851161006f578063e8a3d48514610791578063e985e9c5146107bc578063f2fde38b146107f9578063f9e0edae14610822578063fddcb5ea1461084d57610225565b8063b187bd26146106ac578063b88d4fde146106d7578063c877cf3714610700578063c87b56dd14610729578063d5abeb011461076657610225565b80639fb17e34116100f25780639fb17e34146105fc578063a0bcfc7f14610618578063a22cb46514610641578063a475b5dd1461066a578063b029a5141461068157610225565b8063735ba9fb146105525780638da5cb5b1461057d57806390fb5fb9146105a857806395d89b41146105d157610225565b80632fff1796116101b15780635183022711610175578063518302271461046b57806351aaceab146104965780636352211e146104c157806370a08231146104fe578063715018a61461053b57610225565b80632fff1796146103be57806336a4e19b146103e95780633ccfd60b1461041457806342842e0e1461042b578063435461111461045457610225565b8063095ea7b3116101f8578063095ea7b3146102eb578063102e766d1461031457806318160ddd1461033f57806323b872dd1461036a5780632eb4a7ab1461039357610225565b806301ffc9a71461022a5780630528a65b1461026757806306fdde0314610283578063081812fc146102ae575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612b60565b61088a565b60405161025e9190612ff0565b60405180910390f35b610281600480360381019061027c9190612c30565b61091c565b005b34801561028f57600080fd5b50610298610c21565b6040516102a59190613026565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612c03565b610cb3565b6040516102e29190612f89565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612af3565b610d2f565b005b34801561032057600080fd5b50610329610e70565b6040516103369190613188565b60405180910390f35b34801561034b57600080fd5b50610354610e7b565b6040516103619190613188565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c91906129dd565b610e92565b005b34801561039f57600080fd5b506103a86111b7565b6040516103b5919061300b565b60405180910390f35b3480156103ca57600080fd5b506103d36111db565b6040516103e09190613188565b60405180910390f35b3480156103f557600080fd5b506103fe6111e0565b60405161040b9190613188565b60405180910390f35b34801561042057600080fd5b506104296111e5565b005b34801561043757600080fd5b50610452600480360381019061044d91906129dd565b611266565b005b34801561046057600080fd5b50610469611286565b005b34801561047757600080fd5b506104806112ba565b60405161048d9190612ff0565b60405180910390f35b3480156104a257600080fd5b506104ab6112cd565b6040516104b89190612ff0565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190612c03565b6112e0565b6040516104f59190612f89565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612970565b6112f2565b6040516105329190613188565b60405180910390f35b34801561054757600080fd5b506105506113ab565b005b34801561055e57600080fd5b506105676113bf565b6040516105749190613026565b60405180910390f35b34801561058957600080fd5b5061059261144d565b60405161059f9190612f89565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190612bba565b611477565b005b3480156105dd57600080fd5b506105e6611499565b6040516105f39190613026565b60405180910390f35b61061660048036038101906106119190612c03565b61152b565b005b34801561062457600080fd5b5061063f600480360381019061063a9190612bba565b611751565b005b34801561064d57600080fd5b5061066860048036038101906106639190612ab3565b611773565b005b34801561067657600080fd5b5061067f6118eb565b005b34801561068d57600080fd5b50610696611910565b6040516106a39190613188565b60405180910390f35b3480156106b857600080fd5b506106c1611915565b6040516106ce9190612ff0565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190612a30565b611928565b005b34801561070c57600080fd5b5061072760048036038101906107229190612b33565b61199b565b005b34801561073557600080fd5b50610750600480360381019061074b9190612c03565b6119c0565b60405161075d9190613026565b60405180910390f35b34801561077257600080fd5b5061077b611b16565b6040516107889190613188565b60405180910390f35b34801561079d57600080fd5b506107a6611b1c565b6040516107b39190613026565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de919061299d565b611b33565b6040516107f09190612ff0565b60405180910390f35b34801561080557600080fd5b50610820600480360381019061081b9190612970565b611bc7565b005b34801561082e57600080fd5b50610837611c4b565b6040516108449190613026565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190612970565b611cd9565b6040516108819190613188565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109155750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600860169054906101000a900460ff161561096c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610963906130a8565b60405180910390fd5b600860159054906101000a900460ff166109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613048565b60405180910390fd5b6115b3836109c7611d22565b6109d19190613278565b1115610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a09906130c8565b60405180910390fd5b6001831115610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d90613148565b60405180910390fd5b600183600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610aa39190613278565b1115610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90613168565b60405180910390fd5b60011515610b7a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507ff3245c896ff0766793f684a207a56b641704b13ea50b655f42c69d3e11f09c0f33604051602001610b5f9190612f2a565b60405160208183030381529060405280519060200120611d35565b151514610bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb390613088565b60405180910390fd5b82600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c0b9190613278565b92505081905550610c1c3384611d4c565b505050565b606060028054610c30906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5c906133f3565b8015610ca95780601f10610c7e57610100808354040283529160200191610ca9565b820191906000526020600020905b815481529060010190602001808311610c8c57829003601f168201915b5050505050905090565b6000610cbe82611d6a565b610cf4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d3a826112e0565b90508073ffffffffffffffffffffffffffffffffffffffff16610d5b611dc9565b73ffffffffffffffffffffffffffffffffffffffff1614610dbe57610d8781610d82611dc9565b611b33565b610dbd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b668e1bc9bf04000081565b6000610e85611dd1565b6001546000540303905090565b6000610e9d82611dda565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f04576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f1084611ea8565b91509150610f268187610f21611dc9565b611eca565b610f7257610f3b86610f36611dc9565b611b33565b610f71576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fd9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fe68686866001611f0e565b8015610ff157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110bf8561109b888887611f14565b7c020000000000000000000000000000000000000000000000000000000017611f3c565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611147576000600185019050600060046000838152602001908152602001600020541415611145576000548114611144578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111af8686866001611f67565b505050505050565b7ff3245c896ff0766793f684a207a56b641704b13ea50b655f42c69d3e11f09c0f81565b600081565b600181565b6111ed611f6d565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161121390612f74565b60006040518083038185875af1925050503d8060008114611250576040519150601f19603f3d011682016040523d82523d6000602084013e611255565b606091505b505090508061126357600080fd5b50565b61128183838360405180602001604052806000815250611928565b505050565b61128e611f6d565b600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b600860149054906101000a900460ff1681565b600860159054906101000a900460ff1681565b60006112eb82611dda565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113b3611f6d565b6113bd6000611feb565b565b600a80546113cc906133f3565b80601f01602080910402602001604051908101604052809291908181526020018280546113f8906133f3565b80156114455780601f1061141a57610100808354040283529160200191611445565b820191906000526020600020905b81548152906001019060200180831161142857829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61147f611f6d565b80600a908051906020019061149592919061272e565b5050565b6060600380546114a8906133f3565b80601f01602080910402602001604051908101604052809291908181526020018280546114d4906133f3565b80156115215780601f106114f657610100808354040283529160200191611521565b820191906000526020600020905b81548152906001019060200180831161150457829003601f168201915b5050505050905090565b600860169054906101000a900460ff161561157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611572906130a8565b60405180910390fd5b668e1bc9bf0400003410156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90613128565b60405180910390fd5b6115b3816115d1611d22565b6115db9190613278565b111561161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906130c8565b60405180910390fd5b6004811115611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165790613148565b60405180910390fd5b600481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ad9190613278565b11156116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590613168565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461173d9190613278565b9250508190555061174e3382611d4c565b50565b611759611f6d565b806009908051906020019061176f92919061272e565b5050565b61177b611dc9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117e0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117ed611dc9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661189a611dc9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118df9190612ff0565b60405180910390a35050565b6118f3611f6d565b6001600860146101000a81548160ff021916908315150217905550565b600481565b600860169054906101000a900460ff1681565b611933848484610e92565b60008373ffffffffffffffffffffffffffffffffffffffff163b146119955761195e848484846120b1565b611994576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6119a3611f6d565b80600860166101000a81548160ff02191690831515021790555050565b60606119cb82611d6a565b611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190613108565b60405180910390fd5b60001515600860149054906101000a900460ff1615151415611ab857600a8054611a33906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5f906133f3565b8015611aac5780601f10611a8157610100808354040283529160200191611aac565b820191906000526020600020905b815481529060010190602001808311611a8f57829003601f168201915b50505050509050611b11565b6000611ac2612211565b90506000815111611ae25760405180602001604052806000815250611b0d565b80611aec846122a3565b604051602001611afd929190612f45565b6040516020818303038152906040525b9150505b919050565b6115b381565b606060405180602001604052806000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bcf611f6d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3690613068565b60405180910390fd5b611c4881611feb565b50565b60098054611c58906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611c84906133f3565b8015611cd15780601f10611ca657610100808354040283529160200191611cd1565b820191906000526020600020905b815481529060010190602001808311611cb457829003601f168201915b505050505081565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611d2c611dd1565b60005403905090565b600082611d428584612404565b1490509392505050565b611d6682826040518060200160405280600081525061245a565b5050565b600081611d75611dd1565b11158015611d84575060005482105b8015611dc2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611de9611dd1565b11611e7157600054811015611e705760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e6e575b6000811415611e64576004600083600190039350838152602001908152602001600020549050611e39565b8092505050611ea3565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f2b8686846124f7565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611f75612500565b73ffffffffffffffffffffffffffffffffffffffff16611f9361144d565b73ffffffffffffffffffffffffffffffffffffffff1614611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe0906130e8565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120d7611dc9565b8786866040518563ffffffff1660e01b81526004016120f99493929190612fa4565b602060405180830381600087803b15801561211357600080fd5b505af192505050801561214457506040513d601f19601f820116820180604052508101906121419190612b8d565b60015b6121be573d8060008114612174576040519150601f19603f3d011682016040523d82523d6000602084013e612179565b606091505b506000815114156121b6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612220906133f3565b80601f016020809104026020016040519081016040528092919081815260200182805461224c906133f3565b80156122995780601f1061226e57610100808354040283529160200191612299565b820191906000526020600020905b81548152906001019060200180831161227c57829003601f168201915b5050505050905090565b606060008214156122eb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123ff565b600082905060005b6000821461231d57808061230690613456565b915050600a8261231691906132ce565b91506122f3565b60008167ffffffffffffffff811115612339576123386135b0565b5b6040519080825280601f01601f19166020018201604052801561236b5781602001600182028036833780820191505090505b5090505b600085146123f85760018261238491906132ff565b9150600a8561239391906134c3565b603061239f9190613278565b60f81b8183815181106123b5576123b4613581565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123f191906132ce565b945061236f565b8093505050505b919050565b60008082905060005b845181101561244f5761243a8286838151811061242d5761242c613581565b5b6020026020010151612508565b9150808061244790613456565b91505061240d565b508091505092915050565b6124648383612533565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124f257600080549050600083820390505b6124a460008683806001019450866120b1565b6124da576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106124915781600054146124ef57600080fd5b50505b505050565b60009392505050565b600033905090565b60008183106125205761251b8284612707565b61252b565b61252a8383612707565b5b905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125a0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156125db576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125e86000848385611f0e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061265f836126506000866000611f14565b6126598561271e565b17611f3c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612683578060008190555050506127026000848385611f67565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461273a906133f3565b90600052602060002090601f01602090048101928261275c57600085556127a3565b82601f1061277557805160ff19168380011785556127a3565b828001600101855582156127a3579182015b828111156127a2578251825591602001919060010190612787565b5b5090506127b091906127b4565b5090565b5b808211156127cd5760008160009055506001016127b5565b5090565b60006127e46127df846131c8565b6131a3565b905082815260208101848484011115612800576127ff6135ee565b5b61280b8482856133b1565b509392505050565b6000612826612821846131f9565b6131a3565b905082815260208101848484011115612842576128416135ee565b5b61284d8482856133b1565b509392505050565b60008135905061286481613853565b92915050565b60008083601f8401126128805761287f6135e4565b5b8235905067ffffffffffffffff81111561289d5761289c6135df565b5b6020830191508360208202830111156128b9576128b86135e9565b5b9250929050565b6000813590506128cf8161386a565b92915050565b6000813590506128e481613881565b92915050565b6000815190506128f981613881565b92915050565b600082601f830112612914576129136135e4565b5b81356129248482602086016127d1565b91505092915050565b600082601f830112612942576129416135e4565b5b8135612952848260208601612813565b91505092915050565b60008135905061296a81613898565b92915050565b600060208284031215612986576129856135f8565b5b600061299484828501612855565b91505092915050565b600080604083850312156129b4576129b36135f8565b5b60006129c285828601612855565b92505060206129d385828601612855565b9150509250929050565b6000806000606084860312156129f6576129f56135f8565b5b6000612a0486828701612855565b9350506020612a1586828701612855565b9250506040612a268682870161295b565b9150509250925092565b60008060008060808587031215612a4a57612a496135f8565b5b6000612a5887828801612855565b9450506020612a6987828801612855565b9350506040612a7a8782880161295b565b925050606085013567ffffffffffffffff811115612a9b57612a9a6135f3565b5b612aa7878288016128ff565b91505092959194509250565b60008060408385031215612aca57612ac96135f8565b5b6000612ad885828601612855565b9250506020612ae9858286016128c0565b9150509250929050565b60008060408385031215612b0a57612b096135f8565b5b6000612b1885828601612855565b9250506020612b298582860161295b565b9150509250929050565b600060208284031215612b4957612b486135f8565b5b6000612b57848285016128c0565b91505092915050565b600060208284031215612b7657612b756135f8565b5b6000612b84848285016128d5565b91505092915050565b600060208284031215612ba357612ba26135f8565b5b6000612bb1848285016128ea565b91505092915050565b600060208284031215612bd057612bcf6135f8565b5b600082013567ffffffffffffffff811115612bee57612bed6135f3565b5b612bfa8482850161292d565b91505092915050565b600060208284031215612c1957612c186135f8565b5b6000612c278482850161295b565b91505092915050565b600080600060408486031215612c4957612c486135f8565b5b6000612c578682870161295b565b935050602084013567ffffffffffffffff811115612c7857612c776135f3565b5b612c848682870161286a565b92509250509250925092565b612c9981613333565b82525050565b612cb0612cab82613333565b61349f565b82525050565b612cbf81613345565b82525050565b612cce81613351565b82525050565b6000612cdf8261322a565b612ce98185613240565b9350612cf98185602086016133c0565b612d02816135fd565b840191505092915050565b6000612d1882613235565b612d22818561325c565b9350612d328185602086016133c0565b612d3b816135fd565b840191505092915050565b6000612d5182613235565b612d5b818561326d565b9350612d6b8185602086016133c0565b80840191505092915050565b6000612d8460228361325c565b9150612d8f8261361b565b604082019050919050565b6000612da760268361325c565b9150612db28261366a565b604082019050919050565b6000612dca60148361325c565b9150612dd5826136b9565b602082019050919050565b6000612ded600d8361325c565b9150612df8826136e2565b602082019050919050565b6000612e1060128361325c565b9150612e1b8261370b565b602082019050919050565b6000612e3360058361326d565b9150612e3e82613734565b600582019050919050565b6000612e5660208361325c565b9150612e618261375d565b602082019050919050565b6000612e79602f8361325c565b9150612e8482613786565b604082019050919050565b6000612e9c60208361325c565b9150612ea7826137d5565b602082019050919050565b6000612ebf601b8361325c565b9150612eca826137fe565b602082019050919050565b6000612ee2600083613251565b9150612eed82613827565b600082019050919050565b6000612f0560168361325c565b9150612f108261382a565b602082019050919050565b612f24816133a7565b82525050565b6000612f368284612c9f565b60148201915081905092915050565b6000612f518285612d46565b9150612f5d8284612d46565b9150612f6882612e26565b91508190509392505050565b6000612f7f82612ed5565b9150819050919050565b6000602082019050612f9e6000830184612c90565b92915050565b6000608082019050612fb96000830187612c90565b612fc66020830186612c90565b612fd36040830185612f1b565b8181036060830152612fe58184612cd4565b905095945050505050565b60006020820190506130056000830184612cb6565b92915050565b60006020820190506130206000830184612cc5565b92915050565b600060208201905081810360008301526130408184612d0d565b905092915050565b6000602082019050818103600083015261306181612d77565b9050919050565b6000602082019050818103600083015261308181612d9a565b9050919050565b600060208201905081810360008301526130a181612dbd565b9050919050565b600060208201905081810360008301526130c181612de0565b9050919050565b600060208201905081810360008301526130e181612e03565b9050919050565b6000602082019050818103600083015261310181612e49565b9050919050565b6000602082019050818103600083015261312181612e6c565b9050919050565b6000602082019050818103600083015261314181612e8f565b9050919050565b6000602082019050818103600083015261316181612eb2565b9050919050565b6000602082019050818103600083015261318181612ef8565b9050919050565b600060208201905061319d6000830184612f1b565b92915050565b60006131ad6131be565b90506131b98282613425565b919050565b6000604051905090565b600067ffffffffffffffff8211156131e3576131e26135b0565b5b6131ec826135fd565b9050602081019050919050565b600067ffffffffffffffff821115613214576132136135b0565b5b61321d826135fd565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613283826133a7565b915061328e836133a7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132c3576132c26134f4565b5b828201905092915050565b60006132d9826133a7565b91506132e4836133a7565b9250826132f4576132f3613523565b5b828204905092915050565b600061330a826133a7565b9150613315836133a7565b925082821015613328576133276134f4565b5b828203905092915050565b600061333e82613387565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156133de5780820151818401526020810190506133c3565b838111156133ed576000848401525b50505050565b6000600282049050600182168061340b57607f821691505b6020821081141561341f5761341e613552565b5b50919050565b61342e826135fd565b810181811067ffffffffffffffff8211171561344d5761344c6135b0565b5b80604052505050565b6000613461826133a7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613494576134936134f4565b5b600182019050919050565b60006134aa826134b1565b9050919050565b60006134bc8261360e565b9050919050565b60006134ce826133a7565b91506134d9836133a7565b9250826134e9576134e8613523565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57686974656c697374206d696e7420686173206e6f742073746172746564207960008201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f696e76616c6964206d65726b6c652070726f6f66000000000000000000000000600082015250565b7f53616c657320617265206f666600000000000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e2076616c756520697320756e646572707269636564600082015250565b7f45786365656473206d617820706572207472616e73616374696f6e0000000000600082015250565b50565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b61385c81613333565b811461386757600080fd5b50565b61387381613345565b811461387e57600080fd5b50565b61388a8161335b565b811461389557600080fd5b50565b6138a1816133a7565b81146138ac57600080fd5b5056fea2646970667358221220d820f747df09e5d28c6f117ce1a125349a8e892073e4f57763b6f68ab2ed320864736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
f3245c896ff0766793f684a207a56b641704b13ea50b655f42c69d3e11f09c0f
-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0xf3245c896ff0766793f684a207a56b641704b13ea50b655f42c69d3e11f09c0f
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : f3245c896ff0766793f684a207a56b641704b13ea50b655f42c69d3e11f09c0f
Deployed Bytecode Sourcemap
67810:3684:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27017:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69578:709;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32664:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34610:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34158:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68111:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26071:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43875:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68419:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68059:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67956:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71314:177;;;;;;;;;;;;;:::i;:::-;;35500:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71101:122;;;;;;;;;;;;;:::i;:::-;;68165:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68200:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32453:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27696:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11608:103;;;;;;;;;;;;;:::i;:::-;;68316:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10960:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70990:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32833:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69038:532;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70897:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34886:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70821:68;;;;;;;;;;;;;:::i;:::-;;68009:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68246:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35756:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71232:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70295:518;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67912:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68828:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35265:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11866:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68282:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68914:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27017:615;27102:4;27417:10;27402:25;;:11;:25;;;;:102;;;;27494:10;27479:25;;:11;:25;;;;27402:102;:179;;;;27571:10;27556:25;;:11;:25;;;;27402:179;27382:199;;27017:615;;;:::o;69578:709::-;69682:8;;;;;;;;;;;69681:9;69673:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;69727:22;;;;;;;;;;;69719:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;67945:4;69824:8;69807:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;69799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68001:1;69886:8;:33;;69878:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;68001:1;70002:8;69969:18;:30;69988:10;69969:30;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:66;;69961:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;70168:4;70080:92;;:84;70099:11;;70080:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70112:10;70151;70134:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;70124:39;;;;;;70080:18;:84::i;:::-;:92;;;70072:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;70238:8;70204:18;:30;70223:10;70204:30;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;70251:31;70261:10;70273:8;70251:9;:31::i;:::-;69578:709;;;:::o;32664:100::-;32718:13;32751:5;32744:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32664:100;:::o;34610:204::-;34678:7;34703:16;34711:7;34703;:16::i;:::-;34698:64;;34728:34;;;;;;;;;;;;;;34698:64;34782:15;:24;34798:7;34782:24;;;;;;;;;;;;;;;;;;;;;34775:31;;34610:204;;;:::o;34158:386::-;34231:13;34247:16;34255:7;34247;:16::i;:::-;34231:32;;34303:5;34280:28;;:19;:17;:19::i;:::-;:28;;;34276:175;;34328:44;34345:5;34352:19;:17;:19::i;:::-;34328:16;:44::i;:::-;34323:128;;34400:35;;;;;;;;;;;;;;34323:128;34276:175;34490:2;34463:15;:24;34479:7;34463:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34528:7;34524:2;34508:28;;34517:5;34508:28;;;;;;;;;;;;34220:324;34158:386;;:::o;68111:45::-;68146:10;68111:45;:::o;26071:315::-;26124:7;26352:15;:13;:15::i;:::-;26337:12;;26321:13;;:28;:46;26314:53;;26071:315;:::o;43875:2800::-;44009:27;44039;44058:7;44039:18;:27::i;:::-;44009:57;;44124:4;44083:45;;44099:19;44083:45;;;44079:86;;44137:28;;;;;;;;;;;;;;44079:86;44179:27;44208:23;44235:28;44255:7;44235:19;:28::i;:::-;44178:85;;;;44363:62;44382:15;44399:4;44405:19;:17;:19::i;:::-;44363:18;:62::i;:::-;44358:174;;44445:43;44462:4;44468:19;:17;:19::i;:::-;44445:16;:43::i;:::-;44440:92;;44497:35;;;;;;;;;;;;;;44440:92;44358:174;44563:1;44549:16;;:2;:16;;;44545:52;;;44574:23;;;;;;;;;;;;;;44545:52;44610:43;44632:4;44638:2;44642:7;44651:1;44610:21;:43::i;:::-;44746:15;44743:160;;;44886:1;44865:19;44858:30;44743:160;45281:18;:24;45300:4;45281:24;;;;;;;;;;;;;;;;45279:26;;;;;;;;;;;;45350:18;:22;45369:2;45350:22;;;;;;;;;;;;;;;;45348:24;;;;;;;;;;;45672:145;45709:2;45757:45;45772:4;45778:2;45782:19;45757:14;:45::i;:::-;23299:8;45730:72;45672:18;:145::i;:::-;45643:17;:26;45661:7;45643:26;;;;;;;;;;;:174;;;;45987:1;23299:8;45937:19;:46;:51;45933:626;;;46009:19;46041:1;46031:7;:11;46009:33;;46198:1;46164:17;:30;46182:11;46164:30;;;;;;;;;;;;:35;46160:384;;;46302:13;;46287:11;:28;46283:242;;46482:19;46449:17;:30;46467:11;46449:30;;;;;;;;;;;:52;;;;46283:242;46160:384;45990:569;45933:626;46606:7;46602:2;46587:27;;46596:4;46587:27;;;;;;;;;;;;46625:42;46646:4;46652:2;46656:7;46665:1;46625:20;:42::i;:::-;43998:2677;;;43875:2800;;;:::o;68419:35::-;;;:::o;68059:45::-;68097:7;68059:45;:::o;67956:46::-;68001:1;67956:46;:::o;71314:177::-;10846:13;:11;:13::i;:::-;71359:12:::1;71385:10;71377:24;;71423:21;71377:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71358:101;;;71478:7;71470:16;;;::::0;::::1;;71353:138;71314:177::o:0;35500:185::-;35638:39;35655:4;35661:2;35665:7;35638:39;;;;;;;;;;;;:16;:39::i;:::-;35500:185;;;:::o;71101:122::-;10846:13;:11;:13::i;:::-;71193:22:::1;;;;;;;;;;;71192:23;71167:22;;:48;;;;;;;;;;;;;;;;;;71101:122::o:0;68165:28::-;;;;;;;;;;;;;:::o;68200:42::-;;;;;;;;;;;;;:::o;32453:144::-;32517:7;32560:27;32579:7;32560:18;:27::i;:::-;32537:52;;32453:144;;;:::o;27696:224::-;27760:7;27801:1;27784:19;;:5;:19;;;27780:60;;;27812:28;;;;;;;;;;;;;;27780:60;22251:13;27858:18;:25;27877:5;27858:25;;;;;;;;;;;;;;;;:54;27851:61;;27696:224;;;:::o;11608:103::-;10846:13;:11;:13::i;:::-;11673:30:::1;11700:1;11673:18;:30::i;:::-;11608:103::o:0;68316:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10960:87::-;11006:7;11033:6;;;;;;;;;;;11026:13;;10960:87;:::o;70990:103::-;10846:13;:11;:13::i;:::-;71082:3:::1;71065:14;:20;;;;;;;;;;;;:::i;:::-;;70990:103:::0;:::o;32833:104::-;32889:13;32922:7;32915:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32833:104;:::o;69038:532::-;69107:8;;;;;;;;;;;69106:9;69098:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;68146:10;69152:9;:24;;69144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;67945:4;69249:8;69232:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;69224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68051:1;69311:8;:30;;69303:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;68051:1;69424:8;69391:18;:30;69410:10;69391:30;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:63;;69383:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;69521:8;69487:18;:30;69506:10;69487:30;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;69534:31;69544:10;69556:8;69534:9;:31::i;:::-;69038:532;:::o;70897:85::-;10846:13;:11;:13::i;:::-;70974:3:::1;70963:8;:14;;;;;;;;;;;;:::i;:::-;;70897:85:::0;:::o;34886:308::-;34997:19;:17;:19::i;:::-;34985:31;;:8;:31;;;34981:61;;;35025:17;;;;;;;;;;;;;;34981:61;35107:8;35055:18;:39;35074:19;:17;:19::i;:::-;35055:39;;;;;;;;;;;;;;;:49;35095:8;35055:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;35167:8;35131:55;;35146:19;:17;:19::i;:::-;35131:55;;;35177:8;35131:55;;;;;;:::i;:::-;;;;;;;;34886:308;;:::o;70821:68::-;10846:13;:11;:13::i;:::-;70877:4:::1;70866:8;;:15;;;;;;;;;;;;;;;;;;70821:68::o:0;68009:43::-;68051:1;68009:43;:::o;68246:27::-;;;;;;;;;;;;;:::o;35756:399::-;35923:31;35936:4;35942:2;35946:7;35923:12;:31::i;:::-;35987:1;35969:2;:14;;;:19;35965:183;;36008:56;36039:4;36045:2;36049:7;36058:5;36008:30;:56::i;:::-;36003:145;;36092:40;;;;;;;;;;;;;;36003:145;35965:183;35756:399;;;;:::o;71232:77::-;10846:13;:11;:13::i;:::-;71298:6:::1;71287:8;;:17;;;;;;;;;;;;;;;;;;71232:77:::0;:::o;70295:518::-;70392:13;70440:16;70448:7;70440;:16::i;:::-;70418:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;70550:5;70538:17;;:8;;;;;;;;;;;:17;;;70534:71;;;70579:14;70572:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70534:71;70617:28;70648:10;:8;:10::i;:::-;70617:41;;70707:1;70682:14;70676:28;:32;:129;;;;;;;;;;;;;;;;;70745:14;70761:18;:7;:16;:18::i;:::-;70728:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70676:129;70669:136;;;70295:518;;;;:::o;67912:37::-;67945:4;67912:37;:::o;68828:78::-;68872:13;68892:9;;;;;;;;;;;;;;68828:78;:::o;35265:164::-;35362:4;35386:18;:25;35405:5;35386:25;;;;;;;;;;;;;;;:35;35412:8;35386:35;;;;;;;;;;;;;;;;;;;;;;;;;35379:42;;35265:164;;;;:::o;11866:201::-;10846:13;:11;:13::i;:::-;11975:1:::1;11955:22;;:8;:22;;;;11947:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12031:28;12050:8;12031:18;:28::i;:::-;11866:201:::0;:::o;68282:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68914:116::-;68973:4;68997:18;:25;69016:5;68997:25;;;;;;;;;;;;;;;;68990:32;;68914:116;;;:::o;26484:285::-;26531:7;26735:15;:13;:15::i;:::-;26719:13;;:31;26712:38;;26484:285;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;1361:40;;1219:190;;;;;:::o;36767:104::-;36836:27;36846:2;36850:8;36836:27;;;;;;;;;;;;:9;:27::i;:::-;36767:104;;:::o;36410:273::-;36467:4;36523:7;36504:15;:13;:15::i;:::-;:26;;:66;;;;;36557:13;;36547:7;:23;36504:66;:152;;;;;36655:1;23021:8;36608:17;:26;36626:7;36608:26;;;;;;;;;;;;:43;:48;36504:152;36484:172;;36410:273;;;:::o;54971:105::-;55031:7;55058:10;55051:17;;54971:105;:::o;68742:81::-;68799:4;68817:1;68810:8;;68742:81;:::o;29370:1129::-;29437:7;29457:12;29472:7;29457:22;;29540:4;29521:15;:13;:15::i;:::-;:23;29517:915;;29574:13;;29567:4;:20;29563:869;;;29612:14;29629:17;:23;29647:4;29629:23;;;;;;;;;;;;29612:40;;29745:1;23021:8;29718:6;:23;:28;29714:699;;;30237:113;30254:1;30244:6;:11;30237:113;;;30297:17;:25;30315:6;;;;;;;30297:25;;;;;;;;;;;;30288:34;;30237:113;;;30383:6;30376:13;;;;;;29714:699;29589:843;29563:869;29517:915;30460:31;;;;;;;;;;;;;;29370:1129;;;;:::o;42211:652::-;42306:27;42335:23;42376:53;42432:15;42376:71;;42618:7;42612:4;42605:21;42653:22;42647:4;42640:36;42729:4;42723;42713:21;42690:44;;42825:19;42819:26;42800:45;;42556:300;42211:652;;;:::o;42976:645::-;43118:11;43280:15;43274:4;43270:26;43262:34;;43439:15;43428:9;43424:31;43411:44;;43586:15;43575:9;43572:30;43565:4;43554:9;43551:19;43548:55;43538:65;;42976:645;;;;;:::o;53804:159::-;;;;;:::o;52116:309::-;52251:7;52271:16;23422:3;52297:19;:40;;52271:67;;23422:3;52364:31;52375:4;52381:2;52385:9;52364:10;:31::i;:::-;52356:40;;:61;;52349:68;;;52116:309;;;;;:::o;31944:447::-;32024:14;32192:15;32185:5;32181:27;32172:36;;32366:5;32352:11;32328:22;32324:40;32321:51;32314:5;32311:62;32301:72;;31944:447;;;;:::o;54622:158::-;;;;;:::o;11125:132::-;11200:12;:10;:12::i;:::-;11189:23;;:7;:5;:7::i;:::-;:23;;;11181:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11125:132::o;12227:191::-;12301:16;12320:6;;;;;;;;;;;12301:25;;12346:8;12337:6;;:17;;;;;;;;;;;;;;;;;;12401:8;12370:40;;12391:8;12370:40;;;;;;;;;;;;12290:128;12227:191;:::o;50626:716::-;50789:4;50835:2;50810:45;;;50856:19;:17;:19::i;:::-;50877:4;50883:7;50892:5;50810:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50806:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51110:1;51093:6;:13;:18;51089:235;;;51139:40;;;;;;;;;;;;;;51089:235;51282:6;51276:13;51267:6;51263:2;51259:15;51252:38;50806:529;50979:54;;;50969:64;;;:6;:64;;;;50962:71;;;50626:716;;;;;;:::o;68645:92::-;68697:13;68724:8;68717:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68645:92;:::o;57408:723::-;57464:13;57694:1;57685:5;:10;57681:53;;;57712:10;;;;;;;;;;;;;;;;;;;;;57681:53;57744:12;57759:5;57744:20;;57775:14;57800:78;57815:1;57807:4;:9;57800:78;;57833:8;;;;;:::i;:::-;;;;57864:2;57856:10;;;;;:::i;:::-;;;57800:78;;;57888:19;57920:6;57910:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57888:39;;57938:154;57954:1;57945:5;:10;57938:154;;57982:1;57972:11;;;;;:::i;:::-;;;58049:2;58041:5;:10;;;;:::i;:::-;58028:2;:24;;;;:::i;:::-;58015:39;;57998:6;58005;57998:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;58078:2;58069:11;;;;;:::i;:::-;;;57938:154;;;58116:6;58102:21;;;;;57408:723;;;;:::o;2086:296::-;2169:7;2189:20;2212:4;2189:27;;2232:9;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;;2300:9;:33::i;:::-;2285:48;;2265:3;;;;;:::i;:::-;;;;2227:118;;;;2362:12;2355:19;;;2086:296;;;;:::o;37287:681::-;37410:19;37416:2;37420:8;37410:5;:19::i;:::-;37489:1;37471:2;:14;;;:19;37467:483;;37511:11;37525:13;;37511:27;;37557:13;37579:8;37573:3;:14;37557:30;;37606:233;37637:62;37676:1;37680:2;37684:7;;;;;;37693:5;37637:30;:62::i;:::-;37632:167;;37735:40;;;;;;;;;;;;;;37632:167;37834:3;37826:5;:11;37606:233;;37921:3;37904:13;;:20;37900:34;;37926:8;;;37900:34;37492:458;;37467:483;37287:681;;;:::o;53001:147::-;53138:6;53001:147;;;;;:::o;9511:98::-;9564:7;9591:10;9584:17;;9511:98;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8414:20;8429:1;8432;8414:14;:20::i;:::-;8383:51;;;8391:20;8406:1;8409;8391:14;:20::i;:::-;8383:51;8376:58;;8293:149;;;;:::o;38241:1529::-;38306:20;38329:13;;38306:36;;38371:1;38357:16;;:2;:16;;;38353:48;;;38382:19;;;;;;;;;;;;;;38353:48;38428:1;38416:8;:13;38412:44;;;38438:18;;;;;;;;;;;;;;38412:44;38469:61;38499:1;38503:2;38507:12;38521:8;38469:21;:61::i;:::-;39012:1;22388:2;38983:1;:25;;38982:31;38970:8;:44;38944:18;:22;38963:2;38944:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;39291:139;39328:2;39382:33;39405:1;39409:2;39413:1;39382:14;:33::i;:::-;39349:30;39370:8;39349:20;:30::i;:::-;:66;39291:18;:139::i;:::-;39257:17;:31;39275:12;39257:31;;;;;;;;;;;:173;;;;39447:15;39465:12;39447:30;;39492:11;39521:8;39506:12;:23;39492:37;;39544:101;39596:9;;;;;;39592:2;39571:35;;39588:1;39571:35;;;;;;;;;;;;39640:3;39630:7;:13;39544:101;;39677:3;39661:13;:19;;;;38718:974;;39702:60;39731:1;39735:2;39739:12;39753:8;39702:20;:60::i;:::-;38295:1475;38241:1529;;:::o;8450:268::-;8518:13;8625:1;8619:4;8612:15;8654:1;8648:4;8641:15;8695:4;8689;8679:21;8670:30;;8450:268;;;;:::o;33774:322::-;33844:14;34075:1;34065:8;34062:15;34037:23;34033:45;34023:55;;33774:322;;;:::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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:323::-;6267:6;6316:2;6304:9;6295:7;6291:23;6287:32;6284:119;;;6322:79;;:::i;:::-;6284:119;6442:1;6467:50;6509:7;6500:6;6489:9;6485:22;6467:50;:::i;:::-;6457:60;;6413:114;6211:323;;;;:::o;6540:327::-;6598:6;6647:2;6635:9;6626:7;6622:23;6618:32;6615:119;;;6653:79;;:::i;:::-;6615:119;6773:1;6798:52;6842:7;6833:6;6822:9;6818:22;6798:52;:::i;:::-;6788:62;;6744:116;6540:327;;;;:::o;6873:349::-;6942:6;6991:2;6979:9;6970:7;6966:23;6962:32;6959:119;;;6997:79;;:::i;:::-;6959:119;7117:1;7142:63;7197:7;7188:6;7177:9;7173:22;7142:63;:::i;:::-;7132:73;;7088:127;6873:349;;;;:::o;7228:509::-;7297:6;7346:2;7334:9;7325:7;7321:23;7317:32;7314:119;;;7352:79;;:::i;:::-;7314:119;7500:1;7489:9;7485:17;7472:31;7530:18;7522:6;7519:30;7516:117;;;7552:79;;:::i;:::-;7516:117;7657:63;7712:7;7703:6;7692:9;7688:22;7657:63;:::i;:::-;7647:73;;7443:287;7228:509;;;;:::o;7743:329::-;7802:6;7851:2;7839:9;7830:7;7826:23;7822:32;7819:119;;;7857:79;;:::i;:::-;7819:119;7977:1;8002:53;8047:7;8038:6;8027:9;8023:22;8002:53;:::i;:::-;7992:63;;7948:117;7743:329;;;;:::o;8078:704::-;8173:6;8181;8189;8238:2;8226:9;8217:7;8213:23;8209:32;8206:119;;;8244:79;;:::i;:::-;8206:119;8364:1;8389:53;8434:7;8425:6;8414:9;8410:22;8389:53;:::i;:::-;8379:63;;8335:117;8519:2;8508:9;8504:18;8491:32;8550:18;8542:6;8539:30;8536:117;;;8572:79;;:::i;:::-;8536:117;8685:80;8757:7;8748:6;8737:9;8733:22;8685:80;:::i;:::-;8667:98;;;;8462:313;8078:704;;;;;:::o;8788:118::-;8875:24;8893:5;8875:24;:::i;:::-;8870:3;8863:37;8788:118;;:::o;8912:157::-;9017:45;9037:24;9055:5;9037:24;:::i;:::-;9017:45;:::i;:::-;9012:3;9005:58;8912:157;;:::o;9075:109::-;9156:21;9171:5;9156:21;:::i;:::-;9151:3;9144:34;9075:109;;:::o;9190:118::-;9277:24;9295:5;9277:24;:::i;:::-;9272:3;9265:37;9190:118;;:::o;9314:360::-;9400:3;9428:38;9460:5;9428:38;:::i;:::-;9482:70;9545:6;9540:3;9482:70;:::i;:::-;9475:77;;9561:52;9606:6;9601:3;9594:4;9587:5;9583:16;9561:52;:::i;:::-;9638:29;9660:6;9638:29;:::i;:::-;9633:3;9629:39;9622:46;;9404:270;9314:360;;;;:::o;9680:364::-;9768:3;9796:39;9829:5;9796:39;:::i;:::-;9851:71;9915:6;9910:3;9851:71;:::i;:::-;9844:78;;9931:52;9976:6;9971:3;9964:4;9957:5;9953:16;9931:52;:::i;:::-;10008:29;10030:6;10008:29;:::i;:::-;10003:3;9999:39;9992:46;;9772:272;9680:364;;;;:::o;10050:377::-;10156:3;10184:39;10217:5;10184:39;:::i;:::-;10239:89;10321:6;10316:3;10239:89;:::i;:::-;10232:96;;10337:52;10382:6;10377:3;10370:4;10363:5;10359:16;10337:52;:::i;:::-;10414:6;10409:3;10405:16;10398:23;;10160:267;10050:377;;;;:::o;10433:366::-;10575:3;10596:67;10660:2;10655:3;10596:67;:::i;:::-;10589:74;;10672:93;10761:3;10672:93;:::i;:::-;10790:2;10785:3;10781:12;10774:19;;10433:366;;;:::o;10805:::-;10947:3;10968:67;11032:2;11027:3;10968:67;:::i;:::-;10961:74;;11044:93;11133:3;11044:93;:::i;:::-;11162:2;11157:3;11153:12;11146:19;;10805:366;;;:::o;11177:::-;11319:3;11340:67;11404:2;11399:3;11340:67;:::i;:::-;11333:74;;11416:93;11505:3;11416:93;:::i;:::-;11534:2;11529:3;11525:12;11518:19;;11177:366;;;:::o;11549:::-;11691:3;11712:67;11776:2;11771:3;11712:67;:::i;:::-;11705:74;;11788:93;11877:3;11788:93;:::i;:::-;11906:2;11901:3;11897:12;11890:19;;11549:366;;;:::o;11921:::-;12063:3;12084:67;12148:2;12143:3;12084:67;:::i;:::-;12077:74;;12160:93;12249:3;12160:93;:::i;:::-;12278:2;12273:3;12269:12;12262:19;;11921:366;;;:::o;12293:400::-;12453:3;12474:84;12556:1;12551:3;12474:84;:::i;:::-;12467:91;;12567:93;12656:3;12567:93;:::i;:::-;12685:1;12680:3;12676:11;12669:18;;12293:400;;;:::o;12699:366::-;12841:3;12862:67;12926:2;12921:3;12862:67;:::i;:::-;12855:74;;12938:93;13027:3;12938:93;:::i;:::-;13056:2;13051:3;13047:12;13040:19;;12699:366;;;:::o;13071:::-;13213:3;13234:67;13298:2;13293:3;13234:67;:::i;:::-;13227:74;;13310:93;13399:3;13310:93;:::i;:::-;13428:2;13423:3;13419:12;13412:19;;13071:366;;;:::o;13443:::-;13585:3;13606:67;13670:2;13665:3;13606:67;:::i;:::-;13599:74;;13682:93;13771:3;13682:93;:::i;:::-;13800:2;13795:3;13791:12;13784:19;;13443:366;;;:::o;13815:::-;13957:3;13978:67;14042:2;14037:3;13978:67;:::i;:::-;13971:74;;14054:93;14143:3;14054:93;:::i;:::-;14172:2;14167:3;14163:12;14156:19;;13815:366;;;:::o;14187:398::-;14346:3;14367:83;14448:1;14443:3;14367:83;:::i;:::-;14360:90;;14459:93;14548:3;14459:93;:::i;:::-;14577:1;14572:3;14568:11;14561:18;;14187:398;;;:::o;14591:366::-;14733:3;14754:67;14818:2;14813:3;14754:67;:::i;:::-;14747:74;;14830:93;14919:3;14830:93;:::i;:::-;14948:2;14943:3;14939:12;14932:19;;14591:366;;;:::o;14963:118::-;15050:24;15068:5;15050:24;:::i;:::-;15045:3;15038:37;14963:118;;:::o;15087:256::-;15199:3;15214:75;15285:3;15276:6;15214:75;:::i;:::-;15314:2;15309:3;15305:12;15298:19;;15334:3;15327:10;;15087:256;;;;:::o;15349:701::-;15630:3;15652:95;15743:3;15734:6;15652:95;:::i;:::-;15645:102;;15764:95;15855:3;15846:6;15764:95;:::i;:::-;15757:102;;15876:148;16020:3;15876:148;:::i;:::-;15869:155;;16041:3;16034:10;;15349:701;;;;;:::o;16056:379::-;16240:3;16262:147;16405:3;16262:147;:::i;:::-;16255:154;;16426:3;16419:10;;16056:379;;;:::o;16441:222::-;16534:4;16572:2;16561:9;16557:18;16549:26;;16585:71;16653:1;16642:9;16638:17;16629:6;16585:71;:::i;:::-;16441:222;;;;:::o;16669:640::-;16864:4;16902:3;16891:9;16887:19;16879:27;;16916:71;16984:1;16973:9;16969:17;16960:6;16916:71;:::i;:::-;16997:72;17065:2;17054:9;17050:18;17041:6;16997:72;:::i;:::-;17079;17147:2;17136:9;17132:18;17123:6;17079:72;:::i;:::-;17198:9;17192:4;17188:20;17183:2;17172:9;17168:18;17161:48;17226:76;17297:4;17288:6;17226:76;:::i;:::-;17218:84;;16669:640;;;;;;;:::o;17315:210::-;17402:4;17440:2;17429:9;17425:18;17417:26;;17453:65;17515:1;17504:9;17500:17;17491:6;17453:65;:::i;:::-;17315:210;;;;:::o;17531:222::-;17624:4;17662:2;17651:9;17647:18;17639:26;;17675:71;17743:1;17732:9;17728:17;17719:6;17675:71;:::i;:::-;17531:222;;;;:::o;17759:313::-;17872:4;17910:2;17899:9;17895:18;17887:26;;17959:9;17953:4;17949:20;17945:1;17934:9;17930:17;17923:47;17987:78;18060:4;18051:6;17987:78;:::i;:::-;17979:86;;17759:313;;;;:::o;18078:419::-;18244:4;18282:2;18271:9;18267:18;18259:26;;18331:9;18325:4;18321:20;18317:1;18306:9;18302:17;18295:47;18359:131;18485:4;18359:131;:::i;:::-;18351:139;;18078:419;;;:::o;18503:::-;18669:4;18707:2;18696:9;18692:18;18684:26;;18756:9;18750:4;18746:20;18742:1;18731:9;18727:17;18720:47;18784:131;18910:4;18784:131;:::i;:::-;18776:139;;18503:419;;;:::o;18928:::-;19094:4;19132:2;19121:9;19117:18;19109:26;;19181:9;19175:4;19171:20;19167:1;19156:9;19152:17;19145:47;19209:131;19335:4;19209:131;:::i;:::-;19201:139;;18928:419;;;:::o;19353:::-;19519:4;19557:2;19546:9;19542:18;19534:26;;19606:9;19600:4;19596:20;19592:1;19581:9;19577:17;19570:47;19634:131;19760:4;19634:131;:::i;:::-;19626:139;;19353:419;;;:::o;19778:::-;19944:4;19982:2;19971:9;19967:18;19959:26;;20031:9;20025:4;20021:20;20017:1;20006:9;20002:17;19995:47;20059:131;20185:4;20059:131;:::i;:::-;20051:139;;19778:419;;;:::o;20203:::-;20369:4;20407:2;20396:9;20392:18;20384:26;;20456:9;20450:4;20446:20;20442:1;20431:9;20427:17;20420:47;20484:131;20610:4;20484:131;:::i;:::-;20476:139;;20203:419;;;:::o;20628:::-;20794:4;20832:2;20821:9;20817:18;20809:26;;20881:9;20875:4;20871:20;20867:1;20856:9;20852:17;20845:47;20909:131;21035:4;20909:131;:::i;:::-;20901:139;;20628:419;;;:::o;21053:::-;21219:4;21257:2;21246:9;21242:18;21234:26;;21306:9;21300:4;21296:20;21292:1;21281:9;21277:17;21270:47;21334:131;21460:4;21334:131;:::i;:::-;21326:139;;21053:419;;;:::o;21478:::-;21644:4;21682:2;21671:9;21667:18;21659:26;;21731:9;21725:4;21721:20;21717:1;21706:9;21702:17;21695:47;21759:131;21885:4;21759:131;:::i;:::-;21751:139;;21478:419;;;:::o;21903:::-;22069:4;22107:2;22096:9;22092:18;22084:26;;22156:9;22150:4;22146:20;22142:1;22131:9;22127:17;22120:47;22184:131;22310:4;22184:131;:::i;:::-;22176:139;;21903:419;;;:::o;22328:222::-;22421:4;22459:2;22448:9;22444:18;22436:26;;22472:71;22540:1;22529:9;22525:17;22516:6;22472:71;:::i;:::-;22328:222;;;;:::o;22556:129::-;22590:6;22617:20;;:::i;:::-;22607:30;;22646:33;22674:4;22666:6;22646:33;:::i;:::-;22556:129;;;:::o;22691:75::-;22724:6;22757:2;22751:9;22741:19;;22691:75;:::o;22772:307::-;22833:4;22923:18;22915:6;22912:30;22909:56;;;22945:18;;:::i;:::-;22909:56;22983:29;23005:6;22983:29;:::i;:::-;22975:37;;23067:4;23061;23057:15;23049:23;;22772:307;;;:::o;23085:308::-;23147:4;23237:18;23229:6;23226:30;23223:56;;;23259:18;;:::i;:::-;23223:56;23297:29;23319:6;23297:29;:::i;:::-;23289:37;;23381:4;23375;23371:15;23363:23;;23085:308;;;:::o;23399:98::-;23450:6;23484:5;23478:12;23468:22;;23399:98;;;:::o;23503:99::-;23555:6;23589:5;23583:12;23573:22;;23503:99;;;:::o;23608:168::-;23691:11;23725:6;23720:3;23713:19;23765:4;23760:3;23756:14;23741:29;;23608:168;;;;:::o;23782:147::-;23883:11;23920:3;23905:18;;23782:147;;;;:::o;23935:169::-;24019:11;24053:6;24048:3;24041:19;24093:4;24088:3;24084:14;24069:29;;23935:169;;;;:::o;24110:148::-;24212:11;24249:3;24234:18;;24110:148;;;;:::o;24264:305::-;24304:3;24323:20;24341:1;24323:20;:::i;:::-;24318:25;;24357:20;24375:1;24357:20;:::i;:::-;24352:25;;24511:1;24443:66;24439:74;24436:1;24433:81;24430:107;;;24517:18;;:::i;:::-;24430:107;24561:1;24558;24554:9;24547:16;;24264:305;;;;:::o;24575:185::-;24615:1;24632:20;24650:1;24632:20;:::i;:::-;24627:25;;24666:20;24684:1;24666:20;:::i;:::-;24661:25;;24705:1;24695:35;;24710:18;;:::i;:::-;24695:35;24752:1;24749;24745:9;24740:14;;24575:185;;;;:::o;24766:191::-;24806:4;24826:20;24844:1;24826:20;:::i;:::-;24821:25;;24860:20;24878:1;24860:20;:::i;:::-;24855:25;;24899:1;24896;24893:8;24890:34;;;24904:18;;:::i;:::-;24890:34;24949:1;24946;24942:9;24934:17;;24766:191;;;;:::o;24963:96::-;25000:7;25029:24;25047:5;25029:24;:::i;:::-;25018:35;;24963:96;;;:::o;25065:90::-;25099:7;25142:5;25135:13;25128:21;25117:32;;25065:90;;;:::o;25161:77::-;25198:7;25227:5;25216:16;;25161:77;;;:::o;25244:149::-;25280:7;25320:66;25313:5;25309:78;25298:89;;25244:149;;;:::o;25399:126::-;25436:7;25476:42;25469:5;25465:54;25454:65;;25399:126;;;:::o;25531:77::-;25568:7;25597:5;25586:16;;25531:77;;;:::o;25614:154::-;25698:6;25693:3;25688;25675:30;25760:1;25751:6;25746:3;25742:16;25735:27;25614:154;;;:::o;25774:307::-;25842:1;25852:113;25866:6;25863:1;25860:13;25852:113;;;25951:1;25946:3;25942:11;25936:18;25932:1;25927:3;25923:11;25916:39;25888:2;25885:1;25881:10;25876:15;;25852:113;;;25983:6;25980:1;25977:13;25974:101;;;26063:1;26054:6;26049:3;26045:16;26038:27;25974:101;25823:258;25774:307;;;:::o;26087:320::-;26131:6;26168:1;26162:4;26158:12;26148:22;;26215:1;26209:4;26205:12;26236:18;26226:81;;26292:4;26284:6;26280:17;26270:27;;26226:81;26354:2;26346:6;26343:14;26323:18;26320:38;26317:84;;;26373:18;;:::i;:::-;26317:84;26138:269;26087:320;;;:::o;26413:281::-;26496:27;26518:4;26496:27;:::i;:::-;26488:6;26484:40;26626:6;26614:10;26611:22;26590:18;26578:10;26575:34;26572:62;26569:88;;;26637:18;;:::i;:::-;26569:88;26677:10;26673:2;26666:22;26456:238;26413:281;;:::o;26700:233::-;26739:3;26762:24;26780:5;26762:24;:::i;:::-;26753:33;;26808:66;26801:5;26798:77;26795:103;;;26878:18;;:::i;:::-;26795:103;26925:1;26918:5;26914:13;26907:20;;26700:233;;;:::o;26939:100::-;26978:7;27007:26;27027:5;27007:26;:::i;:::-;26996:37;;26939:100;;;:::o;27045:94::-;27084:7;27113:20;27127:5;27113:20;:::i;:::-;27102:31;;27045:94;;;:::o;27145:176::-;27177:1;27194:20;27212:1;27194:20;:::i;:::-;27189:25;;27228:20;27246:1;27228:20;:::i;:::-;27223:25;;27267:1;27257:35;;27272:18;;:::i;:::-;27257:35;27313:1;27310;27306:9;27301:14;;27145:176;;;;:::o;27327:180::-;27375:77;27372:1;27365:88;27472:4;27469:1;27462:15;27496:4;27493:1;27486:15;27513:180;27561:77;27558:1;27551:88;27658:4;27655:1;27648:15;27682:4;27679:1;27672:15;27699:180;27747:77;27744:1;27737:88;27844:4;27841:1;27834:15;27868:4;27865:1;27858:15;27885:180;27933:77;27930:1;27923:88;28030:4;28027:1;28020:15;28054:4;28051:1;28044:15;28071:180;28119:77;28116:1;28109:88;28216:4;28213:1;28206:15;28240:4;28237:1;28230:15;28257:117;28366:1;28363;28356:12;28380:117;28489:1;28486;28479:12;28503:117;28612:1;28609;28602:12;28626:117;28735:1;28732;28725:12;28749:117;28858:1;28855;28848:12;28872:117;28981:1;28978;28971:12;28995:102;29036:6;29087:2;29083:7;29078:2;29071:5;29067:14;29063:28;29053:38;;28995:102;;;:::o;29103:94::-;29136:8;29184:5;29180:2;29176:14;29155:35;;29103:94;;;:::o;29203:221::-;29343:34;29339:1;29331:6;29327:14;29320:58;29412:4;29407:2;29399:6;29395:15;29388:29;29203:221;:::o;29430:225::-;29570:34;29566:1;29558:6;29554:14;29547:58;29639:8;29634:2;29626:6;29622:15;29615:33;29430:225;:::o;29661:170::-;29801:22;29797:1;29789:6;29785:14;29778:46;29661:170;:::o;29837:163::-;29977:15;29973:1;29965:6;29961:14;29954:39;29837:163;:::o;30006:168::-;30146:20;30142:1;30134:6;30130:14;30123:44;30006:168;:::o;30180:155::-;30320:7;30316:1;30308:6;30304:14;30297:31;30180:155;:::o;30341:182::-;30481:34;30477:1;30469:6;30465:14;30458:58;30341:182;:::o;30529:234::-;30669:34;30665:1;30657:6;30653:14;30646:58;30738:17;30733:2;30725:6;30721:15;30714:42;30529:234;:::o;30769:182::-;30909:34;30905:1;30897:6;30893:14;30886:58;30769:182;:::o;30957:177::-;31097:29;31093:1;31085:6;31081:14;31074:53;30957:177;:::o;31140:114::-;;:::o;31260:172::-;31400:24;31396:1;31388:6;31384:14;31377:48;31260:172;:::o;31438:122::-;31511:24;31529:5;31511:24;:::i;:::-;31504:5;31501:35;31491:63;;31550:1;31547;31540:12;31491:63;31438:122;:::o;31566:116::-;31636:21;31651:5;31636:21;:::i;:::-;31629:5;31626:32;31616:60;;31672:1;31669;31662:12;31616:60;31566:116;:::o;31688:120::-;31760:23;31777:5;31760:23;:::i;:::-;31753:5;31750:34;31740:62;;31798:1;31795;31788:12;31740:62;31688:120;:::o;31814:122::-;31887:24;31905:5;31887:24;:::i;:::-;31880:5;31877:35;31867:63;;31926:1;31923;31916:12;31867:63;31814:122;:::o
Swarm Source
ipfs://d820f747df09e5d28c6f117ce1a125349a8e892073e4f57763b6f68ab2ed3208
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.