Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 67 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 18280360 | 478 days ago | IN | 0 ETH | 0.00031149 | ||||
Set Approval For... | 17474268 | 591 days ago | IN | 0 ETH | 0.00036542 | ||||
Transfer From | 17262964 | 621 days ago | IN | 0 ETH | 0.0023221 | ||||
Safe Transfer Fr... | 17127626 | 640 days ago | IN | 0 ETH | 0.00239849 | ||||
Safe Transfer Fr... | 17127622 | 640 days ago | IN | 0 ETH | 0.0024465 | ||||
Safe Transfer Fr... | 17127616 | 640 days ago | IN | 0 ETH | 0.00232098 | ||||
Set Approval For... | 17120902 | 641 days ago | IN | 0 ETH | 0.00158895 | ||||
Set Base URI | 17117286 | 641 days ago | IN | 0 ETH | 0.0025759 | ||||
Set Blindbox Ope... | 17117220 | 641 days ago | IN | 0 ETH | 0.00292757 | ||||
Set Base URI | 17117219 | 641 days ago | IN | 0 ETH | 0.00546058 | ||||
Set Approval For... | 17079104 | 647 days ago | IN | 0 ETH | 0.00268962 | ||||
Withdraw Money | 17075178 | 647 days ago | IN | 0 ETH | 0.00214296 | ||||
Mint | 17074341 | 647 days ago | IN | 0.015 ETH | 0.00657763 | ||||
Mint | 17074312 | 647 days ago | IN | 0.015 ETH | 0.0067312 | ||||
Mint | 17074309 | 647 days ago | IN | 0.015 ETH | 0.00921104 | ||||
Mint | 17074222 | 647 days ago | IN | 0.01 ETH | 0.00225022 | ||||
Set Approval For... | 17074126 | 647 days ago | IN | 0 ETH | 0.00302301 | ||||
Mint | 17074012 | 647 days ago | IN | 0.01 ETH | 0.00676529 | ||||
Mint | 17074010 | 647 days ago | IN | 0.01 ETH | 0.00714147 | ||||
Mint | 17074003 | 647 days ago | IN | 0.01 ETH | 0.00965117 | ||||
Mint | 17073976 | 647 days ago | IN | 0.01 ETH | 0.00880799 | ||||
Mint | 17073966 | 647 days ago | IN | 0.01 ETH | 0.00941787 | ||||
Mint | 17073932 | 647 days ago | IN | 0.01 ETH | 0.00673475 | ||||
Set Approval For... | 17073913 | 647 days ago | IN | 0 ETH | 0.00214596 | ||||
Mint | 17073896 | 647 days ago | IN | 0.01 ETH | 0.00801546 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17075178 | 647 days ago | 0.435 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Bayers
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-18 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * 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. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ 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 simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _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} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _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 sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _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}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: @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: Bayers.sol pragma solidity 0.8.13; contract Bayers is Ownable, ERC721A { // metadata URI string private _baseTokenURI; string private _blindboxURI; bytes32 public immutable merkleRoot; bytes32 public immutable merkleRoot2; uint256 private phase1 = 1681819200; uint256 private phase2 = 1681822800; uint256 private phase3 = 1681826400; uint256 private phase4 = 1681830000; uint256 private phase5 = 1681833600; uint256 private phase5end = 1681837200; uint256 private phase1Amount = 1; uint256 private phase2Amount = 4; uint256 private phase3Amount = 4; uint256 private phase1Price = 0 ether; uint256 private phase2Price = 0.01 ether; uint256 private phase3Price = 6 ether; uint256 private phase4Price = 0.015 ether; uint256 private phase5Price = 9 ether; mapping(address => uint256[]) private _tokensPerOwnerPhase1; mapping(address => uint256[]) private _tokensPerOwnerPhase2; mapping(address => uint256[]) private _tokensPerOwnerPhase3; mapping(address => uint256[]) private _tokensPerOwnerPhase4; mapping(address => uint256[]) private _tokensPerOwnerPhase5; uint256 public chain = 1; uint256 private TOTAL_PHASE1 = 1100; uint256 private TOTAL_PHASE2 = 400; uint256 public mintedEth = 0; uint256 public mintedEthw = 0; uint256 public TOTAL = 4800; uint256 public blindboxOpen = 0; uint256 public _totalSupply = 0; uint256 public _totalSupplyPhase1 = 0; uint256 public _totalSupplyPhase2 = 0; uint256 public _totalSupplyPhase3 = 0; uint256 public _totalSupplyPhase4 = 0; uint256 public _totalSupplyPhase5 = 0; uint256 private _tokenIds = 0; bool private timelimit = true; constructor( string memory _uri, string memory blindboxUri, string memory _name, string memory _symbol, uint256 _chain, bytes32 _merkleRoot, bytes32 _merkleRoot2, bool _timelimit ) ERC721A(_name, _symbol) { _baseTokenURI = _uri; chain = _chain; merkleRoot = _merkleRoot; merkleRoot2 = _merkleRoot2; timelimit = _timelimit; _blindboxURI = blindboxUri; } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function getCurrentIndex() public view returns (uint256) { return _nextTokenId(); } modifier checkTimeAndAmount(uint256 phase, uint256 amount) { require(tx.origin == msg.sender, "The caller is another contract"); if (chain == 10001) { require( _totalSupply < TOTAL - mintedEth, "The total supply has been reached" ); } else if (chain == 1) { require( _totalSupply < TOTAL - mintedEthw, "The total supply has been reached" ); } require(phase > 0 && phase < 6, "phase invalid"); if (phase == 1) { require(chain == 10001, "please mint on ethw"); require( _totalSupplyPhase1 < TOTAL_PHASE1, "The total phase1 supply has been reached" ); if (timelimit) { require( block.timestamp >= phase1 && block.timestamp < phase2, "not start or ended" ); } require(amount <= phase1Amount, "amount out of limit"); require( _tokensPerOwnerPhase1[msg.sender].length < phase1Amount, "This address mint limited" ); } else if (phase == 2) { require(chain == 1, "please mint on eth"); require( _totalSupplyPhase2 < TOTAL_PHASE2, "The total phase2 supply has been reached" ); if (timelimit) { require( block.timestamp >= phase2 && block.timestamp < phase3, "not start or ended" ); } require(amount <= phase2Amount, "amount out of limit"); require( _tokensPerOwnerPhase2[msg.sender].length < phase2Amount, "This address mint limited" ); } else if (phase == 3) { require(chain == 10001, "please mint on ethw"); if (timelimit) { require( block.timestamp >= phase3 && block.timestamp < phase4, "not start or ended" ); } require(amount <= phase3Amount, "amount out of limit"); require( _tokensPerOwnerPhase3[msg.sender].length < phase3Amount, "This address mint limited" ); } else if (phase == 4) { require(chain == 1, "please mint on eth"); if (timelimit) { require( block.timestamp >= phase4 && block.timestamp < phase5, "not start or ended" ); } } else if (phase == 5) { require(chain == 10001, "please mint on ethw"); if (timelimit) { require( block.timestamp >= phase5 && block.timestamp < phase5end, "not start or ended" ); } } _; } function refundIfOver(uint256 price_) private { require( msg.value >= price_, chain == 10001 ? "Need to send more ETHW." : "Need to send more ETH." ); if (msg.value > price_) { payable(msg.sender).transfer(msg.value - price_); } } // mint function mint(uint256 phase, bytes32[] calldata proof) public payable checkTimeAndAmount(phase, 1) { if (phase == 1) { bytes32 leaf = keccak256( bytes.concat(keccak256(abi.encode(msg.sender, 1))) ); bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf); if (!isValidLeaf) { revert("not in free mint"); } refundIfOver(phase1Price); _tokensPerOwnerPhase1[msg.sender].push(_tokenIds); _totalSupplyPhase1++; } else if (phase == 2) { bytes32 leaf = keccak256( bytes.concat(keccak256(abi.encode(msg.sender, 1))) ); bool isValidLeaf = MerkleProof.verify(proof, merkleRoot2, leaf); if (!isValidLeaf) { revert("not in whitelist"); } refundIfOver(phase2Price); _tokensPerOwnerPhase2[msg.sender].push(_tokenIds); _totalSupplyPhase2++; } else if (phase == 3) { bytes32 leaf = keccak256( bytes.concat(keccak256(abi.encode(msg.sender, 1))) ); bool isValidLeaf = MerkleProof.verify(proof, merkleRoot2, leaf); if (!isValidLeaf) { revert("not in whitelist"); } refundIfOver(phase3Price); _tokensPerOwnerPhase3[msg.sender].push(_tokenIds); _totalSupplyPhase3++; } else if (phase == 4) { refundIfOver(phase4Price); _tokensPerOwnerPhase4[msg.sender].push(_tokenIds); _totalSupplyPhase4++; } else if (phase == 5) { refundIfOver(phase5Price); _tokensPerOwnerPhase5[msg.sender].push(_tokenIds); _totalSupplyPhase5++; } _safeMint(address(msg.sender), 1); _tokenIds++; _totalSupply++; } // config function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { string memory baseURI = _baseURI(); if (blindboxOpen == 0) { return _blindboxURI; } else { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); return bytes(baseURI).length != 0 ? string( abi.encodePacked(baseURI, _toString(tokenId), ".json") ) : ""; } } function redeem(uint256 tokenId) external onlyOwner { _burn(tokenId); } function burn(uint256 tokenId) public { _burn(tokenId); } function getLeafHash(address to) public view returns (bytes32) { if (!timelimit) { bytes32 leaf = keccak256( bytes.concat(keccak256(abi.encode(to, 1))) ); return leaf; } else { return 0; } } function setBlindboxOpen(uint256 state) public onlyOwner { blindboxOpen = state; } function setBlindboxURI(string memory blindboxURI) public onlyOwner { _blindboxURI = blindboxURI; } function setMintedEth(uint256 amount) public onlyOwner { mintedEth = amount; } function setMintedEthw(uint256 amount) public onlyOwner { mintedEthw = amount; } function getUserMinted(uint phase, address account) public view returns(uint256){ if(phase == 1){ return _tokensPerOwnerPhase1[account].length; } if(phase == 2){ return _tokensPerOwnerPhase2[account].length; } if(phase == 3){ return _tokensPerOwnerPhase3[account].length; } if(phase == 4){ return _tokensPerOwnerPhase4[account].length; } if(phase == 5){ return _tokensPerOwnerPhase5[account].length; } return 0; } function withdrawMoney() external onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"blindboxUri","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_chain","type":"uint256"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_merkleRoot2","type":"bytes32"},{"internalType":"bool","name":"_timelimit","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","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":[],"name":"TOTAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupplyPhase1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupplyPhase2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupplyPhase3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupplyPhase4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupplyPhase5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blindboxOpen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"getLeafHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"phase","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"getUserMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot2","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"phase","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintedEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedEthw","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"state","type":"uint256"}],"name":"setBlindboxOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"blindboxURI","type":"string"}],"name":"setBlindboxURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMintedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMintedEthw","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405263643e8640600b5563643e9450600c5563643ea260600d5563643eb070600e5563643ebe80600f5563643ecc906010556001601155600460125560046013556000601455662386f26fc100006015556753444835ec58000060165566354a6ba7a18000601755677ce66c50e28400006018556001601e5561044c601f55610190602055600060215560006022556112c06023556000602455600060255560006026556000602755600060285560006029556000602a556000602b556001602c60006101000a81548160ff021916908315150217905550348015620000e757600080fd5b506040516200500d3803806200500d83398181016040528101906200010d9190620005bb565b85856200012f62000123620001ea60201b60201c565b620001f260201b60201c565b816003908051906020019062000147929190620002bb565b50806004908051906020019062000160929190620002bb565b5062000171620002b660201b60201c565b6001819055505050876009908051906020019062000191929190620002bb565b5083601e8190555082608081815250508160a0818152505080602c60006101000a81548160ff02191690831515021790555086600a9080519060200190620001db929190620002bb565b50505050505050505062000764565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620002c9906200072f565b90600052602060002090601f016020900481019282620002ed576000855562000339565b82601f106200030857805160ff191683800117855562000339565b8280016001018555821562000339579182015b82811115620003385782518255916020019190600101906200031b565b5b5090506200034891906200034c565b5090565b5b80821115620003675760008160009055506001016200034d565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003d48262000389565b810181811067ffffffffffffffff82111715620003f657620003f56200039a565b5b80604052505050565b60006200040b6200036b565b9050620004198282620003c9565b919050565b600067ffffffffffffffff8211156200043c576200043b6200039a565b5b620004478262000389565b9050602081019050919050565b60005b838110156200047457808201518184015260208101905062000457565b8381111562000484576000848401525b50505050565b6000620004a16200049b846200041e565b620003ff565b905082815260208101848484011115620004c057620004bf62000384565b5b620004cd84828562000454565b509392505050565b600082601f830112620004ed57620004ec6200037f565b5b8151620004ff8482602086016200048a565b91505092915050565b6000819050919050565b6200051d8162000508565b81146200052957600080fd5b50565b6000815190506200053d8162000512565b92915050565b6000819050919050565b620005588162000543565b81146200056457600080fd5b50565b60008151905062000578816200054d565b92915050565b60008115159050919050565b62000595816200057e565b8114620005a157600080fd5b50565b600081519050620005b5816200058a565b92915050565b600080600080600080600080610100898b031215620005df57620005de62000375565b5b600089015167ffffffffffffffff8111156200060057620005ff6200037a565b5b6200060e8b828c01620004d5565b985050602089015167ffffffffffffffff8111156200063257620006316200037a565b5b620006408b828c01620004d5565b975050604089015167ffffffffffffffff8111156200066457620006636200037a565b5b620006728b828c01620004d5565b965050606089015167ffffffffffffffff8111156200069657620006956200037a565b5b620006a48b828c01620004d5565b9550506080620006b78b828c016200052c565b94505060a0620006ca8b828c0162000567565b93505060c0620006dd8b828c0162000567565b92505060e0620006f08b828c01620005a4565b9150509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200074857607f821691505b6020821081036200075e576200075d62000700565b5b50919050565b60805160a05161486e6200079f600039600081816120e5015281816122830152612632015260008181610ff20152611f47015261486e6000f3fe6080604052600436106102515760003560e01c80636473738011610139578063ac446002116100b6578063c87b56dd1161007a578063c87b56dd1461084d578063ca34adf01461088a578063db006a75146108b5578063e49b351b146108de578063e985e9c514610909578063f2fde38b1461094657610251565b8063ac446002146107a8578063b4954b00146107bf578063b88d4fde146107ea578063ba41b0c614610806578063c763e5a11461082257610251565b8063715018a6116100fd578063715018a6146106e75780638894695b146106fe5780638da5cb5b1461072957806395d89b4114610754578063a22cb4651461077f57610251565b806364737380146105ee578063696b93d51461062b5780636e27755d146106565780636fa9b9a91461067f57806370a08231146106aa57610251565b806327efc086116101d257806342966c681161019657806342966c68146104cc5780634f11ca00146104f5578063554a82f61461052057806355f804b31461054b5780635b7b108c146105745780636352211e146105b157610251565b806327efc0861461040457806328f72b291461042f5780632eb4a7ab1461045a5780633eaaf86b1461048557806342842e0e146104b057610251565b806314ba7a571161021957806314ba7a571461034257806318160ddd1461036b5780631a15fe24146103965780632269c1af146103bf57806323b872dd146103e857610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb5780630d9005ae14610317575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613563565b61096f565b60405161028a91906135ab565b60405180910390f35b34801561029f57600080fd5b506102a8610a01565b6040516102b5919061365f565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906136b7565b610a93565b6040516102f29190613725565b60405180910390f35b6103156004803603810190610310919061376c565b610b12565b005b34801561032357600080fd5b5061032c610c56565b60405161033991906137bb565b60405180910390f35b34801561034e57600080fd5b50610369600480360381019061036491906136b7565b610c65565b005b34801561037757600080fd5b50610380610c77565b60405161038d91906137bb565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b891906136b7565b610c8e565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061390b565b610ca0565b005b61040260048036038101906103fd9190613954565b610cc2565b005b34801561041057600080fd5b50610419610fe4565b60405161042691906137bb565b60405180910390f35b34801561043b57600080fd5b50610444610fea565b60405161045191906137bb565b60405180910390f35b34801561046657600080fd5b5061046f610ff0565b60405161047c91906139c0565b60405180910390f35b34801561049157600080fd5b5061049a611014565b6040516104a791906137bb565b60405180910390f35b6104ca60048036038101906104c59190613954565b61101a565b005b3480156104d857600080fd5b506104f360048036038101906104ee91906136b7565b61103a565b005b34801561050157600080fd5b5061050a611046565b60405161051791906137bb565b60405180910390f35b34801561052c57600080fd5b5061053561104c565b60405161054291906137bb565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190613a3b565b611052565b005b34801561058057600080fd5b5061059b60048036038101906105969190613a88565b611070565b6040516105a891906139c0565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d391906136b7565b6110ef565b6040516105e59190613725565b60405180910390f35b3480156105fa57600080fd5b5061061560048036038101906106109190613ab5565b611101565b60405161062291906137bb565b60405180910390f35b34801561063757600080fd5b506106406112a8565b60405161064d91906137bb565b60405180910390f35b34801561066257600080fd5b5061067d600480360381019061067891906136b7565b6112ae565b005b34801561068b57600080fd5b506106946112c0565b6040516106a191906137bb565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613a88565b6112c6565b6040516106de91906137bb565b60405180910390f35b3480156106f357600080fd5b506106fc61137e565b005b34801561070a57600080fd5b50610713611392565b60405161072091906137bb565b60405180910390f35b34801561073557600080fd5b5061073e611398565b60405161074b9190613725565b60405180910390f35b34801561076057600080fd5b506107696113c1565b604051610776919061365f565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a19190613b21565b611453565b005b3480156107b457600080fd5b506107bd61155e565b005b3480156107cb57600080fd5b506107d4611615565b6040516107e191906137bb565b60405180910390f35b61080460048036038101906107ff9190613c02565b61161b565b005b610820600480360381019061081b9190613cdb565b61168e565b005b34801561082e57600080fd5b506108376124ee565b60405161084491906137bb565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f91906136b7565b6124f4565b604051610881919061365f565b60405180910390f35b34801561089657600080fd5b5061089f612630565b6040516108ac91906139c0565b60405180910390f35b3480156108c157600080fd5b506108dc60048036038101906108d791906136b7565b612654565b005b3480156108ea57600080fd5b506108f3612668565b60405161090091906137bb565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190613d3b565b61266e565b60405161093d91906135ab565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190613a88565b612702565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109fa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a1090613daa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3c90613daa565b8015610a895780601f10610a5e57610100808354040283529160200191610a89565b820191906000526020600020905b815481529060010190602001808311610a6c57829003601f168201915b5050505050905090565b6000610a9e82612785565b610ad4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1d826110ef565b90508073ffffffffffffffffffffffffffffffffffffffff16610b3e6127e4565b73ffffffffffffffffffffffffffffffffffffffff1614610ba157610b6a81610b656127e4565b61266e565b610ba0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c606127ec565b905090565b610c6d6127f6565b8060218190555050565b6000610c81612874565b6002546001540303905090565b610c966127f6565b8060248190555050565b610ca86127f6565b80600a9080519060200190610cbe9291906133ce565b5050565b6000610ccd82612879565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d34576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d4084612945565b91509150610d568187610d516127e4565b61296c565b610da257610d6b86610d666127e4565b61266e565b610da1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e08576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1586868660016129b0565b8015610e2057600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610eee85610eca8888876129b6565b7c0200000000000000000000000000000000000000000000000000000000176129de565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f745760006001850190506000600560008381526020019081526020016000205403610f72576001548114610f71578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fdc8686866001612a09565b505050505050565b60235481565b602a5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60255481565b6110358383836040518060200160405280600081525061161b565b505050565b61104381612a0f565b50565b60245481565b60275481565b61105a6127f6565b81816009919061106b929190613454565b505050565b6000602c60009054906101000a900460ff166110e357600082600160405160200161109c929190613e2d565b604051602081830303815290604052805190602001206040516020016110c29190613e77565b604051602081830303815290604052805190602001209050809150506110ea565b6000801b90505b919050565b60006110fa82612879565b9050919050565b60006001830361115557601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b600283036111a757601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b600383036111f957601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b6004830361124b57601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b6005830361129d57601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b600090505b92915050565b60295481565b6112b66127f6565b8060228190555050565b60225481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361132d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113866127f6565b6113906000612a1d565b565b60265481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546113d090613daa565b80601f01602080910402602001604051908101604052809291908181526020018280546113fc90613daa565b80156114495780601f1061141e57610100808354040283529160200191611449565b820191906000526020600020905b81548152906001019060200180831161142c57829003601f168201915b5050505050905090565b80600860006114606127e4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661150d6127e4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161155291906135ab565b60405180910390a35050565b6115666127f6565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161158c90613ec3565b60006040518083038185875af1925050503d80600081146115c9576040519150601f19603f3d011682016040523d82523d6000602084013e6115ce565b606091505b5050905080611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990613f24565b60405180910390fd5b50565b60215481565b611626848484610cc2565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116885761165184848484612ae1565b611687576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b8260013373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690613f90565b60405180910390fd5b612711601e54036117625760215460235461171a9190613fdf565b6025541061175d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175490614085565b60405180910390fd5b6117c1565b6001601e54036117c05760225460235461177c9190613fdf565b602554106117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690614085565b60405180910390fd5b5b5b6000821180156117d15750600682105b611810576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611807906140f1565b60405180910390fd5b600182036119dc57612711601e541461185e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118559061415d565b60405180910390fd5b601f54602654106118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b906141ef565b60405180910390fd5b602c60009054906101000a900460ff161561190c57600b5442101580156118cc5750600c5442105b61190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061425b565b60405180910390fd5b5b601154811115611951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611948906142c7565b60405180910390fd5b601154601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050106119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce90614333565b60405180910390fd5b611ea2565b60028203611ba7576001601e5414611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a209061439f565b60405180910390fd5b60205460275410611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690614431565b60405180910390fd5b602c60009054906101000a900460ff1615611ad757600c544210158015611a975750600d5442105b611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd9061425b565b60405180910390fd5b5b601254811115611b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b13906142c7565b60405180910390fd5b601254601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9990614333565b60405180910390fd5b611ea1565b60038203611d2d57612711601e5414611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec9061415d565b60405180910390fd5b602c60009054906101000a900460ff1615611c5d57600d544210158015611c1d5750600e5442105b611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c539061425b565b60405180910390fd5b5b601354811115611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c99906142c7565b60405180910390fd5b601354601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f90614333565b60405180910390fd5b611ea0565b60048203611de7576001601e5414611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d719061439f565b60405180910390fd5b602c60009054906101000a900460ff1615611de257600e544210158015611da25750600f5442105b611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd89061425b565b60405180910390fd5b5b611e9f565b60058203611e9e57612711601e5414611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c9061415d565b60405180910390fd5b602c60009054906101000a900460ff1615611e9d57600f544210158015611e5d575060105442105b611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e939061425b565b60405180910390fd5b5b5b5b5b5b5b60018503612040576000336001604051602001611ec0929190613e2d565b60405160208183030381529060405280519060200120604051602001611ee69190613e77565b6040516020818303038152906040528051906020012090506000611f6c868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f000000000000000000000000000000000000000000000000000000000000000084612c31565b905080611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa59061449d565b60405180910390fd5b611fb9601454612c48565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b54908060018154018082558091505060019003906000526020600020016000909190919091505560266000815480929190612034906144bd565b919050555050506124ac565b600285036121de57600033600160405160200161205e929190613e2d565b604051602081830303815290604052805190602001206040516020016120849190613e77565b604051602081830303815290604052805190602001209050600061210a868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f000000000000000000000000000000000000000000000000000000000000000084612c31565b90508061214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214390614551565b60405180910390fd5b612157601554612c48565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b549080600181540180825580915050600190039060005260206000200160009091909190915055602760008154809291906121d2906144bd565b919050555050506124ab565b6003850361237c5760003360016040516020016121fc929190613e2d565b604051602081830303815290604052805190602001206040516020016122229190613e77565b60405160208183030381529060405280519060200120905060006122a8868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f000000000000000000000000000000000000000000000000000000000000000084612c31565b9050806122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190614551565b60405180910390fd5b6122f5601654612c48565b601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b54908060018154018082558091505060019003906000526020600020016000909190919091505560286000815480929190612370906144bd565b919050555050506124aa565b600485036124145761238f601754612c48565b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b5490806001815401808255809150506001900390600052602060002001600090919091909150556029600081548092919061240a906144bd565b91905055506124a9565b600585036124a857612427601854612c48565b601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b549080600181540180825580915050600190039060005260206000200160009091909190915055602a60008154809291906124a2906144bd565b91905055505b5b5b5b5b6124b7336001612d69565b602b60008154809291906124ca906144bd565b9190505550602560008154809291906124e2906144bd565b91905055505050505050565b601e5481565b60606000612500612d87565b905060006024540361259f57600a805461251990613daa565b80601f016020809104026020016040519081016040528092919081815260200182805461254590613daa565b80156125925780601f1061256757610100808354040283529160200191612592565b820191906000526020600020905b81548152906001019060200180831161257557829003601f168201915b505050505091505061262b565b6125a883612785565b6125de576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151036125fc5760405180602001604052806000815250612627565b8061260684612e19565b6040516020016126179291906145f9565b6040516020818303038152906040525b9150505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61265c6127f6565b61266581612a0f565b50565b60285481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61270a6127f6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127709061469a565b60405180910390fd5b61278281612a1d565b50565b600081612790612874565b1115801561279f575060015482105b80156127dd575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b6000600154905090565b6127fe612e69565b73ffffffffffffffffffffffffffffffffffffffff1661281c611398565b73ffffffffffffffffffffffffffffffffffffffff1614612872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286990614706565b60405180910390fd5b565b600090565b60008082905080612888612874565b1161290e5760015481101561290d5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361290b575b600081036129015760056000836001900393508381526020019081526020016000205490506128d7565b8092505050612940565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129cd868684612e71565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612a1a816000612e7a565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b076127e4565b8786866040518563ffffffff1660e01b8152600401612b29949392919061477b565b6020604051808303816000875af1925050508015612b6557506040513d601f19601f82011682018060405250810190612b6291906147dc565b60015b612bde573d8060008114612b95576040519150601f19603f3d011682016040523d82523d6000602084013e612b9a565b606091505b506000815103612bd6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600082612c3e85846130cc565b1490509392505050565b80341015612711601e5414612c92576040518060400160405280601681526020017f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000815250612cc9565b6040518060400160405280601781526020017f4e65656420746f2073656e64206d6f726520455448572e0000000000000000008152505b90612d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d01919061365f565b60405180910390fd5b5080341115612d66573373ffffffffffffffffffffffffffffffffffffffff166108fc8234612d399190613fdf565b9081150290604051600060405180830381858888f19350505050158015612d64573d6000803e3d6000fd5b505b50565b612d83828260405180602001604052806000815250613122565b5050565b606060098054612d9690613daa565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc290613daa565b8015612e0f5780601f10612de457610100808354040283529160200191612e0f565b820191906000526020600020905b815481529060010190602001808311612df257829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612e5457600184039350600a81066030018453600a8104905080612e32575b50828103602084039350808452505050919050565b600033905090565b60009392505050565b6000612e8583612879565b90506000819050600080612e9886612945565b915091508415612f0157612eb48184612eaf6127e4565b61296c565b612f0057612ec983612ec46127e4565b61266e565b612eff576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612f0f8360008860016129b0565b8015612f1a57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612fc283612f7f856000886129b6565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176129de565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036130485760006001870190506000600560008381526020019081526020016000205403613046576001548114613045578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130b2836000886001612a09565b600260008154809291906001019190505550505050505050565b60008082905060005b845181101561311757613102828683815181106130f5576130f4614809565b5b60200260200101516131c0565b9150808061310f906144bd565b9150506130d5565b508091505092915050565b61312c83836131eb565b60008373ffffffffffffffffffffffffffffffffffffffff163b146131bb5760006001549050600083820390505b61316d6000868380600101945086612ae1565b6131a3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061315a5781600154146131b857600080fd5b50505b505050565b60008183106131d8576131d382846133a7565b6131e3565b6131e283836133a7565b5b905092915050565b600060015490506000820361322c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61323960008483856129b0565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506132b0836132a160008660006129b6565b6132aa856133be565b176129de565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461335157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613316565b506000820361338c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506133a26000848385612a09565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546133da90613daa565b90600052602060002090601f0160209004810192826133fc5760008555613443565b82601f1061341557805160ff1916838001178555613443565b82800160010185558215613443579182015b82811115613442578251825591602001919060010190613427565b5b50905061345091906134da565b5090565b82805461346090613daa565b90600052602060002090601f01602090048101928261348257600085556134c9565b82601f1061349b57803560ff19168380011785556134c9565b828001600101855582156134c9579182015b828111156134c85782358255916020019190600101906134ad565b5b5090506134d691906134da565b5090565b5b808211156134f35760008160009055506001016134db565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135408161350b565b811461354b57600080fd5b50565b60008135905061355d81613537565b92915050565b60006020828403121561357957613578613501565b5b60006135878482850161354e565b91505092915050565b60008115159050919050565b6135a581613590565b82525050565b60006020820190506135c0600083018461359c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136005780820151818401526020810190506135e5565b8381111561360f576000848401525b50505050565b6000601f19601f8301169050919050565b6000613631826135c6565b61363b81856135d1565b935061364b8185602086016135e2565b61365481613615565b840191505092915050565b600060208201905081810360008301526136798184613626565b905092915050565b6000819050919050565b61369481613681565b811461369f57600080fd5b50565b6000813590506136b18161368b565b92915050565b6000602082840312156136cd576136cc613501565b5b60006136db848285016136a2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061370f826136e4565b9050919050565b61371f81613704565b82525050565b600060208201905061373a6000830184613716565b92915050565b61374981613704565b811461375457600080fd5b50565b60008135905061376681613740565b92915050565b6000806040838503121561378357613782613501565b5b600061379185828601613757565b92505060206137a2858286016136a2565b9150509250929050565b6137b581613681565b82525050565b60006020820190506137d060008301846137ac565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61381882613615565b810181811067ffffffffffffffff82111715613837576138366137e0565b5b80604052505050565b600061384a6134f7565b9050613856828261380f565b919050565b600067ffffffffffffffff821115613876576138756137e0565b5b61387f82613615565b9050602081019050919050565b82818337600083830152505050565b60006138ae6138a98461385b565b613840565b9050828152602081018484840111156138ca576138c96137db565b5b6138d584828561388c565b509392505050565b600082601f8301126138f2576138f16137d6565b5b813561390284826020860161389b565b91505092915050565b60006020828403121561392157613920613501565b5b600082013567ffffffffffffffff81111561393f5761393e613506565b5b61394b848285016138dd565b91505092915050565b60008060006060848603121561396d5761396c613501565b5b600061397b86828701613757565b935050602061398c86828701613757565b925050604061399d868287016136a2565b9150509250925092565b6000819050919050565b6139ba816139a7565b82525050565b60006020820190506139d560008301846139b1565b92915050565b600080fd5b600080fd5b60008083601f8401126139fb576139fa6137d6565b5b8235905067ffffffffffffffff811115613a1857613a176139db565b5b602083019150836001820283011115613a3457613a336139e0565b5b9250929050565b60008060208385031215613a5257613a51613501565b5b600083013567ffffffffffffffff811115613a7057613a6f613506565b5b613a7c858286016139e5565b92509250509250929050565b600060208284031215613a9e57613a9d613501565b5b6000613aac84828501613757565b91505092915050565b60008060408385031215613acc57613acb613501565b5b6000613ada858286016136a2565b9250506020613aeb85828601613757565b9150509250929050565b613afe81613590565b8114613b0957600080fd5b50565b600081359050613b1b81613af5565b92915050565b60008060408385031215613b3857613b37613501565b5b6000613b4685828601613757565b9250506020613b5785828601613b0c565b9150509250929050565b600067ffffffffffffffff821115613b7c57613b7b6137e0565b5b613b8582613615565b9050602081019050919050565b6000613ba5613ba084613b61565b613840565b905082815260208101848484011115613bc157613bc06137db565b5b613bcc84828561388c565b509392505050565b600082601f830112613be957613be86137d6565b5b8135613bf9848260208601613b92565b91505092915050565b60008060008060808587031215613c1c57613c1b613501565b5b6000613c2a87828801613757565b9450506020613c3b87828801613757565b9350506040613c4c878288016136a2565b925050606085013567ffffffffffffffff811115613c6d57613c6c613506565b5b613c7987828801613bd4565b91505092959194509250565b60008083601f840112613c9b57613c9a6137d6565b5b8235905067ffffffffffffffff811115613cb857613cb76139db565b5b602083019150836020820283011115613cd457613cd36139e0565b5b9250929050565b600080600060408486031215613cf457613cf3613501565b5b6000613d02868287016136a2565b935050602084013567ffffffffffffffff811115613d2357613d22613506565b5b613d2f86828701613c85565b92509250509250925092565b60008060408385031215613d5257613d51613501565b5b6000613d6085828601613757565b9250506020613d7185828601613757565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613dc257607f821691505b602082108103613dd557613dd4613d7b565b5b50919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000613e17613e12613e0d84613ddb565b613df2565b613de5565b9050919050565b613e2781613dfc565b82525050565b6000604082019050613e426000830185613716565b613e4f6020830184613e1e565b9392505050565b6000819050919050565b613e71613e6c826139a7565b613e56565b82525050565b6000613e838284613e60565b60208201915081905092915050565b600081905092915050565b50565b6000613ead600083613e92565b9150613eb882613e9d565b600082019050919050565b6000613ece82613ea0565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613f0e6010836135d1565b9150613f1982613ed8565b602082019050919050565b60006020820190508181036000830152613f3d81613f01565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613f7a601e836135d1565b9150613f8582613f44565b602082019050919050565b60006020820190508181036000830152613fa981613f6d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fea82613681565b9150613ff583613681565b92508282101561400857614007613fb0565b5b828203905092915050565b7f54686520746f74616c20737570706c7920686173206265656e2072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061406f6021836135d1565b915061407a82614013565b604082019050919050565b6000602082019050818103600083015261409e81614062565b9050919050565b7f706861736520696e76616c696400000000000000000000000000000000000000600082015250565b60006140db600d836135d1565b91506140e6826140a5565b602082019050919050565b6000602082019050818103600083015261410a816140ce565b9050919050565b7f706c65617365206d696e74206f6e206574687700000000000000000000000000600082015250565b60006141476013836135d1565b915061415282614111565b602082019050919050565b600060208201905081810360008301526141768161413a565b9050919050565b7f54686520746f74616c2070686173653120737570706c7920686173206265656e60008201527f2072656163686564000000000000000000000000000000000000000000000000602082015250565b60006141d96028836135d1565b91506141e48261417d565b604082019050919050565b60006020820190508181036000830152614208816141cc565b9050919050565b7f6e6f74207374617274206f7220656e6465640000000000000000000000000000600082015250565b60006142456012836135d1565b91506142508261420f565b602082019050919050565b6000602082019050818103600083015261427481614238565b9050919050565b7f616d6f756e74206f7574206f66206c696d697400000000000000000000000000600082015250565b60006142b16013836135d1565b91506142bc8261427b565b602082019050919050565b600060208201905081810360008301526142e0816142a4565b9050919050565b7f546869732061646472657373206d696e74206c696d6974656400000000000000600082015250565b600061431d6019836135d1565b9150614328826142e7565b602082019050919050565b6000602082019050818103600083015261434c81614310565b9050919050565b7f706c65617365206d696e74206f6e206574680000000000000000000000000000600082015250565b60006143896012836135d1565b915061439482614353565b602082019050919050565b600060208201905081810360008301526143b88161437c565b9050919050565b7f54686520746f74616c2070686173653220737570706c7920686173206265656e60008201527f2072656163686564000000000000000000000000000000000000000000000000602082015250565b600061441b6028836135d1565b9150614426826143bf565b604082019050919050565b6000602082019050818103600083015261444a8161440e565b9050919050565b7f6e6f7420696e2066726565206d696e7400000000000000000000000000000000600082015250565b60006144876010836135d1565b915061449282614451565b602082019050919050565b600060208201905081810360008301526144b68161447a565b9050919050565b60006144c882613681565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144fa576144f9613fb0565b5b600182019050919050565b7f6e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b600061453b6010836135d1565b915061454682614505565b602082019050919050565b6000602082019050818103600083015261456a8161452e565b9050919050565b600081905092915050565b6000614587826135c6565b6145918185614571565b93506145a18185602086016135e2565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006145e3600583614571565b91506145ee826145ad565b600582019050919050565b6000614605828561457c565b9150614611828461457c565b915061461c826145d6565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146846026836135d1565b915061468f82614628565b604082019050919050565b600060208201905081810360008301526146b381614677565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146f06020836135d1565b91506146fb826146ba565b602082019050919050565b6000602082019050818103600083015261471f816146e3565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061474d82614726565b6147578185614731565b93506147678185602086016135e2565b61477081613615565b840191505092915050565b60006080820190506147906000830187613716565b61479d6020830186613716565b6147aa60408301856137ac565b81810360608301526147bc8184614742565b905095945050505050565b6000815190506147d681613537565b92915050565b6000602082840312156147f2576147f1613501565b5b6000614800848285016147c7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220a68a77a996804d04bb7433eea6fe8c9a2fae1a26a7c25e7f3141c0303455b6a964736f6c634300080d003300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000001e17f831948e3111c4abce9db8afabbf9d280cdb6a201bb7dc909e65f3d5f2c849ebe8bba211d10cb80f7a014bf01bef9fe931634066714e4e64198f9579cf8700000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f6261796572732e746865626179617265616172742e78797a2f6d657461646174612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a68747470733a2f2f617175616d6172696e652d776f727468792d636f636b726f6163682d3237352e6d7970696e6174612e636c6f75642f697066732f516d573453716d744d487862625348473452756a724574314631554d644262593564683734754a376d5a4c396f57000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006426179657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064241594552530000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102515760003560e01c80636473738011610139578063ac446002116100b6578063c87b56dd1161007a578063c87b56dd1461084d578063ca34adf01461088a578063db006a75146108b5578063e49b351b146108de578063e985e9c514610909578063f2fde38b1461094657610251565b8063ac446002146107a8578063b4954b00146107bf578063b88d4fde146107ea578063ba41b0c614610806578063c763e5a11461082257610251565b8063715018a6116100fd578063715018a6146106e75780638894695b146106fe5780638da5cb5b1461072957806395d89b4114610754578063a22cb4651461077f57610251565b806364737380146105ee578063696b93d51461062b5780636e27755d146106565780636fa9b9a91461067f57806370a08231146106aa57610251565b806327efc086116101d257806342966c681161019657806342966c68146104cc5780634f11ca00146104f5578063554a82f61461052057806355f804b31461054b5780635b7b108c146105745780636352211e146105b157610251565b806327efc0861461040457806328f72b291461042f5780632eb4a7ab1461045a5780633eaaf86b1461048557806342842e0e146104b057610251565b806314ba7a571161021957806314ba7a571461034257806318160ddd1461036b5780631a15fe24146103965780632269c1af146103bf57806323b872dd146103e857610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb5780630d9005ae14610317575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613563565b61096f565b60405161028a91906135ab565b60405180910390f35b34801561029f57600080fd5b506102a8610a01565b6040516102b5919061365f565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906136b7565b610a93565b6040516102f29190613725565b60405180910390f35b6103156004803603810190610310919061376c565b610b12565b005b34801561032357600080fd5b5061032c610c56565b60405161033991906137bb565b60405180910390f35b34801561034e57600080fd5b50610369600480360381019061036491906136b7565b610c65565b005b34801561037757600080fd5b50610380610c77565b60405161038d91906137bb565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b891906136b7565b610c8e565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061390b565b610ca0565b005b61040260048036038101906103fd9190613954565b610cc2565b005b34801561041057600080fd5b50610419610fe4565b60405161042691906137bb565b60405180910390f35b34801561043b57600080fd5b50610444610fea565b60405161045191906137bb565b60405180910390f35b34801561046657600080fd5b5061046f610ff0565b60405161047c91906139c0565b60405180910390f35b34801561049157600080fd5b5061049a611014565b6040516104a791906137bb565b60405180910390f35b6104ca60048036038101906104c59190613954565b61101a565b005b3480156104d857600080fd5b506104f360048036038101906104ee91906136b7565b61103a565b005b34801561050157600080fd5b5061050a611046565b60405161051791906137bb565b60405180910390f35b34801561052c57600080fd5b5061053561104c565b60405161054291906137bb565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190613a3b565b611052565b005b34801561058057600080fd5b5061059b60048036038101906105969190613a88565b611070565b6040516105a891906139c0565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d391906136b7565b6110ef565b6040516105e59190613725565b60405180910390f35b3480156105fa57600080fd5b5061061560048036038101906106109190613ab5565b611101565b60405161062291906137bb565b60405180910390f35b34801561063757600080fd5b506106406112a8565b60405161064d91906137bb565b60405180910390f35b34801561066257600080fd5b5061067d600480360381019061067891906136b7565b6112ae565b005b34801561068b57600080fd5b506106946112c0565b6040516106a191906137bb565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613a88565b6112c6565b6040516106de91906137bb565b60405180910390f35b3480156106f357600080fd5b506106fc61137e565b005b34801561070a57600080fd5b50610713611392565b60405161072091906137bb565b60405180910390f35b34801561073557600080fd5b5061073e611398565b60405161074b9190613725565b60405180910390f35b34801561076057600080fd5b506107696113c1565b604051610776919061365f565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a19190613b21565b611453565b005b3480156107b457600080fd5b506107bd61155e565b005b3480156107cb57600080fd5b506107d4611615565b6040516107e191906137bb565b60405180910390f35b61080460048036038101906107ff9190613c02565b61161b565b005b610820600480360381019061081b9190613cdb565b61168e565b005b34801561082e57600080fd5b506108376124ee565b60405161084491906137bb565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f91906136b7565b6124f4565b604051610881919061365f565b60405180910390f35b34801561089657600080fd5b5061089f612630565b6040516108ac91906139c0565b60405180910390f35b3480156108c157600080fd5b506108dc60048036038101906108d791906136b7565b612654565b005b3480156108ea57600080fd5b506108f3612668565b60405161090091906137bb565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190613d3b565b61266e565b60405161093d91906135ab565b60405180910390f35b34801561095257600080fd5b5061096d60048036038101906109689190613a88565b612702565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ca57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109fa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a1090613daa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3c90613daa565b8015610a895780601f10610a5e57610100808354040283529160200191610a89565b820191906000526020600020905b815481529060010190602001808311610a6c57829003601f168201915b5050505050905090565b6000610a9e82612785565b610ad4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1d826110ef565b90508073ffffffffffffffffffffffffffffffffffffffff16610b3e6127e4565b73ffffffffffffffffffffffffffffffffffffffff1614610ba157610b6a81610b656127e4565b61266e565b610ba0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c606127ec565b905090565b610c6d6127f6565b8060218190555050565b6000610c81612874565b6002546001540303905090565b610c966127f6565b8060248190555050565b610ca86127f6565b80600a9080519060200190610cbe9291906133ce565b5050565b6000610ccd82612879565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d34576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d4084612945565b91509150610d568187610d516127e4565b61296c565b610da257610d6b86610d666127e4565b61266e565b610da1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e08576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1586868660016129b0565b8015610e2057600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610eee85610eca8888876129b6565b7c0200000000000000000000000000000000000000000000000000000000176129de565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f745760006001850190506000600560008381526020019081526020016000205403610f72576001548114610f71578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fdc8686866001612a09565b505050505050565b60235481565b602a5481565b7fe17f831948e3111c4abce9db8afabbf9d280cdb6a201bb7dc909e65f3d5f2c8481565b60255481565b6110358383836040518060200160405280600081525061161b565b505050565b61104381612a0f565b50565b60245481565b60275481565b61105a6127f6565b81816009919061106b929190613454565b505050565b6000602c60009054906101000a900460ff166110e357600082600160405160200161109c929190613e2d565b604051602081830303815290604052805190602001206040516020016110c29190613e77565b604051602081830303815290604052805190602001209050809150506110ea565b6000801b90505b919050565b60006110fa82612879565b9050919050565b60006001830361115557601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b600283036111a757601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b600383036111f957601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b6004830361124b57601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b6005830361129d57601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506112a2565b600090505b92915050565b60295481565b6112b66127f6565b8060228190555050565b60225481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361132d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113866127f6565b6113906000612a1d565b565b60265481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546113d090613daa565b80601f01602080910402602001604051908101604052809291908181526020018280546113fc90613daa565b80156114495780601f1061141e57610100808354040283529160200191611449565b820191906000526020600020905b81548152906001019060200180831161142c57829003601f168201915b5050505050905090565b80600860006114606127e4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661150d6127e4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161155291906135ab565b60405180910390a35050565b6115666127f6565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161158c90613ec3565b60006040518083038185875af1925050503d80600081146115c9576040519150601f19603f3d011682016040523d82523d6000602084013e6115ce565b606091505b5050905080611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990613f24565b60405180910390fd5b50565b60215481565b611626848484610cc2565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116885761165184848484612ae1565b611687576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b8260013373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690613f90565b60405180910390fd5b612711601e54036117625760215460235461171a9190613fdf565b6025541061175d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175490614085565b60405180910390fd5b6117c1565b6001601e54036117c05760225460235461177c9190613fdf565b602554106117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690614085565b60405180910390fd5b5b5b6000821180156117d15750600682105b611810576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611807906140f1565b60405180910390fd5b600182036119dc57612711601e541461185e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118559061415d565b60405180910390fd5b601f54602654106118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b906141ef565b60405180910390fd5b602c60009054906101000a900460ff161561190c57600b5442101580156118cc5750600c5442105b61190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061425b565b60405180910390fd5b5b601154811115611951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611948906142c7565b60405180910390fd5b601154601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050106119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce90614333565b60405180910390fd5b611ea2565b60028203611ba7576001601e5414611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a209061439f565b60405180910390fd5b60205460275410611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690614431565b60405180910390fd5b602c60009054906101000a900460ff1615611ad757600c544210158015611a975750600d5442105b611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd9061425b565b60405180910390fd5b5b601254811115611b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b13906142c7565b60405180910390fd5b601254601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9990614333565b60405180910390fd5b611ea1565b60038203611d2d57612711601e5414611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec9061415d565b60405180910390fd5b602c60009054906101000a900460ff1615611c5d57600d544210158015611c1d5750600e5442105b611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c539061425b565b60405180910390fd5b5b601354811115611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c99906142c7565b60405180910390fd5b601354601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f90614333565b60405180910390fd5b611ea0565b60048203611de7576001601e5414611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d719061439f565b60405180910390fd5b602c60009054906101000a900460ff1615611de257600e544210158015611da25750600f5442105b611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd89061425b565b60405180910390fd5b5b611e9f565b60058203611e9e57612711601e5414611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c9061415d565b60405180910390fd5b602c60009054906101000a900460ff1615611e9d57600f544210158015611e5d575060105442105b611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e939061425b565b60405180910390fd5b5b5b5b5b5b5b60018503612040576000336001604051602001611ec0929190613e2d565b60405160208183030381529060405280519060200120604051602001611ee69190613e77565b6040516020818303038152906040528051906020012090506000611f6c868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507fe17f831948e3111c4abce9db8afabbf9d280cdb6a201bb7dc909e65f3d5f2c8484612c31565b905080611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa59061449d565b60405180910390fd5b611fb9601454612c48565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b54908060018154018082558091505060019003906000526020600020016000909190919091505560266000815480929190612034906144bd565b919050555050506124ac565b600285036121de57600033600160405160200161205e929190613e2d565b604051602081830303815290604052805190602001206040516020016120849190613e77565b604051602081830303815290604052805190602001209050600061210a868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f9ebe8bba211d10cb80f7a014bf01bef9fe931634066714e4e64198f9579cf87084612c31565b90508061214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214390614551565b60405180910390fd5b612157601554612c48565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b549080600181540180825580915050600190039060005260206000200160009091909190915055602760008154809291906121d2906144bd565b919050555050506124ab565b6003850361237c5760003360016040516020016121fc929190613e2d565b604051602081830303815290604052805190602001206040516020016122229190613e77565b60405160208183030381529060405280519060200120905060006122a8868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050507f9ebe8bba211d10cb80f7a014bf01bef9fe931634066714e4e64198f9579cf87084612c31565b9050806122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190614551565b60405180910390fd5b6122f5601654612c48565b601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b54908060018154018082558091505060019003906000526020600020016000909190919091505560286000815480929190612370906144bd565b919050555050506124aa565b600485036124145761238f601754612c48565b601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b5490806001815401808255809150506001900390600052602060002001600090919091909150556029600081548092919061240a906144bd565b91905055506124a9565b600585036124a857612427601854612c48565b601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020602b549080600181540180825580915050600190039060005260206000200160009091909190915055602a60008154809291906124a2906144bd565b91905055505b5b5b5b5b6124b7336001612d69565b602b60008154809291906124ca906144bd565b9190505550602560008154809291906124e2906144bd565b91905055505050505050565b601e5481565b60606000612500612d87565b905060006024540361259f57600a805461251990613daa565b80601f016020809104026020016040519081016040528092919081815260200182805461254590613daa565b80156125925780601f1061256757610100808354040283529160200191612592565b820191906000526020600020905b81548152906001019060200180831161257557829003601f168201915b505050505091505061262b565b6125a883612785565b6125de576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151036125fc5760405180602001604052806000815250612627565b8061260684612e19565b6040516020016126179291906145f9565b6040516020818303038152906040525b9150505b919050565b7f9ebe8bba211d10cb80f7a014bf01bef9fe931634066714e4e64198f9579cf87081565b61265c6127f6565b61266581612a0f565b50565b60285481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61270a6127f6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127709061469a565b60405180910390fd5b61278281612a1d565b50565b600081612790612874565b1115801561279f575060015482105b80156127dd575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b6000600154905090565b6127fe612e69565b73ffffffffffffffffffffffffffffffffffffffff1661281c611398565b73ffffffffffffffffffffffffffffffffffffffff1614612872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286990614706565b60405180910390fd5b565b600090565b60008082905080612888612874565b1161290e5760015481101561290d5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361290b575b600081036129015760056000836001900393508381526020019081526020016000205490506128d7565b8092505050612940565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129cd868684612e71565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612a1a816000612e7a565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b076127e4565b8786866040518563ffffffff1660e01b8152600401612b29949392919061477b565b6020604051808303816000875af1925050508015612b6557506040513d601f19601f82011682018060405250810190612b6291906147dc565b60015b612bde573d8060008114612b95576040519150601f19603f3d011682016040523d82523d6000602084013e612b9a565b606091505b506000815103612bd6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600082612c3e85846130cc565b1490509392505050565b80341015612711601e5414612c92576040518060400160405280601681526020017f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000815250612cc9565b6040518060400160405280601781526020017f4e65656420746f2073656e64206d6f726520455448572e0000000000000000008152505b90612d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d01919061365f565b60405180910390fd5b5080341115612d66573373ffffffffffffffffffffffffffffffffffffffff166108fc8234612d399190613fdf565b9081150290604051600060405180830381858888f19350505050158015612d64573d6000803e3d6000fd5b505b50565b612d83828260405180602001604052806000815250613122565b5050565b606060098054612d9690613daa565b80601f0160208091040260200160405190810160405280929190818152602001828054612dc290613daa565b8015612e0f5780601f10612de457610100808354040283529160200191612e0f565b820191906000526020600020905b815481529060010190602001808311612df257829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612e5457600184039350600a81066030018453600a8104905080612e32575b50828103602084039350808452505050919050565b600033905090565b60009392505050565b6000612e8583612879565b90506000819050600080612e9886612945565b915091508415612f0157612eb48184612eaf6127e4565b61296c565b612f0057612ec983612ec46127e4565b61266e565b612eff576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612f0f8360008860016129b0565b8015612f1a57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612fc283612f7f856000886129b6565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176129de565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036130485760006001870190506000600560008381526020019081526020016000205403613046576001548114613045578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130b2836000886001612a09565b600260008154809291906001019190505550505050505050565b60008082905060005b845181101561311757613102828683815181106130f5576130f4614809565b5b60200260200101516131c0565b9150808061310f906144bd565b9150506130d5565b508091505092915050565b61312c83836131eb565b60008373ffffffffffffffffffffffffffffffffffffffff163b146131bb5760006001549050600083820390505b61316d6000868380600101945086612ae1565b6131a3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061315a5781600154146131b857600080fd5b50505b505050565b60008183106131d8576131d382846133a7565b6131e3565b6131e283836133a7565b5b905092915050565b600060015490506000820361322c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61323960008483856129b0565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506132b0836132a160008660006129b6565b6132aa856133be565b176129de565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461335157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613316565b506000820361338c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506133a26000848385612a09565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546133da90613daa565b90600052602060002090601f0160209004810192826133fc5760008555613443565b82601f1061341557805160ff1916838001178555613443565b82800160010185558215613443579182015b82811115613442578251825591602001919060010190613427565b5b50905061345091906134da565b5090565b82805461346090613daa565b90600052602060002090601f01602090048101928261348257600085556134c9565b82601f1061349b57803560ff19168380011785556134c9565b828001600101855582156134c9579182015b828111156134c85782358255916020019190600101906134ad565b5b5090506134d691906134da565b5090565b5b808211156134f35760008160009055506001016134db565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135408161350b565b811461354b57600080fd5b50565b60008135905061355d81613537565b92915050565b60006020828403121561357957613578613501565b5b60006135878482850161354e565b91505092915050565b60008115159050919050565b6135a581613590565b82525050565b60006020820190506135c0600083018461359c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136005780820151818401526020810190506135e5565b8381111561360f576000848401525b50505050565b6000601f19601f8301169050919050565b6000613631826135c6565b61363b81856135d1565b935061364b8185602086016135e2565b61365481613615565b840191505092915050565b600060208201905081810360008301526136798184613626565b905092915050565b6000819050919050565b61369481613681565b811461369f57600080fd5b50565b6000813590506136b18161368b565b92915050565b6000602082840312156136cd576136cc613501565b5b60006136db848285016136a2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061370f826136e4565b9050919050565b61371f81613704565b82525050565b600060208201905061373a6000830184613716565b92915050565b61374981613704565b811461375457600080fd5b50565b60008135905061376681613740565b92915050565b6000806040838503121561378357613782613501565b5b600061379185828601613757565b92505060206137a2858286016136a2565b9150509250929050565b6137b581613681565b82525050565b60006020820190506137d060008301846137ac565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61381882613615565b810181811067ffffffffffffffff82111715613837576138366137e0565b5b80604052505050565b600061384a6134f7565b9050613856828261380f565b919050565b600067ffffffffffffffff821115613876576138756137e0565b5b61387f82613615565b9050602081019050919050565b82818337600083830152505050565b60006138ae6138a98461385b565b613840565b9050828152602081018484840111156138ca576138c96137db565b5b6138d584828561388c565b509392505050565b600082601f8301126138f2576138f16137d6565b5b813561390284826020860161389b565b91505092915050565b60006020828403121561392157613920613501565b5b600082013567ffffffffffffffff81111561393f5761393e613506565b5b61394b848285016138dd565b91505092915050565b60008060006060848603121561396d5761396c613501565b5b600061397b86828701613757565b935050602061398c86828701613757565b925050604061399d868287016136a2565b9150509250925092565b6000819050919050565b6139ba816139a7565b82525050565b60006020820190506139d560008301846139b1565b92915050565b600080fd5b600080fd5b60008083601f8401126139fb576139fa6137d6565b5b8235905067ffffffffffffffff811115613a1857613a176139db565b5b602083019150836001820283011115613a3457613a336139e0565b5b9250929050565b60008060208385031215613a5257613a51613501565b5b600083013567ffffffffffffffff811115613a7057613a6f613506565b5b613a7c858286016139e5565b92509250509250929050565b600060208284031215613a9e57613a9d613501565b5b6000613aac84828501613757565b91505092915050565b60008060408385031215613acc57613acb613501565b5b6000613ada858286016136a2565b9250506020613aeb85828601613757565b9150509250929050565b613afe81613590565b8114613b0957600080fd5b50565b600081359050613b1b81613af5565b92915050565b60008060408385031215613b3857613b37613501565b5b6000613b4685828601613757565b9250506020613b5785828601613b0c565b9150509250929050565b600067ffffffffffffffff821115613b7c57613b7b6137e0565b5b613b8582613615565b9050602081019050919050565b6000613ba5613ba084613b61565b613840565b905082815260208101848484011115613bc157613bc06137db565b5b613bcc84828561388c565b509392505050565b600082601f830112613be957613be86137d6565b5b8135613bf9848260208601613b92565b91505092915050565b60008060008060808587031215613c1c57613c1b613501565b5b6000613c2a87828801613757565b9450506020613c3b87828801613757565b9350506040613c4c878288016136a2565b925050606085013567ffffffffffffffff811115613c6d57613c6c613506565b5b613c7987828801613bd4565b91505092959194509250565b60008083601f840112613c9b57613c9a6137d6565b5b8235905067ffffffffffffffff811115613cb857613cb76139db565b5b602083019150836020820283011115613cd457613cd36139e0565b5b9250929050565b600080600060408486031215613cf457613cf3613501565b5b6000613d02868287016136a2565b935050602084013567ffffffffffffffff811115613d2357613d22613506565b5b613d2f86828701613c85565b92509250509250925092565b60008060408385031215613d5257613d51613501565b5b6000613d6085828601613757565b9250506020613d7185828601613757565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613dc257607f821691505b602082108103613dd557613dd4613d7b565b5b50919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000613e17613e12613e0d84613ddb565b613df2565b613de5565b9050919050565b613e2781613dfc565b82525050565b6000604082019050613e426000830185613716565b613e4f6020830184613e1e565b9392505050565b6000819050919050565b613e71613e6c826139a7565b613e56565b82525050565b6000613e838284613e60565b60208201915081905092915050565b600081905092915050565b50565b6000613ead600083613e92565b9150613eb882613e9d565b600082019050919050565b6000613ece82613ea0565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613f0e6010836135d1565b9150613f1982613ed8565b602082019050919050565b60006020820190508181036000830152613f3d81613f01565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613f7a601e836135d1565b9150613f8582613f44565b602082019050919050565b60006020820190508181036000830152613fa981613f6d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fea82613681565b9150613ff583613681565b92508282101561400857614007613fb0565b5b828203905092915050565b7f54686520746f74616c20737570706c7920686173206265656e2072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061406f6021836135d1565b915061407a82614013565b604082019050919050565b6000602082019050818103600083015261409e81614062565b9050919050565b7f706861736520696e76616c696400000000000000000000000000000000000000600082015250565b60006140db600d836135d1565b91506140e6826140a5565b602082019050919050565b6000602082019050818103600083015261410a816140ce565b9050919050565b7f706c65617365206d696e74206f6e206574687700000000000000000000000000600082015250565b60006141476013836135d1565b915061415282614111565b602082019050919050565b600060208201905081810360008301526141768161413a565b9050919050565b7f54686520746f74616c2070686173653120737570706c7920686173206265656e60008201527f2072656163686564000000000000000000000000000000000000000000000000602082015250565b60006141d96028836135d1565b91506141e48261417d565b604082019050919050565b60006020820190508181036000830152614208816141cc565b9050919050565b7f6e6f74207374617274206f7220656e6465640000000000000000000000000000600082015250565b60006142456012836135d1565b91506142508261420f565b602082019050919050565b6000602082019050818103600083015261427481614238565b9050919050565b7f616d6f756e74206f7574206f66206c696d697400000000000000000000000000600082015250565b60006142b16013836135d1565b91506142bc8261427b565b602082019050919050565b600060208201905081810360008301526142e0816142a4565b9050919050565b7f546869732061646472657373206d696e74206c696d6974656400000000000000600082015250565b600061431d6019836135d1565b9150614328826142e7565b602082019050919050565b6000602082019050818103600083015261434c81614310565b9050919050565b7f706c65617365206d696e74206f6e206574680000000000000000000000000000600082015250565b60006143896012836135d1565b915061439482614353565b602082019050919050565b600060208201905081810360008301526143b88161437c565b9050919050565b7f54686520746f74616c2070686173653220737570706c7920686173206265656e60008201527f2072656163686564000000000000000000000000000000000000000000000000602082015250565b600061441b6028836135d1565b9150614426826143bf565b604082019050919050565b6000602082019050818103600083015261444a8161440e565b9050919050565b7f6e6f7420696e2066726565206d696e7400000000000000000000000000000000600082015250565b60006144876010836135d1565b915061449282614451565b602082019050919050565b600060208201905081810360008301526144b68161447a565b9050919050565b60006144c882613681565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144fa576144f9613fb0565b5b600182019050919050565b7f6e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b600061453b6010836135d1565b915061454682614505565b602082019050919050565b6000602082019050818103600083015261456a8161452e565b9050919050565b600081905092915050565b6000614587826135c6565b6145918185614571565b93506145a18185602086016135e2565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006145e3600583614571565b91506145ee826145ad565b600582019050919050565b6000614605828561457c565b9150614611828461457c565b915061461c826145d6565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146846026836135d1565b915061468f82614628565b604082019050919050565b600060208201905081810360008301526146b381614677565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146f06020836135d1565b91506146fb826146ba565b602082019050919050565b6000602082019050818103600083015261471f816146e3565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061474d82614726565b6147578185614731565b93506147678185602086016135e2565b61477081613615565b840191505092915050565b60006080820190506147906000830187613716565b61479d6020830186613716565b6147aa60408301856137ac565b81810360608301526147bc8184614742565b905095945050505050565b6000815190506147d681613537565b92915050565b6000602082840312156147f2576147f1613501565b5b6000614800848285016147c7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220a68a77a996804d04bb7433eea6fe8c9a2fae1a26a7c25e7f3141c0303455b6a964736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000001e17f831948e3111c4abce9db8afabbf9d280cdb6a201bb7dc909e65f3d5f2c849ebe8bba211d10cb80f7a014bf01bef9fe931634066714e4e64198f9579cf8700000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f6261796572732e746865626179617265616172742e78797a2f6d657461646174612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a68747470733a2f2f617175616d6172696e652d776f727468792d636f636b726f6163682d3237352e6d7970696e6174612e636c6f75642f697066732f516d573453716d744d487862625348473452756a724574314631554d644262593564683734754a376d5a4c396f57000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006426179657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064241594552530000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _uri (string): https://bayers.thebayareaart.xyz/metadata/
Arg [1] : blindboxUri (string): https://aquamarine-worthy-cockroach-275.mypinata.cloud/ipfs/QmW4SqmtMHxbbSHG4RujrEt1F1UMdBbY5dh74uJ7mZL9oW
Arg [2] : _name (string): Bayers
Arg [3] : _symbol (string): BAYERS
Arg [4] : _chain (uint256): 1
Arg [5] : _merkleRoot (bytes32): 0xe17f831948e3111c4abce9db8afabbf9d280cdb6a201bb7dc909e65f3d5f2c84
Arg [6] : _merkleRoot2 (bytes32): 0x9ebe8bba211d10cb80f7a014bf01bef9fe931634066714e4e64198f9579cf870
Arg [7] : _timelimit (bool): True
-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : e17f831948e3111c4abce9db8afabbf9d280cdb6a201bb7dc909e65f3d5f2c84
Arg [6] : 9ebe8bba211d10cb80f7a014bf01bef9fe931634066714e4e64198f9579cf870
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 000000000000000000000000000000000000000000000000000000000000002a
Arg [9] : 68747470733a2f2f6261796572732e746865626179617265616172742e78797a
Arg [10] : 2f6d657461646174612f00000000000000000000000000000000000000000000
Arg [11] : 000000000000000000000000000000000000000000000000000000000000006a
Arg [12] : 68747470733a2f2f617175616d6172696e652d776f727468792d636f636b726f
Arg [13] : 6163682d3237352e6d7970696e6174612e636c6f75642f697066732f516d5734
Arg [14] : 53716d744d487862625348473452756a724574314631554d6442625935646837
Arg [15] : 34754a376d5a4c396f5700000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [17] : 4261796572730000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [19] : 4241594552530000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
64647:10459:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27965:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28867:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35358:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34791:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67032:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74133:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24618:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73908:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74012:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38997:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65997:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66285:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64782:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66071:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41918:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73530:71;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66033:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66153:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72602:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73609:291;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30260:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74335:582;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66241:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74233:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65959:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25802:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63772:103;;;;;;;;;;;;;:::i;:::-;;66109:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63124:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29043:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35916:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74925:178;;;;;;;;;;;;;:::i;:::-;;65924:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42709:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70593:1986;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65806:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72838:591;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64824:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73437:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66197:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36307:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64030:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27965:639;28050:4;28389:10;28374:25;;:11;:25;;;;:102;;;;28466:10;28451:25;;:11;:25;;;;28374:102;:179;;;;28543:10;28528:25;;:11;:25;;;;28374:179;28354:199;;27965:639;;;:::o;28867:100::-;28921:13;28954:5;28947:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28867:100;:::o;35358:218::-;35434:7;35459:16;35467:7;35459;:16::i;:::-;35454:64;;35484:34;;;;;;;;;;;;;;35454:64;35538:15;:24;35554:7;35538:24;;;;;;;;;;;:30;;;;;;;;;;;;35531:37;;35358:218;;;:::o;34791:408::-;34880:13;34896:16;34904:7;34896;:16::i;:::-;34880:32;;34952:5;34929:28;;:19;:17;:19::i;:::-;:28;;;34925:175;;34977:44;34994:5;35001:19;:17;:19::i;:::-;34977:16;:44::i;:::-;34972:128;;35049:35;;;;;;;;;;;;;;34972:128;34925:175;35145:2;35112:15;:24;35128:7;35112:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;35183:7;35179:2;35163:28;;35172:5;35163:28;;;;;;;;;;;;34869:330;34791:408;;:::o;67032:97::-;67080:7;67107:14;:12;:14::i;:::-;67100:21;;67032:97;:::o;74133:92::-;63010:13;:11;:13::i;:::-;74211:6:::1;74199:9;:18;;;;74133:92:::0;:::o;24618:323::-;24679:7;24907:15;:13;:15::i;:::-;24892:12;;24876:13;;:28;:46;24869:53;;24618:323;:::o;73908:96::-;63010:13;:11;:13::i;:::-;73991:5:::1;73976:12;:20;;;;73908:96:::0;:::o;74012:113::-;63010:13;:11;:13::i;:::-;74106:11:::1;74091:12;:26;;;;;;;;;;;;:::i;:::-;;74012:113:::0;:::o;38997:2825::-;39139:27;39169;39188:7;39169:18;:27::i;:::-;39139:57;;39254:4;39213:45;;39229:19;39213:45;;;39209:86;;39267:28;;;;;;;;;;;;;;39209:86;39309:27;39338:23;39365:35;39392:7;39365:26;:35::i;:::-;39308:92;;;;39500:68;39525:15;39542:4;39548:19;:17;:19::i;:::-;39500:24;:68::i;:::-;39495:180;;39588:43;39605:4;39611:19;:17;:19::i;:::-;39588:16;:43::i;:::-;39583:92;;39640:35;;;;;;;;;;;;;;39583:92;39495:180;39706:1;39692:16;;:2;:16;;;39688:52;;39717:23;;;;;;;;;;;;;;39688:52;39753:43;39775:4;39781:2;39785:7;39794:1;39753:21;:43::i;:::-;39889:15;39886:160;;;40029:1;40008:19;40001:30;39886:160;40426:18;:24;40445:4;40426:24;;;;;;;;;;;;;;;;40424:26;;;;;;;;;;;;40495:18;:22;40514:2;40495:22;;;;;;;;;;;;;;;;40493:24;;;;;;;;;;;40817:146;40854:2;40903:45;40918:4;40924:2;40928:19;40903:14;:45::i;:::-;21017:8;40875:73;40817:18;:146::i;:::-;40788:17;:26;40806:7;40788:26;;;;;;;;;;;:175;;;;41134:1;21017:8;41083:19;:47;:52;41079:627;;41156:19;41188:1;41178:7;:11;41156:33;;41345:1;41311:17;:30;41329:11;41311:30;;;;;;;;;;;;:35;41307:384;;41449:13;;41434:11;:28;41430:242;;41629:19;41596:17;:30;41614:11;41596:30;;;;;;;;;;;:52;;;;41430:242;41307:384;41137:569;41079:627;41753:7;41749:2;41734:27;;41743:4;41734:27;;;;;;;;;;;;41772:42;41793:4;41799:2;41803:7;41812:1;41772:20;:42::i;:::-;39128:2694;;;38997:2825;;;:::o;65997:27::-;;;;:::o;66285:37::-;;;;:::o;64782:35::-;;;:::o;66071:31::-;;;;:::o;41918:193::-;42064:39;42081:4;42087:2;42091:7;42064:39;;;;;;;;;;;;:16;:39::i;:::-;41918:193;;;:::o;73530:71::-;73579:14;73585:7;73579:5;:14::i;:::-;73530:71;:::o;66033:31::-;;;;:::o;66153:37::-;;;;:::o;72602:106::-;63010:13;:11;:13::i;:::-;72693:7:::1;;72677:13;:23;;;;;;;:::i;:::-;;72602:106:::0;;:::o;73609:291::-;73663:7;73688:9;;;;;;;;;;;73683:210;;73714:12;73791:2;73795:1;73780:17;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73770:28;;;;;;73757:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;73729:85;;;;;;73714:100;;73836:4;73829:11;;;;;73683:210;73880:1;73873:8;;;;73609:291;;;;:::o;30260:152::-;30332:7;30375:27;30394:7;30375:18;:27::i;:::-;30352:52;;30260:152;;;:::o;74335:582::-;74407:7;74438:1;74429:5;:10;74426:85;;74462:21;:30;74484:7;74462:30;;;;;;;;;;;;;;;:37;;;;74455:44;;;;74426:85;74533:1;74524:5;:10;74521:85;;74557:21;:30;74579:7;74557:30;;;;;;;;;;;;;;;:37;;;;74550:44;;;;74521:85;74628:1;74619:5;:10;74616:85;;74652:21;:30;74674:7;74652:30;;;;;;;;;;;;;;;:37;;;;74645:44;;;;74616:85;74723:1;74714:5;:10;74711:85;;74747:21;:30;74769:7;74747:30;;;;;;;;;;;;;;;:37;;;;74740:44;;;;74711:85;74818:1;74809:5;:10;74806:85;;74842:21;:30;74864:7;74842:30;;;;;;;;;;;;;;;:37;;;;74835:44;;;;74806:85;74908:1;74901:8;;74335:582;;;;;:::o;66241:37::-;;;;:::o;74233:94::-;63010:13;:11;:13::i;:::-;74313:6:::1;74300:10;:19;;;;74233:94:::0;:::o;65959:29::-;;;;:::o;25802:233::-;25874:7;25915:1;25898:19;;:5;:19;;;25894:60;;25926:28;;;;;;;;;;;;;;25894:60;19961:13;25972:18;:25;25991:5;25972:25;;;;;;;;;;;;;;;;:55;25965:62;;25802:233;;;:::o;63772:103::-;63010:13;:11;:13::i;:::-;63837:30:::1;63864:1;63837:18;:30::i;:::-;63772:103::o:0;66109:37::-;;;;:::o;63124:87::-;63170:7;63197:6;;;;;;;;;;;63190:13;;63124:87;:::o;29043:104::-;29099:13;29132:7;29125:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29043:104;:::o;35916:234::-;36063:8;36011:18;:39;36030:19;:17;:19::i;:::-;36011:39;;;;;;;;;;;;;;;:49;36051:8;36011:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;36123:8;36087:55;;36102:19;:17;:19::i;:::-;36087:55;;;36133:8;36087:55;;;;;;:::i;:::-;;;;;;;;35916:234;;:::o;74925:178::-;63010:13;:11;:13::i;:::-;74981:12:::1;74999:10;:15;;75022:21;74999:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74980:68;;;75067:7;75059:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;74969:134;74925:178::o:0;65924:28::-;;;;:::o;42709:407::-;42884:31;42897:4;42903:2;42907:7;42884:12;:31::i;:::-;42948:1;42930:2;:14;;;:19;42926:183;;42969:56;43000:4;43006:2;43010:7;43019:5;42969:30;:56::i;:::-;42964:145;;43053:40;;;;;;;;;;;;;;42964:145;42926:183;42709:407;;;;:::o;70593:1986::-;70709:5;70716:1;67228:10;67215:23;;:9;:23;;;67207:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;67299:5;67290;;:14;67286:351;;67370:9;;67362:5;;:17;;;;:::i;:::-;67347:12;;:32;67321:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;67286:351;;;67479:1;67470:5;;:10;67466:171;;67546:10;;67538:5;;:18;;;;:::i;:::-;67523:12;;:33;67497:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;67466:171;67286:351;67665:1;67657:5;:9;:22;;;;;67678:1;67670:5;:9;67657:22;67649:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;67721:1;67712:5;:10;67708:2493;;67756:5;67747;;:14;67739:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;67847:12;;67826:18;;:33;67800:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;67956:9;;;;;;;;;;;67952:195;;;68035:6;;68016:15;:25;;:53;;;;;68063:6;;68045:15;:24;68016:53;67986:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;67952:195;68181:12;;68171:6;:22;;68163:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;68301:12;;68258:21;:33;68280:10;68258:33;;;;;;;;;;;;;;;:40;;;;:55;68232:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;67708:2493;;;68405:1;68396:5;:10;68392:1809;;68440:1;68431:5;;:10;68423:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;68526:12;;68505:18;;:33;68479:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;68633:9;;;;;;;;;;;68629:195;;;68712:6;;68693:15;:25;;:53;;;;;68740:6;;68722:15;:24;68693:53;68663:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;68629:195;68856:12;;68846:6;:22;;68838:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;68976:12;;68933:21;:33;68955:10;68933:33;;;;;;;;;;;;;;;:40;;;;:55;68907:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;68392:1809;;;69080:1;69071:5;:10;69067:1134;;69115:5;69106;;:14;69098:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;69163:9;;;;;;;;;;;69159:195;;;69242:6;;69223:15;:25;;:53;;;;;69270:6;;69252:15;:24;69223:53;69193:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;69159:195;69388:12;;69378:6;:22;;69370:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;69508:12;;69465:21;:33;69487:10;69465:33;;;;;;;;;;;;;;;:40;;;;:55;69439:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;69067:1134;;;69612:1;69603:5;:10;69599:602;;69647:1;69638:5;;:10;69630:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;69692:9;;;;;;;;;;;69688:195;;;69771:6;;69752:15;:25;;:53;;;;;69799:6;;69781:15;:24;69752:53;69722:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;69688:195;69599:602;;;69913:1;69904:5;:10;69900:301;;69948:5;69939;;:14;69931:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;69996:9;;;;;;;;;;;69992:198;;;70075:6;;70056:15;:25;;:56;;;;;70103:9;;70085:15;:27;70056:56;70026:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;69992:198;69900:301;69599:602;69067:1134;68392:1809;67708:2493;70748:1:::1;70739:5;:10:::0;70735:1744:::1;;70766:12;70843:10;70855:1;70832:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70822:36;;;;;;70809:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;70781:93;;;;;;70766:108;;70889:16;70908:43;70927:5;;70908:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70934:10;70946:4;70908:18;:43::i;:::-;70889:62;;70971:11;70966:79;;71003:26;;;;;;;;;;:::i;:::-;;;;;;;;70966:79;71061:25;71074:11;;71061:12;:25::i;:::-;71101:21;:33;71123:10;71101:33;;;;;;;;;;;;;;;71140:9;;71101:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71165:18;;:20;;;;;;;;;:::i;:::-;;;;;;70751:446;;70735:1744;;;71216:1;71207:5;:10:::0;71203:1276:::1;;71234:12;71311:10;71323:1;71300:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71290:36;;;;;;71277:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;71249:93;;;;;;71234:108;;71357:16;71376:44;71395:5;;71376:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71402:11;71415:4;71376:18;:44::i;:::-;71357:63;;71440:11;71435:79;;71472:26;;;;;;;;;;:::i;:::-;;;;;;;;71435:79;71530:25;71543:11;;71530:12;:25::i;:::-;71570:21;:33;71592:10;71570:33;;;;;;;;;;;;;;;71609:9;;71570:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71634:18;;:20;;;;;;;;;:::i;:::-;;;;;;71219:447;;71203:1276;;;71685:1;71676:5;:10:::0;71672:807:::1;;71703:12;71780:10;71792:1;71769:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71759:36;;;;;;71746:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;71718:93;;;;;;71703:108;;71826:16;71845:44;71864:5;;71845:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71871:11;71884:4;71845:18;:44::i;:::-;71826:63;;71909:11;71904:79;;71941:26;;;;;;;;;;:::i;:::-;;;;;;;;71904:79;71997:25;72010:11;;71997:12;:25::i;:::-;72037:21;:33;72059:10;72037:33;;;;;;;;;;;;;;;72076:9;;72037:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72101:18;;:20;;;;;;;;;:::i;:::-;;;;;;71688:445;;71672:807;;;72152:1;72143:5;:10:::0;72139:340:::1;;72170:25;72183:11;;72170:12;:25::i;:::-;72210:21;:33;72232:10;72210:33;;;;;;;;;;;;;;;72249:9;;72210:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72274:18;;:20;;;;;;;;;:::i;:::-;;;;;;72139:340;;;72325:1;72316:5;:10:::0;72312:167:::1;;72343:25;72356:11;;72343:12;:25::i;:::-;72383:21;:33;72405:10;72383:33;;;;;;;;;;;;;;;72422:9;;72383:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72447:18;;:20;;;;;;;;;:::i;:::-;;;;;;72312:167;72139:340;71672:807;71203:1276;70735:1744;72491:33;72509:10;72522:1;72491:9;:33::i;:::-;72535:9;;:11;;;;;;;;;:::i;:::-;;;;;;72557:12;;:14;;;;;;;;;:::i;:::-;;;;;;70593:1986:::0;;;;;:::o;65806:24::-;;;;:::o;72838:591::-;72956:13;72987:21;73011:10;:8;:10::i;:::-;72987:34;;73054:1;73038:12;;:17;73034:388;;73079:12;73072:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73034:388;73129:16;73137:7;73129;:16::i;:::-;73124:59;;73154:29;;;;;;;;;;;;;;73124:59;73249:1;73230:7;73224:21;:26;:186;;;;;;;;;;;;;;;;;73324:7;73333:18;73343:7;73333:9;:18::i;:::-;73307:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73224:186;73200:210;;;72838:591;;;;:::o;64824:36::-;;;:::o;73437:85::-;63010:13;:11;:13::i;:::-;73500:14:::1;73506:7;73500:5;:14::i;:::-;73437:85:::0;:::o;66197:37::-;;;;:::o;36307:164::-;36404:4;36428:18;:25;36447:5;36428:25;;;;;;;;;;;;;;;:35;36454:8;36428:35;;;;;;;;;;;;;;;;;;;;;;;;;36421:42;;36307:164;;;;:::o;64030:201::-;63010:13;:11;:13::i;:::-;64139:1:::1;64119:22;;:8;:22;;::::0;64111:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;64195:28;64214:8;64195:18;:28::i;:::-;64030:201:::0;:::o;36729:282::-;36794:4;36850:7;36831:15;:13;:15::i;:::-;:26;;:66;;;;;36884:13;;36874:7;:23;36831:66;:153;;;;;36983:1;20737:8;36935:17;:26;36953:7;36935:26;;;;;;;;;;;;:44;:49;36831:153;36811:173;;36729:282;;;:::o;59037:105::-;59097:7;59124:10;59117:17;;59037:105;:::o;24305:103::-;24360:7;24387:13;;24380:20;;24305:103;:::o;63289:132::-;63364:12;:10;:12::i;:::-;63353:23;;:7;:5;:7::i;:::-;:23;;;63345:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63289:132::o;24134:92::-;24190:7;24134:92;:::o;31415:1275::-;31482:7;31502:12;31517:7;31502:22;;31585:4;31566:15;:13;:15::i;:::-;:23;31562:1061;;31619:13;;31612:4;:20;31608:1015;;;31657:14;31674:17;:23;31692:4;31674:23;;;;;;;;;;;;31657:40;;31791:1;20737:8;31763:6;:24;:29;31759:845;;32428:113;32445:1;32435:6;:11;32428:113;;32488:17;:25;32506:6;;;;;;;32488:25;;;;;;;;;;;;32479:34;;32428:113;;;32574:6;32567:13;;;;;;31759:845;31634:989;31608:1015;31562:1061;32651:31;;;;;;;;;;;;;;31415:1275;;;;:::o;37892:485::-;37994:27;38023:23;38064:38;38105:15;:24;38121:7;38105:24;;;;;;;;;;;38064:65;;38282:18;38259:41;;38339:19;38333:26;38314:45;;38244:126;37892:485;;;:::o;37120:659::-;37269:11;37434:16;37427:5;37423:28;37414:37;;37594:16;37583:9;37579:32;37566:45;;37744:15;37733:9;37730:30;37722:5;37711:9;37708:20;37705:56;37695:66;;37120:659;;;;;:::o;43778:159::-;;;;;:::o;58346:311::-;58481:7;58501:16;21141:3;58527:19;:41;;58501:68;;21141:3;58595:31;58606:4;58612:2;58616:9;58595:10;:31::i;:::-;58587:40;;:62;;58580:69;;;58346:311;;;;;:::o;33238:450::-;33318:14;33486:16;33479:5;33475:28;33466:37;;33663:5;33649:11;33624:23;33620:41;33617:52;33610:5;33607:63;33597:73;;33238:450;;;;:::o;44602:158::-;;;;;:::o;53248:89::-;53308:21;53314:7;53323:5;53308;:21::i;:::-;53248:89;:::o;64391:191::-;64465:16;64484:6;;;;;;;;;;;64465:25;;64510:8;64501:6;;:17;;;;;;;;;;;;;;;;;;64565:8;64534:40;;64555:8;64534:40;;;;;;;;;;;;64454:128;64391:191;:::o;45200:716::-;45363:4;45409:2;45384:45;;;45430:19;:17;:19::i;:::-;45451:4;45457:7;45466:5;45384:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45380:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45684:1;45667:6;:13;:18;45663:235;;45713:40;;;;;;;;;;;;;;45663:235;45856:6;45850:13;45841:6;45837:2;45833:15;45826:38;45380:529;45553:54;;;45543:64;;;:6;:64;;;;45536:71;;;45200:716;;;;;;:::o;1222:190::-;1347:4;1400;1371:25;1384:5;1391:4;1371:12;:25::i;:::-;:33;1364:40;;1222:190;;;;;:::o;70228:344::-;70320:6;70307:9;:19;;70350:5;70341;;:14;:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70285:170;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;70482:6;70470:9;:18;70466:99;;;70513:10;70505:28;;:48;70546:6;70534:9;:18;;;;:::i;:::-;70505:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70466:99;70228:344;:::o;52869:112::-;52946:27;52956:2;52960:8;52946:27;;;;;;;;;;;;:9;:27::i;:::-;52869:112;;:::o;72716:114::-;72776:13;72809;72802:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72716:114;:::o;59244:1745::-;59309:17;59743:4;59736;59730:11;59726:22;59835:1;59829:4;59822:15;59910:4;59907:1;59903:12;59896:19;;59992:1;59987:3;59980:14;60096:3;60335:5;60317:428;60343:1;60317:428;;;60383:1;60378:3;60374:11;60367:18;;60554:2;60548:4;60544:13;60540:2;60536:22;60531:3;60523:36;60648:2;60642:4;60638:13;60630:21;;60715:4;60317:428;60705:25;60317:428;60321:21;60784:3;60779;60775:13;60899:4;60894:3;60890:14;60883:21;;60964:6;60959:3;60952:19;59348:1634;;;59244:1745;;;:::o;61675:98::-;61728:7;61755:10;61748:17;;61675:98;:::o;58047:147::-;58184:6;58047:147;;;;;:::o;53566:3081::-;53646:27;53676;53695:7;53676:18;:27::i;:::-;53646:57;;53716:12;53747:19;53716:52;;53782:27;53811:23;53838:35;53865:7;53838:26;:35::i;:::-;53781:92;;;;53890:13;53886:316;;;54011:68;54036:15;54053:4;54059:19;:17;:19::i;:::-;54011:24;:68::i;:::-;54006:184;;54103:43;54120:4;54126:19;:17;:19::i;:::-;54103:16;:43::i;:::-;54098:92;;54155:35;;;;;;;;;;;;;;54098:92;54006:184;53886:316;54214:51;54236:4;54250:1;54254:7;54263:1;54214:21;:51::i;:::-;54358:15;54355:160;;;54498:1;54477:19;54470:30;54355:160;55176:1;20226:3;55146:1;:26;;55145:32;55117:18;:24;55136:4;55117:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;55444:176;55481:4;55552:53;55567:4;55581:1;55585:19;55552:14;:53::i;:::-;21017:8;20737;55505:43;55504:101;55444:18;:176::i;:::-;55415:17;:26;55433:7;55415:26;;;;;;;;;;;:205;;;;55791:1;21017:8;55740:19;:47;:52;55736:627;;55813:19;55845:1;55835:7;:11;55813:33;;56002:1;55968:17;:30;55986:11;55968:30;;;;;;;;;;;;:35;55964:384;;56106:13;;56091:11;:28;56087:242;;56286:19;56253:17;:30;56271:11;56253:30;;;;;;;;;;;:52;;;;56087:242;55964:384;55794:569;55736:627;56418:7;56414:1;56391:35;;56400:4;56391:35;;;;;;;;;;;;56437:50;56458:4;56472:1;56476:7;56485:1;56437:20;:50::i;:::-;56614:12;;:14;;;;;;;;;;;;;53635:3012;;;;53566:3081;;:::o;2089:296::-;2172:7;2192:20;2215:4;2192:27;;2235:9;2230:118;2254:5;:12;2250:1;:16;2230:118;;;2303:33;2313:12;2327:5;2333:1;2327:8;;;;;;;;:::i;:::-;;;;;;;;2303:9;:33::i;:::-;2288:48;;2268:3;;;;;:::i;:::-;;;;2230:118;;;;2365:12;2358:19;;;2089:296;;;;:::o;52096:689::-;52227:19;52233:2;52237:8;52227:5;:19::i;:::-;52306:1;52288:2;:14;;;:19;52284:483;;52328:11;52342:13;;52328:27;;52374:13;52396:8;52390:3;:14;52374:30;;52423:233;52454:62;52493:1;52497:2;52501:7;;;;;;52510:5;52454:30;:62::i;:::-;52449:167;;52552:40;;;;;;;;;;;;;;52449:167;52651:3;52643:5;:11;52423:233;;52738:3;52721:13;;:20;52717:34;;52743:8;;;52717:34;52309:458;;52284:483;52096:689;;;:::o;9129:149::-;9192:7;9223:1;9219;:5;:51;;9250:20;9265:1;9268;9250:14;:20::i;:::-;9219:51;;;9227:20;9242:1;9245;9227:14;:20::i;:::-;9219:51;9212:58;;9129:149;;;;:::o;46378:2966::-;46451:20;46474:13;;46451:36;;46514:1;46502:8;:13;46498:44;;46524:18;;;;;;;;;;;;;;46498:44;46555:61;46585:1;46589:2;46593:12;46607:8;46555:21;:61::i;:::-;47099:1;20099:2;47069:1;:26;;47068:32;47056:8;:45;47030:18;:22;47049:2;47030:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;47378:139;47415:2;47469:33;47492:1;47496:2;47500:1;47469:14;:33::i;:::-;47436:30;47457:8;47436:20;:30::i;:::-;:66;47378:18;:139::i;:::-;47344:17;:31;47362:12;47344:31;;;;;;;;;;;:173;;;;47534:16;47565:11;47594:8;47579:12;:23;47565:37;;48115:16;48111:2;48107:25;48095:37;;48487:12;48447:8;48406:1;48344:25;48285:1;48224;48197:335;48858:1;48844:12;48840:20;48798:346;48899:3;48890:7;48887:16;48798:346;;49117:7;49107:8;49104:1;49077:25;49074:1;49071;49066:59;48952:1;48943:7;48939:15;48928:26;;48798:346;;;48802:77;49189:1;49177:8;:13;49173:45;;49199:19;;;;;;;;;;;;;;49173:45;49251:3;49235:13;:19;;;;46804:2462;;49276:60;49305:1;49309:2;49313:12;49327:8;49276:20;:60::i;:::-;46440:2904;46378:2966;;:::o;9286:268::-;9354:13;9461:1;9455:4;9448:15;9490:1;9484:4;9477:15;9531:4;9525;9515:21;9506:30;;9286:268;;;;:::o;33790:324::-;33860:14;34093:1;34083:8;34080:15;34054:24;34050:46;34040:56;;33790:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:77::-;8573:7;8602:5;8591:16;;8536:77;;;:::o;8619:118::-;8706:24;8724:5;8706:24;:::i;:::-;8701:3;8694:37;8619:118;;:::o;8743:222::-;8836:4;8874:2;8863:9;8859:18;8851:26;;8887:71;8955:1;8944:9;8940:17;8931:6;8887:71;:::i;:::-;8743:222;;;;:::o;8971:117::-;9080:1;9077;9070:12;9094:117;9203:1;9200;9193:12;9231:553;9289:8;9299:6;9349:3;9342:4;9334:6;9330:17;9326:27;9316:122;;9357:79;;:::i;:::-;9316:122;9470:6;9457:20;9447:30;;9500:18;9492:6;9489:30;9486:117;;;9522:79;;:::i;:::-;9486:117;9636:4;9628:6;9624:17;9612:29;;9690:3;9682:4;9674:6;9670:17;9660:8;9656:32;9653:41;9650:128;;;9697:79;;:::i;:::-;9650:128;9231:553;;;;;:::o;9790:529::-;9861:6;9869;9918:2;9906:9;9897:7;9893:23;9889:32;9886:119;;;9924:79;;:::i;:::-;9886:119;10072:1;10061:9;10057:17;10044:31;10102:18;10094:6;10091:30;10088:117;;;10124:79;;:::i;:::-;10088:117;10237:65;10294:7;10285:6;10274:9;10270:22;10237:65;:::i;:::-;10219:83;;;;10015:297;9790:529;;;;;:::o;10325:329::-;10384:6;10433:2;10421:9;10412:7;10408:23;10404:32;10401:119;;;10439:79;;:::i;:::-;10401:119;10559:1;10584:53;10629:7;10620:6;10609:9;10605:22;10584:53;:::i;:::-;10574:63;;10530:117;10325:329;;;;:::o;10660:474::-;10728:6;10736;10785:2;10773:9;10764:7;10760:23;10756:32;10753:119;;;10791:79;;:::i;:::-;10753:119;10911:1;10936:53;10981:7;10972:6;10961:9;10957:22;10936:53;:::i;:::-;10926:63;;10882:117;11038:2;11064:53;11109:7;11100:6;11089:9;11085:22;11064:53;:::i;:::-;11054:63;;11009:118;10660:474;;;;;:::o;11140:116::-;11210:21;11225:5;11210:21;:::i;:::-;11203:5;11200:32;11190:60;;11246:1;11243;11236:12;11190:60;11140:116;:::o;11262:133::-;11305:5;11343:6;11330:20;11321:29;;11359:30;11383:5;11359:30;:::i;:::-;11262:133;;;;:::o;11401:468::-;11466:6;11474;11523:2;11511:9;11502:7;11498:23;11494:32;11491:119;;;11529:79;;:::i;:::-;11491:119;11649:1;11674:53;11719:7;11710:6;11699:9;11695:22;11674:53;:::i;:::-;11664:63;;11620:117;11776:2;11802:50;11844:7;11835:6;11824:9;11820:22;11802:50;:::i;:::-;11792:60;;11747:115;11401:468;;;;;:::o;11875:307::-;11936:4;12026:18;12018:6;12015:30;12012:56;;;12048:18;;:::i;:::-;12012:56;12086:29;12108:6;12086:29;:::i;:::-;12078:37;;12170:4;12164;12160:15;12152:23;;11875:307;;;:::o;12188:410::-;12265:5;12290:65;12306:48;12347:6;12306:48;:::i;:::-;12290:65;:::i;:::-;12281:74;;12378:6;12371:5;12364:21;12416:4;12409:5;12405:16;12454:3;12445:6;12440:3;12436:16;12433:25;12430:112;;;12461:79;;:::i;:::-;12430:112;12551:41;12585:6;12580:3;12575;12551:41;:::i;:::-;12271:327;12188:410;;;;;:::o;12617:338::-;12672:5;12721:3;12714:4;12706:6;12702:17;12698:27;12688:122;;12729:79;;:::i;:::-;12688:122;12846:6;12833:20;12871:78;12945:3;12937:6;12930:4;12922:6;12918:17;12871:78;:::i;:::-;12862:87;;12678:277;12617:338;;;;:::o;12961:943::-;13056:6;13064;13072;13080;13129:3;13117:9;13108:7;13104:23;13100:33;13097:120;;;13136:79;;:::i;:::-;13097:120;13256:1;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13227:117;13383:2;13409:53;13454:7;13445:6;13434:9;13430:22;13409:53;:::i;:::-;13399:63;;13354:118;13511:2;13537:53;13582:7;13573:6;13562:9;13558:22;13537:53;:::i;:::-;13527:63;;13482:118;13667:2;13656:9;13652:18;13639:32;13698:18;13690:6;13687:30;13684:117;;;13720:79;;:::i;:::-;13684:117;13825:62;13879:7;13870:6;13859:9;13855:22;13825:62;:::i;:::-;13815:72;;13610:287;12961:943;;;;;;;:::o;13927:568::-;14000:8;14010:6;14060:3;14053:4;14045:6;14041:17;14037:27;14027:122;;14068:79;;:::i;:::-;14027:122;14181:6;14168:20;14158:30;;14211:18;14203:6;14200:30;14197:117;;;14233:79;;:::i;:::-;14197:117;14347:4;14339:6;14335:17;14323:29;;14401:3;14393:4;14385:6;14381:17;14371:8;14367:32;14364:41;14361:128;;;14408:79;;:::i;:::-;14361:128;13927:568;;;;;:::o;14501:704::-;14596:6;14604;14612;14661:2;14649:9;14640:7;14636:23;14632:32;14629:119;;;14667:79;;:::i;:::-;14629:119;14787:1;14812:53;14857:7;14848:6;14837:9;14833:22;14812:53;:::i;:::-;14802:63;;14758:117;14942:2;14931:9;14927:18;14914:32;14973:18;14965:6;14962:30;14959:117;;;14995:79;;:::i;:::-;14959:117;15108:80;15180:7;15171:6;15160:9;15156:22;15108:80;:::i;:::-;15090:98;;;;14885:313;14501:704;;;;;:::o;15211:474::-;15279:6;15287;15336:2;15324:9;15315:7;15311:23;15307:32;15304:119;;;15342:79;;:::i;:::-;15304:119;15462:1;15487:53;15532:7;15523:6;15512:9;15508:22;15487:53;:::i;:::-;15477:63;;15433:117;15589:2;15615:53;15660:7;15651:6;15640:9;15636:22;15615:53;:::i;:::-;15605:63;;15560:118;15211:474;;;;;:::o;15691:180::-;15739:77;15736:1;15729:88;15836:4;15833:1;15826:15;15860:4;15857:1;15850:15;15877:320;15921:6;15958:1;15952:4;15948:12;15938:22;;16005:1;15999:4;15995:12;16026:18;16016:81;;16082:4;16074:6;16070:17;16060:27;;16016:81;16144:2;16136:6;16133:14;16113:18;16110:38;16107:84;;16163:18;;:::i;:::-;16107:84;15928:269;15877:320;;;:::o;16203:85::-;16248:7;16277:5;16266:16;;16203:85;;;:::o;16294:86::-;16329:7;16369:4;16362:5;16358:16;16347:27;;16294:86;;;:::o;16386:60::-;16414:3;16435:5;16428:12;;16386:60;;;:::o;16452:154::-;16508:9;16541:59;16557:42;16566:32;16592:5;16566:32;:::i;:::-;16557:42;:::i;:::-;16541:59;:::i;:::-;16528:72;;16452:154;;;:::o;16612:143::-;16705:43;16742:5;16705:43;:::i;:::-;16700:3;16693:56;16612:143;;:::o;16761:344::-;16888:4;16926:2;16915:9;16911:18;16903:26;;16939:71;17007:1;16996:9;16992:17;16983:6;16939:71;:::i;:::-;17020:78;17094:2;17083:9;17079:18;17070:6;17020:78;:::i;:::-;16761:344;;;;;:::o;17111:79::-;17150:7;17179:5;17168:16;;17111:79;;;:::o;17196:157::-;17301:45;17321:24;17339:5;17321:24;:::i;:::-;17301:45;:::i;:::-;17296:3;17289:58;17196:157;;:::o;17359:256::-;17471:3;17486:75;17557:3;17548:6;17486:75;:::i;:::-;17586:2;17581:3;17577:12;17570:19;;17606:3;17599:10;;17359:256;;;;:::o;17621:147::-;17722:11;17759:3;17744:18;;17621:147;;;;:::o;17774:114::-;;:::o;17894:398::-;18053:3;18074:83;18155:1;18150:3;18074:83;:::i;:::-;18067:90;;18166:93;18255:3;18166:93;:::i;:::-;18284:1;18279:3;18275:11;18268:18;;17894:398;;;:::o;18298:379::-;18482:3;18504:147;18647:3;18504:147;:::i;:::-;18497:154;;18668:3;18661:10;;18298:379;;;:::o;18683:166::-;18823:18;18819:1;18811:6;18807:14;18800:42;18683:166;:::o;18855:366::-;18997:3;19018:67;19082:2;19077:3;19018:67;:::i;:::-;19011:74;;19094:93;19183:3;19094:93;:::i;:::-;19212:2;19207:3;19203:12;19196:19;;18855:366;;;:::o;19227:419::-;19393:4;19431:2;19420:9;19416:18;19408:26;;19480:9;19474:4;19470:20;19466:1;19455:9;19451:17;19444:47;19508:131;19634:4;19508:131;:::i;:::-;19500:139;;19227:419;;;:::o;19652:180::-;19792:32;19788:1;19780:6;19776:14;19769:56;19652:180;:::o;19838:366::-;19980:3;20001:67;20065:2;20060:3;20001:67;:::i;:::-;19994:74;;20077:93;20166:3;20077:93;:::i;:::-;20195:2;20190:3;20186:12;20179:19;;19838:366;;;:::o;20210:419::-;20376:4;20414:2;20403:9;20399:18;20391:26;;20463:9;20457:4;20453:20;20449:1;20438:9;20434:17;20427:47;20491:131;20617:4;20491:131;:::i;:::-;20483:139;;20210:419;;;:::o;20635:180::-;20683:77;20680:1;20673:88;20780:4;20777:1;20770:15;20804:4;20801:1;20794:15;20821:191;20861:4;20881:20;20899:1;20881:20;:::i;:::-;20876:25;;20915:20;20933:1;20915:20;:::i;:::-;20910:25;;20954:1;20951;20948:8;20945:34;;;20959:18;;:::i;:::-;20945:34;21004:1;21001;20997:9;20989:17;;20821:191;;;;:::o;21018:220::-;21158:34;21154:1;21146:6;21142:14;21135:58;21227:3;21222:2;21214:6;21210:15;21203:28;21018:220;:::o;21244:366::-;21386:3;21407:67;21471:2;21466:3;21407:67;:::i;:::-;21400:74;;21483:93;21572:3;21483:93;:::i;:::-;21601:2;21596:3;21592:12;21585:19;;21244:366;;;:::o;21616:419::-;21782:4;21820:2;21809:9;21805:18;21797:26;;21869:9;21863:4;21859:20;21855:1;21844:9;21840:17;21833:47;21897:131;22023:4;21897:131;:::i;:::-;21889:139;;21616:419;;;:::o;22041:163::-;22181:15;22177:1;22169:6;22165:14;22158:39;22041:163;:::o;22210:366::-;22352:3;22373:67;22437:2;22432:3;22373:67;:::i;:::-;22366:74;;22449:93;22538:3;22449:93;:::i;:::-;22567:2;22562:3;22558:12;22551:19;;22210:366;;;:::o;22582:419::-;22748:4;22786:2;22775:9;22771:18;22763:26;;22835:9;22829:4;22825:20;22821:1;22810:9;22806:17;22799:47;22863:131;22989:4;22863:131;:::i;:::-;22855:139;;22582:419;;;:::o;23007:169::-;23147:21;23143:1;23135:6;23131:14;23124:45;23007:169;:::o;23182:366::-;23324:3;23345:67;23409:2;23404:3;23345:67;:::i;:::-;23338:74;;23421:93;23510:3;23421:93;:::i;:::-;23539:2;23534:3;23530:12;23523:19;;23182:366;;;:::o;23554:419::-;23720:4;23758:2;23747:9;23743:18;23735:26;;23807:9;23801:4;23797:20;23793:1;23782:9;23778:17;23771:47;23835:131;23961:4;23835:131;:::i;:::-;23827:139;;23554:419;;;:::o;23979:227::-;24119:34;24115:1;24107:6;24103:14;24096:58;24188:10;24183:2;24175:6;24171:15;24164:35;23979:227;:::o;24212:366::-;24354:3;24375:67;24439:2;24434:3;24375:67;:::i;:::-;24368:74;;24451:93;24540:3;24451:93;:::i;:::-;24569:2;24564:3;24560:12;24553:19;;24212:366;;;:::o;24584:419::-;24750:4;24788:2;24777:9;24773:18;24765:26;;24837:9;24831:4;24827:20;24823:1;24812:9;24808:17;24801:47;24865:131;24991:4;24865:131;:::i;:::-;24857:139;;24584:419;;;:::o;25009:168::-;25149:20;25145:1;25137:6;25133:14;25126:44;25009:168;:::o;25183:366::-;25325:3;25346:67;25410:2;25405:3;25346:67;:::i;:::-;25339:74;;25422:93;25511:3;25422:93;:::i;:::-;25540:2;25535:3;25531:12;25524:19;;25183:366;;;:::o;25555:419::-;25721:4;25759:2;25748:9;25744:18;25736:26;;25808:9;25802:4;25798:20;25794:1;25783:9;25779:17;25772:47;25836:131;25962:4;25836:131;:::i;:::-;25828:139;;25555:419;;;:::o;25980:169::-;26120:21;26116:1;26108:6;26104:14;26097:45;25980:169;:::o;26155:366::-;26297:3;26318:67;26382:2;26377:3;26318:67;:::i;:::-;26311:74;;26394:93;26483:3;26394:93;:::i;:::-;26512:2;26507:3;26503:12;26496:19;;26155:366;;;:::o;26527:419::-;26693:4;26731:2;26720:9;26716:18;26708:26;;26780:9;26774:4;26770:20;26766:1;26755:9;26751:17;26744:47;26808:131;26934:4;26808:131;:::i;:::-;26800:139;;26527:419;;;:::o;26952:175::-;27092:27;27088:1;27080:6;27076:14;27069:51;26952:175;:::o;27133:366::-;27275:3;27296:67;27360:2;27355:3;27296:67;:::i;:::-;27289:74;;27372:93;27461:3;27372:93;:::i;:::-;27490:2;27485:3;27481:12;27474:19;;27133:366;;;:::o;27505:419::-;27671:4;27709:2;27698:9;27694:18;27686:26;;27758:9;27752:4;27748:20;27744:1;27733:9;27729:17;27722:47;27786:131;27912:4;27786:131;:::i;:::-;27778:139;;27505:419;;;:::o;27930:168::-;28070:20;28066:1;28058:6;28054:14;28047:44;27930:168;:::o;28104:366::-;28246:3;28267:67;28331:2;28326:3;28267:67;:::i;:::-;28260:74;;28343:93;28432:3;28343:93;:::i;:::-;28461:2;28456:3;28452:12;28445:19;;28104:366;;;:::o;28476:419::-;28642:4;28680:2;28669:9;28665:18;28657:26;;28729:9;28723:4;28719:20;28715:1;28704:9;28700:17;28693:47;28757:131;28883:4;28757:131;:::i;:::-;28749:139;;28476:419;;;:::o;28901:227::-;29041:34;29037:1;29029:6;29025:14;29018:58;29110:10;29105:2;29097:6;29093:15;29086:35;28901:227;:::o;29134:366::-;29276:3;29297:67;29361:2;29356:3;29297:67;:::i;:::-;29290:74;;29373:93;29462:3;29373:93;:::i;:::-;29491:2;29486:3;29482:12;29475:19;;29134:366;;;:::o;29506:419::-;29672:4;29710:2;29699:9;29695:18;29687:26;;29759:9;29753:4;29749:20;29745:1;29734:9;29730:17;29723:47;29787:131;29913:4;29787:131;:::i;:::-;29779:139;;29506:419;;;:::o;29931:166::-;30071:18;30067:1;30059:6;30055:14;30048:42;29931:166;:::o;30103:366::-;30245:3;30266:67;30330:2;30325:3;30266:67;:::i;:::-;30259:74;;30342:93;30431:3;30342:93;:::i;:::-;30460:2;30455:3;30451:12;30444:19;;30103:366;;;:::o;30475:419::-;30641:4;30679:2;30668:9;30664:18;30656:26;;30728:9;30722:4;30718:20;30714:1;30703:9;30699:17;30692:47;30756:131;30882:4;30756:131;:::i;:::-;30748:139;;30475:419;;;:::o;30900:233::-;30939:3;30962:24;30980:5;30962:24;:::i;:::-;30953:33;;31008:66;31001:5;30998:77;30995:103;;31078:18;;:::i;:::-;30995:103;31125:1;31118:5;31114:13;31107:20;;30900:233;;;:::o;31139:166::-;31279:18;31275:1;31267:6;31263:14;31256:42;31139:166;:::o;31311:366::-;31453:3;31474:67;31538:2;31533:3;31474:67;:::i;:::-;31467:74;;31550:93;31639:3;31550:93;:::i;:::-;31668:2;31663:3;31659:12;31652:19;;31311:366;;;:::o;31683:419::-;31849:4;31887:2;31876:9;31872:18;31864:26;;31936:9;31930:4;31926:20;31922:1;31911:9;31907:17;31900:47;31964:131;32090:4;31964:131;:::i;:::-;31956:139;;31683:419;;;:::o;32108:148::-;32210:11;32247:3;32232:18;;32108:148;;;;:::o;32262:377::-;32368:3;32396:39;32429:5;32396:39;:::i;:::-;32451:89;32533:6;32528:3;32451:89;:::i;:::-;32444:96;;32549:52;32594:6;32589:3;32582:4;32575:5;32571:16;32549:52;:::i;:::-;32626:6;32621:3;32617:16;32610:23;;32372:267;32262:377;;;;:::o;32645:155::-;32785:7;32781:1;32773:6;32769:14;32762:31;32645:155;:::o;32806:400::-;32966:3;32987:84;33069:1;33064:3;32987:84;:::i;:::-;32980:91;;33080:93;33169:3;33080:93;:::i;:::-;33198:1;33193:3;33189:11;33182:18;;32806:400;;;:::o;33212:701::-;33493:3;33515:95;33606:3;33597:6;33515:95;:::i;:::-;33508:102;;33627:95;33718:3;33709:6;33627:95;:::i;:::-;33620:102;;33739:148;33883:3;33739:148;:::i;:::-;33732:155;;33904:3;33897:10;;33212:701;;;;;:::o;33919:225::-;34059:34;34055:1;34047:6;34043:14;34036:58;34128:8;34123:2;34115:6;34111:15;34104:33;33919:225;:::o;34150:366::-;34292:3;34313:67;34377:2;34372:3;34313:67;:::i;:::-;34306:74;;34389:93;34478:3;34389:93;:::i;:::-;34507:2;34502:3;34498:12;34491:19;;34150:366;;;:::o;34522:419::-;34688:4;34726:2;34715:9;34711:18;34703:26;;34775:9;34769:4;34765:20;34761:1;34750:9;34746:17;34739:47;34803:131;34929:4;34803:131;:::i;:::-;34795:139;;34522:419;;;:::o;34947:182::-;35087:34;35083:1;35075:6;35071:14;35064:58;34947:182;:::o;35135:366::-;35277:3;35298:67;35362:2;35357:3;35298:67;:::i;:::-;35291:74;;35374:93;35463:3;35374:93;:::i;:::-;35492:2;35487:3;35483:12;35476:19;;35135:366;;;:::o;35507:419::-;35673:4;35711:2;35700:9;35696:18;35688:26;;35760:9;35754:4;35750:20;35746:1;35735:9;35731:17;35724:47;35788:131;35914:4;35788:131;:::i;:::-;35780:139;;35507:419;;;:::o;35932:98::-;35983:6;36017:5;36011:12;36001:22;;35932:98;;;:::o;36036:168::-;36119:11;36153:6;36148:3;36141:19;36193:4;36188:3;36184:14;36169:29;;36036:168;;;;:::o;36210:360::-;36296:3;36324:38;36356:5;36324:38;:::i;:::-;36378:70;36441:6;36436:3;36378:70;:::i;:::-;36371:77;;36457:52;36502:6;36497:3;36490:4;36483:5;36479:16;36457:52;:::i;:::-;36534:29;36556:6;36534:29;:::i;:::-;36529:3;36525:39;36518:46;;36300:270;36210:360;;;;:::o;36576:640::-;36771:4;36809:3;36798:9;36794:19;36786:27;;36823:71;36891:1;36880:9;36876:17;36867:6;36823:71;:::i;:::-;36904:72;36972:2;36961:9;36957:18;36948:6;36904:72;:::i;:::-;36986;37054:2;37043:9;37039:18;37030:6;36986:72;:::i;:::-;37105:9;37099:4;37095:20;37090:2;37079:9;37075:18;37068:48;37133:76;37204:4;37195:6;37133:76;:::i;:::-;37125:84;;36576:640;;;;;;;:::o;37222:141::-;37278:5;37309:6;37303:13;37294:22;;37325:32;37351:5;37325:32;:::i;:::-;37222:141;;;;:::o;37369:349::-;37438:6;37487:2;37475:9;37466:7;37462:23;37458:32;37455:119;;;37493:79;;:::i;:::-;37455:119;37613:1;37638:63;37693:7;37684:6;37673:9;37669:22;37638:63;:::i;:::-;37628:73;;37584:127;37369:349;;;;:::o;37724:180::-;37772:77;37769:1;37762:88;37869:4;37866:1;37859:15;37893:4;37890:1;37883:15
Swarm Source
ipfs://a68a77a996804d04bb7433eea6fe8c9a2fae1a26a7c25e7f3141c0303455b6a9
Loading...
Loading
Loading...
Loading
OVERVIEW
Raise funds for your projects in Bayverse and reward early supporters.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.